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

Tekkaman Ninja

Linux我的梦想,我的未来! 专注linux内核和驱动!本博客的原创文章的内容会不定期更新或修正错误! 转载文章都会注明出处,若有侵权,请即时同我联系,我一定马上删除!! 原创文章版权所有!如需转载,请注明出处: tekkman.cublog.cn ,谢谢合作!!!!!
  tekkman.cublog.cn

关于作者
姓名:Tekkaman  Ninja
职业:ARM9+Linux
年龄:25
位置:福建龙岩
个性介绍:钻研嵌入式Linux技术
E-Mail:tekkamanninja@163.com
|| << >> ||
我的分类


移植U-Boot.1.3.1到S3C24X0(补:DM9000网卡移植)
移植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,已浏览979次,有评论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


网友: skyful_stars 时间:2008-03-11 09:09:55 IP地址:218.58.60.★
谢谢,这个问题解决了。
在你的说明里,#include <status_led.h>    /*这是针对AT91RM9200DK开发板的。对于SCB2440V4也有4个LED指示灯,我用来指示程序用行的进度。*/
我的板子也有4个LED,也想这么用,但我找你给的文件里没找到 status_led.h这个文件,还有#if    defined(CONFIG_AT91RM9200DK)
    bl coloured_LED_init
    bl red_LED_on
#endif
这里面的2个函数,是在哪里?可否给我发过来,我刚开始学这个,比较菜!谢谢!skyful_stars@126.com

Blog作者的回复:
在\board\at91rm9200dk\led.c


网友: skyful_stars 时间:2008-03-11 09:49:40 IP地址:218.58.60.★
我在1.3.1源包里找到了4个status_led.h文件,这里是使用的哪个?
/include   /include/asm-nios  /include/asm-nios2  /include/asm-ppc ,应该是第一个吧?能否把你的发过来参考下?

Blog作者的回复:
看你是用什么芯片,一般会是第一个


网友: 本站网友 时间:2008-03-16 15:59:18 IP地址:59.173.129.★
I have a problem with DM9000.Can I look at your file lowlevel_init.S?
my E-mail chensi_04@126.com
Thank you!

Blog作者的回复:
已发给你了


网友: 本站网友 时间:2008-04-02 23:36:19 IP地址:210.76.98.★
我的nand flash是三星的64m,移植成功,但是saveenv出错。
puts ("Writing to Nand... ");没执行。
估计是前面的nand_legacy_erase错误。请问怎末解决?谢谢

网友: 本站网友 时间:2008-04-02 23:42:40 IP地址:210.76.98.★
惭愧,搞定了。居然忘记屏蔽return 1了。呵呵。

网友: conding 时间:2008-04-08 10:48:24 IP地址:59.54.98.★
楼上的兄弟屏蔽return 1干什么?那 应该是出错返回阿?

网友: conding 时间:2008-04-08 11:31:50 IP地址:59.54.98.★
 Tekkaman,想请问下如果要考虑直接将uboot下载到ram中执行是否要保留
relocate:                /* relocate U-Boot to RAM     */
    adr    r0, _start        /* r0 <- current position of code */
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    cmp r0, r1 /* don't reloc during debug */
    beq stack_setup
可是我的移植还是不支持

Blog作者的回复:
看你是nand boot还是nor boot
nand boot:
无需保留,按我的代码改就好了

nor boot:
保留,并去除测试uboot是否在内存中的指令。


网友: kamiuouc 时间:2008-04-14 15:06:54 IP地址:221.0.131.★
你好!我在S3c2410上移植uboot1.3.1网卡是DM9000AEP,没有nor flash,两片三星的32M nand flash,现在移植差不多了。只是板子ping不通主机,而且插上交叉线网卡LED也不亮,只是ping的时候亮一下就灭了,提示
host 192.168.7.6 not alive
请问是不是网卡驱动的问题,我就是用的uboot里的DM9000的驱动没有改,谢谢

