uboot-2010.06移植到mini2440经验(4)添加对DM9000网卡支持

1、修改include/configs/mini2440.h

#define CONFIG_NET_MULTI
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_NO_SROM 1 //?????
#define CONFIG_DM9000_BASE  0x20000000
#define DM9000_IO       0X20000000
#define DM9000_DATA     0X20000004
//注释掉CS8900相关定义
//#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_CMD_CACHE
#define CONFIG_CMD_DATE
#define CONFIG_CMD_ELF
#define CONFIG_CMD_PING //给uboot加上ping命令,用来测试网络通不通
#define CONFIG_CMD_NET   //添加网卡支持命令
#define CONFIG_BOOTDELAY    3
/*#define CONFIG_BOOTARGS   "root=ramfs devfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR      00:01:02:03:04:05//修改mac地址
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR       172.16.113.188 //本机ip
#define CONFIG_SERVERIP     172.16.113.123 //上位机ip
/*#define CONFIG_BOOTFILE   "elinos-lart" */
/*#define CONFIG_BOOTCOMMAND    "tftp; bootm" */


2、修改板载DM9000网卡初始化代码

   打开board/sumsung/mini2440/mini2440.c

int board_eth_init(bd_t *bis)
{
    int rc = 0;
/*注释掉*/
#if 0
    rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
/*添加*/
#ifdef CONFIG_DRIVER_DM9000
    rc=dm9000_initialize(bis);
#endif
    return rc;
}

3、修改网卡驱动bug 解决could not establish link

   打开drivers/net/dm9000x.c

#if 0
 i = 0;
 while (!(phy_read(1) & 0x20))
 { /* autonegation complete bit */
  udelay(1000);
  i++;
  if (i == 10000)
  {
   printf("could not establish link\n");
   return 0;
  }
 }
#endif

   2

//屏蔽掉dm9000_halt函数中的内容
static void dm9000_halt(struct eth_device *netdev)
{
#if 0
 DM9000_DBG("%s\n", __func__);
 /* RESET devie */
 phy_write(0, 0x8000); /* PHY RESET */
 DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
 DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
 DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
#endif
}

4、测试网卡

   1、ping测试

   连上网线,重启开发板,在uboot命令界面下,运行命令:

   set ethaddr 0:1:2:3:4:5

   set ipaddr 172.16.113.188

   save

   #ip根据自己测试需要设置,如在头文件已经设置可以省略

   在uboot命令界面下,运行命令:

   ping 172.16.113.254

   如果出现:

   host 172.16.113.254 is alive

   表示网络已通

   2、tftp测试

   编写一个led闪烁测试程序,内容如下:

//led_test.c
#define rGPBCON (*(volatile unsigned *)0x56000010)
#define rGPBDAT (*(volatile unsigned *)0x56000014)
void delay(int time);
void xmain()
{
    rGPBCON=rGPBCON&(0xff<<10)|(0x55<<10);
    rGPBDAT|=0xf<<5;
    while(1)
    {
        rGPBDAT^=0xf<<5;
        delay(0x2ffff);
    }
}
void delay(int time)
{
    while(time>0)
        time--;
}

   编译生成可执行文件:

arm-linux-gcc -nostdlib -o led_test led_test.c -Ttext 0x30000000

   

   再把生成的可执行文件生成纯二进制文件(可执行文件去掉头部、调试信息):

arm-linux-objcopy -O binary led_test led_test.bin

   

   把led_test.bin复制到刚才所建的tftp共享目录;

   

   在uboot命令界面下,运行命令:

tftp 0x30000000 192.168.0.1:led_test.bin
go 0x30000000

   这时就会看到二极管在闪烁

   

   为了让我们的uboot将来能够像linux内核传递参数,在板子相关头文件中增加:

#define CONFIG_CMDLINE_EDITING    1

   

   5、编译

make clean && make

   到现在为止我们就得到了功能比较齐全的uboot了


你可能感兴趣的:(uboot)