x210v3开发板u-boot-2012.10移植之十一---添加DM9000网卡支持
2015-06-16 20:22
113 查看
疯雨-版权所有,转载请注明【http://blog.csdn.net/u010346967】
为了后面的nfs文件系统挂载做必要的准备,这里必须添加对网卡的支持,通过查原理图可以知道x210v3开发板网卡型号是DM9000AE。
网卡同sd卡一样国际通用,所以uboot对其的支持也是很完美的,只需添加进编译即可。
如果你对uboot的启动流程有一定了解,你一定会去arch/arm/lib/board.c文件去找网卡初始化,找到如下内容:
显然,我们美柚看到串口打印出 Net:字符,所以应该先去配置CONFIG_CMD_NET宏,去哪里配置呢,当然是配置文件x210v3.h啦!
修改配置问件:
果然跟预想的一样,为什么出现没网卡找到呢?uboot又不是神仙,它怎么知道我们用的什么网卡,所以得我们自己添加支持,
前面注意到一个函数eth_initialize,这个函数就是完成初始化网卡功能,那么它在哪里定义的呢?找找看,如果有sourceinsight应该很容易找到,我在linux下也能用ctags很容易找到,就在net/eth.c文件里,并且找到如下信息:
最后两条信息是不是很眼熟呢?如果不眼熟,我会怀疑你是不是适合做这行。说明一切的源头就是board_eth_init 和 __def_eth_init这两个函数,从输出信息来看这两个相等了而且和另一个函数也相等。先看第二个函数:简单啊,直接返回-1.
再看第一个函数:
make 一下出错,关键错误信息如下:
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里面定义吧。
make 一下,发现又是一些东西没定义,DM9000_DATA,DM9000_IO,CONFIG_DM9000_BASE三个。
接着在配置文件里面添加这三个宏定义:
再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你自己指定一个吧,同一网段就可以,要自己添加哦,我就不加了。
再次编译烧写,结果如下:
启动时按空格键进入uboot控制台,ping 10.0.3.1发现如下错误:
打开调试宏 CONFIG_DM9000_DEBUG,哈哈看不懂,对我没啥用,还是关了吧。百度算了,发现6410和210网卡配置有个区别,就是210必须配置一个寄存器SROM_BW,去试试配置下,网卡是接在bank1,设置第4位和第五位为1就可以了,第4位表示数据位数,看原理图就知道16bit,第五位我也不清楚,但是要设置为1,否则不行。有知道它含义的可以在下面评论。。。。
就这样了,我在lowlevel_init.S里面设置的这个寄存器:
好了,大功告成,重新编译烧写,ping命令和tftp都可以使用了。。。
能使用tftp传文件是因为我主机已经搭建好了tftp服务器。然后将要传到开发板的文件复制到tftp服务器的共享目录(我设置的是/tftpboot),然后就是注意修改文件权限。不会搭建的看我的另一篇文章tftp服务器搭建。就可以在uboot控制台传输文件了,传输命令:tftp 文件名 内存地址 ,不如:tftp uImage 0x20008000
有图有真相:
为了后面的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
有图有真相:
相关文章推荐
- GukiZ and Binary Operations(矩阵+二进制)
- 45Exchange 2010升级到Exchange 2013-迁移邮箱
- Android中activity、service、broadcast、单例模式http请求的综合使用
- VS2013默认打开HTML文件没有设计视图的解决办法
- ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API
- 马上毕业的时光,谁的人生不留遗憾?
- leetcode[70]:Climbing Stairs
- android开发步步为营之63:webview常用用法
- linux 下硬盘序号
- Qt学习笔记002 2015/6/16
- log4cpp的安装
- 逻辑架构和物理架构
- Direct-X学习笔记--光照&材质&DX自带几何体绘制
- 7-2
- android 电子词典
- Android系统Intent,系统Action调用大全
- 常见邮件服务器(接收服务器和发送邮件服务器)地址
- 【ContestHunter】【弱省胡策】【Round6】
- windows下 MySQL数据库双向同步 配置步骤
- C++第六章第五题