2010年11月24日

Teensy(1.0)互換ボード

PS3 のおかげで、AT90USB162 のボードが 売れたそうだが、ボードの1つとして、Teensy USB Development Board というのが出回っている。

たとえば、次のようなものがある。

調べてみると、これらは『PJRC』が開発した、Teensy 1.0 の コピー品らしい。中身は まったく同じではなく、LED が 2 個付いているのが特徴。

PJRC』は、回路図 や ピン配置図 それに 各種ツールや 独自のブートローダのバイナリまで公開している。

互換品を作ることは簡単だと思えるのだが、上記のものは パッケージや基板のパターンまで コピーしているので、あえて コピー品 と書いた。Teensy のような超コンパクトな開発ボードは今なお魅力的で、本当は薦めようと思って調べたのだが、どうにも薦めがたいことが分かった。そして、開発元では もう 生産していないように見える。欲しくとも正規品は手に入らないようだ。

    現在は、Teensy 2.0 になっていて、ATMEGA32U4 になっている。ATMEGA32U4 は 機能が多く魅力的なチップなのだが、チップの入手性が非常に悪く(いまは)電子工作で使いにくい。AT90USB162 や 互換のATMEGA16U2, メモリ増強版の ATMEGA32U2 は 価格も安く いまなお魅力的な チップだと思う。

前置きが長くなってしまったが、そういうわけで、Teensy 1.0 互換ボードを作ってみようと思う。

    本当の理由は、Fusion PCB で基板を 作りたかっただけなのだが、ネタ的にも面白そうだ。
    あと、Teensy 独自のブートローダ はソースが公開されていないし、勝手に載せて売ったりするのはまずそうなので、USBaspLoader 互換の ブートローダを 提供しようと思う。
    (注意) 私自身は売るつもりはないが、販売で添付可能なものを提供しようという意味。ライセンス料を取るという意味でもない。安くとも薦められないものは困るのでどうにかしたいだけ。

基板の設計


公開されている Teensy の 回路図ピン配置図を元に eagle で基板を設計することにした。部品は、基本的に秋月で手に入るものをベースに選定する。

  • 部品については、今回新たに選ぶわけでなく、昔作ったボードの部品ライブラリを使う。

  • Teensy は 5V 専用のように見える。ここは 気に入らないので、レギュレータを付けて 3.3V で動かす。

  • 大きな部品を使い、さらに部品を増やすわけだから、表面だけでは入りきらない。当然裏面も使う。

  • リセット周り -- どうなっているのかと思ってたのだが、ダイオードを使って 1 個のボタンで済ませている。リセット後 しばらく HWB が L である必要があるわけなのだが、RC で delay させることで対処している。HWB の機能は、リセットが H レベルになった瞬間に HWB の値を取り込むから、RC の時定数はあまり関係ない。

    そんなことより、プルアップがない。常に L レベルのような .. ? 実用として使う場合は、自分でプルアップせよということ?

      HWB がどういうものか説明しておく。これは、リセット時に HWB = L だと ブートローダを起動する仕組み。ヒューズビットの設定で、無効にすることもできるし、常にブートローダを起動するようにもできる。
      HWB は 単なる入力で、プルアップ や プルダウン するオプションはない。




    angel162 ボード(サイズ: 31.75 x 19.05)

  • angel162-01.zip (全部入り)
  • angel162-01-out.zip (提出したファイル)

      (改修版)
    • angel162-02.zip (全部入り)
    • angel162-02-out.zip (Fusion PCB 提出用ファイル)
      (改修版2)
    • angel162-03.zip (全部入り)
    • angel162-03-fusion.zip (Fusion PCB 提出用ファイル)
      (スルーホールまで レジストしないよう修正)

    • 同サイズの違うボードも設計した →『AE-UM232Rピン互換ボード』の記事参照



      UVCC を USB から入力し、UCAP を VCC と切り離した。こうすると、VCC に 5V 入力が可能になる。
      実際に 5V 入力にするには、TAR5B33 を付けずに IN と OUT をジャンパする。LED や HWB まわりはあえて変更していない。

      あと 外形線を 0.2mm にして、0.1mm づつ外側に広げた。

  • できあがったのは、こういうもの。出来は悪いかも知れないしバグがあるかも知れないが、もう Fusion PCB に発注してしまった。

      angel162-01-out.zip を送れば良いだけなので、eagle を使えない人でもこのボードを作ることができる。ちゃんとライセンスを書いてないが、GPL に準じようと思う。要するに angel162-01.zip の生成物であるボードを売ったり配ったりするなら それを作った eagle ファイルの (ボードを受け取る人への)提示が必要。改変も OK 。

  • 問題は名前。ファイル名にも使うし、なにか付けなければならない。Teensy は 商品名なので使えない。ベタなんだが、Teensy -- 天使 -- Angel という連想で、angel162 にした。

  • バグ情報:(ほんとうに作ろうと思っている人は注意!)

    (1) D6 の LED の極性が間違っていた。H で点灯するようにしたが、L で点灯だった。

    (2) UVCC を 3.3V に接続してしまった。これでも問題は起きない。が、推奨は USB VBUS に接続する(or 無接続)。

    (3) D7 (HWB) のプルアップはしていない。(Teensy 1.0 も) これで大丈夫なのだろうか?
    さらに、LED まで付けてしまっている。

      基板のパターンをよくみると .. LEDの K を GND から 切り離して 近くの 3V3 につなげる改修はできそうだ。
      極性が逆になるから、LED も逆に付けることになる。

      さて、HWB だが、他のバージョンの Teensy は、プルダウンしているだけだった。
      よくよく考えるとそれで良いのだった。

      通常外部リセットのときしか ブートローダは起動しない。
      ブートローダは、外部リセットかどうか知ることができる。自分でチェックして、外部リセット以外は アプリケーションを起動させてしまう。

      ボタンは1つしかないから、それが押されたときは常に外部リセットだ。だから HWB は 弱いプルダウンだけで十分なのだ。もし、実用回路で コントロールしたければ、強いプルアップを付ければよい。

      で、常にプルダウンするなら L で点灯することはできない。だから改修もできない。

      では、D2/D3 とかはどうしよう。... D7 に LED をつけるなら他にいらないような気がするので、まず C3/R5/D3 はつけるのをやめる。もし必要なら C3 に 100K とかをつけて R5 はジャンパ 、D3 はオープン。
      D2 には、ダイオードではなくて 1K をつける。これぐらいで良いのではないだろうか。

        追記: LED には起電力がある。指で 押さえてリセットすれば ブートローダに入れる 。
        それが嫌ならプルダウンでよいと思うのだが、100K で良いのかどうか?

      もし互換性が重要なら D7 の LED はあきらめて 1608 型の LED にして D6 側だけ付けて 改修する。Teensy 1.0 と おなじ回路にもできるし、ダイオード(D2/D3)を使わない簡易回路にもできる。

      どちらにせよ 外部リセット のチェックは必要だ。ブートローダの config を変更することにする。

    なんだかイマイチのようだが、まだ大丈夫。

    ピン配置図:


    こんな感じで、サイズは 秋月 AE-UM232Rと同一。(実はフチがあるので、ちょっと大きい。オリジナル Teensy はたぶん同一)

