                                                2009年 1月22日（公開開始）

                    avrspx（コマンド）の改良点について
                    ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

[0] はじめに(Written by senshu)

　avrspx は、chan さんの avrsp を元に kkk さんの改良した成果として公開され
ているものです。Fischl さん作成の USBasp のサポートは kkk さんによって行わ
れました。開発関わった多くの方々に感謝いたします。

＞ソースを公開していますので不具合を修復して公開していただけると幸いです。

　上記の意思に従い、より多くのサポートと安定稼動や利便性の提供を目的に、
senshu が改良を続けているのが hidspx です。特に、HIDaspx をサポート以来、多
くの工夫を追加しています。しかし、avrsp と avrpsx の違いや、hidspx の改良点
は非常に多く、私も掌握できていない部分がありますので、kkk さんのまとめた文
書を追加したいと思います。


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
avrspxに関する説明書

以下のファイルを一つのファイルにまとめました。（その関係で、senshu が文体を
整理していますがご了承ください。=>kkk さんへ）

[1] avrspx_b10.txt
[2] history.txt
[3] USBaspxの複数台接続方法.txt
[4] 鶏と卵.txt

  ---- * ---- * ---- * ---- * ---- * ---- * ---- * ---- * ----

[1] avrspx_b10.txt

■ 以下の内容を動作保証するものではありません。2006-05-08 t.k
  不具合が発生した場合は申し訳ありませんが旧バージョンをご利用ください。
  ソースを公開していますので不具合を修復して公開していただけると幸いです。

  avrspxはchanさん[http://elm-chan.org/works/avrx/report.html]のavrsp.exeで
  Fischl さん [http://www.fischl.de/usbasp/index.html] の USBasp を利用でき
  るように仕様を追加したものです。

  すばらしいソフトを公開されているchanさん、Fischlさんに感謝します。

■オリジナル avrsp との相違点

 ・USBasp対応
   -pu を指定することでUSBaspが使用できます。
   また、avrspx -pu:XXXX とシリアル番号を指定して複数台のUSBasp(x)が利用できます。
   詳細説明は別紙 [USBaspxの複数台接続方法]の項を をご覧ください。
   -pu? で現在接続中のUSBasp(x)の一覧を表示します。
   この時libusb-win32のバージョン表示も表示されます。(b10.10)
   libusb-win32のドライバ(c:\windows\system32\libusb0.sys)とDLLのバージョンが
   異なると正常に動作しないことがあります。

 ・TADさん(denshiken)のCR方式に対応 (2006-06-04)
   -pf<n> を指定することでTADさんのCR方式簡易ライタが使用できます。
       <n>は通信ポート番号(USBシリアルも可)

   -p? でそのパソコンで利用可能な通信ポートの一覧を表示します。
   ハードの情報は http://homepage2.nifty.com/denshiken/AVW009.html
   詳細説明は後半の[鶏と卵]の項をご覧ください。

 ・INIFILEのコメント行の追加
   オリジナルは空白行以降をすべて無視する仕様になっています。行頭の';'や'#
   'で始まる行はコメント行とみなし無視します (次行に進む)。オリジナル avrsp
   と併用される場合はこのきのうは使用しないほうが良いでしょう。

 ・INIFILEのファイル名
   avrspx.exe のファイル名を変更した場合は INIFILE も変更したファイル名を参
   照します。例えば avrspx2.exe と変更した場合は avrspx2.ini を参照します。
   オリジナルと同じ avrsp.exe とすれば avrsp.ini を参照します。

 ・FUSE設定で2進表記だけでなく16進表記も使用可能
    -fL00001101 -> -fL0x0d

 ・FUSE書込み後はVerifyを実施
   オリジナルは FUSE に対しては Verify を行いません。Verify 機能を禁止する
   場合は Flash/Eeprom と同様に -v- オプションが利用できます。

 ・デバイス強制指定での大文字小文字を使用可能
   オリジナル avrsp は -t<device> により強制的にデバイスを指定することが可
   能です。この時 '90S2313','tiny45'は通りますが '90s2313','TINY45'等はエラー
   です。avrspx では大文字・小文字の区別をなくしました。またデバイス名の先
   頭に 'AT'を付けても構いません。(mega48 -> atmega48)。

 ・デバイス一致チェックオプションを追加しました。
   -q<device>オプションを追加しました。
   -q<device> で指定したデバイスと読み出したデバイスの Signature が異なる時
   はアクセスを中止します。

   例えば -qmega88 と指定した時にターゲットが mega8 だった場合は処理中止し
   ます。BAT ファイル等で自動書込みをしている時などに、間違って異なる CPU 
   用の FUSE 等を指示した場合には実行中止します。これによりパラレルライタが
   必要になる可能性を低減できます。

 ・avrspx.exeの -d オプションがUSBaspにも反映
   この機能はUSBasp側のファームもそれに対応したもの(usbaspx)が必要です。
   オリジナル USBasp は ISP のクロックはハード上のジャンパで設定しますが高
   速 (SCK:375KHz) と低速 (SCK:8.3KHz) の 2 種類しかありませんし切換が面倒
   です。
   新ファームを使用してもavrdudeからは今まで同様ジャンパ切換で使用可能です。
   旧ファームに対して新しい avrspx.exe で -d を使用しても問題なく古いモード
   で動作します (ジャンパ切換方式)。
   新ファーム(usbaspx)と新avrspx.exeの組み合わせで初めて-dが有効です。
   -dオプションの詳細はこのドキュメントの下の方を参照してください。

 ・-d- オプションを使用可能にしました。
   INIFILE で -d が指定されている時にコマンドラインで -d- を指定して無効化
   できます。この時 ISP のクロックはボード上のジャンパを参照するようになり
   ます。

 ・ATmega128x/Atmega256xに対応
   usbasp.2005-11-14より古い物はページサイズ256バイト以上のCPUが使用不可です。

     mega644/645/6450/649/6490/603/103/64/128/640/1280/1281/2560/2561
     90can32/64/128 が該当。

   usbasp.2005-11-14 でページサイズ 256 バイトがサポートされましたが 64K バ
   イトまでしか対応できていませんでした。USBaspx Ver 1.13 で 256K バイトま
   での Flash に対応しました。但し、動作確認は行っていません。

■avrspx.exeの-d オプションについて
  -dオプションを指定していない時は今まで同様ジャンパ切換による動作を行います。
  -dを指定するとジャンパによる設定は無視されます。
  -dの指定値が5以下では以下のようなクロックとなります(ハードウェアSPI)

  -d : SCK clock           cycle      TARGET-MCU
   0 :   3.0MHz  fosc/4      0.33us   >  12.0MHz
   1 :   1.5MHz  fosc/8      0.67us   >   6.0MHz
   2 : 750.0kHz  fosc/16     1.33us   >   3.0MHz
 * 3 : 375.0kHz  fosc/32     2.67us   >   1.5MHz  旧ファームの高速モード
   4 : 187.5kHz  fosc/64     5.33us   > 750.0kHz
   5 :  93.8kHz  fosc/128   10.67us   > 375.0kHz
 ...
  10 : 50.0kHz   (6-5)*10*2   20us    > 200.0kHz
  20 : 25.0kHz   (7-5)*10*2   40us    > 100.0kHz
  30 : 16.7kHz   (8-5)*10*2   60us    >  66.7kHz
  40 : 12.5kHz   (9-5)*10*2   80us    >  50.0kHz
  50 : 10.0kHz  (10-5)*10*2  100us    >  40.0kHz
 *60 :  8.3kHz  (11-5)*10*2  120us    >  33.3kHz  旧ファームの低速モード
  70 :  7.1kHz  (12-5)*10*2  140us    >  28.6kHz
 ...
2500 :   200Hz (255-5)*10*2    5ms    > 800Hz

  -dの指定値が6以上時はμS単位で値とみなします(ソフトウェアSPI)
    (但し内部的には10μS単位に丸めて処理されます)
    旧ファームの高速モードは -d3 とした時と同じです。
    旧ファームの低速モードは -d60 とした時(cycle=60us+60us)とほぼ同等です。

  注意)
   -dオプションを指定するとUSBaspボード上のクロック切換ジャンパは無視します。
   avrspx.exe では avrspx.ini ファイルでの定義も有効です。このため avrspx.
   ini にて -d を指定していた場合、コマンドラインで指定していなくても -d が
   有効となっています。この場合ボード上のジャンパ指定は無効ですので注意して
   ください。(avrspx.exe beta-5 以降では -d- によってコマンドラインから無効
   化出来ます)

  重要)
   あまり大きな値を指定すると USBasp からの返答時間が大きくなりタイムアウト
   で avrspx.exe が異常終了します。(タイムアウトは約 10秒にしています)
   異常終了した場合は USBasp をクローズできていませんので USB プラグを一旦
   抜き差ししてリセットするか avrspx.exe で再度アクセスしてリセットしておく
   かして下さい。('avrspx -pu -r' だけでよい)

