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了