Linux 下 ARM 的 bootloader 开发环境
whitebear
整了将近一周……终于搞定了~
因为比赛需要,我正在试着为博创的uptech 2410开发板改进uboot,使之支持用户通过触摸屏选择,从SD卡读取系统镜像并引导。因为uboot的开发环境是Linux,而ADS之类的东东又没办法在Linux下运行(其实我觉得ADS也不怎么好用……),我只好自己想办法弄出一套开发环境来……
需要的设备有:
1. 基于Moschip 9865芯片组的PCI转1并2串转接卡
2. wiggler线。uptech自带的jtag调试线相当不标准,既不是wiggler又不是sdt,而是自己搞的一套引脚定义。引用网上某人(忘记谁了)的话说,有些公司为了显示自己的技术实力,故意把引脚定义弄得乱七八糟。
3. 20-14针jtag转接板
Moschip 9865在Debian wheezy下的驱动还是比较容易的,只不过容易受到误导而绕弯路。官方的驱动是不需要的,也是没有用的。首先,官方的驱动在Debian Wheezy下根本无法编译通过。mcs9865.c中第1993行
<br></br>static DECLARE_MUTEX(serial9865_sem);<br></br>
是不正确的。最新的内核声明信号量的语法已经改成了
<br></br>static DEFINE_SEMAPHORE(serial9865_sem);<br></br>
修改完后,可以编译,可以安装(Makefile中的一些路径依然有问题)。但是无论如何也不会出现官方手册中说的/dev/ttyD*。经过我的测试,其实根本不需要什么驱动,/dev/ttyS*就是可以正常运行的串口……只是需要花时间找找哪一个才是需要的串口而已(我在win下的COM1在这里不是ttyS0,而是ttyS1)。
并口的驱动更加简单。执行
lspci -v
找到类似这样的一段(一般是最后一段):
05:02.2 Parallel controller: NetMos Technology PCI 9865 Multi-I/O Controller (prog-if 03 [IEEE1284])
Subsystem: Device a000:2000
Flags: bus master, medium devsel, latency 32, IRQ 20
I/O ports at dd00 [size=8]
I/O ports at dc00 [size=8]
Memory at fdcfb000 (32-bit, non-prefetchable) [size=4K]
Memory at fdcfa000 (32-bit, non-prefetchable) [size=4K]
Capabilities:
Kernel driver in use: parport_pc
记下IRQ 和 第一个 I/O ports at xxxx [size=8]。然后执行:
modprobe parport_pc io=0xdd00 irq=20
不需要先rmmod,直接modprobe就可以。
然后再执行
modprobe ppdev
此时,/dev/parport0 就应该出现了。
放弃uptech的jtag线,用wiggler线连接开发板。因为开发板上的jtag是14针,而wiggler线上的jtag是20针的,所以需要一个转接板。这个转接板非常简单,只是引脚排列顺序不同,地线数目不同而已。
OpenOCD的配置也不算繁琐。因为最新的OpenOCD删除了
daemon_startup reset
语句,因此上面提到的文章中的方法会在这里出错。我参照OpenOCD的邮件列表修改成了:
init
halt
不知道为什么,
init
reset
在我这里始终无法使用,会提示错误。注意,init语句必须放在所有配置脚本的最后!
OpenOCD的执行命令行为:
bear@debian:/work/bootloader/openocd$ sudo openocd -f parport.cfg -f samsung_c2410.cfg -f config.cfg/Tools/Application/insight/bin$ cat ~/work/bootloader/openocd/config.cfg
其中,samsung_c2410.cfg和parport.cfg可以从/usr/share/openocd/scripts/下得到,但必须修改parport.cfg中的
parport_port 0x378
到
parport_port 0
才可以使OpenOCD正常运行。config.cfg的内容如下:
bear@debian:
telnet_port 23
gdb_port 2331
init
halt
bear@debian:~/Tools/Application/insight/bin$
另外,samsung_c2410.cfg需要修改
set _CPUTAPID 0xffffffff
为
set _CPUTAPID 0x0032409d
否则会在启动OpenOCD的时候得到一个警告。
OpenOCD执行成功后,可以使用insight进行调试。insight可以直接从官方下载最新的tar包并编译安装。如果使用CVS源码的话,有可能编译不通过。至少我没有通过。而且官方给出的CVS检出命令行也不正确,应该是:
cvs -z9 -d :pserver:anoncvs@sourceware.org:/cvs/src co src
为了进行调试,我们需要在uboot中编译入调试符号。我之前尝试修改最新版的uboot,使之支持uptech 2410开发板,但是失败了=。= 主要是start.S中的内容与uptech手册中提到的不符。使用uptech自带光盘中的uboot可以正常编译引导。向uboot中编译入调试符号的方法有很多种,我是修改 config.mk 文件,在 233 – 250 行,修改为:
ifndef REMOTE_BUILD
%.s: %.S<br></br> $(CPP) $(AFLAGS) -g -o $@ $
因为这个uboot确实比较老,所以需要用 arm-linux-gcc-3.4.6-glibc-2.3.6.tar.bz2 进行编译……新版的编译不过的……
eclipse配置是最后一步。首先我们需要为eclipse安装一个插件 ZylinCDT ,更新地址在:
新建一个 C Makefile Project with Existing Code 项目,工具链选 (我不知道为什么很多教程里面的截图都有很多ARM的工具链可以选,我的就只有几个GCC……),完成。在项目属性里选C/C++ Build -> Environment,添加 PATH ,并加入 arm-linux-gcc-3.4.6-glibc-2.3.6.tar.bz2 的路径。然后选 C/C++ Build -> Build Variables,也加入arm-linux-gcc-3.4.6-glibc-2.3.6.tar.bz2 的路径。
现在执行 Project -> Build All ,uboot应该可以正常编译了(记得要先自己 make up2410_config……)。
选 Run -> Debug Configurations ,找到 Zylin Embedded debug(Native) ,双击之,应该可以看到 “工程名 Default”。在 Mian 标签页的 C/C++ Application 中填入uboot编译后的二进制文件名 u-boot 。在 Debugger 标签页中的 GDB debugger 中填入 arm-none-eabi-gdb 。注意,arm-linux-gcc-3.4.6-glibc-2.3.6.tar.bz2 不自带gdb,就算带了也因为版本太旧不能用!需要下载一个最新的 arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 ,也可以apt装一个最新的(
Debian嵌入式官方源:
# -- Emdebian sources.list entries<br></br>deb http://www.emdebian.org/debian/ wheezy main<br></br>
)。
Command 标签页中的 ‘Initialize’ commands 中填入:
target remote localhost:2331<br></br>load<br></br>
在 Environment 标签页中也添加入 PATH 变量,并设置 arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 的安装路径。注意,不是编译uboot用的旧版工具链路径!!!
完成之后,点 Debug 按钮,调试开始。有源码同步显示哦~
串口调试可以用 gtkterm ,源里有。