ESP32 を FT232H でつないで OpenOCD+GDBでデバッグ

# はじめに

ESP32 にデバッガを繋ぐ方法を書きます。

今時の統合開発環境に慣れてしまって、ブレイクポイントを仕掛けたり、変数の値を読み取ったりできない開発環境にはもう戻れない体になってしまったので、何とかしてみましたｗ

必要なものとしては、ハードウェアでは FT232H、ソフトウェアは OpenOCD と GDB です。GDB はESP-IDF(toolchainの方かも)の中に含まれてます。

新たに購入するものは秋月の **AE-FT232HL ￥1,200-** （と配線少々）のみです！

参考資料は [Debugging — ESP-IDF Programming Guide](http://esp-idf.readthedocs.io/en/latest/openocd.html) 他、ググりながら書いております。

#前提条件
[ESP32(ESP-WROOM-32)でLチカ (WindowsでESP-IDF使用) ](http://qiita.com/rukihena/items/d226972972a360fc2648)の環境構築が終わっていること

#ソフトウェアの準備

## OpenOCD

OpenOCD は、On-Chip Debugger のオープンな奴だと思うのですが、詳しいことは分かりませんｗ

JTAG と GDB の間に必要なモノなんだと思います。。。

とにかく必要なのでインストールします。パッケージはないみたいなので、ソースを取得してビルドします。

以降、MSYSのシェルでの作業です。

まず、OpenOCDのビルドに必要なパッケージを次のコマンドで取得します。

`pacman -S libtool pkg-config automake autoconf mingw-w64-i686-libusb`

（Windows+MSYS環境で必要最小限のパッケージを調べるのに苦労しました。）

次に、OpenOCDをESP32対応させたもののソースを取得します。作業ディレクトリはMSYSのホームディレクトリでいいと思います。

`git clone --recursive https://github.com/espressif/openocd-esp32.git`

ビルド作業に必要な環境変数を設定します。

`export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/mingw32/lib/pkgconfig`

ビルドします。

`cd openocd-esp32`
`./bootstrap`  ←数秒
`./configure`  ←数分
`make`  ←10分以上
`make install`  ←1分ぐらい

*追記 2017/05/05*
*最新版(2017/04/24) のソースをmakeすると、esp108_apptrace.cの630行目で符号付きと符号なしの比較をしていると怒られてしまいます。*
*右辺の wr_chunk_len を int でキャストするとコンパイルが通ります。*

公式文章では make install をしてないんですが、個人的にはインストールしたほうが好きなので、そうしたことを前提に話を進めていきます。

ちなみにバイナリ本体は `/usr/bin/openocd` に、設定ファイル類は `/usr/share/openocd/` にインストールされてます。


ビルド・インストールが終わったので、`openocd-esp32` フォルダは不要となります。

`cd ..`
`rm -Rf openocd-esp32` ←やらなくてもいい

次に OpenOCDの設定ファイルを作ります。

元となる設定ファイルを次のURLから取得します。

https://raw.githubusercontent.com/espressif/esp-idf/master/docs/esp32.cfg

curl コマンドが使えるので、それで取得しましょう。（自分はwget派なんだけど入ってなかった）

`curl -O https://raw.githubusercontent.com/espressif/esp-idf/master/docs/esp32.cfg`

そして、取得した esp32.cfg を以下の通り書き換えます。

`source [find interface/ftdi/tumpa.cfg]`
を
`source [find interface/ftdi/um232h.cfg]`
に

`adapter_khz 200`
を
`adapter_khz 2000`
に

`esp108 flashbootstrap 1.8` の先頭に#を付けてコメントアウト
`#esp108 flashbootstrap 3.3` の # を削除

コメントを除いて必要な部分だけ抜き出すを以下のようになります。

```txt:esp32.cfg
source [find interface/ftdi/um232h.cfg]
transport select jtag
adapter_khz 2000
source [find target/esp32.cfg]
esp108 flashbootstrap 3.3
```

コピペして作る場合は改行コードに注意してください。(CR+LFでなく、LFだけにしましょう)



# ハードウェアの準備

ESP32との接続には、秋月電子の[ＦＴ２３２ＨＬ　ハイスピードＵＳＢシリアル変換モジュール [AE-FT232HL]](http://akizukidenshi.com/catalog/g/gK-06503/) を用います。

![K-06503.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/8cb9875f-2eac-e525-2d15-83c6919f9c96.jpeg)

MPSSE(JTAG)機能が使えることが条件なので、ESP32のプログラム書き込みによく用いられているFT232RLは使用できません。

プログラム書き込み自身にはFT232RLでも可です。

図で表すと、下図のようになります。

![FT232HL.png](https://qiita-image-store.s3.amazonaws.com/0/104360/742e200f-1a2e-a34c-babe-5de4832e1f03.png)

水色のところが既存配線で、今回新たにオレンジ色の部分の接続をします。（詳細は後で）

flash書き込みにFT232HLを用いることも可能ですが、コストメリットがありませんし、同じものが2つあると混乱すると思いますｗ

尚、2ch品1個でまとめることができるのかは、試してないのでわかりませんが、たぶんいけそうな気がしています。 追記→[成功しました](http://qiita.com/rukihena/items/d530e2751cb258b4eab3)

## ドライバインストール

FT232HL のドライバをインストールします。USBポートに挿すと最初は仮想COMポートとして認識されると思いますが、それでは JTAG の機能が使えないので、ドライバを置き換える必要があります。

ドライバの置き換えは手動でやると面倒なのですが、置き換え専用の便利なアプリが存在します。

http://zadig.akeo.ie/ から **Zadig for Windows Vista or later** をダウンロードしてそれを使います。

ダウンロードした Zadig を起動し、Options → List All Devices を ON にします。

![Zadig1.png](https://qiita-image-store.s3.amazonaws.com/0/104360/4d0b52d5-122b-24b0-e999-e34ac289a5c8.png)

USBデバイス一覧（一番上のドロップダウンリスト）から Single RS232-HS を選び、置き換え後のドライバに WinUSB を選択し、Replace Driver をクリックします。

![Zadig2.png](https://qiita-image-store.s3.amazonaws.com/0/104360/18b76866-40c8-ba9d-c78b-6816fede5262.png)

置き換えると、デバイスマネージャーから見えていた仮想COMポートが消えて、ユニバーサル シリアル バス デバイス の下に、Single RS232-HS が現れます。

尚、FT_Prog で FT232HL の EEPROM を書き換える必要はありません。

## 配線

AE-FT232HL と ESP32 の配線は以下の5本をつなぐだけです。

| AE-FT232HLピン名 | 信号名  | ESP32ピン名 |
|----:|:---:|:-----|
| AD0 | TCK |GPIO13|
| AD1 | TDI |GPIO12|
| AD2 | TDO |GPIO15|
| AD3 | TMS |GPIO14|
| GND | GND |GND|

もちろんこの他に、今までと同様の、書き込み用の配線も必要です。

![DSC_0875.JPG](https://qiita-image-store.s3.amazonaws.com/0/104360/dbcdb739-b27b-8798-b014-ecf55d657261.jpeg)

この写真の例では、書き込み用のシリアルに自作の自動書き込み回路を使っています。

# 使ってみる

## OpenOCD起動

MSYSのシェルで

`openocd -s /usr/share/openocd/scripts/ -f ./esp32.cfg`

で起動します。最後の esp32.cfg は、先ほど作った esp32.cfg のことです。パスが合うように指定しましょう。

初回起動時は Windows ファイアウォールが反応します。許可してあげてください。OpenOCDはTCP:3333と3334を使用します。

正しく動作していれば、コンソールに以下の様に出力されます。

```
$ openocd -s /usr/share/openocd/scripts/ -f ./esp32.cfg
Open On-Chip Debugger 0.10.0-dev-g90071eb (2017-02-26-14:59)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
adapter speed: 2000 kHz
force hard breakpoints
Info : clock speed 2000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32.cpu0: Debug controller was reset (pwrstat=0x5F, after clear 0x0F).
Info : esp32.cpu0: Core was reset (pwrstat=0x5F, after clear 0x0F).
```

## GDB起動

デバッガのCUIフロントエンド、GDB を起動します。

MSYSのシェルをもうひとつ開いて、開発中のソースがあるプロジェクトフォルダに移動し、次のコマンドを打ちます。

`xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/app-template.elf`

最後の elf ファイルが、ESP32に書き込んだバイナリと同じものになるようにしてください。

起動すると、メッセージが出力された後、GDBのプロンプト (gdb) が表示されます。

```
$ xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/app-template.elf
GNU gdb (crosstool-NG crosstool-ng-1.22.0-61-gab8375a) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-host_pc-mingw32 --target=xtensa-esp32-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./build/app-template.elf...done.
Remote debugging using localhost:3333
0x00000000 in ?? ()
(gdb)
```

さて、gdb を使っていきましょう！ と言いたいところですが、私は使い方を知りませんｗ

OpenOCD が起動していると、ESP32をリセットしたあとOpenOCDでブレイクがかかってLチカしなくなることは確認できると思います。GDBで再開したいのですが再開コマンドが分かりませんでした！！

しかし、GDBの調査はしません (｀・ω・´)ｷﾘｯ

[ESP32をEclipse上でデバッグする](http://qiita.com/rukihena/items/f758105d3ed6dc6dae87) に続きます。