パーツリスト


パーツリストは、ここにまとめておこう。
(注意回路を見直し中:付けるパーツを変更予定)


  • 表面実装のコンデンサ については、1uF は秋月で 安く手に入る 1608。あとは 2012 をベースにした。ただ 22pF は 秋月では手に入らない。 3216 10pF が手に入るのみなので、一応使えるように配慮した。(Teensy 1.0 も 10pF だし)10pF で発振すると思うのだが、無理なら 2 枚重ねで対応してほしい。

  • 抵抗は、秋月では無理。1608 なら リールが買えるが ... 2012 のパターンでも 1608 も使えるはずなので、すすめはしないがリール買いする手はある。おすすめなのは、共立のチップ抵抗セット。千石やマルツでバラ買いする手もあるし、ATMEGA32U2 をデジキーで買うならついでに買っておく手もある。

      MCR10で検索して、デジキー型番のルールが分かったら、型番直打ちで発注書に登録すると効率がよい。
      そういえば、水晶用の コンデンサ も 合わせて買っておくとよいかも。これとか。

  • 2色チップLED が入手できなかったり、 赤・黄の組み合わせが気に入らなければ、1608 タイプを 2 つ付ける手がある。

  • ATMEGA32U2 は、デジキーで 単価 392円で入手できる。国内だと マイクロファンで 単価 630円 -- 数を買わないなら こちらの方が良いかも。AT90USB162/ATMEGA16U2 の入手は実は難しい。

    U1 AT90USB162/ATMEGA16U2(/ATMEGA32U2) TQFP-32 ( 0.8mm ピッチ)
    U2 秋月 TAR5SB33 3.3V レギュレータ
    D1 秋月 SEC2764C 2色チップLED
    D2,D3 秋月 1SS352
    X1 16MHz 秋月 FA238

    R1,R2 22 SMD 2012
    R3,R5 1K SMD 2012
    R4 330 SMD 2012

    C1 10u SMD 2012 (秋月 10u)
    C2,C3,C6 1u SMD 1608 (秋月 1u)
    C4,C5 22p SMD 2012 (マルツ、千石とか)
    (または 10p /10p x2 (秋月 3216 10p)
    C7 0.1u SMD 2012 (秋月 0.1u 100個,0.1u 20個)
    0.01u SMD 2012 (秋月 0.01u)
    0.01u SMD 1608 (秋月 0.01u 100個 100円
    - 0.1u では電圧が上がるのに 10ms かかる。FUSEBIT SUT を 11: (65 ms) にする。
    - 標準の 0.01u では 1ms なので SUT を 10: (4.1ms) にする。
    (0.01u は在庫が少ないようなので、0.1u で良いことにした) 0.01u が復活!
    - default の SUT 01: (BOD 許可) の場合 usbInit() 前に 20ms
          遅延を入れる。
    SW1 秋月 TSKB-2JL,LS6J2M-T
    CN3 秋月 UX60A-MB-5ST USB miniB

    メモ: 10 個分の部品代 (送料含まず)

      ボード 2020円 ( $23.52 x 85.6 )
      1100円 ($13.42 x 82.3) 2011.06.06
      ATMEGA32U2 3960円 2011.06.06 (25個なら 6221 円)
      TAR5SB33 280円
      SEC2764C 200円 (20個 -- 10個あまる)
      1SS352 200円 (40個 -- 20個あまる)
      FA238 600円 (12個 -- 2個あまる)
      TSKB-2JL(LS6J2M-T) 200円
      UX60A-MB-5ST 800円 (12個 -- 2個あまる)
      10uF 100円 (20個 -- 10個あまる)
      1uF 200円 (100個 -- 70個あまる)
      0.01uF 100円 (100個 -- 90個あまる)
      10p 200円 (20p にすると仮定 -- 40個)
      抵抗 500円 (10個 100円とみなす)
      ----
      合計 8240円

    10個もいらないと思うが、これぐらいの部品代になる。ひとりで揃えるには高いか ..
    送料は、ついでに買うのでなければ 2000円+800円。

    実際作ったのだが、C3/R5/D3 は不要だと分かったので付けていない。
    ... ただし、そうした場合は、ブートローダを起動するときに、LED に光が入らないように指で押さえて リセットボタンを押す必要がある。

ブートローダ


AT90USB162 で使える USBaspLoader は 昔作った。『usb162用USBaspLoader』の記事に載せているのだが、いろいろ詰め込んだせいで 余計なものが多い上に説明が少ない。

新たに angle162 用に まとめなおして、説明を付けようと思う。

    AT90USB162 , ATMEGA32U2 などは、最初から Atmel のブートローダが書きこまれている。flip や dfu-programmer を使ってプログラムを書きこむことができるので、どうしても必要なものではない。

    これは、『avrdude(avrdude-GUI) のインターフェイスで操作したい』とか、『Arduino IDE(+Teensyduino)を自作ボードで使いたい』といった場合に使う。

    注意!) AT90USB162 の Atmel の ブートローダはここからダウンロードできるので 元にもどすことも可能なのだが、ATMEGA32U2 はない。いったん消してしまうと 元には戻せないので注意。

      (読めるらしいので、バックアップしたほうが良い)
      ライタでは読めないがプログラムからは読める設定。ブートローダを改造して アプリケーションとして実行すれば読むプログラムは用意可能。ブートローダを試す障害になるのは困るので、添付する方向で検討してみよう。

    LUFA にいろいろな種類の ブートローダがインプリメントされているので、それを使うのも手。DFU ブートローダもあるらしい。

USBaspLoader 互換ブートローダ:

  • angel_loader-1.4c.zip (暫定版)
  • angel_loader-1.4.zip (最新版)
  • angel_loader-1.3.zip (旧版)
  • angel_loader-1.2.zip (旧版)
  • angel_loader-1.1.zip (旧版)
  • angel_loader-1.0.zip (旧版)
  • angel_loader_00g.zip (旧版)
  • angel_loader_00d.zip (旧版)

  • avrdude-serjtag04k.zip (おまけ: 1.4 に対応)

  • ver 1.4c (1) angel_loader のバイナリサイズを減らし 32u4 も 2KB 以内にした
    (2) serjtag 更新中 (たぶん動かない)
  • ver 1.4 (1) serial と serjtag を見直しくっつけられるようにした。
     DTR=0 で serjtag / DTR=1 で serial -- だいぶ変更したので リビジョンを上げた。
     avrdude-serjtag も対応版にした。(実は windows 版は無修正で問題ない)
    (2) UM162ボードでは ボーレートを 1200 にして RTS=0 にすると リセットをかけ ブートローダが起動するようにした。
  • ver 1.3 (1) UM162ボードに対応 -- 『AE-UM232Rピン互換ボード』の記事参照

      このボードだけ serial の DTR 出力に対応。(未テストで極性が逆かも) 。あと、このボードだけ usbisp2 の ISP で 1MHz クロック出力を付けている。(これも未テスト)

    (2) binary デレクトリの整理と README 更新
  • ver 1.2c (1) binary デレクトリの整理と README 更新
    (2) ブートローダに lockbit 書き込み機能を追加
    (3) 32u4 版がかなりまともになった。
    (4) 32u4 での serjtag (ADC 機能) 確認。バイナリ添付開始。
  • ver 1.2a (1) binary デレクトリの整理と README 更新
    (2) オリジナルブートローダバックアップ用プログラム添付
    (3) 32u4 版添付 (少しまともになった。対応ボードは dac23-u4)
  • ver 1.2 ついに 1.2 にした。
    (1) mega32u4 対応(途中)
    (2) PDI/TPI 対応は完了していないが、大分形になってきた。
  • ver 1.1h (1) usbasp2: PDI/TPI 拡張中のコードはまだ動かない。(修正中)
    (2) ISP のチャネル変更版(ISP2)が動いたので整理してまとめた。
  • ver 1.1f (1) usbasp2: PDI/TPI 拡張中のコードを入れた
  • ver 1.1c (1) レギュレータを off しないようにした。
    (2) cdc162 の API 拡張
    (3) USBasp プロトコル拡張版のフレームワークを入れた。
  • ver 1.1a (1) cdc162 API 拡張 (serial/cdctest で 対応中)
    .. 1.1a などは 暫定版。区切りが付いたら 1.2 に上げる。
  • ver 1.1 (1)USB-シリアル ファームウェア添付。
          (2)バイナリの elf ファイルを添付するようにした。
  • ver 1.0 ブートローダと ライタの動作確認。

まず最初に、Teensyduino でどう対応するのかについて書いておく。これが出来れば、Teensy Loader にこだわる必要はなくなるわけで重要なのだ。

    USB直結Arduino互換ボード』を みて欲しい。METALABMETABOARD が元ネタなわけだが、こちらの方がわかりやすい。

    さて、なにをしているかというと、board.txt を書き換えて、書き込みソフトを変更しているわけだ。ブートローダのインターフェイスは 同じ USBaspLoader だから まったく同じ手順で 使えるようになるはず。

続いて解説。

そもそも、どういうものかというと ... USBaspLoaderを元にして、自作してきた USB162 ライブラリ とリンクできるよう修正をしたもの。diff が取れないぐらい変更してしまったが オリジナルとロジックは(基本)変わらない。

    変えたのは、singature ぐらい。チップから取得することで、同じバイナリが使えるようにした。

標準の設定は、今回作った angel162 に合わせているが、他のボードにも対応できる。設定しなければならないものは次の 4 つ。

  • 黄(or 緑) LED(D7)

    Teensy 1.0 には、この LED は付いていない。コピー品は 2 つ付いているし、経験上 2 つの方が便利なので、D7 に付けることにした。

    割り当てた機能は、『BOOTLOADER 実行中 』を示すステータス。

    bootloaderconfig.h に connect_led_on()/connect_led_off() が定義されているので編集することで 他の ボードにも対応できる。
    bootLoaderEnter()/bootLoaderExit() で初期化/終了処理をしているので、こちらも合わせて変更する必要がある。

  • 赤 (or オレンジ)LED (D6)

    割り当てた機能は、『BOOTLOADER コマンド実行中 』を示すステータス。
    上と何が違うかというと、BOOTLOADER が コマンド待ちのとき、黄色は付いたままだが、赤は消える点。書き込み中 ピカピカ光る。

    bootloaderconfig.h に busy_led_on()/busy_led_off() が定義されているので編集することで 他の ボードにも対応できる。
    bootLoaderEnter()/bootLoaderExit() で初期化/終了処理をしているので、こちらも合わせて変更する必要がある。

  • HWB の回路

    HWBは、D7 と決まっているわけだが、回路は 1種類ではない。昔作ったボードはスライドスイッチで、切り替えると ブートローダを終了してプログラムを起動するようにしていた。

    また、ヒューズビットで 常に ブートローダを起動するようにもできる。この場合は、ブートローダ側で プログラムを起動するかどうかを判断する。

    動作を変更する define を 3 つ作った。以下推奨する設定の例

    CHK_EXTRF USE_HWB CHK_HWB_LEVEL
    1 1 0 外部リセット なら ブートローダ起動
                      (HWBE = 0 が前提の動作 )
    1 0 0 外部リセット かつ HWB が L なら ブートローダ起動
    (HWBE = 1 / BOOTRST = 0 が前提の動作)
    1 0 1 外部リセット かつ HWB が L なら ブートローダを起動
    するが、HWB が H になったとき アプリプログラム起動
                      (スライドスイッチ用)
    補足 1) ブートローダを起動しない = アプリプログラム起動
    補足 2) USBaspLoader には DISCONNECT命令で終了しアプリプログラムを起動する
         機能もある。(デフォルト: -- 抑止も可能)


  • MCUの種類とクロック

    クロックは、Makefile 上の F_CPU で指定する。1600000UL(16MHz) or 8000000UL(8MHz) が指定可能。
    それに加えて 水晶 16Mhz のとき、プリスケーラで 8MHz にする指定もできる。
    ( 3.3V で 保証されている 8Mhz にしたいとき 使用する。)

      このようにするには、F_CPU は、8000000UL(8MHz) に指定して、F_SCALER を 1 にする。

      ちなみに、F_SCALER が 0 の場合は、1/1 に設定するので、ヒューズビット(CKDIV8) を 1/8 にしても問題ない。逆に 8MHz にする場合、一瞬 16MHz になるのを避けるために 1/8 にする。

      また、F_SCALER を define しないと、プリスケーラの 設定を変更しない。これはほんのわずかでもコードを減らしたいときに使う。

    MCU は、at90usb162 と atmega16u2 , atmega32u2 に対応しているが、at90usb162 の指定で十分(なようにしている)。むしろ BOOTLOADER_ADDRESS の方が重要だ。

      asis の WinAVR-20100110 では、問題があったかと思う。asis では、at90usb162 の指定でビルドすること。

      MCU の指定を変更しても 同じオブジェクト・ファイルが生成されるのは確認した。( ライブラリのバイナリが違うので elf ファイルは同一にならない。) ちなみに、atmega8u2 はページサイズが違うので、同一にならない。

    現状のコードサイズは 2KB 以下(1984 バイト)で、2KB 以下を守ろうと考えている。

     BOOTLOADER_ADDRESS=3800 -- AT90USB162/ATMEGA16U2
     BOOTLOADER_ADDRESS=7800 -- ATMEGA32U2
    デフォルトのヒューズビットは 4K 用になっている。その場合は、

     BOOTLOADER_ADDRESS=3000 -- AT90USB162/ATMEGA16U2
     BOOTLOADER_ADDRESS=7000 -- ATMEGA32U2
    なお、ヒューズビット(BOOTSZ=01)も合わせて設定変更する必要があるので注意。

    なお、atmega32u4 には対応していないが、PLL 周りを修正することで対応できそう。ものを持っていないので 自分で修正するつもりは まだない。

      入手したので、対応することにした。一応は動いているが、動作がいまひとつおかしい。
      特に USBの接続がよく失敗する。(修正済み)

      ちなみに、BOOTLOADER_ADDRESS=0 とした上で 、LDFLAGS の --section-start=... となっている所をコメントにすると アプリケーションとして実行できる。

      注意点を書いておくが、このブートローダで ブートローダを更新しようとすると 途中まで書いて壊れる。壊したくなければ ロックビットで保護すること。


    MCU と BOOTLOADER_ADDRESS を変更することで、ATmega8u2 にも対応はできる。が、わざわざ 容量の少ない ATmega8u2 を電子工作で使う意味はないと思う。Arduino UNO に応用する意味もあまりないだろう。
    .. ということで無視する。

      arduino UNO の ATmega8u2 は 最低限度の配線しかしていない。回路図(pdf)をみると
      PB1 (SLCK) ISP コネクタ
        PB2 (MOSI) ISP コネクタ
        PB3 (MISO) ISP コネクタ
      PD2 (RXD) arduino TXD
      PD3 (TXD) arduino RXD
      PD4 RX LED (L active)
      PD5 (XCK) TX LED (L active)
      PD7 (HWB) arduino DTR
      これだけ。たとえば ライタにするにしても 線が足りない。せめて PB0(SS) を 外に出しておいてくれれば... 改造するとすれば LED から線を引き出すぐらいか。でも、誰でもできる感じではなさそう。
      ただ、この割り当てが 今後リファレンスとして使われるかも知れない。覚えておこう。

  • バイナリの種類
    binary ディレクトリに 以下の 4 つを置くことにする。

     angel162_loader_16M.hex AT90USB162/ATMEGA16U2 水晶 16MHz / 8MHz 動作
     angel162_loader_8M.hex AT90USB162/ATMEGA16U2 水晶 8MHz / 8MHz 動作
     angel32u2_loader_16M.hex ATMEGA32U2 水晶 16MHz / 8MHz 動作
     angel32u2_loader_8M.hex ATMEGA32U2 水晶 8MHz / 8MHz 動作

    水晶 16MHz / 16MHz 動作 のバイナリは作らないことにした。なお、8MHz はテストできないが F_SCALER が違うだけなので大丈夫なはず。

    LED は、D6/D7 を H/L レベルで駆動している。だから LED の 極性が逆のボードでも このバイナリを一応使える。(表示が逆になるだけ) 。ただし、D7 を H/L にできないような ボードでは このバイナリは使えず、(bootloaderconfig.h を適切に変更しての) リビルドが必要になる。

