[[FrontPage]] #contents 2014/07/21からのアクセス回数 &counter; U-BootやuCLinuxの移植記事が雑誌にでているのですが、ボードが高くて簡単にはできません。 そこで、買って袋に入ったままの [[SAM-LA2>https://www.olimex.com/Products/ARM/Atmel/SAM7-LA2/]] を使ってみようと思います。 &ref(SAM7-LA2.png); ** SAM7-Pxxxの復習 [#z84b8f84] 一番最初に使ったARMのマイコンボードが、SAM7-Pxxxです。何とかMacOSXで動かしてみようと 試行錯誤してまとめたのが、[[arm/LED点灯の作成とデバッグ]]です。 その後、MacOSXでもOpenOCDが使えるVersaloonの関連記事をトラ技に投稿しました。 OpenOCDの進歩で[[arm/LED点灯の作成とデバッグ]]の記事のコンフィグファイルがそのまま使えない ことが分かり、SAM-PxxxをOpenOCDでデバッグするところから復習することにします。 Versaloon対応のOpenOCDの作り方は、内容はちょっと古いですが [[arm/Versaloon対応OpenOCDの作成]] を参考にしてください。 &ref(SAM7-Pxxx_Versaloon.png); *** Versaloonコンフィグの修正 [#lc739e7d] Versaloonは、SWDの他JTAGもサポートしているのでSAM7-Pxxxもデバッグできるはずなのですが、 最初は上手く動きませんでした。 調べて見るとvsllink.cfgにJTAGトランスポートの選択(transportコマンド)がありませんでしたので、 openocdの共有ディレクトリ/script/interface/vsllink.cfgを以下の様に変更します。 #pre{{ # # Versaloon Link -- VSLLink # # http://www.simonqian.com/en/Versaloon # interface vsllink transport select jtag }} *** AT91SAM7-Pxxx(at91sam7s64.cfg)のコンフィグファイル [#ja4c231b] AT91SAM7-Pxxxのコンフィグファイルは、 [[at91sam7s64.cfg>https://code.google.com/p/armboard/source/browse/trunk/software/openocd/target/at91sam7s64.cfg?r=94&spec=svn94]] を参考にしました。 AT91SAM7Sでは、ボードスキャンとJTAG-ICEの2つのJTAGを持っているため、以下の警告が 出力されます。 #pre{{ Info : JTAG tap: at91sam7s64.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) Warn : JTAG tap: at91sam7s64.cpu UNEXPECTED: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) Error: Trying to use configured scan chain anyway... }} これは、SAM7シリーズの特徴で、JTAG用にBSDとICEの2つをサポートしているからです。 - ボードスキャン(BSDのジャンパーを閉じる) - JTAG-ICE(BSDのジャンパーをオープン) そこで、at91sam7s64.cfg内で、以下の様にCPUTAPIDを追加し、jtagコマンドにCPUTAPIDを 知らせます。 #pre{{ if { [info exists CPUTAPID ] } { set _CPUTAPID $CPUTAPID } else { set _CPUTAPID 0x3f0f0f0f } jtag newtap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID }} 以下のファイルをopenocdの共有ディレクトリ/script/targetにコピーしてください。 - &ref(at91sam7s64.cfg); *** openocd.cfgの変更 [#e05a5372] OpenOCDのコンフィグファイルも書き方が変わり、フラッシュの書き込みで以下のようなエラーが困りました。 #pre{{ flash probe 0 flash : command requires more arguments }} Sparkfunのフォーラムの [[hsutherl氏のコメント>https://forum.sparkfun.com/viewtopic.php?f=18&t=33789]] で解決できました。((感謝)) 最終的なopenocd.cfgは、以下の様になりました。 #pre{{ # OpenOCD at91sam7s64.cfg with Flash proc telnet_port 4444 gdb_port 3333 source [find interface/vsllink.cfg] source [find target/at91sam7s64.cfg] # 以下のURLのhsutherl氏のコメントを参考 # https://forum.sparkfun.com/viewtopic.php?f=18&t=33789 set _FLASHNAME $_CHIPNAME.flash flash bank $_FLASHNAME at91sam7 0x00100000 0 0 0 0 $_TARGETNAME proc flash_program {ELF_FILENAME} { halt flash probe 0 flash write_bank 0 $ELF_FILENAME 0x0 echo "flash program complete. reset and run" resume exit } init halt }} *** OpenOCDを使ったデバッグ [#f62e3bb9] RAMベースのプログラムのデバッグは、 [[arm/LED点灯の作成とデバッグ]] に従ってデバッグを設定します。 デバッグのコンフィグタブのInitialize commands以下の様に変更し、Run Commandsは空のままにしてください。 #pre{{ target remote localhost:3333 set remote hardware-breakpoint-limit 2 monitor reset halt load monitor reset init thbreak main }} MacOSXでは、VersaloonのCDCがOSのドライバーに取られしまうため、一時的にそれをいったん止めます。 #pre{{ $ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDC.kext }} 元に戻すには、 #pre{{ $ sudo kextload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDC.kext }} *** 動作確認 [#n688a10a] 準備ができたので、ターミナルでopenocdを起動します。 #pre{{ $ /usr/local/bin/openocd -f openocd.cfg $ /usr/local/bin/openocd -f openocd.cfg Open On-Chip Debugger 0.5.0-dev-00783-g0123985-dirty (2014-07-17-17:17) Licensed under GNU GPL v2 For bug reports, read http://openocd.berlios.de/doc/doxygen/bugs.html Warn : must select a transport. Warn : use 'at91sam7s64.cpu' as target identifier, not '0' Error: Fail to receive usb data, error string is Operation timed out. Info : Versaloon(0x15)by Simon(compiled on Jan 29 2011) Info : USB_TO_XXX abilities: 0x0000024F:0x010001EF:0xC0000007 Info : RCLK (adaptive clock speed) Info : JTAG tap: at91sam7s64.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) Info : Embedded ICE version 1 Info : at91sam7s64.cpu: hardware has 2 breakpoint/watchpoint units target state: halted target halted in ARM state due to debug-request, current mode: System cpsr: 0x200000df pc: 0x00000184 }} *** ROMベースのプログラムのデバッグ [#c40bd8c9] フラッシュROMへの書込は、以下の手順で行います。 #pre{{ $ /usr/local/bin/openocd -f openocd.cfg -c "flash_program main.bin" }} *** ROMでのブレークポイントの使い方 [#k0172fde] ROMベースのプログラムでは、ハードブレークポイントが2個しか使えず、 Eclipseからのブレークポイントは使えません。 そこでプログラムが停止している時に、Eclipseのgdbコンソールでthbreakコマンド を入力してEnterを押すことで一時ブレークポイントがセットできます。 ((この時、breakpointのタブに2個以上のブレークポイントがセットされてないように してください。)) #pre{{ thbreak 関数名 または thbreak ソースファイル名:行数 }} &ref(thbreak.png); プログラムを途中で停止して、ブレークポイントをセットする場合には、 以下の様に停止してからブレークポイントをセットしてください。 #pre{{ $ telnet localhost 4444 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > halt }} ** コメント [#icad787b] #vote(おもしろかった,そうでもない,わかりずらい) #vote(おもしろかった[1],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。 スパム防止に画像の文字列も入力してください。 #comment_kcaptcha