■添付ファイルについて
  改変したソースコードは添付されていますが、その他のドキュメント & ファイル
  は含まれていません。
  chanさんの avrxtool32.zip や Fischlさんの usbasp.2005-11-14.tar.gz は
  別途それぞれの方のホームページよりダウンロードしてください。

■コンパイル
  コンパイルにはLibUsb-Win32ライブラリが必要です。
  以下のリンクから入手できます。
  □ Borland C++Builder 6 でコンパイル確認
  □ BCC Developer Version 1.2.21 + Borland C++ 5.5.1 で確認
  □ Dev-Cpp 4.9.9.2 + mingw-gcc-3.4.5 で確認
  □ Visual C++ 2005 Express Edition で確認

■関連リンク

chanさん :
  http://elm-chan.org/works/avrx/report.html

USBasp :
  http://www.fischl.de/usbasp/index.html

AVR-USB :
  http://www.obdev.at/products/avrusb/index.html

libusb :
  http://libusb.sourceforge.net/

LibUsb-Win32 :
  http://libusb-win32.sourceforge.net/

  ---- * ---- * ---- * ---- * ---- * ---- * ---- * ---- * ----

[2] history.txt

avrspx history by t.k（手前ほど新しい情報です）

■ 2006-08-31 beta-10.10
  avrspx -pu? の USBasp検索オプションでlibusb-win32のバージョン表示を追加。
  libusb-win32のドライバとDLLのバージョンが異なると正常に動作しないことがある。

