| Previous Post | Top | Next Post |
TOC
前々回・前回は、Arduino Uno/Nano に使われている基本のシリアルAVRの ATmega328P のプログラムの勉強・練習をしました。その結果チップ周辺の配線状態 確認をホストPCのターミナルからするシェルのような avrmon を書きました。
今回は基本のUSB AVRの ATmega32u4 を中心としたAVRチップのプログラム方法とその環境に関して、 調査と情報の整理をします。
ATmega32u4開発ボード
ATmega32u4を5V 16MHzで使う開発ボードをしては、 Arduino Leonardo、 Arduino micro、 SparkFun Pro Micro、 RobotDyn Micro ATmega32U4-MU、 Teensy 2.0などや そのコンパチ品が通販サイト(例えば、 banggood、 aliexpress、 ebay )で出回っています。私はTeensy 2.0のコンパチ品を入手しました。
AVRへのプログラム導入
ATmega32u4へのプログラム導入アプローチは、 ATmega328Pへのプログラム導入アプローチ より選択肢が多く混乱しがちなので、以前書いた英語のメモ( Serial AVRや USB AVR )をベースに、日本語で以下に比較しながら状況を確認と整理をします。
Serial AVR
Serial AVR (ATmega328P等) では、チップにプログラムを導入するのに 主に2つのアプローチがあります:
- ISP:
- ホストPC上で
avrdudeをISPモードで走らせ、AVR ISP mkII等の プログラマー経由でSPIポートに接続しATmega328Pを、ハードウエアー だけを用いチップを書き換えます。
- ホストPC上で
- Serial:
- ホストPC上で
avrdudeをArduinoモードで走らせ、D0/D1ピンに TTLレベルのRS-232C接続経由で、チップの上位アドレスに置かれた ブートローダーソフトの助けを受け、チップを書き換えます。 - 開発ボード上に、FT-232R や CH340 等のUSB-Serial変換チップが 載っている場合、ホストPCから外見的にはUSB接続に見えます。
- 昔のAtmel STK500 や、昔のArduinoにはブートローダー(4KB)が導入済みです。 Firmwareを探すときにこれらの古いのを踏まないように要注意です。
- 最近のArduino系の開発ボードでは、サイズを小さくしたブートローダー のOptiboot(512B)が導入済みです。(一押し!)
- ホストPC上で
USB AVR
USB AVR (ATmega32u4等) では、チップにプログラムを導入するのに 主に4つのアプローチがあります:
- ISP:
- ATmega328Pと全く同じ流れで、ハードウエアーだけを用いチップ を書き換えます。
- USB CDC:
- ATmega328PでのUSB-Serial変換チップ経由でのSerialアプローチと 全く同じ流れで、ブートローダーソフトの助けを受けて書き換えます。
- 最近のArduino系の開発ボードでは、ブートローダーソフトの Caterina(4KB, LUFAのCDCのブートローダーソースと同等品)が 導入済みです。
- SparkFun社はリセット挙動を改良した Caterinaブートローダー を公開しています。(一押し!)
- USB HID:
- USB接続のHID(キーボード・マウス等)デバイスとして認識される ブートローダーソフトの助けを受けてチップを書き換えます。
- ホストPC上で
teensy_loader_cli(GPL)、もしくはそのUSBデバイス IDを書き換えたLUFAのhid_bootloader_cliを走らせ、USB接続 チップを書き換えます。 - Teensy の純正品ではプロプライエタリーの小さなブートローダー (512B)が導入済みです。バイナリーにはロックがかかっていて 他の基板では使えませんし、コンパチボードには入ってもいません。
- LUFAのHIDのブートローダーソースはコンパイルすると4KB のブートローダーが作成可能です。
- LUFAのHIDのブートローダーとコンパチで、サイズを小さくした ブートローダーnanoBoot はGPL3で、コンパイルすると512Bのブートローダーが作成可能です。 (一押し!)
- HIDデバイスはドライバー導入がWINDOWS環境で不要でシステムへの 導入が楽だというメリットがあると聞きます。 (Linux環境ではあんまり関係無いです。)
- USB DFU:
AVRのプログラム環境
AVRのプログラム環境としては、いわゆるArduino環境がよく使われます。
ここでは深入りしませんが、Arduino環境はSTLを使わないC++言語環境で
独自のArduinoライブラリーを使うことで、ハードウエアーの細かな相違
をライブラリーの影に隠し、アプリケーションのプログラムを機能だけを
規定してできるようにさせてくれるプログラム環境です。だから、
Serial AVRとUSB AVRの違いはもとより、ARM系のMCUまでほぼ同じコード
でカバーでき、USBデバイスの使用も簡単です。Arduino環境のGUI部分は
本質的ではなく、arduino-mk(
Debian パッケージ、
githubサイト
)を使えば普通のエディターでソースが書けコマンドラインから各種処理
ができます。この様にArduino環境は非常に便利なプログラム環境なんで
すが、今私がしたいこととずれてます。
今の私のAVRのプログラム環境としては、PUREなC言語環境が良いです。 具体的には、avr-gcc をGNU拡張機能したC99環境で、avr-libcとともに 使うのが、コンパクトで分かりやすく勝手が良い気がします。これなら ハードウエアーに何をさせるのかを、PUREなC言語しか慣れていない初心 者の私にでも直截的に理解できます。
ATmega328Pをターゲットをしたavrmon を書いた際にはまさにこれで充分でした。実際には、最も複雑なホストPCと の通信がシリアル通信で、それが、UARTポートの状態を繰り返し読み確認する POLLING操作と、UARTポートへの直接書き込み・読み出し操作だけで簡単に実現 できたというのも、このアプローチがとれた背景ではあります。
まあ、現行プログラムの機能アップを狙い、シリアル通信を割り込み処理にして、 リングバッファー使用するようにしようとしても、比較的簡単にPUREなC言語で 実現できます。
ただ、avrmonのターゲットに ATmega32u4も加えようとしたら、USB関連の複雑な処理をどうするのかで 迷いました。
進むべき方向を探す参考にとPUREなC言語で書かれた、カスタムキーボード ファームウエアーのQMK Firmware を見てみると、USB関連の複雑な処理に LUFA を利用しています。LUFAは、USB AVRの各種ブートローダーソースや、 アプリケーションのファームウエアーをPUREなC言語環境で書く際に使える USBデバイス関連のライブラリーや、さらに多くの例示アプリケーション ソースとてんこ盛りです。素晴らしい内容ですが、大きすぎて食傷ぎみな ので、まずは将来の課題としておきます。
比較的コンパクトなATmega32u4を対象としたPUREなC言語でのプログラム 関連情報を探し他の参考情報源を調べました。
- MICROCHIP(旧ATMEL)の
ATmega32U4のDocuments
の中にも埋もれていたり、その次の世代のチップのソフトに関する
AVR USB Series6 Software Packages
サイトにまとめて出ている、以下の情報が特に気になります
- AN_7619 - AVR272: USB CDC Demonstration: UART to USB Bridge, on megaAVR with USB
- AN_7675 - AVR276: USB Software Library for megaAVR with USB Microcontrollers
- PJRCのTeensy USB Development Board
の中の「Code Library」埋もれているArduino系のTeensyduinoに
開発環境を移行する前のPUREなC言語環境のコード群(現在はobsolete扱い)
は参考になります。フリーなMITライセンスもキチッと表示されているので
使い安いです。
- USB: Debug Messages Only
- USB: Virtual Serial Port
- USB Serial, Version 1.7, source zip 割り込み処理は使っているがコンパクト。
- USB: Keyboard
- …
- ホスト側PCのThe HID Listen Program のソースコードも気になる。
- MEAM.Design : HomePage
(サーバーは有名大学の"UNIVERSITY OF PENNSYLVANIA" の所謂工学部"SCHOOL OF ENGINEERING AND APPLIED SCIENCE"所属)
にある、
The MAEVARM (M1 & M2) Projectや
The Teensy 2.0
の中の
ATmega32u4 : USB Communications
にあったAtmelのAVR CDCデモコードに関するコメントが気になった。
どうも、AtmelのAVR CDCデモコードは、小さいながらOSのスケジューラーの
ようなものを含む複雑な構成で使いにくいと言っているようです。確かに
AtmelのAVRデモコードにはいずれも
scheduler.cというファイル等があります。 簡単なUSBドライバーのソースとしてコンパクトな以下が挙げられてました。 (ライセンス表記無し。)これは、よく見ると実質は旧teensyと同じコードに、 一部の出力ヘルパー関数を足しただけです。
以上の観察から、avrmonの拡張は、 まずは、旧teensyのデモコードをベースにするのが良さそうです。 ただ、最近の開発環境に合わせてアップデートされていないので一部「const」 の追加等のタッチアップが必要です。 ArduinoのFAQ を参考にしてください。
ただ、将来はLUFA を利用すべきでしょう。その時はLUFA自体や AVR USB Devices and Programming 等を参考にします。
USB AVRのシリーズ
末尾の数字がデバイスの世代、その前の数桁の数字がフラッシュのKBサイズ
世代
- シリーズ 2: AT90USB162,AT90USB82, ATmega32U2, ATmega16U2, ATmega8U2 (メモリー・IOピン最小)
- シリーズ 4: ATmega32U4, ATmega16U4
- シリーズ 6: AT90USB1286, AT90USB646, ATmega32U6 (メモリー・IOピン増強)
- シリーズ 7: AT90USB1287, AT90USB647 (USBが機能制限付きホスト側にもなる、OTG対応)
サイズ
Flash page SRAM コメント
AT90USB82 8KB 128B 0.5 KB PS/2とUSBの兼用端子
AT90USB162 16KB 128B 0.5 KB PS/2とUSBの兼用端子
ATmega16u4 16KB 128B 1.25KB Arduino Uno (USB変換部分)
ATmega32u4 32KB 128B 2.5 KB Leonaldo, micro, teensy2.0、すべてHWB端子を接地
AT90USB646 64KB 256B 4 KB
AT90USB1286 128KB 256B 8 KB teensy2.0++
| Previous Post | Top | Next Post |