Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15530572
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2009-09-03 21:44:16

参考:  Linux是非常优秀开源操作系统有着十分广泛应用基于该操作系统设备驱动需求越来越多PCI作为种广泛采用总线标准在嵌入式系统中正被大量使用而Linux内核也能很好地支持PCI设备为此本文介绍了Linux下无配置信息PCI设备驱动设计开发方法

  1 PCI总线及无配置信息PCI设备

  1.1 PCI总线

  PCI是外围设备互连(Peripheral ComponentInterconnect)简称种通用总线接口标准原先是应用于计算机系统PCI提供了组完整总线接口规范其目是描述如何将计算机系统中外围设备以种结构化和可控化方式连接在该规范同时详细定义了计算机系统中各个不同部件之间应该如何正确地进行交互计算机系统中总线子系统与存储子系统被PCI总线分开CPU通过块称为PCI桥设备来完成同总线子系统交互图1所示是个PCI子系统体系结构



  尽管目前PCI设备大多采用32位数据总线但PCI规范中已经给出了64位扩展实现方案从而使PCI总线能够更好地实现平台无关性虽然PCI总线是由Intel公司提出但它不局限于Intel系列处理器当今流行其它处理器系列如Alpha、PowerPC、APARC以及多处理器结构代处理器都可以使用PCI总线具体而言PCI总线包含特点可简要描述为高性能、线性突发传输、极小存取延误、采用总线主控和同步操作、独立于处理器、兼容性强、预留了发展空间、低成本、高效益、软件透明等等

  1.2 PCI设备配置空间

  标准PCI设备上有三种地址空间:I/O空间、存储空间及配置空间CPU可以访问PCI设备上所有地址空间其中I/O空间和存储空间提供给设备驱动使用主要用来实现PCI设备和Linux内核中设备驱动之间通讯而配置空间则装载着PCI设备配置信息主要由Linux内核中PCI化代码使用PCI设备配置信息空间如图2所示


  标准PCI设备配置信息空间大小为256个字节其中低64个字节称为头标区这部分区域格式是固定内容包括PCI设备号、厂商识别号、命令寄存器、状态寄存器、基址寄存器等重要信息;其余192个字节称为设备有关区不同设备可以对这部分寄存器进行不同定义

  1.3 无配置信息PCI设备

  目前嵌入式系统往往会要求CPU和专用数据运算器之间以很高速率通信由于现行总线规范中PCI高性能是最为突出因此PCI总线连接方式被大量采用数据运算器往往是针对某系统设计通常会采用FPGA设计即在FPGA中添加进PCI接口设计也就是把FPGA设计成为块PCI设备但是由于嵌入式系统局限性在某些FPGAPCI接口设计中不能划分配置信息空间(I/O空间和存储空间是设备与CPU信息交互基础是必须存在)因此这个设计也就是块无配置信息PCI设备

  2 Linux设备驱动

  Linux设备驱动大致可以分为驱动注册与注销、设备打开与释放、设备读写操作、设备控制操作、设备中断和轮询处理几个部分

  2.1 设备注册与注销

  向系统增加个驱动就要赋予它个主设备号赋值过程应该在驱动化中完成它通过register_chrdev或reg-iste_blkdev 向内核注册接下来就是给个设备驱动这个名字必须插入到/dev目录中并与驱动主设备号和次设备号相连获得主设备号方法是选择个当前不用设备号或者在register_chrdev时让参数ma-jor为0这样其返回值便是设备主设备号另外在关闭设备或块设备时还需要通过unregisler_chrdev或unregister_blkdev从内核中注销设备并释放主设备号

  2.2 设备打开与释放

  打开设备可由open完成在大部分驱动open主要用于检查设备相关(如设备尚未准备好等)、识别次设备号(如有必要更新当前read/write位置f_ops指针)以及分配和填写要放在file->private_data里数据结构

  释放设备由release完成release作用与open相反主要是释放file->private_data中open分配内存并在最后次关闭操作时关闭设备

  2.3 设备读写操作

  设备使用各自read和write 来对设备进行数据读写块设备则使用通用block_read和block_write来对设备进行数据读写这两个通用可以向请求表中增加读写请求这样内核就可以优化请求顺序由于是对内存缓冲区而不是对设备进行操作因而能加快读写请求如果内存缓冲区内没有要读入数据或者需要将写请求写入设备那么就需要真正地执行数据传输

  2.4 设备控制操作和中断处理

  除了读写操作外有时还需要控制设备这在操作时可以通过设备驱动ioctl来完成另外对于不支持中断设备读写时需要轮流查询设备状态以决定是否继续进行数据传输如果设备支持中断则可按中断方式进行

  3 无配置信息PCI设备驱动设计

  无配置信息PCI设备驱动设计关键在于其余部分与标准PCI设备驱动差别不大方法有两种:是选用外接EEPROM来存储该设备配置信息;二是直接在驱动探测模块里注册设备

  用外接EEPROM配置方式时内核启动后会检测EEPROM然后读出其中配置信息并将设备信息注册到pci dev里

  在实际系统应用中如果无法外接EEP-ROM就必须直接在驱动探测模块里注册设备在这种方式下若系统中没有其它即插即用PCI设备则可能会导致检测设备失败但事实上已经注册了该PCI设备因此完全可以正常运行

  笔者开发嵌入式TDMA卫星通信系统中CPU采用MPC8250芯片基带信号处理模块采用Xilinx公司X3SC4000(FG676)MPC8250是Mo-torola公司开发款PowerPC系列嵌入式处理器该处理器中有32位超标量体系结构Power-PC603e处理器内核并集成有PCI桥、PCI仲裁器、存储器控制器等部件FPGA设计中则包括PCI接口、sdram控制器及编码调制运算模块

  此操作系统采用Linux内核版本为2.6由于Linux能很好地支持PCI总线本设计在CPU和FPGA之间采用了PCI总线连接方式由于FPGA设计要求PCI总线中断信号未被使用而是另行设定了两条中断信号线通往MPC8250通用设计口该系统支持FPGA中bin文件实时更新因此没有采用配置EPROM来配置FPGA而是把要下载到FPGA里bin文件同Uboot、Linux内核及jffs2文件系统起放在了FLASH里然后通过MPC8250提供SPI总线下载到FPGA中实际上如需要更新FPGA.bin文件则可通过以太网口将文件拷入FLASH中再下载

  在系统上电启动后由于Linux内核先于jffs2解压而FPGA文件又必须在jffs2解压完后才能释放到内核空间然后再借助SPI总线下载到FP-GA中因此无法在FPGA中创建PCI设备配置信息空间所以本设计采用在检测PCI设备时直接注册方法

  3.1 驱动总体框架

  下面是笔者驱动整体框架从中可以很明显地看出几个模块是如何联系起来



  3.2 具体模块实现

  由于本系统没有采用标准PCI总线提供中断信号因此驱动中无中断处理模块下面着重介绍对本设计比较重要化设备过程以及打开设备模块、读写模块设计方法

  (1) 化设备过程

  化设备过程也是本系统PCI设备驱动中最为关键部分由于本系统中允许PCI总线挂接其它即插即用设备因此这部分还需要保留其部分代码及注释如下:


  在2.4之前内核版本中需要手动pci_find_device来查找PCI设备但在2.4版本后则可以probe探测来完成对硬件检测及信息获取工作其部分代码如下:


  在获取PCI信息子pci_rewin_pci_re-sources_claim和注册设备子pci_rewin_de-vice_register笔者自己创建PCI设备信息可以写人到pci_dev然后由Liunx内核通过pci_register_drivet 将此PCI设备信息创建在PCI设备列表中

  (2) 打开设备模块

  打开设备模块主要用来检查设备号、开辟PCI总线映射空间打开设备模块部分代码及注释如下:


  (3) 读写模块

  读操作就是先通过memcpy_fromio将PCI上传来数据搬移到内核空间中接收缓冲区再用copy_to_user搬移到用户数据空间接收缓冲区和接收数据散列表都要在化模块中进行处理读操作部分代码及注释如下:


  写操作与读操作正好相反它先通过copy_from_user将用户空间数据搬移到内核空间中发送缓冲区再通过memcpy搬移到PCI总线上由于发送数据长度是可变所以每次发送都需要构造不同发送散列表(发送缓冲区可以再化时分配)写操作代码与读操作类似故此省略

  值得注意在PCI设备用I/O方式读写时候CPU将被迫停止工作以等待PCI设备完成此操作且每次只允许个设备访问这个策略不利于提升系统性能但利用MPC8250芯片提供DMA(直接内存访问)机制则可大大提高PCI总线性能这也是笔者下步需要改进地方

  4 结束语

  本文讨论了Linux2.6版本下开发设备驱动原理和相关知识着重介绍了无配置信息PCI设备驱动开发方法该驱动开发方法可成功应用于嵌入式TDMA卫星通信系统测试证明:本系统可稳定有效工作今后工作将着重是提升系统性能并进行改进.
阅读(1609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~