uboot网卡驱动移植

定义相应的宏,使能uboot的网卡

官方的uboot默认是不使能网卡相关的代码的,既在配置头文件中CONFIG_CMD_NET默认是没有被定义的
uboot网卡驱动移植
要使能网卡相关代码就要在配置头文件中添加CONFIG_CMD_NET这个宏,切记还要去掉#undef CONFIG_CMD_NET这个定义
uboot网卡驱动移植
uboot网卡驱动移植

添加ping和tftp命令

ping命令在官方uboot中也没有使能,所以需要在配置头文件中添加对应的宏
uboot网卡驱动移植
tftp命令在官方的uboot中是默认被使能的,不依赖于其他的宏
uboot网卡驱动移植

移植网口初始化代码

在三星的uboot中网卡的初始化在bord_init函数中进行,所以我们将三星的网卡初始化移植到uboot官方的uboot中的bord_init函数中

三星uboot:在对于我的开发板用的是SMC911X的网卡所以,所以board_init()函数调用smsc9220_ore_init()函数初始化网卡,我们需要将smsc9220_ore_init()移植到我们的uboot中,smsc9220_ore_init函数以及于其相关的宏都在s5pc11x.c中定义。
uboot网卡驱动移植
在board_init()函数中调用smsc9220_ore_init()函数,并将smsc9220_ore_init()函数移植到goni.c文件中。
移植后的uboot官方的uboot:
uboot网卡驱动移植

注册网卡

开启网络相关的宏后,重新编译uboot并上电,板子打印如下信息
uboot网卡驱动移植
这两句错误在初始化网卡时eth_initialize函数中打印
uboot网卡驱动移植
uboot网卡驱动移植
eth_initialize()函数调用board_eth_init()或cpu_eth_init()函数来注册网卡设备,但官方的uboot中board_eth_init()函数是空函数,而cpu_eth_init()函数根本没有定义。所以需要将三星uboot中注册网卡的函数移植到这里
uboot网卡驱动移植
三星的uboot在eth_initialize()函数中通过smc911x_initialize()函数中注册网卡设备
uboot网卡驱动移植
smc911x_initialize()这个函数给网卡结构体的init、halt、send、recv等函数赋值,并通过eth_register()这个函数将该结构体注册到网卡设备的列表中,从而完成网卡的注册。在后面uboot使用网络相关的命令是会同过这个结构体中成员变量对网卡进行操作。
与smc911x网卡相关的函数都在smc911.c中驱动文件中(包括smc11x_initialize这个函数),这是uboot自带的驱动文件,不需要移植直接调用其中的函数就行。
uboot网卡驱动移植
只需要在board_eth_init()这个空函数中声明并调用smc11x_initialize函数就能完成网卡的注册了
uboot网卡驱动移植