2014年4月24日木曜日

EA LPC4088 QSB用のUSBホストライブラリの試作



EA LPC4088クイックスタートボードはmbedのUSBホストでサポートされていないので試作してみました。

LPC4088のUSBコントローラは0x10000000から始まるメインSRAMにはアクセス出来なく、
0x20000000からのメモリAHBSRAM0,AHBSRAM1のみにアクセス出来ます。(以下USBRAMと略す)

USBRAMに転送データがあれば問題無いのだがmbed OfficialのUSBHostとインターフェース互換に
したかったので、USBデバイスへの転送の都度、USBRAMにコピーしてからUSBコントローラを
起動してしています。
実装ではUSBRAMからfirst-fitアルゴリズムで64バイト単位で転送領域を切り出すようにしています。
もちろん、HCED,HCTD,HCITD,HCCAも切り出しています。

USBコントローラの初期設定はLPC1768のとほぼ同じです。
LPC4088のLPCOpenのサンプルコードを参考にしたところ、
USBポートの機能設定がLPC_PINCONからLPC_IOCONに変わっているだけでした。
LPCOpenサンプルコードとはP1_19の扱いが違うのでLPCOpenのように設定してはいけない。
EA LPC4088 QSBではUSBホストへの電力供給イネーブルに使っています。
#if defined(TARGET_LPC1768)
    LPC_PINCON->PINSEL1 &= ~((3<<26) | (3<<28));  
    LPC_PINCON->PINSEL1 |=  ((1<<26)|(1<<28));     
#elif defined(TARGET_LPC4088)
    LPC_IOCON->P0_29 = 0x01; // USB_D+1
    LPC_IOCON->P0_30 = 0x01; // USB_D-1
    // DO NOT CHANGE P1_19.
#else
LPC_USBのレジスタ名が違っていたのでLPC1768の名前で再定義しました。
#define HcRevision Revision
#define OTGStCtrl StCtrl

ハードウェア依存以外はKL46ZのUSBホスト試作のコードを使いました。
ノンブロック型転送の場合にUSBHost::poll()を呼び続ける事以外は
OfficialのUSBHostとインターフェース互換です。
制限事項も同じく、USBデバイスは予め接続しておかなければいけない。
USBデバイスの取り外しには対応していません。
USBハブは使えます。

アイソクロナス転送だけはKL46Zのとインターフェース互換ではありません。
Webカメラ用に専用のライブラリを作りました。

まだまだ不具合がありますが、使用例をmbedサイトに置きました。

USBフラッシュメモリの使用例
LPC4088-USBHostMSD_HelloWorld
Webカメラの使用例
LPC4088-USBHostC270_example

(2014/4/24)
---

0 件のコメント: