基于uCLinux和S3C4510B的网络通信设计
摘要:结合工程实例,基于S3C4510B微处理器,构建以DM9161为以太网物理层接口的低功耗、高速硬件电路;在嵌入式操作系统uCLinux上实现网络通信工程的程序编写,对于网络通信工程在嵌入式设备中的应用有很好的借鉴意义。
关键词:uCLinux S3C4510B 网络通信 DM9161 嵌入式系统
引言
Linux是一种很受欢迎的操作系统,与UNIX系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于嵌入式设备。uCLinux正是在这种氛围下产生的。在uCLinux这个英文单词中,u表示Micro,是“小”的意思;C表示Control,是“控制”的意思,所以uCLinux就是Micro-Control-Linux,字面上的理解就是“针对微控制领域而设计的Linux系统”。它也是针对无MMU(内存管理单元模块)的微处理器设计的操作系统。S3C4510B就是属于该类的微处理器。
Samsung公司的S3C4510B是基于以太网应用系统高性价比16/32位RISC微控制器,内含一个由ARM公司设计16/32位ARM7TDMI RISC处理器核。ARM7TDMI为低功耗、高性能的16/32核,最适合用于对价格及功耗敏感的应用场合。除了ARM7TDMI核以外,S3C4510B还有许多重要的片内外围功能模块,其中就有1个以太网控制器,用于S3C4510B系统与其它设备的网络通信工程。在S3C4510B的网络控制平台上移植了uCLinux操作系统,并在这个嵌入式平台上实现网络控制的各项功能。本文的叙述的网络通信工程就是其中最主要的功能。
1 基于S3C4510B以太网电路的设计思路与实现
作为一款优秀的网络控制器,基于S3C4510B的系统若没有以太网接口,其应用价值就会大打折扣,因此,就整个系统而言,以太网接口电路应是必不可少的,但同时也是相对较复杂的。从硬件的角度看,以太网接口电路主要由MAC控制器和物理层接口(Physical Layer,PHY)两大部分构成。javascript:window.open(this.src);" style="cursor:pointer;"/>
S3C4510B内嵌一个以太网控制器,支持媒体独立接口(Media Independent Interface,MII)和带缓冲DMA接口(Buffered DMA Interface,BDI),可在半双工或全双工模式下提供情报0M/100Mbps的以太网接入。在半双工模式下,控制器支持CSMA/CD协议,在全双工模式下支持IEEE802.3MAC控制层协议。因此,S3C4510B内部实际上已包含了以太网MAC控制,但并未提供物理层接口,故需外接一片物理层芯片,以提供以太网的接入通道。
常用的单口10M/100Mbps高速以太网物理层接口器件主要有RTL8201、DM9161等,均提供MII接口和传统7线制网络接口,可方便地与S3C4510B接口。以太网物理层接口器件主要功能一般包括:物理编码子层、物理媒体附件、双绞线物理媒体子层、10BASE-TX编码/解码器和双绞线媒体访问单元等。
在该设计中,使用DP9161作为以太网的物理层接口。DM9161是一款低功耗、高性能的CMOS芯片,支持10M和100M的以太网传输,它起编码、译码输入和输出数据的作用。它与S3C4510B的引脚连线如图图1所示。
由于S3C4510B片内已民用有带MII接口的MAC控制器,而DM9161也提供了MII接口,各种信号的定义也很明确,因此DM9161与S3C4510B的连接时序衔接,可以达到很好的网络信号传递的目的。图2为DM9161在本系统中的实际应用电路(图中右下方的1、2、3以及14、15、16分别与网络隔离变压器相应引脚相连)。
S3C4510B的MAC控制器可通过MDC/MDIO管理接口控制多达斡尔1个DM9161,每个DM9161应有不同的PHY地址(可从00001B~11111B)。当系统复位时,DM9161锁存引脚9、10、12、13、15的初始状态作为与S3C4510B管理接口通信工程的PHY地址;但该地址不能设为00000B,否则DM9161进入掉电模式。
信号的发送和接收端应通过网络隔离变压器和RJ45接口接入传输媒体,实际应用电路如图书室所示。
图2
2 Linux下的网络编程协议分析
Linux下的TCP/IP网络协议栈的各层之间是通过一系列互相连接层的软件来实现Internet地址族的,结构层次如图4所示。
其中BSD socket层由专门用来处理BSD socket的通用套接字管理软件来处理,它由INET socket层来支持。INET socket为基于IP的协议TCP和UDP管理传输端点。UDP(用户数据报协议)是一个无连接协议,而TCP(传输控制协议)是一个可靠的端对端协议。传输UDP包的时候,Linux不知道也不关心它们是否安全到达了目的地。TCP则不同。在TCP连接的两端都需要加上一个编号,以保证传输的数据被正确接收。在IP层,实现了Internet协议代码,这些代码要给传输的数据加上一个IP头,并且知道如何把传入的IP包送给TCP或者UDP协议。在IP层以下,就是网络设备来支持所有的Linux网络工作,如PLIP、SLIP和以太网。
3 uClinux环境下的socket编程
网络的socket数据b传输是一种特殊的I/O,socket也是一种文件描述符,也具有一个类似文件的函数调用socket()。该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket函数实现的。常用的socket类型有两种:流式socket和数据报式socket。两者的区别在于:前者对应于TCP服务,后者对应于UDP服务。
3.1 uCLinux中socket编程中用到的函数
(1) socket函数
为了执行I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信