Chinaunix首页 | 论坛 | 博客
  • 博客访问: 489100
  • 博文数量: 130
  • 博客积分: 2111
  • 博客等级: 大尉
  • 技术积分: 1373
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-28 09:55
个人简介

IT民工

文章分类

全部博文(130)

文章存档

2021年(1)

2019年(1)

2017年(3)

2014年(1)

2013年(3)

2012年(2)

2011年(3)

2010年(2)

2009年(114)

分类: 嵌入式

2009-09-01 13:28:41

DM9000网卡驱动移植到u-boot[转]
2008-04-16 23:55:01

原文地址:http://blog.chinaunix.net/u1/34474/showart.php?id=401078
移植U-Boot.1.2.0到友善之臂SBC2440V4
(补:DM9000网卡移植)
  昨天《移植U-Boot.1.2.0到友善之臂SBC2440V4(s3c2440AL)》已经上传。里面介绍的移植是用SC8900网卡,而 SBC2440V4是双网卡设计,除了SC8900(10M)外,还有DM9000(10/100M).其实要在U-Boot下使用DM9000也是很容 易的事,因为U-Boot的DM9000驱动是可用的(虽然有BUG,但功能可以实现)。

移植参考的资料:
(1)
WeiBing的博客文章: u-boot 1.1.5 移植成功 在这里感谢 WeiBing的分享。

(2)DM9000的英文数据手册。


    在《移植U-Boot.1.2.0到友善之臂SBC2440V4(s3c2440AL)》的基础上,在/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地址与你设置的不一样
(2)会有“could not establish link” 的提示,而且在显示MAC地址后很久后才响应。

这两个问题我认为是U-Boot的DM9000源码的BUG。追踪源码可以知道:这些都是发生在int eth_init(bd_t * bd)初始化时的错误。

    修正BUG(修改/drivers/dm9000.c文件)
(1)
网卡MAC地址错误的解决方法:

/* Initilize dm9000 board
*/
int
eth_init(bd_t * bd)
{
    ......

    /* Set Node address */
/*    for (i = 0; i < 6; i++)
        ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
*/
//tekkamanninja   
    char *tmp = getenv ("ethaddr");
    char *end;

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

    /* 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("mode\n");
#endif
    return 0;
}
红色的字符是要做的修改:功能是屏蔽无用的语句。其实被屏蔽的语句是MII接口用的,放在这显然是错误的,无端的浪费了10秒钟。


至此,U-Boot的2440移植结束了,两张网卡要用哪张随你便。只要重新编译一下就好了。GOOD LUCK!
阅读(1368) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~