在Ubuntu下搭建ARM處理器 arm-linux-gcc 交叉編譯環(huán)境以及OpenJTAG + openocd 燒寫環(huán)境
前言
本教程所用操作系統(tǒng)為Ubuntu 16.04缩歪,所用ARM處理器為Samsung S3C2440雁社,在FriendlyARM Mini2440開發(fā)板上進行操作掖棉,使用OpenJTAG + openocd 燒錄程序朗恳。
當然醋界,道理是相通的逢渔,所以在不同平臺下也只是稍微修改一部分的配置就可以了热凹。
![](http://www.techping.cn/blog/wordpress/wp-content/uploads/2016/04/1-300x225.jpg)
步驟
1. 下載arm-linux-gcc交叉編譯工具赐俗,編寫程序宽闲。
(接下來的文章我會發(fā)布我學習過程中寫的程序(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 供后續(xù)使用
- OpenJTAG 是一款調試/仿真工具众眨,這里用它來燒錄程序。我手頭上這個使用的是FT2232D芯片容诬,同時具備USB轉JTAG娩梨、USB轉串口功能。那么它和我們以前用JLink在Windows下的Keil MDK下開發(fā)stm32之類的有什么區(qū)別呢览徒?比如狈定,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](http://www.techping.cn/blog/wordpress/wp-content/uploads/2016/04/3-768x587.png)
進入openocd的目錄,執(zhí)行:
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 的參數(shù)是根據(jù)我的板子定的萝快,如果要使用別的芯片锻霎,調試工具什么的,要進行相應修改揪漩,詳情:
./configure --help
安裝完畢之后旋恼,執(zhí)行
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
可以參考以下配置文件:(這里我也是根據(jù)自己的情況配置,具體視硬件而定)
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
將開發(fā)板連接的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 昂勒,顯示開發(fā)板當前信息
- 輸入 halt 蜀细,暫停
- 輸入 resume ,恢復
- 輸入 reset 叁怪,復位
以燒寫以個點亮LED的程序為例子:
halt //先暫停當前程序的運行
nand probe 0//識別出Nand Flashnand
erase 0 0 0x20000//擦除0地址開始的128K內容
nand write 0 led.bin 0//寫入LED.bin
reset//復位
然后就可以看到LED亮了审葬!
![](http://www.techping.cn/blog/wordpress/wp-content/uploads/2016/04/2-300x225.jpg)
歡迎閱讀
我的后續(xù)學習過程的 程序分享 & 解析
謝謝閱讀,^ _ ^
部分參考資料來自:http://blog.chinaunix.net/uid-20543672-id-94365.html
- 我的個人主頁:http://www.techping.cn/
- 我的個人站點博客:http://www.techping.cn/blog/wordpress/
- 我的CSDN博客:http://blog.csdn.net/techping
- 我的簡書:http://www.reibang.com/users/b2a36e431d5e/timeline
- 我的GitHub:https://github.com/techping
歡迎相互follow~