■ 2006-08-30 beta-10.9
  USBバスからのusbaspの検索の高速化

■ 2006-08-30 beta-10.8
  usbaspx-1.13 に添付のlibusb-win32のドライバを最新に更新。
  libusb-win32-0.1.10.1 から libusb-win32-0.1.12.0 へ。
  libusb-win32-0.1.10.1(libusb0.dll)の不要なメッセージの出力対策。

■ 2006-08-27 beta-10.7
  ソース整理。

■ 2006-08-26 beta-10.6
  ページ書込みでないタイプのAVR書込みのbug fix。

■ 2006-06-10 beta-10.5
  今後の「鶏と卵」ライタ用にソースを再構成。

■ 2006-06-09 beta-10.4
  一部のノート PC で通信開始時にゴミが出る可能性があるので通信ポートオープ
  ン直後に Pause するように仕様変更。

■ 2006-06-06 beta-10.3
  RS-CR方式でデータの最後にダミーデータを付加。

■ 2006-06-06 beta-10.2
  RS-CR方式で出力部分を若干修正。

■ 2006-06-05 beta-10.1
  -p? or --list-port オプションで利用可能な通信ポートの表示を追加。

■ 2006-06-04 beta-10
  鶏と卵問題に対応すべくTADさん(denshiken)のCR方式に対応
  ハードの情報は http://homepage2.nifty.com/denshiken/AVW009.html
  詳細説明は別紙 [鶏と卵]の項を をご覧ください。

■ 2006-05-28 beta-9_4/beta-9_5
  BCCでコンパイル可能なようにソースを修正
  □ Borland C++Builder 6 でコンパイル確認
  □ BCC Developer Version 1.2.21 + Borland C++ 5.5.1 で確認
  □ Dev-Cpp 4.9.9.2 + mingw-gcc-3.4.5 で確認
  □ Visual C++ 2005 Express Edition で確認 (beta-9_5)

■ 2006-05-23 beta-9_3
  Verify正常終了後のMESSAGE表示が抜けていたのを修正。

■ 2006-05-23 beta-9_2
  Verifyを有効な領域だけのチェックに変更。
  bootloader等を最後に配置している場合に途中のチェックをスキップして高速化。