ヒューズビット


非常に重要なのだが、いつも忘れているのでおさらい。

# Fuse extended byte:
# 0xf5 = 1 1 1 1 0 1 0 1
# | \-+-/
# | +-------BODLEVEL 0..2 (101 = 3.0 V)
# +-----------HWBE (0 = HWB enable )
# Fuse high byte:
# 0xd3 = 1 1 0 1 0 0 1 1 -- BOOTRST (reset vector == 0 but using HWB)
# ^ ^ ^ ^ ^ \+/
# | | | | | +------- BOOTSZ (01 = 2k bytes/ 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:
# 0x5e = 0 1 0 1 1 1 1 0
# ^ ^ \ / \--+--/
# | | | +------- CKSEL 3..0 (1110: crystal - normal)
# | | +--------------- SUT 1..0 (01: fast + BOT)
# | | (10: boottime 4.1ms / 11: 65 ms)
# | +------------------ CKOUT (if 0: Clock output enabled)
# +-------------------- CKDIV8 (if 0: divide by 8)

これがおすすめ?
注意点)

  • 8MHz で動かす場合、CKDIV8 を 0 にする。
  • SUT 11: boottime 65ms が無難ではあるが、デフォルトは違う
  • BOOT_ADDRESS を 3800/7800 に変更したら BOOTSZ 01 を忘れずに


