2009年11月20日

USBasp のプロトコル

USBasp は、USBのコントロール転送を使って通信する。コントロール転送については、とりあえず置いておいて どんなやり取りをしているのかについて、ちょっとまとめておこう。
    参考リンク
  • USBasp オリジナル (USB プログラマ)
  • USBaspLoaderUSBasp プロトコルブートローダ


大雑把に言ってしまうと、通信は 次の2つの やりとりになる。

    1) OUT ( PC → USBasp )

    PC → USBasp [ 制御情報 8バイト ]
    PC → USBasp [ 通信データ 0-200 バイト]

    2) IN ( USBasp → PC )

    PC → USBasp [ 制御情報 8バイト ]
    PC ← USBasp [ 通信データ 0-200 バイト]


8 バイトの制御情報は、USB の制御でも使われる。先頭の1バイトには、種別に関する情報が入っており、USBasp では、ベンダーの種別 を使用している。次の 1 バイトは、コマンド。後の 6 バイトは 基本的に自由に使える。USBasp では、次のようにコマンドを定義している。


    コマンド タイプ 通信データ長 制御情報(2-7)
    1 CONNECT IN 0 - - - - - -
    2 DISCONNECT IN 0 - - - - - -
    3 TRANSMIT IN 4 ISPCMD(4) - -
    4 READFLASH IN 0-200 ADDR(2) - - LEN(2)
    5 ENABLEPROG IN 1 - - - - - -
    6 WRITEFLASH OUT 0-200 ADDR(2) F+P LEN(2)
    7 READEEPROM IN 0-200 ADDR(2) - - LEN(2)
    8 WRITEEEPROM OUT 0-200 ADDR(2) F+P LEN(2)
    9 SETLONGADRESS IN 0 ADDR(4) - -
    10 SETISPSCK IN 1 CLK(1) - - - - -

    F+P: Flags + PageSz

    +-----------+-----------+-----------+-----------+
    | PageSz(H)| | | L|F | PageSz(L) |
    +-----------+-----------+-----------+-----------+
    | |
    | +---- isFirst Block
    +------- isLast Block

    READ/WRITE は、Pagesize 関係なしに 200バイトのブロックサイズに分割してデータを Recv/Send する。
    isFirst Block は、最初の転送であることを示し、isLast Block は 最後の転送であることを示す。
    最後の転送がきれいにページアラインになることは保証されないので、isLast のフラグを見て close 処理をしなくてはならない。
    PageSize は、上位の 4 bit 分が、Flags の 上位に来る。512B とか 256バイト以上の PageSize に対処するための苦肉の策のようだ。



この表でイメージは掴めるのではないかと思う。

これだけなら簡単なのだが、やっかいなのは、3 TRANSMIT 。これは、ISP コマンドそのものを やりとりするもので、(PCから見て) 4 バイトをデータを送り 4 バイトのデータを受け取る。

ブートローダで USBasp プロトコルをサポートする場合、どこまでサポートしたら良いかが微妙なのだ。

Warning を一切出さないようにするには、READ 系のほとんどと、EEPROM の Write をサポートすべきなのだが、それではコード量が増える。で、サボると どこまでもサボれる。強制オプションを付ければ シグネチャーの READ さえもいらない(はず)。

ISP コマンド



ISP コマンドでは、4 バイトを返却するが、意味があるのは最後の 1 バイト。


       不可能 推奨 必須
    CHIP ERASE 0xAC 0x80 - - △ ○ −

    READ 系
    READ FLASH (HI) 0x28 ADDR(2) - − ○ −
    READ FLASH (LO) 0x20 ADDR(2) - − ○ −
    READ EEPROM 0xA0 ADDR(2) - − ○ ○
    READ LOCKBIT 0x58 0x00 (0x00) - − ◎ −
    READ SIGNATURE 0x30 0x00 ADDR(1) - − ◎ ◎
    READ FUSE (LO) 0x50 0x00 (0x00) - − ◎ −
    READ FUSE (HI) 0x58 0x08 (0x00) - − ◎ −
    READ FUSE (EXT) 0x50 0x08 (0x00) − ◎ −

    WRITE 系
    WRITE EEPROM 0xC0 ADDR(2) DATA(1) − ○ −
    WRITE LOCKBIT 0xAC 0xE0 (0x00) DATA(1) − ○ −
    WRITE FUSE(LO) 0xAC 0xA0 (0x00) DATA(1) × − −
    WRITE FUSE(HI) 0xAC 0xA8 (0x00) DATA(1) × − −
    WRITE FUSE(EXT) 0xAC 0xA4 (0x00) DATA(1) × − −


最後のマークは、ブートローダでどこまでサポートするか/できるかの目安。

    不可能△: CHIP ERASE は、FUSE とか LOCKBIT は変更できないから

    推奨の◎:avrdude では FUSE とかチェックして変だと元に戻そうとするため。

    必須の◎:SIGNATURE ぐらいは読めないと面倒なため。しかし本当に必須というわけではない。


