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