2011年8月28日日曜日

cross gcc for zumi32

このblogの統計情報を見たところ、http://translate.googleusercontent.com/を通して英語に
変換して見てらっしゃる方が居るようだったので頑張って英語に書換えてみた。
いやー、Google翻訳って便利だわ。 The Google translate is my best friend って感じだ。

Time had opened considerably, but I reopened porting work of gcc for
zumi32 cpu that I made.
And then, the part of binutils is completed somehow.

This is version indication of gas. zumi32-elf becomes target.

I tried to assemble of zumi32's all instruction.  it looks fine.

And then, tried to disassemble a.out generated by gas.  it looks fine too.

Next, I tried to link of two object files.
I tried to assemble and then link two objects that the s1.s and s2.s
referring to label in each other's source.
The result was fine.


Probably I still have some problem in current port but I reached to here
that can link objects.
This is progress.

I don't know when I can compile a c program with cross-gcc for zumi32
but I wanna do it in the near feature.

2011年8月23日火曜日

jwrtのLattice XP2対応

jwrtにLattice XP2対応を追加した。(今のところFLASHのみ)

下がjwrtでprogramしている様子だ。


また、今回はjspi controllerの方にもlogging機能の追加を行った。
これはロジアナ風の機能でjtag i/fの信号の変化をRAMに記録しておき、
後でjwrtで読み出してVCD形式で出力する。

jwrtはjspi controllerの他にXilinx, ALTERA, Lattice各社のparallel download
cable にも対応している。

    Xilinx     http://www.altera.com/literature/ug/ug_bbmv.pdf
    ALTERA  http://www.xilinx.com/itp/3_1i/pdf/docs/jtg/jtg.pdf 
    Lattice   http://www.fpga.com.cn/lattice/lattice_cable.pdf

このlogging機能は新たに対応したdeviceのprogrammingが上手くいかない場合に、
JTAGの信号の振る舞いを確認したり、各社純正SoftwareでProgrammingした時の
波形と比較したりするために使用できる。

使い方は、
まず、 jwrt -l c で書込みpointerを0に初期化する。
   次に、FPGAへのprogrammingを行う。
   次に、jwrt -l d > vcdファイル名 でloggingした内容をFileに書き出す。
   書き出しはVCD形式になっているのでGtkwave等で開いて波形として見ることができる。


下図はLatticeのispVMでXP2のErase実行を行った時の波形だ。

※. jwrtのhardware部はSpartan3Eで作成しているがこの中に上記の3社のcableの回路も
組み込んであるので、純正Softwareからもjwrtのhardwareを使ってprogrammingを行うことができる。








2011年8月19日金曜日

CAN IPのDEBUG 10

漸く実機動作確認に漕ぎ着けた。

下の写真は動作確認中の様子で、左のSpartan3基板から右のXP2基板へ20msec周期でpwmのdutyの設定値をCAN I/Fで送信している。



Lattice XP2基板側のprogramはROM化しており、Spartan3E側はUART経由でPCからdownloadして動作させるようにしている。
それぞれのprogramは以下のような感じだ。(主要部のみ)

XP2側


Spartan3E側


この波形はCAN BUSの様子。 1Mbpsで通信を行っている。




pwm出力のduty値は0x00(0%)から0x80(100%)までのincrement dataで1転送の度に
+1増加する。0x80に達したら0x00に戻る。

この波形はpwm出力。dutyが連続的に変化している。


CAN IPを自作することでCANの規格について理解を深めることは出来た。

今後は、気が向けば、Interoperability確認の為に他のCAN搭載deviceとの通信実験をするかも知れない。
RXマイコン以外ではMICROCHIPのMCP2515も検討し、RSコンポーネンツからの購入を考えた
のだが、MCP2515の単価が安価で部品代よりも配送料の方が高く付くことになり躊躇している。
将来別の部品を購入する時に一緒に購入することにしようと思う。


ということで、CAN IP projectはひとまずこれで終わりにしようと思う。



2011年8月13日土曜日

RX62NのUSB Boot mode 3

前回のブログでUSB Boot modeでのROMの書込みが出きるようになった。
この方法で本当に問題ないかの確認と先日ビルドしたRX用cross-gccでちゃんとRXで動くbinary objectが生成できるのかの確認を行った。

