最新开发usb驱动程序的方法连载一
USB驱动程序(较详细)一
USB驱动程序(较详细)一内核使用2.6.29.4拓扑结构上, 一个 USB 子系统并不是以总线的方式来分布; 它是一棵由几个点对点连接构成的树。
这些连接是连接设备和集线器的4线电缆(地, 电源, 和 2 个差分信号线), 如同以太网的双绞线。
USB主控制器负责询问每个USB设备是否有数据需要发送。
由于这个拓扑结构,一个 USB 设备在没有主控制器要求的情况下不能发送数据. 也就是说:USB是单主方式的实现,主机轮询各外设。
但是设备也可以要求一个固定的数据传输带宽,以保证可靠的音视频I/O。
USB只作为数据传输通道,对他所收发的数据格式没有特殊的内容和结构上的要求,也就是类似于透传。
Linux内核支持两种主要类型的USB驱动程序:Host系统上的驱动程序(USB device driver)和device上的驱动程序(USB gadget driver)(设备端驱动)。
USB 驱动程序存在于不同的内核子系统和USB硬件控制器之中。
USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,它隐藏了USB控制器的硬件细节。
从这里我们要知道:《LDD3》所谓的USB驱动是针对USB核心提供的接口而写的,并不是真正去操纵USB硬件控制器中的寄存器。
这样你必须保证你的板子上CPU的USB硬件控制器的驱动是可用的。
否则您就得先搞定CPU的USB硬件控制器的驱动才行。
以下是Linux内核中USB驱动的软件构架:如左下图所示,从主机侧的观念去看,在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。
因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB 设备如何与主机通信。
10分钟完成一个USB驱动程序
很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的。
但是,现在也有不少人都开始借助一些辅助工具。
笔者去年开始接触到DriverStudio,发现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和DDK的结合很好。
当然,也有很多人觉得用DriverStudio不够正宗,或者说不能很好的理解Windows Device Driver的架构。
我感觉这就有点像MFC和SDK的关系,关于这个问题在很多地方都有争论,比如在万千新闻组上,就讨论了将近2个月。
每个人都有自己的最爱,都有自己的习惯,只要你能把事情做好,我想用什么方法应该都是一样的。
如果你已经习惯了用DDK开发,那完全还可以继续用下去;如果你觉得DriverStudio不错,那尝试用一个可以给你按照OOP 概念来编程的工具有什么不好呢?在驱动开发网上,经常看到有人询问一些关于DriverStudio的使用的问题。
我正好很有幸用它作了几个驱动程序,包括VXD, KMD和WDM,稍微有点心得,因此想写下来给大家作一个小小的参考。
如果其中有错误,欢迎大家给我指出,谢谢。
下面我就介绍一下用DriverStudio开发一个USB驱动程序的过程。
这个USB设备有3个双向端点,每个端点的配置如下:EP 类型地址buffer(Bytes)0 IN/OUT Control 0x80/0x00 16/161 IN/OUT Bulk 0x81/0x01 16/162 IN/OUT Bulk 0x82/0x02 64/64我们的驱动程序需要实现的功能就是控制设备上的LED灯的亮和灭,以及通过Endpoint 2对设备进行读写。
由于DriveStudio由几个部分组成,我们写这个驱动程序只要用到DriverWorks,因此下面我们就简称它为DW。
在这里,我们假定读者已经正确的安装了DW,并且已经编译好了各个库文件。
USB驱动程序编写
USB驱动程序编写linux下usb驱动编写(内核2.4)——2.6与此接口有区别2006-09-15 14:57我们知道了在Linux下如何去使用一些最常见的USB设备。
但对于做系统设计的程序员来说,这是远远不够的,我们还需要具有驱动程序的阅读、修改和开发能力。
在此下篇中,就是要通过简单的USB驱动的例子,随您一起进入USB驱动开发的世界。
USB骨架程序(usb-skel eton),是USB驱动程序的基础,通过对它源码的学习和理解,可以使我们迅速地了解USB驱动架构,迅速地开发我们自己的USB硬件的驱动。
USB驱动开发在掌握了USB设备的配置后,对于程序员,我们就可以尝试进行一些简单的USB驱动的修改和开发了。
这一段落,我们会讲解一个最基础U SB框架的基础上,做两个小的US B驱动的例子。
USB骨架在Linux kernel源码目录中driver/usb/u sb-skeleton.c为我们提供了一个最基础的USB驱动程序。
我们称为USB骨架。
通过它我们仅需要修改极少的部分,就可以完成一个USB设备的驱动。
我们的US B驱动开发也是从她开始的。
那些linux下不支持的USB设备几乎都是生产厂商特定的产品。
如果生产厂商在他们的产品中使用自己定义的协议,他们就需要为此设备创建特定的驱动程序。
当然我们知道,有些生产厂商公开他们的USB协议,并帮助Linux驱动程序的开发,然而有些生产厂商却根本不公开他们的USB协议。
因为每一个不同的协议都会产生一个新的驱动程序,所以就有了这个通用的USB驱动骨架程序,它是以pci 骨架为模板的。
如果你准备写一个lin ux驱动程序,首先要熟悉USB协议规范。
USB主页上有它的帮助。
一些比较典型的驱动可以在上面发现,同时还介绍了USB urbs的概念,而这个是usb驱动程序中最基本的。
USB 接口驱动程序开发
USB 接口驱动程序开发1 引言随着微机技术水平的日益提高,传统的计算机接口已经不能满足当前计算机高速发展的需求,计算机业迫切需要一种新的通用型、高速总线接口,通用外设接口标准USB 就应运而生。
USB,全称是Universal Serial Bus(通用串行总线),是一种新型的、基于令牌的、高速的串行总线标准,由Compaq、Microsoft、Intel、IBM 等七家公司共同开发的, 旨在解决日益增加的PC 外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信标准[3],自1995年在Comdex 上亮相以来已广泛地为各PC 厂家支持。
现在市场上几乎所有的P C 机器都配备了US B 接口,USB 接口之所以能够得到广泛支持和快速普及,是因为它具备以下优点:正由于上述优点, 开发USB 接口的设备已成为一种发展趋势。
然而随着USB 技术的迅猛发展, 传统的USB1 . 1 接口已经不能适应用户的需求, 于是在1 9 9 9年在I nt e l 的开发者论坛大会上又提出了USB2 . 0 技术, 使得US B 不仅支持1 . 5Mb / s 的“低速”, 传输和12Mb/s 的“全速”传输,而且支持480Mb/s 的“高速”传输,比USB1.1 标准快40 倍左右,速度的提高对于用户的最大好处就是意味着用户可以使用到更高效的外部设备, 而且具有多种速度的周边设备都可以被连接到USB 2.0 的线路上,而且无需担心数据传输时发生瓶颈效应。
2 USB 驱动程序设计一个完整的USB 系统包括主机系统包括主机系统和USB 设备。
所有的传输事务都是由主机发起的。
一个主机系统又可以分为以下几个层次结构, 。
USB 总线接口包括USB 主控制器和根集线器,其中USB 主控制器负责处理主机与设备之间电气和协议层的互连,根集线器提供USB 设备连接点。
USB设备的驱动程序实现
USB设备的驱动程序实现
USB驱动是用来控制使用USB接口的设备的软件程序,其实现是将实
际的硬件设备抽象为虚拟的设备,使其能够在计算机操作系统上应用。
一
般来讲,当你将USB设备插入你的计算机时,它将通过计算机的USB主控
芯片找到USB设备,然后测试它的功能,并决定它是否能够被用来通信,
最后安装相应的驱动程序。
实际的USB驱动程序的实现有若干方法,其中
有两种常用的技术:应用程序编程接口(API)和驱动程序模板。
1、应用程序编程接口(API)
API是一组用于访问操作系统提供的服务和功能的特殊指令序列。
应
用程序编程接口(API)可以用来创建USB驱动程序,其实现包括以下步骤:
(1)定义硬件设备的描述
在编写USB驱动程序时,首先需要定义硬件设备,即定义设备的功能,记录其编号、最大支持通信速率、硬件连接方式、发送和接收设备数据的
方式以及支持的驱动软件要求等信息。
(2)实现设备驱动的关键函数
关键函数是控制USB设备正常工作所必需的函数,包括初始化函数、
发送和接收数据的函数、获取设备状态的函数以及关闭设备的函数等。
USB驱动开发
第17章USB设备驱动USB设备驱动和PCI设备驱动是PC中最主要的两种设备驱动程序。
与PCI协议相比,USB协议更复杂,涉及面较多。
本章将介绍USB设备驱动开发。
首先介绍USB协议,使读者对USB协议有个整体认识。
然后介绍USB设备在WDM中的开发框架。
由于操作系统的USB总线驱动程序提供了丰富的功能调用,因此开发USB驱动开发变得相对简单,只需要调用USB总线驱动接口。
17.1 USB总线协议USB总线协议比PCI协议复杂的多,涉及USB物理层协议,又涉及USB传输层协议等。
对于USB驱动程序开发者来说,不需要对USB协议的每个细节都很清楚。
本节概要地介绍USB总线协议,并对驱动开发者需要了解的地方进行详细介绍。
17.1.1 USB设备简介USB即通用串行总线(Universal Serial Bus),是一种支持即插即用的新型串行接口。
也有人称之为“菊链(daisy-chaining)”,是因为在一条“线缆”上有链接127 个设备的能力。
USB要比标准串行口快得多,其数据传输率可达每秒4Mb~12Mb(而老式的串行口最多是每秒115Kb)。
除了具有较高的传输率外,它还能给外围设备提供支持。
需要注意的是,这不是一种新的总线标准,而是计算机系统连接外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。
到现在为止,计算机系统连接外围设备的接口还没有统一的标准,例如,键盘的插口是圆的、连接打印机要用9针或25针的并行接口、鼠标则要用9针或25针的串行接口。
USB能把这些不同的接口统一起来,仅用一个4针插头作为标准插头,如图17-1所示。
通过这个标准插头,采用菊花链形式可以把所有的外设连接起来,并且不会损失带宽。
USB正在取代当前PC上的串口和并口。
第17章 USB 设备驱动431图17-1 USB 的四条传输线以USB 方式连接设备时,所有的外设都在机箱外连接,连接外设不必再打开机箱;允许外设热插拔,而不必关闭主机电源。
开发WDM型USB设备驱动程序
开发WDM型USB设备驱动程序USB设备驱动程序开发⼯具开发USB设备驱动程序需要专门的开发⼯具,⽬前应⽤⼴泛的⼯具主要有两⼤类。
⼀类是Microsoft公司提供的Windows DDK(Device Driver Kit)。
它有Windows 98 DDK 和Windows 2000 DDK两个版本。
Windows 98 DDK能够开发Windows 95/98/Me/NT下的VxD、KMD和WDM驱动程序。
Windows 2000 DDK 能够开发Windows 98/Me/NT/2000下的KMD和WDM驱动程序。
由于DDK基于汇编语⾔的编程⽅式和内核模式的调⽤,对没有深厚的OS原理和编程⽔平的⼈员来说,任务相当艰巨。
另⼀类是NuMega公司提供的DriverStudio,它是⼀个⼤的开发⼯具包,包含VtoolsD、SoftICE和DriverWorks等开发⼯具。
VtoolsD开发包提供了对VxD编程的C/C++类库⽀持,利⽤VtoolsD中的QuickVxD⼯具可以快速⽣成VxD的C/C++代码框架,开发者可以在此基础上根据各⾃的需要添加⾃⼰的代码。
DriverWorks⽤于开发KMD和WDM驱动程序,并且对DDK函数进⾏了类的封装,从⽽为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了⼀个⾃动化的⽅法。
DriverWorks,提供了VC++下的开发向导Driver Wizard,按照它的提⽰可以迅速地⽣成驱动程序的框架。
这个框架结构提供可以正确执⾏WDM动态环境中IRP的请求,⽽且,也包含⽤于简化系统提供的标准类驱动程序(如HID、流)和总线驱动程序(如PCI和USB)接⼝的类等。
总之,利⽤DriverWorks开发WDM驱动程序,可以⼤⼤简化开发⼈员的⼯作量、缩短开发周期以及降低开发驱动程序的难度。
[1]⽤DriverWorks开发WDM型USB设备驱动程序要想使⽤DriverWorks,必须先安装以下软件:DriverStudio2.5,VisualStudio6.0,以及Windows2000DDK。
05-USB驱动程序开发
2、USB设备类型 USB设备类型
八、USB设备列举 USB设备列举
在USB规范中有一个非常重要的“动作” USB规范中有一个非常重要的 动作” 规范中有一个非常重要的“ 过程” 这个动作将会让PC PC机知道何 或“过程”。这个动作将会让PC机知道何 USB设备刚接上以及其所含的各种信息 设备刚接上以及其所含的各种信息。 种USB设备刚接上以及其所含的各种信息。 这样,PC机就可以与这个USB设备开始进行 机就可以与这个USB 这样,PC机就可以与这个USB设备开始进行 数据传输的工作了。 数据传输的工作了。这个动作称之为设备 列举(enumeration) (enumeration)。 列举(enumeration)。
7 . USB2.0 的 High-speed 模式支持音频和视频设备 , 可 USB2 High-speed模式支持音频和视频设备 模式支持音频和视频设备, 以保证其固定带宽; 以保证其固定带宽; 8 . 为了适应各种不同类型外围设备的要求 USB 提供了 为了适应各种不同类型外围设备的要求USB 四种不同的数据传输类型:控制传输,Bulk数据传输 数据传输, 四种不同的数据传输类型:控制传输, Bulk数据传输, 中断数据传输,同步数据传输。 中断数据传输, 同步数据传输。 同步数据传输可为音 频和视频等实时设备的实时数据传输提供固定带宽。 频和视频等实时设备的实时数据传输提供固定带宽。 的端口具有很灵活的扩展性。 一个USB 9 . USB 的端口具有很灵活的扩展性 。 一个 USB 端口串 接上一个USB 就可以扩展为多个USB 端口。 USB端口 接上一个 USB Hub 就可以扩展为多个 USB 端口 。 规范 中说,USB可以扩展到127个外设端口 可以扩展到127个外设端口。 中说,USB可以扩展到127个外设端口。
最新单片机USB接口驱动和应用程序的开发
单片机U S B接口驱动和应用程序的开发北方民族大学学士学位论文论文题目:AT89C51单片机USB接口驱动和应用程序的开发院(部)名称:电信学院学生姓名:杨闯专业:测控技术与仪器学号:20060249指导教师姓名:周春艳论文提交时间: 2010年5月24日论文答辩时间:2010年5月29日学位授予时间:北方民族大学教务摘要通用串行总线USB是一种新兴的并逐渐取代其他接口标准的数据通信标准。
USB,由于速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。
本论文以基于USB总线的数据采集系统的研制过程为主要内容,阐述了利用CH372与ATMEL的AT89C51等组成的一套数据采集系统的设计方案、开发方法和开发过程,并给出了具体实现方案。
论文首先简要介绍了USB总线的相关内容,然后介绍了数据采集系统的设计。
数据采集系统的设计包括硬件设计、固件程序开发、驱动程序开发和应用程序开发四部分。
在硬件设计部分,首先介绍了设计中所用的CH372的性能和特点,然后给出了具体硬件设计方案,并对设计中应该注意的问题进行了说明。
驱动和应用程序主要完成USB设备的读写和即插即用功能,并提供一个友好的人机界面,对数据采集系统进行控制并显示采集后的数据。
本论文已完成了基于USB总线的数据采集系统的设计,用其实现了基本的数据采集功能。
使用USB总线传输数据,为数据采集系统与计算机之间的通讯开辟了新的道路。
关键词:USB、驱动程序、应用程序、AT89C51、CH372AbstractUniversal serial bus USB is one kind of emerging and replace other interface standards of data communication standards. USB, due to fast, convenient and flexible easy to expand, to support plug and play, low cost advantages, such as widelyapplication.The paper is mainly concerned with design process of data acquisition system that is based on USB bus. The design scheme, developing method and developing process of a suit of data acquisition system used with CH372 and ATMEL’s AT89C51 are expatiate. In addition, the paper also gives the material realization scheme.At fist, the paper introduces the protocol of USB bus in brief, and then discusses the design of data acquisition system, which includes four parts, hardware design, firmware design, device driver and application program. In hardware part, the performance of CH372 is fistly described; then the hardware scheme are given in detail; the questions which should be paid attention to in design is explained. Drivers and applications of the main equipment and USB plug and play function, and provide a friendly human-machine interface, control of data acquisition system and display the data collection.The paper has finished the design of data acquisition system based on USB bus and realized the basal data acquisition foundation. Using USB bus to transfer data blazed a way in communication between data acquisition system and computer. Keywords: USB、Drive、Applications、AT89C51、CH372目录第1章绪论 (4)1.1 引言 (4)1.2 USB的特点 (5)1.3 USB实时数据采集系统的实现方案 (6)第2章 USB体系简介 (7)2.1 体系概述 (7)2.2 USB的传输类型 (9)2.3 USB的设备状态 (11)第3章 USB数据采集系统的硬件设计 (14)3.1 USB 接口方案 (14)3.2 USB接口的硬件设计 (15)3.2.1 CH372简介 (15)3.2.2 USB接口的硬件电路设计 (20)3.3 USB接口硬件的实现 (21)3.3.1时钟电路 (21)3.3.2复位电路 (22)3.3.3 A/D转换电路 (22)3.3.4 CH372接口电路 (23)3.3.5 单片机扩展RAM接口电路 (24)第4章 USB数据采集系统设备固件编写 (25)4.1 固件设计方案及工作流程 (25)4.1.1固件的设计思想 (25)4.1.2固件的工作流程 (25)4.2固件开发 (26)4.2.1主循环模块(MAINLOOP.C) (26)4.2.2外接口模块 (26)4.2.3 CH375_INIT初始化模块 (27)4.2.4上传数据块模块 (27)4.2.5上传中断数据模块 (27)第5章 USB设备驱动程序及应用程序 (28)5.1驱动开发工具的选择 (28)5.2 WDM概述 (28)5.3 主要模块设计 (29)5.3.1 初始化模块 (29)5.3.2 即插即用管理模块 (30)5.3.3I\O控制模块 (32)5.4 应用程序设计与实现 (32)5.4.1 操作例程及初始化 (32)5.4.2 设备读写接口程序的实现 (33)5.4.3 数据传输程序的设计和实现 (34)5.5 用户应用程序的具体实现 (38)结束语 (39)致谢 (40)参考文献 (41)附录1 (42)附录2 (43)第1章绪论1.1 引言现代工业生产和科学研究对数据采集系统的要求日益提高,目前比较通用的方法已逐渐不能适应其要求。
最新开发usb驱动程序的方法连载一
最新开发USb驱动程序的方法连载一开发USb驱动程序的方法(连载二)NT还有更藝其他的对象,例如中断对紀Controller对盘、定时器对歓等等,但在我们开发的驱动程序中并没有用到•因此在这里不做介绍。
I/O缓冲策賂很明显的,驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。
这就就设讣到设备的"0缓冲策賂。
读写请求的I/O缓冲策賂前面说到通过设置Device对象的Flag可以选择控制处理读写请求的I/O缓冲策略。
下啲对这些缓冲策略分别做一介绍。
1、缓冲I/O(DO_BUFFERED_IO)在读写请求的一开始,I/O管理器检査用户缓冲区的可访问性,然后分配与调用者的缓冲区一样大的非分贞池,并把它的地址放在IRP的Associatedlrp.SystemBuiYer域中。
驱动程序就利用这个域來进行实际数据的传输°对于IRPJV1J_READ读请求.I/O管理器还把IRP的UserBuffer域设宜成调用者缓冲区的用户空间地址。
X请求完成时• I/O管理器利用这个地址将数据从驱动程序的系统空间拷贝回调用者的缓冲区。
对于IRP」V1J_WRITE写请求.UserBuffer被设辻为NULL,并把川户缓冲区的数据拷贝到系统缓冲区中。
2、直接VO(DO_DIRECTJO)I/O管理器首先检査用户缓冲区的可访问性,并在物理内存中锁定它。
然后它为该缓冲区创建一个内存描述表(MDL).并把MDL 的地址存放在IRP 的MdlAddress 域中。
Associaledlrp.SystemBuffer 和UserBuffer 都被设置为NULJ驱动程序可以调用函数MmGetSystemAddressForMdl得到用户缓冲区的系统空间地址. 从而进行数据操作。
这个函数将调用者的缓冲区映射到非份页的地址空间。
驱动程序完成I/O请求后.系统自动从系统空间解除缓冲区的映射。
开发usb驱动程序的方法连载一
开发usb驱动程序的⽅法连载⼀开发usb驱动程序的⽅法(连载⼀)开始驱动程序设计下⾯的⽂字是从Microsoft的DDK帮助中节选出来的,它让我们明⽩在开始设计驱动程序应该注意些什么问题,这些都是具有普遍意义的开发准则。
应该⽀持哪些I/O请求在开始写任何代码之前,应该⾸先确定我们的驱动程序应该处理哪些IRP例程。
如果你在设计⼀个设备驱动程序,你应该⽀持和其他相同类型设备的NT驱动程序相同的IRP_MJ_XXX 和IOCTL请求代码。
如果你是在设计⼀个中间层NT驱动程序,应该⾸先确认你下层驱动程序所管理的设备,因为⼀个⾼层的驱动程序必须具有低层驱动程序绝⼤多数IRP_MJ_XXX例程⼊⼝。
⾼层驱动程序在接到I/O 请求时,在确定⾃⾝IRP当前堆栈单元参数有效的前提下,设置好IRP中下⼀个低层驱动程序的堆栈单元,然后再调⽤IoCallDriver 将请求传递给下层驱动程序处理。
⼀旦决定好了你的驱动程序应该处理哪些IRP_MJ_XXX,就可以开始确定驱动程序应该有多少个Dispatch例程。
当然也可以考虑把某些 RP_MJ_XXX处理的例程合并为同⼀例程处理。
例如在ChangerDisk 和 VDisk⾥,对IRP_MJ_CREATE和IRP_MJ_CLOSE处理的例程就是同⼀函数。
对IRP_MJ_READ和IRP_MJ_WRITE处理的例程也是同⼀个函数。
应该有多少个Device对象?⼀个驱动程序必须为它所管理的每个可能成为I/O请求的⽬标的物理和逻辑设备创建⼀个命名Device对象。
⼀些低层的驱动程序还可能要创建⼀些不确定数⽬的Device对象。
例如⼀个硬盘驱动程序必须为每⼀个物理硬盘创建⼀个Device对象,同时还必须为每个物理磁盘上的每个逻辑分区创建⼀个Device对象。
⼀个⾼层驱动驱动程序必须为它所代表的虚拟设备创建⼀个Device 对象,这样更⾼层的驱动程序才能连接它们的Device对象到这个驱动程序的Device对象。
USB从设备驱动实现流程
USB从设备驱动实现流程1.硬件初始化:首先需要对USB从设备的硬件进行初始化。
这包括配置USB接口和相关寄存器,分配内存用于数据传输等。
2. 设备描述符定义:USB设备需要提供设备描述符,以描述其功能、厂商信息等。
设备描述符是一个结构体,包含各种属性,如设备的VID (Vendor Id)、PID(Product Id)、设备类别等。
3.端点描述符定义:端点描述符用于描述设备的输入输出端点。
从设备可以有多个端点,包括控制端点、批量端点、中断端点和等时端点。
每个端点都有一个端点地址、传输方向、传输类型、包大小等属性。
B设备注册和初始化:驱动程序需要注册USB设备,并进行初始化。
这包括获取USB总线的指针,通过指针与USB总线进行通信,并与USB总线驱动进行通信。
5.数据传输:驱动程序需要实现数据的传输功能,包括收发数据。
从设备收到主机的请求后,驱动程序需要根据请求进行相应的操作,如读取设备信息、发送数据等。
6.中断处理:从设备在一些情况下可能会触发中断,如数据接收完成、传输超时等。
驱动程序需要实现中断处理函数来处理这些中断事件,以确保设备的正常工作。
7.错误处理:在驱动程序的实现过程中,可能会遇到一些错误,如传输超时、报文解析错误等。
驱动程序需要通过错误处理函数来对这些错误进行处理,如重试传输、重新配置设备等。
8.资源释放:当USB设备不再使用时,驱动程序需要释放相应的资源,如内存、中断处理函数等。
9.调试和测试:在驱动程序的实现过程中,可以使用调试工具对代码进行调试和测试,以确保程序的正确性和可靠性。
总结来说,USB从设备驱动的实现流程包括硬件初始化、设备和端点描述符定义、设备注册和初始化、数据传输、中断处理、错误处理、资源释放以及调试和测试等步骤。
通过这些步骤,可以使USB从设备与主机进行正常的通信和数据传输。
开发usb驱动程序的方法连载一
开发usb驱动程序的方法(连载一)开始驱动程序设计下面的文字是从Microsoft的DDK帮助中节选出来的,它让我们明白在开始设计驱动程序应该注意些什么问题,这些都是具有普遍意义的开发准则。
应该支持哪些I/O请求在开始写任何代码之前,应该首先确定我们的驱动程序应该处理哪些IRP例程。
如果你在设计一个设备驱动程序,你应该支持和其他相同类型设备的NT驱动程序相同的IRP_MJ_XXX 和IOCTL请求代码。
如果你是在设计一个中间层NT驱动程序,应该首先确认你下层驱动程序所管理的设备,因为一个高层的驱动程序必须具有低层驱动程序绝大多数IRP_MJ_XXX例程入口。
高层驱动程序在接到I/O 请求时,在确定自身IRP当前堆栈单元参数有效的前提下,设置好IRP中下一个低层驱动程序的堆栈单元,然后再调用IoCallDriver 将请求传递给下层驱动程序处理。
一旦决定好了你的驱动程序应该处理哪些IRP_MJ_XXX,就可以开始确定驱动程序应该有多少个Dispatch例程。
当然也可以考虑把某些 RP_MJ_XXX处理的例程合并为同一例程处理。
例如在ChangerDisk 和 VDisk里,对IRP_MJ_CREATE和IRP_MJ_CLOSE处理的例程就是同一函数。
对IRP_MJ_READ和IRP_MJ_WRITE处理的例程也是同一个函数。
应该有多少个Device对象?一个驱动程序必须为它所管理的每个可能成为I/O请求的目标的物理和逻辑设备创建一个命名Device对象。
一些低层的驱动程序还可能要创建一些不确定数目的Device对象。
例如一个硬盘驱动程序必须为每一个物理硬盘创建一个Device对象,同时还必须为每个物理磁盘上的每个逻辑分区创建一个Device对象。
一个高层驱动驱动程序必须为它所代表的虚拟设备创建一个Device 对象,这样更高层的驱动程序才能连接它们的Device对象到这个驱动程序的Device对象。
一文入门usb设备的驱动编写方法
一文入门usb设备的驱动编写方法USB设备驱动编写入门USB(通用串行总线)是一种广泛使用的协议,用于在计算机和外围设备之间建立通信渠道。
编写USB设备驱动程序需要对USB规范以及操作系统提供的底层机制有深入的理解。
1. 理解USB规范USB规范定义了设备之间的通信协议、设备类型和描述符格式等方面。
理解规范对于编写符合标准且能够与其他USB设备交互的驱动程序至关重要。
2. 选择操作系统平台不同操作系统对USB设备驱动程序的要求有所不同。
为Windows环境编写驱动程序与为Linux或macOS编写驱动程序具有不同的方法。
了解目标操作系统的特定要求至关重要。
3. 设置开发环境设置开发环境包括安装必要的工具和库。
这可能需要安装USB 开发工具包或编译器。
阅读操作系统的文档以设置正确的环境。
4. 创建USB描述符USB描述符是描述设备功能和配置的数据结构。
驱动程序需要创建这些描述符才能注册设备并向操作系统公开其功能。
5. 实现USB端点USB端点是设备与计算机之间的数据传输通道。
驱动程序需要实现端点处理程序来处理数据传输和控制请求。
6. 处理USB事件驱动程序需要处理各种USB事件,例如设备插入、拔出和配置更改。
实现事件处理程序来响应这些事件并更新设备状态。
7. 使用USB堆栈操作系统提供USB堆栈,为驱动程序提供与底层USB硬件接口的抽象层。
了解USB堆栈的API和功能对于与硬件交互至关重要。
8. 调试驱动程序调试USB设备驱动程序需要专门的工具和技术。
使用调试器、日志记录和分析工具来识别并解决问题。
9. 测试驱动程序在不同环境和条件下全面测试驱动程序至关重要。
执行功能测试、兼容性测试和压力测试以验证驱动程序的可靠性和稳定性。
10. 提交并分发驱动程序开发完成后,需要向操作系统供应商提交驱动程序以进行认证和分发。
遵守供应商的准则并提供必要的文档。
开发usb驱动程序的方法
开发驱动程序的方法(连载一)开始驱动程序设计下面的文字是从的帮助中节选出来的,它让我们明白在开始设计驱动程序应该注意些什么问题,这些都是具有普遍意义的开发准则。
应该支持哪些请求在开始写任何代码之前,应该首先确定我们的驱动程序应该处理哪些例程。
如果你在设计一个设备驱动程序,你应该支持和其他相同类型设备的驱动程序相同的和请求代码。
如果你是在设计一个中间层驱动程序,应该首先确认你下层驱动程序所管理的设备,因为一个高层的驱动程序必须具有低层驱动程序绝大多数例程入口。
高层驱动程序在接到请求时,在确定自身当前堆栈单元参数有效的前提下,设置好中下一个低层驱动程序的堆栈单元,然后再调用将请求传递给下层驱动程序处理。
一旦决定好了你的驱动程序应该处理哪些,就可以开始确定驱动程序应该有多少个例程。
当然也可以考虑把某些处理的例程合并为同一例程处理。
例如在和里,对和处理的例程就是同一函数。
对和处理的例程也是同一个函数。
应该有多少个对象?一个驱动程序必须为它所管理的每个可能成为请求的目标的物理和逻辑设备创建一个命名对象。
一些低层的驱动程序还可能要创建一些不确定数目的对象。
例如一个硬盘驱动程序必须为每一个物理硬盘创建一个对象,同时还必须为每个物理磁盘上的每个逻辑分区创建一个对象。
一个高层驱动驱动程序必须为它所代表的虚拟设备创建一个对象,这样更高层的驱动程序才能连接它们的对象到这个驱动程序的对象。
另外,一个高层驱动程序通常为它低层驱动程序所创建的对象创建一系列的虚拟或逻辑对象。
尽管你可以分阶段来设计你的驱动程序,因此一个处在开发阶段的驱动程序不必一开始就创建出所有它将要处理的所有对象。
但从一开始就确定好你最终要创建的所有对象将有助于设计者所要解决的任何同步问题。
另外,确定所要创建的对象还有助于你定义对象的的内容和数据结构。
开始驱动程序开发驱动程序的开发是一个从粗到细逐步求精的过程。
的\ 目录下有一个庞大的样板代码,几乎覆盖了所有类型的设备驱动程序、高层驱动程序和过滤器驱动程序。
USB开发步骤与方法
USB开发步骤USB开发步骤之标准篇通用串行总线(Universal Serial Bus)是用于将适用USB的外围设备连接到主机的外部总线结构,其主要是用在中速和低速的外设。
USB是通过PCI总线和PC的内部系统数据线连接,实现数据的传送。
USB同时又是一种通信协议,他支持主系统(host)和USB的外围设备(device)之间的数据传送,在USB的网络协议中,每个USB的系统有且只有一个host,因此,很多的朋友问我是否可以将两台PC的USB口通过A-A头连接起来,是否可以实现通信,这样是不行的,因为对于电脑主板上的USB设备,都是host,如果连起来就是两个host的通信,这样一来的一个USB的系统有了两个的host,与它的网络协议冲突。
Anchorchip 出了一个可以直接连接的设备(好象是AN2720SC),实际上是一个由两个背靠背的USB的device组合起来的一块芯片,要卖80多个刀乐,太贵了,呵呵!USB的优点有以下几条:USB为所有的USB外设提供了单一的、易于操作的标准的连接类型。
这样一来就简化了USB外设的设计,同时也简化了用户在判断哪个插头对应哪个插槽时的任务,实现了单一的数据通用接口。
USB排除了各个设备象鼠标、调制解调器、键盘和打印机设备对去系统资源的需求,因而减少了硬件的复杂性和对端口的占用,整个的USB的系统只有一个端口和一个中断,节省了系统资源。
USB支持热插拔(hot plug),也就是说在不关PC的情况下可以安全的插上和断开USB设备,动态的加载驱动程序。
其他普通的外围连接标准,如SCSI设备等必须在关掉主机的情况下才能增加或移走外围设备。
USB支持PNP。
当插入USB设备的时候,计算机系统检测该外设并且通过自动的加载相关的驱动程序来对该设备进行配置,并使其正常工作。
USB在设备供电方面提供了灵活性。
USB直接连接到Hub或者是连接到Host的设备可以通过USB电缆供电,也可以通过电池或者其它的电力设备来供电,或使用两种供电方式的组合.并且支持节约能源的挂机和唤醒模式。
USB上位机驱动程序环境搭建
USB上位机驱动程序环境搭建(一)WinXP SP1+DS3.2+XP DDK+VC6.0 分享修改我使用的是WinXP SP2+DS3.2+XP DDK+VC6.0英文版,以下为DS3.2版本的安装过程:1.安装英文原版Visual studio 6.0,同时要记住注册环境变量。
2.安装XPDDK,安装时候注意需要将所有的组件、工具、例子等都安装(避免出现头文件和链接库找不到的问题);3.安装DS3.2;4.通过DriverStudio菜单{C:\Documents and Settings\All Users\「开始」菜单\程序\Compuware DriverStudio\Develop}下的DDK Build Settings子菜单启动VC,不要去点桌面上的快捷方式。
5.用Open Workspace打开位于DS安装目录的……\DriverWorks\Source\vdwlibs.dsw。
6. 选择VC的Build菜单,选择batch Build,在之后的对话框中选择"Select x86",然后点击Rebuld all.等待编译成功,编译成功后,vdw_wdm.lib会在{E:\ProgramFiles\Compuware\DriverStudio\DriverWorks\lib\i386\checked(或是free)}下。
7. 打开位于……\DriverWorks\Examples\wdm\hellowdm.dsw,然后编译(用VC的编译和用DS增加的编译钮都可以)。
如果你可以在其目录中找到hellowdm.sys你就成功了。
如果程序报警:不能找到kcsq.h,可到{E:\ProgramFiles\Compuware\DriverStudio\DriverWorks\include}中找到。
8.使用Driver wizard生成用VC编译的项目后,修改项目属性中的Link,删除ntstrsafe.lib库的包含.重新编译驱动程序即可成功.(避免出现找不到ntstrsafe.lib库的错误)现在我们就可以编写USB驱动程序啦!!!。
USB驱动开发(一)
一USB的框架提到USB的框架,先看一张很经典的架构图总结一句话就是:设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有一个或多个设置,接口有零或多个端点。
设备描述符是用来记录设备的通用信息,比如供应商ID、产品ID和修订ID,支持的设备类、子类和适用的协议以及默认端点的最大包大小等struct usb_device_descriptor{_ _u8 bLength; //描述符长度_ _u8 bDescriptorType; //描述符类型编号_ _le16 bcdUSB; //USB版本号_ _u8 bDeviceClass; //USB分配的设备类code_ _u8 bDeviceSubClass; // USB分配的子类code_ _u8 bDeviceProtocol; //USB分配的协议code_ _u8 bMaxPacketSize0; //endpoint0最大包大小_ _le16 idVendor; //厂商编号_ _le16 idProduct; //产品编号_ _le16 bcdDevice; //设备出厂编号_ _u8 iManufacturer; //描述厂商字符串的索引_ _u8 iProduct; //描述产品字符串的索引_ _u8 iSerialNumber; //描述设备序列号字符串的索引_ _u8 bNumConfigurations; //可能的配置数量} _ _attribute_ _ ((packed));配置描述符可以包含一个或多个配置,比如USB设备的低功耗模式和高功耗模式可分别对应一个配置。
但是存在多个配置时,在使用USB设备前,必须为其选择一个合适的配置。
USB设备的每一个配置都必须有一个配置描述符。
struct usb_config_descriptor{_ _u8 bLength; //描述符长度_ _u8 bDescriptorType; //描述符类型编号_ _le16 wTotalLength; //配置所返回的所有数据的大小_ _u8 bNumInterfaces; // 配置所支持的接口数_ _u8 bConfigurationValue; //Set_Configuration命令需要的参数值_ _u8 iConfiguration; //描述该配置的字符串的索引值_ _u8 bmAttributes; //供电模式的选择_ _u8 bMaxPower; //设备从总线提取的最大电流} _ _attribute_ _ ((packed));接口描述符是用来实现某一个功能的,一个配置下面可以有多个接口,比如说:既可以播放音频又可以播放视频,这样就需要两个接口来实现了,接口是端点的集合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最新开发usb驱动程序的方法连载一开发usb驱动程序的方法(连载二)NT还有更多其他的对象,例如中断对象、Controller对象、定时器对象等等,但在我们开发的驱动程序中并没有用到,因此在这里不做介绍。
I/O缓冲策略很明显的,驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。
这就就设计到设备的I/O缓冲策略。
读写请求的I/O缓冲策略前面说到通过设置Device对象的Flag可以选择控制处理读写请求的I/O缓冲策略。
下面对这些缓冲策略分别做一介绍。
1、缓冲I/O(DO_BUFFERED_IO)在读写请求的一开始,I/O管理器检查用户缓冲区的可访问性,然后分配与调用者的缓冲区一样大的非分页池,并把它的地址放在IRP的AssociatedIrp.SystemBuffer域中。
驱动程序就利用这个域来进行实际数据的传输。
对于IRP_MJ_READ读请求,I/O管理器还把IRP的UserBuffer域设置成调用者缓冲区的用户空间地址。
当请求完成时,I/O管理器利用这个地址将数据从驱动程序的系统空间拷贝回调用者的缓冲区。
对于IRP_MJ_WRITE写请求,UserBuffer被设置为NULL,并把用户缓冲区的数据拷贝到系统缓冲区中。
2、直接I/O(DO_DIRECT_IO)I/O管理器首先检查用户缓冲区的可访问性,并在物理内存中锁定它。
然后它为该缓冲区创建一个内存描述表(MDL),并把MDL的地址存放在IRP的MdlAddress域中。
AssociatedIrp.SystemBuffer和 UserBuffer 都被设置为NULL。
驱动程序可以调用函数 MmGetSystemAddressForMdl得到用户缓冲区的系统空间地址,从而进行数据操作。
这个函数将调用者的缓冲区映射到非份页的地址空间。
驱动程序完成I/O请求后,系统自动从系统空间解除缓冲区的映射。
3、这两种方法都不是这种情况比较少用,因为这需要驱动程序自己来处理缓冲问题。
I/O管理器仅把调用者缓冲区的用户空间地址放到IRP的UserBuffer 域中。
我们并不推荐这种方式。
IOCTL缓冲区的缓冲策略IOCTL请求涉及来自调用者的输入缓冲区和返回到调用者的输出缓冲区。
为了理解IOCTL请求,我们先来看看WIN32 API DeviceIoControl函数的原型。
BOOL DeviceIoControl (HANDLE hDevice, // 设备句柄DWORD dwIoControlCode, // IOCTL请求操作代码LPVOID lpInBuffer, // 输入缓冲区地址DWORD nInBufferSize, // 输入缓冲区大小LPVOID lpOutBuffer, // 输出缓冲区地址DWORD nOutBufferSize, // 输出缓冲区大小LPDWORD lpBytesReturned, // 存放返回字节数的指针LPOVERLAPPED lpOverlapped // 用于同步操作的Overlapped结构体指针);IOCTL请求有四种缓冲策略,下面一一介绍。
1、输入输出缓冲I/O(METHOD_BUFFERED)I/O管理器首先分配一个非分页池,它足够大地存放调用者的输入或输出缓冲区(不管哪个更大)。
非分页缓冲区的地址放在IRP的AssociatedIrp.SystemBuffer域中,然后把IOCTL的输入数据拷贝到这个非份页缓冲区中,并把IRP的UserBuffer域设置成调用者输出缓冲区的用户空间地址。
当驱动程序完成IOCTL请求时,I/O管理器将这个非份页缓冲区中的数据拷贝到调用者的输出缓冲区。
注意这里同一个非份页池同时用于输入和输出缓冲区,因此驱动程序在向缓冲区写东西之前应该把输入的所有数据读出来。
2、直接输入缓冲输出I/O(METHOD_IN_DIRECT)I/O管理器首先检查调用者输入缓冲区的可访问性,并在物理内存中将其锁定。
然后为该输入缓冲区创建一个MDL,并把指定该MDL的指针存放到IRP的MdlAddress域中。
同时,I/O管理器还在非份页池中分配一输出缓冲区,并把这个缓冲区的地址存放在IRP的AssociatedIrp.SystemBuffer域中,并把IRP的UserBuffer 域设置成调用者输出缓冲区的用户空间地址。
当驱动程序完成IOCTL请求时,I/O管理器将非份页缓冲区中的数据拷贝到调用者的输出缓冲区。
3、缓冲输入直接输出I/O(METHOD_OUT_DIRECT)I/O管理器首先检查调用者输出缓冲区的可访问性,并在物理内存中将其锁定。
然后为该输出缓冲区创建一个MDL,并把指定该MDL的指针存放到IRP的MdlAddress域中。
同时,I/O管理器还在非份页池中分配一输入缓冲区,并把这个缓冲区的地址存放在IRP的AssociatedIrp.SystemBuffer域中,同时把调用者用户输入缓冲区中的数据拷贝到系统缓冲区中,并把IRP的 UserBuffer域设置为NULL。
4、上面三种方法都不是(METHOD_NEITHER)I/O管理器把调用者的输入缓冲区的地址放到IRP当前I/O堆栈单元的Parameters.Devi ceIoControl.TypeInputBuffer域中,把输出缓冲区的地址存放到IRP的UserBuffer域中。
这两个地址都是用户空间地址。
从上面的说明可以看出,在执行缓冲I/O时,I/O管理器将在非份页池中分配内存,如果调用者的缓冲区比较大时,分配的非份页池也将比较大。
非份页池是系统比较宝贵的资源,因此,如果调用者的缓冲区比较大时,我们一般采用直接I/O的方式(例如磁盘读写请求等),这样不仅节省系统资源,另一方面由于省去了I/O管理器在系统缓冲区和调用者缓冲区之间的数据拷贝,也提高了效率,这对存在大量数据传送的驱动程序尤其明显。
可以注意到DDK中的Samples下,几乎所有的例程的读写请求都是直接I/O的,而对于IOCTL请求则是缓冲区I/O的居多开发usb驱动程序的方法(连载三)NT驱动程序的分层结构驱动程序是指管理某个外围设备的一段程序代码。
NT采用更灵活的分层驱动方法,允许杂应用程序和硬件之间存在几个驱动程序层次。
分层机制允许NT更加广泛地定义驱动程序,包括文件系统、逻辑卷管理器和各种网络组件,各种物理设备驱动程序等等。
1、设备驱动程序这些是管理实际数据传输和控制特定类型的物理设备的操作的驱动程序,包括开始和完成I/O操作,处理中断和执行特定的设备要求的任何差错处理。
2、中间驱动程序NT允许在物理设备驱动程序上分层任意数目的中间驱动程序。
这些中间层次提供扩展I/O系统的功能一种方法,而不必修改底层的驱动程序。
这也是微软鼓吹的他们的系统灵活的一面!实际上我觉得这样反而牺牲了一些效率上的东西。
3、文件系统驱动程序(FSD)FSD是一类比较特殊的驱动程序,通常负责维护各种文件系统所需要的磁盘结构。
注意我们并不能使用DDK来开发FSD,而必须使用Microsoft的文件系统开发人员工具包。
一般比较少写中间过滤驱动程序,过滤驱动程序它截获和修改高层发送给类驱动程序的请求。
这样就允许利用现有类驱动程序的功能,而不必从头开始写所有程序。
NT内核模式对象在我们的实际开发过程中的对象是设备,由于端口驱动程序已经隐藏了硬件控制操作,因此我在这里不讲述跟硬件相关的部份。
如果今后的开发对象不同,需要对硬件进行操作的时候,可能会对中断、DMA等有比较详细的了解,这些内容可以参考DDK帮助。
usb设备开发实例通用串行总线(Universal Serial Bus USB),是一种快速、灵活的总线接口。
与其它通信接口比较,USB接口的最大特点是易于使用,这也是USB的主要设计目标。
作为一种高速总线接口,USB适用于多种设备,比如数码相机、MP3播放机、高速数据采集设备等。
易于使用还表现在USB接口支持热插拔,并且所有的配置过程都由系统自动完成,无需用户干预。
USB接口支持1.5Mb/s(低速)、12Mb/s(全速)和高达480Mb/s(USB 2.0规范)的数据传输速率,扣除用于总线状态、控制和错误监测等的数据传输,USB的最大理论传输速率仍达1.2Mb/s或9.6Mb/s,远高于一般的串行总线接口。
USB接口芯片价格低廉,一个支持USB 1.1规范的USB接口芯片价格大多在$1~2之间,跟一个232或485接口芯片价格差不多,这也大大促进USB设备的开发与应用。
在进行一个USB设备开发之前,首先要根据具体使用要求选择合适的USB控制器。
目前,市场上供应的USB控制器主要有两种:带USB接口的单片机(MCU)或纯粹的USB接口芯片。
带USB接口的单片机从应用上又可以分成两类,一类是从底层设计专用于USB控制的单片机,比如Cypress公司的CY7C63513(低速)、CY7C64013(全速),但由于价格、开发工具以及单片机性能有限等问题,所以一般不推荐选用。
另一类是增加了USB接口的普通单片机,例如Intel公司的8X931(基于8051)、8X930(基于高速、增强的8051)、Cypress公司的EZ-USB(基于8051),选择这类USB控制器的最大好处在于开发者对系统结构和指令集非常熟悉,开发工具简单,但对于简单或低成本系统,价格高将会是最大的障碍。
一般来说,后者的价格是前者价格的10倍。
纯粹的USB接口芯片仅处理USB通信,必须有一个外部微处理器来进行协议处理和数据交换。
典型产品有Philips公司的PDIUSBD11(I2C接口)、PDIUSBD12(并行接口),NS公司的USBN9603/9604(并行接口),NetChip公司的NET2888等。
USB接口芯片的主要特点是价格便宜、接口方便、可靠性高,尤其适合于产品的改型设计(硬件上仅需对并行总线和中断进行改动,软件则需要增加微处理器的USB中断处理和数据交换程序、PC机的USB接口通信程序,无需对原有产品系统结构作很大的改动)。
在选定USB控制器以后,如果是带USB接口的单片机,则是一般单片机应用系统的开发;反之,就是如何把USB接口芯片与单片机应用系统融合的问题,一般USB接口芯片都支持多种并行总线结构(复用/非复用),可以方便的与多种单片机接口。
硬件设计中要注意的就是USB接口芯片的时钟速度比较高,如果芯片内部没有PLL来倍频,则外部晶体振荡电路(多数在48MHz)的设计就应该特别注意,包括晶体的选择(负载电容大小)、匹配网络的设计以及PCB布线。
USB设备的软件设计主要包括两部分:一是USB设备端的单片机软件,主要完成USB协议处理与数据交换(多数情况下是一个中断子程序)以及其它应用功能程序(比如A/D转换、MP3解码等)。