五,移植uboot-支持DM9000网卡

文档时间:2018-08-13

交叉编译器:arm-linux-gcc-4.3.2

Ubuntu版本:16.04

uboot版本:2013.10

1,修改代码,把 DM9000 编译进 uboot

uboot-2013.10本身就带有 dm9000网卡驱动的支持,相关代码位于 drivers/net 下的 dm9000x.c 和 dm9000x.h 文件

前面章节修改的 uboot 打印信息如下:

uboot 默认支持的网卡是 CS8900,打开 drivers/net 目录下的 Makefile,找到与 cs8900 和 dm9000 有关的语句:

 

可以看出要想将 dm9000x.c 文件编译进去,必须包含 CONFIG_DRIVER_DM9000 这个宏,搜索 CONFIG_CS8900 位于 include/configs/jz2440.h 文件中,仿照其它单板对 dm9000 网卡的支持,

修改 include/configs/jz2440.h,修改代码如下(红色部分为修改部分):

/*
 * Hardware drivers
 */
//#define CONFIG_CS8900        /* we have a CS8900 on-board */
//#define CONFIG_CS8900_BASE    0x19000300
//#define CONFIG_CS8900_BUS16    /* the Linux driver does accesses as shorts */

#define    CONFIG_DRIVER_DM9000        1
#define    CONFIG_DM9000_BASE        0x20000000    /* CS4 */
#define    DM9000_IO            (CONFIG_DM9000_BASE)
#define    DM9000_DATA            (CONFIG_DM9000_BASE + 4)

 CONFIG_DM9000_BASE 和 DM9000_DATA 值得确定是参照 JZ2440原理图设定,如下图所示:

CS 信号接的是 nGS4 引脚,因此值为 0x20000000,LADDR2 接 CMD 引脚,因此偏移量为 4

2,分析网卡驱动的启动流程,加载 DM9000 的初始化

uboot 第二阶段的入口函数为 board_init_r (位于 arch/arm/lib/board.c 文件中),打开 board_init_r 函数:

此句为以太网初始化函数,打开 board_init_r->eth_initialize 函数(位于 net/eth.c 文件中):

然后打开 board_init_r->eth_initialize->board_eth_init 函数(位于 board/samsung/jz2440.c 文件中):

可以看出只有对 CS8900 网卡的支持,没有 DM9000的初始化,仿照其它单板对 DM9000 的初始化,修改代码(红色为修改部分):

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
    int rc = 0;
#ifdef CONFIG_CS8900
    rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif

#ifdef CONFIG_DRIVER_DM9000
    rc = dm9000_initialize(bis);
#endif

    return rc;
}
#endif

 然后编译,烧写,测试,打印如下图所示:

已经识别出 DM9000 ,接下来实验能不能 ping 通 PC机,输入命令:

set ipaddr 192.168.2.90
ping 192.168.2.101

 出现如下错误:

说明未设置 MAC 地址,参考别人设置的 MAC 地址,设置如下:

set ethaddr 00:0c:29:3b:22:2a    //设置MAC地址
ping 192.168.2.101                 //重新ping

 可以 ping 成功:

(PS:如果还是不能ping成功,检查一下lowlevel_init.S 中内存控制器的位宽有没有设置正确)

使用 tftp 烧写u-boot.bin(烧写之前需要打开tftp PC端的服务):

set ipaddr 192.168.2.90    //设置本机ip地址
set serverip 192.168.2.101  //设置服务器ip地址
set ethaddr 00:0c:29:3b:22:2a  //设置MAC地址
tftp 30000000 u-boot.bin nand erase 0 80000 nand write 30000000 0 80000

 成功烧写。。。说明DM9000网卡驱动移植成功

原文地址:https://www.cnblogs.com/zhyy-mango/p/9452041.html