補足:
ATmega32u2 の デフォルトは、efuse 0xf4 / hfuse 0xd9 / lfuse 0x5e 。(AT90USB162 も同じ )

BOOTSZ 以外の変更をしないで動くようにプログラムで対応するには、usbInit() の前に 20ms の遅延を入れる。

おまけ : ライタプログラム (USBasp)


ブートローダをどうやって書きこむかという問題がある。

AE-UM232Rを使ったライタなどなんでも良いからライタを用意できれば良いわけだが、別の方法もある。

このボードは、汎用ボードなわけで、ライタになるプログラムを入れればよい。2 つ作れば問題ないようにはできるわけだ。

このチップは、標準で Atmel の ブートローダが入っている。それで、ライタになるプログラムを書きこめば、2 つめのブートローダを 書きこむことができる。安定して動くことが確認できれば、1 つめも書き換えれば良い。

ライタになるプログラムを、USBasp (not USBaspLoader) 互換 にしておけば、 PC のライタソフトは 1 つで良く便利。

binary ディレクトリに以下のものを置いておく。(例によって未確認.. というよりまだデバッグ前)

 asp162_16M.hex 共通 水晶 16MHz / 8MHz 動作
 asp162_8M.hex 共通 水晶 8MHz / 8MHz 動作
ソースコードも添付(usbasp ディレクトリ)
配線:


    ターゲット側 ライタ側
    MOSI ---- MOSI
    MISO ---- MISO
    SCLK ---- SCLK
    RST  ---- SS

    VCC(3V3) --- VCC(3V3)
    GND ---- GND

    USBasp は、SPI インターフェイスを使っているので、ピンの変更はできない。
    ちなみに ターゲット側 MOSI - マスター側 MOSI となる。Master Out Slave In だから そのとおりの意味になっている。

