uboot 添加 DM9000支持,作为uboot移植网卡驱动参考

时间:2023-01-16 17:13:49

uboot 1.1.6添加dm9000支持

 

 

 

前两天在6410开发板上玩了玩u-boot,开发板是友坚的6410开发板,配套的光盘中给的是很古老的u-boot 1.1.6,而且没有网络支持。从网上下了个最新的uboot-2010.06版本,看了下发现它并不支持6410的SD卡启动模式,本来是想移植下,使得新版本也支持SD卡启动,但现在时间很紧张,没那么多时间慢慢玩了,于是就想把dm9000弄上去。

本来以为dm9000这类的大白菜,uboot肯定是一切ok了,但google了下,发现有人说低版本的uboot带的dm9000x.c驱动是不支持dm9000a的,只支持比较老的dm9000x。于是看linux 2.6.32内核代码,发现有dm9000驱动,对比了下,也没觉得有多大差别,为了省事,又看了下uboot2010.06版本里面的dm9000驱动。看注释,发现它已经支持dm9000ae了。于是直接拷贝过来,替换原先的dm9000x.c。

在include/configs/smdk6410.h中添加

#define CONFIG_DRIVER_DM9000 1

#define CONFIG_DM9000_BASE 0X18000300

#define DM9000_IO  CONFIG_DM9000_BASE

#define DM9000_DATA (CONFIG_DM9000_BASE+4)

#define CONFIG_DM9000_NO_SROM   1

注销其他网卡芯片的支持,比如//#define CONFIG_DRIVER_SMC911X      1     /* we have a SMC9115 on-board */

再添加:

#define CONFIG_NET_MULTI    1

 

修改board/smdk6410.c

本来里面好像是cs8900的,所以里面有这么一些与cs8900相关的代码:

#define CS8900_Tacs    (0x0)      // 0clk            address set-up

#define CS8900_Tcos    (0x4)      // 4clk            chip selection set-up

#define CS8900_Tacc    (0xE)      // 14clk   access cycle

#define CS8900_Tcoh    (0x1)      // 1clk            chip selection hold

#define CS8900_Tah      (0x4)      // 4clk            address holding time

#define CS8900_Tacp    (0x6)      // 6clk            page mode access cycle

#define CS8900_PMC    (0x0)      // normal(1data)page mode configuration

static void cs8900_pre_init(void)

{

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

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

       SROM_BC1_REG = ((CS8900_Tacs<<28)+(CS8900_Tcos<<24)+(CS8900_Tacc<<16)+(CS8900_Tcoh<<12)+(CS8900_Tah<<8)+(CS8900_Tacp<<4)+(CS8900_PMC));

}

 

int board_init(void)

{

       DECLARE_GLOBAL_DATA_PTR;

 

       cs8900_pre_init();//改为dm9000_pre_init

 

       gd->bd->bi_arch_number = MACH_TYPE;

       gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);

 

#if 0

       icache_enable();

       dcache_enable();

#endif

       return 0;

}

把所有cs8900改为dm9000,代码是不需要改的,对照s3c6410手册,这块memory访问的配置是没问题。这个开发板是用的是16bit的模式,所以确认cs8900_pre_init确实是把总线初始化为16bit模式的。

 

在net/eth.c中添加

extern int dm9000_initialize(bd_t*);

 

int eth_initialize(bd_t *bis)

{

       char enetvar[32], env_enetaddr[6];

       int i, eth_number = 0;

       char *tmp, *end;

 

       eth_devices = NULL;

       eth_current = NULL;

 

#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)

       miiphy_init();

#endif

#if defined(CONFIG_DRIVER_DM9000)

 

       dm9000_initialize(bis);//这是我添加的

#endif

#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)

       mv6436x_eth_initialize(bis);

#endif

 

编译测试。顺便说下,这个工作看起来是简单的,但仍然碰到一些问题,花了两天时间才搞定。特别开始的时候忘记定义#define CONFIG_DM9000_NO_SROM   1

结果导致每次mac地址都不对,后来看了下代码,才发现如果没有定义CONFIG_DM9000_NO_SROM,则uboot会从eeprom中读mac地址,dm9000是支持eeprom接口的,但友坚开发板上并没有用这个功能,所以需要设置CONFIG_DM9000_NO_SROM。

还遇到个恶心的问题,就是ping不通,一会说checksum bad,一会又是无任何提示的,直接给出”host is not active“。这个问题足足浪费我一天时间,最后发现是防火墙问题,把系统防火墙关闭就正常。不过我在另一台台式机上测试,防火墙开了也没啥影响,就是在我这台笔记本上不行。