第八章:基于九鼎X210开发板移植2014.10版U-boot之初始化网卡

2019-07-12 20:16发布


 接下来就要开始处理网卡相关的了,这样我们才能挂载网络文件系统,使用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中还发现了#undefCONFIG_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中追加以下代码。
    
 之后执行下载命令,下载成功,也说明我们的网卡打通了。