移植u-boot学习笔记8-----修改代码之支持DM9000网卡

时间:2021-10-02 10:12:02

在u-boot的代码里面,已经支持DM9000,我们需要修改配置文件,把DM9000编译到u-boot.bin里面去

1、修改配置文件

(1)查看DM9000x.c所在目录的Makefile,

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(2)搜索dm9000,需要配置宏CONFIG_DRIVER_DM9000,才能支持dm9000

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(3)修改配置文件include\configs\smdk2440.h

定义宏CONFIG_DRIVER_DM9000

#if 1
代码A
#else
代码B
#endif
则程序编译的时候就只编译代码A
如果
#if 0
代码A
#else
代码B
#endif

则程序编译的时候就只编译代码B

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

2、编译

(1)出现错误

第一个错误是DM9000_DATA没有定义

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(2)搜索一下DM9000_DATA在哪里设置

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(3)别人的配置文件里面

既定义了DM9000_DATA,也定义了其他的。

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(4)在配置文件include\configs\smdk2440.h中添加

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(5)上面定义的值只是拷贝别的程序的,需要修改,这些值取为多少

网卡是内存类接口,2440里面有一个内存控制器,外面接有DM9000网卡。既然是内存类接口,必须要知道其访问地址位宽。CPU发出的地址信号是给内存控制器的,内存控制器要发出读写信号(时间有多长)和时序(看DM9000手册,根据DM9000性能设置)给DM9000。

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(6)确定访问地址

看网卡的片选引脚接在nGCS4

看2440手册里的内存控制器部分,只要CPU发出的地址在0x2000,0000和0x2800,0000之间,就会使得nGCS4变为低电平。所以基地址是0x2000,0000

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

里面的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

为低电平时,这个命令循环的访问是索引端口

移植u-boot学习笔记8-----修改代码之支持DM9000网卡


(7)设置内存控制器(在lowlevel_init.S里)

在start.S里面在cpu_init_crit里的lowlevel_init函数有设置内存控制器。

我们设置的是片选4,也就是设置BANKCON4寄存器,BWSCON寄存器应该有位宽

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

  • 设置位宽
BWSCON寄存器中,下面的bit17和bit16是设置片选4的位宽的,DM9000网卡是16位位宽.bit18是不使用wait信号,wait信号是如果芯片性能太差,CPU来访问这个芯片的时候,芯片反应不过来,就会发出wait信号告诉CPU,再等 待一会。因为没用到,因而不用设置。ST4暂时用不到,不用设置。
移植u-boot学习笔记8-----修改代码之支持DM9000网卡

  • 设置时序
设置BANKCON4寄存器

根据2440的内存控制器的时序图和DM9000的时序图对比来确定各个时间的值。也可以取默认值。

参考移植DM9000C驱动程序之设置时序

时序、位宽、地址

2、实验

(1)

把配置文件include\configs\smdk2440.h(地址)

和board\samsung\smdk2440\lowlevel_init.S(时序、位宽)文件更新一下

通过超级终端传输

无法发现网卡,也就是说

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(2)调用过程分析

在board.c里面用到eth_initialize函数

eth_initialize函数调用(smdk2410.c里的)board_eth_init函数

这里是CS8900初始化,而我们用的是DM9000,DM9000x.c里面提供了初始化函数dm9000_initialize,

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

搜索一下别人是怎么用的

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

在board\samsung\smdk2440\smdk2410.c

修改后变成

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

(3)更新smdk2410.c,接上网线,看能否ping通

设置服务器IP和板子IP在同一网段

设置Mac地址,可参考别的网卡的MAc地址,设置完后不要执行save命令,我们还没有设置那些参数保存在哪里。

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

在windows下面启动一个服务器工具

上面是所需文件所在目录,下面是服务器IP

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

在u-boot下设置服务器IP,

移植u-boot学习笔记8-----修改代码之支持DM9000网卡

可通过bootm命令启动内核bootm 3000,0000

DM9000移植的要点:

1 基地址(看CS接口)

2 CPU的寄存器设置:位宽,时序等设置

3  设置中断号(看中断接口)