《基于KSZ8081RNB网卡设备的驱动程序的开发设计》9500字_第1页
《基于KSZ8081RNB网卡设备的驱动程序的开发设计》9500字_第2页
《基于KSZ8081RNB网卡设备的驱动程序的开发设计》9500字_第3页
《基于KSZ8081RNB网卡设备的驱动程序的开发设计》9500字_第4页
《基于KSZ8081RNB网卡设备的驱动程序的开发设计》9500字_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于KSZ8081RNB网卡设备的驱动程序的开发设计目录TOC\o"1-2"\h\u224671引言 1174071.1嵌入式系统概述 19771.2嵌入式Linux的发展方向与选型 2221401.3课题的背景及意义 323051.4论文主要内容及安排 438582嵌入式开发环境的搭建 431852.1Linux硬件开发平台 4277272.2Linux软件开发环境 6288552.3本章总结 8132263驱动程序框架及工作原理 814703.1网络驱动的工作原理 8236633.2KSZ8081概述 9226613.3KSZ8081驱动程序的框架描述 10284073.5KSZ8081驱动程序的加载 13107374基于KSZ8081的以太网程序设计 15252804.1硬件电路图 1533424.2KSZ8081驱动程序编写 1666865.总结与展望 23摘要:近几年嵌入式Linux渐渐走入人们的视野,它不仅运行效率高,而且是开源的且内核较小,网络功能方面也很强大,逐渐在嵌入式系统以及服务器,网络系统等方面得到了广泛的运用。目前嵌入式系统的开发热点就是掌握在Linux系统下的开发技术,而目前开发的难点就在于Linux驱动程序的开发。本文主要研究了基于KSZ8081RNB网卡设备的驱动程序的开发,并对Linux系统下网络设备驱动程序的工作原理和运行过程进行了分析,并对嵌入式Linux系统中网络设备驱动的开发进行了介绍,最终实现在Ubuntu系统下的KSZ8081RNB网卡驱动的编程。同时对KSZ8081的初始化、KSZ8081的打开与关闭函数、数据的传送和数据的接收以及出现超时处理等相关过程进行了详细分析。关键词:Ubuntu系统,嵌入式Linux,KSZ8081RNB,网络设备,驱动程序1引言1.1嵌入式系统概述当前社会信息化飞速发展,嵌入式系统(EmbeddedSystem)逐渐涉及到我们生活中越来越多的方面,嵌入式系统顾名思义指的是一些设备被用于控制和监测或协助装置以及机器和工厂的操作等。由此我们不难看出嵌入式系统具有“嵌入性”、“专用性”和“计算机系统”等主要特征。它主要是把计算机技术当作工具、将应用作为最终目标、实现软件、硬件可进行裁剪,同时在功能、可靠性、功耗等方面有着更高要求的计算机系统。[1]通过了解嵌入式技术的发展史,不难发现它分为了三个时期,分别是单片机、微控制器以及片上系统。我们依次来介绍,单片微型计算机(SingleChipMicrocomputer),简称为单片机,在这个时期,由于大规模集成电路的流行,能够实现计算机的CPU、RAM和众多的I/O接口都集成到一块芯片上。然后是MCU(MicroControllerUnit),即微控制器,它能够提供丰富的片上外设和接口,更加凸显出其智能化控制的能力,成为了目前嵌入式系统应用的主要选择。但大部分时候,SCM和MCU一般都被称为是“单片机”,因为它们是不会运行操作系统的在一般情况下,而且功能上也显得较为单一。最后是片上系统SOC(SystemonaChip)它不仅可以大幅地减少电子产品的开发成本,还能将开发周期尽可能缩短,主要是因为它使用预订制模块IP(IntellectualProperty)进行集成电路的开发,这使得产品在质的上面有了一个提升。不仅超大规模集成电路的复杂功能能够轻松实现,还可以在芯片外部进行编程,全部功能系统的微电子产品也能实现集成在一个单芯片上。1.2嵌入式Linux的发展方向与选型1.2.1发展方向目前,嵌入式Linux系统开发得到了广泛的关注,许多国内外公司都争先在做嵌入式Linux方面的研发,但是嵌入式Linux面对日益增长的用户市场需求,还有很长的路要走,如:加强Linux的实时性扩展改变Linux的内核架构完善Linux的集成开发环境1.2.2软硬件的选择嵌入式系统不仅涉及了系统硬件的选择同样软件的选择也一样重要,因此选择合适的软硬件显得非常重要。ARM系列的处理器被大规模用于控制、电子、网络以及无线通讯等方面主要是因为其具有性能强、功耗小的特点。故硬件上本论文选用了I.MX6ULL开发板,该开发板是一款以Cortex-A7为架构的开发板,该开发板搭载的资源非常丰富,通过邮票孔就引出了I.MX6ULL几乎所有的资源,接口很多,基本可以应对多种应用的要求。I.MX6ULL核心板板载资源如下:CPU:采用MCIMX6Y2CVM05AB(工业级)或MCIMX6Y2CVM08AB(工业级),主频为528MHz或800MHz,在实际使用过程中主频频率并不能达到800MHz只有792MHz,封装采用了BGA289。DDR3:K4B4G1646E-BY(M),大小为512MB字节。EMMC:KLM8G1GET,8GB字节。邮票孔方式间距为1.0mm并引出了146个引脚。然后就是选择合适的操作系统,选择一个合适的操作系统会在一定程度上降低产品开发、后期发布以及维护的难度,并且它必须支持你硬件的选型,目前嵌入式Linux操作系统有了飞速的发展,这离不开其源码向大众公开以及其强大的功能和便于移植等特点。[2]因此本论文选用了Ubuntu作为我们的操作系统,因为Ubuntu有着良好的图形界面和非常强大的ape-get功能,所以目前一般都是用Ubuntu来进行学习和开发。1.3课题的背景及意义从上述的介绍我们了解到,嵌入式技术已经逐渐涉及到我们生活中越来越多的方面如:工业控制、消费电子、无线通讯等各个方面,而且目前嵌入式领域研发的焦点就是嵌入式系统驱动的开发,如果能够保证系统的相对稳定,如何将设计的驱动程序变得更加简化和稳定仍然是嵌入式研发人员的工作重点。本论文的主要工作就是基于Ubuntu系统下的KSZ8081RNB网卡驱动程序的设计,操作系统中内核提供的网卡驱动程序比较繁杂,而本文则设计了一个更加简明的驱动程序并同时兼具稳定、高速的数据传输,来给用户带来更加稳定的网络服务。1.4论文主要内容及安排本文的目标旨在基于I.MX6ULL硬件开发平台进行Ubuntu系统的研究,在系统硬件的基础上完成Ubuntu操作系统的以太网驱动程序的开发,通过编写该驱动程序能够实现用户数据包在网络媒介上的发送和接收,该驱动程序不仅以特定的媒介访问控制方式来进行上层协议传递过来的数据包的发送,还把接收到的数据包再次递回到上层协议。因而能够提供迅速稳定的曝光数据的传输服务,并为上层应用提供稳定高效的网络传输服务。[3]本文对嵌入式系统的软硬件平台以及Linux软件在开发过程中所需搭建的环境进行了相关阐述,重点阐述了KSZ8081RNB网卡的工作原理和驱动程序的介绍,着重对Ubuntu系统下以太网驱动程序的编写进行了分析,并测试了以太网驱动程序的相关功能。章节安排如下:第一章主要对嵌入式系统的概念和发展前景以及面临的问题,并对Ubuntu系统和硬件平台及研究背景进行了简单的介绍。第二章主要介绍了本次论文设计采用的硬件平台和Linux开发环境如何搭建。第三章主要介绍了KSZ8081RNB网卡的工作原理以及其驱动程序的框架。第四章主要论述了Ubuntu系统下以太网驱动程序的编写过程,重点介绍了KSZ8081RNB驱动程序的设计方法。第五章对本次设计进行相关的总结,并对今后的工作进行了展望。2嵌入式开发环境的搭建2.1Linux硬件开发平台本次设计的开发板采用了I.MX6ULL,它是一个基于Cortex-A7处理器的嵌入式硬件平台。Cortex-A7处理器是一种能效较高的处理器,是根据ARMV7-A架构搭建由ARM公司推出的可以实现单核多核的微控制器(MCU),制作工艺主要采用了28nm/40nm,主频为800-1500MHz。该处理器能完美兼容其他的Cortex-A系列处理器的开发程序,Cortex-A7处理器可以说是Coetex-A15处理器的降阶版,它的体系结构和功能集基本都继承了Cortex-A15,都采用了一系列全新的技术如虚拟化、大物理地址扩展(LPAE)NEON高级SIMD和AMBA4ACE一致性等。这使得它们在big.LITTLE配置中能够配合工作,以此来完成高性能的叠加和低功耗的完美组合。差别在于,Cortex-A7处理器更加侧重考虑了性能与功耗之间的平衡,故Cortex-A7处理器的微体系结构能够提供更好的能效。Cortex-A7处理器主要特性有以下几个方面:兼具了调试广泛的特性,能够实现对实时性要求比较高的应用。集成了两个独立的外部总线,对多种存储设备都兼容,范围上更加广泛,同时数据的存取也更稳定。集成了L2高速缓存控制器,可以给1MB的高速缓存内存提供较低的延迟及高带宽的访问。在硬件方面支持半精度、单精度及双精度浮点运算的浮点操作。集成了常用总线的控制器,如CAN、LCD、OTG、JTAG、USB等,简化了对外设的操作流程。本次设计的系统硬件结构Cortex-A7处理器架构图如图2.1所示。图2.1Cortex-A7处理器架构以ARM7为架构的I.MX6ULL应用处理器是NXP最新加入的实时处理产品,不仅能提供高性能处理还能优化最低功耗。因此本论文选择以Cortex-A7为架构的I.MX6ULL开发板作为本次论文的硬件开发平台。2.2Linux软件开发环境想要在PC上开发嵌入式Linux软件,PC就必须安装Linux操作系统,目前最新的Linux发行版本有Ubuntu21.04、UOSDesktophome20、Deepin20Beta、CentOS7.7等,基于Debian发行版和GNOME桌面环境的操作系统叫做Ubuntu系统,但Ubuntu系统从11.04版开始,放弃了GNOME桌面环境,改成了Unity,直到Ubuntu18.04LTS之后,Ubuntu发行版又重新启用了GNOME3桌面环境。Ubuntu系统主要是给用户创造了一个相对自由的操作系统。[4]因此为了更加容易上手的开发驱动程序,本文选择使用界面简明、操作容易的Ubuntu系统来搭建Linux软件的开发环境。我在PC上安装使用的Ubuntu版本号为16.04,Ubuntu16.04版兼容amd64位x86系列、ARM系列和PowerPC系列处理器。安装Ubuntu16.04的过程相对来说比较简单,由于我们需要在Windows系统和Ubuntu系统之间传递文件,单独安装其中一个系统便比较麻烦,所以本文选择在PC上安装一个虚拟机软件,我们可以在安装的虚拟机软件上装载我们需要的系统,由于这个软件是虚拟出的PC,故不会影响我们原系统的使用,而通过VmwareWorkstation15.5Pro软件的安装,就可以直接引导Ubuntu16.04镜像的安装和启动。Ubuntu16.04安装好之后,我们为了更好的配置系统便需要从网络下载一些必要的软件包,这就需要修改一下系统的网络参数,来完成网络的连通,我们找到“网络适配器”选项,进入修改虚拟机的网络配置信息,这里我们配置成“桥接模式”即可,接下来我们验证一下网络是否连通,我们可以打开Ubuntu系统的浏览器输入某个网址进行联网测试。网络连通成功,我们还要单独设置一下Ubuntu软件源的地址,因为Ubuntu系统在全球各地都建有服务器站点,这让全球各地的用户下载软件的速度有了保障,体验感更佳。这里,本文选择了中国的作为软件源地址。软件源选好后,我们就可以开始下载软件了,首先为了Ubuntu系统使用起来更加方便,我们下载一下简体中文语言包,点击Ubuntu任务栏中SystemSetting下面的LanguageSupport,打开语言设置界面,首先会检测到我们没有安装语言支持,我们选择“install”进行安装,安装完成会自动打开语言支持界面,然后我们点击“Install/RemoveLanguages..”按钮,打开“安装语言”界面,然后在里面找到“中文简体”,点击安装就会自动下载和安装简体中文语言包,同时我们把地区改成汉语(中国),配置完相应的信息,我们需要重启系统,这样就把系统的语言改成了中文简体。系统安装好以后,我们为了驱动程序的编写,就必要安装编译器,尽管Ubuntu系统默认自带了gcc编译器,但对于不同的架构,gcc并不能完全兼容,gcc编译器只能编译X86平台下的Linux程序,我们学习的I.MX6ULL是ARM架构的,所以我们就需要使用不仅支持ARM的编译器并且这个编译器在X86架构下也能运行,我们通常把这种编译器叫做交叉编译器。为了简化操作,我们去网上下载一个已经制作好的编译器,根据本论文的需求,我采用了Linaro公司的ARM交叉编译器作为本次项目的交叉编译工具,我们把gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz的安装包下载到本地进行安装,首先我们在Ubuntu的用户根目录下建立一个新文件夹“tools”,用来保存一些开发用到的工具。然后使用SSH文件传输工具将ARM交叉编译器传输到我们刚才在Ubuntu系统下创建的“tools”目录下,然后打开系统终端输入“sudomkdir/usr/local/arm”命令创建一个新目录,然后复制刚才下载好的交叉编译器安装包到“/usr/local/arm”目录下,然后进入到“/usr/local/arm”目录下,在终端输入:“sudotar-vxfgcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz”解压ARM交叉编译器,解压完成后会生成一个名为“gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf”的文件夹,这就是我们要使用的交叉编译工具,安装完成后,需要设置交叉编译工具的路径,我们在终端输入“sudovi/etc/profile”命令,在文件的最后输入:“exportPATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin”修改一下环境变量,然后保存并退出,在终端输入“reboot”命令重新启动Ubuntu系统,这样交叉编译环境就会自动生效。对开发板进行调试必须通过串口工具,所以我们还需要在Ubuntu系统上安装一个串口工具,本文选择CH340芯片实现了USB转串口的功能,下载好安装包,直接打开进行安装,完成后使用USB线将开发板的串口同电脑连接起来,然后打开Windows系统下的设备管理器,点击“设备管理器”选项,在设备管理器窗口展开“端口(COM和LPT)”,可以查看到CH340对应的串口编号,这说明串口工具已经配置成功。安装好串口驱动,还需要安装能够连接调试开发板的软件,本文采用了Hyperterminal这个软件来连接开发板,并对开发板进行调试,利用网络下载安装包并直接打开安装完成后,将开发板同电脑连接,接着我们看一下Hyperterminal的串口的属性,我们选择CH340,点击选择属性,把端口设置改成115200,因为本文使用的开发板默认波特率是115200,流控选择None,设置好之后我们就可以关掉电脑的设备管理器。然后进行一下测试,我们给开发板通电,如果连接成功,驱动也没有问题的话,Hyperterminal便会打印出开发板的启动信息。至此,PC和开发板就可以通过Hyperterminal这个软件搭建起桥梁,方便我们日后的调试与学习。2.3本章总结本章主要对硬件的开发平台以及Cortex-A7的架构及特性进行了描述,着重分析了软件开发环境如何搭建,特别是对交叉编译工具如何修改变量及其他操作,开发环境的成功搭建为后续章节的开展和学习做好了铺垫。3驱动程序框架及工作原理3.1网络驱动的工作原理在网络媒介上发送和接收用户数据包的设备叫做网络设备,它不仅以独有的媒介访问控制方式将上层协议传递过来的数据包发送出去,当其收到数据包后就会重新上传回上层协议。Linux驱动分为字符设备和块设备以及网络设备但它们还是存在一些差别,例如网络设备在/dev目录下没有相对应的文件,完成设备接口使用的应用程序为套接字(socket)。网卡设备驱动在Ubuntu系统下定义了四个层次,分别是网络协议接口层、网络设备接口层、设备驱动功能层和网络设备与媒介层。[5]网卡设备驱动程序的体系结构图如下图3.1所示,这四层的功能分别如下:网络协议接口层是一个收发接口用于将数据包统一传递给网络协议层,且不论是ARP或者IP等上层协议,通过函数dev_queue_xmit()都能顺利完成发送数据的操作,并利用函数netif_rx()来截获数据。网络设备接口层是具体网络设备及操作结构体由协议接口层统一提供,该结构体net_device放置了设备驱动功能层的各种函数。在实际操作中,网络设备接口层往往已经划分出硬件设备驱动层的结构的详细操作。设备驱动功能层的相关函数是结构体net_device的具体填充,该代码能帮助硬件实现相关操作,启动发送操作是利用hard_start_xmit()函数来进行的,接收操作是通过中断触发触发的。网络设备与媒介层是一个实体以此来实现数据包的收发,其中有网络适配器及传输媒介等,设备驱动功能层中的各种函数能够实现控制网络适配器。故对Ubuntu系统来说,网络设备以及媒介都是可以进行模拟的。图3.1驱动程序结构图本文在以太网驱动程序具体设计时,主要任务就是编写出net_device数据结构下设备驱动功能层的各个函数,最后将结构体注册编译进内核中。3.2KSZ8081概述本文采用的是KSZ8081RNB这个PHY芯片,该芯片利用其中一端与开发板的RGMI接口连通,另一端则与RJ45接口相连接,这样就形成了一个自协商、速率在10M/100M的网卡。KSZ8081RNB是3.3V供电快速的集成的单一的以太网物理层收发器,KSZ8081RNB芯片符合规定的IEEE802.3规范,通过两个差分对使用片上终止电阻和集成稳压器提供的1.2V的核心,以此来降低电路板成本,并简化电路板的布局。在铜介质方面,KSZ8081支持10BASE-T和100BASE-TX,实现传输和接收数据是利用标准CAT-5UTP,同时为了检验和指正直通和交叉电缆,故KSZ8081支持HPAutoMDI/MDI-X。在MAC处理器方面,KSZ8081MNX提供媒体独立接口(MII),而本文采用的KSZ8081RNB提供的接口则是减少媒体独立接口(RMII),两者对与MII/RMII和兼容MII/RMII的以太网MAC处理器和交换机能实现直连。KSZ8081为了便于测试、产品的系统启动及调试,还专门搭载了诊断功能。目前,以太网控制器往往都嵌入到嵌入式系统中,以达到提供媒体独立接口和带缓冲的DMA接口(BDI)的目的。[6]并且该控制器能在半双工以及全双工模式下使以太网连接速度达到10/100Mbps。控制器符合CSMA/CD协议是在半双工模式下,那么符合IEEE802.3MAC的协议就是在全双工模式下。KSZ8081芯片的原理框图如图3.2所示:图3.2KSZ8081芯片原理图3.3KSZ8081驱动程序的框架描述通过上述章节的分析,我们清楚了Ubuntu系统中网络驱动程序结构可分为四层,分别是网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层,以及网络设备和网络媒介层。由上层网络设备接口层定义的net_device数据结构体和底层硬件负责了以太网设备驱动的主要功能,最主要的函数就是数据的接收及发送函数。以太网驱动程序还包括两个主要的数据结构,除了net_device以外,另一个就是sk_buff数据结构。通过这个结构体能够实现在不一样的协议层TCP/IP之间,和以太网驱动程序之间完成数据包的传递,sk_buff结构体主要包括五个方面,分别是传输层、网络层、连接层需要的变量,决定数据区位置、大小的指针,和发送接收数据包所产生的具体设备信息等。在Ubuntu系统中sk_buffer被认为是一个起到决定作用的数据结构,该结构起着很重要的作用在数据发送端以及接收端。该结构是Ubuntu系统下的子系统,主要负责管理数据的缓冲区。sk_buff结构在一层层传递中时刻变化,并且贯穿系统的整个周期。当我们传递这些数据时,对应的缓冲区将会被自动创建,然后将数据包从这个缓冲区复制到用户的地址空间,不仅要复制数据包还要把他们的属性也复制过去,并最终保存在sk_buff结构当中。当我们处理需要的数据时,网络协议栈不同层的各个协议头信息将被输入到数据包里由不同的协议层,sk_buff结构中的指针会在这时被进行赋值,协议头和赋值往往都是一一对应的,这些数据在发到网络上之前会先被发送到网络适配器中,同时,sk_buff缓冲区就会得到释放。在以太网驱动程序编写中,首先我们需要判断网络设备存在与否,判断方法就是通过检测物理设备的硬件特征,然后才可以考虑是否启动该设备。启动网络设备之后还需要进行相关资源的配置,最后初始化结构体net_device,该网络设备才能受操作系统驱动。对KSZ8081网卡驱动程序来说,首先需要利用内核中的检测函数来判断是否安装了网卡,如若网卡连接上就可以直接使用,那么函数就会主动找到网卡的参数。[7]不然,我们就需要先配置好网卡的参数,再进行数据的传输,在内核中调用发送函数,将数据进行写入,之后就可以激活发送函数。KSZ8081驱动程序的整体流程图如下图3.3所示:图3.3驱动程序流程图KSZ8081网卡驱动程序编程的重点就在于数据包的发送与接收,检验一个网卡的好坏就是看它能否处理好数据包发送和接收。中断一般发生在网络设备接收到数据后中断,发生中断后,中断程序将提前申请好数据缓冲区来存放数据的数据结构。当KSZ8081网卡在接收、发送数据包或出现报错时,网卡将自动中断并调用中断函数,分析中断为何产生,并做出相应处理。中断函数的过程如图3.4所示:图3.4中断流程图3.5KSZ8081驱动程序的加载Ubuntu驱动程序一般有两种方式加载:一是动态加载,即把驱动程序编译成模块的形式,网络驱动程序模块加载的动态命令是insmod,卸载的动态命令即rmmod;二是静态编译,即相对于动态加载而言,直接对内核进行编译的方式。Linux中独有的技术动态加载使其内核更便于拓展,故在设计设备驱动程序时使用动态加载相对来说更加简单。而静态编译由于硬件的单一在嵌入式系统的外部设备中更容易获得更高的效率。[8]根据上述分析,显然动态模块能够更加简单易操作,避免了重复编译内核的繁杂,故本文选择了动态模块加载方式,提高编程的效率。动态模块的加载如图3.5所示:图3.5动态模块加载网络设备驱动程序的加载是从insmod命令开始,接着进行模式的初始化,这里需要利用入口函数init_module(),同时注册网络设备,这里要调用register_netdev()函数。如果注册成功,我们就对网络设备进行初始化,初始化函数是ksz8081_init,之后在dev_base链表的末尾插入net_device数据结构即可。初始化完成后,打开网络设备需要我们调用open函数,实现对数据包的发送及接收。当我们想要卸载网络模块时,首先调用close函数来关闭此设备,然后通过rmmod命令调用内核中的cleanup_module()模块就可以卸载该网络模块。[9]4基于KSZ8081的以太网程序设计4.1硬件电路图KSZ8081RNB的电路连接图如图4.1所示,其中读写信号为nWAIT,网卡重启的信号是nRESET。连接以太网需通过HR9111005A接口,且网卡的输入和输出采用跳线的工作模式来决定。图4.1KSZ8081电路图4.2KSZ8081驱动程序编写4.2.1驱动程序设计分析通过之前几章的铺垫和学习,我们知道structdevice数据结构的填充就是网络设备编程的一个重要部分。在Ubuntu操作系统下,每一个structdevice都能一一对应一个物理网络设备。我们将device结构联成一张链表,让指针dev_base指向该链表的表头,我们就可以获取每个接口的信息。[10]以太网驱动程序的编写主要包括了网络设备的注册、初始化与注销,还有数据的接收处理,并在数据传输出现故障、超时等特殊问题时做出相应的判断及处理办法。目前来看,网络设备的驱动已经处理的非常成熟,我们完全可以根据自身的需要根据通用驱动进行适当的改写,因此,本文编写KSZ8081的网卡驱动程序就是对模板的填充和适当的改写,编程步骤如下:填充KSZ8081的私有结构体,该结构体为board_info,它在内核的驱动程序中包含了大量的信息。对KSZ8081网卡进行初始化,并将其注册进系统的内核。下面是具体涉及到的相关函数如图4.2:图4.2填充网络设备的打开函数和关闭函数,KSZ8081的驱动程序对应的这三个函数如下图4.3:图4.3补充传输数据的函数和发送超时函数,驱动中KSZ8081对应的这两个函数如图4.4:图4.4填写中断处理函数和接收数据函数,对应的函数如下图4.5:图4.5图4.6是函数模板与KSZ8081具体实例的关系。图4.6KSZ8081驱动设计模块4.2.2初始化网络设备的初始化需要从以下几个方面来考虑。首先检查网络物理设备存在与否,若存在,则进行下一步检测设备硬件资源。并为软件接口做准备,对数据及指针进行赋值并分配net_device。得到设备的name、irq等信息并开始初始化各个值。硬件初始化工作进行的同时对net_device结构体和数据进行赋值,根据硬件检测的结果来填补net_device结构体和数据。KSZ8081设备驱动初始化函数如下图4.7所示:图4.7初始化函数上图代码中的ksz8081_hw_init()函数就是硬件初始化操作的函数。首先还是要检测KSZ8081网络设备是否真实存在。接着检测设备的具体硬件配置。提前向设备申请需要的硬件资源,比如申请I/O端口资源就可以使用request_region()函数来进行。4.2.3网卡驱动的开、关函数打开函数ksz8081_open()的需实现以下过程:能够调用设备的硬件资源,为I/O注册区域并能调用中断等。调用函数netif_start_queue(),使设备处于激活状态。关闭函数ksz8081_close需实现以下过程:调用函数netif_stop_queue(),暂停设备数据包的传递。释出缓存占用的I/O区域并执行中断。Ubuntu内核为我们提供了这两个函数netif_start_queue()和netif_stop_queue()的原型:voidnetif_start_queue(structnet_device*dev);voidnetif_stop_queue(structnet_device*dev);KSZ8081网卡打开和释放函数如下图4.8所示:图4.8打开和释放函数图4.9是打开函数的具体流程图,图4.10是关闭函数的具体流程图。图4.9打开函数流程图图4.10关闭函数流

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论