uboot移植之网络驱动移植--移植操作--7.29

来源:互联网 发布:垂直同步 知乎 编辑:程序博客网 时间:2024/05/18 00:14

1、网卡驱动文件介绍

uboot/drivers/net/dm9000x.c和dm9000x.h。

这个驱动来自于linux kernel源代码。所以我们uboot中是移植而不是编写。

2、网卡移植的关键:初始化

(1)网卡初始化代码地方在:
start_armboot
init_sequence
board_init
dm9000_pre_init这个函数就是移植的关键

(2)必须要结合开发板原理图来分析,然后决定这个函数怎么编程。

BW寄存器

       SROM_BW_REG  &=  ~(0xf << 4);

        SROM_BW_REG   |= (1<<7)|(1<<6)|(1<<5)|(1<<4);

BC寄存器

       SROM_BC1_REG =((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));

MP0_1CON寄存器

       tmp   = MP01CON_REG;

       tmp &= ~(0XF<<4);

       tmp   |=(2<<4);

       MP01CON_REG =tmp ;

(3)#define DM9000_16BIT_DATA这个宏用来表示DM9000工作在16位总线模式下。根据上节课的硬件原理图的分析,可以看到我们开发板上DM9000确实工作在16位模式下。


(4)从三星版本的代码中可以看出,它操作的是bit20-bit23,对照数据手册中寄存器定义,可以看出三星的开发板DM9000是接在Bank5上的。而我们接在bank1上的,因此我们需要操作的bit位是bit4-bit7

(5)总结:三个寄存器的修改。主要是三星的开发板DM9000接在bank5,我们接在了bank1上,因此要做一些修改。


3、基地址的配置等

(1)驱动分为2部分:代码和数据。代码不用动,数据要修改。


(2)CONFIG_DM9000_BASE是DM9000网卡通过SROM bank映射到SoC中地址空间中的地址。这个地址的值取决于硬件接到了哪个bank,这个bank的基地址是SoC自己定义好的。譬如我们这里接到了bank1上,bank1的基地址是0x88000000.


(3)DM9000_IO表示访问芯片IO的基地址,直接就是CONFIG_DM9000_BASE;DM9000_DATA表示我们访问数据时的基地址,因为DM9000芯片的CMD引脚接到了ADDR2,因此这里要+4(0b100,对应ADDR2)


(4)本来这样配置就完了,重新编译运行网卡就应该工作了。但是实际测试发现不工作,要怎么样修改呢?修改方式是将CONFIG_DM9000_BASE改成0x88000300就工作了。

问题?这个0x300从哪里来的?我得出的感觉最靠谱的解释是:跟DM9000网卡芯片型号版本有关,我认为这个0x300是DM9000网卡本身的问题,他本身的内部寄存器就有一个0x300的一个偏移量。




0 0
原创粉丝点击