当前位置:  技术问答>linux和unix

uboot1.1.6——DM9000移植问题,求点击

    来源: 互联网  发布时间:2017-05-13

    本文导语:  帖子有些屁长,希望大家能耐心看完~~ 最近在学习uboot,所以选用了较低版本的u-boot-1.1.6,移植到mini2440,现在在dm9000网卡驱动这卡住了。 过程是这样的: 1、在board/mini2440/mini24440.h中添加dm9000的需要的一些宏定义 #if 0 ...

帖子有些屁长,希望大家能耐心看完~~
最近在学习uboot,所以选用了较低版本的u-boot-1.1.6,移植到mini2440,现在在dm9000网卡驱动这卡住了。
过程是这样的:
1、在board/mini2440/mini24440.h中添加dm9000的需要的一些宏定义
#if 0
#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
#define CS8900_BASE 0x19000300
#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
#endif

#define CONFIG_DRIVER_DM9000 1
#define CONFIG_NET_MULTI         1
#define CONFIG_DM9000_NO_SROM    1
#define CONFIG_DM9000_BASE 0x20000300   //网卡片选地址
#define DM9000_IO CONFIG_DM9000_BASE  
#define DM9000_DATA (CONFIG_DM9000_BASE + 4) //网卡数据地址

#define CONFIG_BOOTDELAY 3
/*#define CONFIG_BOOTARGS     "root=ramfs devfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR         08:00:3e:26:0a:5b 
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR 172.31.108.211//开发板IP地址
#define CONFIG_SERVERIP 172.31.108.66//Linux主机IP地址



2、net/eth.c中的eth_initialize函数中添加
#ifdef CONFIG_DRIVER_DM9000
dm9000_initialize(bis);
#endif


3、drivers/dm9000x.c中添加参照高版本的写法添加dm9000_get_enetaddr和dm9000_initialize函数
static void dm9000_get_enetaddr(struct eth_device *dev)
{
#if !defined(CONFIG_DM9000_NO_SROM)
int i;
for (i = 0; i enetaddr + (2 * i));
#endif
}
int dm9000_initialize(bd_t *bis)
{
struct eth_device *dev = &(dmfe_info.netdev);

// Load MAC address from EEPROM 
dm9000_get_enetaddr(dev);

dev->init = eth_init;
dev->halt = eth_halt;
dev->send = eth_send;
dev->recv = eth_rx;
sprintf(dev->name, "dm9000");

eth_register(dev);

return 0;
}

上面用到的结构体dmfe_info中需要先添加成员
/* Structure/enum declaration ------------------------------- */
typedef struct board_info {
u32 runt_length_counter; /* counter: RX length  1514byte */
u32 reset_counter; /* counter: RESET */
u32 reset_tx_timeout; /* RESET caused by TX Timeout */
u32 reset_rx_status; /* RESET caused by RX Statsus wrong */
u16 tx_pkt_cnt;
u16 queue_start_addr;
u16 dbug_cnt;
u8 phy_addr;
u8 device_wait_reset; /* device state */
u8 nic_type; /* NIC type */
unsigned char srom[128];
        struct eth_device netdev;
} board_info_t;
board_info_t dmfe_info;

4、drivers/dm9000x.c中的eth_init函数进行修改

...
/* Set Node address */
#ifndef CONFIG_AT91SAM9261EK
for (i = 0; i bi_enetaddr)[i] = read_srom_word(i);
#endif

if (is_zero_ether_addr(bd->bi_enetaddr) ||
    is_multicast_ether_addr(bd->bi_enetaddr)) {
/* try reading from environment */
u8 i;
char *s, *e;
s = getenv ("ethaddr");
for (i = 0; i bi_enetaddr[i] = s ?
simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
}
...
...

#if 0  //屏蔽掉dm9000_init函数中的这一部分,不然使用网卡的时候会报“could not establish link”的错误
i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish linkn");
return 0;
}
}

/* see what we've got */
lnk = phy_read(17) >> 12;
printf("operating at ");
switch (lnk) {
case 1:
printf("10M half duplex ");
break;
case 2:
printf("10M full duplex ");
break;
case 4:
printf("100M half duplex ");
break;
case 8:
printf("100M full duplex ");
break;
default:
printf("unknown: %d ", lnk);
break;
}
printf("moden");
#endif
...
...


我就做了就这些,编译uboot后,问题出来了:
1、报错eth_init;eth_halt;eth_send;eth_rx;这四个函数重复定义
我看了一下,确实eth.c和dm9000x.c下都有这四个函数,高版本的uboot已经把dm9000.c中的这四个函数改为dm9000_init;dm9000_halt;dm9000_send;dm9000_rx;所以也就改了这四个函数和用到他们的地方,编译没有错误了
但是之前没有修改dm9000的那些地方之前编译却不会报错,这是为什么呢?不重复吗?我也没有发现对这四个函数有什么条件编译、、求大家解释解释!

