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マシンはにゃい。(正確に言うと仮想環境にはあるが。。)
他の手段を考えようかな?。。。俺の夏休みを返せー


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...