OpenOCD小ネタ14 -LPC1500シリーズの書き込み対応-

●LPC1500シリーズのフラッシュ書き込みに対応
長らく肥やしにされておりましたが先週あたりにようやくコミットされました

LPC1500シリーズはIAPのアドレスがLPC1000やLPC800シリーズとは
別の場所にありますが、単純にLPC1500用のアドレスを追加するだけで
OKでした。上のリンクのやり取りの通り、LPC1500はCortex-M3
シリーズであり常にthumbモードなのでアドレスを奇数に設定してやる
必要があります。ユーザーマニュアルは微妙に取り違えやすい表現に
なっていて最初ちょっと混乱しましたが今はOpenOCD以外にも
オープンソースなプログラムがあるのでそちらも参考にさせて
もらっています。

LPCLink2ConfigurationTool もパワーアップ!


さて、書き込む対象はLPCXPressoV2が仕込まれたLPC1549XPressoです。
購入当初デバッガ側に書き込まれていたCMSIS-DAPのファームはFL1100の
USB3.0ホストコントローラから認識せず(F**K!)仕方なくmbed版のCMSIS-DAP
を使用しました…
しかしVCP/MSDと折半になるのでただでさえ遅い速度が更に遅くなりしかも
書き込み後もターゲットのLPC1549をつかんだままになるので完了せず
エラーになるというちょっと不便な代物でした。

しかし今年11月になってようやく大幅更新されてリニューアルしました。
こんどのものはmbed版じゃない通常のCMSIS-DAPでも仮想COMが実装され、
MBED版CMSIS-SAPに近い構成になっています。ちなみにLPC-Link2も同じ
ように仮想COMが使用可能となってます。

しかも書き込みスピードがちょっと早くなってます。今のHIDのチマチマ書き
込みの制限だと2kb/Secくらいの早さでしたがUSB3.0ポートだと5kB/Sec
くらいにアップしてます!やったね!
…と言いたいところですがUSB2.0のポートだと逆にパワーダウンして
0.48kB/Secに落ち込んるのが判明orz
はやくOpenOCDにもCMSIS-DAPのブロック書き込みが実装されますように…


ちなみに新しいLPCLink2ConfigurationToolはJLinkのファームウェアも
ありますが残念ながらこちらは何ら変更はなくSRSTの直接操作不能バグ
ありのままです。LPCLink2をJlinkとして使用されている方はSRSTの
コントロールは省略してください。Cortex系ではsysresetreqが代用できます。

OpenOCD小ネタ13 -ビルド環境のアップデートとWindows8.x一部対応-

20150106追:
現在おきぱにあるopenOCDバイナリはWindows8系にも完全対応してます。
20150106追:



OpenOCD等のWindows版バイナリをビルドする際は、私はMsys/MinGWを使用し、
GCCのバージョンは4.7.3でずっと使用してきておりました。
しかしこれからのツールの趨勢に備え、相変わらずの重い腰を上げてビルド
環境のアップデートを試みました。

●msys-coreのアップデート
yamidori98氏のレポートによるとパラレルでmakeした時(-j2とかの
スイッチかました時)にハングする可能性が指摘されていてパッチを当てた
msys-1.0.dllに差し替える必要があるそうです。OpenOCDをビルドする際は最後の
makeが並列化してますのでこれは適用すべきかと思います。
(64bit版Win7ではまだハングに遭遇してませんが)

ビルドに関してはコマンド一発でdllその他諸々をアーカイブしてくれるスクリプト
ファイルが提供されていたので非常に助かりました。ありがとうございます。

●makeを3.82に
同じくレポートを参考に現状最新v3.82のmakeをmakeしました。
そうだね駄洒落だね。こちらもスクリプトファイルを用意してくれていたので
ありがたく利用させていただきました。


●GCCをアップデート