さて、usb162 をベースに ブートローダもどきを動かそうとしている。いまのコード:usb162-0.2-wk10.tar.gz

SD は諦めたわけではなく部品待ち。その間に USBasp のブートローダを組みこもうとしている。

一応ソースは共通。USBasp を動かしつつ CDC-ACM でデバッグしたり出来ている。

防忘をかねてちょっと説明しておくと ... bootloader というディレクトリでビルドすると、usb162aspbl.hex が出来る。

これは、開始アドレスを 0x2000 に移動してある。そのままでは動作しなくて、0x20cc に飛ばす リセットベクタ bootloader/bin/v.hex も書き込む必要がある。

書き込むと

    # avrdude -c usbasp -p usb162 -t

とかで avrdude が動く (Linux だけで確認)

で 8KB( 0x0000 〜 0x2000 )までの プログラムを FLASH に書ける(かも知れない)

リセットベクタの 4 バイト (アドレス 0 〜 3)を読み書きすると、EEPROM の 0x1f0 〜の 4 バイトに読み書きするように していて、元のリセットベクタを変更しないようにしている。

EEPROM にセーブした 情報を元に、アプリケーションを実行する機能はまだない。ちゃんと透過に見せているかどうかのテスト中。

bootloader-test というディレクトリでビルドすると、同じ usb162aspbl.hex が出来る。こちらは 0 番地から始まる普通のプログラム。CDC と くっつけていて、デバッグ用。FLASH に書き込みするのはマズイ。自分自身を書き換えてしまうので暴走するはず。ベリファイとか EEPROM の読み書きテスト用。

あと今までのプログラムは、test5 というディレクトリに移動。こちらは、MSC のテスト用。

実を言うといままでの USB162 は、コントロール通信での大量データ受信ができてなかった。USBasp のサポートで まともにしていこうと思っている。

  • USBasp

    USBasp ドライバのインストール (Windows)



    WinAVR には、ライタソフトの avrdude-5.6 と ドライバ(libusb)が同梱されている。ただし、USBasp の 定義ファイルは入っていないようだ。

    USBasp の 定義ファイルは、USBasp オリジナル の、bin/win-driver/libusb_0.1.12.1 にある、usbasp.inf と usbasp*.cat 。

    これを WinAVR の utils\libusb\bin\ にコピーする。

    で、USBasp をつないだときのハードウェアウィザードで、コピーしたディレクトリを指定すれば OK 。

    ちなみに、DFU ブートローダの Flip も libusb を使っている。場所は、c:\Program Files\Atmel\Flip 3.3.4\usb\

    現在は互換性が取れているようだが、将来どうなるか分からないので要注意

      現在使用中のバージョン
    • WinAVR-20090313 (avrdude 5.6)
    • Flip 3.3.4
    • usbasp.2009-02-28 (libusb_0.1.12.1)


    少々分かってきたのでメモ:

    libusb は、WinAVR に含まれているが、ビルドするために必要な usb.h と libusb.a は含まれていない。

    これは、http://sourceforge.net/projects/libusb-win32/files/ にある libusb-win32-device-bin-0.1.12.2.tar.gz に含まれている。  


    $ cp libusb-win32-device-bin-0.1.12.2/include/usb.h /c/MinGW/include
    $ cp libusb-win32-device-bin-0.1.12.2/lib/gcc/libusb.a /c/MinGW/lib


    これで USBasp が使える avrdude が MinGW で ビルドできるようになる。

    互換性について:libusb は、1.0 に移行しているが、Windows は 0.1 系を使うようだ。0.1 系の最新版が 0.1.12 で たぶんこれで打ち止め。互換性の問題は、主に 0.1.10 ⇔ 0.1.12 でおきるらしい。 0.1.12 になっていれば当面気にする必要はなさそう。

    で、バグ修正とかは、-1 -2 とサフィックスが付いてリリースされる。たぶん API は変わらないので使う側は変更しなくて良さそう。ドライバは -1 から -2 とかに上げても良さそう。

    あと libusb で、新規のデバイスをサポートする場合 inf-wizard を使うらしい。これも WinAVR に含まれている。

    フィルタドライバ:これをインストールすると 既にドライバをインストールしたデバイスと libusb で通信できる。

    こちらのやりかたでないと、CDC + USBasp のようなデバイスは制御できない。ただググってみてもトラブルの話しか出てこない。 --- あきらめた方が無難なようだ。
  • posted by すz at 19:15| Comment(0) | TrackBack(0) | USBasp関係
    この記事へのコメント
    コメントを書く
    お名前: [必須入力]

    メールアドレス: [必須入力]

    ホームページアドレス:

    コメント: [必須入力]

    認証コード: [必須入力]


    ※画像の中の文字を半角で入力してください。
    この記事へのトラックバックURL
    http://blog.sakura.ne.jp/tb/33754973
    ※ブログオーナーが承認したトラックバックのみ表示されます。

    この記事へのトラックバック