P图高手来一个,做好后微信做任务领红包的群

Linux下基于PCI-E时统卡的驱动程序设计
2015年微型机与应用第24期
作者:刘 凯,胡爱兰
  摘 &要: 简要介绍了操作系统和(PCI-E)总线的特点以及Linux的作用。以时统卡为例,阐述了Linux系统下PCI-E驱动程序开发的流程和技巧,并通过DMA模式测试了驱动程序的可行性。  关键词: 设备驱动;Linux;PCI-Express;PEX8311;DMA0 引言  Linux操作系统凭借其开放的源代码、良好的扩展性以及安全高效等特点,受到越来越多领域开发者的重视,并逐步成为各种计算机终端、服务器工作站及嵌入式平台的主流操作系统。PCI-Express(PCI-E)作为最新一代的总线接口,其点对点的串行设计以及双通道高带宽的传输模式,大大提高了数据的传输速率[1],它的广泛应用将全面取代PCI、AGP等总线。  目前基于Linux平台下的PCI-E总线的应用十分广泛,小到微型嵌入式系统,大到超大型服务器系统,都可以看到二者的完美结合。而驱动程序作为硬件设备与操作系统之间的桥梁,对硬件的工作起着至关重要的作用。本文介绍的是Linux下基于PCI-E时统卡的驱动程序的开发过程。1 PCI-E时统卡  本文中使用的PCI-E时统卡是自主研发的一款硬件设备。该时统卡通过接受B码终端发来的信号,然后经FPGA进行解码,获得时间信息,并以1 pps脉冲为基准产生用户所需要的20 Hz、100 Hz等中断脉冲信号,最后通过PCI-E桥接芯片PEX8311进行数据交互,使得时统卡中的时间信息以及中断信息能够传到计算机终端或服务器中。而要想让安装在计算机终端或者服务器中的时统卡能够正常工作,就需要为其开发配套的驱动程序,主要就是针对PEX8311芯片的驱动。图1所示为时统卡PEX8311芯片的结构简图。数据经由PFGA传到Local Bus,然后通过内部总线再到PCI-E总线,最后传到计算机终端中。2 Linux设备驱动程序  Linux设备驱动程序是一种使计算机软件与硬件设备进行交互的特殊程序。图2所示为Linux设备驱动与操作系统及外设的关系。设备驱动程序位于Linux操作系统的内核空间,它相当于操作系统内核空间与物理层硬件设备之间的接口,它还为用户层提供系统调用的接口函数。用户层的应用程序不能直接访问操作物理层的外部硬件设备,只有通过系统调用才可以访问操作外部硬件设备[2]。因此可以看出设备驱动程序在操作系统中起到了相当大的作用。3 Linux设备驱动开发过程  Linux设备驱动程序的编写可以模块化,主要包括:设备的初始化、驱动模块的加载与卸载、设备的打开与释放、数据读写与操作、中断响应。  3.1 设备的初始化  Linux系统启动后会自动检测计算机终端上所有的PCI-E设备的信息,并记录在pci_dev结构体中,其中包括硬件设备的厂商号、设备号等大部分的硬件信息。PCI-E驱动程序就是根据厂商号和设备号来连接设备并加载驱动的,这就需要在驱动程序中定义该驱动所支持的硬件参数信息。本文中使用的时统卡的PCI-E桥接芯片是PEX8311,其硬件参数信息定义分别为厂商号、设备号、子厂商号、子设备号、类别和类别掩码。初始化代码如下。  static struct pci_device_id PlxPciIdTable()=  {  #if(PLX_CHIP==8311)  {0x10B5,0x8311,PCI_ANY_ID,PCI_ANY_ID,0xx000000},  {0x10B5,0x86E1,PCI_ANY_ID,PCI_ANY_ID,0xx000000},  #endif  };  MODULE_DEVICE_TABLE(pci,PlxPciIdTable);  3.2 驱动模块的加载与卸载  硬件设备驱动的加载,必须要有一个主设备号。设备号的分配有两种方式:静态分配和动态分配。静态分配指的是由开发人员指定一个固定的设备号;动态分配则是由操作系统自动分配设备号。在不能明确某设备号是否被使用的情况下,建议使用动态分配的方式获得设备号,这样就避免了因设备号冲突导致硬件设备不能正常工作的情况出现。分配了设备号就可以注册设备并加载设备驱动了。而当该设备不再使用时,可以将该设备的驱动模块卸载掉,以此来减少系统内核的占用以及其他系统资源的开销。驱动模块加载与卸载的代码如下。  //驱动模块的加载  static int__init plxpci_init(void)  {  ……  /*注册设备,register_chrdev函数的第一个参数为0,表示系统自动分配一个空闲的主设备号*/  card-&MajorID=register_chrdev(0,PLX_DRIVER_NAME,&plxpci_fops);  pci_register_driver(&PlxPciDriver);  ……  }  //驱动模块的卸载  static void__exit plxpci_cleanup(void)  {  unregister_chrdev(major,PLX_DRIVER_NAME);  pci_unregister_driver(&plxpci_driver);  }  3.3 设备的打开与释放  Linux系统内核在驱动模块加载之后就可以打开硬件设备。设备的打开模块主要是获取设备的控制权,允许中断的产生等。而当不再使用该设备时,就需要释放该设备。设备的释放模块的任务与设备的打开模块的任务正好相反,主要是释放对设备的控制权、中断以及之前系统分配的一些资源等。设备打开与释放的代码如下。  //设备的打开  static int plxpci_open(struct inode*inode,struct file*file)  {  ……  /*获取设备的控制权*/  dev-&open_mode|=file-&f_mode&(FMODE_READ|FMODE_WRITE);  /*允许中断产生*/  plxpci_enable_IRQ(dev);  return 0;  }  //设备的释放  static int plxpci_release(struct inode*inode,struct file*file)  {  ……  /*释放对设备的控制权*/  dev-&open_mode&=(~file-&f_mode)&(FMODE_READ|FMODE_WRITE);  free_irq(card-&irq,card);  kfree(card);  return0;  }  3.4 数据读写与操作  本文中驱动程序使用的是DMA(Direct Memory Access)传输模式。DMA传输模式无需计算机或本地控制器的干预,传输效率很高,从而大大降低了控制器的工作量且提高了数据的传输速率及效率[3]。要完成DMA传输模式就需要了解时统卡上主要的PCI-E桥接芯片PEX8311的工作模式。从参考文献[4]中可知,PEX8311芯片中有几个重要的寄存器:(1)LCS_DMAMODE0,地址是80h,该寄存器主要用来设置DMA的模式。(2)LCS_DMADPR0,地址是90h,该寄存器主要用来设置DMA的传输方向。当LCS_DMADPR0[3]=1,表示传输方向从Local Bus到PCI-E,若为0,则方向相反。(3)LCS_DMACSR0,地址是A8h,该寄存器主要用来启动DMA传输。成功设置了DMA的传输模式,就可以从时统卡中读出时间信息。DMA传输的代码如下。  //DMA传输模式  {  ……  /*设置DMA传输方向*/  PlxPci_PlxRegisterWrite(pDevice,0x90,SglPciAddress|(1&&0)|(1&&3));  /*设置DMA模式*/  PlxPci_PlxRegisterWrite(pDevice,0x80,0x);  /*启动DMA传输*/  RegValue=PlxPci_PlxRegisterRead(pDevice,0xA8,NULL);  RegValue|=(1&&0);  PlxPci_PlxRegisterWrite(pDevice,0xA8,RegValue);  RegValue|=(1&&1);  PlxPci_PlxRegisterWrite(pDevice,0xA8,RegValue);  ……  }  3.5 中断响应  中断是Linux系统中非常宝贵的资源,任何驱动程序都需要申请中断并注册中断处理才可以使用中断。可以使用中断的方式来读取硬件设备中的数据。而如果硬件设备不支持中断,则只能采用轮询的方式来读取数据。硬件设备中一般包含好几种不同的中断,例如1 Hz、20 Hz、100 Hz等。因此,当读取中断状态位之后还需要将不同的中断识别区分开来才能使用。另外,为方便用户层的应用软件对中断的使用,使用信号机制来向用户层发送中断信号,通知用户层的应用软件获取中断状态位。中断响应程序如下。  //中断响应  irq_handler_t plxpci_interrupt(int irq,void*dev_id,struct pt_regs*regs)  {  ……  /*读取中断状态位,其中包含多种中断,需要在下一步识别并解析出不同的中断*/  status=inb(PLXPCI_IRQ_REG(dev));  if(status)  {  /*识别20 Hz中断*/  if(status&IRQ_FLAG_20 Hz)  {  ……  }  ……  /*通知调度函数向应用层软件发送中断信号*/  tasklet_schedule(&dev-&tlet);  }  return(IRQ_HANDLED);  }4 驱动程序的测试  4.1 驱动程序的加载  本文中开发及测试平台所使用的操作系统是中标麒麟Linux操作系统,该系统的内核版本是2.6.32。Linux下驱动程序模块的加载通常有动态加载和静态加载两种方式。静态加载就是把编译生成的驱动程序文件plx8311.ko编译到内核中,每次系统启动时自动调用,这种方式比较适合最终版本的驱动程序。动态加载就是通过insmod命令加载驱动程序,通过rmmod命令可以卸载驱动程序,这样随时可以修改驱动程序,对于还在调试阶段的程序比较方便。  4.2 测试过程与结果  测试前首先保证在计算机终端中安装好时统卡,并连接B码终端,然后加载驱动程序,使用lsmod命令查看驱动程序是否已经加载好。图3所示为plx8311驱动加载成功。当驱动程序可以正常加载,并且能够通过测试程序读出时统卡中的时间信息和中断信息,则说明编写的驱动程序是可行的。图4所示为测试结果,前面显示的是从时统卡中读出的当前时间,后面3个数字表示从启动测试程序到当前时刻所获得的1 Hz、20 Hz、100 Hz中断信号的个数。5 结论  Linux系统的开源性加上PCI-E总线在计算机系统中的广泛应用,使得其两者的结合越来越紧密,Linux系统下的PCI-E的驱动开发也得到了广泛的关注。本文结合实际项目开发,通过对PEX8311时统卡的驱动程序编写过程中的各模块的介绍,阐述了整个驱动的开发流程和相关技巧,并通过编写测试程序完成了驱动程序的测试工作,验证了驱动的可用性。  参考文献  [1] BUDRUK R, ANDERSON D, SHANLEY T. PCI Express系统体系结构标准教材[M].田玉敏,王崧,张波,译.北京:电子工业出版社,2005.  [2] 郑强.Linux驱动开发入门与实践[M].北京:清华大学出版社,2010.  [3] 范晶,胡爱兰.基于状态机的PEX8311的DMA实现[J].微型机与应用,):30-33.  [4] PLX. PEX8311 AA data book version 1.0[OL]. [].http:///mydata.
继续阅读>>
热门关键词温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3802)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'linux下pci(lspci、setpci、libpci)',
blogAbstract:'一、lsipci
lspci - 列出所有PCI设备
浏览SYNOPSIS lspci [options]
描述DESCRIPTION
lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具。 为了能使用这个命令所有功能,你需要有 linux 2.1.82 或以上版本,支持 /proc/bus/pci 接口的内核。在旧版本内核中,PCI工具必须使用只有root才能执行的直接硬件访问,而且总是出现竞争状况以及其他问题。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}软件天地;文章编号:1008-0570(2007)04-1;中文核心期刊《微计算机信息》(测控自动化)200;Linux下PCI设备驱动开发方法及应用实例;MethodandImplementationo;(空军工程大学)高翊宇;马林华;GAOYIYUMALINHUA;摘要:Linux是一种日趋成熟完善的操作系统.越;技术创新;Abstract:Withth
文章编号:1008-0570(2007)04-1-0310-03
中文核心期刊《微计算机信息》(测控自动化)2007年第23卷第4-1期
Linux下PCI设备驱动开发方法及应用实例
MethodandImplementationofPCIDeviceDriverBasedonLinux
(空军工程大学)高翊宇
GAOYIYUMALINHUA
摘要:Linux是一种日趋成熟完善的操作系统.越来越多的软硬件厂商开始使用Linux平台来开发自己的产品,因而对基于该平台的设备驱动程序的需求也愈来愈多。同时PCI总线作为一个具有兼容性强、平台无关性等特点从的计算机总线标准。日前得到了广泛的应用。本文通过实例讨论了如何在Linux下实现PCI设备驱动程序的开发。关键词:Linux操作系统;雷达信号采集系统;设备驱动;PCI总线中图分类号:TP316文献标识码:B
Abstract:WiththedevelopmentofLinux,therearemoreandmorecompaniestodeveloptheirproductionsunderLinuxoperationsys-tem.SotherearemoreandmorerequirementstodevelopthedevicesdriverforhardwareunderLinuxOS.Withthegoodpropertiesforexamplethegoodcompatibility,andthegoodusabilityunderdifferentoperationsystems.PCIbushasgetabroadapplicationatpresent.ThisarticlediscusseshowtocompleteaPCIDeviceDriverunderLinuxOS.Keywords:LinuxOS,RadarSignalCollectingSystem,DeviceDriver,PCIBus
内核的源文件。它使用函数drive_init来对驱动程序进行初始化,自动驱动对应的设备;另一种方法是将驱动程序编译成可
PCI总线是由Intel公司发起,由PCISIG小组审议并推广安装模块(module),动态地加载和卸载模块。可安装模块是经过实施的总线标准。PCI支持一种称为线性突发的数据传输模式,编译但尚未连接的目标代码文件,可以在系统运行时动态地可确保总线不断满载数据。PCI总线通过CPU局部总线到PCI“安装”到内核中,由系统超级用户使用insmod命令动态加载,总线的桥接器形成一种独特的中间缓冲器设计方式,将CPU使之成为系统内核的一部分。它使用函数init_module来对驱动系统与外围设备分开,使得在开发PCI设备时不需要考虑CPU程序进行初始化。当不使用该设备时,可以使用rmmod命令,的差异,也不需要关心CPU升级换代所带来的问题。其“优秀”rmmod命令调用系统调用delete_module,这个系统调用随后检表现赢得越来越多的计算机应用开发者的青睐,设计者们在多查模块的使用计数,如果为0则调用模块本身的cleanup_mod-种平台和体系结构中采用不同的方法设计出各种PCI接口卡,ule函数从内核中将该驱动程序卸载,否则返回出错信息。编写出各种平台下的接口卡驱动程序实现控制系统高速、高精1.3设备驱动程序接口度、低功耗下通过PCI总线对外围I/O设备的操作。Linux中的I/O子系统向内核中的其他部分提供了一个统
一的标准设备接口,这是通过include/linux/fs.h中的数据结构
1Linux设备驱动程序初步原理
file_operations来完成的。该数据结构向Linux操作系统注册一
1.1设备文件组文件操作。这些文件操作定义了设备提供的特定功能,诸如
“设备Linux将所有外部设备看成是一类特殊文件,称之为应用程序对设备文件进行open、close、read、write等操作时,Lin-
文件”。在Linux操作系统下有两类主要的设备文件:一类是字ux内核将通过file_operations结构访问驱动程序提供的函数。
符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。一般说来,PCI卡通常都属于字符设备。
1.4设备驱动程序结构
Linux的设备驱动程序大致可以分为如下几个部分:驱动程
序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。驱动程序的注册是通过内核函数register_chrdev()或者register_blkdev()来完成.其注销通过调用unregister_chrdev()或unregister_blkdev()来实现。设备的打开与释放、读写操作、控制操作等通过file_operations中对应的函数来实现。对于不支持中断的硬件设备。读写时需要轮流查询设备状态。以便决定是否继续进行数据传输。如果设备支持中断.则可以按中断方式进行操作PCI设备支持中断处理。
1.2设备驱动程序模块
在Linux系统中,有两种方法来加载和使用设备驱动程序。
相应的目录第一种方法是把驱动程序放在内核源代码“driver”
里,并修改Makefile文件,在配置和编译内核的时候把驱动程
序作为这个内核的一部分。这种方式会增加内核的大小,改动高翊宇:硕士研究生
基金项目:武器装备预研基金项目(编号不公开)
2PCI总线标准体系结构
要开发设备驱动程序。在掌握了驱动程序的基木原理后.必
-360/:现场总线技术应用200例》
您的论文得到两院院士关注
须理解所要开发的设备.在此简要介绍PCI总线标准体系结构。
第一个设备对象*/
device_count;/*device_count表示硬件设代表在系统
中所有的雷达信号采集设备的个数*/
PCI有3种地址空间:PCII/O空间、PCI内存地址空间和PCI配置空间。CPU可以访问所有的地址空间,其中PCII/O空间和PCI内存地址空间由设备驱动程序使用,而PCI配置空间由Linux核心中的PCI初始化代码使用,这些代码会为你配置好所有PCI设备,比如中断号以及IO基址,并在文件/proc/pci中列出所有找到的PCI设备,以及这些设备的一些参数和属性,其中有两个参数非常重要,那就是厂商ID和设备ID,这两个参数用来唯一地标识一种PCI设备。
3Linux下雷达信号采集系统设备
驱动的实现
在雷达信号采集系统中,计算机通过PCI总线来控制设备。因此,在Linux下雷达信号采集系统的设备驱动,主要就是通过对PCI设备驱动的实现来完成。其驱动程序模块与应用程序之间关系如图所示:
char*SupportedIDs;/*参数supportedIDs是设备驱动程序支持的设备序列,在雷达信号采集设备中指支持的PCI芯片的vendorID及deviceID*/
structfile_operationsdispatch_table;/*系统参数dis-patch_table是设备驱动程序对应用程序提供诸如打开,读写,I/0控制等等操作的入口*/
}dev_object;
3.1初始化PCI设备
在初始化PCI设备时,首先要检查PCI总线是否被Linux内核支持,主要是通过内核函数pci_present()来实现,该函数用来确定PCI总线是否己经被Linux内核支持。然后调用pci_find_device()函数用来查找系统中存在的第一个PCI设备,函数如下所示:
pci_find_device(PCI_ANY_ID,PCI_ANY_ID,NULL);
该函数检查设备是否插在总线插槽上,如果在的话则保存
它所占用的插槽的位置等信息。读出配置头中的信息提供给驱这主要是动程序使用。同时,应当将驱动程序向系统进行注册。通过内核函数register_chrdev()来完成。其参数中的file_opera-
tion结构.它定义了设备与外界交流的方式方法,可将其设置为
通过dispatch_table,应用程dev_object中的dispatch_table参数。
序就可对设备文件进行诸如open,close,read,write等操作。在
初始化设备时,还应当对设备进行有效的内存分配,可通过函数kmalloc()来实现。在信号采集系统设备驱动程序中,为了减少在内存管理方面作大量的上作,驱动程序提供了函数
Linux驱动程序通常使用结构(struct)来表示一种设备,而每
一个具体的结构体变量都代表某一具体设备,该变量存放了与该设备有关的所有信息。好的驱动程序都应该能驱动多个同种设备,每个设备之间用次设备号进行区分。如果采用结构体数组来代表所有由该驱动程序驱动的设备,那么就可以简单地用数组下标代表次设备号。为了达到这个目的,在雷达采集系统设备驱动程序中,定义了如下所示的数据结构来表示一个设备:
typedefstruct_dev_object
{struct_dev_object*p_nextdevice;/*参数p_nextevice对应着下一个设备指针*/
dev_object*p_do;/*参数p_do指向设备对应的驱动程序对象,结构如下*/
dev_extension*p_de;/*参数p_de表示设备的有关信息,其类型结构dev_extension是根据具体硬件所定义*/
Plx_pci_alloc_consistentmem()来分配物理连续的内存,该函数定义如下:
void*Plx_pci_alloc_consistentmem(PLX_PHYSI-CAL_MEM*pmemobject)
pmemobject->order=0;/*参数pmemobject是内存对象指针*/while(pages>(1<<pmemobject->order))(pmemobject->order)++;
pmemobject->pKernelVa=(VOID*)_get_free_pages(GFP_KERNEL,pmemobject->order);
/*_get_free_pages()为驱动程序精确的分配多个页面的内存*/
}_dev_object;
参数p_do指向设备对应的驱动程序对象,通过该参数将设备与驱动程序联系起来,其结构定义如下:
typedefstructdev_object
{structdev_object*p_deviceobject;/*参数p_deviceobject表示第一个设备对象的指针,其对应着Linux操作系统找到的
PLC技术应用200例》
/*memmap_reserve()函数申请占有己分配的内存,其它驱动程序将不能再使用这部分内存。*/
memmap_reserve(virt_to_page(virt_addr));}
pmemobject->PciMem.PhysicalAddr=virt_to_bus(pmemob-ject->pKernelVa
returnpMemObject->pKernelVa;}
3.2打开设备文件
当应用程序打开设备文件的时候,应用程序通常需要对设备控制权的进行申请,对控制权的控制可以通过简单的信号量
:360元/年-
中文核心期刊《微计算机信息》(测控自动化)2007年第23卷第4-1期
这是的私有数据区。Onlnterrupt是中断发生时将被调用的函数。中断处理的重点,在中断发生后系统就会调用该函数来实现中断处理。
来实现。在雷达信号采集系统设备驱动程序中,驱动程序使用简单的信号量down()函数来完成该操作。同时,在利用open()函数打开设备时,驱动程序必须分配并填写private_data的数据结构。在此,应将其值设为雷达信号采集系统设备对应的_de-
3.5释放设备
释放设备主要调用file_operations结构中的release方法来
实现的,在雷达信号采集系统驱动中,主要要调用up(&sem)函数释放对设备的控制权;调用free_irq(fdo->pde->pPciDevice一>irq,fdo->pde)来释放中断;调用iounmap(pde->PciBar[1].pVa)函数,对内存映射进行释放,最后在调用releasemem_region(pde->PciBar[i],Physical.u.LowPart,pde->PciBar[i],size)函数来实现对I/O内存区域占用权的释放。
3.6卸载设备
卸载设备模块与初始化设备模块是相对应的,实现起来相对比较简单。在雷达信号采集系统驱动程序中,主要是调用
viceobject对象。
在雷达信号采集系统中,驱动程序的最主要任务就是读写
PCI设备的I/O端口和I/O内存,I/O端口与I/O内存统称为I/O
区域。因此,雷达信号采集系统设备驱动程序中,主要是通过内核函数pci_resource_start()和check_mem_region()来分别实现获得PCI设备的I/O资源首地址以及I/O内存地址空间,同时还需要调用内核函数request_mem_region()和request_region()函数分别来实现对I/O内存地址空间的占用的申请和对I/O端口地址空间的占用。为了确保对I/O内存资源处理的准确性,在该程序中采用了二次映射的方法,主要是通过调用内核函数
ioremap()来实现对I/O内存资源的二次映射。
3.3数据读写与ioctl控制
在雷达信号采集系统的设备驱动程序中,对设备的读写操作通过ioctl()来完成驱动程序的,没有直接对read()与write()函数进行处理。主要通过内核函数copy_from_user()和
cleanup_modeule()函数对模块注册的每一项进行注销,并调用内核函数unregister_chrdev(p_driverobject->MajorID,PLX_DRIVER_NAME)来注销设备驱动程序。完成设备驱动程序的开发后,就可以在模块方式下,通过使用命令insmod将驱动程序编译生成的.O文件插入到内核里,此时使用mknod创建的由
主、次设备号确定的设备文件就对应着其相应的硬件设备。通过对该设备的文件操作,就可以最终实现设备的功能。
copy_to_user()来实现在用户空间和内核空间之间传递数据的口的。copyfromuser()函数使用方式如下:
copy_from_user(&ioBuffer,(IOCTLDATA})args,sizeof(IOCTLDATA)
ioctl控制命令差不多完全是用一个switch语句来实现,设备的所有控制都可以通过ioctl()来实现的,包括读写,PCI设备初始化信息的获得,PCI设备配置寄存器的读写,I/O端口资源的I/O内存空间的读写等等。对PCI的配置空间的访问主要是通过内核函数pci_read_config_dword()及pci_write_config_dword()等来完成,对PCI的I/O空间的访问则是通过指令inb(),inw(),inl(),outb(),outw(),outl()等来完成,对PCI的存储空间访问则是通过内核函数readl(),writel()等来完成。对这些内存的操作一方而可以通过把I/O内存重新映射后作为普通内存进行操作,对I/O内存映射通过内核函数Iomap()实现。另一方而也可以通过总线主DMA(BusMasterDMA)的方式让设备把数据通过DMA传送到系统内存中。
3.4中断处理
在雷达信号采集系统驱动程序中,中断处理是实现对数据信号实时处理最为关键的部分。由于设计和硬件上的改变。
本文针对具体的雷达信号采集系统设备,结合PCI总线标准,通过对驱动程序初始化设备模块、打开设备模块、数据读写与控制模块、中断模块、释放模块、卸载设备模块等的开发,最终在Linux下实现了雷达信号采集系统设备驱动程序的开发,并通过系统测试证明了其可行性。
本文作者创新点:1.采用Linux作为驱动开发系统,有效地防止了采用Windows操作系统而造成的安全隐患问题。2.将雷达数据的采集设备驱动与Linux系统相结合,成功实现了Linux下雷达信号采集系统设备驱动的开发。
Linux处理中断的方法近几年来有很大的改变。现代硬件不仅
有很多的中断。而且还可以以智能的方式在多个处理器之间分发中断。在一个多处理器的系统中,对关键代码不能仅仅通过禁止中断来保护。还必须使用一些锁机制。在Linux下,对于中断,仅仅spin_lock_irqsave()可以同时提供锁和中断控制。
通过硬件设备写入是不够的。还必须在系统中安装一个软件处理程序,主要是通过内核函数request_irq()来实现。可以通过如下所示的代码来实现中断申清:
徐荣华,王钦若.基于Linux操作系统的设备驱动程序开[1]钱晨,
发[J]微计算机信息,2004(09),1.
冯献成,梁百川,魏本涛编.电子对抗原理[M].北京:[2]林象平,
国防工业出版社.1981.
胡希明.Linux内核源代码情景分析(上册)[M].杭州:浙[3]毛德操,
江大学出版社,2001.
[4]魏永明,骆刚,姜君译.LINUX设备驱动程序(第二版)[M].北京:中国电力出版利,2002年.
作者简介:高翊宇(1981-),江苏扬州人,男,硕士研究生,主要研究方向为嵌入式Linux操作系统;马林华(1965-),陕西汉中人,男,博士,副教授,硕士生导师,主要研究方向为Linux操作系统
实时通信。
request_irq(pde->pPciDevice->irq,OnInterrupt,SA_SHIRQ,PCI_DRIVER_NAME,pde)
其中pde->pPciDevice->irq是申清的中断号,在Linux的引导阶段,PCI设备被赋于了一个唯一的中断号。可通过读取PCI设备寄存器61(PCI_INTERRUPT_PIN)来获得。pde这个指
针用于共享的中断信号线。驱动程序使用它指向驱动程序自己
Biography:GaoYi-yu(1981-),YangzhouCity,JiangsuProvince,Male,Mastercandidate,ResearchOrientation:EmbeddedLinuxOS;MaLin-hua(1965-),HangzhongCity,ShaanxiProvince,Male,AssociateProfessor,Mastertutor,ResearchOrientation:RTcommunicationbasedonLinuxOS
(710038陕西西安空军工程大学工程学院)高翊宇马林华
通讯地址:(710038陕西西安空军工程大学工程学院四系14队)
(收稿日期:2007.2.13)(修稿日期:2007.3.15)
-360/:现场总线技术应用200例》
三亿文库包含各类专业文献、中学教育、应用写作文书、幼儿教育、小学教育、外语学习资料、各类资格考试、高等教育、生活休闲娱乐、17Linux下PCI设备驱动开发方法及应用实例等内容。 
 linux设备驱动开发实例_计算机硬件及网络_IT/计算机_专业资料。linux设备驱动开发实例 ?1 基础知识 设备驱动的作用: 任何一个计算机系统的运行都是系统中软硬件协作...  Linux下PCI设备驱动开发详解_调查/报告_表格/模板_...好方法,另一个好方法 就是只导出将会被其它驱动...一个例子来结束今天的东西: #include &linux/module...  Linux 下 PCI 设备驱动程序开发肖文鹏(), 硕士研究生, 北京理工大学计算机系 简介: 简介: PCI 是一种广泛采用的总线标准,它提供了许多优于其它...  书中通过大量的 时序波形和实例对 PCI 局部总线的实际应用进行了深入浅出的阐述...开发工具开发 Windows 2000/XP 下的 WDM 设备驱动程序的 原理及编程方法。本...  PCIE数据采集卡驱动开发_计算机软件及应用_IT/计算机...电子科技大学 注 1:注明《国际十进分类法 UDC》的...关键词:嵌入式系统、Linux 内核、PCI Express、驱动...  的方法,此外,它还能自动为总线提供仲裁.在近几年的发 展过程中,被广泛应用于...Linux下PCI设备驱动开发... 4页 免费 Linux下PCI设备驱动开发... 3页 免费 ...  暂无评价|0人阅读|0次下载|举报文档如何写linux pci设备驱动程序-看_调查/报告...本文档就是想为驱动程序设计开发人员解决 pci 处理中 的各种问题。 Pci 设备...  linux中断与中断处理 5页 免费 linux文件系统 19页 免费 linux驱动结构pci 45页...第六章 PCI 外围设备互连(PCI)是一种将系统中外部设备以结构化与可控制方式连...

我要回帖

更多关于 婚礼红包自己做好吗 的文章

 

随机推荐