■ 2006-05-22 beta-9
 ・USBaspx(Ver1.13)でmega128x/mega256x対応追加。(未チェック)。
 ・avrspxで上記変更に対応。
 ・FUSEの書込み後にFUSEのVerifyを行うようにしました。
   オリジナルではFUSEに対してはVerifyされません。

■ 2006-05-18 beta-8_2
 ・USBaspxでUSBASP_FUNC_CONNECTでリターン値を返すように変更したの合わせて変更
 ・添付のUSBaspxをVer1.12に更新

■ 2006-05-18 beta-8
 ・ATtiny261/461/861の定義が間違っていましたので修正(オリジナルにはありません)
 ・avrspx に -q<device> オプションを追加。-q<device> で指定したデバイスと読
   み出したデバイスが異なる時はアクセスを中止します。
 ・添付のUSBaspxをVer1.11に更新(ISP移行タイミング変更)

■ 2006-05-15 beta-7
 ・chanさんのavrsp.exeがR0.39にバージョンアップしました。
   avrspx.exeもR0.39をベースに変更しました。
   オリジナルの変更点は http://elm-chan.org/works/avrx/report.html より 
   avrxtool32.zip をダウンロードしてください。

 ・今回USBaspxも仕様追加を行い複数台のUSBaspxの接続が可能となりました。
   詳細説明は[USBaspxの複数台接続方法]の項をご覧ください。

■ 2006-05-13 beta-6-2
 ・usbaspxのISP書込みタイミングを変更
 ・オリジナルのUSBaspにてロークロック時のSoftware-SPIでのISP書込みで
   MOSIのセットアップタイムが不足しています。場合によってはロークロックでの
   書込みが出来ない可能性があります。
 ・usbaspxのファームを修正しました。
   avrspx.exeは変更ありません。

■ 2006-05-06 beta-6
 ・INIFILEの空白行の扱いをオリジナルと同じ動作に戻しました。
   オリジナルは空白行以降をすべて無視する仕様になっています。
   avrspx beta-5までは行頭の';'や'#'でコメント行となる扱いを追加しました。
   そのため空白行のみ無視してそれ以降も有効な行として扱っていました。
   今回、オリジナルのavrsp.exeの利用者がavrspx.exeを使用するときに混乱する
   と思われますので(avrsp.iniをそのまま持ってきても構わないように)。
   空白行以降を無視するように仕様をオリジナルと合わせました。

 ・行頭の';'や'#'がコメント行となる仕様は残してありますが、オリジナルavrsp
   と併用される場合はオリジナルでも動作するような書式が良いでしょう。

    このことはkumanさんのホームページで気づかせていただきました(感謝)
    http://www.geocities.jp/kuman2600/usbwriter.html

■ 2006-05-08 beta-5
 ・avrspx.exeで -d- オプションを使用可能にしました
   INIFILEで-dが指定されている時にコマンドラインで-d-を指定して無効化できます。

 ・プログラムファイル名を変更可能としました
   arspx.exeを例えば avrspx2.exe と変更できます。
   この時INIFILEは avrspx2.iniを参照する様になります
   オリジナルと同じ avrsp.exe とすれば avrsp.ini参照となります

■ 2006-05-08 beta-4
 ・avrspx.exeで -d オプションがUSBaspにも反映されるようにしました。
 ・USBasp側のファームもそれに対応したもの(usbaspx)が必要です(同梱しています)

 ・オリジナルUSBaspはISPのクロックはハード上のジャンパで設定しますが
   高速(SCK:375KHz)と低速(SCK:8.3KHz)の2種類しかなく、切換が面倒です。

 ・このバージョンではavrspx.exeの-dオプションで指定可能です。
 ・新ファームを使用してもavrdudeからは今まで同様ジャンパ切換で使用可能です。

 ・旧ファームに対して新しいavrspx.exeで-dを使用しても問題なく古いモードで
   動作します(ジャンパ切換方式)。

 ・新ファーム(usbaspx)と新avrspx.exeの組み合わせで初めて-dが有効です。

