TITLE:Open On-Chip Debugger #norelated #contents *はじめに [#b2c69717] オープンソースとして公開されている各種JTAG-ICEに対応したデバッガです。マイコン上のプログラムをデバッグする事だけが目的というわけではなく、マイコンに接続ないし内蔵された様々なメモリへのアクセスも出来ますので、単体でマイコン内蔵のFLASH書き込みツールとしても便利に使えます。~ ここではARM7に主眼を置いていますが、OpenOCDとしてはARM7 (ARM7TDMI, ARM720t), ARM9 (ARM920T, ARM922T, ARM926EJ-S, ARM966E-S)・XScale (PXA25x, IXP42x)・Cortex-M3 (Stellaris LM3, ST STM32F1, ST STM32F2, ATMEL SAM3等)のデバッグ、CFI compatible NOR フラッシュ (Intel, AMD/Spansion)・各種マイコン内蔵フラッシュ (LPC2000, LPC1700, AT91SAM7, SAM3, SAM4, STR7x, STR9x, LM3, STM32F等)の書き込み等をサポートしますので、興味があれば本家のサイトを参考に使ってみてはいかがでしょう。 *使用する前に [#z925cbc3] ** 公式サイト [#v2609b12] [[http://openocd.sourceforge.net/]]~ [[メーリングリスト:http://sourceforge.net/mail/?group_id=274635]] **OpenOCDの構成イメージ [#o7baebc0] OpenOCDによって構成できるシステムの概略イメージです。 #ref(oocd_diaglam.png) OpenOCDはPC内でネットワークのデーモンとして実行され、割り当てられたポートに対して種々のアプリケーションからアクセスし、OpenOCD及びJTAG I/F Hardwareを介してターゲットとコンタクトする形を取るのが一般的の様です。 *コンパイル済みバイナリの提供 [#w4125957] OpenOCD自体はソースから使用者自ら構築するのが通常ですが、[[TINY JTAG-ICE2]]を有効に活用するためにWindows上で動作するバイナリを提供しています。I/Fないしチップは[[TINY JTAG-ICE2]], [[J-LINK:http://www.segger.com/jlink.html]], [[FT2232:http://www.ftdichip.com/Products/FT2232D.htm]], [[ST-Link:http://www.st.com/ja/development-tools/st-link-v2.html]], [[CMSIS-DAP:http://www.arm.com/cmsis]]に限定し、以下の様な操作で[[MSYS2>https://www.msys2.org/]]上でコンパイルしています。 # git clone git://git.code.sf.net/p/openocd/code openocd # cd openocd # make distclean # git pull origin master # ./guess-rev.sh # ./bootstrap # ./configure --build=mingw32 --host=mingw32 --disable-dependency-tracking --disable-werror --enable-dummy --enable-jtag_vpi --enable-remote-bitbang --enable-amtjtagaccel --enable-gw16012 --enable-parport --enable-parport-giveio --enable-usbprog --enable-jlink --enable-stlink --enable-usb_blaster_libftdi # make [[OpenOCD_x86_0.11.0+dev-00626-g92c4e634d:https://www.besttechnology.co.jp/download/OpenOCD_x86_0.11.0+dev-00626-g92c4e634d.zip]]~ [[OpenOCD_x64_0.11.0+dev-00626-g92c4e634d:https://www.besttechnology.co.jp/download/OpenOCD_x64_0.11.0+dev-00626-g92c4e634d.zip]]~ [[OpenOCD_x86_0.11.0+dev-00615-gbe0d68eb6:https://www.besttechnology.co.jp/download/OpenOCD_x86_0.11.0+dev-00615-gbe0d68eb6.zip]]~ [[OpenOCD_x64_0.11.0+dev-00615-gbe0d68eb6:https://www.besttechnology.co.jp/download/OpenOCD_x64_0.11.0+dev-00615-gbe0d68eb6.zip]]~ [[OpenOCD_x86_0.11.0+dev-00590-g2586fec92:https://www.besttechnology.co.jp/download/OpenOCD_x86_0.11.0+dev-00590-g2586fec92.zip]]~ [[OpenOCD_x64_0.11.0+dev-00590-g2586fec92:https://www.besttechnology.co.jp/download/OpenOCD_x64_0.11.0+dev-00590-g2586fec92.zip]]~ [[OpenOCD_x86_0.10.0+dev-01524-g861e75f54:https://www.besttechnology.co.jp/download/OpenOCD_x86_0.10.0+dev-01524-g861e75f54.zip]]~ [[OpenOCD_x64_0.10.0+dev-01524-g861e75f54:https://www.besttechnology.co.jp/download/OpenOCD_x64_0.10.0+dev-01524-g861e75f54.zip]]~ [[OpenOCD_0.9.0-dev-00874-g2d4ae3f-ft2232only:https://www.besttechnology.co.jp/download/OpenOCD_0.9.0-dev-00874-g2d4ae3f-ft2232only.zip]]~ [[OpenOCD_0.8.0-rc2-dev-00456-g7ad635b-ft2232only.zip:https://www.besttechnology.co.jp/download/OpenOCD_0.8.0-rc2-dev-00456-g7ad635b-ft2232only.zip]]~ ※0.10.0-rc1以降のバイナリからWinUSBベースに変更したので、デバイスドライバは[[こちら>BTE067B#ocfdb851]]の手順でインストールの事 #ref(openocd.pdf) *適用可能なJTAG I/F [#daff3a4e] **TINY JTAG-ICE2 (FT2232ベース) [#idb7863a] 市販品は星の数ほどありますが、似た回路で自作するのも有りです。最新のデバイスドライバ等の詳細は[[TINY JTAG-ICE2]]のページで確認してください。 **ST-LINK/V2 [#e6f98130] [[WinUSB>https://msdn.microsoft.com/en-us/library/windows/hardware/ff540174.aspx]]のデバイスドライバに入れ替える必要があります。 +Zadigのサイトよりドライバのインストールツールをダウンロードします。 [[http://zadig.akeo.ie/]] +ダウンロードしたZadigのツールを起動します。 #ref("BTE067B TINY JTAG-ICE2/Zadig_1.png")~ +メニューの「Options」→「List All Devices」をクリックした後、リストに「STM32 STLink」が含まれていることを確認し選択します。 #ref("BTE067B TINY JTAG-ICE2/Zadig_2.png")~ #ref(Zadig_3.png,80%)~ +最後に入れ替えるドライバのリストから「WinUSB」を選択し、「Replace Driver」ボタンを押せばインストールは完了です。 +デバイスドライバを入れ替えてしまうとST社から提供されているツール類では使用できなくなりますので、元に戻したい時はデバイスマネージャから手動でデバイスドライバを入れ替えて下さい。 **J-LINK [#j891569e] 最近のパッチでかなり広い範囲でJ-LINKのサポートがなされています。各社の評価キットを購入して余っている[[J-LINK:http://www.segger.com/jlink.html]]がOpenOCDで使える可能性がありますので、試してはどうでしょう。~ Linuxでは当然の様につなげば直ぐに使える状態になりますが、Windowsではそうもいきません。OpenOCDにおいてはUSBデバイスのアクセス方法がLinuxの流儀に大体従っているため、かなり低レベルの所からUSBを制御できる環境が必要です。OpenOCDにおいてはlibusbのWindows版である[[libusb-win32:http://sourceforge.net/apps/trac/libusb-win32/wiki]]を仲介する事でJ-LINKへ直接制御をかけられる様になります。~ libusb-win32をインストールしても問題ない環境であれば良いのですが、PC丸ごとおかしげになるのが普通ですので止めるべきです。ここではJ-LINK用のinfファイルを構成し、J-LINKのみのデバイスドライバを置き換える方法を紹介します。 -[[libusb-win32のダウンロード:http://sourceforge.net/project/showfiles.php?group_id=78138]]から[[libusb-win32-bin-1.2.6.0.zip:http://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip/download]]を落としてくる。 -J-LINKをPCに接続し、ダウンロードしたファイルを適宜解凍してbin/x86フォルダにあるinf-wizard.exeを実行。~ #ref(libusb-bin.png) -USBにつながったデバイスが列挙されるので、J-LINKに該当するデバイスを選択し、Next>をクリック。~ #ref(inf-wizard.png) -ベンダIDやプロダクトIDが表示され、間違いが無ければNext>をクリック。~ #ref(inf-wizard2.png) -保存先とファイル名を聞いてくるので、適宜入力し保存をクリック(ここではひとまず「J-LINKforOOCD.inf」としている)。~ #ref(j-link_saveinf) -最後にFinishを押すと2つのファイル(J-LINKforOOCD.catとJ-LINKforOOCD.inf)が作られる。binフォルダ内にある4つのフォルダを今作ったinfファイルにコピーしてデバイスドライバ一式が完成。 #ref(j-link_inf_sys_dll.png) -[[SEGGER社のJ-LINKソフトウェア:http://www.segger.com/download_jlink.html]]のデバイスドライバが適用されているのであれば、デバイスマネージャで先ほど作ったデバイスドライバへ手動で入れ替える。不明なデバイス状態もしくはデバイスドライバを要求された場合も、先ほどのデバイスドライバを適用すれば準備完了。 J-LINKソフトウェアにおいてライセンスを登録しない場合に利用制限を受けるJ-LINKが、うまくゆけばOpenOCDで活用できるかもしれません :p 。~ J-LINKソフトウエアで使用したくなったら、デバイスドライバを元の物に入れ替えれば良いまでです。 *その他 [#bba86000] ターゲットによって使用方法が異なる部分が多いため、[[ドキュメント:http://www.besttechnology.co.jp/modules/knowledge/gate.php/openocd.pdf?way=attach&_noumb&refer=OpenOCD&openfile=openocd.pdf]]を参考にしてもらうのがベストです。ここで一生懸命日本語訳しても、あっという間に陳腐化して全く使い物になる代物ですので。~ 動かすまでの大まかなネタは、~ -OpenOCD.exe単体では実行しても何事もなかったように終了してしまう。実行時に諸々記述したオプションを指定し、使用するUSB接続のJTAG I/Fを接続した状態でしか使用できない。 -設定ファイルのある場所を検索させるには、-sオプションを付加して起動。 -何が起こっているのか詳細に知りたい時は-d 3を指定すると、内部状況をつぶさにコンソールに吐き出す。そのログをファイルに保存するオプションもあり。 -shutdownコマンドを記述しない設定ファイルを指定して起動すると常駐する。また、設定ファイル内にtelnet_portの指定があればtelnetのデーモンとなるので、指定されたポートへtelnetクライアントを使ってログインできる。使用できるコマンドはhelpで参照可。 -Windows環境で動くと言っても、自らウィンドウを持つプログラムではない。コマンドプロンプト内でひっそり動いている。強制終了するならそのコマンドプロンプト内で[CTRL]+[C]を入力するか、コマンドプロンプトのタイトルバーの×を押すが程度。 -設定ファイルにgdb_portの設定があれば、gdbからそのポートへアクセスしgdbのコマンドを使用してターゲットの制御が可能。 -FLASH WRITERのCPU TYPEにOpenOCDが指定されていると、FLASH WRITERはOpenOCDのtelnetデーモンにログインし、FLASH WRITERのWrite Script Fileに従ってコマンドを送信できる。先のtelnetクライアントにて手動でコマンドを叩くといった操作を自動化できるので、複数のコマンドを併用する必要があるターゲットのフラッシュROMの書き込み処理に使用してるだけ。 -日本語は理解してくれないので、ファイル名等は半角英数字でなくてはならない。 -設定ファイルの類の改行コードがCR+LFだと解釈しないので、必ずLFのみにする事。 -全く同じ回路であっても、ターゲット間をつなぐケーブルの長さ等の条件によって両者で同じ設定で同様に動くとは限らない。JTAGラインのプルアップ/ダウン・コネクタの接触抵抗・ノイズの影響等を考慮しながらJTAGのスピードを調整する。速ければ良い物でもない。 -予め用意された設定ファイルはよく見かける主要なマイコン用の物しか用意されていない。似たような型番だからといって同じ設定ファイルが使えるわけでもないので、新しいデバイスに対応させるにはそれ相応のスキルが必要。 -チップ内蔵のフラッシュROMに書き込むだけならOpenOCDを使うメリットは無く、サポートされていないチップの方が遙かに多い。メーカの提供するツールを適用する方が良い。
(This host) = https://www.besttechnology.co.jp