2010年(49)
分类: 嵌入式
2010-09-07 14:36:47
网络实现包括两大部分:网络协议和以太网口驱动。重要的文件包括:
board.c
net.c 网络协议
eth.c 设备管理
fec.c 驱动
在uboot中,网络设备以链表的形式来描述。在eth.c中,能找到链表头的定义:
static struct eth_device *eth_devices, *eth_current;
其中,eth_device是网络设备数据结构,eth_devices指针是网络设备链表的头,eth_current指针指向当前使用的网络设备。
网络设备链表初始化的起点就是eth.c中的eth_initialize()函数。该函数在board.c中的board_init_r()函数中被调用。eth_initialize()函数的作用就是根据用户的配置进行各个网络设备的初始化,并注册到网络设备链表中。例如,如果用户定义了宏FEC_ENET,那么其会调用fec_initialize函数。fec_initialize函数的作用是根据当前FEC设备个数申请网络设备数据结构,并初始化网络设备I/O函数,最后利用eth_register将FEC设备注册到网络设备链表。
fec.c里面包含了网络设备驱动程序,主要包括:
static int fec_send(struct eth_device* dev, volatile void *packet, int length);
static int fec_recv(struct eth_device* dev);
static int fec_init(struct eth_device* dev, bd_t * bd);
static void fec_halt(struct eth_device* dev);
在fec_initialize中注册网络设备时,就会把这四个函数指针赋值给网络设备数据结构,这样就用同一个设备驱动接口驱动了所有的网络设备。
Uboot是单任务系统,其网络协议的实现主要依靠net.c来完成。而这其中最重要的就是int
NetLoop(proto_t protocol)函数。该函数根据其入参来实现不同的网络协议。
所谓当前网络设备,就是指eth_current指针当前指向的网络设备。Halt动作由如下语句完成:
eth_current->halt(eth_current);
寻找网络设备成功的标准是调用eth_current->init(eth_current,bis)成功。
如果当前只有一个网络接口,那么就没有什么寻找的意义。但是如果有多个网口,那么就会带来问题。哪个网络接口设备开始寻找?当有多个网络设备时,uboot要求使用环境变量"ethact"来指明寻找网络设备的起点。
根据不同的协议来使用网络设备注册的收发函数。
在fec_init函数中,会调用fec_pin_init函数来初始化fec mii管脚。一般来说,其默认使用port d作为mii管脚,但是,由于一些设备比如tc505,因为utopia的原因,必须使用port a作为mii管脚,此时就必须自己来修改这部分代码。
根据MPC866手册41.2.5节Table 41-6,可以选择两种组合来配置FEC MII使用PORT A。其中“UT=1 FEC=1 SPLIT=
此时网络接口可以使用,ping通其他主机。
首先,确保MDC
但是此时MDC/MDIO管理接口确无法正确读写rtc8305的寄存器。经过多次试验,发现必须包含宏定义
#define CONFIG_MII_INIT 1
有了这个宏定义,系统在响应mii命令时会调用mii_init函数。这样就能保证MII管理接口正确使用。