微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 基于嵌入式Linux的网络设备驱动设计与实现

基于嵌入式Linux的网络设备驱动设计与实现

时间:07-27 来源:互联网 点击:
随着电子信息技术的发展,嵌入式系统应用到了社会生活的各个角落。后PC时代是嵌入式和网络化的时代,将分散在各处的嵌入式设备连接到网络成为近年来以及未来的发展趋势,随时随地都能通过网络去控制这些智能设备,在多种嵌入式设备之间进行数据通信,例如信息终端、信息家电等。

用户可以通过信息终端从网络服务商提供的服务中搜索并浏览有用的信息,实现全面交流和互动,实现新型的信息金融终端的概念,同时,用户也可享受到网上金融信息、网上购物、视频会议等其他服务。  

本文提出了一种基于Linux 2.4操作系统平台和Intel PXA255处理器的网络设备驱动设计方案,分析了其软硬件实现以及Linux下网络设备驱动的特性。  

1 网卡设备  

本方案使用的CS8900A是一款低功耗的网络控制器,包含一块片上 RAM、10BASE-T接收和发送滤波器、ISA总线接口,提供了多种性能和配置选项,它独立的包页(packet page)体系结构能自适应改变网络通信模式和可用的系统资源,提高了系统效率。该控制器支持IEEE 802.3的10 Mbit/s模式,全双工单片以太网解决方案。主要模块有:一个直接ISA总线接口;一个802.3 MAC引擎,处理以太网帧发送和接收的各个方面;集成4 kB的页可缓冲存储器,将发送和接收的帧完全缓冲在网卡中;一个串口EEPROM接口;完全模拟前端10BASE-T(10 Mbit/s)和AUI(粗缆网卡接口)。  

2 Linux驱动  

Linux驱动分为字符设备、块设备和网络设备驱动。字符设备是能够像字节流一样被访问的设备,大多数字符设备只能被顺序访问。块设备驱动程序提供面向块的设备的访问,这种设备以随机访问的方式传输数据,并且数据总是具有固定大小的块,这些块中包含了2的几次幂字节的数据,硬盘就是典型的块设备。  

在Linux中,字符设备和块设备都是通过文件系统节点被访问,块驱动程序除了向内核提供与字符驱动程序相同的接口外,还提供了专门面向块驱动设备的接口。  

网络接口在系统中的角色与一个已挂装的块设备非常相似。块设备将自己注册到blk_dev数组以及其他内核结构中,然后通过自己的request函数在发生请求时“发送”和“接收”数据块。同样,网络接口也必须在特定的数据结构中注册自己,以便在与外界交换数据包时被调用。但是,块设备接口与网络数据包发送接口之间存在不同。普通的文件操作对网络接口来说没有任何意义,因此,Unix的“所有东西都是文件”这一思想无法应用于网络接口。这样,网络接口存在于它们自己的名字空间中,同时导出一组不同的操作。同一网络接口可以由几百个套接字同时复用。块没备驱动只对来自内核的请求做出响应,而网络驱动程序却异步地接收来自外界的数据包。  

网络驱动程序同时必须支持大量的管理任务,例如设置地址、修改传输参数以及维护流量和错误统计等。网络驱动程序的API反映了这种需求。此外,网络驱动程序与内核其余部分之间每次交互处理的是一个网络数据包,因此,驱动程序无需关心协议问题。  

3 实现方案  

3.1 硬件连接  

硬件平台使用Intel PXA255处理器作为主机,工作频率400 MHz,网卡的品振为20 MHz,网卡的数据线和地址线通过缓冲后与CPU直接相连。  

网卡的读写使能引脚IOR/IOW信号主要由CPU采用Flash存储器的方式给出,与PWE和MOE两个引脚分别连接,其有效时间由CPU内部的寄存器配置而得。  

网卡内部寄存器使能引脚AEN由CPU片选脚E_CS组合得出,而网卡复位引脚则通过CPU的一个GPIO口给出。  

从电路中可以看出只使用了4根地址线,因此,对网卡中的寄存器的访问采用packet page寄存器间接寻址,即通过地址线先对packet page访问,将欲访问的寄存器R的偏移地址送到packet page寄存器中,然后通过数据线去读或者写此寄存器。  

3.2 软件实现  

网卡驱动可看做是连接网络层与实际网络设备的一个软件层。在网卡设备驱动中,通过维护一个名为net_device结构的dev指针来实现上层对驱动程序的访问。这个结构包括了对管理网络设备所必须完成的操作,包括设备的打开、关闭、发送数据、接收数据、获得状态、设置网卡地址、处理超时等。  

以下主要介绍这些操作的实现,包括设备的初始化和注销、对中断事件的处理。  

3.2.1 设备初始化  

由于需要通过Memory模式访问网卡设备,因此需要配置存储器控制寄存器VLIO(Variable Latency)模式。关联设备的初始化探测函数cirrus_probe,在cirrus_probe函数中主要是填充该设备的Dev结构。网络接口探测方式不同,所以不能在编泽阶段进行Dev结构的设置。这样从Dev→init返回时,Dev结构中就应该填充正确的值。Dev结构中包含相关的网卡操作函数的指针,为上层调用网卡驱动提供方法。内核提供了ethr_setup函数,可处理以太网的某些缺省设置。在探测函数中还要分配net_device的priv字段,该字段所指向的数据项通常包含接口上的统计信息。用户可以在任何时刻通过调用ifconfig获得统计数据,向内核注册网络设备驱动程序。  

这里简要介绍网络设备驱动中两个重要的结构体:Linux内核提供的统一网络设备结构net_device,定义了系统统一的访问接口,此结构体位于网络驱动层的核心地位;net_device_stats结构体用来记录网络驱动发送和接收数据量的统计信息,例如发送包的数目以及丢失包的数目。当应用程序需要获得接口的统计信息时,将调用该方法。  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top