■ 2006-05-07 beta-3
 ・chanさんのavrspをUSBasp対応にしました。
    -pu を指定することでUSBaspが使用できます。

 ・オリジナルのavrsp.exeと共存できるようにファイル名を変更しました。

 ・INIFILEもavrspx.iniとなっています。

 ・オリジナルでのINIFILEの読込不具合を修正しました

 ・INIFILEの行の先頭が ';'か'#'の時はコメント行としました

 ・fuse設定で2進法だけでなく16進表記も使用可能にしました
    -fl00001101 -> -fl0x0d

 ・デバイス強制指定での大文字小文字を使用可能としました

 ・オリジナルでのHEX-FILEの読込不具合を修正しました

 ・ページライトをサポートしていないMCUでの読み書きが遅い問題を修正しました

  ---- * ---- * ---- * ---- * ---- * ---- * ---- * ---- * ----

[3] USBaspxの複数台接続方法.txt

■ avrspx.exe(b7) + usbaspx110 以降で1台のPCにて複数台のUSBaspx接続可能

  今までは 1台の PC には 1台の USBasp(x) しか接続が出来ませんでしたが、
  USBaspx の Ver 1.10 からシリアル番号のサポートを追加しました。
  複数の USBaspx に別々のシリアル番号を設定することにより個別の制御を可能と
  します。これにより複数の CPU(又はボード) の開発にも USBaspx を利用できま
  す。シリアル番号機能を利用するには USBaspx の Ver 1.10 以降が必要です。
  USBaspx 用のドライバはオリジナルと変わりません。

■シリアル番号の設定方法

  シリアル番号は半角 4 文字のアルファベット & 数字が使用できます。一台のみ
  の運用であればこのままで構いません。変更する場合は PC に一台のみ USBaspx
  を接続した状態で

    avrspx -pu --set-serial=XXXX

  'XXXX'は4桁以内の半角英数字を指定してください(初期値は"0000"です)。
  正常に書き込めたら USBのプラグを一度抜いてから再度接続してください。

  OS はシリアル番号で管理するようになりますので変更したシリアル番号が今まで
  使用したことがなくて新規だった場合はドライバのインストールが始まります。
  「新しいハードウェアの検索ウイザードの開始」(WinXPの場合)がでましたら
  「いいえ、今回は接続しません」を選んで「次へ」ボタンを押します。
  次の画面では「ソフトウェアを自動的にインストールする」を選択して「次へ」
  ボタンを押します。

  (すでに一度はUSBaspをインストールしているはずなので上記操作で大丈夫です)
  シリアル番号はいつでも変更可能ですが、変更後は必ず USB ケーブルは抜き差し
  してください。

 ★追記 2006-05-22
   USBaspx Ver1.13よりソフトにて自動的に切断・再接続を行うようにしました。
   タイミングにより再接続が出来ない場合はケーブルの抜き差しを行ってください。

■シリアル番号の確認方法
  接続中のUSBaspxのシリアル番号は

  avrspx -pu?

  とすることで接続されているすべてのUSBaspxをリストアップ出来ます。

■シリアル番号指定での操作方法
 1)avrspx -pu ・・・
    とすることで一番最初に見つかった USBasp(x) が操作できます。これはオリジ
    ナル USBasp も利用できます。シリアル番号を書き込んであっても 1台のみの
    接続ならこの方法が利用できます。

 2)avrspx -pu:XXXX ・・・
    (XXXXはシリアル番号)
    この方法で複数台のUSBaspxを個別に制御できます。

■オリジナルUSBaspとの同時使用
  オリジナルUSBasp(又はVer1.10未満のUSBaspx)を1台とUSBaspx(Ver1.10以降)の
  1台又は複数台の同時使用が出来ます。
  オリジナルUSBaspは avrspx -pu? にて一旦接続リストを表示してください。

  表示されている Serial Numberが [] か [?] になっていると思います。
  []で表示される時は  avrspx -pu: ・・・   (コロンの後は空白)
  [?]で表示される時は avrspx -pu:? ・・・  (コロンの後に'?')
  でアクセスすることが可能です。
  その他のUSBaspx(Ver1.10以降)は設定したシリアル番号で指定します。

  シリアル番号をサポートしていない旧 USBasp(x) を複数台接続することは可能で
  すが、利用できるのは検索で最初に見つかった 1台のみです。検索で見つかる順
  番は PC のハードウェアや USB ハブによって異なります。