作成したROM書込みプログラムと確認用プログラム一式はここに置いた。
(md5sum 73a5c667b224bcdba22e6d66a5c4aed4)

確認用のプログラムとしてInterface誌2011年5月号の第7章の「タイマ割込みLED点灯制御サンプル・プログラム」と同等のプログラム(LEDの点滅周期は短くした)を作成し、これをビルドして出来上がったバイナリをROMに書いて正しくLEDが点滅することが確認できた。


あー、すっきりした。

2011年8月9日火曜日

RX62NのUSB Boot mode 2

RX62Nの使用は止めることにしたのだが、このままROMへの書込みが出来ない問題を解決せずに終わるのは癪に障るし、おもしろくないので調査した。

以下、その結果

USB Bootmodeのユーザーズマニュアル記述と実機動作の相違点と注意点

1. 256バイトデータ書込みコマンド
   a) アドレスは読出しアドレスと同じ -> (ex) 0xFFFA0000
   b) データ部のデータ数は256バイトではなく、書込みサイズ問い合わせコマンドで
      取得した書込みサイズ。(RXの場合は1024バイト)


コマンドフレーム
+--------+-----------------+
| 50h    | 書込みアドレス      | <-- ROMアドレス 0xFFF?0000 (0x00F?0000ではない)
+--------+--------+--------+--------+--------+
| データ   | データ   | .....  | データ   | データ   | <-- 1024バイト !!!
+--------+--------+--------+--------+--------+
| SUM    |
+--------+


2. 書込み消去ステータス遷移コマンド成功時のレスポンスはACKではなく0x06h


3. 組み込みプログラムステータス問い合わせコマンドのレスポンスデータにはSUMが付く


         +-----+------+----------+--------+-------+
Response | 5Fh | サイズ |  ステータス | エラー   | *SUM* |
         +-----+------+----------+--------+-------+


4. バルクリードでレスポンスデータを受け取る場合はデータとSUMを分ける


   1. usb_bulk_read(...); // SUM以外のデータ列受信
   2. usb_bulk_read(...); // SUMの受信


5. 最低限の処理手順
   デバイス選択やクロックモード、ビットレート等の設定値が既知ならば、
   USBブートモード移行後の問合せは不要。設定は必須


   1. デバイス選択
   2. クロックモード選択
   3. ビットレート選択
   4. 書込み/消去ステータス遷移
   5. ユーザーマット書込み選択
   6. 256バイトデータ書込み (実際は1024バイト単位)
   7. 必要なだけ繰り返し
   8. 256バイトデータ書込み終了


で、一応書込めるようにはなった。
ユーザマット領域の先頭256バイトに連続値をその後の768バイトに0を書いて、
次に2048バイトリードバックした。

Device Found!!
send 0x55
rxbuf=e6


1.デバイス選択
response(1)=06


2.クロックモード選択
response(1)=06


3.新ビットレート選択
response(1)=06
確認 response=06


4.書込み/消去ステータス遷移コマンド
response=06


5.ユーザーマット書込み選択
response=06


6.256バイトデータ書込み
response(1)=06


7.256バイトデータ書込み END
txbuf =50 ff ff ff ff b4
response(1)=06


8.メモリリード
response(2054) = 52
size = 00.00.08.00
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f
90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af
b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf
d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df
e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef
f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
sum = 26

それにしても、このユーザーズマニュアルは酷い。
改めて、RXを使う気が失せてしまった。
Renesasには「256バイト書込み」と書いて「1024バイト書込み」と解する文化があるんだろうか・・・
ったく、ブルーノ・サンマルチノかっつーの。

2011年8月5日金曜日

plan B

