为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Linux下PCI设备驱动开发方法及应用实例

2018-07-21 10页 doc 40KB 37阅读

用户头像

is_963767

暂无简介

举报
Linux下PCI设备驱动开发方法及应用实例Linux下PCI设备驱动开发方法及应用实例 LinuxPCI 2012-07-19################2012-07-19#####2#0#1#2-07-19######## Me th o d a n d Im p le m e n ta tio n o f PCI De vice Drive r Ba s e d o n Lin u x 空军工程大学高翊宇马林华() GAO YIYU MA LINHUA 摘要是 一 种 日 趋 成 熟 完 善 的 操 作 系 统 越 来 越 多 的 软 硬 件 厂 商 开...
Linux下PCI设备驱动开发方法及应用实例
Linux下PCI设备驱动开发及应用实例 LinuxPCI 2012-07-19################2012-07-19#####2#0#1#2-07-19######## Me th o d a n d Im p le m e n ta tio n o f PCI De vice Drive r Ba s e d o n Lin u x 空军工程大学高翊宇马林华() GAO YIYU MA LINHUA 摘要是 一 种 日 趋 成 熟 完 善 的 操 作 系 统 越 来 越 多 的 软 硬 件 厂 商 开 始 使 用 平 台 来 开 发 自 己 的 产 品 因 而 对 基 于 该:Linux . Linux , 平 台 的 设 备 驱 动 程 序 的 需 求 也 愈 来 愈 多 同 时 总 线 作 为 一 个 具 有 兼 容 性 强 平 台 无 关 性 等 特 点 从 的 计 算 机 总 线 标 准 。 PCI 、。 日 前 得 到 了 广 泛 的 应 用 本 文 通 过 实 例 讨 论 了 如 何 在 下 实 现 设 备 驱 动 程 序 的 开 发 。 Linux PCI 。 关键词操作系统雷达信号采集系统设备驱动总线; ; ; :Linux PCI 中图分类号文献标识码:TP316 :B Abstr act:With the development of Linux, there are more and more companies to develop their productions under Linux operation sys- tem .So there are more and more requirements to develop the devices driver for hardware under Linux OS .With the good properties for example the good compatibility, and the good usability under different operation systems. PCI bus has get abroad application at present. This article discusses how to complete a PCI Device Driver under Linux OS. 技Key wor ds:Linux OS, Radar Signal Collecting System , Device Dr iver , PCI Bus 术 内核的源文件它使用函数 来对驱动 程序 进 行 初始。drive_init 创 引言化自动驱 动 对 应的 设 备 另一 种 方 法是 将 驱 动程 序 编 译成 可 , ; 总线是由 公司发起由 小组审议并推广 PCIIntel , PCI SIG 安装模块动态地加载和卸载模块可安装模块是经过(module), 。 新 实施的总线标准支持一种称为线性突发的数据传输模式。PCI , 编译 但 尚未 连 接 的目 标 代 码文 件 可 以在 系 统 运行 时 动 态地 , 可确保总线不断满载数据总线通过 局部总线到 。PCI CPU PCI 安装到内核中由系统超级用户使用 命令动态加载“”, insmod , 总线的桥接器 形 成一 种 独 特的 中 间 缓冲 器 设 计方 式 将 , CPU 使之成为系统内核的一部分它使用函数 来对驱动 。init_module 系统与外围设备分开使得在开发 设备时不需要考虑 , PCI CPU 程序进行初始化当不使用该设备时可以使用 命令。, rmmod , 的差异也不需要关心 升级换代所带来的问题其优秀, CPU 。“” 命令调用系统调用 这个系统调用随后 检 rmmod delete_module, 表现赢得越来越多的计算机应用开发者的青睐者们在多 , 查模块的使用计数如果为 则调用模块本身的 , 0 cleanup_mod- 种平台和体系结构中采用不同的方法设计出各种 接口卡PCI , 函数从内核中将该驱动程序卸载否则返回出错信息ule , 。 设备驱动程序接口 1.3 编写出各种平台下的接口卡驱动程序实现控制系统高速高精、中的 子系统向内核中 的 其 他部 分 提 供了 一 个 统 Linux I/O 度低功耗下通过 总线对外围 设备的操作、PCI I/O 。 一的标准设备接口这是通过 中 的 数 据结 构 , include/linux/fs.h 设备驱动程序初步原理1 Linux 来完成的该数据结构向 操作系统注册一 file_operations 。Linux 组文件操作这些文件操作定义了设备提供的特定功能诸如 。, 设备文件1.1 应用程序对设备文件进行 等操作时open、close、read、write , Lin- 将所有外部设备看成是一类特殊文件称之为设备 Linux , “内核将通过 结构访问驱动程序提供的函数ux file_operations 。 文件在 操作系统下有两类主要的设备文件一类是字 ”。Linux : 符设备另一类则是块设备字符设备是以字节为单位逐个进 , 。设备驱动程序结构 1.4 行 操作的设备块设备则是利用一块系统内存作为缓冲区I/O 。, 的设备驱动程序大致可以分为如下几个部分驱动程 Linux :当用户进程对设备进行读写请求时驱动程序先查看缓冲区中 , 序的注册与注销设备的打开与释放设备的读写操作设备的 、、、的内容如果缓冲区中的数据能满足用户的要求就返回相应的 , 控制操作设备的中断和轮询处理驱动程序的注册是通过内 、。数据否则就调用相应的请求函数来进行实际的 操作一般 , I/O 。核 函 数 或 者 来 完 成其 注 销 通 register_chrdev()register_blkdev(). 说来卡通常都属于字符设备, PCI 。 过调用 或 来实现设备的 unregister_chrdev()unregister_blkdev()。 设备驱动程序模块 打开与释放读写操作控制 操 作 等通 过 中 对应 、、1.2 file_operations 在 系统中有两种方法来加载和使用设备驱动程序Linux , 。 的函数来实现对于不支持中断的硬件设备读写时需要轮流 。。第一种方法是把驱动程序放在内核源代码相应的目录 “driver”查询设备状态以便决定是否继续进行数据传输如果设备支 。。里 并 修 改 文 件 在 配 置 和 编 译 内 核 的 时 候 把 驱 动 程, Makefile , 持中断则可以按中断方式进行操作 设备支持中断处理.PCI 。 序作为这个内核的一部分这种方式会增加内核的大小改动 。, 2012-07-19################2012-0-19###总#线#2#标0#1准#2体-系07结-构19########2PCI 配置空间可以访问所有的地址空间其中 空中所有的雷达信号采集设备的个数 PCI 。CPU , PCI I/O */ 间和 内存地址空间由设备驱动程序使用而 配置空间PCI , PCI 由 核心中的 初始化代码使用这些代码会为你配置参数 是 设备 驱 动 程序Linux PCI , char *SupportedIDs; /* supportedIDs 支持的设备序列在雷达信号采集设备中指支持的 芯片的, PCI 设 备 比 如 中 断 号 以 及 基 址 并 在 文 件好所 有 PCI , IO , /proc/pci 及 vendorID deviceID */ 以及 这 些 设备 的 一 些 参 数 和 属中 列 出所 有 找 到的 设 备 PCI , 系 统 参 数 struct file_operations dispatch_table; /* dis- 性其中有两个参数非常重要那就是厂商 和设备 这 两, , ID ID, 是设备驱动程序对应用程序提供诸如打开读写patch_table , , I/ 个参数用来唯一地标识一种 设备PCI 。 控制等等操作的入口 0 */ }dev_object ; 下 雷 达 信 号 采 集 系 统 设 备3 Linux 初始化 设备3.1 PCI 驱动的实现在初始化 设备时首先要检查 总线是否被 PCI , PCI Linux 在雷 达 信号 采 集 系统 中 计 算 机 通 过 总 线 来 控 制 设, PCI 内核支持主要是通过内核函数 来实现该函数用 ,pci_ present(), 备因此在 下雷达信号采集系统的设备驱动主要就是 。, Linux , 来 确 定 总 线 是 否 己 经 被 内 核 支 持 然 后 调 用 PCI Linux 。 pci_ 通过对 设备驱动的实现来完成其驱动程序模块与应用程 PCI 。函数用来查找系统中存在的第一个 设备函数 find_device()PCI , 序之间关系如图所示: 如下所示: pci_ find_device( PCI_ANY_ID, PCI_ANY_ID,NULL); 该函数检查设备是否插在总线插槽上如果在的话则保存 , 它所占用的插槽的位置等信息读出配置头中的信息提供给驱 。 动程序使用同时应当将驱动程序向系统进行注册这主要是 。, 。 通过内核函数 来完成其参数中的 register_chrdev()。file_opera- 结构它定义了设备与外界交流的方式方法可将其设置 为 tion ., 技中的 参数通过 应用程 dev_object dispatch_table 。dispatch_table, 序就可对设备文件进行诸如 等操作在 open ,close ,read ,write 。术 初始化设备 时 还 应当 对 设 备进 行 有 效的 内 存 分配 可 通 过函 , , 数 来实现在信号采集系统设备驱动程序中为了减kmalloc()。, 创 新 驱 动 程 序 提 供 了 函 数少 在 内 存 管 理 方 面 作 大 量 的 上 作 , 来 分 配 物 理 连 续 的 内 存 该 函 数Plx_pci_alloc_consistent mem(), 定义如下: void *Plx_ pci_ alloc_consistent mem (PLX_ PHYSI- CAL_MEM *pmemobject) 驱动程序通常使用结构来表示一种设备而每(struct), Linux { 一个具体的结构体变量都代表某一具体设备该变量存放了与 , 参数 是内存对象指针 pmemobject-> order=0;/* pmemobject */ 该设备有关的所有信息好的驱动程序都应该能驱动多个同种。 while (pages >(1 <order))(pmemobject- >order) 设备每个设备之间用次设备号进行区分如果采用结构体数 , 。++; 组来代表所有由该驱动程序驱动的设备那么就可以简单地用 , pmemobject - >pKernelVa =(VOID*)_get_ free_ pages (GFP_ 数组下标代表次设备号为了达到这个目的在雷达采集系统 。, KERNEL,pmemobject-> order); 设备驱动程序中定义了如下所示的数据结构来表示一个设备, : 为 驱 动 程 序 精 确 的 分 配 多 个 页 面 的/* _get_ free_ pages() typedef struct _dev_object 内存 */ 参数 对p_nextevice /* { struct _dev_object *p_nextdevice; 应着下一个设备指针 */ 函数申请占有己分配的内存其它驱/* mem map_ reserve(), 参数 指向设备对应的驱动程序dev_object *p_do; /* p_do 动程序将不能再使用这部分内存。*/ 对象结构如下 , */ mem map_ reserve(virt_ to_ page(virt_ addr)); 参数 表示设备的有关信息dev_extension *p_de; /* p_de , 其类型结构 是根据具体硬件所定义 dev_extension */ } pmemobject - >PciMem.PhysicalAddr = virt_to_bus (pmemob- ject- >pKernelVa }_dev_object; return pMemObject- >pKernelVa; 参数 指向设备对应的驱动程序对象p_do , 通过该参数将} 设备与驱动程序联系起来其结构定义如下, : 打开设备文件3.2 typedef struct dev_object 当应用程序打开设备文件的时候应用程序通常需要对设 , 参数 { struct dev_object *p_deviceobject; /* p_deviceobject 备控制权的进行申请对控制权的控制可以通过简单的信号量, 表示第一个设备对象的指针其对应着 操作系统找到的, Linux 数打开设备时驱动程序必须分配并填写 的数 据 , private_data 断处理。结构在此应将其值设为雷达信号采集系统设备对应的 释放设备。, _de- 3.5 对象viceobject 。 释放设备主要调用 结构中的 方法来 file_operations release 在雷达信号采集系统中驱动程序的最主要任务就是读写, 实现的在雷达信号采集系统驱动中主要要调用 函, , up (&sem) 设备的 端口和 内存端口与 内存统称为 PCI I/O I/O , I/O I/O I/O 调 用 数释放对设 备 的 控制 权 free_irq (fdo- >pde- >pPciDevice ;区域因此雷达信号采集系统设备驱动程序中主要是通过内 。, , 一来释放中断调用 >irq,fdo- >pde); iounmap(pde- >PciBar[1].pVa) 核函 数 和 来 分 别 实 现 获pci_resource_start()check_mem_region() 函 数 对 内存 映 射 进行 释 放 最 后 在 调 用 , , release mem_region 函数 来 实 (pde- >PciBar[i], Physical.u.LowPart,pde-> PciBar[i], size) 同时还设备的 资源首地址以及 内存地址空间得 PCI I/O I/O , 现对 内存区域占用权的释放I/O 。 需要调用内核函数 和 函数request_mem_region()request_region() 卸载设备 3.6 分别来实现对 内存地址空间的占用的申请和对 端口地 I/O I/O 卸载设备模块与初始化设备模块是相对应的实现起来相, 址空间的占用为了确保对 内存资源处理的准确性在该程。I/O , 主要 是 调 用对 比 较 简单 在 雷 达信 号 采 集系 统 驱 动程 序 中 。, 主 要 是 通 过 调 用 内 核 函 数序 中 采 用 了 二 次 映 射 的 方 法 , 函 数 对 模 块 注 册 的 每 一 项 进 行 注 销 并 调 用cleanup_modeule(), 来实现对 内存资源的二次映射ioremap()I/O 。 内 核 函 数 unregister_chrdev (p_driverobject - >MajorID, PLX_ 数据读写与 控制3.3 ioctl 来注销设备驱动程序完成设备驱动程序的开 DRIVER_NAME)。在雷达信号采集系统的设备驱动程序中对设备的读写操 , 发后就可以在模块方式下通过使用命令 将驱动程序 , , insmod 作通过 来完成驱动程序的没有直 接 对 与 函ioctl(), read()write() 编译生成的文件插入到内核里此时使用 创建的 由 .O , mknod 主次设备号确定的设备文件就对应着其相应的硬件设备通数 进 行 处 理 主 要 通 过 内 核 函 数 和 、。 。 copy_from_user () 来实现在用户空间和内核空间之间传递数据的口 copy_to_user()过对该设备的文件操作就可以最终实现设备的功能, 。 技的函数使用方式如下。copy from user(): 术 copy_from_user (&ioBuffer, (IOCTLDATA}) args, sizeof 结束语4 (IOCTLDATA) 创 本文针对具体的雷达信号采集系统设备结合 总线标, PCI 控制命令差不多完全是用一个 语句来实现设switch , ioctl 准通过对驱动程序初始化设备模块打开设备模块数据读写 , 、、备的所有控制都可以通过 来实现的包 括读 写 设 备 ioctl(), , PCI 新 初始化信息的获得设备配置寄存器的读 写 端 口资 源 与控制模块中 断 模 块释 放 模 块卸 载 设 备模 块 等 的开 发 最, PCI , I/O 、、、, 的 内存空间的读写等等对 的配置空间的访问主要是 I/O 。PCI 终在 下实现了雷达信号采集系统设备驱动程序 的开 发 Linux ,通过 内 核函 数 及 pci_read_config_dword()pci_write_config_dword 并通过系统测试证明了其可行性。等来完成对 的 空间的访问则是通过指令 (), PCI I/O inb( ) , inw 本文作者创新点采用 作为 驱动 开 发 系统 有 效 地 :1.Linux , 等来完成对 的存储空间 ( ) , inl( ) , outb( ) , outw ( ) , outl( ), PCI 防止了采用 操作系统而造成的安全隐患问题将雷 Windows 。2.访问则是通过内核函数 等来完成对这些内存 readl( ) , writel( )。达数据的采集设备驱动与 系统相结合成功实现了 Linux , Linux 的操作一方而可以通过把 内存重新映射后作为普通内存进 I/O 下雷达信号采集系统设备驱动的开发。 行操作对 内存映射通过内核函数 实现另一方而 , I/O Iomap()。 参考文献也可以通过总线主 的方式让设备把数据 DMA(Bus Master DMA)钱晨,徐荣华王钦若基于 操作系统的设备驱动程序开 [1],.Linux 通过 传送到系统内存中DMA 。 中断处理3.4 发微计算机信息,林象平,冯献成,梁百川,魏本[J]2004(09), 1. [2] 在雷达信号采集系统驱动程序中中断处理是实现对数据 , 涛 编电子对抗原理北京国防工业出版社. [M]. : . 1981. 信 号 实 时 处 理 最 为 关 键 的 部 分 由 于 设 计 和 硬 件 上 的 改 变 毛德操,胡希明内核源代码情景分析杭州浙 。 。 [3].Linux ()[M].: 江大学出版社,2001. 处理中断的方法近几年来有很大的改变现代硬件不仅 Linux 。 魏永明骆刚姜君译设备驱动程序第二版北 [4], , . LINUX ()[M] . 有很多的中断而且还可以以智能的方式在多个处理器之间分。 京中国电力出版利,年:2002 . 发中断在一个多处理器的系统中对关键代码不能仅仅通过。, 禁 止 中 断 来 保 护 还 必 须 使 用 一 些 锁 机 制 在 下 。 。 Linux , 作者简介高翊宇江苏扬州人男硕士研究生主要研 : (1981- ), , , , 可以同时提供锁和中断控制对于中断仅仅 spin_lock_irqsave()。, 究方向为嵌入式 操作系统马林华陕西汉中人Linux ;(1965- ), , 通过硬件设备写入是不够的还必须在系统中安装一个软件处 。男博士副教授硕士生导师主要研究方向为 操作系统 , , , , Linux 理程序主要是通过内核函数 来实现可以通过如 , request_irq()。实时通信。 下所示的代码来实现中断申清: Biogr aphy:Gao Yi - yu (1981 - ), Yangzhou City, Jiangsu Province , request_irq (pde - >pPciDevice - >irq,OnInterrupt,SA_SHIRQ, Male , Master candidate , Research Orientation: Embedded Linux PCI_DRIVER_NAME,pde) OS;Ma Lin - hua (1965 - ), Hangzhong City, Shaanxi Province, 其中 是 申清 的 中 断号 在 的pde- >pPciDevice- >irq , Linux Male ,Associate Professor ,Master tutor , Research Orientation: 引导阶段设备被赋于了一个唯一的中断号可 通 过读 取 , PCI 。RT communication based on Linux OS 设备寄 存 器 来获 得 这 个指 PCI 61(PCI_INTERRUPT_PIN)。pde 针用于共享的中断信号线驱动程序使用它指向驱动程序自己。 陕西西安马林华空军工程大学工程学院高翊宇) (710038 陕西通讯地址西安空军工程大学工程学院四系 队:(710038 14 ) 收稿日期修稿日期(:2007.2.13)(:2007.3.15) Your requestcould not be processed becauseof a configurationerror: "Could not connect to LDAPserver." For assistance,contact your network support team. file:///C|/Users/Administrator/Desktop/新建文本文档.txt 涵盖各行业最丰富完备的资料文献,最前瞻权威的行业动态,是专业人士的不二选择。 file:///C|/Users/Administrator/Desktop/新建文本文档.txt2012/8/26 12:19:58
/
本文档为【Linux下PCI设备驱动开发方法及应用实例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索