今回は、アルファプロジェクトさんのAP-SH4-1Aという、SH7750Rの評価ボードを用いて実験してみました。

SH4を遠隔操作してフラッシュメモリの内容をパソコンの画面にダンプしてみることにします。
まず、AP-SH4-1AにPocket JTAG Cableをつなぎます。
MITOUJTAG Proを立ち上げたら、SH7750RのBSDLファイルをドラッグ・アンド・ドロップします。すると、画面にSH4の絵が表示されます。

次に、ピン定義ファイルを作成します。今回のはCPUなのでUCFファイルなどは必要ありません。BSDLファイルを読み込むんでボタンを押すだけでOKです。作成したピン定義ファイルはsh7750r.pinという名前にしておきます。
作られたピン定義ファイルの一部を抜粋してみると、
---------------
A 1:180 1:179 1:176 1:175 1:174 1:173 1:172 1:171 1:62 1:63 1:64 1:67 1:68 1:71 1:72 1:73 1:74 1:75 1:76 1:80 1:81 1:82 1:83 1:84 1:189 1:186
CS 1:7 1:6 1:5 1:89 1:90 1:4 1:3
RD_CASS_FRAME 1:94
RD_WR 1:95
D 1:146 1:142 1:140 1:138 1:134 1:132 1:130 1:128 1:127 1:129 1:131 1:133 1:137 1:139 1:141 1:145 1:11 1:15 1:17 1:19 1:23 1:25 1:27 1:29 1:30 1:28 1:26 1:24 1:20 1:18 1:16 1:12 1:124 1:122 1:120 1:116 1:112 1:110 1:108 1:103 1:102 1:104 1:109 1:111 1:115 1:119 1:121 1:123 1:33 1:35 1:37 1:41 1:45 1:47 1:49 1:53 1:54 1:50 1:48 1:46 1:42 1:38 1:36 1:34
WE2_CAS2_DQM2_ICIORD 1:96
WE3_CAS3_DQM3_ICIOWR 1:97
WE6_CAS6_DQM6 1:98
WE0_CAS0_DQM0 1:61
WE1_CAS1_DQM1 1:60
WE4_CAS4_DQM4 1:59
WE5_CAS5_DQM5 1:58
WE7_CAS7_DQM7_REG 1:101
---------------
というふうになっています。
上に挙げた信号は、メモリへつながっているアドレスバスやデータバス、メモリのリード、ライトなどの制御信号です。たとえば、WE7_CAS7_DQM7_REG という信号は、1番目のデバイスの101 番ピンであることを示しています。
このボードにおける、SHとROMの接続は次の図のようになっています。

さて、次にメインのCプログラムを書きます。
プログラムの中では、まずWRやRDの線を適切に設定して、フラッシュメモリだけがデータを出すようにします。
SH4にはCS0~CS6がありますが、この基板ではCS0がフラッシュメモリ、CS1はSRAMなので、CS0だけLにします。
また、この基板ではフラッシュROMのアドレスバスのA0は、SHのA1につながっている(つまり1ビットずれている)ので、アドレスバスに信号を出力する際に2倍してやります。
A = addr * 2; // アドレスバスを出力する

これで、Cプログラム中の変数addrの値をアドレスバスに出力し、データバスの内容を読み込んでprintfするプログラムができました。
実行させてみると、このようにパソコンの画面上にメモリダンプが表示されます。

これがいったい何なのかということを図を用いて説明します。
普通は、SHなどの組み込みCPUを使ったシステムでは、ユーザは組み込みCPUの上で動作するプログラムを作成します。CPUが動作してROMやRAMにアクセスします。

MITOUJTAG Proを使った場合は、SHなどのCPUは眠った状態になります。そして、I/O端子だけがパソコンを通じて操作されます。いわば、組み込みCPUはただのパラレルポートとして動作するわけです。
そして、パソコン上で作られたC++のプログラム、「JTAGスクリプト」を通じて、SHの各端子がHやLに動かされ、データバスやアドレスバスが操作され、データバス上の値を読みことによって、メモリダンプに必要なデータが取得されるわけです。

CPUのコアは全く動作していないのに、まるでCPUが動作しているかのように振舞います。
この機能のパワフルなところは、CPUのコアを全く動かさないのでターゲットとなるCPUのアーキテクチャに全く依存しないというところです。また、CPUごとの内蔵周辺機能やメモリコントローラなどもすべてスルーです。CPUの分厚いマニュアルを読まなくても、どの端子がどう動いてほしいかということだけを記述すればよいのです。
SH以外のCPU、たとえば、IntelやMIPSやFreeScale、さらにはFPGAの中のソフトコアのようなCPUでも同じように動きます。検査プログラムを使いまわすことができます。
また、CS <= "1111100"; と書けば、チップセレクトのCS0とCS1を同時にL出力にすることもできます。
SHが通常の動作をしている場合にはこのような状態には絶対になりえないので、回路の特殊なデバッグに役立つかもしれません。
今回の実験で用いたピン定義ファイルと、メモリダンプ用のサンプルコードは以下のリンクからダウンロードできます。こんなに簡単なスクリプトでハードウェアが動くのです。
■「sh7750r.pin」をダウンロード ※自動生成されたもの
■「main.cpp」をダウンロード
最近のコメント