RXのUSB Boot modeでのROMの書込みだが、256バイトデータ書込みの段階までは到達できたがそこで引っかかってしまっている。
256バイトデータ書込み終了コマンドではどうなるのか試してみた。

      - ログ -
      Device Found!!
      send 0x55
      rxbuf=e6.00
      1.サポートデバイス問い合わせ
      -- response --
      code=30, size=18, devnum=1
      chars=16,devcode=36793035,devname=RX600 Serie
      sum=ce
      2.デバイス選択
      response=06
      3.クロックモード問い合わせ
      -- response --
      code=31, size=1
      00
      sum=ce
      4.クロックモード選択
      response=06
      5.逓倍比問い合わせ
      -- response --
      code=32, size=11, clocknum=2
      type=4,01 02 04 08
      type=4,01 02 04 08
      sum=9b
      6.動作周波数問い合わせ
      -- response --
      code=33, size=9, clocknum=2
      min=03.20 (8MHz),max=27.10 (100MHz)
      min=03.20 (8MHz),max=13.88 (50MHz)
      sum=aa
      13.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=13, error=00
      8.ユーザマット情報問い合わせ
      -- response --
      code=35, size=9, areanum=1
      begin=ff.ff.ff.ff, end=00.00.f8.ff
      sum=ce
      9.消去ブロック情報問い合わせ
      -- response --
      code=36, size=1, blknum=177
      sum=c6
      10.書込みサイズ問い合わせ
      -- response --
      code=37, size=2, writesize=0400, sum=c3
      11.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=13, error=00
      7.新ビットレート選択
      response=06.02
      12.書込み/消去ステータス遷移コマンド
      rxbuf=06.02
      13.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=1f, error=00
      14.書込み/消去ステータス遷移コマンド
      rxbuf=06.02
      15.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=3f, error=00
      21.ユーザーマット書込み選択
      response = 06.02
      22.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=4f, error=00
      24.256バイトデータ書込み END   <--- 終了コマンドを送る
      txbuf =50 ff ff ff ff b4
      response = 06.02        <--- 受け入れられた。
      25.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=3f, error=00  <--- statusは3f (書き込み消去ホストコマンド待ち)に遷移した(戻った)

ということで、終了コマンドは受け入れるようだ。
そこで、今度はワザとチェックサム値を間違えて、エラー(チェックサムエラー)になるか見てみた。

      - ログ -
      Device Found!!
      send 0x55
      rxbuf=e6.00
      1.サポートデバイス問い合わせ
      -- response --
      code=30, size=18, devnum=1
      chars=16,devcode=36793035,devname=RX600 Serie
      sum=ce
      2.デバイス選択
      response=06
      3.クロックモード問い合わせ
      -- response --
      code=31, size=1
      00  
      sum=ce
      4.クロックモード選択
      response=06
      5.逓倍比問い合わせ
      -- response --
      code=32, size=11, clocknum=2
      type=4,01 02 04 08  
      type=4,01 02 04 08  
      sum=9b
      6.動作周波数問い合わせ
      -- response --
      code=33, size=9, clocknum=2
      min=03.20 (8MHz),max=27.10 (100MHz)
      min=03.20 (8MHz),max=13.88 (50MHz)
      sum=aa
      13.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=13, error=00
      8.ユーザマット情報問い合わせ
      -- response --
      code=35, size=9, areanum=1
      begin=ff.ff.ff.ff, end=00.00.f8.ff
      sum=ce
      9.消去ブロック情報問い合わせ
      -- response --
      code=36, size=1, blknum=177
      sum=c6
      10.書込みサイズ問い合わせ
      -- response --
      code=37, size=2, writesize=0400, sum=c3
      11.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=13, error=00
      7.新ビットレート選択
      response=06.02
      12.書込み/消去ステータス遷移コマンド
      rxbuf=06.02
      13.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=1f, error=00
      14.書込み/消去ステータス遷移コマンド
      rxbuf=06.02
      15.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=3f, error=00
      21.ユーザーマット書込み選択
      response = 06.02
      22.書込みプログラムステータス問い合わせ
      -- response --
      code=5f, size=2, status=4f, error=00
      24.256バイトデータ書込み END
      txbuf =50 ff ff ff ff 00     <-------------- チェックサム値を0にした。
      usb_bulk_read Error. (No error)  <-- 応答なし、タイムアウトエラー !!!!

エラーレスポンスは返らずに固まってしまった。(タイムアウトエラー)
ユーザーズマニュアルでは256バイト書込みのエラーレスポンスとしてチェックサムエラーも記載されているが、何故エラーを返さない???   どうも私のRX62NのUSB Boot mode用のファームウェアはユーザーズマニュアル記載の仕様とは違う仕様で実装されているような気がする。。。
Renesasのサイトを確認したところ Rev.1.20 2011.05 版のユーザーズマニュアルがあったが、USB Boot modeの箇所は更新されていないようだった。

