Chinaunix首页 | 论坛 | 博客
  • 博客访问: 456876
  • 博文数量: 362
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-26 17:08
文章分类

全部博文(362)

文章存档

2015年(362)

我的朋友

分类: LINUX

2015-12-11 00:34:51

移植U-Boot.1.3.1到S3C24X0(补:DM9000网卡移植)
 
对于U-Boot1.2.0和U-Boot1.3.1,DM9000的驱动有一点小变化,就是添加了从U-Boot的参数中提取MAC地址的语句(应该是可以避免网卡的MAC地址与设置的不同的情况)。具体修改如下:
 
在/include/configs/tekkaman2440.h文件中修改添加对DM9000的支持,屏蔽CS8900:

/*
 * Hardware drivers
 */

//#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 */


#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT

 
   在这里#define CONFIG_DM9000_BASE 的定义最为重要。不同的板子只要修改这个参数即可。友善之臂的SBC2440V4上的DM9000在BANK4上所以定义为“0x20000300”。有的板子是在BANK1上,就为“0x08000300”。
 
    这样定义完之后,就可以“make”,然后下载到板上运行。ping和tftp都可以实现。但是有些问题:
(1)网卡的MAC地址与你设置的不一样(在U-boot1.3.1中可能不会出现,没有试验过)
(2)会有“could not establish link” 的提示,而且在显示MAC地址后很久后才响应。
追踪源码可以知道:这些都是发生在int eth_init(bd_t * bd)初始化时的问题。
    修正BUG(修改/drivers/dm9000.c文件)
 
(1)网卡MAC地址错误的解决方法:

/* Initilize dm9000 board
*/

int
eth_init(bd_t * bd)
{
    ......

//tekkamanninja

    /* Set Node address */
/*    for (i = 0; i < 6; i++)
        ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);

    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 < 6; ++i) {
            bd->bi_enetaddr[i] = s ?
                simple_strtoul (s, &e, 16) : 0;
            if (s)
                s = (*e) ? e + 1 : e;
        }
//    }

//tekkamanninja

    printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", bd->bi_enetaddr[0],
           bd->bi_enetaddr[1], bd->bi_enetaddr[2], bd->bi_enetaddr[3],
           bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
......

 
红色的字符是要做的修改:功能是屏蔽原有获取MAC地址的语句,直接使用从U-Boot的参数区读取数据并存到bd->bi_enetaddr[i]中。
 
(2)“could not establish link” 提示和慢响应的解决方法:
 

/* Initilize dm9000 board
*/

int
eth_init(bd_t * bd)
{
    ......

    DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN); /* RX enable */
    DM9000_iow(DM9000_IMR, IMR_PAR); /* Enable TX/RX interrupt mask */

#if 0
    i = 0;
    while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
        udelay(1000);
        i++;
        if (i == 10000) {
            printf("could not establish link\n");
            return 0;
        }
        printf(" link=%d\n",i);
    }
#endif
......
}

屏蔽检测和延时的语句。
阅读(398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~