博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

jiuzhuaxiong

创造属于你的天空,有了问题可以跟大家一起讨论! 在LINUX和VXWORKS嵌入式开发中学到了一些经验跟大家分享!
  jiuzhuaxiong.cublog.cn

关于作者
姓名:HugBear2008
QQ:280051265
年龄:25
位置:中国.广州
E-MAIL:jiuzhuaxiong@163.com
|| << >> ||
我的分类


移植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
......
}

屏蔽检测和延时的语句。

回目录 移植U-Boot.1.3.1到S3C2410和S3C2440

发表于: 2008-03-03,修改于: 2008-03-03 00:36,已浏览230次,有评论0条 推荐 投诉





网友评论

网友: 刚学嵌入式的菜鸟 时间:2008-03-05 17:36:09 IP地址:58.49.224.★



真的很感谢你啊,朋友,学习中。




网友: skyful_stars 时间:2008-03-10 17:31:38 IP地址:218.58.60.★



你好,我是刚开始学习linux,我使用的是扬创的YC2440的板子,用你的这个方法在Fedora8系统下编译u-boot 1.1.4 (官网的源包)环境是arm-linux-gcc 2.95.3,应该适用吧?但我怎么第一步编译就不能通过呢?不只如此我编译内核自带的smdk2410_config都是同样的错误,最后的错误提示

in -ffreestanding -nostdinc -isystem /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include -pipe  -DCONFIG_ARM -D__ARM__ -march=armv4 -mabi=apcs-gnu -Wall -Wstrict-prototypes -c -o hello_world.o hello_world.c

cc1: Invalid option `abi=apcs-gnu'

make[1]: *** [hello_world.o] 错误 1

make[1]: Leaving directory `/utuLinux/s3c2440/u-boot-1.1.4/examples'

make: *** [examples] 错误 2



能指导下问题出在哪里了吗?万分感谢!

Blog作者的回复:
这种时候 google 一下其实很好解决,给你两个链接:
http://hi.baidu.com/wangy0919/blog/item/55390c60093e6edd8db10dc5.html
http://www.lupaworld.com/32316/viewspace_14587.html

发表于: 2008-03-31,修改于: 2008-03-31 22:30,已浏览260次,有评论0条 推荐 投诉


网友评论
 发表评论