Chinaunix首页 | 论坛 | 博客
  • 博客访问: 217668
  • 博文数量: 49
  • 博客积分: 2101
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 10:38
文章分类

全部博文(49)

文章存档

2010年(49)

我的朋友

分类: 嵌入式

2010-09-07 14:36:47

网络实现包括两大部分:网络协议和以太网口驱动。重要的文件包括:

board.c 

net.c              网络协议

eth.c              设备管理

fec.c              驱动

 

1 网络设备管理方法

1.1 网络设备链表

uboot中,网络设备以链表的形式来描述。在eth.c中,能找到链表头的定义:

static struct eth_device *eth_devices, *eth_current;

其中,eth_device是网络设备数据结构,eth_devices指针是网络设备链表的头,eth_current指针指向当前使用的网络设备。

1.2 网络设备链表初始化

网络设备链表初始化的起点就是eth.c中的eth_initialize()函数。该函数在board.c中的board_init_r()函数中被调用。eth_initialize()函数的作用就是根据用户的配置进行各个网络设备的初始化,并注册到网络设备链表中。例如,如果用户定义了宏FEC_ENET,那么其会调用fec_initialize函数。fec_initialize函数的作用是根据当前FEC设备个数申请网络设备数据结构,并初始化网络设备I/O函数,最后利用eth_registerFEC设备注册到网络设备链表。

 

2 网络设备驱动程序

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中注册网络设备时,就会把这四个函数指针赋值给网络设备数据结构,这样就用同一个设备驱动接口驱动了所有的网络设备。

 

3 实现网络协议

Uboot是单任务系统,其网络协议的实现主要依靠net.c来完成。而这其中最重要的就是int

NetLoop(proto_t protocol)函数。该函数根据其入参来实现不同的网络协议。

3.1 halt当前网络设备

所谓当前网络设备,就是指eth_current指针当前指向的网络设备。Halt动作由如下语句完成:

eth_current->halt(eth_current);

3.2 寻找可用的网络设备

寻找网络设备成功的标准是调用eth_current->init(eth_current,bis)成功。

如果当前只有一个网络接口,那么就没有什么寻找的意义。但是如果有多个网口,那么就会带来问题。哪个网络接口设备开始寻找?当有多个网络设备时,uboot要求使用环境变量"ethact"来指明寻找网络设备的起点。

3.3 协议实现

根据不同的协议来使用网络设备注册的收发函数。

 

4 修改网络设备驱动fec.c

4.1 管脚配置

fec_init函数中,会调用fec_pin_init函数来初始化fec mii管脚。一般来说,其默认使用port d作为mii管脚,但是,由于一些设备比如tc505,因为utopia的原因,必须使用port a作为mii管脚,此时就必须自己来修改这部分代码。

根据MPC866手册41.2.5Table 41-6,可以选择两种组合来配置FEC MII使用PORT A。其中“UT=1 FEC=1 SPLIT=0的组合无法配置成功,主要原因是当写UT=1时,ubootdown掉;所以只好尝试“UT=0 FEC=1 SPLIT=1组合,结果是可以的。

此时网络接口可以使用,ping通其他主机。

 

4.2 MDC/MDIO

首先,确保MDC 2.5M时钟配置正确。其次,确认使用哪个pin座位MDC管脚。如果使用PORTD作为mii管脚,那么PD12就是MDC管脚;如果使用PORTA作为mii管脚,那么PD8就是MDC管脚。

但是此时MDC/MDIO管理接口确无法正确读写rtc8305的寄存器。经过多次试验,发现必须包含宏定义

#define CONFIG_MII_INIT  1

有了这个宏定义,系统在响应mii命令时会调用mii_init函数。这样就能保证MII管理接口正确使用。

 

阅读(1313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~