おまけ : ライタプログラム2 (serjtag)


USB910 というのをこのブログ開始時作っていて serjtag という独自プロトコルの の JTAG 用 インターフェイスまで作って拡張していたのだが、放置していた。ATMEGA32U4 が手に入るようになったら 移植しようと思っていたのだが、いつまでたっても手に入らないので忘れていた。

この機会に移植しようと思う。自分で全部作っているわけで移植自体は簡単にできるようにしている。とりあえず 0.1 版では ビルドだけできるようにして 添付。

機能は、AVR910 互換ライタ + serjtag + i2c マスタ。serjtag は SPI インターフェイスでもあるので ライタにもつかえるし、SDカードを制御するテストなどにも応用できる。I2C マスタも デバイスを制御するテスト用。だいぶ古いから デバッグしながら 直していこうと思う。

ちなみに、serjtag で SPI インターフェイスを使えば bitclock を 8MHz まで上げられる。が、CDC-ACM を使うので実効スループットは あまり上がらないだろう。このあたりは、チューニングしてみたい。

    正直なところ、FT2232HはもとよりFT2232にも性能ではかなわないだろう。... だがいろいろいじれるのが利点。ツールとして欲しい機能は他にもあるので付け加えていこうと思う。


追記: 謎なボードが出てきた。

  • Designer's Minimus AVR USB Modchip Jail Break Dongle for PS3』 -- $18.60 dealextreme



    これは何? Designer's となっているからには、パチモンなわけだが... ちゃんと本物があるらしい。
    http://www.minimususb.com/ MCU は、AT90USB162 だそうだ。


    普通に Atmel のブートローダ使っていてソフトの著作権は問題ないし、変なデザインだが開発ボードだし。デザインはマネているかも知れないが、微妙に違うかも知れないし。-- まぁ許容範囲内か。

    よくみると LED は 3 つある。あと内蔵レギュレータ使っていて 5V と 3.3V の切り替えができる。良いのではないだろうか?

    それはともかく、本物は国内でも売られてたのか。これを含め AT90USB162 だけでいくつ出たのだろうか? Arduino は全部で数万台らしいが .. それを軽く超えるような気がする。

