Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1273714
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: 嵌入式

2011-02-08 21:28:49

在/include/configs/smdk2440.h文件中修改添加对DM9000的支持,屏蔽CS8900:

//#define CONFIG_DRIVER_CS8900     
//#define CS8900_BASE        0x19000300
//#define CS8900_BUS16   1

#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 的定义最为重要。不同的板子只要修改这个参数即可。友善之臂的mini2440的DM9000在BANK4上所以定义为“0x20000000”,即网卡的访问基址为0x19000000,在这里这所以再偏移0x300是由经的特性决定的。

  这样定义完之后,重新编译主可以实现对DM9000的支持。ping和tftp都可以实现。但是有些问题:

(1)网卡的MAC地址与你设置的不一样
(2)会有“could not establish link” 的提示,而且在显示MAC地址后很久后才响应。

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

   修正BUG(修改/drivers/dm9000x.c文件)

(1)网卡MAC地址错误的解决方法:
修改后的内容如下:

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

   

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


    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;
    }

    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” 提示和慢响应的解决方法:


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

    DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);   
    DM9000_iow(DM9000_IMR, IMR_PAR);   

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

   
    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秒钟。通过改完上面就可以实现ping和tftp了,呵感觉真好!下载大文件超快
 到这为止,U-BOOT已经可以支持NOR Flash,DM9000,接下来的目标是要实现支持NAND Flash,支持烧写yaffs文件系统映象。
阅读(797) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~