DM9000的移植比较简单,因为其实u-boot内部已经支持了DM9000网卡,不过smdk2410默认使用的是cs8900网卡,我们要做的工作就是将支持DM9000的
相关代码链入u-boot,然后将cs8900的相关代码替换成DM9000的相关代码。
DM9000的初始化函数为eth_initialize(gd->bd),它在u-boot中的位置参见http://blog.csdn.net/r21nn/article/details/73718514
我们再来看看eth_initialize(gd->bd)的执行流程
eth_initialize
-->miiphy_init
-->board_eth_init
-->cs8900_initialize
-->dev->init = cs8900_init;
-->dev->halt = cs8900_halt
-->dev->send = cs8900_send
-->dev->recv = cs8900_recv
-->eth_register(dev)
我们需要把这个执行留下改为如下
eth_initialize
-->miiphy_init
-->board_eth_init
-->dm9000_initialize(其实改动的只有这个部分,下面的部分会随着这个函数的改变而改变)
-->dev->init = dm9000_init
-->dev->halt = dm9000_halt
-->dev->send = dm9000_send
-->dev->recv = dm9000_rx
-->eth_register(dev)
所以我们要将cs8900_initialize改为dm9000_initialize,改完之后编译,会有错误提示没有dm9000_initialize,这是因为我们还并没有将DM9000
相关的代码链入u-boot,分析u-boot-2012.04.01\drivers\net目录下的Makefile文件,文件中有如下一行
COBJS-$(CONFIG_DRIVER_DM9000) += dm9000x.o
所以只要定义宏CONFIG_DRIVER_DM9000便可将dm9000x.o链入,于是在smdk2440.h中增加如下一行
#define CONFIG_DRIVER_DM9000
再次编译,会提示没有CONFIG_DM9000_BASE,DM9000_IO,DM9000_DATA三个变量,于是再次在smdk2440中定义这三个变量,关于这三个变量怎么定义
我们可以参考u-boot中其他板级文件中的代码,注意:有时候在sourceinsight的当前工程中可能搜索不到这三个量在其他板级文件中的定义,因为我们
在建立sourceinsight工程时没有添加其他板级文件,这时我们需要到Linux中搜索 grep “DM9000_IO” * -nR 。按照其他文件中的模板定义这三个量如下
#define CONFIG_DM9000_BASE 0x20000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
现在来说说这三个量的含义,CONFIG_DM9000_BASE顾名思义是DM9000的基地址,因为在s3c24440中DM9000接在BANK4上,而BANK4起始地址为0x20000000
网卡跟其他内存类接口有些不一样,其他内存类接口的地址范围是从起始地址到终止地址,而网卡却是只有两个确定的地址DM9000_IO和DM9000_DATA
关于这两个值的确定要参考s3c2440的原理图
当基地址为0x20000000时,DM9000被选中,但是具体要使用哪个地址还得看addr2引脚的电平,addr=1 DM9000_DATA,addr=0 DM9000_IO。
做完这些之后MD9000的移植就结束了,但是我们还需注意,因为DM9000是接在BANK4上,所以我们在lowlevel_init.S中设置存储控制器时,
有关BANK4的内容要按照DM9000的要求来设置,主要是位宽和时序及等待信号,因为这里使用默认的设置即可,所以才不做变动。如果不行的话
可以将BANKCON4设置为0x00000740。
现在再次编译,没有问题,将u-boot.bin烧入开发板
set ipaddr 192.168.236.3 (我的Windows的IP是192.168.236.5,保持开发板和pc机为同一网段)
set ethaddr 00:0c:29:78:78:75 (随便设,但是第一个段必须为00,可以参考实际的机器设)
ping 192.168.236.5
有如下内容说明DM9000移植成功
注意:我在做DM9000的移植的时候犯了一个很重要的错误,因为我的电脑不能联网,所以在查我的电脑的IP地址的时候,并没有IP(ip没有显示出来)
在安装有虚拟机的物理机上有三个网卡,eth0(本地链接),VMnet1(虚拟网卡),VMnet8(虚拟网卡)。之前没有搞清楚这三个网卡的区别,我之前
一直ping的是后两个网卡地址,这是不可能成功的,注意!!!必须ping本地链接的网卡。如果你的环境跟我一样,电脑不能联网(这时ipconfig不能
查到本地链接网卡的ip地址),你可以按如下步骤做。
1、打开网络共享中心
2、点击更改适配器
3、打开本地连接的属性框
4、在属性框的 此连接使用下列项目中选中Internet协议版本4(TCP/IPV4),再次点击属性,打开协议版本属性框
5、在协议版本属性框中属性框中做如下填写