2014年6月12日木曜日

Nucleo F401RE用のUSBホストライブラリの試作



Nucleo F401REはmbedのUSBホストでサポートされていないので簡易版を試作してみました。

ホストチャネルドライバ(stm32f4xx_hal_hcd.c)を改造してKL46Z-USBHostのハードウェア依存部分への
インターフェースを互換にしたので、USBDeviceのようにターゲットを切替えるだけでNucleo F401REと
FRDM-KL46Zは同じライブラリを使えるようにしました。
ですのでKL46Zで使うだけなら以前に作成したKL46Z-USBHostと完全互換です。

KL46Zの場合は1つのエンドポイントパイプを全てのエンドポイントが共有して送受信していましたが、
F401REでは8個のエンドポイントパイプ(ホストチャネル)を持っているので、
コントロール転送、バルク転送、インタラプト転送、アイソクロナス転送で分けて使っています。

たぶん、KL46Zのように共有できると思うのですが、ホストチャネルHALTの仕組みを完全に理解していないのと、
デバッグで各チャネルのレジスタの振る舞いがみたいので、暫時分けています。
今のところアイソクロナス転送は1つだけに限定しています。

ホストチャネルドライバは汎用USBホストに使うよりは、
あらかじめ接続されるUSBデバイスが解っているUSBホストの作成には相性がよさそうです。

現在の重大な不具合はUSBメモリへの書き込みが出来ない。
BOT(バルクオンリー転送)での書き込みに失敗します。
送信FIFOの容量が足りないのか、連続トークンOUTがいけないのか今後調べてみたいです。


使用例をmbedサイトに置きました。KL46Z用のサンプルプログラムでライブラリを入れ替えただけです。
他にもGPSレシーバー(バルク転送IN)、マウス(インタラプト転送IN)は動きました。

Webカメラの使用例(アイソクロナス転送IN)
F401RE-USBHostC270_example

BTstackでの使用例、Bluetoothマウスからの受信のみ。(インタラプト転送IN、バルク転送IN,OUT)
F401RE-BTstack_example

参考:
stm32f4xx_hal_hcd.c
stm32f4xx_ll_usb.c
RM0368 Reference manual STM32F401xB/C and STM32F401xD/E advanced ARM-based 32-bit MCUs
UM1720 User manual STM32Cube™ USB host library

(2014/6/12)

USBメモリへの書き込み不具合を解消しました。
F401RE-USBHost

(2014/6/13追加)
---

0 件のコメント: