MagicARM2410上的U-Boot移植 终于搞定DM9000

2014-11-24 10:26:57 · 作者: · 浏览: 0

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


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


强烈推荐Vmware Workstation ACE版,性能真强大,我原先的一个fedora8的虚拟机映像用别的版本的Vmware Workstation都打不开,要不就是进不了图形界面。在ACE版本下一下子就打开了。


Fedora12经过这些天的使用,感觉还是很不错的,应该说是最好用的fedora版本。交叉编译等操作都没出现过什么问题,网络功能也很好用,设置虚拟机的时候选择使用网桥,fedora12能方便的访问window下的文件夹(该文件夹需设置为共享),也能方便的上网。做嵌入式linux的人应该知道,上面这两点是多么的重要。


esroot就是我的秘密武器啦!是利用chroot构建的嵌入式linux的开发环境,或者叫山寨版的IDE。可以大幅提高开发效率,有效的管理开发相关的文件。有时间的时候在把这个东西写上来。


下面说说我遇到的问题,就是卡住我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


然后ping,tftp下载都ok啦。调通心情好:)