drivers/dm9000x.c eth_init()函数 这里的初始化并不复杂,首先对dm9000进行复位
static void
dm9000_reset(void)
{
DM9000_DBG("resetting\n");
DM9000_iow(DM9000_NCR, NCR_RST);
udelay(1000);
}
这里将NRC寄存器的第0位置1,之后要保持至少20us的延时。这里延时了1ms。
int
dm9000_probe(void)
{
u32 id_val;
id_val = DM9000_ior(DM9000_VIDL);
id_val |= DM9000_ior(DM9000_VIDH) << 8;
id_val |= DM9000_ior(DM9000_PIDL) << 16;
id_val |= DM9000_ior(DM9000_PIDH) << 24;
if (id_val == DM9000_ID) {
printf("dm9000 i/o: 0x%x, id: 0x%x \n", CONFIG_DM9000_BASE,
id_val);
return 0;
} else {
printf("dm9000 not found at 0xx id: 0xx\n",
CONFIG_DM9000_BASE, id_val);
return -1;
}
}
复位结束后到网卡的vendor ID寄存器和product ID寄存器读取id,检测此网卡是否是dm9000。
static void
identify_nic(void)
{
struct board_info *db = &dmfe_info;
u16 phy_reg3;
DM9000_iow(DM9000_NCR, NCR_EXT_PHY);
phy_reg3 = phy_read(3);
switch (phy_reg3 & 0xfff0) {