




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、136计算机测量与控制第11卷ChoaJournal bkctronic Pujtlislhnig 匕 AIL righrs rcscr'fd. http胃评136计算机测量与控制第11卷文章编号:1671 - 4598 (2003)02 - 0135 - 03中图分类号:TP311 111文献标识码:BChoaJournal bkctronic Pujtlislhnig 匕 AIL righrs rcscr'fd. http胃评136计算机测量与控制第11卷ChoaJournal bkctronic Pujtlislhnig 匕 AIL righrs rcscr'fd
2、. http胃评136计算机测量与控制第11卷Linux系统下USB设备驱动程序的开发蔡震,蒋辉柏,周利华(西安电子科技大学 多媒体研究所,陕西 西安 710071 )摘要:开发Linux下的设备驱动程序是一项比较繁琐的工作。从具体的USB设备驱动的开发流程岀发,描述了Linux系统下USB设备驱动程序的几个主要开发细节和注意点。以能够提供给大家一个开发 Linux下USB设备驱动程序的向导。并在开发密码模块设备的驱动程序中得到了很好的应用。关键词:USB ;设备驱动;Linux同步;中断Programming Guide for Linux USB Device DriversCAI Zhe
3、n , JIAN G Hui2bai, ZHOU Li 2hua(Multimedia Technology Institute , Xidian University , Xi'an 710071 , China)Abstract : Programming for Linux USB device drivers is a complex job. from the material flow of programming USB device drivers , the main details of developing process and important attent
4、ion are given. Hope that this can supply a programming guide for Linux USB device drivers. And this has been very useful for developing cryptogram module device drivers.Key words : USB (the universal serial bus) ; device drivers ; Linux isochronous ; interru ptChoaJournal bkctronic Pujtlislhnig 匕 AI
5、L righrs rcscr'fd. http胃评136计算机测量与控制第11卷ChoaJournal bkctronic Pujtlislhnig 匕 AIL righrs rcscr'fd. http胃评136计算机测量与控制第11卷1概述USB (通用串行总线)是用于将适用USB的外围设备连接到主机的外部总线结构。从1994年开始,4家公司开始制定 USB110标准,到1999年Compaq , Hewlett Packard , I ntel , Luce nt , Microsoft , N EC and Philips这7家厂商联合制定了 USB 210标准的产品规
6、 格。使用USB接口的计算机外围设备已经得到更广 泛的使用和支持。USB设备主要特点是支持热插拔 (hot plug)和 PNP (plug and play),并且还提供全速 12 Mbps的速率和低速 115 Mbps的速率来适应各种 不同类型的外设,USB210标准还支持 480 Mbps的 高速传输速率。相应于USB设备的广泛使用,各种 操作系统下也开始提供USB设备的API函数,以支持USB设备驱动程序的开发。微软公司早在MS Win95 OSR2版本就开始正式支持 USB接口,并逐步 提供一系列在Windows环境和N T环境下的驱动程序 的开发工具和API函数。以使它的操作系统能
7、全面支 持USB接口。而Linux系统下的USB子系统的开发 于1997年才开始。并同时经过了多次的修改和整理,所以要和不断变化的Linux系统的下USB子系统保收稿日期:2002 - 05 - 13。作者简介:蔡震(1976 -),男,江苏省泰兴市人,硕士生,主 要从事计算机网络与多媒体技术方向的研究。周利华(1942 -),男,江苏省苏州市人,博导,主要从事计 算机网络与多媒体技术方向的研究。持同步,还是比较困难的。不过作为自由软件的象 征,Linux率先支持 USB210标准了。并且在一些大 型基于Linux的系统中,使用USB接口来传输重要 信息比使用网络Socket来传输信息安全的多
8、。文章在 现有的Linux系统下的 USB子系统基础上,阐述了 如何开发USB设备的驱动程序。2 Linux USB子系统USB是一种分层的总线结构,并且是由一个主机(host)来控制。主机用主/副协议来和外部USB设备通讯。USB上的通讯主要是两个方向进行的,一个是主机到设备的下行方向,一个是设备到主机的 上行方向,不支持设备间的直接通讯。依靠不同的设备类型,主要有4种的传输方式:控制(control)、 中断(in terrupt )、同步(isochro nous)、数据块 (bulk);如果是从硬件开始来设计整个的系统,还要正确选择传输的方式。而作为一个驱动程序的书写者 就只需要弄清楚
9、他是采用的什么工作方式就行了 。通 常所有的传输方式下的主动权都在host边。在Linux系统中编写主机部分的USB驱动,我们不必了解太多的硬件知识,因为Linux内核模块中提供了一块 USB内核(USB core),它给出专门的 API来支持USB设备和主控制器 。通过定义一系列 数据结构,宏命令和函数对所有的硬件和设备支持部 分进行抽象。USB内核包含了所有 USB设备驱动和主控制器 驱动的共同的 USB程序。这些函数主要集中在上层图1 USB内核API层和底层API。如图1所示,有一个USB设备的驱动 的API和一个主控制器的驱动。因为主控制器驱动 已经完成了,所以下面这段我们主要讨论U
10、SB设备的驱动层。3USB设备驱动框架USB设备驱动在内核模块中需要注册和注销。因此一个驱动必须注册 2个入口点和一个设备节点。对于特别的USB设备(他们不适合在子系统中注册 ) 一个驱动可以注册一对文件操作符和一个次设备号。一般一个驱动可以服务 16个相似的USB设备。几乎 所有的USB设备主设备号都是180。311框架数据结构所有的USB相关的函数和数据结构的名字都是 以USB-开头的。下面给出在子系统中注册一个USB驱动程序的数据结构。struct usb_ driver const char 3 name; /模块的名字void 3 ( 3 probe) (struct usb一 de
11、vice 3 , unsigned int ) ; / / 函数的 进入指针void ( 3 disconnect) (struct usb- device 3 ,void 3 ) ; / / 撤销连接 的函数进入指针struct list - head driver - list ; / /给子系统内部使用%初始化时为 NULLstruct file - operations 3fops ; /文件操作列表指针 int minor ; /次设备号;这里特别要提的就是文件操作的结构(structfile - operations),随着新功能不断加入Linux内核,此文件操作的结构也变得越来越
12、大,这种增长是不会 有副作用的。因为对于特定的设备驱动,我们可以选 择自己需要的函数,不需要的就设为NULL值就可以。下面主要列举一些USB常用的几个文件操作函数:(1) int ( 3 open)(struct inode 3 , struct file3);设备打开操作一般是设备的第一个操作,不过有的设备可以不选择这个函数。那样设备的打开操作 就会永远成功,但系统不会通知你的驱动程序。(2) void ( 3 release (struct inode 3 , struct file3);当节点关闭时调用这个操作。(3) int ( 3 read) (struct in ode 3 , s
13、truct file 3 ,char 3 , int);用来从设备中读取数据。函数返回一个非负值表示成功的读取了多时字节。(4) int ( 3 write) (struct in ode 3 , struct file 3 ,con st char 3 , i nt);向设备发数据。如果返回值非负,它就表示成功写入的字节数。(5) int ( 3 select) (struct inode 3 , struct file 3 ,int , select- table 3) ; select一般用于程序询问设备是 否可读或可写,或是否一个“异常”条件发生了。(6) int ( 3 ioctl)
14、(struct in ode 3 , struct file 3 ,unsigned int , unsigned long); 系统调用 ioctl 提供一 种调用设备相关命令的方法。(7) int ( 3 mmap) (struct inode 3 , struct file 3 , struct vm - area- struct 3 );用来将设备内存映射 到进程内存中。(8) int ( 3 fsync) (struct inode 3 , struct file 3);刷新设备。312框架进入指针USB驱动的框架增加了两个进入指针给普通的 设备驱动。(1) void 3 probe
15、 (struct usb- device 3 dev, un2sig ned i nt in terface);当一个新设备加入总线时,这个进入指针就被调用。然后设备驱动将创建一个新的 设备数据结构实例。参数dev表示设备的上下文,他 包含了所有 USB描述符的地址。参数in terface表示 接口值。如果一个USB驱动想要绑定一个特别的设 备或者接口 ,它必须返回一个指针。这个指针通常指 向设备驱动的上下文结构。(2) void disconnect (struct usb- device 3 dev,void 3 drv - context);这个函数是在设备撤销连接时 调用的。参数de
16、v列出了设备上下文。撤销连接函数 完成后,设备就脱离了 USB的框架。以后USB驱动 就不能再调用它了。313框架函数(1) int usb- register (struct usb- driver 3 drv);这个函数是用来注册一个新的USB设备驱动。指针drv指向结构usb- driver。函数成功返回0。要不然返 回一个错误值。(2) void usb- deregister (struct usb- driver 3 drv);此函数是注销USB设备驱动。(3) void usb- driver - claim - in terface ( structusb- driver 3
17、driver , struct usb- in terface 3 iface , void 3 drv - con text);此函数是在 probe函数执行后, 开始为设备驱动申请更多的接口。Drive指针指向一个完整的已经初始化的usb- driver结构。Iface指向ChoaJournal bkctronic Pujtlislhnig 匕 AIL righrs rcscr'fd. http胃评第2期蔡震:Linux系统下USB设备驱动程序的开发? 137 ?usb-in terface 结构,此结构是usb- con fig - descriptor(可以在usb-devic
18、e结构中看到)的一部分(在probe 函数中赋值)。Drv- con text指针主要指向设备驱动的 上下文结构(看probe函数的返回值)。(4) int usb- in terface - claimed (struct usb- in ter 2 face 3 iface);这个函数是检查是否有其他驱动已经声明了这个接口。如果接口没有被其它驱动申请就返回0。(5) void usb- driver - release- in terface (structusb- driver 3 driver , struct usb- in terface 3 iface);这 个函数主要是来释放先
19、前申请的接口。在disconnect函数中,你不必释放任何在probe函数中申请的接口。4配置USB设备USB内核API除了包括了一套选择或询问的描 述符,还有一些配置和更换的设备函数 。所有这些标 准操作都是通过控制传输给设备的 。411数据结构的描述Linux USB子系统通过扩展或内嵌标准的USB描述符来说明描述符的分级结构。这种结构有助于保 存指向可选配置和接口的指针。只要被API调用,这些结构的元素就会被描述。关于描述符的详细信息可以在USB. H查到。struct usb- devicestruct usb - config 一 descriptor 3 actconfig ;/
20、3 the active con 2 figuration 3 /struct usb- device - descriptor descriptor ;/ 3 Descriptor 3 / struct usb - config - descriptor 3 config ; / 3 所有的参数 3 / usb- device结构是所有 USB专门的描述符的根 节点。在用驱动配置设备或者请求传输的时候 ,就必 须分解描述符。412标准的设备申请为了查询或者设置一个特殊的配置或可选设置,可以用一个整型函数。并用这个函数建立标准的设备 申请(指定设备的控制传输)。(1) int usb- set
21、- configuration (struct usb- device 3 dev , int configuration);此函数是激活特殊的配置。0< = configuration < dev -> descriptor.bNumC on figurati ons.设configuration为0将设备设为无地址状态。这个意思是设备脱离这个设备地址并准备接受一个新 的。一般不要设0。因为你将不能访问设备,直到被物理的重新连接到总线上。(2) int usb- set- in terface (struct usb- device 3 dev, int in terfac
22、e , int alter nate);这个函数激活指定 接口的可选设置。(3) int usb- get - device- descriptor (struct usb- device 3 dev);这个函数取出了设备完整的描述符结 构树。当一个设备连上总线时,这个函数就会自动被 唤醒。或者当一个 USB描述符改变时,此函数被调 用。(4) int usb- get- string (struct usb- device 3 dev , un sig ned short Ian gid , un sig ned char in dex , void3 buf, int size);如果一个
23、设备,配置或者接口描述 符涉及到字符串索引值,这个函数可以用来重新获得 字符描述符。标准的 USB字符串是以 UN ICODE编 码的。如果成功就返回0 ,要不然返回一个错误值。5USB传输这里主要介绍了总线上的所有与数据传输相关的 数据结构、宏变量、函数,而且也解释了怎样建立、提交并且使用传输请求。例如,主机和端口间上行和下行传输管道的申请以及USB 4种传输方式的定义。511传输的数据结构和宏变量Linux USB子系统仅仅用一个称为USB RequestBlock (URB)的数据结构来封装 USB的传输。这个 结构包括了所有的 USB传输类型的变量(因次结构 篇幅较长,所以没有列出,大
24、家可以直接查一下Lin2ux系统下的USB内核)。所有的传输请求都发送给 USB内核,并且请求是否成功是通过一个回调函数 通知驱动程序的。512 URB函数USB内核有4个函数来控制 URB。(1) Purb- t usb- alloc- urb (int iso - packets); 一个URB结构无论什么时候需要,都可以调用这个函数。当设置同步传输时,在URB结构的尾部Isopackets 用来指定iso - frame - desc结构的数量 。如果 成功,返回值就是一个指向URB的结构指针(预设为0),要不然就返回一个 NULL指针。(2) void usb - free - urb
25、 (purb - t purb);此函数只 是释放被usb- alloc- urb占用的内存。(3) Int usb- submit - urb (purb - t purb);这个函数发送一个传输请求给USB内核。Purb是一个先前分配并初始化的 URB结构指针。如果成功就返回0 , 不成功就返回一个适当的错误代码。在同步的端口中,甚至可以为一个端口排列更多的URB。(4) Int usb- unlink - urb (purb - t purb );这个函 数在URB完成前,取消了一个预定的请求 。Purb是 指向先前申请的 URB结构的指针。(下转第141页)end;412数据实时显示模
26、块中图形实时显示的处理在Delphi中,使用了 Form的Canvas (画布)属 性,直接在Canvas (画布)上绘制图形,这样不但 绘图速度较快而且可实现对屏幕上任意像素的直接操 作。41211 显示增益的计算单道波形绘制是通过横、纵坐标来确定绘图点的 位置的。假设在单道波形绘制过程中,屏幕的竖直向下方向为x轴正方向、屏幕的水平向右方向为y轴的正方向。其中横坐标是时间值,纵坐标是经过处理 后的地震数据值。根据显示参数设置模块提供的两种 显示增益模式 (固定增益和 AGC)来计算增益。固定增益模式:通过“折半查找”算法找出一屏 单道显示数据中绝对值最大的数据值Max,计算固定增益值=(单道
27、数据的显示宽度/2) / Max;然后计算单道波形的纵坐标(单道波形的纵坐标=原始地 震数据X固定增益值);最后根据横、纵坐标值在 Canvas (画布)上的适当位置绘制出波形 。AGC模式:根据显示参数设置模块提供的AGCWindow (A GC视窗)的值 value- window 来进行计 算。AGC增益值=参数平均值 Xvalue- window/工(| 地震数据值|)。然后计算单道波形的纵坐标=地震数据值XA GC增益值,最后根据横、纵坐标值在 Can2 vas (画布)上的适当位置绘制出波形。在单道波形绘制过程中,可以控制它的显示模式,即线或变面积模式(正面积用填充色表示 )。对于
28、变面积模式的技术实现如下:所有被绘制点的纵坐 标的值如果大于单道波形的中心线的值,则由该点向中心线做一条垂线段(这之前改变画笔PEN的宽度)。(上接第137页)通过传输值 USB - ASYNC - UNL IN K,函数可以同步 或者异步执行。同时叫这个函数等上 1ms,不必从以 一个中断或者完整的控制来调用。如果执行成功,返回0。同时函数返回立刻异步地调用。如果函数成功 开始,则返回值为 EINPRO GRESS。当调用usb- un2 link - urb时,完整地句柄在函数完成后就会被调用。URB的状态用 ENOEN T标注(同步调用)或者E2 CONNRESET (异步调用)。6结束语文章是在开发了一个特定的密码模块上的USB驱动程序基础上,并总结一些前辈的经验写出来的 。 希望能给大家一些帮助和借鉴。开发驱动程序还有一41212多道波形在竖直(时间轴)方向滚动的实现通过PC键盘上的UP和DOWN键来控制多道波 形的滚动。在“按键识别UP/DWON ”模块中,如果按住U P/ DOWN键不放,则以2的次方来更新被 显示地震数据,使图形滚动速度增快。 41213持鼠标点击获取时间刻度的实现在Delphi的对象 Form的OnMouseDown的事件 中编程,实现获取坐标的功能,其中用到了 Form的 hint属性和坐标属性。核心公式如下:form3. hint : = f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国升国旗实验仪数据监测研究报告
- 2025至2030年中国包塑式不锈钢波纹软管行业发展研究报告
- 在线金融科技研讨会企业制定与实施新质生产力战略研究报告
- 调酒师的知识更新与自我提升试题及答案
- 都市生存日记企业制定与实施新质生产力战略研究报告
- 国家电网考试在线试题及答案解析
- 酒店集体合同范本
- 2025餐馆租赁合同范本格式
- 全年运输合同范本
- 钢构制造合同范本
- 湖北省十一校2024-2025学年高三第二次联考数学试卷(解析版)
- 《手工制作》课件-幼儿园挂饰
- 人武专干考试题型及答案
- 2025届高三化学二轮复习 化学反应原理综合 课件
- 2025年北京五湖四海人力资源有限公司招聘笔试参考题库含答案解析
- 常见的酸和碱第2课时酸的化学性质 2024-2025学年九年级化学人教版(2024)下册
- 欢乐购物街-认识人民币(说课稿)-2024-2025学年人教版数学一年级下册
- 2025年中国南方航空股份有限公司招聘笔试参考题库含答案解析
- 疫苗与接种管理制度
- 电子商务案例分析知到智慧树章节测试课后答案2024年秋西安邮电大学
- 《通信用开关电源的元器件降额准则-》
评论
0/150
提交评论