x210v3开发板u-boot-2012.10移植之十一---添加DM9000网卡支持

来源:互联网 发布:php木马图片制作 编辑:程序博客网 时间:2024/05/17 03:23

                                                                    疯雨-版权所有,转载请注明【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     } else319         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

有图有真相:






0 0