2008/12/2

Neo FreeRunner 新手手冊 (6) 使用 Debug Board


Neng-Yu Tu (Tony Tu)

Debug Board 對一般應用程式開發人員來說, 可能並不是十分需要. 但是換個角度來說, Openmoko 擁有完全開放的硬體, 從網路上也可以下載 FreeRunner 以及 Neo1973 的硬體線路圖. 同時, Openmoko 的機器在設計上, 就已經將常用的 debug port 如 JTAG/UART/SPI/I2C 等介面連接到主板上的 Debug Connector, 或是將這些 test point 留在主板上容易接取的地方. 簡單來說 Debug Board 是 FreeRunner 設計完全開放硬體的一部分 ;) 如果要學習或練習嵌入式系統開發, 最好還是有 Debug Board 比較好.


Debug Board 留了 1 個 20 pin 的 JTAG 延伸插座, 以及 2 個 10 pin 的 UART/SPI/I2C 插座, 如果有需要, 焊上這些接頭, 就可以在其他的裝置上使用 Openmoko Debug Board. 不過需要注意的地方是, Debug Board 的 JTAG signaling 是使用 3.3v, 對於一些 1.8v 或 5v 的 JTAG signaling 裝置並不適用.

Openmoko 的 Debug Board 共有 3 個版本, 第 3 版 (v3) 跟前面兩個版本的差別在於: 修改了電源及完全符合 USB 規格的一些設計, 同時也將 FR 上 Debug port 預留的 SPI 及 I2C bus 接出到 Debug Board 上. 同時第 3 版的 Debug Board 也增加一個 GPIO 接腳設定功能, 讓 Debug Board 能透過 pull-high 電路讓 FR 上面的 NOR 可以開啟被寫入模式. Debug Board 的電路圖, 可以從以下網址下載.

http://downloads.openmoko.org/developer/schematics/

若要作 JTAG 和 UART 終端機的 Debug 功能, 這 3 個版本都可以達到一樣的功能. 同時 FreeRunner 預設的 u-boot 環境變數, Debug 輸出是 ttyACM0, 並不一定要使用 Debug Board 才能進行 u-boot 的操控.

Debug board 上有一顆 FTDI FT2232 的晶片, 它本身具備有兩個 UART port, 這個晶片奇特的地方在於它可以透過軟體 (不同的函式庫), 轉換不同的通訊協定 (a little like bitbang), 達到支援 RS-232/482/485, DI/O, Address 或是 JTAG. FT2232 的 JTAG 比 Wiggler 快了大約 20-30 倍, 對於除錯時, 節省大量資料寫入的時間有極大幫助 (例如寫入 kernel 及 u-boot 到 nand flash 中)

目前 Openmoko default 的設定是當成 JTAG (port 1) 及 UART (port 2). 同時, 原本這顆 chip 的標準 USB ID 是 FTDI 0403:6010. 0403 是 FTDI 公司的 USB ID, 而 6010 是依據產品別給的不同 ID.

Openmoko debug board 預設的 USB ID 是 1457:5118. 1457 是 FIC 的公司 USB ID. 而 Openmoko 後期的 Freerunner 使用新申請的 1D50 開頭作為標準 ID.

你可以從下面的網址, 找到所有已註冊 USB.org 的公司/裝置 ID.
http://www.linux-usb.org/usb.ids

或 Openmoko 的 wiki, 也紀錄了使用的 ID 位址.
http://wiki.openmoko.org/wiki/USB_Product_IDs

FTDI 公司也提供了標準的 Windows 驅動程式, 讓你可以在 Windows 利用 FT2232 模擬成雙 UART port 的裝置, 或是一個 JTAG, 一個 UART 裝置. 但是由於 Windows 只認識 FTDI 的 0403:6010 ID, 所以必須修改一下 .inf 檔. 下面可以下載 Windows 下的 FTDI 驅動程式: http://t0ny.net/openmoko/driver/debugboard_win32/

除了 Openmoko 外, Linux 社群也常用另一種類似建立在 FT2232 裝置來做 JTAG, 例如 Amontec JTAGkey: http://www.amontec.com/jtagkey.shtml . 這種裝置比較小巧, 同時支援 1.4V 到 5V 的 JTAG signaling, 常被配合標準公版的 20 pin 插座使用.

[安裝 FTDI lib]

會用到 3 個不同的 package, 分別是 libftdi-dev, libftdi-eeprom, libftdi0, 建議開始使用 Debug Board 前先安裝這些 package.

[連接 FR 的 Debug Output (UART)]

由於 Linux 只認識 Default 的 FTDI 裝置 (0403:6010), 所以 Openmoko Debug Board 需要額外載入 FTDI 的 SIO driver. 利用以下指令可載入 FTDI 的 SIO driver. 請使用 root 或是 sudo 來做 I/O port 設定動作.

root@ubuntu:~# rmmod ftdi_sio
root@ubuntu:~#modprobe ftdi_sio vendor=0x1457 product=0x5118

