FM3が富士通からスパンションになりましたよ記念

20161123追:
富士通のFM3を喰ったSPANSIONはCypressに喰われました。



富士通のFM3マイコンに関する記事はもう更新しないでクローズにしようと
思っていましたが、国産マイコンだったFM3シリーズが大人の事情でSPANSIONという
メモリ中心のチップベンダに移譲された
ので記念に小ネタを更新します。

前回まではFM3マイコンにFatFsやTFT-LCDドライバなりを積だのを紹介して
ましたが今回はOpenOCDのFM3フラッシュ書き込みドライバの改良についてです。


いつも参考にさせてもらっているjujurouさんによると小規模のRAM物理量が少ない
品種で書き込みが出来ない
とのことで、Kinetis-LシリーズやNuvotonのフラッシュ
書き込みドライバを実装して実力をつけた私も調査してみました。




上の二つの図はFM3マイコンに収納されたフラッシュ書き込みのバイトコード
(書き込みアルゴリズム)と書き込むべきデータを簡略化した物の修正前と
後の比較です。

フラッシュ書き込みはJTAG/SWDから内蔵SRAMに流し込んでおいたバイト
コードをOpenOCD側の"run_algorithm"にて実行させることにより行われて
いますが、その中でSRAM上にある"u32DummyRead"と"u32FlashResult"の値を
参照しています。この二つの変数は、アルゴリズムを確保したメモリの先頭に
置かれるため、アルゴリズム開始アドレスは、本来は基底アドレス
(BaseAddress)から+8ずれることになります。

おそらく最初にドライバを作った時のデバイスがMB9BF506Nだけだったようで
SRAMの基底となるアドレスが0x1FFF8000に固定化されていました。
しかしFM3シリーズの内蔵SRAMの構造は、0x20000000をベースとして上下に
伸びていく仕組みなので安全牌で動かすためには本来なら基底を0x20000000に
しなければなりません。現状ではSRAM量が物理的に少ない品種ではOpenOCDの
cfgファイル内でSRAM量とSRAM開始アドレスを"正しく"指定すると、
jujurouさんの指摘通りSRAMが存在しないアドレスを参照することになり、
書き込みが必ずコケる羽目になってしまいます。


というわけで私も私なりに修正してなおかつ書き込みパフォーマンスを上げる
修正を盛り込んでパッチを作成しました。先ず以前使っていたMB9BF618Tで
当然のように書き込みを確認しました。さらに今回の問題が修正されてるのを確認
するためにebayで小規模のFM3マイコンMB9AF112K(Flash:128kB/SRAM:16kB)
を仕入れて動作確認を行いました。
↓やっけつ基板


ログはこんな感じです。ばっちり書き込み出来てますね♥

> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/vsllink_swd.cfg -f target/mb9af112k_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.8.0-dev-00117-gf7fed92-dirty (2013-08-12-20:01)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : OpenOCD runs in SWD mode
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
trst_only separate trst_push_pull
adapter speed: 500 kHz
cortex_m reset_config sysresetreq
verify Capture-IR is disabled
Info : Versaloon(0x15)by Simon(compiled on May 22 2013)
Info : USB_TO_XXX abilities: 0x0000076E:0x010001EF:0xC0000007
Info : clock speed 500 kHz
Info : Found SWD-DP id:0x2BA01477
Info : mb9bfxx2.cpu: hardware has 6 breakpoints, 4 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000114 msp: 0x20002000
auto erase enabled
Info : Fujitsu MB9[A/B]FXXX: Sector Erase ... (0 to 2)
Info : Fujitsu MB9[A/B]FXXX: FLASH Write ...
wrote 131072 bytes from file main.elf in 4.344639s (29.462 KiB/s)
verified 33456 bytes in 0.109398s (298.651 KiB/s)
shutdown command invoked

> Process Exit Code: 0
> Time Taken: 00:05



さて、上記FM3の修正のほかにkinetisドライバとNuvotonドライバのブラッシュアップ
も行い、8月11日時点のOpenOCDのコミットに適用したパッチ群も更新しました。
もちろんOpenOCDのバイナリも修正していますので奇しくも時を同じくして一般販売と
なった「FM3-USBSTICK」を購入された方は試してみてください(私はMB9AF112Kで試し
ましたがメモリ構造が同様のMB9AF312Kでもまったく同様に使用できます)。



・・・
本来はこの程度の小ネタはブログトップのサブタイ欄にちょっと書いて終わる
はずなのですがVersaloonのBBSにKinetis-LドライバやNuvotonドライバのパッチを
紹介したことでntfreakリンサンの目に留まり、OpenOCDのgerritにFM3の修正を含めた
いくつかのパッチを叩き上げられることにめでたく相成りました。
しかし、そのFM3ドライバのパッチはまだバグが修正仕切れてなかった欠陥版
だったのがつい最近判明したので、汚名返上のために私自身もOpenOCDのコード
レビューシステムに電撃参戦する意を決めました!!

とはいえパッチを提供するまでに覚える事柄が非常に多く英語による意思の
疎通も非常に重要になります。なんにせよひとつずつ目的達成までの課題を
あせらずクリアしていくほかありませんが汚名挽回をしてしまわないように
気をつけます・・・。

Comments

ネムイさん

はじめまして竹澤といいます。
すばらしいOpenOCDのパッチありがとうございます。

ここに書いていいのか分かりませんがバグがあったので対処法とあわせてご報告いたします。

症状:LPCマイコンへのSWD経由での書き込みに失敗することがある。
・gdbのload時にError finishing flash operation)
・openocd側では
lpc2000 returned 6 (LPC2000_COUNT_ERROR)
Error: 1758 21222 core.c:93 flash_driver_write(): error writing to flash at address 0x00000000 at offset 0x00000000

原因:構造体の初期化がされないためlpc2000_flash_bankのcmd51_can_64bの値がおかしくなる。

対処:パッチ適用後lpc2000.cの563行目に以下を追加で初期化処理を追加で解決。
memset(lpc2000_info, 0, sizeof(struct lpc2000_flash_bank));

以上です。

パッチ適用前からそもそも初期化してないのがまず問題ですがメンバに全部代入してるようなのでバグとは言い切れないのが微妙なとこですね。
ただバグを生む原因になるので本当は元から修正すべきなんでしょうね。

コードレビューに電撃参戦されるようなのでそこらへんもついでに指導(?)してあげてください。

竹澤様はじめまして、ねむいです。


該当する箇所を見直しましたが、ご指摘いただいたとおり古いタイプのLPC2000や
LPC1800/4300のフラッシュ有モデルに書き込む際にIAPのエラーでコケる
リスクがありますね…。
LPC800シリーズへの書き込み対応を追加させたのが原因で自らバグを作り
こんでしまいましたorz

というわけでmemsetによる構造体の初期化を追加してさらに直後のif-else
構文内のいくつかの条件で抜け落ちていたcmd51_can_64bの値をすべて明示
するようにして、パッチとOpenOCDのバイナリも8/14付けで更新させていた
だきました。


気づかずにパッチを再提出していたら文字通り汚名挽回してるところでしたorz
ご指導ありがとうございます!

ネムイさん

早速の対応ありがとうございます!
汚名返上がんばってくださいませ

Post a Comment








Go to top of page