■参考
  Windowsではシリアル番号がある機器とない機器での取り扱いが異なります。
  シリアル番号がない機器は接続されたUSBポート(HUB含む)ごとに管理されます。

  例えばオリジナル USBasp の場合はシリアル番号がありませんので HUB の 1 番
  目に最初に接続した時にドライバのインストールが始まります。

  同じ USBasp を番う PORT に接続した場合はまた新たにドライバのインストール
  となります。これは Windows がポートを基準に管理するようになるからです。

  一方、シリアル番号がある USB 機器の場合（例えば USBaspx）は、HUB の 1 つ
  のポートに最初に接続した時にドライバのインストールが始まりますが同じ機器
  を別のポートにつなぎ替えてもドライバのインストールは起動しません。この時
  Windows は VendorID+ProductID+ シリアル番号で管理するようになります。
  どちらの場合も2度目以降であればドライバのインストールは起動しません。

  ---- * ---- * ---- * ---- * ---- * ---- * ---- * ---- * ----

[4] 鶏と卵.txt

2006-06-04 by t.kuroki

■鶏と卵問題
  一番最初にUSBaspのCPUを書き込むときにAVRプログラマが必要です。
  俗に言われている「鶏と卵問題」ですが、USBasp が簡単な回路だけに最初の「鶏
  と卵」プログラマも簡単なものが欲しいですよね。
  今回は1つの例として 「でんし研TADさんのCR方式」に対応しました。

  http://homepage2.nifty.com/denshiken/AVW009.html
  上記ページの回路は TAD さんの DUAL ライタ用に書かれていますが基本的にはど
  の AVR(tiny/mega) でも動作可能です。古いタイプ (AT90Sxxx 等) の CPU では
  使用できません。

  でんし研さんでは専用のデータファイルを RS232C で流し込むようになっていま
  すが汎用性を持たせるために chan さんの avrsp.exe に組み込みました。
  RS232C のポートはパソコン本体内蔵だけでなく USB シリアルケーブルも使用可
  能です。

  USBasp用の参考回路図を添付しています。(egg.pdf)
  また実行用のバッチファイルを参考として添付しています。
  CPU毎に用意してあります
    ATmega8用   egg8.bat
    ATmega48用  egg48.bat
    ATmega88用  egg88.bat
    ATmega168用 egg168.bat
  なおRS232Cの通信ポートは COM1 をデフォルトに設定してあります。
  違うポートをご利用の場合はメモ帳等で編集してください。5 行目の SET PORT=1
  を変更すれば OK です。

■実行方法は
  1)電源をONにする
  2)eggxx.batを起動する
  3)「続行するには何かキーを押してください・・・」が表示されたら
      リセット解除のボタンを1秒くらい押して離した後、リターンキーを押す
  4)約1分で書込みを終了します

■avrspx.exeの機能追加概要
  avrspx -pf<n> filename ...
  として <n>にRS232Cのポート番号を指定します。
  例えば) avrspx -pf25 .... (COM25に接続)

  また CR 方式のプログラマは書込みのみで読込が出来ませんので Signature の読
  込も出来ません。よって -t オプションでデバイスを強制的に指定します。

  例えば) avrspx -pf5 -tmega8 -fl10011111 -fh11001001 usbasp.hex

  上記添付されている BATファイルを参考にしてください。

■注意
  ターゲットのボードに専用の回路ではなくて他のボードを使用する場合は MOSI/SCK
  に他の回路が接続されていないようにしてください。
  簡易型の回路のためCRの時定数がずれて正常に書き込めなくなります。

  これは AVR プログラマを作成するための簡易型プログラマです。書込みのみでベ
  リファイや読み出しは一切出来ません。汎用の用途には向きません。

■マニア向け
  現在は書込みボーレートをTADさんと同じ19200bpsを使用しています。
  書き込み時のディレイ値はボーレートから算出するようにソフトを組んでいます。
  CR の時定数を適切な値とすることによりボーレートを上げることも可能だと思わ
  れます。例えば 38400bps で動作可能な CR の値を見つければ USBasp の書込み
  は約 30秒程度に短縮されると思われます。

  38400bpsの指定は avrspx -pf1:38400 ... の様にします。

  ---- * ---- * ---- * ---- * ---- * ---- * ---- * ---- * ----
