【教程】在Ubuntu下搭建ARM處理器 arm-linux-gcc 交叉編譯環境以及OpenJTAG + openocd 燒寫環境

在Ubuntu下搭建ARM處理器 arm-linux-gcc 交叉編譯環境以及OpenJTAG + openocd 燒寫環境


前言

本教程所用操作系統爲Ubuntu 16.04,所用ARM處理器爲Samsung S3C2440,在FriendlyARM Mini2440開發板上進行操作,使用OpenJTAG + openocd 燒錄程序。

當然,道理是相通的,所以在不同平臺下也只是稍微修改一部分的配置就可以了。

first

步驟

1. 下載arm-linux-gcc交叉編譯工具,編寫程序。

接下來的文章我會發布我學習過程中寫的程序(C語言和彙編交互)

Makefile 可以這樣寫(以點亮led爲例子):

led.bin:start.o
        arm-linux-ld -Ttext 0 -o led.elf start.o
        arm-linux-objcopy -O binary led.elf led.bin
        arm-linux-objdump -D led.elf > led.dis
start.o:start.s
        arm-linux-gcc -o start.o start.s -c

生成文件 led.bin 供後續使用

  • OpenJTAG 是一款調試/仿真工具,這裏用它來燒錄程序。我手頭上這個使用的是FT2232D芯片,同時具備USB轉JTAG、USB轉串口功能。那麼它和我們以前用JLink在Windows下的Keil MDK下開發stm32之類的有什麼區別呢?比如,OpenJTAG可以用在Windows、Linux、MAC下,而JLink只能用在Windows,並且在Linux下它的調試功能無法使用。因此,某種程度上,OpenJTAG更有實用性。

要時使用一種硬件,當然首先要安裝它的驅動程序了,我們需要到 intra2net 公司網站下載最新版(舊版當然也可以,但可能在某些配置上就不一樣咯)的 libftdi ,這是OpenJTAG使用的FT2232D 芯片的底層驅動庫。(注意:需要先安裝libusb-dev)

下載解包後編譯安裝:

./configure
make
sudo make install

當然你也可以通過git下載源代碼。

如果你也想安裝ftdi-eeprom(燒寫FT2232所連接的e2prom的工具),可用同樣的方法下載安裝。(注意:需要先安裝libconfuse-dev)

2. 安裝openocd

openocd是一個開源的JTAG上位機程序,目前支持很多種芯片了,並且支持的芯片還在不斷增加中。當然,由於源代碼都是公開的,並且可以自己編譯,所以增加自定義的工具驅動程序也是相當容易的。
打開你的工作目錄,打開終端,輸入:(當然你要安裝git : sudo apt-get install git)

git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd

之後你會得到openocd最新版的源碼

code

進入openocd的目錄,執行:

sudo ./bootstrap
sudo ./configure --enable-ftdi --enable-usb_blaster_libftdi --enable-openjtag_ftdi --enable-maintainer-mode --enable-legacy-ft2232_libftdi
sudo make
sudo make install

上面 ./configure 的參數是根據我的板子定的,如果要使用別的芯片,調試工具什麼的,要進行相應修改,詳情:

./configure --help

安裝完畢之後,執行

openocd -v

會輸出版本信息:

Open On-Chip Debugger 0.10.0-dev-00251-g888d5a5-dirty (2016-04-24-13:35)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html

3. 配置 openocd.cfg

可以參考以下配置文件:(這裏我也是根據自己的情況配置,具體視硬件而定)

interface ftdi
ftdi_device_desc "USB<=>JTAG&RS232"
ftdi_vid_pid 0x1457 0x5118

ftdi_layout_init 0x0f08 0x0f1b
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400

jtag_khz 1500

if { [info exists CHIPNAME] } {
   set  _CHIPNAME $CHIPNAME
} else {
   set  _CHIPNAME s3c2440
}

if { [info exists ENDIAN] } {
   set  _ENDIAN $ENDIAN
} else {
  # this defaults to a bigendian
   set  _ENDIAN little
}

if { [info exists CPUTAPID] } {
   set _CPUTAPID $CPUTAPID
} else {
   set _CPUTAPID 0x0032409d
}

#jtag scan chain
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0x0f -expected-id $_CPUTAPID

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME arm920t -endian $_ENDIAN -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x40000000  -work-area-size 0x4000 -work-area-backup 1

#reset configuration
adapter_nsrst_delay 100
jtag_ntrst_delay 100
reset_config trst_and_srst

#-------------------------------------------------------------------------
# JTAG ADAPTER SPECIFIC
# IMPORTANT! See README at top of this file.
#-------------------------------------------------------------------------

    adapter_khz 12000
    #jtag interface

#-------------------------------------------------------------------------
# GDB Setup
#-------------------------------------------------------------------------

    gdb_breakpoint_override hard

#------------------------------------------------
# ARM SPECIFIC
#------------------------------------------------

    targets
    arm7_9 dcc_downloads enable
    arm7_9 fast_memory_access enable

    nand device 0 s3c2440 $_TARGETNAME

    adapter_nsrst_delay 100
    jtag_ntrst_delay 100
    reset_config trst_and_srst
    init

    echo "--- login with - telnet localhost 4444  ---"

4. 啓動openocd

將開發板連接的OpenJTAG的USB接口接入PC,在終端輸入:

openocd -f openocd.cfg

成功接入之後,打開另一個終端,輸入:

telnet localhost 4444

進入操控指令方式

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> 
  • 輸入 poll ,顯示開發板當前信息
  • 輸入 halt ,暫停
  • 輸入 resume ,恢復
  • 輸入 reset ,復位

以燒寫以個點亮LED的程序爲例子:

halt //先暫停當前程序的運行

nand probe 0//識別出Nand Flash

nand erase 0 0 0x20000//擦除0地址開始的128K內容

nand write 0 led.bin 0//寫入LED.bin

reset//復位

然後就可以看到LED亮了!

led

  • 歡迎閱讀我的後續學習過程的 程序分享 & 解析

謝謝閱讀,^ _ ^

部分參考資料來自:http://blog.chinaunix.net/uid-20543672-id-94365.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章