これ以上試行錯誤しても仕方ないしRX62Nの使い方の習熟が目的ではないのでRX62Nを使う案は止めて別の手段(plan B)でいくことにした。

plan Bとは、Spartan3Eに組み込んだ回路をもう一つ用意して両者で通信を行うということだ。
これだと厳密にはInteroperabilityの確認にはならないが、まぁしゃーないわな。
手持ち部品の関係で、今回はデジタル・デザイン・テクノロジー誌 No.1に付属していたLattice XP2基板を使うことにした。 XP2のEBR容量の制約からzumi32の命令用メモリの容量を2Kx32bitにせざるをえなかったが、回路は何とかXP2に収まった。


下の写真はpwm出力でLEDを制御するようにして動作確認しているところだ。


次のようなプログラムを書いて動作確認を行った。


pwm1タイマーを周期20msecで動作させており、dutyはpwm1の割込み処理ルーチンで
データメモリの0番地の値で更新している。 このデータメモリはUART経由でPCからも読み
書き出来るようになっているので、動作させながらdutyを任意の値に変更することができる。
一応、意図した通りの動作はしているが最終的にやりたいのは、
Spartan3Eの方からCAN I/F経由でduty値等を設定したいということだ。
ここまできたのでもう一息といったところだ。

2011年8月4日木曜日

RX62NのUSB Boot mode