2 下载编译生成的bin后,串口显示
...
in:    serial
out:   serial
error: serial
net:   dm9000
没有错误,但是printenv后显示的ipaddr和serveraddr等网卡信息都是之前默认的,10.0.0.110、10.0.0.1,根本没有显示我修改的。
我查了一下源码,在smdk2410.h中定义了这一ip值,我就不明白了,为什么会用到它?

3、board.c中先执行
/* initialize environment */
env_relocate ();
然后再调用eth_initialize,我跟踪代码发现有一个结构体default_environment经常被用到
static uchar default_environment[] = {
#if defined(CONFIG_BOOTARGS)
"bootargs=" CONFIG_BOOTARGS ""
#endif
#if defined(CONFIG_BOOTCOMMAND)
"bootcmd=" CONFIG_BOOTCOMMAND ""
#endif
#if defined(CONFIG_RAMBOOTCOMMAND)
"ramboot=" CONFIG_RAMBOOTCOMMAND ""
#endif
#if defined(CONFIG_NFSBOOTCOMMAND)
"nfsboot=" CONFIG_NFSBOOTCOMMAND ""
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
"bootdelay=" MK_STR (CONFIG_BOOTDELAY) ""
#endif
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
"baudrate=" MK_STR (CONFIG_BAUDRATE) ""
#endif
#ifdef CONFIG_LOADS_ECHO
"loads_echo=" MK_STR (CONFIG_LOADS_ECHO) ""
#endif
#ifdef CONFIG_ETHADDR
"ethaddr=" MK_STR (CONFIG_ETHADDR) ""
#endif
#ifdef CONFIG_ETH1ADDR
"eth1addr=" MK_STR (CONFIG_ETH1ADDR) ""
#endif
#ifdef CONFIG_ETH2ADDR
"eth2addr=" MK_STR (CONFIG_ETH2ADDR) ""
#endif
#ifdef CONFIG_ETH3ADDR
"eth3addr=" MK_STR (CONFIG_ETH3ADDR) ""
#endif
#ifdef CONFIG_ETHPRIME
"ethprime=" CONFIG_ETHPRIME ""
#endif
#ifdef CONFIG_IPADDR
"ipaddr=" MK_STR (CONFIG_IPADDR) ""
#endif
#ifdef CONFIG_SERVERIP
"serverip=" MK_STR (CONFIG_SERVERIP) ""
#endif
#ifdef CFG_AUTOLOAD
"autoload=" CFG_AUTOLOAD ""
#endif
#ifdef CONFIG_ROOTPATH
"rootpath=" MK_STR (CONFIG_ROOTPATH) ""
#endif
#ifdef CONFIG_GATEWAYIP
"gatewayip=" MK_STR (CONFIG_GATEWAYIP) ""
#endif
#ifdef CONFIG_NETMASK
"netmask=" MK_STR (CONFIG_NETMASK) ""
#endif
#ifdef CONFIG_HOSTNAME
"hostname=" MK_STR (CONFIG_HOSTNAME) ""
#endif
#ifdef CONFIG_BOOTFILE
"bootfile=" MK_STR (CONFIG_BOOTFILE) ""
#endif
#ifdef CONFIG_LOADADDR
"loadaddr=" MK_STR (CONFIG_LOADADDR) ""
#endif
#ifdef CONFIG_PREBOOT
"preboot=" CONFIG_PREBOOT ""
#endif
#ifdef CONFIG_CLOCKS_IN_MHZ
"clocks_in_mhz=" "1" ""
#endif
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
"pcidelay=" MK_STR (CONFIG_PCI_BOOTDELAY) ""
#endif
#ifdef  CONFIG_EXTRA_ENV_SETTINGS
CONFIG_EXTRA_ENV_SETTINGS
#endif
"" /* Termimate env_t data with 2 NULs */
};

问题是,这里的CONFIG_XXX  在很多.h(include/config/xxx.h)都定义到了,怎么才能确定他们用到的是哪个.h文件的值呢,问题2是不是因为这里的结构体值错误而出现的呢?

问题可能比较小白,没办法,才学uboot的,两天了,是在理不出头绪,都郁闷出翔了~~所以在这里发帖向大家求助,希望大家给与些帮助和建议,不管哪方面的,再次表示感谢!
另外贴出uboot1.1.6的下载地址:ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.6.tar.bz2

|
U-boot在mini2440里,已经有人移植好了,你可以直接参考。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • uboot1.2.0烧写到开发板上后的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,