ラベル BeagleBoard の投稿を表示しています。 すべての投稿を表示
ラベル BeagleBoard の投稿を表示しています。 すべての投稿を表示

2013年3月31日日曜日

Flyswatter2 - OpenOCD 0.6.1

TincanTools Flyswatter2 とOpenOCD 0.6.1 によるJTAGデバッグについて

起動コマンドは以下になる
openocd -f scripts/interface/flyswatter2.cfg -f scripts/board/ti_beagleboard.cfg

だが、これはうまく起動できない場合が多い。
実行すると以下のようなエラーメッセージが表示される。


Open On-Chip Debugger 0.6.1 (2012-10-07-10:34)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
RCLK - adaptive
Warn : omap3530.dsp: huge IR length 38
RCLK - adaptive
trst_only separate trst_push_pull
Info : max TCK change to: 30000 kHz
Info : RCLK (adaptive clock speed)
Error: couldn't read enough bytes from FT2232 device (0 < 81)
Error: couldn't read from FT2232
in procedure 'runtest'
Error: JTAG scan chain interrogation failed: all ones
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Error: couldn't read enough bytes from FT2232 device (0 < 2)
Error: couldn't read from FT2232
Warn : Bypassing JTAG setup events due to errors
RCLK - adaptive
Error: couldn't read enough bytes from FT2232 device (0 < 81)
Error: couldn't read from FT2232


これはJTAG adaptive clockという仕組みがうまくbeagleboardとかみ合わない場合に発生するらしい。
詳しくはTincanToolsの説明を参照

エラーが発生してしまう場合はTincanToolsが公開しているadaptive clockを無効にした設定ファイルomap3530_norclk.cfgを用いる。
ダウンロードした設定ファイルは OpenOCDフォルダ/scripts/target/omap3530_norclk.cfgに保存

この設定ファイルを使って以下のコマンドで起動する
openocd -f scripts/interface/flyswatter2.cfg -f scripts/target/omap3530_norclk.cfg -c "init" -c "reset init"


以下のようなメッセージが表示されたら無事に起動


Open On-Chip Debugger 0.6.1 (2012-10-07-10:34)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
DEPRECATED! use 'adapter_khz' not 'jtag_khz'
adapter speed: 1000 kHz
Warn : omap3530.dsp: huge IR length 38
trst_only separate trst_push_pull
Info : max TCK change to: 30000 kHz
Info : clock speed 1000 kHz
Info : JTAG tap: omap3530.jrc tap/device found: 0x0b7ae02f (mfg: 0x017, part: 0xb7ae, ver: 0x0)
Info : JTAG tap: omap3530.dap enabled
Info : omap3530.cpu: hardware has 6 breakpoints, 2 watchpoints
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x540111c0
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x80000042, MEM_AP_TAR 0x540111c0
DEPRECATED! use 'adapter_khz' not 'jtag_khz'
adapter speed: 1000 kHz
Info : JTAG tap: omap3530.jrc tap/device found: 0x0b7ae02f (mfg: 0x017, part: 0xb7ae, ver: 0x0)
Info : JTAG tap: omap3530.dap enabled
Error: cortex_a8_mmu: target not halted
Runtime Error: embedded:startup.tcl:20:
in procedure 'omap3530.cpu'
in procedure 'ocd_bouncer'
at file "embedded:startup.tcl", line 20

Warn : omap3530.cpu: ran after reset and before halt ...
Info : number of cache level 2
Error: cache l2 present :not supported
Error: mpdir not in multiprocessor format
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0xa00001d3 pc: 0x80e88508
MMU: disabled, D-Cache: disabled, I-Cache: enabled



2012年8月10日金曜日

ターミナル入力・・・・UART+MMU+割り込み(2)

続き。

■仮想メモリ割り当て
設計したメモリマップにしたがって固定のページテーブルを作成する


■割り込み初期化手順
(1)CPUのIRQ割り込みハンドラを登録
(2)CPUの割り込み有効化
 asm ("cpsie i"); でIRQ有効化

(3)UARTにクロック供給
(4)UARTのIRQハンドラを登録
(5)UARTのIRQ出力有効化
 受信割り込みのみ有効化する。
  OMAP3530仕様書の2693ページ 17.6.1 UART/IrDA/CIRレジスタ IER_REGを参照
  IER_REGに1(RHR_ITビット)を書き込み

