arm_blaster の変更点
[[2010-10]] PIC18Fの実装:[[pic18blaster]] ATtiny2313の実装:[[hid_blaster]] [[STM8S(改)OpenOCDライター>stm8s_blaster]]
*STBEE MINIを使ってARM用JTAGアダプター(FlashROMへの書き込み、OpenOCD用デバッガ)を製作する。 [#k091115f]
http://psp.dip.jp/web/jpg/ARM/frisk-jtag.jpg
-STBEE MINIをFRISKのプラケースに入れて、基板を固定したところ
~
http://psp.dip.jp/web/jpg/ARM/frisk1.jpg
http://psp.dip.jp/web/jpg/ARM/frisk2.jpg
-完成写真(配線の手間としては、抵抗4本と6PINケーブルの接続だけです)
■ 概要
これは、OpenOCD の DLL ハック(実験)です。
即ち、外部に DLL を置いて、JTAGアダプターのドライバーの分離実装を試みています。
■ 現在のステータス
STBEE MINIを使用した(OpenOCD用)JTAGアダプターがWindows上で動作します。
■ 試し方
試行にはWindowsXPを用います。
-STBEE MINIにはあらかじめ[[ブートローダー>armon]]がインストールされているものとします。
-下記のファームウェアを書き込みます。
C:> armboot armblaster/firmware/main-2000.hex
-armboot は[[armon/armboot>armon]]に含まれているほうの実行ファイルを使用してください。
~
-STBEE MINIに元から書き込まれているDFUブートローダーのままで試したい場合は、dfuw.exeを使って、以下のファームを書き込んでください。
armblaster/firmware/main-3000.hex
-main-2000.hexとの違いは、開始番地が3000に変更されているのみです。
~
- JTAGが使用できる適当なARM基板を以下のような対応でJTAG接続しておきます。
-結線は、
STBEE MINI ターゲットARM基板 JTAG端子
PB11 ------------- TCK
PB10 ------------- TDI
PB9 ------------- TDO
PB8 ------------- TMS
-となります。これ以外のnTRSTピンなどはまだサポートしていません。(USB-Blasterと同様)
また、上記結線は直結ではなく100Ω程度の抵抗を介して接続するようにしてください。
- armblaster/openocd/ ディレクトリの ocd.bat あるいは、 ocd2.bat を起動して、openocd.exeの吐き出すメッセージを確認することが出来ます。
- 正常に接続出来ているようでしたら、telnetで localhost:4444 番に接続して、OpenOCDコマンドを実行してみてください。
■ ディレクトリ構成
armblaster-+
|
+- firmware\ STBEE MINI用ファームウェア.
+- HW\ STBEE MINI用ファームウェアのビルドに必要なライブラリ
+- inc\ STBEE MINI用ファームウェアのビルドに必要なヘッダー
|
+- openocd -+ STBEE MINI用 openocd.exe と hidblast.dllソース.
| |
| +--helper\ ヘッダーファイル.
| +--jtag\ ヘッダーファイル.
| |
| +--openocd_patch\ openocd本体側作成用の改造点
|
|
|
+- tools ---+--armon\ armon (動作確認用モニタ)
|
+--avrwriter\ AVRライター (HIDaspx互換)
|
+--picwriter\ PICライター (pic18spx互換)
|
+--picwriter24\ PIC24Fライター
■ プログラムの再ビルド方法
WindowsXP上のMinGW-gccコンパイラを用いて openocd/ ディレクトリにて makeしてください。
makeすると、hidblast.dll が作成されます。
-openocd.exe本体を再ビルドする方法は、[[ここ>openocd-build]]を参照してください。
今回の改造部分ソースはopenocd_patch/ ディレクトリに置いています。
Linux上でのビルドオプションは、こんな感じです。
$ ./configure \
--build=i686-pc-linux-gnu \
--host=i586-mingw32msvc \
--enable-maintainer-mode \
--enable-dummy
出来上がった openocd.exe 本体は、ドライバーとして、同一ディレクトリに存在する hidblast.dll を
起動時に呼び出します。(存在しなければ、dummyドライバーのみが組み込まれます)
■ 現状の問題点
- HIDデバイスなので遅いです。
- Flashの書き込みがやや遅いです。
- USBデバイスの文字列名称が "ARM32spx" --> "ARMblast" に変更になっていますので、armonを使用する場合は、この配布ファイル内のarmon.exe を使用してください。
- (名称変更の理由は、書き込みターゲットのファームウェアがarmon/armbootの場合に
そちらに接続されてしまい誤動作するので変更しました。)
■ ライセンス
OpenOCDの配布ライセンスに準じます。
■ 展望
-hidblast.dll ファイルを(自力で)差し替えるだけで、これ以外のJTAG自作書き込み器をサポートすることが可能になります。
--OpenOCD本体ソースに変更を加えることなく、自由にドライバー作成できるようになります。
--OpenOCD本体ソースには殆ど手をつけていませんので、今後のOpenOCDの変更点に追従する手間はほとんど要りません。
--(ただしjtag_command_queueの構造が変わった場合はもろに影響を受けますが・・・)
-hidblast.dll のエントリーポイントは、
DLL_int get_if_spec(struct jtag_command **q);
-だけです。
-引数のstruct jtag_command **qのqには、openocd本体のjtag_command_queueというグローバル変数のアドレスを渡します。
-戻り値は、(intになっていますが) ドライバー記述構造体のアドレスになります。
*ダウンロード(仮) [#abc45486]
|[[armblaster.zip:http://psp.dip.jp/web/upload/STM/armblaster.zip]]|WindowsXP,MinGW用ソース、実行ファイル、AVR側ファームウェア、openocd本体改造パッチ|
-数日おきに更新していますので、古いと思ったら最新を取得してみてください。
~
~
*ARM以外の書き込みターゲットについて [#r6835cfc]
-現状のarmblasterは、[[pic18spx]]ベースの汎用ライターにJTAGコマンドを付け足しただけのものですので、
-多くのATMEL製AVRチップとMicrochip製PIC18Fシリーズ、そして一部のPIC24Fシリーズへの書き込み機能を備えています。
-コマンドライン版書き込みツールは[[pic18spx]]のものを簡単に移植することが出来ます %%が、今のところまだ用意できていません。%%
--用意しました。
armblaster/tools/avrwriter/
|
/picwriter/
|
/picwriter24/
-AVR,PIC18Fを焼く場合の結線図
STBEE MINI ARMターゲットのJTAG端子 PIC18F AVR
PB11 ------------- TCK ---------- PGC --- SCK
PB10 ------------- TDI ---------- PGM --- MOSI
PB9 ------------- TDO ---------- PGD --- MISO
PB8 ------------- TMS ---------- MCLR --- RESET
-上記結線は直結ではなくSTBEE MINIからは100Ω程度の抵抗を介して接続するようにしてください。
-PIC18Fは低電圧書き込みのみをサポートします。高電圧(9V〜12V デバイスによって異なります)書き込みは出来ません。
参考
-AVR-ISP用:ピンヘッダーを基板上から見た配置
5 3 1
+----+----+----+
|Rset|SCK |MISO|
+----+----+----+
|GND |MOSI|Vcc |
+----+----+----+
6 4 2
-PIC18FのISPにもそのまま使いまわし
5 3 1
+----+----+----+
|MCLR|PGC |PGD |
+----+----+----+
|GND |PGM |Vcc |
+----+----+----+
6 4 2
-それをまたARM(JTAG)にも使いまわし
5 3 1
+----+----+----+
|TMS |TCK |TDO |
+----+----+----+
|GND |TDI |Vcc |
+----+----+----+
6 4 2
~
~
*STBEE MINI以外の基板への移植について。 [#q6e04bce]
-STM8S-D,CQ-STARM,STBEE,STBEE MINIの4機種の基板については全て[[armon/armboot>armon]]を移植済みです。
-なので、armblasterの移植も簡単に出来ると思います。
-JTAG,AVR-ISP,PIC18書き込み用の端子(STBEE MINIではPB8〜PB11)をそれぞれの基板の都合の良い位置に割り付ける作業は、おそらく定義ファイルを書き換えるだけで済みます。(ポートの制御はArduino風にdigitalRead(pin)とdigitalWrite(pin,level)で行なっていますので、pinの定義が変わるだけで対応可能です)
-Makefileにはすでに基板の種別定義が含まれていますので基板名のdefineを書き換えるだけですみます。
-ただし、''FRISKケースに入る基板''は今のところSTBEE MINIだけしか対応できません。
~
~
*JTAGコマンドの追加とプロトコルについて [#e2f59006]
-hidcmd.h
#define HIDASP_JTAG_WRITE 0x18 //JTAG 書き込み.
#define HIDASP_JTAG_READ 0x19 //JTAG 読み書き.
-が追加されてます。
-HidReportの下りストリーム(PC->AVR) サイズは最大64バイトまでです.
+------+------+-------------------+------+-------------------+------+-------------+-----+
| 0x18 | jcmd | data列 | jcmd | data列 | jcmd | data列 | 0x00|
+------+------+-------------------+------+-------------------+------+-------------+-----+
--jcmdの1バイトは以下のように定義(その1)
bit 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | b6| JTAG転送bit数(TDIの数)| + JTAG転送bit数分の TDIビット(LSBファースト)
+---+---+---+---+---+---+---+---+
--- b6はTDI送出の最終bitでTMSを1にするなら1 しないなら 0 : TMSは最終bit以外は常時0
~
--jcmdの1バイトは以下のように定義(その2)
bit 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 1 |BITBANG転送回数(後続byte数)| + BITBANG転送回数分(byte数)のデータ
+---+---+---+---+---+---+---+---+
--BITBANGデータの1回分は、TCK=LOWのサンプルとTCK=HIGHのサンプルをパックしたデータ。
bit 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
|TCK|TDI| - |TMS|TCK|TDI| - |TMS| (上位4ビットが最初にセットされ、次に下位4ビットがセットされます)
+---+---+---+---+---+---+---+---+
--TCKを変化させたくないときは、両方のTCKビットを同じ値にします。
~
~
-HidReportの登りストリーム(AVR->PC) サイズは最大64バイトまで. HIDASP_JTAG_READ発行時のみ折り返し返送されます.
+----------------------------------------+
| JTAG受信データ(TDOの読み取りビット列) | (最大64バイトまで)
+----------------------------------------+
--ビット列はLSBファースト. 送信されたTDIビット列とそのまま対応しています.
----
その他補足
#define HIDASP_JTAG_READ 0x19 //JTAG 読み書き.
-を実行するときは、HidReportの下りストリーム(PC->AVR)を単純な形式(1コマンドのみ)にします。
+------+------+-------------------+------+
| 0x19 | jcmd | data列 | 0x00 |
+------+------+-------------------+------+
-jcmdがBitBangモードのときは、返答データはありません。JTAG(TDI列)のときのみ(TDO列)を返します。
-JTAGストリームが長い場合(56bit以上のTDIを送ってTDOを受け取る)は、56bit単位に分割転送します。
-その場合、最後のストリームの最終bitのみ、TMSを1にする処理が入ります。(b6=1のパケットを用意します)
~
-armblasterのファームを再ビルドするときは、CodeSourcery G++ Lite を使用してください。
~
~
~
----
*OpenOCDの簡単な使い方 [#f0f6b21c]
-起動したらまず、localhost:4444番ポートにtelnetで(TeraTermなどを使って)繋いでください。
-TeraTermから、以下のようなコマンドをタイプすると、結果が表示されます。
|OpenOCDコマンド|意味|
|scan_chain|接続されているTAPのリストを見る。|
|reset halt|ターゲットCPUをHALTさせる|
|reg|ターゲットCPUのレジスタを見る|
|mdw アドレス カウント|display memory words <addr> [count]メモリーダンプ|
|step|CPUをステップ実行させる|
|flash write_image erase main.hex|main.hexをFLASH ROMに書き込む(そのまえにCPUをHALTにしておきます)|
~
*OpenOCDのWindows版をLinux上からクロスビルドする方法。 [#acd61903]
-[[openocd-build]] を参照してください。
~
~
----
*参考文献(LINK) [#xc3d2b7c]
OpenOCDが動くまで (kimura Lab)
-http://www.kimura-lab.net/wiki/index.php/OpenOCD%E3%81%8C%E5%8B%95%E3%81%8F%E3%81%BE%E3%81%A7
OpenOCD (ベストテクノロジーさん)
-http://www.besttechnology.co.jp/modules/knowledge/?OpenOCD
OpenOCD本家
-http://openocd.berlios.de/web/
~
~
~