最初に述べたとおり、従来よりrubenvbさん所の個人ビルドのGCC4.7.3
使用していました。実はGCC4.8系に上げてビルドすることを過去に何度か
試してみたことがあったのですが、libgcc_s_sjlj-1.dllが無いとか
InterlockedCompareExchange@12が見つかりませんだとかそういうエラーに
阻まれてとりあえず動くの優先!ということでそれらのエラーが出ない
4.7.3を使ってきた次第です。

これらのエラーはバージョンが上がる際の一時的なものだろうとスルーして
いましたがアップデートを考えていた4.9.2でも同じようにlibgcc_s_sjlj-1.dllが
無い問題が発生したので仕方なくいろいろ調べているとlibstdcとlibgccを
明示的にスタティックリンクにしてやればdllを求められることがなくなる
ことがわかりました。
libusbでいうとCFLAGS,CPPFLAGS,CXXFLAGSに"-static-libgcc -static-libstdc++"
を付与すれば終わりです("-static"は特に付けなくても大丈夫でした)

しかしそれだけではうまくいかなくて得られたlibusb-1.0.dllを差し替えると
今度はlibftdi1.dllでInterlockedCompareExchange@12が見つからないと
エラーを吐いてきました!
こちらに関してはdllとそれ呼び出すexeが異なるバージョンのGCCでビルド
されていた場合に発生することがわかりEXEもDLLも全て同じGCC4.9.2で
ビルドするようにして解決しました。
最終的にOpenOCDをはじめとしてUrJTAG,vsprog,Flashrom,avrdude
GCC4.9.2版のビルドで安定して動作せしめられるようになりました♥


●Windows8でSTLink/V2-1がOpenOCDから繋がらないこともなくはない
環境がGCC4.9.2化出来たので、今度は使用するユーザーが増えて多数報告を
戴くようになった"Windows8.x系でSTLink/V2-1が載ったNucleo板がOpenOCD
から繋がらない問題"に漸くまともに取り組みました。

といっても私はWin8機を所持しておらず副業先のPCたちも全部Windows7機
だったので、不具合を再現させるための環境が全くなく問題の切り分けも
困難を極めておりました。で、唯一Windows8.1を所持している知り合いの方に
頼んで3〜4日オーダーのフィードバック速度でああでもないこうでもないを
繰り返し、ついにlibusb-1.0をビルドするときに当てているAsmedia対策
パッチが原因だったことを突き止めました!またAsmediaか!!

最初にAsmedia対策パッチを検証した際にXPと64bit版Win7では全く問題
ないことを確認していたのですがWin8ではUSBデバイスの取り扱いもさらに
厳しくなった(?)ことからパッチを適用した部分が仇になってデバイスを
Open出来なくなっていたようです。
幸いにも2014年11月現在は別の切り口でAsmedia対策のパッチが提供
されていてそちらのパッチに変更してビルドしたlibusb-1.0.dllでは
Windows8でもばっちり動作しました♥長かった…

というわけでWindows8.1系OSでもOpenOCDが利用できるとっかかりが出来ました。
現在Win8環境下で私が動作保証できる組み合わせは以下のデバッガ
アダプタです。
1:STLink/V2-1(Nucleo板,STM32F053Discovery)
2:STLink/V2(Discovery系板たくさん)

何れもSTマイクロ配布の公式ドライバ(WinUSB)を適用したものです。

もしあなたの環境で上記の場合でもうまくいかない場合、Zadigを使用し以下の
手順でSTLink/V2-1のUSB複合デバイスの親("composite parent") に無理やり
WinUSBを適用して単独の”STLink/V2”として使用する荒業もあります。
ただしこれをやると仮想COMやmbedのマスストレージ書き込みが一切使用
できなくなりますのでご了承ください。

とりあえず通常のドライバを適用した後Zadigを起動し、
"List All Devices"にチェック入れる、
"Ignore Hubs or Composite Parents"のチェック外す

すると"STM32 STLink (Composite Parent)"が現れるのでこれをWinUSBに
置き換える

入れ替えの際に間違えて違うデバイスにWinUSBを適用してしまうと復帰
できなくなる危険性がありますので細心の注意を払って作業してください。

Go to top of page