uboot-1.1.6中DM9000网卡驱动移植到TQ2440

时间:2021-04-20 19:30:24


转载:http://blog.chinaunix.net/uid-26725382-id-3414832.html


TQ2440自带的uboot-1.1.6中并没有支持uboot命令行模式和网卡驱动。所以要修改和重新编译uboot和添加DM9000支持。uboot定制与移植可以参考网上很多的资料。这里主要是说明在DM9000网卡移植过程中我遇到的一些问题和解决方法,希望对其他人有帮助。

       这里借鉴 http://doc.baidu.com/view/723e304be45c3b3567ec8b56.html?from=related中的一些实现。
       uboot执行lib_arm/board.c中的start_armboot函数会调用eth_initialize(gd->bd)函数,这个函数在include/
net.h声明,实现在net/eth.c。需要注意的是这个文件中有针对CONFIG_COMMANDS, CFG_CMD_NET和CONFIG_NET_MULTI的条件编译,eth_initialize有两个实现。具体步骤如下:
1、 #if 0
      #define CONFIG_DRIVER_CS8900   1
      #define CS8900_BASE                    0x19000300
      #define CS8900_BUS16                  1
      #endif
      添加DM9000的宏, DM9000在BANK4上
      #define CONFIG_DRIVER_DM9000        1
      #define CONFIG_DM9000_BASE           0x20000300
      #define DM9000_IO                              CONFIG_DM9000_BASE
      #define CONFIG_DM9000_USE_16BIT   1
      #define CONFIG_NET_MULTI                   1
      
      如果需要添加PING命令,可以在#define CONFIG_COMMANDS中增加CFG_CMD_NET和CFG_CMD_PING项。如引用文档中的第六,七步。       CONFIG_ETHADDR, CONFIG_NETMASK, CONFIG_IPADDR, CONFIG_SERVERIP可以根据自己的需要进行配置。
2、 第二步如引用文档中的第一步一样修改net/eth.c中的eth_initialize实现,可以加入条件编译:
      #ifdef CONFIG_DRIVER_DM9000
      if(board_eth_init(bis) < 0)
             cpu_eth_init(bis)
      #endif
3、drivers/dm9000x.c的修改:
      如引用文档的第四,五步所述进行修改,eth_*系列回调函数修改成如结构体声明处的格式。
4、一般进行uboot移植都会进行include/configs/selfconfig, board/selfdir/*之类的复制操作,进行相关的适配。这里需要在self2440.c实现加入网卡的初始化函数。如:
     #ifdef CONFIG_DRIVER_DM9000
     extern int dm9000_init(struct eth_device *dev, bd_t *bd);
     extern void dm9000_halt(struct eth_device *dev);
     extern int dm9000_send(struct eth_device *dev, volatile void *pachet, int length);
     extern int dm9000_rx(struct eth_device *dev);
     void board_eth_init(bd_t *bis)
     {
          struct eth_device *dev;
          
          dev = calloc(sizeof(*dev), 1);
          if(!dev) {
                  printf("%s: dm9000_enet allocation failure, %s\n", __FUNCTION__, "eth_device structure");
                  return;
          }

          dev->init = (void *)dm9000_init;
          dev->halt = (void *)dm9000_halt;
          dev->send = (void *)dm9000_send;
          dev->recv = (void *)dm9000_rx;
          
          eth_register(dev);
      }
      #endif

烧入u-boot.bin就可以看到开发板的网卡端口提示灯就亮了,ping一下主机也会提示alive了。如果编译中有什么小错误的话修改添加一下相关函数的声明就好了。

            2. TQ2440相关源代码