マイコン工作実験日記

Microcontroller を用いての工作、実験記録

STM32H743のUSB Serial Number

2018-10-28 14:59:39 | Weblog
しばらく前に、訳あってNucleo-H743を購入。ぼちぼちとH7を使いはじめています。そろそろ新しいRevision Xになっているかと思っていたのですが、手元に届いたのは運悪くRevision Yでした。シリコンバグで困るようなことになったら、買い直すことになるかも。

このボードはNucleo144なので、USB FSポート用のマイクロUSBコネクタが付いているます。そのため、BOOT0をHにしてやるだけで、ブートローダのUSB DFUを動かすことができます。



STM32CubeProgを使ってログ表示を見ていたら、ちょっと気になる内容を見つけました。USBのデバイス ディスクリプタの内容のダンプが含まれているのですが、
Serial Numberの値がやけにキリのいい値になっています。普通デバイス固有の番号になるはずなので、こんなキリのいい数になるはずは無いのですが。。。

そこで、デバイス固有の96bitのIDを保持しているはずの領域の内容をダンプしてみると。。



全然違う値が入っているじゃないですか。

それじゃぁ、表示されたUSB Serial Numberはいったい、どこから出てきた数字なのでしょう。「もしかして、デバイス固有のIDではなくて、デバイスの種別を表しているDEVICE_ID情報を表示しているのではないか?」と考えて、その領域の内容を見てみると。。



想像どおりでした。間違ってDEVICE_IDの内容を表示しています。つまり、STM32H743のUSB DFUは、どのチップでも同じシリアル番号を返すことになりますね。もしかすると新しい Revision XのシリコンではSystem ROMの内容が更新されて直っているのでしょうか?
コメント (2)

NUMWORKS

2018-09-16 18:18:23 | Weblog
ネットを徘徊していて、NUMWORKSというフランスの電卓メーカーを知りました。どうやら1年ほど前に製品を発表していたようで、電卓好きな人たちの間ではTIの関数電卓のようにグラフ表示もできる電卓として話題になっていたようです。また、MicroPythonが搭載されていることでも注目されていたようです。


日本向けへの直販はやっていないようなので、米国アマゾンで購入するとか、輸入業者経由で買うとかしないとならないようなのですが、シュミレータが用意されており実物が無くても動かすことができるのが、洒落ています。 このページで表示される電卓画像上のボタンを押して操作してみることができるのです。

そしてさらにすごいのは、中身のハードウェアやソフトウェアまで公開されており、リソースページからは回路図やBOMリスト、SDKのダウンロードをすることができます。メインのマイコンはSTM32F412ですし、使用しているLCDはコントローラにST7789を使用した16ビットパラレル接続のもののようです。その気になれば自分で互換ハードウェアを作れるだけの情報が全て揃っていますし、ソフトのソースはgithubから入手できます。まぁ、このオシャレなデザインが大きな魅力なんで、ハードは買って、ファームを入れ替えたりして遊ぶのが楽しそうです。

STM32のBOOT0ピンは、USBのVBUS端子に接続されています。そのため、PCとUSBケーブルをつないで電源を入れれば、STM32の内蔵DFUブートローダが起動され、ファームウェアの書き換えが可能です。ファーム書き換えにはなんの改造も必要ありません。てか、こんなことまで、ちゃんとWebページで丁寧に説明してくれているのが偉い!!
コメント

Device ID

2018-08-16 11:00:23 | Weblog
先日、STM32CubeMXがアップデートされたのと時期を同じくして、STM32CubeProgrammerも更新されていました。USB経由だとSTM32F7とつながらない問題も修正されたようなので、これを機会に以前から気になっていた問題を調べて見ることにしました。




上図は、Nucleo-F767 をDFUでブートして、STM32CubeProgrammerと接続した状態です。USBで接続した後、Device Descriptorや Config DescriptorからSerial NumberやらFirmware Versionやらの情報を引き出していることがわかります。ところが、Device ID (0x0451)をどうやって調べているのかが不明でした。Device Descriptorにも Config Descriptorにも該当する情報は含まれていません。もしかして隠しDescriptorが存在しており、それをアクセスして取得しているのではないかとも想像して、Wiresharkを使ってUSBパケットをキャプチャして調べてみたのですが、やはりそのような情報を取得している様子はありませんでした。一体、どうやってDevice IDを取得しているのか?

