LPCXpresso LPC1769でFatFsを動かす–USB Host編
LPCXpresso LPC1769でmicro SDカードの読み書きとDMA転送の実験を行いましたが、借用したコードにNXP提供のUSB Hostドライバ(USB Host Lite)が入っていることが分かりました。こいつを使えば、LPCXpressoでUSBメモリーの読み書きもできるということなので、遅まきながら試してみました。
使用したコード
これまで使用した、ChaN's FAT-code with interface for NXP LPC17xx (LPC1766, LPC1768 and others)を使っています。USBドライバの部分はそのまま使用できましたが、以下の2箇所は変更が必要でした。
1. USB Host Liteの有効化とパラメータの変更
USB Host Liteはデフォルトでは無効になっているため、プロジェクトのプロパティー → Build Settings → Symbolsに”WITH_USB_MS=1”を追加します。加えて、ffconf.hの以下の部分を変更します。
/*---------------------------------------------------------------------------/ / Physical Drive Configurations /----------------------------------------------------------------------------*/ #if WITH_USB_MS #define _DRIVES 2 // 2に変更 /* Number of volumes (logical drives) to be used. */ #else #define _DRIVES 1 #endif
(2011/7/20修正)
2. ff_test_term.cの変更
fiコマンドで論理ドライブを初期化した際に、FatFSのf_mount()関数を呼んでいますが、FatFSのドライブ変更を行っていないため、FatFSは依然としてデフォルトのDrive = 0をポイントしたままになっています。そのため、f_chdrive()を呼んでカレントドライブの変更を行う処理を追加しました。変更した箇所は以下の部分です:
int ff_test_term(void) { // ---- snip ----- for (;;) { xputc('>'); get_line(Line, sizeof(Line)); ptr = Line; switch (*ptr++) { // ---- snip ----- case 'f' : switch (*ptr++) { case 'i' : /* fi <log drv#> - Initialize logical drive */ if (!xatoi(&ptr, &p1)) break; put_rc(f_mount((BYTE)p1, &Fatfs[p1])); res = f_chdrive((BYTE)p1); // Added by todotani if (res) { xprintf("Failed to change current drive.\n"); } break; } } }
当初はFatFSのf_mount()関数を修正することで対処したのですが、アプリ部分のが正しくFatFSのAPIを使っていなかったことになります。
ff.cのf_mount()を一箇所だけ変更しています。このサンプルではff_test_term.cという対話型のshellを使いますが、SDカードを使用する場合はDrive 0, USBメモリはDrive 1を指定します。Drive 1を指定した場合でも、内部的に初期値のDrive 0を指定したままになっておりUSBメモリのFAT構造体を参照できないため、f_mount()関数に1行追加を行いました。神のごときChaN様のコードをいじるなど恐れ多きことですが、この変更で動いてくれました。追加を行った部分を以下に示します。32行目が追加したコードです。
コード全体はこちらからダウンロードできます: LPC1769_FatFS_USBv2.zipをダウンロード
LPCXpressoとUSBコネクタの接続
以前自作したLPCXpresso用拡張基盤の空きスペースにUSB Aコネクタを追加しました。コネクタを追加した写真を以下に示します。
USBコネクタとの接続はmbed用Starboard Orangeの回路を参考にして、以下のように行いました:
- MCU (LPC1769)のUSB D+/D-ピンを直接USBコネクタに接続しています。LPC17xxのUser manual 13.7.2章では、D+/D-に33Ωの抵抗を直列に挿入すること、D+/D-を15KΩの抵抗でプルダウンすることが示されており抵抗を入れたほうがよいかもしれませんが、USBケーブルの引き回しがない写真の状態ではとりあえず動いています。
- +5Vの給電を行っているため、5Vラインに保護用のポリスイッチを入れています
- +5V – GND間に47uF, 0.1uFのコンデンサを挿入
動作試験
これまでと同様にff_test_term.cを使って転送速度を計ってみます。結果は以下のとおりでした。
Hello from the ChaN FatFs Demo on LPC1700 Version 0.0.2, Martin Thomas 7/2010 xprintf is working CPU Clock: 120MHz Peripheral Clock: 60MHz SPI Clock: 30MHz FatFs module test monitor for LPC17xx/SSP LFN Enabled, Code page: 1252 >di 1 rc=0 > >fi 1 rc=0 FR_OK > >fs FAT type = FAT16 Bytes/Cluster = 32768 Number of FATs = 2 Root DIR entries = 512 Sectors/FAT = 239 Number of clusters = 60986 FAT start (lba) = 8066 DIR start (lba,clustor) = 8544 Data start (lba) = 8576 ...1 files, 30000000 bytes. 0 folders. 1951552 KB total disk space. 1922240 KB available. > > >fl ----A 2010/07/15 11:58 30000000 test1.txt 1 File(s), 30000000 bytes total 0 Dir(s), 1968373760 bytes free > >fo 10 test2.txt rc=0 FR_OK > >fw 10000000 62 10000000 bytes written with 576 kB/sec. >fw 10000000 63 10000000 bytes written with 393 kB/sec. >fw 10000000 64 10000000 bytes written with 398 kB/sec. > > >fc rc=0 FR_OK > >fl ----A 2010/07/15 11:58 30000000 test1.txt ----A 2010/07/15 11:58 30000000 test2.txt 2 File(s), 60000000 bytes total 0 Dir(s), 1938358272 bytes free > > >fo 1 test2.txt rc=0 FR_OK > >fr 10000000 10000000 bytes read with 682 kB/sec. >fr 10000000 10000000 bytes read with 442 kB/sec. >fc rc=0 FR_OK > >fo 1 test1.txt rc=0 FR_OK >fr 10000000 10000000 bytes read with 682 kB/sec. >fr 10000000 10000000 bytes read with 442 kB/sec. >fr 1000000 1000000 bytes read with 442 kB/sec. > >fc rc=0 FR_OK >
結果はリードで682KB/sec (5.4Mbps)とあまりふるわず。SDメモリでは2149KB/sec出たため、1/3以下の性能です。LPC17xxのUSB Hostは12Mbps動作(Full speed)なので、USBプロトコルのオーバヘッド(詳細分かっていませんが)を加味すると妥当な線なのかも知れません。
おわりに
USB Hostの制御をどのようにやっているのかソースを追ってみたのですが、サッパリ分かりませんでした。
usbhost_lpc17xx.cのHost_ProcessTD()関数の中でTransfer descriptorを組み立て、転送をキックしているように見えるのですが、パラメータの意味が分かりません。LPC17xxのマニュアルを見ると、詳細はOHCI (Open Host Controller Interface)のドキュメント参照とさらっと書いてあるだけなので、OHCIの仕様書を読まないとだめそうです。ドキュメントはダウンロードしましたが、160ページの英語文書なのでハードル高そうです。
« LPCXpresso LPC1769でFatFsを動かす - DMA編 | トップページ | Parallels DesktopでWindows on Mac »
「NXP-ARM」カテゴリの記事
- LPCXpresso IDEでのC++コードサイズ肥大化の対策(2011.10.15)
- XBee APIモードライブラリのLPCXpressoへの移植(2011.10.09)
- LPCXpresso LPC1769でFree RTOSを使う(2011.07.27)
- LPCXpresso LPC1769でFatFsを動かす–USB Host編(2011.07.19)
- LPCXpresso LPC1769でFatFsを動かす - DMA編(2011.05.14)
この記事へのコメントは終了しました。
コメント