接下来就要开始处理网卡相关的了,这样我们才能挂载网络文件系统,使用tftp服务器之类的,但是很不幸,2014.10版本的uboot里面没有支持我们的开发板上的网卡。所以接下来要手动移植网卡相关的程序。
首先查找网卡初始化的代码
/arch/arm/lib目录下的
board.c中的
board_init_r函数可以看到有设置,那就需要在
/include/config目录下的
x210.h下追加#define
CONFIG_CMD_NET和#define
CONFIG_CMD_PING。
同时在
x210.h中还发现了#undef
CONFIG_CMD_NET,这个也需要屏蔽掉,要不就会将之前定义的
CONFIG_CMD_NET给取消掉了。之后烧录进sd卡启动,发现,没有找到Ethernet,这也和之前咱们说的一致,需要我们自己移植网卡相关的程序了。
进入
board_init_r下的
eth_initialize里面可以看到以下代码:
Net Initialization Skipped,这个之前在uboot中有看到,那么就知道上面两个case都没执行到,也就是意味着board_eth_init 的返回值等于__def_eth_init的返回值。
深入研究发现并没有
board_eth_init这个函数,而是定义了以下函数
不知道这个是啥意思,百度之后,大概就是说如果没有
board_eth_init这个函数,那么
board_eth_init函数就等于
__def_eth_init这个函数,这样一来,就会打印出
Net
Initialization Skipped。
既然没有这个函数,咱们就定义一个这个函数,而这个函数就用来初始化开发板的网卡吧。
首先优先在
/driver/net目录中查找是否有DM9000相关的网卡,果然还真的有,然后查看
/driver/net目录下的makefile,看要怎么才能将
DM9000.o编译进来。
在makefile中看到obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o
在
X210.h中追加
CONFIG_DRIVER_DM9000的宏定义,然后review下
dm9000x.c这个文件的初始化函数在哪里?最后在
/board/Samsung/X210目录下的
x210.c文件中添加这个函数
之后编译程序,果然不可能那么顺利的。但是问题不大,只是缺少了
DM9000_DATA,DM9000_IO,CONFIG_DM9000_BASE三个宏定义,网卡这部分的东西,之前在移植三星版本的uboot的时候已经弄过了,所以这里我直接使用之前移植过的参数来减少工作量。
顺利编译通过,再次烧录,启动,发现还是有问题,会提示ERROR: resetting DM9000 -> not responding,这里正好在网上看到解决的办法。
参考:
http://blog.csdn.net/u010346967/article/details/46634993
修改地方就是屏蔽掉之前
lowlevel_init.S中的CLK_IP1的时钟初始化。
再编译烧录启动后,就没有那么多问题的了,如果出现了
WARNING: Bad MAC address (uninitialized EEPROM?)
operating at 100M full duplex mode
*** ERROR: `serverip' not set
那就设置一下ip地址这类的东西,然后再save一下,保存起来即可。
这时候我准备下载东西到内存中去了,使用tftp命令下载的时候,出现了如下错误。
想起来丢了之前移植三星版本的网卡的一个初始化,将它移植过来就好了,具体内容,哪天的整好之前移植三星版本时候的笔记,再贴出来吧。
在
/borad/Samsung/x210目录下出
x210.c中追加以下代码。
之后执行下载命令,下载成功,也说明我们的网卡打通了。