Windowsでも最新版のavrdudeが使いたい！ - avrdude7.0をVisualStudioでビルドする 

# avrdudeについて
avrdudeは、AVRマイコンにプログラムやFuseビットを書き込むためのオープンソースのソフトウェアです。avrdudeの"dude"は、英語で「ヤツ、野郎」といった意味らしいので、"avrdude"は日本語に直すと「AVR太郎」みたいなニュアンスなんでしょうか。

本来、WindowsマシンからAVRにプログラムを書き込むには、AVRISPやAtmel-ICEといったAtmel(Microchip)社純正のツールを用意すると、Microchip社が提供するIDE（統合開発環境）であるMicrochip StudioからGUI操作でプログラムが書き込めます。ですが、これらの書き込みツールは高価で手が出しづらいです。avrdudeを使うことで、FTDI FT232Rといった汎用のUSB-シリアル変換チップや、Arduino as ISPなど、様々なハードウェアをAVR用プログラムライタとして使うことができます。

avrdudeのソースコードは[GitHub](https://github.com/avrdudes/avrdude)上で公開されています。2022年5月8日現在の最新リリースは7.0で、以前のバージョンに比べてUSBデバイスサポートが強化されているようです。しかし、執筆時（2022年5月13日）時点で、Windows上で実行可能なバイナリがリリースされていないため、ソースコードをダウンロードして自分でビルドする必要がありそうです。

## avrdude-serjtagからの移行
FTDI製のUSB-シリアル変換チップ（FT232Rなど）に搭載されている"Bitbang"機能を使用してAVRマイコンをプログラミングする方法として、すz氏が作成したavrdudeのフォークである"avrdude-serjtag"を使う方法がよく紹介されています。avrdude-serjtagは最終リリースが2009年末と、長らく更新されていません。Bitbangを使った書き込み機能は以前から本家のavrdudeにも取り込まれていました。しかし、バージョン6.4以前のavrdudeでは、Windows上でFTDIチップのBitbangを使うにはlibusbとlibftdiのライブラリを含めてビルドする必要があり、配布されているバイナリをそのまま使用してBitbang経由でのプログラミングはできませんでした。（詳しく調べていないので間違っている可能性あり）

今回のavrdude7.0ではハードウェア関連のサポートが強化されており、追加のライブラリを導入しなくともBitbangを使った書き込みが可能であり、満を持してavrdude-serjtagから乗り換えることができます。

# avrdudeをビルドする手順
avrdudeをWindows向けにビルドする手順については、[avrdude公式GitHubリポジトリのWiki](https://github.com/avrdudes/avrdude/wiki/Building-AVRDUDE-for-Windows-using-Visual-Studio)上で、丁寧に説明されています。英文が読める方は、Wikiの原文を読んで頂ければ本記事を詳しく読む必要はありません。
本記事でも、上記Wikiに準じた方法で、avrdudeのビルド手順について説明していきます。

Wikiによると、Windows向けにビルドするにはVisualStudio（2019以降）を使用することが推奨されています。私はVisualStudio Professional 2022を使用してビルドしました。

## 要求環境
VisualStudioに「C++によるデスクトップ開発」のワークロードをインストールし、オプションで「Windows用C++ CMakeツール」にチェックを入れる必要があります。

また、外部ツールとして、Flex（2.6以降）、Bison（3.7以降）を使用するので、実行可能バイナリを適当なディレクトリに保存してPathを通しておく必要があります。こちらは[GitHubリポジトリ](https://github.com/lexxmark/winflexbison/releases)にビルド済みのリリースが公開されています。私はVersion 2.5.25を使用しました。

## ローカルリポジトリにソースをクローンしてビルドする
VisualStudio 2019以降にはGitによるバージョン管理機能が標準搭載されています。Git CloneしてCMakeでソースをビルドするだけで実行可能なバイナリが入手できます。以下は[公式Wiki](https://github.com/avrdudes/avrdude/wiki/Building-AVRDUDE-for-Windows-using-Visual-Studio)からの抜粋（翻訳）です。

* VisualStudioを起動し、メニューから「Git」→「リポジトリのクローン」を選択し、URLに[https://github.com/avrdudes/avrdude](https://github.com/avrdudes/avrdude)を指定する
* ソリューション エクスプローラーから、クローンしたリポジトリのフォルダービューを開く
* CMakeプロジェクトが読み込まれるまでしばらく待つ
* メニューから「プロジェクト」→「avrdudeのCMakeの設定」を選択し、CMakeの設定を開く
* 「CMake 変数とキャッシュ」の中から「USE_EXTERNAL」の項目を探してチェックを入れる
* 編集した「CMakeSettings.json」ファイルを保存し、CMakeプロジェクトがリロードされるまで待つ
* メニューから「ビルド」→「すべてビルド」を選択してavrdudeをビルドする

プロジェクトのビルドが成功したら、out\buildフォルダ配下にavrdude.exeとavrude.confが見つかるはずです。環境によって異なりますが、恐らくこれらのファイルは上記フォルダよりさらに下のフォルダにあります。（筆者の環境では、 out\build\x64-Debug\src 配下にありました。環境によって異なりますが、概ねこのあたりにあるはずなので探してみてください。）

出力されたavrdude.exeとavrdude.confを、実行しやすいフォルダ（C:\avrdude-7.0\ など）に保存しておくと便利です。

### 注意点
* ビルドする前に、CMakeの設定でビルドターゲットとする環境を正しく設定してください（32bit版・64bit版・arm版など）。通常は現在の環境で動くビルドターゲットが設定されていると思います。
* CMakeがエラーを吐く場合は、メニューから「ビルド」を選択しても「すべてビルド」が表示されずにビルドできない場合があります。その場合は、要求環境を整えていないことが原因となっている可能性があります（Flex, Bisonを導入してパスを通していない場合など）。この場合は環境を整えてからVisualStudioを再起動してみてください。

# ビルドしたavrdudeを実行してみる
avrdudeはコマンドラインで動作するアプリケーションです。コマンドプロンプトやPowerShellなどから実行してください。何も引数を付けずに実行すると、コマンド例などが表示されます。
~~~~:Powershell
PS C:\avrdude-7.0> .\avrdude.exe
Usage: avrdude.exe [options]
Options:
  -p <partno>                Required. Specify AVR device.
  -b <baudrate>              Override RS-232 baud rate.
  -B <bitclock>              Specify JTAG/STK500v2 bit clock period (us).
  -C <config-file>           Specify location of configuration file.
  -c <programmer>            Specify programmer type.
  -D                         Disable auto erase for flash memory
  -i <delay>                 ISP Clock Delay [in microseconds]
  -P <port>                  Specify connection port.
  -F                         Override invalid signature check.
  -e                         Perform a chip erase.
  -O                         Perform RC oscillator calibration (see AVR053).
  -U <memtype>:r|w|v:<filename>[:format]
                             Memory operation specification.
                             Multiple -U options are allowed, each request
                             is performed in the order specified.
  -n                         Do not write anything to the device.
  -V                         Do not verify.
  -t                         Enter terminal mode.
  -E <exitspec>[,<exitspec>] List programmer exit specifications.
  -x <extended_param>        Pass <extended_param> to programmer.
  -v                         Verbose output. -v -v for more.
  -q                         Quell progress output. -q -q for less.
  -l logfile                 Use logfile rather than stderr for diagnostics.
  -?                         Display this usage.

avrdude version 7.0-20220508 (4601bee), URL: <https://github.com/avrdudes/avrdude>
~~~~

### Bitbang経由でのAVRマイコンのプログラミング
Bitbang経由で使用する場合のピンアサインは、avrdude.confファイルに記載されています。例として、Arduino Diecimila（およびその互換機）のX3ピンヘッダを使用する場合は、次のようになります。
~~~~:avrdude.conf
programmer
  id    = "arduino-ft232r";
  desc  = "Arduino: FT232R connected to ISP";
  type  = "ftdi_syncbb";
  connection_type = usb;
  miso  = 3;  # CTS X3(1)
  sck   = 5;  # DSR X3(2)
  mosi  = 6;  # DCD X3(3)
  reset = 7;  # RI  X3(4)
;
~~~~
こちらは実行例です。Windows Terminal上から実行してATmega328Pのヒューズビットを読み込んでみました。
![スクリーンショット 2022-05-12 220126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664037/708b901e-beaf-e16b-4191-5d7f2e6b27a5.png)

# 参考リンク
* [avrdude 7.0 Documentation](https://avrdudes.github.io/avrdude/7.0/avrdude.html)