Boot移植 终于搞定DM9000

原先没有做过U-boot的移植,现在感觉这一步还是通一下比较好,就决定移植一个试试。

我手头的板子是学校的周立功MagicARM2410,原先上面有周立功的bootloader(应该也是U-boot),但是只有一个bin文件,不提供源码(很不厚道的说)。 

开发环境就是我的虚拟机Vmware Workstation ACE版+Fedora12+esroot。

相关阅读:U-Boot源代码下载地址

强烈推荐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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdjyy.html