关键词:嵌入式系统; S3C44B0X;ARM
1.引言
ARM7TDMI是一种高性能,低功耗的RISC处理器核。采用该内核的S3C44B0X是一款集成了许多外围设备的芯片,同时其性能价格比也是非常高的,非常适合做嵌入式产品的处理器。在众多的嵌入式操作系统中,uClinux由于代码开放性,适用于多种CPU和多种硬件平台,以及强大的网络功能,在中低端的嵌入式设备中有广泛应用。
本文采用基于ARM核的S3C44B0X处理器,使用到广泛应用的源代码公开的uClinux操作系统,实现CPU处理器与RTL8019AS以太网控制器网络通信。
2.以太网接口电路的设计思路与实现
从硬件的角度看,以太网接口电路主要由MAC控制器和物理层接口(Physical Layer, PHY)两大部分构成。
RTL8019AS是台湾readlted公司生产的以太网控制器,支持IEEE802.3;支持8位或16位数据总线;它内部集成了两块RAM,一块16KB,地址为0x4000~0x7FFF;一块32字节,地址为0x0000~0x001F。16K的RAM用作收发数据的缓冲区,一般将0x4000~0x46FF作为发送缓冲区,0x4700~0x7FFF作为接收缓冲区。全双工模式时,收发同时达到10Mbps;支持10Base5、10Base2、10BaseT,并能自动检测所连接的介质。
RTL8019AS与主机的接口模式有三种,(1)跳线模式 这种模式与早期的网络控制器兼容。RTL8019AS的端口基地址、中断口等都由开关或跳线器决定。跳线模式简单,但配置资源麻烦。(2)PnP模式 与微软的PnP协议兼容。在这种模式下,RTL8019AS的端口基地址、中断口等都由EEPROM93C46设定,但需要进行PnP芯片的识别,不便与ARM接口。(3)RT模式为了避免PnP模式下的PnP芯片识别和配置过程, readlted公司提供RT模式。在RT模式下,RTL8019AS的端口基地址、中断口等也是由EEPROM93C46决定的。
S3C4510B内嵌一个以太网控制器,支持MII和BDI接口,可在半双工或全双工模式下提供10M/100Mbps的以太网接入。在半双工模式下,控制器支持CSMA/CD协议,在全双工模式下支持IEEE802.3MAC控制层协议。因此,S3C4510B内部实际上已包含了以太网MAC控制,但并未提供物理层接口,故需外接一片物理层芯片,以提供以太网的接入通道。
物理层接口(PHY)完成所有输入输出数据的编码解码,10Base-T采用Manchester编码;100Base-X采用4B/5B编码;100Base-T4采用8B/6T编码。在接收数据时,MII接收从前缀到末尾CRC的原始数据包。在发送数据时,MII给数据包加上前缀和末尾的CRC。MAC层同时还产生填充数据并传给PHY。
网络电路如图1所示,S3C44B0X使用nGCS2和数据地址总线访问rtl8019的内部寄存器和缓冲区。TS6121是隔离变压器,RJ45是网络接口。
3. 协议分析
Linux下的TCP/IP网络协议栈的各层之间是通过一系列互相连接层的软件来实现Internet地址族的。INET socket为基于IP的协议TCP和UDP管理传输端点。UDP(用户数据报协议)是一个无连接协议,而TCP(传输控制协议)是一个可靠的端对端协议。传输UDP包的时候,Linux不知道也不关心它们是否安全到达了目的地。TCP则不同。在TCP连接的两端都需要加上一个编号,以保证传输的数据被正确接收。在IP层,实现了Internet协议代码,这些代码要给传输的数据加上一个IP头,并且知道如何把传入的IP包送给TCP或者UDP协议。在IP层以下,就是网络设备来支持所有的Linux网络工作,结构层次图如图2所示。
4 socket编程
常用的socket类型有两种:流式socket和数据报式socket。两者的区别在于:前者对应于TCP服务,后者对应于UDP服务,主要包括以下函数:
(1) socket函数
Int socket( int family, int type, int protocol )
family指明协议族;type是套接口的类型; protocol通常设置为0;函数成功时返回一个小的非负整数值。
(2)connect函数
Int connect( int sockfd, const struct sockaddr* servaddr, socklen_t addrlen )
Sockfd由socket函数返回数值,servaddr是一个套接口地址结构的指针,addrlen是该结构的大小,该结构必须含有服务器的IP地址和端口号。
(3)bind函数
Int bind( int sockfd, const struct sockaddr* myaddr, socklen_t addrlen )
myaddr指向特定于协议地址结构的指针,addrlen是该地址结构的长度。对于TCP,调用函数bind可以指定一个端口,指定一个IP地址。可以两者都指定,也可以一个也不指定。
(4)listen函数
Int listen( int sockfd, int backlog )
backlog规定了内核为此套接口排队的最大连接个数,函数listen将未连接的套接口转换成被动套接口,指示内核应接受指向此套接口的连接请求。根据TCP状态转换调用函数listen导致套接口从CLOSED状态转换到LISEN状态。
(5)accept函数
int accept( int sockfd, struct sockaddr* cliaddr, socklen_t* addrlen )
cliaddr是返回的客户端的协议地址, addrlen返回套接口地址结构的长度
accept函数由TCP服务器调用,从已完成连接队列头返回下一个已完成连接。若已完成连接队列为空,则进程睡眠。
系统流程图如图3所示:
5.结束语
本文理论联系实际,主要介绍了RTL8019AS与S3C44B0X的网络接口硬件电路的搭建,并实现了嵌入式系统下的软件程序的设计,且通过验证是正确的。对于在嵌入式设备中,特别是Linux的系统中网络通信应用有重要的参考意义。
本文作者创新点:
1.硬件电路中采用RTL8019作为网络接口,并实现了Linux下的网卡程序设计,且通过验证是正确的
2.软件系统模块化,有很好的可移植性和扩展性。
参考文献:
[1] 李崴巍.基于图像的虚拟现实技术在驾驶模拟器中的应用[J]. 微计算机信息.2006,第9-2期. P230-232.
[2] 姜沫歧,林伟. Protel2004原理图与PCB设计实例[M]. 机械工业出版社,2005.
[3] 吴明晖.基于ARM的嵌入式系统开发与应用[M].人们邮电出版社,2004.