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 |