• 五,移植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网卡驱动移植成功

  • 相关阅读:
    Linux- 关于windows和Linux和Mac的换行符
    HIVE- 大数据运维之hive管理
    MySQL- SQL UNION 和 UNION ALL 操作符
    【loj3044】【zjoi2019】Minimax
    【loj3043】【zjoi2019】线段树
    【uoj336】【清华集训2017】无限之环
    【cf contest 1119 F】Niyaz and Small Degrees
    【学习笔记 边分树】【uoj400】【CTSC2018】暴力写挂
    【纪中集训2019.3.25】礼物
    【纪中集训2019.3.25】芬威克树
  • 原文地址:https://www.cnblogs.com/zhyy-mango/p/9452041.html
Copyright © 2020-2023  润新知