• S3C2440移植uboot之支持DM9000


      上一节S3C2440移植uboot之支持NANDFLASH操作移植了uboot 支持了NANDFLASH的操作,这一节修改uboot支持DM9000。

    通过Makefile把dm9000x编译进uboot

    cd drivers/net
    vi Makefile
    

      需要在文件中添加以下宏
    在这里插入图片描述

      在smdk2440.h中修改文件支持DM9000

    #if 0
    #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 */
    #else
    #define CONFIG_DRIVER_DM9000                    /*DM9000*/
    #endif
    

      编译报错
    在这里插入图片描述

    编译报错 DM9000_DATA

      搜索DM9000_DATA那里定义

    grep "DM9000_DATA" *nR
    

      参考别人配置文件
    在这里插入图片描述
    在这里插入图片描述

      在smdk2440.h中修改为如下内容

    /*
     * Hardware drivers
     */
    #if 0
    #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 */
    #else
    #define CONFIG_DRIVER_DM9000                    /*DM9000*/
    #define CONFIG_DM9000_BASE                   0x20000000  /*参考芯片手册 nGCS4*/
    #define DM9000_IO                            CONFIG_DM9000_BASE          
    #define DM9000_DATA                         (CONFIG_DM9000_BASE + 4)  /*bit 2 1  0*/
    #endif
    

      我们的DM9000是放在2440的bank4(0X20000000)的片选上面,而DM9000的CMD引脚接在bank4的LADDR2上面。也就是说当0X20000000地址上读写数据时, 此时CMD为低,则读写的便是DM9000C的地址。向0X20000000+4地址上读写数据时,此时CMD为高,则读写的便是DM9000C的数据。

    修改内存控制器时序

      由于之前在start.S里,就调用了board/samsung/smdk2440/lowlevl_init.S来初始化各个bank的配置、时序。所以我们只需要在那里修改bank4的内容即可。(也可以直接在dm9000x.c里的dm9000_initialize()函数设置)参考之前写的移植DM9000C驱动里的时序
      由于兼容DM9000E,所以修改的值尽量大一点, 修改u-boot-2012.04.01oardsamsungsmdk2440lowlevel_init.S
    设为:

    .long 0x00000740;    //BANKCON4
    

      参考手册如下
      BWSCON位宽设置
    在这里插入图片描述
      时序设置
    在这里插入图片描述
      编译烧写
    在这里插入图片描述

    网卡的初始化的流程

    搜索No ethernet found

      1)uboot重定位后进入第二阶段board_init_r():

    void board_init_r(gd_t *id, ulong dest_addr)        //gd    uboot重定位地址
    {
      ... ...
      #if defined(CONFIG_CMD_NET)
           puts("Net:   ");
           eth_initialize(gd->bd);                 // 以太网初始化
    
    #if defined(CONFIG_RESET_PHY_R)
           debug("Reset Ethernet PHY
    ");
           reset_phy();
    
    #endif
    #endif    
    ... ...
    }
    

      2)然后进入board_init_r()->eth_initialize():

    int eth_initialize(bd_t *bis)
    {
     ... ...
    if (board_eth_init(bis) < 0)                         //初始化 单板上的以太网
    printf("Board Net Initialization Failed
    ");
    ... ...
    
    if (!eth_devices) {                                   //初始化失败,打印"No ethernet found.
    "
                  puts ("No ethernet found.
    ");
                  bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
           }
     ... ...
    }
    

      3)进入board_eth_init(), 位于board/samsung/smdk2440/smdk2440.c

    int board_eth_init(bd_t *bis)
    {
           int rc = 0;
    #ifdef CONFIG_CS8900                                                  
           rc = cs8900_initialize(0, CONFIG_CS8900_BASE);        //初始化cs8900
    #endif
           return rc;
    }
    

      从上面代码看到,单板初始化board_eth_init()函数里,只支持初始化CS8900,没有DM9000C

    支持DM9000C的初始化

      搜索dm9000_initialize,看下其它单板的board_eth_init()是如何初始化DM9000C的,如下图所示:
    在这里插入图片描述
      所以,我们修改2440单板的board_eth_init(),使它支持DM9000C
      修改代码如下(位于board/samsung/smdk2440/smdk2440.c):

    int board_eth_init(bd_t *bis)
    {
           int rc = 0;
    
    #ifdef CONFIG_CS8900                                                  
           rc = cs8900_initialize(0, CONFIG_CS8900_BASE);        //初始化cs8900
    #endif
    
    #ifdef CONFIG_DRIVER_DM9000                                           
           rc = dm9000_initialize(bis);                               //初始化DM9000C
    #endif
    
           return rc;
    }
    

    编译测试

    在这里插入图片描述

      然后试验,来ping下PC机,输入:

    set ipaddr 192.168.159.120
    ping 192.168.159.100
    

       打印如下图所示:
    在这里插入图片描述
       上面表示,MAC(硬件地址)没有设置,我们需要设置ethaddr,来更改MAC地址
    输入(参考别人的MAC地址):

    set ethaddr 08:00:3e:26:0a:5b    //设置MAC地址
    ping 192.168.159.100                 //重新ping    
    

    便可以ping通.

    TFTP下载测试

      使用tftp工具,通过网卡来下载内核
      tftp工具是通过电脑来设置本机为服务器,然后开发板作为客户端,便可以读取到PC机里的文件了
      1)PC机打开tftp工具,设置文件根目录,以及PC本机的IP地址
      2)进入开发板,输入:

    set serverip   192.168.2.101                //设置PC机地址
    tftp 30000000    uImage                     //下载PC机设置的tftp根目录下的uImage文件
    bootm  30000000                             //使用bootm命令启动内核代码
    

    在这里插入图片描述  由于uboot没有配置mtdparts命令,所以启动内核没成功.
    主要修改文件:include/configs/smdk2440.h lowevel_init.s
      下一节S3C2440移植uboot之裁剪和修改默认参数我们将裁剪uboot和修改默认的环境变量。

    有任何问题,均可通过公告中的二维码联系我

  • 相关阅读:
    洛谷P1880 [NOI1995]石子合并 (区间dp
    洛谷P1012 拼数(水题 字符串
    洛谷P1071 潜伏者(水题
    微信《跳一跳》超高分攻略,轻松排行榜首
    StringUtilsd的isEmpty、isNotEmpty、isBlank、isNotBlank
    java.util.Properties类
    timer.scheduleAtFixedRate和timer.schedule的实验
    schedule() 和 scheduleAtFixedRate() 区别
    session和jsessionid有什么关系
    增加Xss过滤步骤
  • 原文地址:https://www.cnblogs.com/dongxb/p/14193358.html
Copyright © 2020-2023  润新知