STM32F7を使ってみる14 -HS ULPIでUSB-MSCを使ってみる-

みなさまあけましておめでとうございます

今年もねむいさんほか虹裏メイドたちをごひいきにm( )m
今年はねむいさんのイラストが100枚くらい増えますように
↑本音




さて新年早々ですがHALライブラリにバグを見つけたので解説しようと思います。

遡る事約一ヶ月前、ねむいさんはSTM32F7で新しい事をやろうとCubeF7に同梱されて
いるUSBライブラリとそのExamplesたちに手をつけ始めていました。
STM32F746G-DiscoveryにはULPIとかついているのでUSB-MSC(MassStorageClass)の
実装を試みました。もちろんUSBのバス速度はHighSpeed(480Mbps)です。

幸いにもSTM32F746G-Discovery向けのサンプルコードもあったのでそれを
ねむいさん謹製のいつものをベースに実装しようとしましたがUSBライブラリが
DMA使ってるくせにキャッシュの事全然考えてない作りでそれにブチ切れながら
GCC向けに移植していましたが最終的にL1キャッシュがないと足を引っ張る
SRAM1,SRAM2を使わずにノーウエイトでアクセス出来るDTCM領域だけでがんばる
ことにしました・・・orz

Ac6STM32用のプロジェクトファイルのリンカスクリプトもそうなってますし
・・・フォーラムでも奇跡の積み重ねで動いてると情けない指摘
されています。HALライブラリみたいなバグだらけの変なものリリースしっ放し
にしてないできっちりバグつぶせYO!
☝って言ったらたくさん非難されていっぱい哀しい…


と言いつつも何とか動いて認識しました♥


もちろんeMMCとかもしっかり認識しちゃいます★


とおもったらまだ問題がありました…幾つかのカードでデータが正常に
読み込めない事がありました。


64GBのカードでも容量はしっかり見えてるんですけどね…なんか4GB以上
データを詰めてるカードで動作がへんなのです…

…4GB…?これって…

かつてUSB付きのARMマイコンでMSCのサンプルではカード容量を示す変数が
uint32_tで現わされていて4GB以上の容量を正しく表示できないという
4GB問題がありました。対策は単純に容量を示す変数をuint32_tから
uint64_tへ変えるだけのものなのですがUSBライブラリを見る限りでは
それはちゃんと64ビット変数になっており問題がありませんでした。


しかしブロックアドレスにブロック容量を掛け算し代入してやがる式を
見つけました。指定するブロックアドレスによってはuint32_tで扱える
範囲を超えてしまう可能性があります。このscsi_blk_addrって奴なのですが
まさか…まさか…


デデーン

思いっきりuint32_tじゃん…

ば っ か じ ゃ ね ぇ の ! ?
ねむいさんのむなしい叫び越えが夜の闇にこだまする。


ていうわけでscsi_blk_addrをuint64_t化すると4GB以上データ詰めている奴でも
正常に読み書きすることができるようになりました…なんちゅう初歩的な。

一応フォーラムにも報告しておきましたがSTM32フォーラムのguruと呼ばれている
clive師より「ブロックアドレスをいれた変数にバイトアドレスに変換した値を放り
込むSTの昔っからのコーディング姿勢自体が愚。scsi_blk_addrの安易な64bit化は
不必要」と指摘されましたがねむいさんもごもっともだと思いました。



そんなわけで漸く正常に繋がるようになったので読み込み比較です。今回は
USBの転送用に確保していると思われるバッファの容量を増やすことで転送
スピードがどこまで変わるか見てみました。


条件STM32F746G-Diacovery,USB-HS ULPI,最適化オプションは"-s"
132MBのmp3ファイルをFastcopyを使ってPCのRAMDISKへコピーする時の平均転送速度を記録。
SDのクロックはNS(24MHz)とHS(48MHz)で比較。


ある程度分かっていたことですがやはり容量を増やしていくと転送スピードは
上がっていきましたがある程度(16kb以上)以上で転送スピードは横ばいになる
ことが分かりました。これはNSとHSもほぼ同様の傾向なので16384byte以上
パケット容量確保してもそれ以上は余り効果がないことが分かります。
まぁこれだけ速度出せたら御の字でしょう。とにかく16384byte分確保して
おけば何の問題もないですね。


ちなみに今回はお仕着せEclipse環境のAC6STM32で一旦プロジェクトをビルドして
ねむいさん環境に移植しましたが(単にリンカスクリプトをDTCMしか使わない
ようにしただけですけど)もっと性能の高いF769I-Discoveryで何で
試さなかったの?と言う話になるでしょうけど理由が…


CPUが対応してない・・・このせいでボード対応しててもビルドが通らないorz



やっぱ自分でmakefile書いてコマンドラインビルドが最強ですって☆

Go to top of page