追記: 2010/12/3 基板がきた。



    製作は別記事『Teensy(1.0)互換ボード 製作編』。



    こんな風に ATmega32u2 版と AT90USB162 版を 製作した。次のステップは、USBasp 互換ライタと ブートローダのデバッグ。

    現時点で USBasp 互換ライタのほうは動いていて、それで 書き込んでブートローダのテストをしている。


追記: 所感

秋月の AE-UM232R と同じサイズで (ソフト次第で)同じようなことができるボードになった。AE-UM232R も 良いのだが、足が最初から付いているのだけは気に入らなかったりする。

いくつか作れるだけのパーツはあるし、AE-UM232R を使うかわりに これを使っていこうと思う。

ただ、USB-シリアル コンバータは、まだ作っていない。これがないと 片手落ち。
... そういえば ゆきさんの R8Cプログラマ は USB-シリアル コンバータの機能を含んでいる。これ ベースに機能を削って でっちあげようかな。

    ただ、プログラムに 日本語は入れないことにしているから ... どうしよう。参考にさせてもらって作り直すか もしくはコメント削りまくるだけにするか。

    追記: 結局、ベースにさせてもらって、自分の趣味で変更。一応 ループバックで動作したので v1.1 に添付することにした。

デバッグの記録


デバッグの記録 0d 版〜

    USBasp : 最後のページの書き込みのところにバグがあったが、その他はだいたい OK のようだ。

    実をいうと、割り込みベクタを登録していないのに、UDIEN の EORSTE にビットを立てている。そして、そうしないと 動かない。

    自分で書いたコードだが忘れている。... 調べたら USB reset が起きたら _bad_interrupt に ジャンプして 最初から動くようになっていた。

    アプリケーションはそんなコードで問題ない。だが、ブートローダでは 割り込み原因を調べているので、不具合がおきる。さて。

    -- リセットでない場合 はブートローダを再実行しなくてはならない。それを判断するのは可能なようだ。