■割り込みハンドラ
IRQハンドラだけ作成
IRQ以外の割り込みは使用しないのでnop
ハンドラではレジスタをスタックに保存してIRQ処理に飛ぶ

.extern interruptHandler
.global interruptVector

_irq_entry:
    stmfd sp!, {r0 - r12, lr};

    mov r0, #6;
    bl interruptHandler;

    ldmfd sp!, {r0 - r12, lr};
    subs pc, lr, #4;

interruptVector:
    nop;    // Reset
    nop;    // Invalid code
    nop;     // Software Service.
    nop;     // Prefetch Abort
    nop;    // Data Abort
    nop;
    ldr pc, =_irq_entry;
    nop;    // Fast IRQ

■UART割り込みハンドラ
 UARTドライバの割り込みハンドラでは割り込み時にRHRから1文字読み取ってバッファに記録

■サンプル
ソースコード

2012年6月4日月曜日

ターミナル入力・・・・UART+MMU+割り込み

UARTの制御と割り込みを使ってターミナルから文字列を入力してそれを表示してみる。

■実装方針
1、メモリマップ
 物理メモリのアドレス=仮想アドレスを基本とする。
BeagleBoardは物理メモリが0x8000 0000~0x8FFF FFFF の256Mbyte
割り込みベクタは上位ベクタ0xFFFF 0000が使えるように割り当てる。
ハードウェアレジスタは256M分のメモリの上位、すなわち0x90000000~に割り当て
コードとデータはオフセット0x400000~に配置。その下をスタックとする
 以上の方針によりメモリマップは以下のように設定


2、割り込み駆動
UARTへの入力はポーリングによってバッファの状態を確認するのではなく、割り込みで入力を検知する。
BeagleBoardの端子はUART3に接続なのでIRQ74に対応するハンドラを登録する。
OMAP35x Technical Reference Manual 10.3.2 Interrupt Request Linesを参照

■メイン処理
(1)UART入力バッファが空か確認
(2)読み込み可能フラグが立つまで無限ループ
 →IRQ74が発生したらフラグを立てる
(3)バッファから1文字読み込み
(4)読み込んだ文字をUART出力
(5)(1)に戻る


2012年4月10日火曜日

UARTからHello World

次はUART出力からターミナルにHello Worldと表示することを目指す
まずは仕様書の確認

■BeagleBoard仕様書
BeagleBoard SRM


■OMAP3530仕様書
OMAP3530はBeagleBoardに搭載されているCortex-A8のマイコン
OMAP35x Technical Reference Manual


OMAP3530仕様書のを見ると2638ページ「UART/IrDA/CIR Overview」からUARTデバイスは3つ存在することがわかる
また、BeagleBoard仕様書の23ページ「5.18 RS232 Header」からBeagleBoardのシリアル端子はUART3に繋がっているとわかる
したがってUARTからPCのシリアルポートにHello Worldを出力するにはUART3を制御することになる

UART3を制御する手順は以下の通り

■制御手順
(1)OMAP3530 Perブロックの電源をON
OMAP3530仕様書の582ページを参照
PM_PWSTCTRL_PERレジスタのPOWERSTATEに0x3を設定

(2)OMAP3530 Perブロック内UART3にクロック供給
供給するクロックはFunctionクロックとInterfaceクロックの2つ
  OMAP3530仕様書の492ページを参照
  CM_FCLKEN_PERレジスタとCM_ICLKEN_PERレジスタのUART3ビットを立てる

(3)UART3初期化
OMAP3530仕様書の2697ページを参照
[1]MDR1_REGレジスタに0x7を書き込んでUART無効化(2716ページ)
  [2]LCR_REGレジスタに0x83を書き込んでConfigモードAに移行(2707ページ)
  [3]DLL_REGレジスタ、DLH_REGレジスタの2つでボーレート設定(2697ページ、2701ページ)
      DLL, DLHに設定する値の計算は2672ページ 17.4.4.1.1 UART Clock Generation: Baud Rate Generationを参照
    (*)x16モードで動作させた場合にボーレートを115200にするのはDLL=0x1A, DLH=0x00
  [4]LCR_REGレジスタに0x3を書き込んで通常モードに戻る
  [5]MDR1_REGレジスタに0を書き込んでx16モードで動作開始

