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

毕业设计(论文)-基于Linux系统下USB鼠标驱动开发

2017-09-01 50页 doc 716KB 22阅读

用户头像

is_833902

暂无简介

举报
毕业设计(论文)-基于Linux系统下USB鼠标驱动开发毕业设计(论文)-基于Linux系统下USB鼠标驱动开发 () 题 目 基于Linux系统下USB鼠标驱动开发 英文题目 Using Linux system to Write Device Drivers of USB mouse 学生姓名 学 号 指导教师 职称 讲 师 专 业 信 息 工 程 二零一一年五月 东华理工大学长江学院毕业设计 目录 目 录 摘 要 ----------------------------------------------------------------------...
毕业设计(论文)-基于Linux系统下USB鼠标驱动开发
毕业设计(论文)-基于Linux系统下USB鼠标驱动开发 () 题 目 基于Linux系统下USB鼠标驱动开发 英文题目 Using Linux system to Write Device Drivers of USB mouse 学生姓名 学 号 指导教师 职称 讲 师 专 业 信 息 工 程 二零一一年五月 东华理工大学长江学院毕业设计 目录 目 录 摘 要 ----------------------------------------------------------------------------------------------------------------------- I ABSTRACT --------------------------------------------------------------------------------------------------------------- II 第一章 绪 论 ------------------------------------------------------------------------------------------------------------ 1 1.1 课题研究的背景和意义 ------------------------------------------------------------------------------------------ 1 1.1.1 课题研究的背景 ---------------------------------------------------------------------------------------------- 1 1.1.2 课题研究的意义 ---------------------------------------------------------------------------------------------- 1 1.3 课题研究的内容 --------------------------------------------------------------------------------------------------- 1 第二章 USB简介 ---------------------------------------------------------------------------------------------------- 2 2.1 USB的沿革 --------------------------------------------------------------------------------------------------------- 2 2.2 USB的优点 --------------------------------------------------------------------------------------------------------- 2 2.3 USB的应用及发展趋势 ------------------------------------------------------------------------------------------ 3 2.3.1 USB的扩展应用 --------------------------------------------------------------------------------------------- 3 2.3.2 USB的发展趋势 --------------------------------------------------------------------------------------------- 4 2.4 USB接口类型 ------------------------------------------------------------------------------------------------------ 4 2.5 USB2.0规范--------------------------------------------------------------------------------------------------------- 5 2.6 USB 3.0 简介 ------------------------------------------------------------------------------------------------------- 5 第三章 USB系统架构与 ------------------------------------------------------------------------------------- 7 3.1 USB系统拓扑结构 ------------------------------------------------------------------------------------------------ 7 3.2 USB设备逻辑结构 ------------------------------------------------------------------------------------------------ 8 3.3 USB描述符 --------------------------------------------------------------------------------------------------------- 9 3.3 USB数据传输方式 ------------------------------------------------------------------------------------------------ 9 3.3 USB数据流模型 ------------------------------------------------------------------------------------------------- 10 3.3.1 控制传输 --------------------------------------------------------------------------------------------------- 10 3.3.2 中断传输 ---------------------------------------------------------------------------------------------------- 11 3.3.3 批量传输 ---------------------------------------------------------------------------------------------------- 11 3.3.4 同步传输 --------------------------------------------------------------------------------------------------- 12 第四章 LINUX系统内核及内核模块 ------------------------------------------------------------------------- 13 4.1 LINUX体系结构 -------------------------------------------------------------------------------------------------- 13 4.2 LINUX内核架构 -------------------------------------------------------------------------------------------------- 13 4.3 LINUX内核目录结构--------------------------------------------------------------------------------------------- 14 4.4 LINUX内核模块开发--------------------------------------------------------------------------------------------- 15 4.4.1 makefile ---------------------------------------------------------------------------------------------------- 15 4.4.2 安装和卸载内核模块 ------------------------------------------------------------------------------------ 17 4.5 LINUX内核配置与安装------------------------------------------------------------------------------------------ 18 3 第五章 LINUX USB系统与功能测试 ------------------------------------------------------------------------- 23 5.1 USB协议软件层次 ---------------------------------------------------------------------------------------------- 23 5.2 LINUX USB架构 -------------------------------------------------------------------------------------------------- 24 5.3 MASSSTORSGE ----------------------------------------------------------------------------------------------------- 24 5.4 USB-HID ----------------------------------------------------------------------------------------------------------- 28 第六章 LINUX USB鼠标驱动程序设计 ---------------------------------------------------------------------- 31 6.1 USB鼠标驱动程序分析 ---------------------------------------------------------------------------------------- 31 6.2 URB ----------------------------------------------------------------------------------------------------------------- 33 6.3 搭建开发平台 ---------------------------------------------------------------------------------------------------- 33 6.3.1 安装编辑工具 --------------------------------------------------------------------------------------------- 33 6.3.2 安装和配置编译器 --------------------------------------------------------------------------------------- 33 6.3.3 安装其他工具 --------------------------------------------------------------------------------------------- 34 6.3.4 平台硬件构成 --------------------------------------------------------------------------------------------- 34 6.3.5 平台软件构成 --------------------------------------------------------------------------------------------- 36 6.4 USB鼠标驱动程序详细设计 ---------------------------------------------------------------------------------- 36 总 结 --------------------------------------------------------------------------------------------------------------------- 41 致 谢 --------------------------------------------------------------------------------------------------------------------- 42 参考文献 ------------------------------------------------------------------------------------------------------------------ 43 3 东华理工大学长江学院毕业设计 摘要 摘 要 随着计算机硬件飞速发展,外围设备日益增多,键盘、鼠标、调制解调器、打印机、扫描仪早已为人所共知,数码相机、MP3随身听接踵而至,这么多的设备,如何接入个人计算机,USB就是基于这个目的产生的。USB是一个使计算机周边设备连接化、单一化的接口,其规格是由Intel(英特尔)、NEC、Compaq、DEC、IBM(商业机器公司)、Microsoft(微软)、Northern Telecom联系制定的。USB具有传输速度快,使用方便,支持热插拔,连接灵活,独立供电等优点,几乎应用于所有的外部设备,成为当今个人电脑和大量智能设备的必配的接口之一。 本设计主要以Linux USB为中心,研究USB系统架构与其协议分析、Linux系统内核及内核模块配置和编译、Linux USB系统与功能测试和Linux USB鼠标驱动程序设计。主要知识涉及USB系统架构,USB描述符,USB数据描述方式,USB枚举,Linux内核简介,Linux内核及内核模块配置预编译,Linux系统架构,MassStorage与USB-HID,USB URB等相关内容。 关键词:驱动程序;USB;Linux;嵌入式。 I 东华理工大学长江学院毕业设计 ABSTRACT ABSTRACT With the rapid development of computer hardware and peripherals increasing, keyboard, mouse, modem, printer, scanner is already known, digital camera, MP3 player, so many of the ensuing equipment, how to access personal computer? USB is based on the objective of generation. USB is a computer peripheral devices connected standardization, simplification, its specification is made interface Intel (Intel), NEC, Compaq, DEC, IBM (business machine company), Microsoft (Microsoft), Northern Telecom contact work. USB with transmitting speed, easy to use, support hot swaps, connect flexible, independent power supply etc, almost applied to all external devices, now became a personal computer and intelligent devices with one of the interface of will. This design mainly Linux USB as the center, the research system architecture and USB protocol analysis, Linux kernel and kernel module configuration and compilation, Linux USB system and function testing and Linux USB mouse driver design. Main knowledge system architecture involving USB, USB descriptors, USB, USB enumeration data description way, Linux kernel introduction, Linux kernel and kernel module configuration pre-compiled MassStorage system architecture, Linux, and USB - HID, USB URB and other related content. Key words: Device Drivers;USB;Linux; Embedded. II 东华理工大学长江学院毕业设计 第一章 绪论 第一章 绪 论 1.1 课题研究的背景和意义 1.1.1 课题研究的背景 随着计算机硬件飞速发展,外围设备日益增多,键盘、鼠标、调制解调器、打印机、扫描仪早已为人所共知,数码相机、MP3随身听接踵而至,这么多的设备,如何接入个人计算机,USB就是基于这个目的产生的。USB是一个使计算机周边设备连接标准化、单一化的接口,其规格是由Intel(英特尔)、NEC、Compaq、DEC、IBM(商业机器公司)、Microsoft(微软)、Northern Telecom联系制定的。USB具有传输速度快,使用方便,支持热插拔,连接灵活,独立供电等优点,几乎应用于所有的外部设备,成为当今个人电脑和大量智能设备的必配的接口之一。 1.1.2 课题研究的意义 USB凭借自身的优势,USB设备也开始广泛的应用于嵌入式设备中。本论文就是基于嵌入式系统来编写USB设备驱动,以加强对USB接口和设备的认识,同时也通过本毕业设计将四年来所学的专业知识和其他方面的知识融入到实际应用中。 1.3 课题研究的内容 本设计主要以Linux USB为中心,研究USB系统架构与其协议分析、Linux系统内核及内核模块配置和编译、Linux USB系统与功能测试和Linux USB鼠标驱动程序设计。主要知识涉及USB系统架构,USB描述符,USB数据描述方式,USB枚举,Linux内核简介,Linux内核及内核模块配置预编译,Linux系统架构,MassStorage与USB-HID,USB URB等相关内容。 1 东华理工大学长江学院毕业设计 第二章 USB简介 第二章 USB简介 2.1 USB的沿革 USB是英文Universal Serial Bus的缩写,中文含义是“通用串行总线”。它是一种应用在计算机领域的新型接口技术。早在1995年,就已经有个人电脑带有USB接口了,但由于缺乏软件及硬件设备的支持,这些个人电脑的USB接口都闲置未用。1998年后,随着微软在Windows 98中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB接口才逐步走进了实用阶段。 这几年,随着大量支持USB的个人电脑的普及,USB逐步成为个人电脑的标准接口已经是大势所趋。在主机端,最新推出的个人电脑几乎100%支持USB;而在外设端,使用USB接口的设备也与日俱增,例如数码相机、扫描仪、游戏杆、磁带和软驱、图像设备、打印机、键盘、鼠标等等。目前主板中主要是采用USB1.1和USB2.0,各USB版本间能很好的兼容。USB用一个4针(USB3.0标准为9针)插头作为标准插头,最多可以连接127个外部设备,并且不会损失带宽。USB需要主机硬件、操作系统和外设三个方面的支持才能工作。目前的主板一般都采用支持USB功能的控制芯片组,主板上也安装有USB接口插座,而且除了背板的插座之外,主板上还预留有USB插针,可以通过连线接到机箱前面作为前置USB接口以方便使用。而且USB接口还可以通过专门的USB连机线实现双机互连,并可以通过Hub扩展出更多的接口。USB具有传输速度快(USB1.1是12Mbps,USB2.0是480Mbps, USB3.0是5 Gbps),使用方便,支持热插拔,连接灵活,独立供电等优点,可以连接鼠标、键盘、打印机、扫描仪、摄像头、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光软驱、USB网卡、ADSL Modem、Cable Modem等外部设备。 USB各版本区别版本最大传输速率速率称号最大输出电流协议推出时间: USB1.0:1.5Mbps(192KB/s)低速(Low-Speed)500mA„„1996年1月; USB1.1:12Mbps(1.5MB/s)全速(Full-Speed)500mA„„1998年9月; USB2.0:480Mbps(60MB/s)高速(High-Speed)500mA„„2000年4月; USB3.0:5Gbps(640MB/s)超速(Super-Speed)900mA„„2008年11月。 2.2 USB的优点 USB设备之所以会被大量应用,主要具有以下优点: 1、可以热插拔。这就让用户在使用外接设备时,不需要重复“关机将并口或串 2 东华理工大学长江学院毕业设计 第二章 USB简介 口电缆接上再开机”这样的动作,而是直接在电脑工作时,就可以将USB电缆插上使用。 2、携带方便。USB设备大多以“小、轻、薄”见长,对用户来说,同样20G的硬盘,USB硬盘比IDE硬盘要轻一半的重量,在想要随身携带大量数据时,当然USB硬盘会是首要之选了。 3、标准统一。大家常见的是IDE接口的硬盘,串口的鼠标键盘,并口的打印机扫描仪,可是有了USB之后,这些应用外设统统可以用同样的标准与个人电脑连接,这时就有了USB硬盘、USB鼠标、USB打印机等等。 4、可以连接多个设备。USB在个人电脑上往往具有多个接口,可以同时连接几个设备,如果接上一个有四个端口的USB HUB时,就可以再连上。 2.3 USB的应用及发展趋势 USB1.1标准接口传输速率为12Mbps,但是一个USB设备最多只可以得到6Mbps的传输频宽。因此若要外接光驱,至多能接六倍速光驱,无法再高。而若要即时播放MPEG-1的VCD影片,至少要1.5Mbps的传输频宽,这点USB办得到,但是要完成数据量大四倍的MPEG-2的DVD影片播放,USB可能就很吃力了,若再加上AC-3音频数据,USB设备就很难实现即时播放了。 用户的需求,是促进科技发展的动力,厂商也同样认识到了这个瓶颈。这时, COMPAQ、Hewlett Packard、Intel、Lucent、Microsoft、NEC和PHILIPS这7家厂商联合制定了USB 2.0接口标准。USB 2.0将设备之间的数据传输速度增加到了480Mbps,比USB 1.1标准快40倍左右,速度的提高对于用户的最大好处就是意味着用户可以使用到更高效的外部设备,而且具有多种速度的周边设备都可以被连接到USB 2.0的线路上,而且无需担心数据传输时发生瓶颈效应。 另外,USB2.0兼容USB1.1,也就是说USB1.1设备可以和USB2.0设备通用,但是这时USB2.0设备只能工作在全速状态下(12Mbit/s)。USB2.0有高速、全速和低速三种工作速度,高速是480Mbit/s,全速是12Mbit/s,低速是1.5Mbit/s。其中全速和低速是为兼容USB1.1和USB1.0而设计。 2.3.1 USB的扩展应用 2.3.1.1前置USB接口 前置USB接口是位于机箱前面板上的USB扩展接口。目前,使用USB接口的各种外部设备越来越多,例如移动硬盘、闪存盘、数码相机等等。前置USB接口在这方面就给用户提供了很好的易用性。 前置USB接口要使用机箱所附带的USB连接线连接到主板上所相应的前置USB插针(一般是8针、9针或10针,两个USB成对,其中每个USB使用4针传输信号 3 东华理工大学长江学院毕业设计 第二章 USB简介 和供电)上才能使用。 2.3.1.2 USB口硬盘盒 目前的主流,其最大优点是使用方便,支持热插拔和即插即用。USB有两种标准:一种是USB1.1接口,其传输速度只有12Mbps,一种是USB2.0接口,其传输速度高达480Mbps。目前的主板上的USB都支持USB1.1,但USB 2.0只有较新的主板才能支持,购买时根据个人情况选择产品,虽然USB2.0向下兼容USB1.1,但支持USB2.0接口的移动硬盘盒比USB1.1的要贵一些。 2.3.2 USB的发展趋势 USB开发者论坛的主席兼英特尔公司的技术策略官Jeff Ravencraft示,无线USB技术将帮助用户在使用个人电脑连接打印机、数码相机、音乐播放器和外置磁盘驱动器等设备时,从纷繁复杂的电缆连线中解放出来。无线USB标准的数据传输速率与目前的有线USB 2.0标准是一样的,均为每秒480M,两者的区别在于无线USB要求在个人电脑或外设中装备无线收发装置以代替电缆连线。 无线USB采用超宽带技术进行通信。目前无线局域网的802.11g协议采用位于2.4GHz附近的一小段频带进行通信,而超宽带技术则采用从3.1GHz到10.6GHz的频带进行通信。超宽带的信号水平足够低,因此对于其他无线通信技术来说,超宽带信号的影响类似于噪声。 2.4 USB接口类型 图1 USB接口类型 Mini型(公口)、Mini型(母口)、Mini型USB B型、USB A型(母口)、USB A型(公口) 标准 USB 接口标准 USB 连接器触点 触点 功能(主机) 功能(设备) 1 VBUS (4.75,5.25 V) VBUS (4.4,5.25 V) 2 D- D- 3 D+ D+ 4 接地 接地 4 东华理工大学长江学院毕业设计 第二章 USB简介 USB 信号使用分别标记为 D+ 和 D- 的双绞线传输,它们各自使用 半双工的差分信号 并协同工作,以抵消长导线的电磁干扰。 2.5 USB2.0规范 USB2.0技术规范是有由Compaq、Hewlett Packard、Intel、Lucent、Microsoft、NEC、Philips共同制定、发布的,规范把外设数据传输速度提高到了480Mbps,是USB 1.1设备的40倍~但按照原定新的USB 2.0标准只是准备把这个标准定在240Mbps,后来,经过努力将它提高到了480Mbps。 由于当时制订的标准有了变化,USB规范就产生了三种速度选择:480Mbps、12Mbps、1.5Mbps。 而2003年6月份,当USB2.0标准开始逐渐深入人心之后,USB协会重新命名了USB的规格和标准。 重新命名了USB标准将原先的USB 1.1改成了USB 2.0 Full Speed(全速版),同时将原有的USB 2.0改成了USB 2.0 High-Speed(高速版),并同时公布了新的标识。 USB 2.0 支持的操作系统:Microsoft Windows 7 、Microsoft Windows Server 2008、 Microsoft Windows vista、Microsoft Windows Server 2003 、Microsoft WindowsXP(所有版本) 、Microsoft Windows 2000、 Microsoft Windows 98SE 、Microsoft Windows Me 。 2.6 USB 3.0 简介 英特尔公司(Intel)和业界领先的公司一起携手组建了USB 3.0推广组,旨在开发速度超过当今10倍的超高效USB互联技术。该技术是由英特尔,以及惠普(HP)、NEC、NXP半导体以及德州仪器(Texas Instruments)等公司共同开发的,应用领域包括个人计算机、消费及移动类产品的快速同步即时传输。随着数字媒体的日益普及以及传输文件的不断增大——甚至超过25GB,快速同步即时传输已经成为必要的性能需求。 USB 3.0 具有后向兼容标准,并兼具传统USB技术的易用性和即插即用功能。该技术的目标是推出比目前连接水平快10倍以上的产品,采用与有线USB相同的架构。除对USB 3.0规格进行优化以实现更低的能耗和更高的协议效率之外,USB 3.0 的端口和线缆能够实现向后兼容,以及支持未来的光纤传输。 USB 2.0基于半双工二线制总线,只能提供单向数据流传输,而USB 3.0采用了对偶单纯形四线制差分信号线,故而支持双向并发数据流传输,这也是新规范速度猛 5 东华理工大学长江学院毕业设计 第二章 USB简介 增的关键原因。 除此之外,USB 3.0还引入了新的电源管理机制,支持待机、休眠和暂停等状态。 USB 3.0在实际设备应用中将被称为“USB SuperSpeed”,顺应此前的USB 1.1 FullSpeed和USB 2.0 HighSpeed。 图2 USB 3.0标识图 6 东华理工大学长江学院毕业设计 第三章 USB系统架构与协议 第三章 USB系统架构与协议 3.1 USB系统拓扑结构 主机 根集线器 根集线器 根集线器 集线器 设备 设备 设备 图3 USB系统拓扑结构a 每个USB系统都有一个主控制器(Host),该(Host)主控器和一个根集线器作为一个整体,。USB主控器在USB系统中USB主控器负责主机与设备之间的电气和协议层得互联。USB主控器的常规规格有OHCI、UHCI、EHCI。OHCI即Open Host Controller Interface,开放式主机控制接口协议 。"EHCI"驱动程序设计成为实现新的高速 USB 2.0 协议的芯片提供支持。"OHCI"驱动程序用来为非 PC 系统上的(以及带有 SiS 和 ALi 芯片组的 PC 主板上的)USB 芯片提供支持。"UHCI"驱动程序用来为大多数其它 PC 主板(包括 Intel 和 Via)上的 USB 实现提供支持。 一个 USB HOST 最多可以同时支持 128 个地址,地址 0 作为默认地址,只在设备枚举期间临时使 用,而不能被分配给任何一个设备,因此一个 USB HOST 最多可以同时支持 127 个地址,如果一个设 备只占用一个地址,那么可最多支持 127 个 USB 设备。在实际的 USB 体系中,如果要连接 127 个 USB 设备,必须要使用 USB HUB,而 USB HUB 也是需要占用地址的,所以实际可支持的 USB 功能设备的数量将小于 127。 USB体系采用分层的星型拓扑来连接所有USB设备,如下图所示: 7 东华理工大学长江学院毕业设计 第三章 USB系统架构与协议 图4 USB系统拓扑结构b 以 HOST-ROOT HUB为起点 ,最多支持7层(Tier),也就是任何一个 USB 系统中最多可以允许 5 个 USB HUB 级联。一个复合设备(Compound Device) 将同时占据两层或更多的层。ROOT HUB 是一个特殊的 USB HUB,它集成在主机控制器里,不占用地址。ROOT HUB 不但实现了普通USB HUB的功能,还包括其他一些功能。 3.2 USB设备逻辑结构 设备描述符 配置0 配置n 接口0 接口0 接口1 端点0 端点1 端点0 图5 USB设备逻辑结构 在USB协议中接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象。如:配置一:音频(接口)+旋钮(接口);配置二:音频(接口)+旋钮(接口)+视频(接口)。 设备端点是USB设备中的唯一可寻址部分,它位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB各种数据,主机和设备的通信的最终作用于设备的各个端点。USB设备有一个唯一的地址,在设备连接上主机时,由主机分配,而设备终的每一个端点在设备内部有唯一的端点号,给端点号是设计设备时给定的。每个设备必 8 东华理工大学长江学院毕业设计 第三章 USB系统架构与协议 有端点0,它用于设备枚举和对设备进行一些基本的控制功能。 3.3 USB描述符 在每个PCI设备中都有一组固定格式的寄存器,称之为PCI寄存器,通过访问这组寄存器,主机能获得PCI设备的信息。同样,USB内部,同样也包含了类似于PCI配置寄存器,这样的固定格式的数据,通过这些数据,主机可以获取USB设备的类型、生产厂商等信息。 标准USB设备有5钟USB描述符:设备描述符、配置描述符、接口描述符、字符串描述符。一个USB设备只有一个设备描述符,一个设备描述符可以包含多个配置描述符,一个配置描述符可以包含多个接口描述符,一个接口使用几个端点就有几个端点描述符。 3.3 USB数据传输方式 USB 采用轮询的广播机制传输数据,所有的传输都由主机发起,任何时刻整个 USB 体系内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据包。 USB 采用“令牌包”-“数据包”-“握手包”的传输机制,在令牌包中指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。握手包表示了传输的成功与否。 图6 USB传输方式分析 一个传输有一个或多个事务(transaction)构成。事务可分为IN事务、OUT事 9 东华理工大学长江学院毕业设计 第三章 USB系统架构与协议 务,Setup事务。一个事务由一个或多个包(packet)构成。包又可分为令牌包、数据包、握手包、特殊包。一个包由多个域构成:同步域(SYNC)、标示域(PID)、地址域(ADDR)、端点域(ENDP)、帧号域(FRAM)、数据域(DATA)、校验域(CRC)。 数据包是USB 总线上数据传输的最小单位,包括 SYNC、数据及 EOP 三个部分。其中数据的格式针对不同的包有不同的格式。但都以 8 位的 PID 开始。PID 指定了数据包的类型(共 16 种)。令牌包即指PID为IN/OUT/SETUP 的包。 端点(Endpoint)是 USB 设备中的可以进行数据收发的最小单元,支持单向或者双向的数据传 输。设备支持端点的数量是有限制的,除默认端点外低速设备最多支持 2 组端点(2 个输入,2 个输出),高速和全速设备最多支持 15 组端点。 管道(Pipe)是主机和设备端点之间数据传输的模型,共有两种类型的管道:无 流管道(Stream Pipe)和有格式的信息管道(Message Pipe)。任何 USB 设格式的 备一旦上电就存 在一个信息管道,即默认的控制管道,USB 主机通过该管道来获取设备的描述、配置、状 态,并对设备进行配置。 USB 设备连接到 HOST 时,HOST 必须通过默认的控制管道对其进行枚举,完成获得 其设备描述、进行地址分配、获得其配置描述、进行配置等操作方可正常使用。USB 设备 的即插即用特性即依赖于此。 枚举是 USB 体系中一个很重要的活动,由一系列标准请求组成(若设备属于某个子类,还包含 该子类定义的特殊请求)。通过枚举 HOST 可以获得设备的基本描述信息,如支持的 USB 版本、PID、 VID、设备分类(Class)、供电方式、最大消耗电流、配置数量、各种类型端点的数量及传输能力(最大包长度)。HOST 根据 PID和 VID 加载设备驱动程序,并对设备进行合适的配置。只有经过枚举的设备才能正常使用。对于总线供电设备,在枚举完成前最多可从总线获取 100mA 的电流。枚举的步骤为获取设备描述符、复位、设置地址、再次获取设备描述符、获取配置描述符、获取接口及端点描述符、获取字符串描述符、选择设备配置。 3.3 USB数据流模型 USB 体系定义了四种类型的传输,它们是: 控制传输、 中断传输、批量传输、同步传输。 3.3.1 控制传输 控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。第一阶段为从 HOST 到 Device 的 SETUP 事务传输,这个阶段指定了此次控制传输的请求类型; 第二阶段为数据阶段,也有些请求没有数据阶段;第三阶段为状态阶段,通过一次 IN/OUT 传输表明请求是否成功完成。 控制传输通过控制管道在应用软件和 Device 的控制端点之间进行,控制传输 10 东华理工大学长江学院毕业设计 第三章 USB系统架构与协议 过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的 数据含义。其他三种传输类型都没有格式定义。 控制传输对于最大包长度有固定的要求。对于高速设备该值为 64Byte;对于低速设备该值为8;全速设备可以是8、16、32、 64。 最大包长度表征了一个端点单次接收/发送数据的能力,实际上反应的是该端点对应的 Buffer 的大小。Buffer 越大,单次可接收/发送的数据包越大,反之亦反。当通过一个端点 进行数据传输时,若数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据 包传输,并彍要求除最后一个包外,所有的包长度均等于该最大包长度。这也就是说如果 一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。控制传输在访问总线时也受到一些限制,如:高速端点的控制传输不能占用超过 20%的微帧,全速和低速的则不能超过 10%。 在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控 制传输。 3.3.2 中断传输 中断传输是一种轮询的传输方式,是一种单向的传输,HOST 通过固定的间隔 对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据,否则 返回 NAK,表示尚未准备好。 中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支 持错误重传。 对于高速/全速/低速端点,最大包长度分别可以达到 1024/64/8 Bytes。 高速中断传输不得占用超过 80%的微帧时间,全速和低速不得超过 90%。 中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS,低速端点为 10~255mS,高速端点为(2interval-1)*125uS,其中 interval 取 1到 16 之间的值。除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输,高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达3072字节的数据。 所谓单向传输,并不是说该传输只支持一个方向的传输,而是指在某个端点上该传输 仅支持一个方向,或输出,或输入。如果需要在两个方向上进行某种单向传输,需要占用两个端点,分别配置成不同的方向,可以拥有相同的端点编号。 3.3.3 批量传输 批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速 USB 设备不支持批量传输,高速批量端点的最大包长度为 512,全速批 量端点的最大包长度可以为 8、16、32、64。批量传输在访问 USB 总线时,相对其他传输类型具有最低的优先级,USB HOST 总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点 11 东华理工大学长江学院毕业设计 第三章 USB系统架构与协议 必须支持 PING 操作,向主机报告端点的状态,NYET 表示否 定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。 3.3.4 同步传输 同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全 1024,低速的为 1023。除高速速端点支持同步传输,高速同步端点的最大包长度为 高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽 端点最多可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。全速同步传输不得占用超过 80%的帧时间,高速同步传输不得占用超过 90%的微帧时间。 同步端点的访问也和中断端点一样,有固定的时间间隔限制。 在主机控制器和 USB HUB 之间还有另外一种传输——分离传输(Split Transaction),它仅在主机控制器和 HUB 之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于 USB 设备来说是透明的、不可见的。分离传输顾名思义就是把一次完整 速/低速传输的速度的事务传输分成两个事务传输来完成。其出发点是高速传输和全 不相等,如果使用一次完整的事务来传输,势必会造成比较长的等待时间,从而 降低了高速 USB 总线的利用率。通过将一次传输分成两此,将令牌(和数据)的传输与响应数据(和 握手)的传输分开,这样就可以在中间插入其他高速传输,从而提高总线的利用率。 12 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 第四章 Linux系统内核及内核模块 4.1 Linux体系结构 用User Applications(应用程序) 户 空 间 GUN C Library(C库) GUN/Linux 内 核System Call Interface(系统调用接口) 空 间 Kernel(内核) Architechure-Dependent kernel code(依赖硬件体系结构的代码) 图7 Linux系统结构 现代CPU有不同的工作模式,以ARM为例,有用户模式(USR)、快速中断模式(FIQ)、外部中断模式(IRQ)、管理模式(SVC)、数据访问终止模式(ABT)、系统模式(SYS)、未定义指令中断模式(UND),不同模式执行的特权指令不同,linux系统利用了cpu这一特性,使用了其中的两级来翻倍运行Linux内核昱应用程序,是操作系统本身得到充分的保护。内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。 4.2 Linux内核架构 Linux内核源代码采用树形结构进行组织,把功能先关的文件都放在同一个子目录下,是程序更具有可读性。 13 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 System call interface(SCI)系统调用接口 Pross management(PM) Virtueal file system(VFS) 进程管理 虚拟文件系统 Memory management(MM) Network stack 内存管理 网络协议栈 依赖硬 Device Drivers(DD) 件体系 驱动程序 结构的 Arch 代码 图8 linux内核 4.3 Linux内核目录结构 图9 Linux内核文件目录 /arch目录:内核多支持的每一种支持CPU体系,在该目录下都有对应的子目录, 每一个CPU的子目录有进一步分解为boot、kernel等子目录,分别包含了控制系统 引导,系统调用等。 /bock目录:部分块设备驱动程序。 /crypto目录:加密、压缩、CRC校验算法。 /documentation目录:内核的文档。 /driver目录:设备驱动程序。 14 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 /fs目录:存放各种文件系统的实现代码。 /include目录:内核所需的头文件,与平台无关的头文件在include/linux子目录下与硬件体系相关的头文件在arch目录下。 /init目录:内核初始化代码。 /ipc目录:进程间通信的实现代码。 /kernel目录:Linux大多数关键的核心功能(调用程序、进程控制、模块化) /lib目录:库文件代码 /mm目录:用于实现内存管理中昱硬件体系结构无关的部分。 /net目录:网络协议实现的代码。 /samples目录:一些内核编程的范例。 /scripts目录:配置内核的脚本。 /security目录:安全相关。 /sound目录:音频设备的驱动程序。 /usr目录:Cpio命令的实现。 /virt目录:内核虚拟机。 4.4 Linux内核模块开发 Linux内核的整体结构非常庞大,起包含组件也很多,若所有组件都编译进内核文件,这样会导致内核文件过大,添加和删除组件是就要重新编译内核。Linux内核模块动态的添加到正在运行的内核中。 Linux内核模块的特点:本身并不编译进内核;可以格局需求,在内核运行期间动态的安装和卸载。 Linux内核模块的程序结构: 模块加载函数,安装时被系统自动的调用的函数,通过module_init宏来指定; 模块卸载函数,卸载时被系统自动的调用的函数,通过module_exit宏来指定。 4.4.1 makefile 当工程很大,需要很多源文件,这是不可能一个一个的去运行,这是就要用到makefile。GUN的makefile能够是整个软件工程编译,连接只需要一个命令就可以完成。Makefile文件描述整个工程的编译连接。 Makefile术语: a. 规则:用于说明如何生成一个或多个目标文件,命令要用TAB键开始。 规则: targets(目标): prerequisites(依赖) (TAB键)command(命令) eg: obj : hello.o 15 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 gcc –o hello b. 最终目标:第一条规则为最终的目标 c. 伪目标:makefile中把没有任何依赖只要执行的目标为伪目标 .PHONY :clearn (将clearn声明为伪目标) clear: rm –f hello d. 变量:用$()定义 eg: obj =main.o fun1.o fun2.o hello:$(obj) gcc $(obj) –o hello 默认变量$^:代表所有依赖文件 $@:代表目标 $<:代表第一个依赖文件 eg: hello :main.o fun1.o hello:main.o fun1.o gcc main.o fun1.o hello.o gcc $^ -o $@ makefile中“#”字符为注释,“@”字符为取消回显 (没有@时,屏幕会显示运行的命令) @gcc -o hello eg: ifneg($(KERNELRELEASE)) # KERNELRELEASE不为空执行else obj – m :=usbmodule.o #-m 表示编译的是内核模块,后面的为模块的名称 usbmodule –objs= file1.o file1.o file1.o #定义变量 else KDIR :=/lib/modules/2.6.29-53.e15/build #定义变量 all: make – C $(KDIR) M=$(pwd) modules clear: rm –f *.ko *.o *.mod.o *.mod.c *symvers endif 编译后生成.ko文件为内核模块文件。 16 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 图10 内核模块编译 4.4.2 安装和卸载内核模块 加载内核模块 #modprobe usbmodule.ko 图11安装和卸载内核模块a 卸载内核模块 #rmmod usbmodule.ko 查看内核模块 #lsmod usbmodule.ko 17 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 图12 安装和卸载内核模块b 4.5 Linux内核配置与安装 Linux内核具有可定制的优点,具体步骤如下: 1. 清除临时文件、中间文件和配置文件: [root@localhost Linux-2.6.29]#make distclean 图13 Linux内核配置与安装a 18 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 2.确定目标系统软硬件的配置情况,如CPU类型、网卡的型号、所支持的网络协议等 3.使用如下命令配置内核: [root@localhost Linux-2.6.29]#ls –a [root@localhost Linux-2.6.29]#make menuconfig 图14 Linux内核配置与安装b 进入后左右键在个选项间移动,enter进入子菜单,每个选项上的高亮是键盘上的快捷方式,空格可更改默认选项。(*表示编译进内核,M表示编译进内核模块,空为不编译)。可在arch/arm/configs下找到相应的文件.config,可将该文件拷贝到内核源代码的根目录下(覆盖原有的.config)这样可以参照系统多该CPU进行的配置的模板,之后在此基础上定制内核。 4.编译内核: [root@localhost Linux-2.6.29]#make ZImage (内核小于512K) [root@localhost Linux-2.6.29]#make bzImage(内核大于512K) 编译好的内核位于arch/arm/boot/下,为bzimage或zimage文件 19 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 图15 Linux内核配置与安装c 5.编译内核模块: [root@localhost Linux-2.6.29]#make modules 6.安装内核模块: [root@localhost Linux-2.6.29]#make modules_install 图16 Linux内核配置与安装d 将生成的文件拷贝到/lib/modulse下,最后内核模块: 20 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 /lib/modules/2.6.29/kernel/arch/arm/kernel 图17 Linux内核配置与安装e 7.制作init ramdisk [root@localhost Linux-2.6.29]#mkinitrd initrd – 2.6.29 2.6.29 生成initrd – 2.6.29文件 21 东华理工大学长江学院毕业设计 第四章 Linux系统内核和内核模块 图18 Linux内核配置与安装f 8.安装内核: [root@localhost Linux-2.6.29]#cp arch/ram/boot/bzimage /boot/mylinux-2.6.29 9.安装内核模块: [root@localhost Linux-2.6.29]#cp initrd – 2.6.29 /boot/ 图19 Linux内核配置与安装g 22 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 第五章 Linux USB系统与功能测试 5.1 USB协议软件层次 Clinet SW(客服软件) Function(功能层) USB system SW(客服软件) USB logical Device(逻辑设备) USB Host Controller(主控器) USB Bus Interface(硬件层) 主机 设备 图20 USB协议软件层次 USB 体系在实现时采用分层的结构, 能直接访问 USB总线,而必须通过 USB 系统软件和 USB 主机控制器来访问 USB 总线,在 USB总线上和 USB 设备进行通讯。从逻辑上可以分为功能层、设备层和总 线接口层三个层次。其中功能层完 成功能级的描述、定义和行为;设备级则完成从功能级到传输级的转换,把一次功能级的行为转换为一 次一次的基本传输;USB 总线接口层则处理总线上的Bit 流,完成数据传输的物理层实现和总线管理。途中黑色箭头代表真实的数据流,灰色箭头代表逻辑上的通讯。 USB 系统中数据的传输,宏观的看来是在 HOST 和 USB 功能设备之间进行;微观的看是 在应用软件的 Buffer 和 USB 功能设备的端点之 间进行。一般来说端点都有 Buffer,可以认为 USB 通讯就是应用软件 Buffer 和设备端点 Buffer 之间的数据交换,交换的通道称为管道。应用软 件通过和设备之间的数据交换来完成设备的控 制和数据传输。通常需要多个管道来完成数据交 换,因为同一管道只支持一种类型的数据传输。 用在一起来对设备进行控制的若干管道称为设 备的接口,这就是端点、管道和接口的关系。 一个 USB 设备可以包括若干个端点,不同的端点以端点编号和方向区分。不同端点可以支 持不同的传输类型、访问间隔以及最大数据包大 小。除端点 0 外,所有的端点只支持一个方向的 数据传输。端点 0 是一个特殊的端点,它支持双 向的控制传输。管道和端点关联,和关联的端点 有相同的属性,如支持的传输类型、最大包长度、传输方向等。 23 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 5.2 Linux USB架构 USB设备驱动 Gadge驱动 USB核心(USB协议) Gadget API USB主控器器驱动(UHCI、OHCI、EHCI) UDC驱动 USB主控器 USB控制器 运行Linux的主机 运行Linux的设备 图21 Linux USB架构 5.3 MassStorsge 为内核配置MassStorage, 配置之后让开发板支持MassStorage功能,可以识 别U盘,开发板作为主控器 [root@localhost Linux-2.6.29]# setup 图22 内核配置MassStorage-a 配置支持热拔插 24 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 General setup , [*]configure stand kernel fentures , [*]support for hot-pluggable devices(NEW) 图23 内核配置MassStorage-b 配置支持U盘格式 Device Drivers, SCSI device support, <*>SCSI device <*>SCSI device support <*>SCSI generic 图24 内核配置MassStorage-c 配置对USB的支持 25 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 Device Drivers, USB support, <*> support for Host-side usb [*]USB device filesystem <*>OHCI HCD support <*>USB Mass Storage support [*]USB monitor 图25 内核配置MassStorage-d 配置对windows文件系统的支持 File system, Dos/FAT/NT filesystem, <*>MsDOS <*>VFAT Partitioniyrs, [*]PC BOS Support <*>simplified Chinese <*>NLS UTF8 Mass Storage功能测试 26 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 图26 内核配置MassStorage-e 图27 内核配置MassStorage-f 27 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 图28 内核配置MassStorage-g 5.4 USB-HID 为内核配置USB—HID 配置对USB的支持 Device Drivers, USB support, <*> support for Host-side usb [*]USB device filesystem <*>OHCI HCD support <*>USB Mass Storage support [*]USB monitor HID devices, <*>USB Human Interface Device 28 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 图29 内核配置USB—HID a 图30 内核配置USB—HID b 29 东华理工大学长江学院毕业设计 第五章 Linux USB系统与功能 图31 内核配置USB—HID c 图32 内核配置USB—HID d 30 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 第六章 Linux USB鼠标驱动程序设计 6.1 USB鼠标驱动程序分析 USB设备包括配置、接口、端点、而USB驱动程序设计对应一个USB接口而非 整个USB设备。 Device 设备 Config 配置 Interface 接口 USB 驱动 端点 Endpoint 端点 Endpoint 图33 USB设备 ?Linux内核中使用Struct usb_driver结构体描述USb驱动,在Struct usb_driver 结构体中又定义了usb_device_descriptor来描述USb设备描述符。 static struct usb_driver usb_mouse_driver = { .name = "usbmouse", /* 驱动名 */ .probe = usb_mouse_probe, /* 捕获函数 */ .disconnect = usb_mouse_disconnect, /* 卸载函数 */ .id_table = usb_mouse_id_table, /* 设备列表 */ }; struct usb_device_descriptor { __u8 bLength; __u8 bDescriptorType; __le16 bcdUSB; __u8 bDeviceClass; __u8 bDeviceSubClass; __u8 bDeviceProtocol; __u8 bMaxPacketSize0; __le16 idVendor; __le16 idProduct; __le16 bcdDevice; 31 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 __u8 iManufacturer; __u8 iProduct; __u8 iSerialNumber; __u8 bNumConfigurations; } __attribute__ ((packed)); 图34 USB协议 参见(文件综述Universal+Serial+Bus+Specification+v2[1].0((USB+2.0) 第265页-266页) ?在Linux系统内核特有的描述一个USB配置的结构体usb_host_config ?在Linux系统内核里定义了usb_interface结构体来作为接口描述符,在接口描述符中又包含了多个配置和多个设置,就像手机可以当U盘和手机用(配置),同时又有会议模式和户外模式(设置)。 32 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 ?在Linux系统内核定义了usb_host_endpoint来描述USB端点描述符。 6.2 URB URB(usb请求模块)是USB设备驱动中用来描述昱USB设备通信所用的基本载体和核心数据结构 URB处理流程: USB设备驱动程序创建并初始化一个访问特定USB设备特定的端点的URB,并提交给USB Core; USB Core提交该URB到USB主控器驱动程序; USB主控器驱动程序根据该URB描述来访问USb设备; 设备访问结束后,USB主控器驱动程序程序通知USB设备驱动程序访问结束。 ?创建URB struct urb *usb_alloc_urb() ?初始化URB 中断urb usb_fill_int_urb() 批量urb usb_fill_bulk_urb() 控制urb usb_fill_control_urb() 等时urb 没有函数初始化 ?提交 URB int usb_submit_urb() ?URB被提交到USB核心后,USB核心指定USB主控器驱动程序来处理该URB,一下3种情况被认为处理 完成: URB被成功发给设备,设备返回正确的确认(urb->status为0) 发送或接受数据时出错(urb->status将记录错误值) URB被取消(usb_unlink_urb()或usb_kill_urb()函数被调用,或者URB已提交,而USB设备拔出) 6.3 搭建开发平台 6.3.1 安装编辑工具 在Windows平台上安装Source Insight开发工具。并且新建本系统工程,工程名为digPhoto。 6.3.2 安装和配置编译器 在Windows平台上安装编译器ADS(ARM Developer Suite v1.2)。并配置如下选项: (1)新建工程名为project。 33 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 (2)单击DebugRel Settings进行设置。 在Target Settings选项卡中的选择Post-linker为ARM fromELF,这样做是为了让编译器使用ELF工具把ELF文件转换为片上可执行的文件格式.bin文件。 在Language Settings 的ARM Assembler选项卡中的Architecture or Processor 。 选择ARM920T 在Linker 的ARM Linker选项卡中,设置Output 的RO Base为0x30008000,Option的Image entry point设置为__ENTRY,Layout的Object/Aymbol设置为start.o,Section 为SelfBoot。 6.3.3 安装其他工具 (1)安装DNW v0.50A超级终端 并在Configuration中配置Serial Port的Baud Rate为115200; 在COM Port中选择COM1; 在USB Port的Download Address中输入0x30008000。 6.3.4 平台硬件构成 本系统所使用的开发板是广州市沃佳软件技术有限公司生产的S3C2440A-40开发板,如下图所示: 图35 ARM开发板(S3C2440) 34 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 1. S3c2440A功能及特点 系统可稳定的运行在405MHz下,主频最高可达530MHz,但通常情况下,一般采用400MHz; 集成了64M的SDRAM,由两片 K4S561632组成,工作在32位模式下; 集成了64M的Nand Flash(闪存),采用的是K9F1208,可以兼容16M,32M或128M字节; 10M以太网接口,采用的是CS8900Q3,带传输和链接指示灯; LCD和触摸屏接口; 2个USB HOST,是由s3c2440内置的,符合USB 1:1的标准,其中一个USB是复用的; 1个USB Device,也是s3c2440内置的,符合USB 1:1标准; 支持音频输入和音频输出,音频模块由s3c2440的IIS音频总线接口和UDA1341音频编解码芯片组成,板上还集成了一个MIC,用于音频输入; 2路UART串行接口,波特率可高达115200bps,并具有RS232电平转换电路,其中一路为完整串口; SD卡接口,兼容SD Memory Card Protocol 1.0 和 SDIO Card Protocol 1.0; Embedded-ICE (20脚标准 JTAG)接口和并口式JTAG接口,支持ADS,SDT软件的下载和调试以及FLASH的烧写; 穿行EEPROM:AT24C02 4Kbytes EEPROM,IIC接口; SPI接口; 数字摄像头接口; 蜂鸣器,有4个LED灯,4个按键; 开关电源。分布式电源供电,3V锂电池,提供RTC电源。 支持的软件: ASD 编译器; DWN 软件下载工具。 2. S3c2440A功能及特点 LTV350QV-F0E: LTV350QV-F0E是TFT(Thin Film Transistor)型的液晶显示频。长宽为320*240,也就是说它最多可以显示16.7M色。LCD分辨率是指LCD上的像素的数目,用横向点数*纵向点数得出LTV350QV -F0E的分辨率为320*240。在此分辨率下,每个像素点可以由16位来表示,换句话说,LTV350QV-F0E的色深为16位。而色深和分辨率之积决定了显存的大小。 S3C2440A的LCD控制器支持单色、2位、4位、8位、12位、16为和24位的颜色显示。LCD控制器可以根据编程的需要选择不同的LCD屛要求。LCD控制器的主要 35 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 作用是将定位于系统存储器的显示缓冲区的LCD图像数据传输到外部的LCD驱动器上。 6.3.5 平台软件构成 应用层:是嵌入式系统的最高层。主要负责一些高层的调用,不需要关心底层硬件的配置。这部分主要是用汇编和C语言编写的程序代码,完成驱动s3c2440和相关外围设备硬件工作的功能。 API层:主要是完成应用层与底层硬件层之间的交互工作。在这一层中既要结合硬件知识又要运用到软甲基础。在硬件层的基础上,通过API函数编程接口是调用一些C库的API函数完成相应的功能。初始化寄存器、硬件设备等。 底层硬件层:这一层主要包含了系统所使用的开发板和一些外围设备硬件,以及之间的接口。外围设备主要有:LCD 、UART、KEY、IIS 、TIMER等硬件。主要是通过相关的协议,通过相应的接口,对相关硬件设备上的寄存器、功能引脚等进行配置或初始化。以便实现更高层的调用。 软件结构如下图所示: Application API LCD.C(lcd_ClearSCR(),lcd_Paint_Bmp(),„) IIS.C(IIS_DMA2_For_Play(),IIS_Play_Voice()...) KEY.C(get_keynumber()...) DDI IIS LCD UART KEY TIMER DMA BUZZER 图36 软件结构图 6.4 USB鼠标驱动程序详细设计 (部分代码说明) 1、内核模块出入口 module_init(usb_mouse_init);//入口 module_exit(usb_mouse_exit);//出口 2、USB鼠标初始化函数 36 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 static int __init usb_mouse_init(void) { /* 注册鼠标驱动程序 */ int retval = usb_register(&usb_mouse_driver); if (retval == 0) printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" DRIVER_DESC "\n"); return retval; } 3、URB操作 static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id) { /* 设备描述 usb_device */ /* 接口描述 usb_interface */ struct usb_device *dev = interface_to_usbdev(intf); /* 接口设置描述 */ struct usb_host_interface *interface; /* 端点描述符 */ struct usb_endpoint_descriptor *endpoint; struct usb_mouse *mouse; struct input_dev *input_dev; int pipe, maxp; int error = -ENOMEM; /* 获取当前接口设置 */ interface = intf->cur_altsetting; /* 根据HID规范,鼠标只有一个端点(不包含0号控制端点)*/ if (interface->desc.bNumEndpoints != 1) 37 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 return -ENODEV; /* 获取端点0描述符 */ endpoint = &interface->endpoint[0].desc; /* 根据HID规范,鼠标唯一的端点应为中断端点 */ if (!usb_endpoint_is_int_in(endpoint)) return -ENODEV; /* 生成中断管道 */ pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); /* 返回该端点能够传输的最大的包长度,鼠标的返回的最大数据包为4个字 节。*/ maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); /* 创建input设备 */ mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL); input_dev = input_allocate_device(); if (!mouse || !input_dev) goto fail1; /* 申请内存空间用于数据传输,data 为指向该空间的地址*/ mouse->data = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &mouse->data_dma); if (!mouse->data) goto fail1; /* 分配URB */ mouse->irq = usb_alloc_urb(0, GFP_KERNEL); if (!mouse->irq) goto fail2; mouse->usbdev = dev; mouse->dev = input_dev; 38 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 if (dev->manufacturer) strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name)); if (dev->product) { if (dev->manufacturer) strlcat(mouse->name, " ", sizeof(mouse->name)); strlcat(mouse->name, dev->product, sizeof(mouse->name)); } if (!strlen(mouse->name)) snprintf(mouse->name, sizeof(mouse->name), "USB HIDBP Mouse %04x:%04x", le16_to_cpu(dev->descriptor.idVendor), le16_to_cpu(dev->descriptor.idProduct)); usb_make_path(dev, mouse->phys, sizeof(mouse->phys)); strlcat(mouse->phys, "/input0", sizeof(mouse->phys)); input_dev->name = mouse->name; input_dev->phys = mouse->phys; usb_to_input_id(dev, &input_dev->id); input_dev->dev.parent = &intf->dev; input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); input_set_drvdata(input_dev, mouse); input_dev->open = usb_mouse_open; 39 东华理工大学长江学院毕业设计 第六章 Linux USB鼠标驱动程序设计 input_dev->close = usb_mouse_close; /* 初始化中断URB */ usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data, (maxp > 8 ? 8 : maxp), usb_mouse_irq, mouse, endpoint->bInterval); mouse->irq->transfer_dma = mouse->data_dma; mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; error = input_register_device(mouse->dev); if (error) goto fail3; usb_set_intfdata(intf, mouse); return 0; fail3: usb_free_urb(mouse->irq); fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); fail1: input_free_device(input_dev); kfree(mouse); return error; } 40 东华理工大学长江学院毕业设计 总结 总 结 在老师的指导下,通过三个月的努力终于完成了毕业设计。通过毕业设计,我不紧巩固了信息工程的理论知识,同时也锻炼了动手编写程序的能力。 在此次毕业设计初就体现了我理论功底不扎实的,理论联系实践的能力还不不强的现象。但在指导老师的帮助下,在小组成员的共同努力下。综合运用所学的基础理论、基本技能和专业知识,去独立分析和解决实际问题的能力明显加强。同时通过这次毕业设计,我对USB系统架构,USB描述符,USB数据描述方式,USB枚举,Linux内核简介,Linux内核及内核模块配置预编译,Linux系统架构,MassStorage与USB-HID,USB URB等相关内容更加的熟悉。为我们毕业后走上工作岗位打下一定的基础;并为自己能顺利与社会环境接轨做准备。 在毕业设计中,碰到了不少的困难。但最终都得到了解决,让我积累了丰富的项目经验,增强了信心,成为了一笔永远的财富。 41 东华理工大学长江学院毕业设计 致谢 致 谢 毕业设计的完成结束我的大学四年的生活,在此回顾四年留下了太多的记忆。这次毕业设计得到了老师和很多同学的帮助,在此我表示诚挚的感谢。 首先我要感谢的毕业设计指导老师——饶志华老师细心的的教导和严格的要求,真是因为他的这种作风才使我的论文有这么高的质量。 其次要感谢这半年来那些和我一起攻克毕业设计中遇到每个困难的战友们,正是你们在旁边对我的鼓励才使我能坚持不懈保证了论文的进度。 大学的尾声正在一步步临近我的视线,我也即将告别我的母校——东华理工大学。感谢母校四年来给予的精神食粮,使我专业知识还文化素质都得到了提高。 走上了一个新的台阶。在离开之际衷心的祝愿我的母校越越办越好,东华理工的精神能为我们的中国特色的社会主义中国做出更大的贡献。 42 东华理工大学长江学院毕业设计 参考文献 参考文献 [1] 华清远见培训中心,嵌入式Linux应用程序开发标准教程(第二版),人民邮电出版社,2009 [2] (美)拉芙(Love,R.) 著,陈莉君 等译,Linux内核设计与实现(第二版),机械工业出版社,2006 [4] Leiner B M, Nielson D L, Tobagi F A,Issues in Packet Radio Network Design, Proceedings IEEE,1985,75(1):6~20 [5] Jubin J and Tornow J D. The DARPA packet radio network protocols, Proceedings of IEEE, 1987,75(1):21~32 Corson S, Macker J. Routing Portocol Performace Issues and Evaluation Considerations. IETF RFC 2501, Jan 1999 [6] Macker J P, Corson M S, Mobile Ad Hoc Networking and the IETE ACM Mobile Computing and Communications Review, April 1999,2(4) [7] 孙家兴,USB应用开发技术大全,人民邮电出版社,2009 [8] 肖林甫,肖季东,任桥伟, Linux那些事儿之我是USB, 电子工业出版社 , 2010 43
/
本文档为【毕业设计(论文)-基于Linux系统下USB鼠标驱动开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索