成功之後會在 /dev 目錄下看到 ttyUSB0 及 ttyUSB1, Openmoko 使用 USB1 作為 UART 連線. 連線參數為 115200, N, 8, 1, no hardware flow control 成功後, 使用 minicom/cutecom 或是 cu 可從 UART 輸出得到 Debug port 輸出資料.

[使用 JTAG]

Openmoko 預設的 JTAG 工具是 OpenOCD + Debug Board . OpenOCD 的功能像是一個 middleware (TCP sever with JTAG protocol), 提供了 JTAG 及 gdb 的介面. OpenOCD 詳細的資料可參考:

http://openocd.berlios.de/web/

OpenOCD 也支援了許多不同的處理器架構, 從 ARM7 到 ARM11 都可以使用, 可以下載原始碼後編譯, 或直接從以下網址下載已經編譯好的執行程式. 同時, OpenOCD 需要 FTDI 的 library - libftdi, 版本需要 0.8 或之後的版本.

http://www.ftdichip.com/Drivers/3rdPartyDrivers.htm#Linux

http://www.intra2net.com/de/produkte/opensource/ftdi/index.php

可試著從前面敘述的 apt-get install 包括 libftdi-dev, libftdi-eeprom, libftdi0,libusb 等必要的 package. 也可以從這

http://t0ny.net/openmoko/util/host/gta02/openocd/ 下載已編譯好的 openocd 執行檔及 openocd 需要的裝置設定檔. 接下來:

<Step 1> 連接 Neo 及 Debug Board, 以及連接 Debug Board 到 PC USB port, 開啟 Neo 電源, 然後執行:

root@ubuntu:~/GTA02-DM1/tmp# ./openocd -f openocd-debugv2.cfg
Info: openocd.c:84 main(): Open On-Chip Debugger (2007-01-31 12:00 CET)

正常執行狀況下, 螢幕會停住在Open On-Chip Debugger (2007-01-31 12:00 CET) 這一行.

<Step 2> 接下來使用 telnet localhost 4444 即可進入 CPU, 透過 JTAG 下 command.

root@ubuntu:~# telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger


> halt
requesting target halt...
> Target 0 halted
target halted in ARM state due to debug request, current mode: Supervisor
cpsr: 0x60000053 pc: 0x33f8b7ec
MMU: disabled, D-Cache: enabled, I-Cache: enabled
>

<Step 3> 執行需要的 script

OpenOCD 可以透過 script 執行連續的 command, 例如寫入多個不同的位址, 大小的檔案到 NAND/SDRAM 的記憶體中並執行. 命令格式是:

> script "script.ocd"

Openocd 執行檔的下載目錄中, 有一個 script.ocd 範例, 若想要學習如何手動寫 u-boot 到 NAND 記憶體中或更多 script 命令, 請參考:

http://wiki.openmoko.org/wiki/U-boot 的內容.

如果看到以下訊息, 代表 JTAG 連線失敗, 請重新連接 USB, 關閉 FR 電源, 開啟 FR 電源, 按下 Debug Board Reset 鈕, 試試是否可以正常停在 Open On-Chip Debugger (2007-01-31 12:00 CET) 這一行..
root@ubuntu:~/GTA02-DM1/tmp# ./openocd -f openocd-debugv2.cfg
Info: openocd.c:84 main(): Open On-Chip Debugger (2007-01-31 12:00 CET)
Error: jtag.c:1181 jtag_examine_chain(): JTAG communication failure, check
connection, JTAG interface, target power etc.

[打開 NOR flash 的寫入功能]

在 FreeRunner 出廠時, NOR flash 預設是防寫的狀態, 所以即使 NAND flash 裡面的 u-boot 受損, 依舊可按 AUX 鍵及電源鍵, 由 NOR 開機後執行更新 image 的工作. 簡單來說, NOR 裡面的 u-boot 包含以下特性:

* 預設是不可變更的
* NOR u-boot 包含了 u-boot/splash screen/environmental variable 環境變數 (MTD parts, default tty output)
* 開機時按下 AUX 鍵, Samsung stepping stone 會跳到 NOR 執行開機的動作

V3 版的 Debug Board 有提供一個 pull-high 電阻 IO 可以解除 FR 上的 NOR 防寫功能, 這個功能必須要透過一個小的公用程式 norwp 啟動.

norwp 的原始碼可以從 http://svn.openmoko.org/trunk/src/host/norwp/ 下載. 要編譯這個程式, 需要 libusb 及 libftdi . 也可以從下面的網址, 下載編譯過的 binary. http://t0ny.net/openmoko/samples/bin/norwp/

使用這個 Utility 很簡單, 只要連接 Debug Board 及 FR 後, 執行:
root@ubuntu:~/norwp# ./norwp rw

就可以開啟 NOR 寫入的功能, 而:
root@ubuntu:~/norwp# ./norwp ro 可關閉寫入的功能

從 openmoko 的 git server, 可以 download u-boot 及 NOR 版 u-boot 的 source code. http://git.openmoko.org/?p=u-boot.git;a=summary

簡單來說, 用 git clone 下來後, 使用 openmoko 官方的 toolchain 即可編譯出相關的檔案. 關於 toolchain 的用法, 這邊先略過.

沒有留言:

 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.