デバッグの記録 00g

    USBasp のほうは FIX しようと思う。問題はブートローダ。

    ブートローダは動くのである。ただし 最初の 1回だけ。ブートローダで USBasp を書き込むとリセットを押しても USBasp が起動してしまう。(ブートローダを 壊してしまっているのではないことは確認済み )

    ううむ困った。

      Atmel のブートローダは動いているわけだから、ブートローダで アプリケーションに制御を渡していると考えられる。本当のリセットはたぶん問題ないが、USB からのリセットの結果の割り込みで main が再実行されたときに アプリケーションに制御を渡してしまうに違いない。

      だとすると リセットボタンを押しながら USB に接続すれば 1回目と同じ状況のはずだからブートローダが起動するはず

      .. と考えてやってみたら正解だった。 期待どおりに ブートローダが起動した。

      確実にブートローダに入れるならこれを仕様にしてしまっても良いのだが、気持ち悪いのでできたら直したい。

      ... おかしい? うまくいかない。さらに、常に ブートローダに入るようにしても起動しない。
      よくよく考えてみれば、LED には起電力があったのだった。明るい場所で リセットを押しても HWB が H レベルになって ブートローダに来ない。LED を指で押さえて リセットを押せば OK だった。

      ちゃんと動くようになったので、ver 1.0 にする。

    デバッグの記録 ver 1.0

      ゆきさんの R8Cプログラマ から USB-シリアル コンバータの機能だけにするよう コードを削り、serial/ を作成。
      機能は、8N1 専用 でボーレートだけ変更できる。115200/57600 bps はサポートしているが、最大はよくわからない。(値によって誤差が大きくなる -- 115200 の倍数は無理)

      バイナリは、serial162_16M.hex (動作は8M) / serial162_8M.hex 。

      TX-RX を接続してのループパックしか試していないので、バグがあるかも。あと、LED の付き方が気に入らないので修正予定。

      あと バイナリファイル(HEX)の元の elf ファイルも添付するようにした。ディスアセンブルが avr-objdump -d で出来るし、コンパイルしないで バイナリを変更して LED のポートを 変えるとかを 一応考慮。ブートローダはサイズが厳しいので。

    デバッグの記録 ver 1.1

      LED は、50ms 残光 する特性をつけた。瞬間でないので 通信しているのがよく分かる。
      あいかわらず ループパックしか試していないので、ボーレートに誤差があっても分からない。

      callback_set_baud(long) という API があるのだが、これだと ボーレートしかわからない。CDC162_EXCONT で切り分けて 1 の場合、API を変更し、databit/parity/stopbit も扱えるようにした。

      さらに、SET_CONTROL_LINE_STATE とか SEND_BREAK に対応する API も追加。

        SET_CONTROL_LINE_STATE では、1 バイトの データが VALUE にセットされて 来る。フォーマットは、

        bit0: DTR
        bit1: RTS

        BREAK は 2バイトのデータで VALUE にセットされて来る。意味は BREAK 時間 (ms) だが、Linux だと (-1) か 0 しか 渡していない。

        これをアプリケーションプログラムで制御するのは (OS に API があるので)簡単で、サポートしておくと これで モードを変えたりできる。SEND_BREAK も 同様に OS に API がある。

      • Windows は、EscapeCommFunction() をつかうが 必要に応じて SetCommState() で、DTR_CONTROL_DISABLE/RTS_CONTROL_DISABLE しておかなければらない。

      • Linux とかだと ioctl() の TIOCMSET をつかうが、やはり termios インターフェイスをつかって RTSCTS を無効にしたりしないといけない。

      詳しくは、ソースコード( cdc162.h と cdc_main.c )を参照。

    API だけは入れておくが中身は LED を点灯させて チェックするコード。

      チェックしてみると、初期化で OS が DTR/RTS を 設定する。BREAK は勝手に送信されないので、動作モードに使う場合 BREAK がきたときに有効にしたら良いと思う。

        cdctest にチェックするコードを入れてみたが、BREAK 送信で 2 回来るような ... ?
        それはともかく、デフォルトは DTR 1 RTS 1 。で、BREAK が来て mode が変わっていたら 内部動作を変える ... みたいなのでどうだろう?

      ... そういえば シリアルベースの (ダム)ライタというのも考えられる。通常の AVR は SPI モードを使えばよいし、たしか XMEGA や Tiny10 とかも XCK 出力 するようにして RX + TX を接続 して 信号線にすれば 良かったはず。もちろんソフトはいるわけだが、クロックを常時出力しないといけない XMEGA では (ダム)ライタは厳しかった。いずれ考えてみよう。

    ちなみに、ステータス は、RX/TX ではない 第三の インタラプト・エンドポイント にデータを送るようだ。パケットのヘッダは 8 バイトで、後ろに 2バイトのデータが付く。

      uint8_t RequestType
    uint8_t NotificationType
    uint16_t Value
    uint16_t Index
    uint16_t Length

    ヘッダは、コントロールのパケットと同じ形式。Linux だと対応しているパケットは、
     
    NotificationType: 0x20 (NOTIFY_SERIAL_STATE)
    RequestType: 0xa1 ( DIR_IN | TYPE_CLASS | RECIP_INTERFACE ) (?)
    Length : 0x02
    DATA bit0: DCD
    bit1: DSR
    bit2: BRK
    bit3: RI
    bit4: FRAMING (error)
    bit5: PARITY (error)
    bit6: OVERRUN (error)


    というもののようだ。
    本来なら、接続したときに DCD=1,DSR=1 にして これを送り、スタータスが変わったときにも送る。だが、いまのところ 対応するコードはまったくない。

    ところで、いくつか修正しないといけない。

  • 内部 3.3V レギュレータの扱い。

    これは、外部から 3.3V を供給するとき以外は disable にしてはいけない。そして、外部から 3.3V を供給するときでも動作自体は支障がない。

    disable にしたりしなかったり適当だったので、しないように 変更する。

  • UDINT=0

    デバッグの都合で、main のコードに こういうのを入れてしまっている。本来なら usbInit() でやるべきことなので、修正する。実をいうと GPIOR2=0 もしておかないといけない。

  • TPI/PDI』の記事で書いたように USBasp を拡張可能なようにしようと思う。
    具体的には、isp.c で定義されている 関数を メソッド化 (C なので オペレーション を定義した 構造体)。そのままでまずい一部のものは、ちょっと変更する。

    FUNC_CONNECT で value_h を プロトコルバージョン とみなし 2 だったら value_l によって メソッドを変える。予定では 2 が TPI 3 が PDI (1 は ノーマルの別チャネルとか)

    --- 1.1c 以降 ---

  • 1.2 にすればと思いつつ 1.1 のままにしてしまった。

    いちおう serial も他の相手と通信できることを確認した(9600 bps だけだが)。usbasp2 も フレームワークを変えたが、ロジックは変えていないので当然のごとく動いた。

  • serjtag はやはりちゃんと動かしておきたい。DTR をサポートできるようになったので、DTR = 0(H レベル) + BREAK で serjtag モードに入るとかしようかと思う。

    あと、USBasp 拡張で TPI/PDI のコードも入れてみたいが、どうしよう。

    作るとしたら こんな感じか。

      PD2(RXD) --------+-- 300 ---- PDIDATA/TPI_DATA
      PD3(TXD) --------+

      PD5(TCK) ------- 300 -------- PDICLK/TPI_CLK

      PD4? ------- 300 -------- TPI_RESET

      とりあえず抵抗入れとけばよい?

    • TPI の場合相手は 5V 電源。XMEGA だと 最大が 3.6V ぐらいで 最低は 1.6V ? -- だっけか。
      1.6V はそもそも無理だとして 2.5V 以上 を前提にしておく。相手にも自分にもクランプダイオードは入っている。それで 0.3V ぐらいの電圧差分は吸収できる .. として 電流がながれたときの電圧降下で 電圧差を吸収。

    • AVR は 結構電流を流せるのだが、問題は 相手もしくは自分の電圧が上がってしまうこと。5 mA までにしておけば まぁ大丈夫だろうということで PDICLK/TPI_CLK は 300 Ω。

    • PDIDATA/TPI_DATA の場合はさらに出力の衝突の可能性がある。5V 差 でも 300 Ωなら 16.7 mA なので 問題にはならないはず。

    • TPI_RESET については 相手がプルアップしているだけ。Hi-Z / L で駆動するなら 直結でも良さそうだが、一応抵抗をいれておく。

    • ちゃんとしたければ レベルシフタを入れる。.... として 回路はともかく制御用の信号線は考えておかないと。-- Enable と 送信/受信切り替え ?

    ここの更新をサボッていた。現在 1.4 まで来た。だいたい UM162ボード用の更新。
    1.4

    • angle_loader の m32u4 版は 2KB を超える。これだけ超えるのが嫌なので、割り込みベクタを削った バージョンにして、すべてが 2KB 以内になるよう変更した。

      こうするのには、startup ファイルの変更が必要で、avr-ld を直接使うことになる。
      そうすると GCC やら avr-libc やらのパスが必要になって、設定が面倒になる。

      でも 100 バイト以上減るのは魅力で 対応することにした。