Blog作者的回复:
不知是不是你的host防火墙的问题,先确认它已关闭,再试试。

DM9000的驱动只要 基地址之类的设置好了,驱动不改也能用的。


网友: 本站网友 时间:2008-05-11 16:41:21 IP地址:59.173.130.★
楼主,你好。我也是SBC2440 V4的板子,由于原有的VIVI好像不能用了,U-boot弄了几天没跑起来,不知道板子是不是有问题(买回放了大半年)。可不可以把你的SBC2440 v4的u-boot的bin文件发给我。
chensi_04@126.com   万分感激

网友: 本站网友 时间:2008-05-17 04:08:22 IP地址:222.131.35.★
楼主,您好。我用的也是博创2410的板子,正是拜读了楼主的两篇文章,才使我在移植u-boot-1.2.0和linux2.6.25的过程中少走了不少弯路。真是万分感激!
对了,楼主,您移植过博创2410板子上的声卡驱动没有?我在网上找了一段关于S3C2410上Uda1341声卡芯片的驱动代码(linux2.6),同时参照博创光盘上linux2.4.18中的移植好的代码做了修改,但是在播放声音的时候,总是出现dma enqueue failed.的错误,跟进去发现是在内核树中的dma.c文件s3c2410_dma_waitforload函数调用失败,打印dma3: loadbuffer: timeout loading buffer的信息。我修改的部分主要是将L3MODE、L3CLOCK和L3DATA连接的GPIO端口改成了GPG8、GPG9和GPG10。一直弄不清楚是什么原因,不知道楼主有没有这样的经历,谢谢!

Blog作者的回复:
声卡方面已经放音成功,全双工的还没做,做好了会上传!

Linux2.6.18以上的UDA1341驱动需要修改才能用。主要是DMA驱动有点小问题。具体的我有空会写一份移植文档。


网友: 本站网友 时间:2008-05-26 20:14:36 IP地址:124.64.177.★
楼主,您好。能不能把uda1341驱动的文件先发一份给我,谢谢!
zhj8407@163.com

网友: 本站网友 时间:2008-06-08 17:02:20 IP地址:121.28.194.★
老兄按你的方法移植了boot,结果网卡灯点亮了,可ping不到,ping自己也ping不到,是什么原因阿,启动信息如下:
U-Boot 1.1.3 (Jun  5 2008 - 11:52:08)


U-Boot code: 33F80000 -> 33FA7974  BSS: -> 33FEA100

RAM Configuration:

Bank #0: 30000000 64 MB

Flash:  2 MB

In:    serial

Out:   serial

Err:   serial

dm9000 i/o: 0x10000300, id: 0x90000a46 

MAC: ff:ff:ff:ff:ff:ff

operating at unknown: 15 mode

Hit any key to stop autoboot:  0 

KILL2440 # 
有时还为:
U-Boot code: 33F80000 -> 33FA7890  BSS: -> 33FEA000

RAM Configuration:

Bank #0: 30000000 64 MB

Flash:  2 MB

In:    serial

Out:   serial

Err:   serial

dm9000 i/o: 0x10000300, id: 0x90000a46 

could not establish link

Hit any key to stop autoboot:  0 

请给予解答,谢谢了,

网友: 本站网友 时间:2008-06-12 16:02:04 IP地址:118.26.196.★
博主,你好,看了你关于u-boot的文章收获颇多,按照你的方法移植了u-boot可以启动了,但是还有个问题希望向博主请教。u-boot启动后进入命令行,网卡的灯不亮,在ping一次,或者是tftp链接一下灯就会亮起,此后一切正常,是不是在uboot启动的时候没有默认激活网卡?查看了板子上带的u-boot的启动,灯会自动亮起的。
比较了各种情况后发现,当启动命令行出现
dm9000 i/o: 0x19000300, id: 0x90000a46 

MAC: 01:02:03:04:05:06
后网卡灯即亮起。查看了代码不知道这一功能应该在何处加入,请问博主有没有这种经历,请赐教,谢谢

 发表评论