組込ソフトウエア開発概説：デバイスドライバの入手

<h3>■デバイスドライバの入手</h3>
世の中には、USB、Ethernet(LAN)、UART(シリアル)などの様々なデバイスコントローラがあり、CPUが内蔵しているものや、外付けの独立したICの場合があります。<br>
<br>

<b>Renesas社のRX72M機能ダイアグラム　USBコントローラ、Ethernetコントローラが内蔵されている</b>
https://www.renesas.com/jp/ja/image/rx72m-block-diagram

<b>外付けコントローラの例　Realtek社のEthernetコントローラ　RTL8019AS</b>
https://www.realtek.com/ja/products/communications-network-ics/item/rtl8019as

それらのデバイスコントローラに対してデータを書き込んだり読み出したり動作を制御するための専用プログラムのことをデバイスドライバと言います。
当然OSにはデバイスドライバは含まれていないので別途用意する必要がありますが、以下のいずれかの方法で入手することになります。<br>

<b>A</b> デバイスドライバ販売会社から購入する
<b>B</b> デバイスコントローラメーカ（CPU内蔵の場合はCPUメーカ）が無償提供しているものを使用する
<b>C</b> デバイスコントローラのソフトウエアマニュアル（レジスタ操作など制御方法が記載されているもの）を参照してデバイスドライバを自分で開発する
<b>D</b> Cの作業を外部の開発会社に委託する

ただ、デバイス（特にUSB）の制御は難易度が高く、十分な知識がない状態ではCの方法はお勧めしません。なかなか思うように動かなかったり、発生したトラブルを自力で解決することも難しいと思います。そのため、上記AまたはBを取ることが多いでしょう。OSもそうでしたが、外部から入手する場合は以下の点は確認しましょう。
・自分の組込機器への適用の際、提供されている状態からどの程度カスタマイズが必要となるか
・どういうライセンス形態（使用許諾条件）なのか
・自分の組込機器への適用作業時や運用において発生したトラブルをどの程度サポートしてくれるのか

なお、Bの場合でも提供されるのがLinux専用ソースコードしかない、というケースもあります。そうなると、そのデバイスを使うためにOSとしてLinuxを選択し、CPUもそれなりのスペックのものにするのか、そのデバイスを使うことをあきらめて他のデバイスを探すか、判断が必要になります。実はデバイスドライバをどうするかが、CPUやデバイス、OSの選定にも影響するということです。

★Centeでは...
Centeでは上記Aとして以下のiTRON用デバイスドライバをご用意しております。

・Ethernet(LAN)ドライバ
Cente TCP/IPv4(https://www.cente.jp/product/cente-middle/tcpip/tcp-ipv4/tcpipv4/) などネットワークミドルウエアパッケージに以下のCPU内蔵Ethernetコントローラのデバイスドライバが含まれています。追加費用なしにお客様の製品にお使いいただけます。
・ルネサス社 RZ/A1H
・ルネサス社 RX65N
・ルネサス社 RX71M
・STMicro社 STM32F7

・USBドライバ
各種USBドライバをパッケージとしてCソースコード形態で販売（使用許諾）しております。

<b>USBドライバ</b>
https://www.cente.jp/product/cente-middle/usb-driver/

まず一言「USBドライバ」と言っても組込機器が「挿す方」なのか「挿される方」によって、必要なものが違います。
-USBホストドライバ（組込機器にUSBメモリやUSBキーボードなどのUSB機器を接続する際に、組込機器側に必要なドライバ）
-USBデバイスドライバ（組込機器をUSBメモリのように見せてPCに接続するなどの際に、組込機器側に必要なドライバ）

そして、上記各USBドライバを見てみると、デバイスを制御するコントローラドライバと、機能を実現するクラスドライバの2層に分かれています。コントローラドライバはデバイス固有の制御をして標準的な入出力仕様に揃える部分、クラスドライバはその標準的な入出力仕様を使ってUSBメモリやUSBカメラのような実際の機能・サービスで使えるようにする部分です。ですから、前述の「デバイスドライバ」の定義と照らし合わせると、コントローラドライバこそがUSBのデバイスドライバであり、クラスドライバは含まないのが正しいのかもしれません。

それはさておき、結局USBを動かすには目的に応じたものの入手が（場合によっては別々に）必要です。例えば組込機器にUSBメモリを差して使いたい場合、組込機器には使用するコントローラ用のホストドライバとホスト用のマスストレージクラスドライバが必要となります。同様に、組込機器をUSBメモリのように見せてPCにUSB接続する場合、組込機器には使用するコントローラ用のデバイスドライバとデバイス用のマスストレージクラスドライバが必要となるわけです。
よく使われる組み合わせのものはCenteでもパッケージにしてご用意しています。

<b>例)　STMicro社　STM32F7内蔵コントローラ用ホストドライバとUSBマスストレージクラスドライバのパッケージ</b>
Cente USB2.0 Host MassStorage for STM32(https://www.cente.jp/product/cente-middle/usb-driver/usb_mass/cente-usb-host-massstorage-for-stm32/)

USBドライバについては別シーズンで詳しく解説します。

・ファイルシステム系ドライバ
NAND Flashドライバ、SD Cardドライバなど、メモリやメモリカードをストレージとして使用する際に必要となるドライバをパッケージとしてCソースコード形態で販売（使用許諾）しております。
ファイルシステム
https://www.cente.jp/product/cente-middle/filesystem/

ファイルシステム方面についても別シーズンで詳しく解説したいと考えています。


いずれにせよ、欲しいデバイスドライバが対応リストにない場合や具体的に何が必要かよくわからない場合は、お気軽にCenteにお問合せください。
https://www.cente.jp/otoiawase/tech-entry/


<h3>■今日の閑話</h3>
デバイスドライバ絡みで、昔の苦労話を1つ。
Ethernetコントローラが受信したパケットをバッファに積んでデバイスドライバに渡す手段として、大きく分けて<br>
<br>
　A パケットデスクリプタ形式（CPU内蔵コントローラ）<br>
　B 内部FIFO形式（外付けコントローラ）<br>
<br>
の二種類があります。Aは1つのパケット用バッファとして確保したRAM上のアドレスをデスクリプタと呼ばれる管理領域に登録し、そのデスクリプタを16個、32個のような個数コントローラに登録します。コントローラはパケットを受信すると1つづつ空きデスクリプタに紐づいているRAM領域に直接データを転送(DMA)していく方式です。一方BはLANコントローラ内部の限られたRAM空間を受信データサイズに応じて区切って使います。コントローラはパケットを受信すると空いている空間にデータを書き込み、デバイスは固定のレジスタから4byteづつなど小さい単位で読みだす方式です。AはBに比べて仕組みは若干複雑になりますが、たくさんの受信パケットを保持できますし、直接パケットバッファに書き込めるので高速に処理できます。一度Bのドライバを書いたことがあるのですが、結構苦労しました。ちょっと書いて動かしてみたら、連続でパケットを受信する速度よりもデバイスドライバが1パケット分のデータを読み切る速度が遅くて、すぐに受信オーバーフローエラーが発生してしまうのです。結局LANコントローラの設定を変更することでぎりぎりその運用環境での受信スペックは満たせた、という中途半端な対応しかできなかったように記憶しています。<br>
<br>


Cente：
https://www.cente.jp/