(4)出力バッファの空き確認
LSR_REGレジスタのTX_FIFO_Eビットがクリアされるまでループする(2710ページ)

(5)文字を出力バッファに書き込む
   THR_REGレジスタに文字コードを書き込む(2698ページ)

(4)(5)を繰り返すことで文字列を出力


注意点はUARTレジスタは全て8ビットでアクセスすること

■サンプル
ソースコード




2012年3月27日火曜日

デバッグ実行

作成したwhileループするだけのアプリケーションをEclipseからデバッグ実行する

■手順
(1)OpenOCDを起動
 以前にセットアップしたOpenOCDを起動する
 Eclipseのメニュー「Run」-[External Tools」から「openocd」を選択

(2)Eclipseデバッガ起動設定
 Eclipseのメニュー「Run」-「Debug Configurations」を選択
 左のリストから「GDB Hardware Debugging」を選択して新規作成する

 Application には作成したアプリケーションkernel.elf を選択する


 DebuggerにはG++LiteをインストールしたフォルダにあるGDBを選択する
 OpenOCDはTCPポート3333で動作しているのでPort numberは3333にしておく


 Startupはデフォルトの設定に加えて「monitor reset halt」の記述を追加
 

 以上でデバッグ実行の設定は終わり


(3)ブレークポイントの設定
 ちゃんとブレークするかどうかMain.cpp#main_start()のwhileループにEclipse上からブレークを張る

(4)デバッグ実行
 (2)で設定したデバッグ設定でデバッグ実行を開始





 実行を開始するとブレークした状態で始まる。Debugウィンドウの再生ボタンぽいのを押して実行を継続するとMain.cppのwhileループに張ったブレークポイントまで実行して再度ブレークする

 とりあえずEclipseでソース編集、デバッグ実行するところまで環境が整った

2012年3月14日水曜日

デバッグ準備 - OpenOCD起動

いよいよデバッガを起動させる。
デバッグにはOpenOCDとCode Sourcery G++Liteが必要。

まずEclipseからOpenOCDを起動させる設定を行う
Eclipseメニューの[Run]-[External Tools]-[External Tools Configurations] を選択
Programとして新規項目を作成する







LocationにOpenOCDの実行ファイルを指定する
Working Directoryは適当に。
ArgumentはFlyswatterとBeagleBoardの組み合わせで使用するので以下のようにする

-f interface/flyswatter.cfg -f board/ti_beagleboard.cfg

[Run]ボタンを押して実行したら以下のようなコンソール表示が出たらOK


Open On-Chip Debugger 0.4.0 (2010-02-22-19:05)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/doc/doxygen/bugs.html
RCLK - adaptive
Warn : omap3530.dsp: huge IR length 38
RCLK - adaptive
trst_only separate trst_push_pull
Info : RCLK (adaptive clock speed) not supported - fallback to 1000 kHz
Info : JTAG tap: omap3530.jrc tap/device found: 0x0b7ae02f (mfg: 0x017, part: 0xb7ae, ver: 0x0)
Info : JTAG tap: omap3530.dap enabled
Info : omap3530.cpu: hardware has 6 breakpoints, 2 watchpoints
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x540111c0
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x540111c0

2012年3月10日土曜日

狩のための武装

何はともあれBeagleBoardとデバッグツールの購入
デバッグツールにはTincan tools社Flyswatterを使うことにした。

BeagleBoardはDigiKeyで注文。Flyswatterも同時に注文したかったけど残念ながら扱っていない様子
仕方ないのでFlyswatterは個人輸入サービスを使うことにした。
UNIPOSで扱っていたのでこちらで注文。
BeagleBoard接続用にBeagleBoard Adapter Kitというオプションがあるので、それも合わせて注文

今なら円高なのでどちらも安めに買えるかも♪

そうして届いたBeagleBoardとFlyswatterがこちら。


旅立ち


BeagleBoardという組み込み基板がある。
BeagleBoardといえばLinuxを動かしたり、Androidを動かしたりという記事を良く見かける。
それはそれで面白いのだが、出来ればOSを0から自分で作ってみたいと思う。

そこで無謀かもしれないがBeagleBoard上で動くOSを0から作る事にチャレンジする。
このブログはOSを「動かす」のではなく「作る」作業の記録。
主に自分のための作業記録だが、誰か他のエンジニアの役に立てば幸いである。

さぁ、では行こうか