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 通 网卡移植完成。

      

      

  • 相关阅读:
    How to convert VirtualBox vdi to KVM qcow2
    (OK)(OK) adb -s emulator-5554 shell
    (OK)(OK) using adb with a NAT'ed VM
    (OK) How to access a NAT guest from host with VirtualBox
    (OK) Creating manually one VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
    (OK)(OK) Creating VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
    (OK) Creating_VMs_from_an_existing_VDI_file.txt
    (OK) Creating VMs from an existing VDI file —— in OS X
    (OK) install_IBM_SERVER.txt
    (OK) install chrome & busybox in android-x86_64 —— uninstall chrome
  • 原文地址:https://www.cnblogs.com/kele-dad/p/7055968.html
Copyright © 2011-2022 走看看