疯雨-版权所有,转载请注明【http://blog.csdn.net/u010346967】
为了后面的nfs文件系统挂载做必要的准备,这里必须添加对网卡的支持,通过查原理图可以知道x210v3开发板网卡型号是DM9000AE。
网卡同sd卡一样国际通用,所以uboot对其的支持也是很完美的,只需添加进编译即可。
如果你对uboot的启动流程有一定了解,你一定会去arch/arm/lib/board.c文件去找网卡初始化,找到如下内容:
616 #if defined(CONFIG_CMD_NET) 617 puts("Net: "); 618 eth_initialize(gd->bd);
显然,我们美柚看到串口打印出 Net:字符,所以应该先去配置CONFIG_CMD_NET宏,去哪里配置呢,当然是配置文件x210v3.h啦!
修改配置问件:
83 //#undef CONFIG_CMD_NET重新编译烧写,看到串口打印信息如下:
果然跟预想的一样,为什么出现没网卡找到呢?uboot又不是神仙,它怎么知道我们用的什么网卡,所以得我们自己添加支持,
前面注意到一个函数eth_initialize,这个函数就是完成初始化网卡功能,那么它在哪里定义的呢?找找看,如果有sourceinsight应该很容易找到,我在linux下也能用ctags很容易找到,就在net/eth.c文件里,并且找到如下信息:
312 if (board_eth_init != __def_eth_init) { 313 if (board_eth_init(bis) < 0) 314 printf("Board Net Initialization Failed\n"); 315 } else if (cpu_eth_init != __def_eth_init) { 316 if (cpu_eth_init(bis) < 0) 317 printf("CPU Net Initialization Failed\n"); 318 } else 319 printf("Net Initialization Skipped\n"); 320 321 if (!eth_devices) { 322 puts("No ethernet found.\n");
最后两条信息是不是很眼熟呢?如果不眼熟,我会怀疑你是不是适合做这行。说明一切的源头就是board_eth_init 和 __def_eth_init这两个函数,从输出信息来看这两个相等了而且和另一个函数也相等。先看第二个函数:简单啊,直接返回-1.
108 static int __def_eth_init(bd_t *bis) 109 { 110 return -1; 111 }
再看第一个函数:
113 int board_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init"))) ;学了这么多年c语言还是有看不懂的,百度吧,找到一个好东西: __attribute__ 之weak,alias属性 不懂的可以看看这篇文章,其实就是如果board_eth_init美柚定义的话就给board_eth_init取了个小名叫__def_eth_init 。难怪前面会相等,board_eth_init没定义。终于发现问题所在了。那么去哪里定义呢?这个函数跟board相关我们就把它放到board/samsung/x210v3/x210v3.c文件里吧。在文件最后添加如下代码:
145 int board_eth_init(bd_t *bis) 146 { 147 return dm9000_initialize(bis); 148 }
make 一下出错,关键错误信息如下:
board/samsung/x210v3/libx210v3.o: In function `board_eth_init': /home/uboot/u-boot-2012.10/board/samsung/x210v3/x210v3.c:147: undefined reference to `dm9000_initialize'好奇怪,查找下这个函数,
root@xjg:/home/uboot/u-boot-2012.10# grep -r "dm9000"
看到drivers/net/dm9000x.c:int dm9000_initialize(bd_t *bis),说明是在这里定义的,那么就是说这个文件没有编译进工程,肯定是少了宏定义,去这个文件所在的makefile里面看看,
38 COBJS-$(CONFIG_DRIVER_DM9000) += dm9000x.o
不用说,赶紧定义这个宏,还是去配置文件x210v3.h里面定义吧。
66 /* DM9000 */ 67 #define CONFIG_DRIVER_DM9000
make 一下,发现又是一些东西没定义,DM9000_DATA,DM9000_IO,CONFIG_DM9000_BASE三个。
接着在配置文件里面添加这三个宏定义:
66 /* DM9000 */ 67 #define CONFIG_DRIVER_DM9000 68 #define CONFIG_DM9000_BASE 0x88000000 69 #define DM9000_IO CONFIG_DM9000_BASE 70 #define DM9000_DATA (DM9000_IO+0x4)
再make就没错了。当然还得添加一些网卡配置,还要支持tftp和ping命令:
啰嗦一下,下面的地址:其实这里需要查的就几个,第一 CONFIG_DM9000_BASE这个要看你接到哪个bank,通过底板原理图查dm9000芯片:
注意的就是CSn1(从名字上看像是bank1)看接到哪了,去核心板看看:
发现接到了s5pv210的Xm0CSn1/MP01_1引脚。再看看datasheet你就清楚了,这是个片选引脚,表示接到SROM的bank1,好查看bank1的基地址0x88000000
mac地址(ETHADDR)随意给定一个,serverip就是我主机的ip,然后ipaddr是开发板ip地址,这个必须设置为和主机在同一网段,也就是除了最后一个小数点后的数不同外,其他的都要相同。子网掩码一般都是那个,好像还一个gateway你自己指定一个吧,同一网段就可以,要自己添加哦,我就不加了。
66 /* DM9000 */ 67 #define CONFIG_DRIVER_DM9000 68 #define CONFIG_DM9000_BASE 0x88000000 69 #define DM9000_IO CONFIG_DM9000_BASE 70 #define DM9000_DATA (DM9000_IO+0x4) 71 #define CONFIG_ETHADDR 08:00:3E:26:0A:5B 72 #define CONFIG_IPADDR 10.0.3.2 73 #define CONFIG_NETMASK 255.255.255.0 74 #define CONFIG_SERVERIP 10.0.3.1 75 #define CONFIG_CMD_PING 76 #define CONFIG_CMD_TFTP
再次编译烧写,结果如下:
启动时按空格键进入uboot控制台,ping 10.0.3.1发现如下错误:
打开调试宏 CONFIG_DM9000_DEBUG,哈哈看不懂,对我没啥用,还是关了吧。百度算了,发现6410和210网卡配置有个区别,就是210必须配置一个寄存器SROM_BW,去试试配置下,网卡是接在bank1,设置第4位和第五位为1就可以了,第4位表示数据位数,看原理图就知道16bit,第五位我也不清楚,但是要设置为1,否则不行。有知道它含义的可以在下面评论。。。。
就这样了,我在lowlevel_init.S里面设置的这个寄存器:
45 lowlevel_init: 46 mov r11, lr 47 48 /* set srom_bw */ 49 ldr r0, =0xE8000000 50 ldr r1, =0x30 51 str r1,[r0] 52
好了,大功告成,重新编译烧写,ping命令和tftp都可以使用了。。。
能使用tftp传文件是因为我主机已经搭建好了tftp服务器。然后将要传到开发板的文件复制到tftp服务器的共享目录(我设置的是/tftpboot),然后就是注意修改文件权限。不会搭建的看我的另一篇文章tftp服务器搭建。就可以在uboot控制台传输文件了,传输命令:tftp 文件名 内存地址 ,不如:tftp uImage 0x20008000
有图有真相: