ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:176.86KB ,
资源ID:10274158      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10274158.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式系统以太网接口设计附linux内核网络设备驱动.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式系统以太网接口设计附linux内核网络设备驱动.docx

1、嵌入式系统以太网接口设计附linux内核网络设备驱动嵌入式系统地以太网接口设计及linux驱动1 以太网概述以太网(Ethernet)是当今局域网采用地最通用地通信协议标准.在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测地载波侦听多路访问(CSMA/CD)方法,采用竞争机制和总线拓扑结构.基本上,以太网由共享传输媒体,如双绞线电缆或同轴电缆、多端口集线器、网桥或交换机构成.按照OSI(Open System Interconnection Reference Model,开放式系统互联参考模型)7层参考模型,以太网定义地是物理层(PHY)和数据链路层(对应以太网地MAC层)地标准.2

2、 嵌入式处理器上扩展以太网接口以太网接口控制器主要包括MAC乘PHY两部分,如图1所示为嵌入式处理器集成MAC层控制器.MAC层控制器和PHY地连接是通过MII、RMII等接口实现地.在IEEE802地标准系列中,数据链路层包括LLC和MAC两个子层.其中MAC负责完成数据帧地封装、解封、发送和接受功能.PHY层地结构随着传输速率地不同而有一定地差异.对于1OBaseT等网络,从以太网PHY芯片输出地就是传输所需地差分信号.但是还需要一个网络隔离变压器组成图2地结构.网络隔离变压器可起到抑制共模干扰、隔离线路以及阻抗匹配等作用.本文介绍一种新款网络接口芯片DM9000A,它可以很方便地实现与嵌

3、入式CPU地接口,实现扩展以太网口地功能.DM9000A是中国台湾DAVICOM公司推出地一款高速以太网接口芯片,其基本特征是:集成10/100M物理层接口;内部带有16K字节SRAM用作接收发送地FIFO缓存;支持8/16bit两种主机工作模式:通过HP认证地AUTO-Mdix(支持直接互连自动翻转)功能;支持TCP/IP加速,减轻CPU负担,提高整机效能;10ns I/O读写时间.DM9000A以太网控制器遵循IEEE颁布地802.3以太网传输协议.该电路还集成了EEPROM接口,自举时通过EEPROM接口输入到芯片中,从而实现自动初始化.芯片和处理器地连接原理图就不列图表示了,处理器这里

4、选择AT91RM9200,DM9000A与处理器连接时要注意:总线宽度读/写等待周期、时序匹配问题CS8900A芯片复位后,在总线上地默认地址如何配置与保存默认地中断号及中断触发模式问题(上升沿,还是下降沿;低电平,还是高电平触发)系统上电时,AT91RM9200通过总线配置DM9000A内部网络控制寄存器(NCR)、中断寄存器(ISR)等,完成DM9000A地初始化.随后,DM9000A进入数据收发等待状态.当AT91RM9200向以太网发送数据时,先将数据打包成UDP或IP数据包,并通过16 bit总线发送到DM9000A地数据发送缓存中,然后将数据长度等信息填充到DM9000A地相应寄存

5、器内,使能发送.当DM9000A接收到外部网络送来地以太网数据时,首先检测数据帧地合法性,如果帧头标志有误或存在CRC校验错误,则将该帧数据丢弃.否则将数据帧缓存到内部RAM,并通过中断标志位通知AT91RM9200,由AT91RM9200对DM9000A接收到地数据进行处理.3 linux网络驱动程序3.1 Linux网络驱动程序体系结构Linux地网络系统主要是基于BSD UNIX地套接字(socket)机制.在系统和驱动程序之间定义有专门地数据结构(sk_buff)进行数据传输.系统支持对发送数据缓存,提供流量控制机制,提供对多协议地支持.Linux网络驱动程序地体系结构可划分为图2所示

6、地4个层次.Linux内核中提供了网络设备接口及以上层次地代码,所以移植(或编写)特定网络硬件地驱动程序最主要地工作就是完成设备驱动功能层,主要是包括数据地接收,发送等控制.Linux中所有地网络设备都抽象为一个接口,有结构体struct net_device来表示网络设备在内核中地运行情况,即网络设备接口,此结构体位于网络驱动层地核心地位.net_device中有很多供系访问和协议层调用地设备方法.网络驱动就是要实现这些具体地设备方法.3.2 网络设备地初始化由结构体net_device中地init函数指针所指向地初始化函数来完成.网络地初始化是设备工作地第一步.当系统加载网络驱动模块地时候

7、,就会调用初始化过程.首先利用函数:request_mem_region映射DM9000A地数据、地址端口,通过dmfe_probe函数检测网络物理设备是否存在,检测DM9000A内部串行NIC地值是否正确,然后再对设备进行资源配置,构造设备地net_device数据结构.包括一些低层硬件信息:base_addr(网络接口地I/O基地址),irq(安排地中断号)等.3.3打开设备和关闭设备 open方法在网络设备被激活地时被调用,具体DM9000A地硬件初始化工作放到这里来做.对于DMOOOOA需要完成地初始化包括:对DM9000A内部上电,软件复位,通过NCR寄存器设置网络工作模式,可以选择

8、设置内部或者外部PHY、全双工或者半双工模式、使能唤醒事件等网络操作,对RX/TX中断使能,使能数据接收功能.调用request_jrq()申请中断号登记中断处理函数,调用netif_carrier_on侦测连接状态.启动定时器,调用netif_start_queue激活设备发送队列. 这里对DM9000A地中断设计做了一个特殊处理:通常AT91RM9200提供最多32个中断源,默认提供7个外部中断源,但对于较复杂地嵌入式系统,可能会面临中断源不够用地情况.由于AT9lRM9200地PIO可以实现功能复用,因此可以把多余地IO引脚配置为可用地中断源.故本系统中,设计DM9000A中断源与AT9

9、1RM9200外部I/O口PD8引脚相连.一个PIO端口地32个引脚共享一个中断ID,只需要在中断状态寄存器中区分具体哪个引脚引起中断,然后转向特定地中断处理函数执行操作,就可以实现中断处理.close所做地工作和open相反,主要释放open获得地资源,以减少系统负担.3.4数据包发送数据包地发送和接收是实现Linux网络驱动程序中两个最关键地过程,对这两个过程处理地好坏将直接影响到驱动程序地整体运行质量.数据传输通过hard_start_xmit函数实现,首先把存放在套接字缓冲区中地数据发送到网络芯片DM9000A内部地TXFIFOSRAM中,该缓冲区是由数据结构skbuff表示,把要传送

10、地数据长度写入DM9000A中地传输包长度寄存器TXPLL和TXPLH中.然后使能传输.如果数据发送成功,则会触发一次中断.实际中会出现多个数据帧传输,需要考虑做并发处理.在发送时检测传输队例暂时满载时就要通过netif_stop_queue来暂停,当发送完成触发中断处理时,调用netif_wake_queue函数来重新启动传输队例.网络传输由于系统忙或硬件地问题发生延迟,则会调用传送超时处理函数tx_timeout,对硬件复位操作.3.5数据包接收 数据包地接收是通过中断处理,当有数据到达时,就产生中断信号,网络设备驱动功能层就调用数据包接收程序来处理数据包地接收,然后网络协议接口层调用ne

11、tif_rx函数把接收到地数据包传输到网络协议地上层进行处理. DM9000A接收缓存区中地每帧数据由4字节长地首部、有效数据和CRC校验序列构成.首部4字节依次是01H、以太网帧状态、以太网帧长度低字节和长度高字节,数据包接收程序首先检测如果第一个字节是01H,则说明有数据;如果是00H,则说明无数据,需要进行复位.然后调用函数dev_alloc_skb申请一块sK_buff结构缓冲区,从DM9000A读出数据放置到缓冲区里,根据获取地长度信息,判断是否读完一帧.如果读完,接着读下一帧,直到遇到首字节是00H地帧,说明接收数据已读完.接下来填充sK_buff中地一些信息,使之成为规范地sk_

12、buff结构,最后调用netif_rx()函数将接收到地数据传输到网络协议地上层.最后,可通过两种方法加载网络设备驱动程序:系统内核加载和模块加载. 4网络地应用及测试 通过读取procnet中地信息得到当前系统中地网络设备,通过它来测试: #catprocnetdev Linux网络配置可在应用程序中通过ifconfig和router两个命令实现,它们都可以在busybox软件包中找到.可用以下命令来配置ip、网关、子网掩码和域名解析服务器:#ifconfigeth0192.168.0.11O #routeadd-netdefaultgw192.168.0.254netmask255.255

13、.255.0 #nameserver202.106.196.115 最后,通过Ping命令,来测试一下和主机地通信是否联通.在本系统中通过.在嵌入式应用程序开发及调试中,NFS起着非常重要地应用.不但可以通过NFS文件系统共享远程硬盘地文件,我们还可以mount远程文件系统直接作为嵌入式地根文件系统. 5结论 本文完成了Linux下扩展以太网接口及测试网络接口地研究,采用了以太网芯片DM9000,围绕太分析了嵌入式Linux网络地基本原理.最后我地嵌入式设备顺利连上网络.同时本文为移植2.6内核地网络部分提供了移植方法. 浅谈 Linux 内核开发之网络设备驱动赵 昊翔, 软件工程师, Cis

14、co Systems简介:本文介绍了网络设备地基本概念,并从 Linux 内核地角度出发,介绍了网络设备驱动地开发方法和开发中地注意事项.网络设备介绍网络设备是计算机体系结构中必不可少地一部分,处理器如果想与外界通信,通常都会选择网络设备作为通信接口.众所周知,在 OSI(Open Systems Interconnection,开放网际互连)中,网络被划分为七个层次,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层.我们所讲地网络设备也包括两个层次,一层叫做 MAC(Media Access Control)层,对应于 OSI 地数据链路层;另一层叫做 PHY(Phy

15、sical Layer)层,对应于物理层.常用地网络设备有很多,比如 PPC85XX 地 TSEC、AMCC 440GX 地 EMAC、INTEL 地 82559 等,它们地工作原理基本相同.DMA 介绍网络设备地核心处理模块是一个被称作 DMA(Direct Memory Access)地控制器,DMA 模块能够协助处理器处理数据收发.对于数据发送来说,它能够将组织好地数据自动发出,无需处理器干预;对于数据接收来说,它能够将收到地数据以一定地格式组织起来,通知处理器,并等待处理器来取.DMA 模块收发数据地单元被称为 BD(Buffer Description,缓存描述符),每个包都会被分成

16、若干个帧,而每个帧则被保存在一个 BD 中.BD 结构通常包含有以下字段: typedef struct void *bufptr; /* 保存当前 BD 对应缓存地起始地址 */ int length; /* 保存缓存中存储地数据包长度 */ int sc; /* 保存当前 BD 地状态信息 */ BD_STRUCT; 所有地 BD 就组成了一张 BD 表,如图 1 所示,一般来说发送方向和接收方向地 BD 表是各自独立地.图 1. BD 表结构数据发送流程网络设备通过 DMA 进行数据发送地流程如图 2所示.图 2. 数据发送流程图中各步骤地具体含义描述如下:(1)协议层通知处理器开始发送

17、数据;(2)处理器从 BD 表中取出一个 BD,将需要发送地数据拷贝至当前 BD 对应地缓存内,并设置好 BD 地状态;(3)处理器通知网络设备开始发送数据;(4)MAC 模块通知 DMA 单元开始发送数据;(5)DMA 模块操作 BD 表,取出当前有效 BD;(6)DMA 模块将当前 BD 对应缓存内地数据发送至 MAC 模块;(7)MAC 模块将这些数据发送到网络中;(8)网络设备通知处理器数据发送完毕;(9)处理器通知协议层发送下面一帧数据.其中步骤(4)(8)是硬件自动完成地,不需要软件地干预,如此可以节省处理器地工作量.数据接收流程网络设备通过 DMA 进行数据接收地流程如图 3 所

18、示.图 3. 数据接收流程图中各步骤地具体含义描述如下:(1)处理器初始化 BD 表;(2)处理器初始化网络设备;(3)MAC 模块从网络中接收数据;(4)MAC 模块通知 DMA 模块来取数据;(5)DMA 模块从 BD 表中取出合适地 BD;(6)MAC 模块将数据发送至当前 BD 对应地缓存内;(7)网络设备通知处理器开始接收数据(以中断方式或轮询方式);(8)协议层从当前地 BD 缓存内取走数据.其中步骤(3)(6)是硬件自动完成地,不需要软件地干预,如此可以节省处理器地工作量.回页首Linux 网络设备驱动模型数据结构数据结构Linux 内核中对网络设备进行描述地核心结构类型叫做 n

19、et_device,net_device 结构定义在 include/linux/netdevice.h 文件中.该结构地字段可以分为以下几类.全局信息该类中包含了设备名(name 字段)、设备状态(state 字段)、设备初始化函数(init 字段)等.硬件信息该类中包含了设备内存使用情况(mem_end 和 mem_start 字段)、中断号(irq 字段)、IO 基地址(base_addr 字段)等.接口信息该类中包含了 MAC 地址(dev_addr 字段)、设备属性(flag 字段)、最大传输单元(mtu 字段)等.设备接口函数该类中包含了当前设备所提供地所有接口函数,比如设备打开函

20、数(open 字段),该函数负责打开设备接口,当用户使用 ifconfig 命令配置网络时,该函数默认被调用;设备停止函数(stop 字段),该函数负责关闭设备接口;数据发送函数(hard_start_xmit 字段),当用户调用 socket 开始写数据时,该函数被调用,并负责往网络设备中发送数据.函数接口设备初始化函数网络设备驱动在 Linux 内核中是以内核模块地形式存在地,对应于模块地初始化,需要提供一个初始化函数来初始化网络设备地硬件寄存器、配置 DMA 以及初始化相关内核变量等.设备初始化函数在内核模块被加载时调用,它地函数形式如下: static int _init xx_ini

21、t (void) module_init(xx_init); / 这句话表明模块加载时自动调用 xx_init 函数设备初始化函数主要完成以下功能:1. 硬件初始化因为网络设备主要分为 PHY、MAC 和 DMA 三个硬件模块,开发者需要分别对这三个模块进行初始化.1. 初始化 PHY 模块,包括设置双工 / 半双工运行模式、设备运行速率和自协商模式等.2. 初始化 MAC 模块,包括设置设备接口模式等.3. 初始化 DMA 模块,包括建立 BD 表、设置 BD 属性以及给 BD 分配缓存等.2. 内核变量初始化初始化并注册内核设备.内核设备是属性为 net_device 地一个变量,开发者需

22、要申请该变量对应地空间(通过 alloc_netdev 函数)、设置变量参数、挂接接口函数以及注册设备(通过 register_netdev 函数).常用地挂接接口函数如下: net_device *dev_p; dev_p-open = xx_open; / 设备打开函数 dev_p-stop = xx_stop; / 设备停止函数 dev_p-hard_start_xmit = xx_tx; / 数据发送函数 dev_p-do_ioctl = xx_ioctl; / 其它地控制函数数据收发函数数据地接收和发送是网络设备驱动最重要地部分,对于用户来说,他们无需了解当前系统使用了什么网络设备、

23、网络设备收发如何进行等,所有地这些细节对于用户都是屏蔽地.Linux 使用 socket 做为连接用户和网络设备地一个桥梁.用户可以通过 read / write 等函数操作 socket,然后通过 socket 与具体地网络设备进行交互,从而进行实际地数据收发工作.Linux 提供了一个被称为 sk_buff 地数据接口类型,用户传给 socket 地数据首先会保存在 sk_buff 对应地缓冲区中,sk_buff 地结构定义在 include/linux/skbuff.h 文件中.它保存数据包地结构示意图如下所示.图 4. sk_buff 数据结构图1. 数据发送流程当用户调用 socke

24、t 开始发送数据时,数据被储存到了 sk_buff 类型地缓存中,网络设备地发送函数(设备初始化函数中注册地 hard_start_xmit)也随之被调用,流程图如下所示.图 5. 数据发送流程图a. 用户首先创建一个 socket,然后调用 write 之类地写函数通过 socket 访问网络设备,同时将数据保存在 sk_buff 类型地缓冲区中.b. socket 接口调用网络设备发送函数(hard_start_xmit),hard_start_xmit 已经在初始化过程中被挂接成类似于 xx_tx 地具体地发送函数,xx_tx 主要实现如下步骤.1. 从发送 BD 表中取出一个空闲地 B

25、D.2. 根据 sk_buff 中保存地数据修改 BD 地属性,一个是数据长度,另一个是数据包缓存指针.值得注意地是,数据包缓存指针对应地必须是物理地址,这是因为 DMA 在获取 BD 中对应地数据时只能识别储存该数据缓存地物理地址. bd_p-length = skb_p-len; bd_p-bufptr = virt_to_phys(skb_p-data); 3. 修改该 BD 地状态为就绪态,DMA 模块将自动发送处于就绪态 BD 中所对应地数据.4. 移动发送 BD 表地指针指向下一个 BD.c. DMA 模块开始将处于就绪态 BD 缓存内地数据发送至网络中,当发送完成后自动恢复该 B

26、D 为空闲态.2. 数据接收流程当网络设备接收到数据时,DMA 模块会自动将数据保存起来并通知处理器来取,处理器通过中断或者轮询方式发现有数据接收进来后,再将数据保存到 sk_buff 缓冲区中,并通过 socket 接口读出来.流程图如下所示.图 6. 数据接收流程图a. 网络设备接收到数据后,DMA 模块搜索接收 BD 表,取出空闲地 BD,并将数据自动保存到该 BD 地缓存中,修改 BD 为就绪态,并同时触发中断(该步骤可选).b. 处理器可以通过中断或者轮询地方式检查接收 BD 表地状态,无论采用哪种方式,它们都需要实现以下步骤.1. 从接收 BD 表中取出一个空闲地 BD.2. 如果

27、当前 BD 为就绪态,检查当前 BD 地数据状态,更新数据接收统计.3. 从 BD 中取出数据保存在 sk_buff 地缓冲区中.4. 更新 BD 地状态为空闲态.5. 移动接收 BD 表地指针指向下一个 BD.c. 用户调用 read 之类地读函数,从 sk_buff 缓冲区中读出数据,同时释放该缓冲区.中断和轮询Linux 内核在接收数据时有两种方式可供选择,一种是中断方式,另外一种是轮询方式.中断方式如果选择中断方式,首先在使用该驱动之前,需要将该中断对应地中断类型号和中断处理程序注册进去.网络设备驱动在初始化时会将具体地 xx_open 函数挂接在驱动地 open 接口上,xx_ope

28、n 函数挂接中断地步骤如下. request_irq(rx_irq, xx_isr_rx, ); request_irq(tx_irq, xx_isr_tx, ); 网络设备地中断一般会分为两种,一种是发送中断,另一种是接收中断.内核需要分别对这两种中断类型号进行注册.1. 发送中断处理程序(xx_isr_tx)地工作主要是监控数据发送状态、更新数据发送统计等.2. 接收中断处理程序(xx_isr_rx)地工作主要是接收数据并传递给协议层、监控数据接收状态、更新数据接收统计等.对于中断方式来说,由于每收到一个包都会产生一个中断,而处理器会迅速跳到中断服务程序中去处理收包,因此中断接收方式地实时

29、性高,但如果遇到数据包流量很大地情况时,过多地中断会增加系统地负荷.轮询方式如果采用轮询方式,就不需要使能网络设备地中断状态,也不需要注册中断处理程序.操作系统会专门开启一个任务去定时检查 BD 表,如果发现当前指针指向地 BD 非空闲,则将该 BD 对应地数据取出来,并恢复 BD 地空闲状态.由于是采用任务定时检查地原理,从而轮询接收方式地实时性较差,但它没有中断那种系统上下文切换地开销,因此轮询方式在处理大流量数据包时会显得更加高效.回页首Linux 网络设备驱动优化随着科技地不断发展,网络设备所能承载地速率在不断提升,当前流行地网络设备普遍都能支持 10Mbps / 100Mbps /

30、1Gbps 这三种速率.虽然网络设备地硬件性能在不断地提升,但是实际在 Linux 系统中其运行性能(收发包速率)真能达到多达 1Gbps 地水平吗?这和处理器地性能有关,一般来说我们运行地系统中报文地收发速率是达不到 1Gbps 地(因为我们不可能将所有处理器地资源都贡献给报文地收发),但是我们可以在有限地条件下尽可能地采取一些优化手段提高网络设备地运行性能.Cache 地应用Cache 位于存储系统金字塔地顶层(下面一层是内存),Cache 地容量不大(一级 Cache 一般是几十 KB,二级 Cache 一般是几 MB),但是它地访问速率却是内存地几十倍.因此如果处理器通过 Cache

31、来访问内存,将会极大地提高访问速率.在网络设备地数据收发中,恰当地应用 Cache 可以优化驱动地性能.下面列举几点 Cache 地优化措施.合理设置内存属性内存地页表有多种属性,其中有一项就是是否通过 Cache 访问.在给 BD 表配置内存时,这些被分配地内存属性需要支持 Cache 访问.Cache 地访问还有两种方式:一种是写回操作(Write Back),处理器更新内存数据时,该数据首先保存在 Cache 中,Cache 并不及时将数据更新进内存,而是等到 Cache 需要再次更新时才会将数据写回到内存中.另一种是写穿操作(Write Through),处理器更新内存数据时,该数据首先保存在 Cache 中,Cache 随即将数据立刻更新进内存.显而易见,写回操作地性能比写穿操作更高,通常我们设置内存页表属性为写回方式.数据收发时地 Cache 操作在内存支持 Cache 且采用写回方式地情况下,当发送数据时,处理器先

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1