在u-boot的代码里面,已经支持DM9000,我们需要修改配置文件,把DM9000编译到u-boot.bin里面去
1、修改配置文件
(1)查看DM9000x.c所在目录的Makefile,
(2)搜索dm9000,需要配置宏CONFIG_DRIVER_DM9000,才能支持dm9000
(3)修改配置文件include\configs\smdk2440.h
定义宏CONFIG_DRIVER_DM9000
#if 1
代码A
#else
代码B
#endif
则程序编译的时候就只编译代码A
如果
#if 0
代码A
#else
代码B
#endif
则程序编译的时候就只编译代码B
2、编译
(1)出现错误
第一个错误是DM9000_DATA没有定义
(2)搜索一下DM9000_DATA在哪里设置
(3)别人的配置文件里面
既定义了DM9000_DATA,也定义了其他的。
(4)在配置文件include\configs\smdk2440.h中添加
(5)上面定义的值只是拷贝别的程序的,需要修改,这些值取为多少
网卡是内存类接口,2440里面有一个内存控制器,外面接有DM9000网卡。既然是内存类接口,必须要知道其访问地址和位宽。CPU发出的地址信号是给内存控制器的,内存控制器要发出读写信号(时间有多长)和时序(看DM9000手册,根据DM9000性能设置)给DM9000。
(6)确定访问地址
看网卡的片选引脚接在nGCS4
看2440手册里的内存控制器部分,只要CPU发出的地址在0x2000,0000和0x2800,0000之间,就会使得nGCS4变为低电平。所以基地址是0x2000,0000
里面的DM9000_IO是CPU发出的地址只有通过LADDR2地址线接到DM9000的CMD这里来,也就是在DM9000里面,让CMD引脚变为高\低的时候访问里面的某个地址。这些地址称为IO地址或DATA地址,LADDR2对应bit2,0x100也就是十进制4,所以基地址+4.
读网卡寄存器的方法是:先向INDEX端口写入寄存器的地址,再从DATA端口读出该寄存器的值。写寄存器的方法与之对应:先向INDEX端口写入寄存器的地址,再向DATA端口写入值。通过I/O端口读写网卡寄存器的方法在驱动中由ior()、iow()这来两个函数实现。
CMD pin :
Command Type
When high, the access of this command cycle is DATA port
为高电平时,这个命令周期的访问是数据端口(数据为高)
When low, the access of this command cycle is INDEX port
为低电平时,这个命令循环的访问是索引端口(寄存器为低)
(7)设置内存控制器(在lowlevel_init.S里)
在start.S里面在cpu_init_crit里的lowlevel_init函数有设置内存控制器。
我们设置的是片选4,也就是设置BANKCON4寄存器,BWSCON寄存器应该有位宽。
- 设置位宽
- 设置时序
根据2440的内存控制器的时序图和DM9000的时序图对比来确定各个时间的值。也可以取默认值。
参考移植DM9000C驱动程序之设置时序
时序、位宽、地址
2、实验
(1)
把配置文件include\configs\smdk2440.h(地址)
和board\samsung\smdk2440\lowlevel_init.S(时序、位宽)文件更新一下
通过超级终端传输
无法发现网卡,也就是说
(2)调用过程分析
在board.c里面用到eth_initialize函数
eth_initialize函数调用(smdk2410.c里的)board_eth_init函数
这里是CS8900初始化,而我们用的是DM9000,DM9000x.c里面提供了初始化函数dm9000_initialize,
搜索一下别人是怎么用的
在board\samsung\smdk2440\smdk2410.c
修改后变成
(3)更新smdk2410.c,接上网线,看能否ping通
设置服务器IP和板子IP在同一网段
设置Mac地址,可参考别的网卡的MAc地址,设置完后不要执行save命令,我们还没有设置那些参数保存在哪里。
在windows下面启动一个服务器工具
上面是所需文件所在目录,下面是服务器IP
在u-boot下设置服务器IP,
可通过bootm命令启动内核bootm 3000,0000
DM9000移植的要点:
1 基地址(看CS接口)
2 CPU的寄存器设置:位宽,时序等设置
3 设置中断号(看中断接口)