原先没有做过U-boot的移植,现在感觉这一步还是通一下比较好,就决定移植一个试试。
我手头的板子是学校的周立功MagicARM2410,原先上面有周立功的bootloader(应该也是U-boot),但是只有一个bin文件,不提供源码(很不厚道的说)。
开发环境就是我的虚拟机Vmware Workstation ACE版+Fedora12+esroot。
强烈推荐Vmware Workstation ACE版,性能真强大,我原先的一个fedora8的虚拟机映像用别的版本的Vmware Workstation都打不开,要不就是进不了图形界面。在ACE版本下一下子就打开了。
Fedora12经过这些天的使用,感觉还是很不错的,应该说是最好用的fedora版本。交叉编译等操作都没出现过什么问题,网络功能也很好用,设置虚拟机的时候选择使用网桥,fedora12能方便的访问window下的文件夹(该文件夹需设置为共享),也能方便的上网。做嵌入式linux的人应该知道,上面这两点是多么的重要。
esroot就是我的秘密武器啦!是利用chroot构建的嵌入式linux的开发环境,或者叫山寨版的IDE。可以大幅提高开发效率,有效的管理开发相关的文件。有时间的时候在把这个东西写上来。
U-boot移植到2410的方法网上资料已经很多了(参考),基本上是基于smdk2410(U-boot支持)再针对自己的板子做一些修改。我们可以思考一下在bootloader阶段会用到板子的那些设备。如果你的U-boot只用于下载kernel(还有ramdisk等)和引导系统,那么cpu,sdram,nor flash, nand flash,串口,网卡也就基本够了。 而通常所需要做的修改主要集中在2个部分:网卡和nand flash。smdk2410选用的网卡是cs8900,而MagicARM2410是DM9000。smdk2410没有对nand flash的初始化,这部分也需要修改。
下面说说我遇到的问题,就是卡住我5个工作日的问题:DM9000不工作。
先说说我一开始做的:
使用DM9000,需要修改my2410.h(复制于smdk2410.h),去掉原先cs8900的内容,改为DM9000的内容。如下:
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x18000300
#define DM9000_IO 0x18000300
#define DM9000_DATA 0x18000304
#define CONFIG_NET_MULTI
#define CONFIG_DM9000_USE_16BIT 1
#define CONFIG_DM9000_NO_SROM 1
//#define CONFIG_DM9000_DEBUG 0x01
DM9000的基地址0x18000300是由MagicARM2410的硬件结构决定的。它采用nGCS3片选DM9000,所以基地址为0x18000300。CONFIG_DM9000_NO_SROM定义不从DM9000片内EEPROM读取MAC地址,这个要设定,因为MagicARM2410上的DM9000片内EEPROM管脚根本就都没有接,全悬空着怎么读取MAC地址?!
CONFIG_DM9000_DEBUG选择如果设为真的话,会使能dm9000x.c(DM9000驱动)串口会输出更多的调试信息。
然后我改了一点儿dm9000x.c,在最后的dm9000_initialize(bd_t *bis)函数里面加了一条dm9000_init(dev,bis)。这样U-boot启动后会初始化一次DM9000,否则在用到网卡时才进行初始化(如使用PING,tftp命令等)。
这样看来就没什么问题了。编译通过,下载到板子上ok。上电后串口出现:
U-Boot 2009.11 (Dec 30 2009 - 00:04:33)
DRAM: 64 MB
Flash: 2 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: dm9000
SMDK2410 #
dm9000_init
resetting DM9000
resetting the DM9000, 1st reset
resetting the DM9000, 2nd reset
ERROR: resetting DM9000 -> not responding
dm9000 not found at 0x18000300 id: 0x00000000
网卡灯不亮,PC显示本地连接断开。
问题出现了。然后就是
do{
google,baidu...
修改
编译
下载
上电
试验
}while(网卡工作)
但是5天都没跳出这个循环,逐渐变的食之无味,睡之不香...
不过,在调试中,我也变得越来越了解U-boot。通过查看dm9000x.c,发现初始化的第一步dm9000_reset就没过去,在这一步,程序会检测DM9000的ID是不是0x90000a46,如果不是,就打印“resetting DM9000 -> not responding”
开始怀疑是AEN脚的使能信号(DM9000的AEN连接cpu的nGCS3)没传过来,应该是传送一个低电平并持续10us。上示波器!DM9000的管脚太密测起来也挺困难。结果发现这个信号是没问题的,确实送来了一个低电平。这也说明了0x18000300这个网卡基地址是没错的。继续郁闷...
直到今天,在下决心仔细再看一编DM9000的芯片资料后,终于灵光一显,发现了一个RST管脚。这是个硬件复位管脚,高电平复位。上示波器!原来...,它竟然一直是高电平!总在复位,片子怎么工作呢?!
直接把它接地,重启,网卡灯亮啦!!!
串口输出:
SMDK2410 #
dm9000_init
resetting DM9000
resetting the DM9000, 1st reset
resetting the DM9000, 2nd reset
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:14:97:0f:00:00