JTAG プログラミングケーブルを使って、 SH3(SH7709S)のバスにつながっているFLASHをプログラミングします。 FLASHをプログラムする程度ならば、CPU デバッガは不要です。
JTAGの基本的な4つの信号線(TDI,TDO,TCK,TMS)をつなぎます。 プログラミングケーブルはターゲットからの電源供給を必要とするので、 3.3V(H-UDIコネクタにはありません)を見つけてつなげます。 よって、GNDも含めて計6本のワイヤリングをします。
また、JTAGインタフェースを有効にするために、xASEMD0をLにします。 ここまでのことで、SHのピンの状態を観察することができます。
ただし、バスやIOポートを直接コントロールしたり、FLASHのプログラミングのためには CPUをスリープさせた状態を作ったほうがよいため、リセット周りの工夫が必要です。(後述)
% cd <WORKDIR> % tar xvfj include-0.3.2.tar.bz2 % tar jtag-0.5.1.tar.bz2 % cd jtag-0.5.1 % ./configure --with-include=<WORKDIR>/include-0.3.2 % make # make install
# cd /usr/local/share/jtag/hitachi # vi PARTS ------------ SH7709 用のエントリを追加する *** 24,26 **** --- 24,27 ---- # bits 27-12 of the Device Identification Register 0000000001000010 sh7727 SH7727 0111010101101110 sh7727 SH7727 + 0000000000000001 sh7709 SH7709 # mkdir sh7709 ------------- SH7709 用の設定ファイルディレクトリの作成 # vi STEPPINGS + 0000 sh7709 V0そして、これ(sh7709)を /usr/local/share/jtag/hitachi/sh7709 の下におきます。
% jtag JTAG Tools 0.5.1 Copyright (C) 2002, 2003 ETC s.r.o. JTAG Tools is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. There is absolutely no warranty for JTAG Tools. Warning: JTAG Tools may damage your hardware! Type "quit" to exit! Type "help" for help. jtag> cable parallel 0x378 DLC5 (接続ケーブルにあわせて宣言する) Initializing Xilinx DLC5 JTAG Parallel Cable III on parallel port at 0x378 jtag> detect IR length: 16 Chain length: 1 Device Id: 00000000000000000001000000001111 Manufacturer: Hitachi Part: SH7709 Stepping: V0 Filename: /usr/local/share/jtag/hitachi/sh7709/sh7709 jtag>このように出力されればCPUを認識している。
jtag> instruction SAMPLE/PRELOAD jtag> shift ir (SAMPLE/PRELOAD命令を送り込む) jtag> shift dr (データを転送) jtag> dr (そのビット列を表示) 11111111111111111111111111111111101011111111111111111111111111111111111111111111 11111111111111111111111111111111110110010110000100000000000011111111111111110000 00000000000000000000000000000000000000111111111111111111100111111101101100000010 11001100000001101000000001110101111110111111000000011000110101000000010000000010 1111110110010000011 jtag> shift dr jtag> dr 11111111111111111111111111111111101011111111111111111111111111111111111111111111 11111111111111111111111111111111110110010110000100000000000011111111111111110000 00000000000000000000000000000000000000111111111111111111100111111101101100000010 11001100000001101000000001110111111110111111000000011000110111100000010000000010 1111110110010000011 (CPU実行中のため微妙にビットパターンが違う) jtag> get signal PTD1 (PTD1に接続したスイッチの状態を得る) PTD1 = 1 jtag> shift dr (押した状態でサンプル) jtag> get signal PTD1 PTD1 = 0 (状態が変わった)信号名は /usr/local/share/jtag/hitachi/sh7709/sh7709 で定義されたシンボルが使えます。
CPUからピンを奪う場合にはCPUリセットホールド状態にする必要があります。 SH7709Sユーザーズマニュアル 22.4.2によると CPUリセット解除時に TRST が L にしておけば よいようです。ですので、リセット前(電源ON前)にTRSTをGNDにショートしておき、電源を入れ、 その後TRSTを開放することでホールド状態を作成します。
ブートローダなどがインストールされていれば、コンソールに何も表示されなくなるので、 CPUが起動していないことがわかると思います。
JTAGらしい使い方
jtag> instruction EXTEST jtag> shift ir jtag> set signal PTC0 out 0 jtag> shift dr (PTC0にLEDが接続されているので消灯する) jtag> set signal PTC1 out 0 jtag> set signal PTC0 out 1 jtag> shift dr (PTC1のLEDが消灯し、PTC0のLEDが点灯する) jtag> instruction BYPASS jtag> shift ir
CPUを意識した使い方
jtag> initbus sh7727 (最初からあるsh7727用バスドライバがそのまま使える) jtag> detectflash (FLASHメモリの検査) jedec_detect: mid 20, did ef (CFIに未対応だと見つけてくれない) Flash not found! jtag> peek 0x6000 (メモリの読み出し) bus_read(0x00006000) = 0x0000A000 (40960) jtag> peek 0x6002 bus_read(0x00006002) = 0x000037B0 (14256)
jtag> detectflash (FLASH の認識) Query identification string: Primary Algorithm Command Set and Control Interface ID Code: 0x0002 (AMD/Fujitsu Standard Command Set) Alternate Algorithm Command Set and Control Interface ID Code: 0x0000 (null) Query system interface information: Vcc Logic Supply Minimum Write/Erase or Write voltage: 2700 mV Vcc Logic Supply Maximum Write/Erase or Write voltage: 3600 mV Vpp [Programming] Supply Minimum Write/Erase voltage: 0 mV Vpp [Programming] Supply Maximum Write/Erase voltage: 0 mV Typical timeout per single byte/word program: 16 us Typical timeout for maximum-size multi-byte program: 0 us Typical timeout per individual block erase: 1024 ms Typical timeout for full chip erase: 0 ms Maximum timeout for byte/word program: 512 us Maximum timeout for multi-byte program: 0 us Maximum timeout per individual block erase: 16384 ms Maximum timeout for chip erase: 0 ms Device geometry definition: Device Size: 2097152 B (2048 KiB, 2 MiB) Flash Device Interface Code description: 0x0002 (x8/x16) Maximum number of bytes in multi-byte program: 1 Number of Erase Block Regions within device: 4 Erase Block Region Information: Region 0: Erase Block Size: 16384 B (16 KiB) Number of Erase Blocks: 1 Region 1: Erase Block Size: 8192 B (8 KiB) Number of Erase Blocks: 2 Region 2: Erase Block Size: 32768 B (32 KiB) Number of Erase Blocks: 1 Region 3: Erase Block Size: 65536 B (64 KiB) Number of Erase Blocks: 31 jtag> flashmem 0x10000 read.bin (オフセット0x10000 からファイル read.bin のデータを書き込む) Note: Supported configuration is 2 x 16 bit or 1 x 16 bit only Chip: AMD Flash Manufacturer: Unknown manufacturer (ID 0x0004) Chip: Unknown (ID 0x2249) Protected: 0000 program: flash_unlock_block 0x00010000 IGNORE block 4 unlocked flash_erase_block 0x00010000 ........................................flash_erase_block 0x00010000 DONE erasing block 4: 0 addr: 0x000100FE verify: addr: 0x000100FE Done. jtag>