こっちの方を先にやっていた訳だが、ライタとか不安があったので、実際のテストは躊躇していた。mega328p でいろいろやったので、手順的にも不安がなくなった。
ちなみに、AE-UM232R を使った FT232R Bitbang ライタは、今こんな状態。

LED を CBUS 2 に付けてみた。RESET と同期させるつもりだったが、CBUS Bitbng は、Close したら 入力(HI-Z)になってしまうようで、avrdude の実行と同期するだけ。CBUS 以外なら RESET するまで 点灯するはず。
あと、CBUS 4 を 12MHz クロック出力に設定して、ケーブルをつないだ。 mega328p で、水晶に設定したときに役にたった。(XTAL1 に接続すると、ISP が使える) ... が、普段は使わない。ちょっと、ピンをひっかけられるようにしている。
さて、usb162 用のUSBaspLoader だが最初全然動かなくて困った。ビルドの方法とか見直したあと、ヒューズビットを見直したところ、なんとか動き出した。
ヒューズビットは次のようにした。
# Fuse extended byte:
# 0xf6 = 1 1 1 1 0 1 1 0
# | \-+-/
# | +-------BODLEVEL 0..2 (110 = 2.7 V)
# +-----------HWBE (0 = HWB enable )
# Fuse high byte:
# 0xd1 = 1 1 0 1 0 0 0 1<-- BOOTRST (reset vector == 0 but using HWB)
# ^ ^ ^ ^ ^ \+/
# | | | | | +------- BOOTSZ (00 = 4k bytes)
# | | | | + --------- EESAVE (preserve EEPROM over chip erase)
# | | | +-------------- WDTON (if 0: watchdog always on)
# | | +---------------- SPIEN (allow serial programming)
# | +------------------ DWEN (debug wire enable)
# +-------------------- RSTDISBL (reset pin is enabled)
# Fuse low byte:
# 0xff = 1 1 1 1 1 1 1 1
# ^ ^ \ / \--+--/
# | | | +------- CKSEL 3..0 (crystal - lowpower)
# | | +--------------- SUT 1..0 (boottime - 65 ms)
# | +------------------ CKOUT (if 0: Clock output enabled)
# +-------------------- CKDIV8 (if 0: divide by 8)
水晶は、周波数が安定するまで時間がかかるそうなので、もっとも立ち上がりに時間がかかるモードにしてみた。あとは、chip erase で EEPROM をクリアしないようにしたのと、BOD の設定を 3.0V → 2.7V にしたぐらい。1/8 分周は Off -- ライタで書くのに不便なので。
- ついでに書いておく。efuse を 0xfe にして、hfuse を 0xd0 にすると、常に ブートローダが起動する。ブートローダでなんのチェックも入れないと、まずはブートローダを動かして なにかの操作をし、次にアプリケーション起動という手順にできる。デバッグ中などは、こっちのほうが便利なこともある。
いまの状態では、read 系しか動いていない。... が、まぁ デバッグしていけば、まともになっていくだろう。
ちなみに、2KB に収まりそう。DFU ブートローダが 4KB だったので、ちょっと嬉しい。
ところで、最初から書き込まれている DFU ブートローダは、悪くはない。FLASH や EEPROM を読めないようになっているが、いったん chip erase して再度書き込むとFLASH や EEPROM が読めるようになるようだ。たぶんロックビットをチェックして、保護しているのだろう。Linux でも使えるし。あと、ヒューズビットの設定を微妙に変えても問題なく動作するし、水晶が 16MHz でも 8 MHz でも動く。
それでも、USBaspLoader にするのだ。ソースもっていると改造できるし、avrdude で使えるので操作を統一できる。2KB にできたら、それも魅力かも。
- mega328p の USBaspLoader では、2KB にしたとしても 開いたエリア (0x7000 - 0x7800) に書き込むことはできないと書いた。
その領域は NRWW 領域というもので、書き込んだりすると CPU が停止する。それが、VUSB(ソフトだけの USB) だと都合が悪い。
usb162 でも、0x3800 - 0x3c00 の領域は NRWW 領域であることは変わらないのだが、usb162 では割り込みを使わなくとも USB の通信が出来る。実際 usb162 用 USBaspLoader は割り込みを使っていない。おそらく NRWW 領域に書き込んでも問題ない。 だから 2KB にした場合、アプリケーションで使える領域を増やすことができる。ついでに書いておくと、本当は、cli/sei も必要なく、プログラムサイズを少々減らすこともできる。
ただ、増えた 2KB を 機能拡張で使おうと思っている。機能拡張とは、シリアル FLASH からのロード。それはまた別途。
とりあえず、動いたみたい。ものは、usb162-0.2-wk12.tar.gz
サイズは、WinAVR-20090313 でビルドして 1930 バイト。gcc3 だとなぜか 2072 バイトと 大きくなる。
ちなみに、flash への write でブートローダを保護していない。実用で使う場合、ロックビットで保護する必要がある。
-- 保護していないといっても、自己書換えはできない。単に チェックの分節約しているだけ。
ロックビットの設定は、avrdude では、デフォルト が 0x3f と見える。これを 0x2f にすると、ブートローダ領域が書き込みから保護される。
USBaspLoader にする最も大きな理由を書き忘れていた。
自作ボードの SRT162 は、スライドスイッチで HWB を切り替えるのだが、それと連動して ISP コネクタの RESET の部分が RESET と SS が切り替わる。
どちらにしても、プログラムを書き換えるには、スライドスイッチを PGM 側にしないといけないのだが、そうすると microSD を使う場合、プログラムの書き込みで いちいち microSD を取り外さないといけない。
それがとっても面倒なのだ。面倒だけでなく、コネクタがゆるくなったりする心配もある。
... というわけで、いままで microSD のテストがちっとも進んでいなかったのだ。これでようやく microSD のテストが簡単にできるようになる!。
補足:
efuse = 0xfe , hfuse = 0xd0, (+ lock 0x2f)
とすれば、いちいち avrdude を -E reset オプションで 立ち上げないと アプリケーションが動作しないわけだが、
microSD の取り外し/取り付け よりはよっぽど良い。