GCCが出来たので簡単なプログラムを作成し、RXのROMに書いて動かしてみようとしているのだが上手くいかない。 プログラムに問題があるのではなくて書き込めないのだ。
RXの「ユーザーズマニュアル ハードウェア編  Rev1.11 2011.02」の[37. ROM(コード格納用フラッシュメモリ)」、「37.10 USB(ユーザ)ブートモード」を参照してUSBブートモードでの書換えを試しているのだが、実際のRXの動きがマニュアルの記述と違うみたいだ。

まず、マニュアルの1788ページには次のような記述がある。

    1. USB ブートモードに移行すると、本LSI 内部に組み込まれているブートプログラムが起動します。
         本LSI はUSB ブートプログラムが起動すると、ホストとのエニュメレーションを行います。
         エニュメレーションが完了したら、ホストは本LSI へ“55h” を1 バイト送信してください。正常に受信
         できなかった場合は、USB ブートモードを再起動してください。
    2. ユーザマットのサイズ、構成、先頭アドレス、サポート状況などの問い合わせ情報をホストに送信します。
    3. 問い合わせが終了するとすべてのユーザマット、データマットを自動消去します。
    4. ユーザマット、データマット自動消去後は書き込み/消去コマンド待ち状態になります。書き込みコマ
         ンド受信すると、書き込みデータ待ち状態に遷移します。消去も同様です。
         書き込み/消去コマンド以外に、ユーザマットのサムチェック、ブランクチェック(消去チェック)、メ
         モリリード、および現在のステータス情報取得のコマンドがあります。 

この記述は問い合わせを行えば後は自動でユーザマット、データマットが消去され、書き込み/消去コマンド待ち状態に遷移するように読み取れる。(そのまんまやんけ !!)
しかしプログラムを書いて実行してみたところ次のような結果になった。ちなみに、作業はubuntuでlibusb libraryを使ったプログラムを作成して行っている。

      ※  「<--- ***」はログに追記した注釈

        - ログ - 
        Device Found!!
        send 0x55
        rxbuf=e6.00
        1.サポートデバイス問い合わせ
        -- response --
        code=30, size=18, devnum=1
        chars=16,devcode=36793035,devname=RX600 Serie
        sum=ce
        3.クロックモード問い合わせ
        -- response --
        code=31, size=1
        00
        sum=ce
        5.逓倍比問い合わせ
        -- response --
        code=32, size=11, clocknum=2
        type=4,01 02 04 08
        type=4,01 02 04 08
        sum=9b
        6.動作周波数問い合わせ
        -- response --
        code=33, size=9, clocknum=2
        min=03.20 (8MHz),max=27.10 (100MHz)
        min=03.20 (8MHz),max=13.88 (50MHz)
        sum=aa
        8.ユーザマット情報問い合わせ
        -- response --
        code=35, size=9, areanum=1
        begin=ff.ff.ff.ff, end=00.00.f8.ff
        sum=ce
        9.消去ブロック情報問い合わせ
        -- response --
        code=36, size=1, blknum=177
        sum=c6
        10.書込みサイズ問い合わせ
        -- response --
        code=37, size=2, writesize=0400, sum=c3
        11.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=11, error=00  <-- status 11はデバイス選択待ちの意
        12.書込み/消去ステータス遷移コマンド
        rxbuf=80.40   <--- コマンドエラーレスポンスが返された
        13.書込みプログラムステータス問い合わせ 
        -- response --                                                   
        code=5f, size=2, status=11, error=80  <--- statusは遷移せずデバイス選択待ちのまま
        消去選択            <--- 消去選択コマンドを送ってみた
        response = 80  <--- コマンドエラーレスポンスが返された
        13.書込みプログラムステータス問い合わせ <-- 再度問い合わせ
        -- response --                                                   statusは遷移せずデバイス選択待ちのまま
        code=5f, size=2, status=11, error=80

問い合わせ後もstateはデバイス選択待ち状態にあり、書き込み/消去ステータス遷移コマンドを送ってもエラーになってしまう。。。何かおかしくね?

次にマニュアルの1767ページの図37.30に倣ってコマンドを送ってみた。
        - ログ -
        Device Found!!
        send 0x55
        rxbuf=e6.00
        1.サポートデバイス問い合わせ
        -- response --
        code=30, size=18, devnum=1
        chars=16,devcode=36793035,devname=RX600 Serie
        sum=ce
        2.デバイス選択
        response=06
        3.クロックモード問い合わせ
        -- response --
        code=31, size=1
        00
        sum=ce
        4.クロックモード選択
        response=06
        5.逓倍比問い合わせ
        -- response --
        code=32, size=11, clocknum=2
        type=4,01 02 04 08
        type=4,01 02 04 08
        sum=9b
        6.動作周波数問い合わせ
        -- response --
        code=33, size=9, clocknum=2
        min=03.20 (8MHz),max=27.10 (100MHz)
        min=03.20 (8MHz),max=13.88 (50MHz)
        sum=aa
        7.新ビットレート選択
        response=06.09
        8.ユーザマット情報問い合わせ  <--- レスポンスが返らずタイムアウト !!!
        usb_bulk_read Error. (No error)

ビットレート選択コマンド後のユーザマット情報問い合わせコマンドに対して応答が返ってこない。
そこで代わりにプログラムステータス問い合わせコマンドを送ってみた。
        - ログ -
        Device Found!!
        send 0x55
        rxbuf=e6.00
        1.サポートデバイス問い合わせ
        -- response --
        code=30, size=18, devnum=1
        chars=16,devcode=36793035,devname=RX600 Serie
        sum=ce
        2.デバイス選択
        response=06
        3.クロックモード問い合わせ
        -- response --
        code=31, size=1
        00
        sum=ce
        4.クロックモード選択
        response=06
        5.逓倍比問い合わせ
        -- response --
        code=32, size=11, clocknum=2
        type=4,01 02 04 08
        type=4,01 02 04 08
        sum=9b
        6.動作周波数問い合わせ
        -- response --
        code=33, size=9, clocknum=2
        min=03.20 (8MHz),max=27.10 (100MHz)
        min=03.20 (8MHz),max=13.88 (50MHz)
        sum=aa
        7.新ビットレート選択
        response=06.09
        13.書込みプログラムステータス問い合わせ <--- やはりタイムアウト
        usb_bulk_read Error. (No error)

同様に応答が返ってこない。。。固まっちゃうのか???
ビットレート選択コマンドの送信を止めてみた。
        Device Found!!
        send 0x55
        rxbuf=e6.00
        1.サポートデバイス問い合わせ
        -- response --
        code=30, size=18, devnum=1
        chars=16,devcode=36793035,devname=RX600 Serie
        sum=ce
        2.デバイス選択
        response=06
        3.クロックモード問い合わせ
        -- response --
        code=31, size=1
        00
        sum=ce
        4.クロックモード選択
        response=06
        5.逓倍比問い合わせ
        -- response --
        code=32, size=11, clocknum=2
        type=4,01 02 04 08
        type=4,01 02 04 08
        sum=9b
        6.動作周波数問い合わせ
        -- response --
        code=33, size=9, clocknum=2
        min=03.20 (8MHz),max=27.10 (100MHz)
        min=03.20 (8MHz),max=13.88 (50MHz)
        sum=aa
        12.書込み/消去ステータス遷移コマンド
        rxbuf=80.40    <--- コマンドエラーレスポンスが返された
        13.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=13, error=80 <--- ビットレート選択待ち!!!

ということで、ビットレート選択コマンドは必要なようだ。。。USBブートモードなのに何故??
ビットレート選択コマンドの次に書き込み/消去ステータス遷移コマンドを送ってみた。
        - ログ -
        Device Found!!
        send 0x55
        rxbuf=e6.00
        1.サポートデバイス問い合わせ
        -- response --
        code=30, size=18, devnum=1
        chars=16,devcode=36793035,devname=RX600 Serie
        sum=ce
        2.デバイス選択
        response=06
        3.クロックモード問い合わせ
        -- response --
        code=31, size=1
        00
        sum=ce
        4.クロックモード選択
        response=06
        5.逓倍比問い合わせ
        -- response --
        code=32, size=11, clocknum=2
        type=4,01 02 04 08
        type=4,01 02 04 08
        sum=9b
        6.動作周波数問い合わせ
        -- response --
        code=33, size=9, clocknum=2
        min=03.20 (8MHz),max=27.10 (100MHz)
        min=03.20 (8MHz),max=13.88 (50MHz)
        sum=aa
        7.新ビットレート選択
        response=06.09
        12.書込み/消去ステータス遷移コマンド
        rxbuf=06.09                         <--- おお!! このコマンドは受け入れられた
        13.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=1f, error=00 <--- しかし、書込み/消去ステータス遷移コマンドを送ったにも関わらず
                                                                               statusは1f (書き込み消去ホストコマンド待ち状態への遷移待ち)まま
        14.書込み/消去ステータス遷移コマンド <--- そこで再度、書込み/消去ステータス遷移コマンドを送る
        rxbuf=06.02
        15.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=3f, error=00 <--- statusは3f (書き込み消去ホストコマンド待ち)に遷移した
        16.消去選択  <--- 消去してみる
        response = 06
        17.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=5f, error=00 <--- statusは5f (消去ブロック指定待ち)に遷移した
        18.ブロック消去
          0 response = 06.02
          1 response = 06.02
                :
         29 response = 06.02 <--- ブロック消去成功したっぽいぞ !!
        response = 06.02     <--- 消去完了も成功したっぽいぞ !!
        19.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=3f, error=00 <-- statusは3f (書き込み消去ホストコマンド待ち)に戻った
        20.ユーザーマットブランクチェック
        response = 06.02     <--- ブランクチェックはOK !!!
        21. ユーザーマット書込み選択 <--- 書き込みに挑戦
        response = 06.02
        22.書込みプログラムステータス問い合わせ
        -- response --
        code=5f, size=2, status=4f, error=00 <-- statusは4f (書き込みデータ待ち)に遷移した。。。いい感じ?
        23. 256バイトデータ書込み             <-- データを送る
        usb_bulk_read Error. (No error)  <-- だぁー、、orz  応答なし、タイムアウトエラー !!!!
                                                                       Why?? What's wrong??

・・・という訳で、上手くいってない。
マニュアルの記述が違ってるのか?それとも何か処理が抜けているのか???

Windows版のRenesas純正のツールを使えば書き込めるんだろうが、
家にはWindowsマシンはにゃい。(正確に言うと仮想環境にはあるが。。)
他の手段を考えようかな?。。。俺の夏休みを返せー


自作CPUで遊ぶ 22

今使用しているモータードライバはDM556Dというものだが、このドライバはMicro Stepが 800 [pulse/rev] 〜 40000 [pulse/rev]の範囲で設定できる。 Mi...