网卡移植

网卡初始化函数的位置在board.c文件的baord_init函数中调用了dm9000_pre_init();这个函数,而我们使用的开发板就是dm9000的开发板,所以主要是移植这个函数

三星版本的开发板smdvv210 的网卡是接在SRAM的bank 5中的,而我们的的是接在bank 1 中,所以根据数据手册对SRAM中各个寄存器的定义进行对应的修改,修改结果如下

static void dm9000_pre_init(void)
{
unsigned int tmp;
#if defined(DM9000_16BIT_DATA)
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (0<<7) | (1<<6) | (1<<5) | (1<<4);
#else
SROM_BW_REG &= ~(0xf << 20);
SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16);
#endif
SROM_BC1_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
tmp = MP01CON_REG;
tmp &=~(0xf<<4);
tmp |=(2<<4);
MP01CON_REG = tmp;
}


对应的修改对应的宏定义

(1)#define CONFIG_DM9000_BASE (0xA8000000),这个是网卡的基地址,我们使用的bank 1 对应的是0x8800000,但是实际上这个地址是不行的,应该改为88000300,原因可能是网卡芯片内部的寄存器本身就存在一个300的偏移量,所以要改为

#define CONFIG_DM9000_BASE (0x88000300)

(2)#define DM9000_DATA (CONFIG_DM9000_BASE+2)

改为

#define DM9000_DATA (CONFIG_DM9000_BASE+4)

+4的原因是 DM9000_DATA对应CMD引脚,因为端口复用的原因,这个引脚为高低电平时分别是表示发送地址和命令,CMD这个引脚接的是ADDR2(地址总线的第二根( 0 1 2 )),所以+4是因为4=100刚好对应第二跟地址总线也就是ADDR2

wKiom1ezKI6i31WHAACpGwrfNj4799.png-wh_50

将更改的代码同步后,编译运行测试可知,开发板可以和虚拟机ping通,使用tftp进行下载时也正常,至此三星官方uboot的移植已经完成