2013年3月16日土曜日

USBHostライブラリを少し読んでみた。

mbed officialのUSBHostライブラリを少し読んでみました。

デバイスの自動認識とか、接続・切断の仕組みは難関なので後回しにして、

webcamで使われているisochronous転送を組み込むとしたら、
USBHost::transferCompleted()でTDのアドレスを見てTDかITDを区別するのが安全かな。
TDをメモリープールか切り出しているので判断しやすいです。
これは初期のLifeCamで実現していた手法です。
ITDなら、例えばITD_PROCESSED_EVENTを作って、rtosのmailで割り込みから飛ばせば、
USBHost::usb_process()スレッドで受け取れるので、対応するエンドポイントを探して、
ep->call()すれば、エンドポイントにattachしていた処理がコールバックされるので、
webcamからのパケットが受信できると思う。ただし、usb_process()スレッドでは
デバイスの接続、切断処理や、バルク転送、インタラプト転送もしているので、
他の処理に時間がかかるとisochronous転送が止まります。専用のスレッドで回すか、
ユーザのイベントループで受ける方法もあると思う。

USBEndpoint::init()でITDに対応するか、ITD専用のエンドポイントクラスを作るか。
td_list_ でTDを2つ渡されているが、どこで転送用のエンドポイントを作られているのだろう。
USBHost::usb_process()のDEVICE_CONNECTED_EVENTではコントロール転送のエンドポイントが
作られているのがわかります。
各デバイスクラスでバルク転送・インタラプト転送のエンドポイントは、
USBHost::parseConfDescr()でエンドポイントディスクリプタがみつかるたびに作られエンドポイントの
リストに保管されます。
各クラスでは、例えばマウスクラスUSBHostMouse::connect()でdev->getEndPoint(,INTERRUPUT_ENDPINT, IN...)が
呼ばれいて、deviceConnected::getEndPoint()では既に作られたエンドポイントのリストから検索しているだけです。
USBHost::enumrate()から呼ばれているが、getConfigurationDescriptorが400バイト固定長で
取得しているのはwebcamではたぶん足りないでしょう。もっともisochronous転送のエンドポイントは
現状では作られない。
connect()のタイミングでisochronous転送のエンドポイントを自前で作って転送を開始すればいいと思う。

(2013/3/16)
---

0 件のコメント: