zoukankan      html  css  js  c++  java
  • u-boot移植(十二)---代码修改---支持DM9000网卡

    一、准备工作

    1.1 原理图

      

      CONFIG_DM9000_BASE

      片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定。

      在三星2440的DATASHEET中memory control这一章的Figure 5-1. S3C2440A Memory Map after Reset 已经说明了片选4的地址,如下:

      

      只要发出的信号在 0x20000000--0x28000000 之间,就会使得片选4引脚变为低电平。所以可以确定我们网卡的基地址为0x20000000。

      CONFIG_DM9000_IO 和CONFIG_DM9000_DATA

       LADDR2 接在网卡的CMD引脚上,即CPU在LADDR2上发出高电平或低电平的时候可以去访问某个地址。这些地址称为IO地址和DATA地址。

      LADDR2 对应 100,即为4。

      之后就是位宽要确定,根据原理图,可以确定的是DM9000为16位的位宽(LDATA0~LADATA15)。那么要设置BWSCON寄存器:

      

      DW4应该置1。这一项可以更改 low_level_init 中的寄存器的值进行设置。

      再检查时序,时序在BANKCON4寄存器中设置,默认值也可以,寄存器也在low_level_init 中的寄存器的值进行设置。

      修改下Toch的值,改为2个时钟的保持时间。

      

    1.2 修改参数

      u-boot 中已经有了DM9000的驱动,即dm9000x.c,现在要将DM9000的网卡驱动加进u-boot中进行编译。

      在drivers/net/Makefile文件中已经加进了dm9000x.c的编译文件,如下:

      

      现在要修改include/configs/jz2440.h文件,来支持dm9000x:

      

      改为:

      

      编译运行一次:

      

      运行成功,烧写:

      

    二、代码修改

      搜索:No ethernet found.

      

      这里涉及到两个函数 eth_initialize 和 eth_init

        查看board_r.c中的init_sequence_r链表,找到网路的初始化程序。

      

      进入查看:

      

      这里调用的是 eth_initialize()函数。

      

      根据打印信息可以确定是调用的下面的那个。

      

      由代码可以看出  应该是在 eth_common_init()函数中初始化失败导致eth_devices初始化失败的。

      

      代码中调用了board_eth_init函数Jz2440.c (boardsamsungjz2440):

      

      这里只定义了 CONFIG_CS8900 并没有9000网卡,修改代码:

      

      编译运行:

      

      报告有错误:dm9000 address not set

      MAC地址未设置。

      对着打印信息查看代码,可以知道打印此条信息的代码是eth_write_hwaddr这个函数,这个函数在eth_initlize中调用:

     1 int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
     2            int eth_number)
     3 {
     4     unsigned char env_enetaddr[6];
     5     int ret = 0;
     6 
     7     eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr);
     8 
     9     if (!is_zero_ethaddr(env_enetaddr)) {
    10         if (!is_zero_ethaddr(dev->enetaddr) &&
    11             memcmp(dev->enetaddr, env_enetaddr, 6)) {
    12             printf("
    Warning: %s MAC addresses don't match:
    ",
    13                    dev->name);
    14             printf("Address in SROM is         %pM
    ",
    15                    dev->enetaddr);
    16             printf("Address in environment is  %pM
    ",
    17                    env_enetaddr);
    18         }
    19 
    20         memcpy(dev->enetaddr, env_enetaddr, 6);
    21     } else if (is_valid_ethaddr(dev->enetaddr)) {
    22         eth_setenv_enetaddr_by_index(base_name, eth_number,
    23                          dev->enetaddr);
    24     } else if (is_zero_ethaddr(dev->enetaddr)) {
    25 #ifdef CONFIG_NET_RANDOM_ETHADDR
    26         net_random_ethaddr(dev->enetaddr);
    27         printf("
    Warning: %s (eth%d) using random MAC address - %pM
    ",
    28                dev->name, eth_number, dev->enetaddr);
    29 #else
    30         printf("
    Error: %s address not set.
    ",
    31                dev->name);
    32         return -EINVAL;
    33 #endif
    34     }
    35 
    36     if (dev->write_hwaddr && !eth_mac_skip(eth_number)) {
    37         if (!is_valid_ethaddr(dev->enetaddr)) {
    38             printf("
    Error: %s address %pM illegal value
    ",
    39                    dev->name, dev->enetaddr);
    40             return -EINVAL;
    41         }
    42 
    43         ret = dev->write_hwaddr(dev);
    44         if (ret)
    45             printf("
    Warning: %s failed to set MAC address
    ",
    46                    dev->name);
    47     }
    48 
    49     return ret;
    50 }

      上面定义了一个宏  CONFIG_NET_RANDOM_ETHADDR ,如果定义了此宏的话就会随机分配网卡物理地址,否则就打印错误信息,我们并不需要此宏。自己定义物理地址,从代码流程看,网卡地址是直接写进环境变量中的,然后再读取环境变量,这个时候就需要看看设置环境变量的地方了。

      环境变量的设置在 board_r.c的链表中,initr_env函数,initr_env 会调用 env_relocate() ,env_relocate() 调用 set_default_env 函数,set_default_env 函数中有一个结构体 default_environment ,这里面定义了默认的参数,进去看看一看就知道里面全部定义的是默认的环境变量参数,其中也有网络的:

      

      这里面没有物理地址的定义,所以我们可以自己定义物理地址:

      在这里加入下面的内容:

      

      在 include/configs/jz2440.h 中加入 CONFIG_ETHADDR的宏 ,这里我们可以根据自己本机上的MAC地址进行定义:

      

      

      保存编译,查看结果:

      

      已经不会再报错网卡了。进行测试看通讯是否正常。

      

      

      已经ping 通 网卡移植完成。

      

      

  • 相关阅读:
    Java Class的field如果以小写t开头
    ACM集训日志——day1——15.7.8
    分金币 Uva 11300
    RMQ小结
    Poj 水题
    Codeforces Round #278 (Div. 2)
    poj 3685
    poj 3579
    vConsole
    js更换自定义鼠标指针图片
  • 原文地址:https://www.cnblogs.com/kele-dad/p/7055968.html
Copyright © 2011-2022 走看看