2009年12月07日

usb162用USBaspLoader

前記事で mega328p用USBaspLoader が動いたと書いたが、続いて usb162 用のUSBaspLoader を動かそうとしている。

こっちの方を先にやっていた訳だが、ライタとか不安があったので、実際のテストは躊躇していた。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 の取り外し/取り付け よりはよっぽど良い。
posted by すz at 00:21| Comment(0) | TrackBack(0) | USBasp関係
この記事へのコメント
コメントを書く
お名前: [必須入力]

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

ホームページアドレス:

コメント: [必須入力]

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


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

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