追記: 秋月 の arduuino もどき AE-ATmega が出てきた。

    基板の単価が 150円と格安。パーツセットも出るらしいから、数が出るだろう。
    eJackino と似てると思ったが、よくよく見たらパターンが同じっぽい。上の ユニバーサル基板用のコネクタがないだけだった。

    他にも相違点はあるようだ。(参考 → kosaka さんの記事)。
    ただ パターンの取り回しが良く似ているから、改造とかは同じような感じでできる。



    Teensy 1.0 互換でなく、AE-UM232R 互換にしておけばよかったかも。-- 次作るときのために検討しておこう。



    これが AE-UM232R まわり。



    配線を整理するとこうなる。

    で、UNO はこうなっている。

    PB1 (SLCK) ISP コネクタ
      PB2 (MOSI) ISP コネクタ
      PB3 (MISO) ISP コネクタ
    PD2 (RXD) arduino TXD
    PD3 (TXD) arduino RXD
    PD4 RX LED (L active)
    PD5 (XCK) TX LED (L active)
    PD7 (HWB) arduino DTR


    これも合わせるとこんな感じか。


          AE-UM232R 案
    TX TXD PD3(TXD)
    RX RXD PD2(RXD)
    DTR DTR# PD7(HWB UNO:DTR)

    TX_LED CB0 PD5(XCK UNO:TX_LED)
    RX_LED CB1 PD4(UNO RX_LED)

    X3 1 CTS# PB3(MISO)
    2 DSR# PB1(SCK)
    3 DCD# PB2(MOSI)
    4 RI# PB0(SS)

    RST RESET (パターンカット)

    RST は、VCC に直結されてしまっている。不要だと思うし、パターンカット前提で考える。
    無接続のピンは好きなようにわりあてるつもりだったが、無理そうなので NC でまず検討。

    ...とはいえ 配線は自分のスキルでは厳しい。

    追記:なんとか出来た。『AE-UM232Rピン互換ボード』の記事参照

デバッグの記録 ver 1.4 serjtag の動作確認

    1.4 では、DTR=1 で serial / DTR = 0 で serjtag という風にして 1 つのファームウェアで 通信機能とライタ機能を両立させることにした。

    で、serjtag の動作確認を avrdude-serjtag-04k で確認してみることにした。

    実を言うと serjtag 自体を動かすのは初めて。ただし serjtag の拡張機能に ADC 機能があるので それは、32u4 のボードで確認している。ADC 機能の 通信部分は avrdude から借用したのものなので、serjtag のプロトコルのみが動作未確認。

    とにかく、やってみたところ、ちゃんと動いた。

    $ avrdude.exe -c serjtag -P COM13 -p m32u2 -U flash:w:angel32u2_16M.hex

    Found programmer: Id = "SERJTAG"; Revison = 21
    avrdude.exe: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.00s

    avrdude.exe: Device signature = 0x1e958a
    avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be

    performed
    To disable this feature, specify the -D option.
    avrdude.exe: erasing chip
    Found programmer: Id = "SERJTAG"; Revison = 21
    avrdude.exe: reading input file "angel32u2_16M.hex"
    avrdude.exe: input file angel32u2_16M.hex auto detected as Intel Hex
    avrdude.exe: writing flash (32760 bytes):

    Writing | ################################################## | 100% 11.83s

    avrdude.exe: 32760 bytes of flash written
    avrdude.exe: verifying flash memory against angel32u2_16M.hex:
    avrdude.exe: load data flash data from input file angel32u2_16M.hex:
    avrdude.exe: input file angel32u2_16M.hex auto detected as Intel Hex
    avrdude.exe: input file angel32u2_16M.hex contains 32760 bytes
    avrdude.exe: reading on-chip flash data:

    Reading | ################################################## | 100% 13.36s

    avrdude.exe: verifying ...
    avrdude.exe: 32760 bytes of flash verified

    avrdude.exe done. Thank you.

    こんな風に出力されている。

  • -c serjtag -P COM13
    という風に ポートの指定も合わせてする。

  • 書き込んだ後、ただちに動作させたかったら -E reset を追加する。

  • write 11.83s / verify 13.36s というのは、遅いかも。現状では、ソフト SPI だし、delay の調整してないし こんなものだろう。

    ハードウェア SPI にして、delay の 設定を (プロトコル上の意味も含め)再検討することにしよう。
posted by すz at 21:59| Comment(0) | TrackBack(0) | USB162
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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