您的位置:首页 > 其它

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

2010-12-28 14:55 281 查看



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“。这个问题足足浪费我一天时间,最后发现是防火墙问题,把系统防火墙关闭就正常。不过我在另一台台式机上测试,防火墙开了也没啥影响,就是
在我这台笔记本上不行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: