Raspberry Pi Pico を AVR ISP にする

RasPi Pico を AVR ISP にする
Raspberry Pi Picoを使ってAtmel(現Microchip) AVR マイコンにプログラムを書き込んでみたい

0. 背景
- マイコン、できればAVRを久々に触りたくなった
- 手元の書き込み装置が軒並み使えなくなっていた
- Arduino as ISP がある
- 別にArduinoをやりたいわけではない
- 手元に Raspberry Pi Pico がある
- そうだ、 PicoをAVR ISP(rogrammer)にしよう

1. 準備
CMakeと適当なビルドツールをインストールしておく
環境: MacBook Pro 2024 (M4)
-
Getting started with Raspberry Pi Pico-series (リビジョン 15 October 2024) のセクション Manually Configure your Environment に従い、構成
cd pico-sdk git submodule update --init
(examplesのダウンロードは割愛)
-
ARM用のコンパイラ
arm-none-eabi-gcc
をインストール -
Raspberry Pi Picoの構成ツール picotool をクローン・ビルド・インストール
-
SDKのルートパスを環境変数
PICO_SDK_PATH
に設定しておく

2. プロジェクト構成
何も考えずにCMakeプロジェクトを構成
- ルートの
CMakeLists.txt
上方に以下を追記include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) pico_sdk_init()
- 出力ターゲットに対して以下を追記
pico_add_extra_outputs(<target_name>)

3. AVRのプログラミング
基本
AVRはそれ自体が持つSPIを用いてプログラムを書き込むことができる。
これを In-Circuit-Serial-Programming あるいは In-System-Programming という。
書込み器とターゲットMCUとの通信については AVR 910、コンピュータと書き込み器との通信については AVR 061 (STK500 v1), AVR 068 (STK500 v2) 等で文書化されている。
本稿ではSTK500 v1に準拠したISPの実装を目標とする。
書込み器とターゲットとの接続
以下のように結線する (電源やプルアップ抵抗などは省略)。

4. ISPコマンドプロトコル
プログラミングの開始
AVRのISP機能は、ピン RESET
がアサートされている間(=リセット中)にのみ利用できる。
リセットしてから一定時間待機したのち、コマンド Programming Enable を送信する。
(MCUとの通信はSPIモード0 (CPHA = 0, CPOL = 0) で行う)
0xAC 0x53 0x00 0x00
通信が正しく行われ、プログラミングモードを開始できた場合、ターゲットMCUは第3バイトの送信時に 0x53
を返す。
0x00 0x00 0x53 0x00
ターゲットMCU固有番号の取得
AVRマイコンは機種ごとに固有の番号を持っており、これはデバイスコードあるいはシグネチャバイトと呼ばれる。
たとえばATmega328では 1E 95 0F
、ATtiny2313では 1E 91 0A
などの値をとる。
ターゲットMCUのデバイスコードを取得するには、コマンド Read Signature Byte を送信する。
コマンドの第3バイトには、コードのどの部分を取得するかを指定する。
0x30, 0x00, 0x00, 0x00 // get LSB of signature bytes
ターゲットMCUは、第4バイトの送信時にシグネチャバイトの一部を返す。
ヒューズビットの取得
AVRマイコンにはクロック源やリセットピンの挙動を設定するためのレジスタのようなものをもつ。これをヒューズビット といい、下位(low), 上位(high), 拡張(ext) の3つが存在する。
ターゲットMCUのヒューズビットを取得するには、コマンド Read Fuse bits, Read Fuse High bits, Read Extended Fuse bits を送信する。デバイスコード取得コマンドと異なり、こちらは各バイトのために個別のコマンドが用意されている。
0x50, 0x00, 0x00 // low
0x58, 0x08, 0x00 // high
0x50, 0x08, 0x00 // extended

5. コンピュータとのインタフェース
プロトコル概要
今回実装するプログラマとコンピュータとは、 STK500 v1 で通信する。
先述の通り、本プロトコルの詳細は AVR 061 で文書化されている。
... under construction

いったんSTK500v1は実装できたのでクローズ、詳細はトップのコメントに記載したリポジトリを参照のこと!