Device IDはレジスタを読みだして取得することができます。Enumeration時のDescrptorの読み出しではなく、DFUのプロトコルを使って取得しているのかもしれないと思い調べてみましたが、やはりそのような形跡はありません。STM32の UART BootloaderプロトコルではGet IDというコマンドが用意されており、このコマンドを用いることでDevice IDが取得できるようになっているのですが、DFUのプロトコルにはそのようなコマンドは用意されていないのです。

なぜ、Device IDの取得方法にこだわっているのかというと、それは自分でDFUローダを作った場合にもSTM32CubeProgrammerを使いたいと思ったからです。実際に、CubeMXを使ってUSB DFUを使用するプロジェクトを作成して動かしてみると、次の図に示すようにDevice IDが不明であるためにSTM32CubeProgrammerが使用できないのです。




このように、CubeMXで作成したUSB DFUが、そのままではCubeProgrammerでは動作しない訳で、ツール群としての整合性が取れていないではありませんか。Device IDさえ取得できればCubeProgrammerでの書き込みが行えるはずなのに。。。。

いろいろと調べてみましたが、結論としてはUSBのenumeration手順やDFUプロトコルではDevice ID情報を取得していないということがわかりました。それでは、CubeProgrammerはどうやって、Device IDを知ることができるのか? 直接情報を取得していないからには、他の情報からDevice IDを推定しているとしか思えません。

そこで思い当たったのが、DFUのInterface中に存在するDescriptorです。



DFUブートした時には、上図の上半分のようにFlashの構成だけでなく、Option ByteやOTP Memoryの領域の情報もAlt Interfaceとして表現されています。それに対して、CubeMXで機械的に生成しただけのDFUコードでは、Flash構成を表現するAlt Interfaceしか現れていないのです。もしかすると、CubeProgrammerはこれらの Alt Interfaceが表現するフラッシュメモリの構成からDevice IDを推定しているのかもしれません。

推測を確かめるために、DFUのスタックを改造して複数のAlt Interfaceをサポートできるようにして、Option Bytesを表現するAlt InterfaceのDescriptorを追加。もちろん、該当部分のFlashの読み出しもできるようにコードを追加してやりました。すると....




予想した通り、CubeProgrammer はFlashとOption Bytesの構成方法からDevice IDを推定しているようです。これで自作のDFU Loaderを使った場合でもCubeProgrammerでの書き込みが行えるようになりました。

コメント

STM32H743I-DISCO

2018-08-08 18:38:59 | Weblog
先日 STM32CubeMXの新バージョンが出たのでインストールしたところ、ボード一覧に未発売のSTM32H743-DISCOが登録されているのに気がつきました。



USB High speedとかカメラのコネクタはあるようですが、どうやらLCDが載っていない模様。STM32H743だとDSIに対応していないので、LCDはパラレルでつなげることになり、ピン数が足らなくなるのか、他の機能と競合してピン割り当てができないのかもしれません。DISCOボードって、比較的安価でLCDが載っているのが大きな魅力だったので、とっても残念。
コメント

MacでWiresharkを使ってUSBをキャプチャする

2018-08-06 14:39:03 | Weblog
WindowではWiresharkを使って、USBパケットのキャプチャができることは知っていたのですが、Macではできないと思い込んでいました。Wikiのここの説明を読んでも、Linuxを除けば他のUnix系では全滅状態です。でも、このページの説明だとWindowsでもUSBのキャプチャはできないことになっており、USBPCapについては言及されていません。

そこでダメ元で検索してみたところ、この記事を見つけました。ifconfigしなければならないので、一手間必要にはなりますが、確かにWiresharkでUSBを捕まえられるようになりました。これで、マイコンとのUSB接続を調査したりデバックしたりする作業も、大幅に楽になります。
コメント