USB驱动开发

合集下载

STM32自定义USB设备开发详细流程讲解及全套资料源码下载

STM32自定义USB设备开发详细流程讲解及全套资料源码下载

11
0xE0,
/* bmAttributes: Bus powered */
12
/*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
13
0xFA,
/* MaxPower 500 mA: this current is used for detecting Vbus */
10 {
11
CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
12
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/
13
// Manufacturer: "STMicroelectronics"
03 {
04
CUSTOMHID_SIZ_STRING_LANGID,
05
USB_STRING_DESCRIPTOR_TYPE,
06
0x09,
07
0x04
08 }; /* LangID = 0x0409: U.S. English */
09 const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
18
0x00,
/* bInterfaceNumber: Number of Interface */
19
0x00,
/* bAlternateSetting: Alternate setting */
20

智能家居监控系统USB摄像头驱动的开发与实现

智能家居监控系统USB摄像头驱动的开发与实现
i f US i tra e US g、 B ne fc 、 B
— _
D v e r es一 >/选择 U p ot S pr 一 > 】 u
— - — — — —
US u p r Bsp o t
{} S p o r o ts eU B u p rf s- i S t oH d
像 头是 U B .协议的。 S1 1 U B只是一个总线 , S 只提供一个数据通路 。 S U B总线 驱动程序并不知道一个设备具体如何操作 , 有哪些行 为。 个设备具体实现什么功能 , 由设备 自己来决定 。 于 要 对

译进 内核 , 具体实现如下 :
ma eme u o fg k n cn i
h s e di t ot npo 表示 ,它 们之 间的 n
关系如图 3 所示 。
D v e r es一 > / ei i r cD v / 选择设备 Z 3 1 C 0
< >M utme i u p r 一 l i das p o t > 木 木M ut e i o es p o t 宰术 术 li d ac r u p r 水 m <水 Vi e o i u > d 0F rL n x
[ U Bdv e l yt (E R C T D 木 S ei e s m D P E A E ) 】 cf s e i
[ U Bdv e l sdvcs E R C T D S ei a - ei ( P E A E ) ] ccs eD
< > OHCIHCD u p r sp o t
译进入 内核 , 内核初始化时 自动加载 , 在 本设计采用 的是 编译进 内核的方式 。 由于在 Lnx 2 . . iu一 .3 6的内核 中已有 68 Z 0 0 的驱 动代码 , C31 我们只需要修改 配置菜 单 , 使其 编

WindowsCE下USB摄像头驱动开发以OV511为例附带全部源代码以及讲解

WindowsCE下USB摄像头驱动开发以OV511为例附带全部源代码以及讲解

这部分讲解如何在Windows 下实现 一样的功能。
Windows 的控制传输
查看MSDN,IssueControlTransfer和 IssueVendorTransfer是用来进行控制传输的,但两个函数 有什么区别呢? 看MSDN,IssueControlTransfer的第一个参数是 hPipe,就是说,在使用IssueControlTransfer之前,必须 用OpenPipe打开管道。 OpenPipe函数需要端点描述作为参数。但是,端点0是 没有这个描述可以用的(MSDN: However, endpoint zero (0) never has a USB_ENDPOINT structure)。 我没测试自己指定描述是否可以,但是, IssueVendorTransfer提供了更为方便的途径。这个函数默 认从端点0进行控制传输。 如果是其他端点的控制传输,是要用 IssueControlTransfer的。
Windows 下 流接口USB驱动程序加载的流程
6.接着CAM_Init函数被调用,参数就是ActiveDevice函数的 参数1,然后依据这个参数,在注册表中找到USB驱动程序的上下 文,并返回,这样对该流接口驱动的操作,就可以找到USB驱动 的上下文,并且交换数据。 以上这些工作完成之后,USB设备的信息被保存,并且USB 驱动程序上下文也被流接口驱动所记载。流接口USB驱动的加载 完成。我们就看见那个输入驱动程序名称的对话框消失了。如果前 面6个步骤中任何一步不成功,将不会使用这个驱动程序,会反复 弹出这个对话框,提示输入驱动程序名称,直到这些过程全部正确 完成。
HKEY_LOCAL_MACHINE\Drivers\Active中的项目。 注意:USB驱动程序不通过注册表API来操作注册表,而是通过 USBD提供的函数。

linux usb wifi驱动开发原理

linux usb wifi驱动开发原理

linux usb wifi驱动开发原理Linux USB WiFi驱动开发原理一、引言随着无线网络的普及,WiFi成为了人们生活中不可或缺的一部分。

而在Linux操作系统中,为了支持各种WiFi设备,需要进行对应的驱动开发。

本文将介绍Linux USB WiFi驱动开发的原理和过程。

二、USB WiFi驱动开发的基本原理1. USB接口USB(Universal Serial Bus)是一种通用的串行总线标准,用于连接计算机与外部设备。

USB WiFi设备通过USB接口与计算机通信,传输数据和控制命令。

2. 驱动程序驱动程序是用于操作和控制硬件设备的软件。

USB WiFi驱动程序负责与USB WiFi设备进行通信,实现数据的传输和接收。

驱动程序需要与操作系统紧密结合,通过操作系统提供的API接口与设备进行交互。

三、USB WiFi驱动开发的过程1. 设备识别与初始化USB WiFi设备插入计算机后,操作系统会通过USB子系统进行设备的识别和初始化。

在Linux系统中,USB设备的识别和初始化由USB核心驱动完成。

核心驱动会根据设备的VID(Vendor ID)和PID (Product ID)来匹配对应的驱动程序。

2. 驱动程序注册驱动程序需要在Linux系统中进行注册,以便系统能够正确识别和加载驱动。

注册过程通常包括向系统注册设备类型、设备ID等信息。

3. 设备操作接口的实现驱动程序需要实现设备操作接口,包括设备的打开、关闭、读取数据、写入数据等功能。

这些操作接口是通过USB子系统提供的API 来实现的。

4. 数据传输与控制USB WiFi驱动程序需要实现数据的传输和控制功能。

数据传输主要包括从设备读取数据和向设备写入数据,而控制功能包括设置设备参数、配置网络等操作。

5. 错误处理与调试在USB WiFi驱动开发中,错误处理和调试是非常重要的一部分。

驱动程序需要处理各种异常情况,如设备断开连接、传输错误等。

CE中USB HID设备驱动开发

CE中USB HID设备驱动开发

一. 理解: CE中USB HID设备的工作流程要想知道如何去设计一个自己的HID设备的驱动程序. 那么对CE中的USB HID设备工作的流程的初步了解是十分必要的. Microsoft公司已经在CE系统中增加了键盘/鼠标两种HID设备的驱动. 我们就从键盘驱动入手.CE的所有USB程序都在public\common\oak\drivers\usb下面. 在该文件夹下,分成了CLASS,CLIENTS,COMMON,HCD,INC,USBD几个文件夹,其中INC和COMMON里面有一个lock.c的程序,这个程序很明显是将要被其他USB有关的驱动程序所使用的一个锁,代码很简单,只是一个类似临界区的封装体,可以保护多线程对同一内存区域的读写访问,可以先不去管它。

CLIENTS文件夹可能最初微软的开发人员是用来放置设备驱动程序的,但是后来没有放,而发布的时候也没有删除,所以遗留了下来,里面是个空的文件夹,所以没用实际用处。

USBD和HCD是前述的底层驱动,里面含有很多子文件夹和程序,由于我们只针对USB设备驱动,因此对这两部分不做分析,有兴趣的朋友可以自己去了解. 重点就在CLASS文件夹了,展开来看,里面又包含了COMMON、HID、PRINTER、STORAGE几个文件夹,同样,COMMON里面存放的源程序是为HID、PRINTER、STORAGE 所共有的。

HID是USB输入设备如键盘/鼠标的样例驱动程序,PRINTER是USB打印机的样例驱动程序,STORAGE 是USB存储设备如U盘的样例程序.我们在这篇文章中只讲如何设备USB HID设备驱动. 因此我们只看HID路径下的所有程序.在HID下有CLIENTS和HIDCLASS两个文件夹. HIDCLASS里有所有HID设备驱动的共用代码(MDD和PDD). 我们在这里暂时不讲述.对于一个对CE系统不是非常熟悉的新手来说. 要想知道USB HID设备自插入后. 在Windows CE这个黑盒子里是怎么运行的. 里面到底发生了什么事. 我个人觉得最好在每个程序里设置一些标记. 通过串口将里面所发生的事情传出来并打印到我们的调试PC上面. 我们可以用:RETAILMSG(1, (TEXT(“HIDDeviceNotifications---conshid\r\n”)));来告诉程序员此时调用了conshid.cpp文件下的HIDDeviceNotifications函数.在将HID路径下所有的函数中增加了标记后. 编译.. 下栽…运行… 插入一个USB键盘后. 从串口处的到的信息如下:>DllEntry--usbhid (1)>HidMdd_DllEntry--hidmdd>USBDeviceAttach--usbhid>ParseUsbDescriptors--setup (4)>CreateHidInterface--setup (5)>Init--hidmdd>HID_Init--usbhid>SetUsbInterface--setup>SetReportProtocol--setup>GetReportDescriptor--setup>SetQueuedTransfers--setup>HidMdd_Attach--hidmdd (6)InitializeTLCStructures--hidmdd>LoadHidClients--hidmdd>FindClientRegKey--hidmdd>OpenClientRegKey--hidmdd>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:2362_9488_256>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:2362_9488>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:2362>OpenSpecificClientRegKey--hidmdd>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:0_1>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:0>OpenSpecificClientRegKey--hidmdd>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:1_2MOUHID DllEntry! (7)Mouse Attached!>AllocateUsageLists--mouhidCreateInterruptThread--setupMouseThreadProc!>InterruptThreadProc--setup>StartInterruptTransfer--setup>StartInterruptTransfer--setup>StartInterruptTransfer--setup>StartInterruptTransfer--setup>USBDeviceNotifications--usbhid>USB_CLOSE_DEVICE>HidMdd_Notifications--hidmddFreeHidContext--hidmdd>HIDDeviceNotifications--mouhidMouse moved!MOUHID DllEntry!>StartInterruptTransfer--setup>DllEntry--usbhid>HidMdd_DllEntry--hidmdd从以上的信息我们可以看出. 一插入USB鼠标. 系统就会调用usbdhid.cpp中的DllEntry这个动态链接库的入口函数. 这个比较好理解. 然后系统将调用hidmdd中的HidMdd_DllEntry函数. 这两个函数所做的工作不多. 我们基本可以不用太关心这两个函数.一旦系统发现有新的HID设备.usbhid中的USBDeviceAttach这个函数被调用. USBDeviceAttach中又调用(4)ParseUsbDescriptors主要是分析此USB设备的描述符. 在分析此USB设备为HID类设备后. 调用(5)CreateHidInterface. 主要是建立一个HID设备上下文. 并给这个设备上下文赋值. 这里的提一下. 在CreateHidInterface函数中调用了HidMdd_Attach这个函数. 传给这个函数的参数为分析得到的USB设备的描述符.这个在第(6)步可以看的出来. 在HidMdd_Attach中产生一个HID设备上下文.我怀疑这个函数中调用的那个HidP_GetCollectionDescription是处理HID设备的驱动文件位置有关系.但这个函数只是PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL下的一个库文件中的函数. 见hidparse.def. 这个函数的参数主要是设备报告描述符和PHID_CONTEXT指向HID设备上下文的指针. 在*PHID_CONTEXT结构中我们看到有HidTLCQueue *pQueues.和一个struct _HID_CLIENT_HANDLE元素. 还有就是HID设备的其他描述符号HIDP_DEVICE_DESC及设备句柄._HID_CLIENT_HANDLE结构在hiddi.h中可以看出来. 里面有DWORD dwUsagePage;和DWORD dwUsage;在HidMdd_Attach用InitializeTLCStructures初始化该上下文. 最后用LoadHidClients 函数加载这个USB HID设备. 在LoadHidClients中寻找并注册本USB设备注册键.调用FindClientRegKey. 这个函数的参数有两个. &driverSettings. pClientHandle->driverSettings.类型分别是:HID_DRIVRE_SETTINGS 和PHID_CLIENT_HANDLEFindClientRegKey调用OpenClientRegKey函数. 这是根据HID设备的信息来寻找驱动.在OpenClientRegKey函数中多次调用OpenSpecificClientRegKey寻找匹配的HID设备.在OpenSpecificClientRegKey中我们在pszKey = szBuf;后面加一条调试信息:RETAILMSG(1,(TEXT("OpenSpecificClientRegKey key string:%s\r\n"),pszKey));调试信息如下. OpenSpecificClientRegKey key string:2362_9488_256 (21A)>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:2362_9488 (21B)>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:2362 (21C)>OpenSpecificClientRegKey--hidmdd>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:0_1 (31A)>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:0 (31B)>OpenSpecificClientRegKey--hidmdd>OpenSpecificClientRegKey--hidmddOpenSpecificClientRegKey key string:1_2 (41A)通过PC上的USB device viewer软件可以看出这个鼠标的idVendor/idProduct/bcdDevice分别是:0x093A/0x2510/0x0100. 转成十进制为:2362/9488/256与第一次得到的注册字键字符串吻合.这个鼠标的接口描述符中的bInterfaceClass/bInterfaceSubClass/bInterfaceProtocol分别是: 0x03 / 0x01 / 0x02. 这个与最后一个字符串相符. 但中间的0_1和0就不明白.当我一直在为驱动程序的注册表位置与HID设备类型的关系而绞尽脑汁时候.看到OpenClientRegKey函数有一段Microsoft的注释:可能是微软为了加快读者对这个问题的理解而特别写的注释.// The order of verndor precedence is described below.//// idVendor_idProduct_bcdDevice (21A)// idVendor_idProduct (21B)// idVendor (21C)// Default// The order of interface precedence is described below.//// bInterface_bCollection (31A)// bInterface (31B)// Default// The order of TLC precedence is//// UsagePage_Usage (41A)// UsagePage// Default// So the order of checking would be (50A)// 1.idVendor_idProduct_bcdDevice\bInterface_bCollection\UsagePage_Usage// 2.idVendor_idProduct_bcdDevice\bInterface_bCollection\UsagePage// .....// 42.Default\bInterface_bCollection\Default// 43.Default\bInterface\UsagePage_Usage// 44.Default\bInterface\UsagePage// 45.Default\bInterface\Default// 46.Default\Default\UsagePage_Usage (54_7A)// 47.Default\Default\UsagePage// 48.Default\Default\Default大家再看下common.reg下的[HKEY_LOCAL_MACHINE\Drivers\HID\LoadClients\Default\Default\1_2\Mouse] (61A)"DLL" = "MOUHID.DLL"这里的MOUHID.DLL正是我们的的USB鼠标的驱动程序. 那么在注册表文件中. 这个1_2是什么意思呢?从以上的注释的出的结论就是1_2原来就是设备的UsagePage_Usage. 而不是设备描述符的bInterfaceSubClass/bInterfaceProtocol.搜索的顺序应该是以50A以下的48种方式搜索. 我们在common.reg下定义的注册位置就是按照(54_7A)方式来存放的.这两个数据在FindClientRegKey中是由rgdwTLCVals[]传给OpenClientRegKey函数的.首先看bInterface_bCollection两个数据是怎么的到的.在FindClientRegKey函数中.看到:const DWROD rgdwInterfaceVals[]={pDriverSettings->dwInterfaceNumber,pDriverSettings->dwCollection};这个rgdwInterfaceVals是OpenClientRegKey的一个参数. 这个也是在寻找驱动时候的一个依据bInterface_bCollection. rgdwInterfaceVals是由LoadHidClients函数的第5个参数DWORD dwInterface赋值pDriverSettings->dwInterfaceNumber = dwInterface;pDriverSettings->dwCollection = pCollection->CollectionNumber;而PHIDP_COLLECTION_DESC pCollection = &pHidContext->hidpDeviceDesc.CollectionDesc[dwIdx]赋值的. 首先跟踪dwInterface其实是HidMdd_Attach中第7个参数. HidMdd_Attach是被setup.cpp中的CreateUsbHidDevice函数调用的. 看到CreateUsbHidDevice调用HidMdd_Attach的第7个参数其实就是pUsbHid->pUsbInterface->Descreiptor.bInterfaceNumber.这个其实就是在USB设备的接口描述符Interface Descriptor中的接口序列号. 在我的USB鼠标中只有一个接口. 因此在结构描述符(Configuration Descriptor)中的bNumInterfaces数值为1. bInterfaceNumber也就是只有0了. 而在我的USB键盘结构描述符(Configuration Descriptor)中的bNumInterfaces数值为2. 因此这个设备就有两个接口啦. 两个接口从0开始. 分别为0和1. 可以从下面的USB键盘所打印的信息看出以上的理解也是对的;还有bCollection是由&pHidContext->hidpDeviceDesc.CollectionDesc[dwIdx]->CollectionNumber的来的. 最后是从USB设备上下文HID_CONTEXT中的HIDP_DEVICE_DESC hidpDeviceDesc的来的.HIDP_DEVICE_DESC 就是HID设备的HID描述符. 比如下是另一个USB键盘的HID描述符组合:U8 HID_ReportDescriptor[63] = { //键盘. 可以通过使用HID Descriptor tool来生成,这个工具可以到下载//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION0xa1, 0x01, // COLLECTION (Application)//表示用途页为按键0x05, 0x07, // USAGE_PAGE (Keyboard)//用途最小值,这里为左ctrl键0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)//用途最大值,这里为右GUI键,即window键0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)//逻辑最小值为00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值为10x25, 0x01, // LOGICAL_MAXIMUM (1)//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为10x75, 0x01, // REPORT_SIZE (1)//报告的个数为8,即总共有8个bits0x95, 0x08, // REPORT_COUNT (8)//输入用,变量,值,绝对值。

winusb设备的开发方法

winusb设备的开发方法

winusb设备的开发方法
开发WinUSB设备涉及一些复杂的步骤和概念,需要一定的专业
知识和经验。

以下是开发WinUSB设备的一般步骤和方法:
1. 硬件设计,首先需要设计和制造符合WinUSB标准的硬件设备。

这可能涉及选择合适的芯片、接口和电路设计。

2. 驱动程序开发,WinUSB设备需要相应的驱动程序来与Windows操作系统进行通信。

通常使用微软提供的WinUSB驱动框架
来开发驱动程序。

开发驱动程序需要熟悉Windows Driver Kit (WDK) 和 Windows Driver Framework (WDF)。

3. USB描述符配置,在设备固件中配置USB描述符,以确保设
备能够正确地与Windows系统进行通信。

描述符包括设备描述符、
配置描述符、接口描述符等。

4. 测试和调试,在开发过程中需要进行大量的测试和调试工作,确保设备和驱动程序的稳定性和兼容性。

可以使用微软提供的HLK (Windows Hardware Lab Kit) 进行测试。

5. 证书签名,最终的WinUSB驱动程序需要通过微软的数字签名认证,以确保安全性和兼容性。

这需要申请和获取相应的数字证书。

需要注意的是,开发WinUSB设备需要一定的专业知识和经验,包括硬件设计、驱动程序开发、USB协议等方面的知识。

此外,开发过程中可能会遇到各种问题和挑战,需要耐心和细心地解决。

最好的方法是参考微软官方文档和开发者社区的经验,以及与经验丰富的开发者进行交流和讨论。

USB设备的驱动程序实现

USB设备的驱动程序实现

USB设备的驱动程序实现
USB驱动是用来控制使用USB接口的设备的软件程序,其实现是将实
际的硬件设备抽象为虚拟的设备,使其能够在计算机操作系统上应用。


般来讲,当你将USB设备插入你的计算机时,它将通过计算机的USB主控
芯片找到USB设备,然后测试它的功能,并决定它是否能够被用来通信,
最后安装相应的驱动程序。

实际的USB驱动程序的实现有若干方法,其中
有两种常用的技术:应用程序编程接口(API)和驱动程序模板。

1、应用程序编程接口(API)
API是一组用于访问操作系统提供的服务和功能的特殊指令序列。


用程序编程接口(API)可以用来创建USB驱动程序,其实现包括以下步骤:
(1)定义硬件设备的描述
在编写USB驱动程序时,首先需要定义硬件设备,即定义设备的功能,记录其编号、最大支持通信速率、硬件连接方式、发送和接收设备数据的
方式以及支持的驱动软件要求等信息。

(2)实现设备驱动的关键函数
关键函数是控制USB设备正常工作所必需的函数,包括初始化函数、
发送和接收数据的函数、获取设备状态的函数以及关闭设备的函数等。

WinCE6.0下双模终端的USB转串口驱动开发

WinCE6.0下双模终端的USB转串口驱动开发
关键词 : n E . ; 模终端 ;S WiC 6 0 双 U B转 串 口
0 引 言
我国 3 G牌 照 的 发放 , 宣告 了 3 时代 的到 来 , G
基于 T —C MA和 C MA WC MA 的双 模 终 端 将 DS D D / D 取代 2 时代 的单 模 终 端 。诺 基亚 、 星 、 为 、 G 三 华 中 兴等 国 内外 通 信 厂 商 都 积 极 投 入 到 双 模 手 机 终 端 的开发 中来 , 目前 双模 手 机终 端 的研发 已经 成 为热 点 。当前市场 中主要 的智 能手 机操 作 系统 有 : o i N ka 主推 的 Sm in 开 放 内核 的嵌 入 式 Ln x 微 软 的 y ba , iu , WiC n E等 。由于 WiC 6 0嵌人 式 系统具 有实 时性 n E.
Wi E. U B设备驱动开发只提供了一些底层支持 n 60对 S C
的原因, 以通 信 模 块 厂 商 未 提 供 WiC 6 0下 的 所 nE .
U B驱 动 , 要 实 现 通 信 模 块 的基 本 功 能 , 开 发 S 而 除
纯 U B驱 动 外 , WiC 6 0下 , 需 要 修 改 Mo S 在 nE. 还 . d m源码 , e 存在 着开 发 周 期 长 、 作量 大 、 容 性 差 工 兼 等 问题 , 给开发 人 员带 来 了极 大 的不 便 。而通 过 串 口直接对 Mo e dm进 行操作 , 不仅 避 免 了上述 在开 发 中存 在 的问 题 , 时 由于操 作 Mo e 的 是 虚 拟 串 同 dm 口, 由它来 适 配 Moe 不 会 出 现 由物 理 串 口操 作 d m, Mo e 时制 约 M d m处理速 率 的问题 , 然保持 了 dm oe 仍 U B高 速的特 点 , 开 发人 员 只 需 开发 出对应 模 块 S 故 的 U B转 串 口驱 动 亦 可实 现 上 网 、 电话 等 功 能 ; S 打
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第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 方式连接设备时,所有的外设都在机箱外连接,连接外设不必再打开机箱;允许外设热插拔,而不必关闭主机电源。

USB 采用“级联”方式,即每个USB 设备用一个USB 插头连接到另一个外设的USB 插座上,而其本身又提供一个USB 插座供下一个USB 外设连接用。

通过这种类似菊花链式的连接,一个USB 控制器可以连接多达127个外设,而每个外设间距离(线缆长度)可达5米。

USB 能智能识别USB 链上外围设备的插入或拆卸。

它可使多个设备在一个端口上运行,速度也比现在的串行口或并行口快得多,而且其总的连线在理论上说可以无限延长。

对PC 来说,以上这些都是一些难得的优点,因为不再需要PS/2端口、MIDI 端口等各种不同的端口了,还可以随时随地在各种设备上任意插拔。

可以在一个端口上运行鼠标、控制手柄、键盘以及其他输入装置(例如数码相机),而且,也不必重新启动系统去做这些工作。

现在USB 设备正在快速增多,且由于操作系统已内置支持USB 的功能,因而用户现在就可以方便地使用。

显然,USB 为PC 的外设扩充提供了一个很好的解决方案。

目前USB 技术的发展,已经允许用户在不使用网卡、HUB 的情况下,直接通过USB 技术将几台计算机连接起来组成小型局域网,用户只需要给各台计算机起个名字就可以开始工作。

这种网络具备Ethernet 网络的各种优点,同时少了Ethernet 网络的许多限制。

假设一位用户上班时使用笔记本电脑,回家时使用PC 机,为实现数据传输,他可以通过采用USB 技术的接口将两部电脑连接起来交换资源,其数据传输速度可达12Mbps ,这是传统串行口无法比拟的。

而且用户在组网的时候根本无须考虑DIP 、IRQ 等问题。

此类技术除支持兼容Ethernet 的软硬件外,也支持标准的网络通信协议,包括IPX/SPX 、NetBEUI 和TCP/IP ,这为通过USB 技术组成的小局域网连接至大型网络或Internet 提供了条件。

17.1.2 USB 连接拓扑结构USB 设备的连接如图17-2所示,对于每个PC 来说,都有一个或者多个称为Host 控制器的设备,该Host 控制器和一个根Hub 作为一个整体。

这个根Hub 下可以接多级的Hub ,每个子Hub 又可以接子Hub 。

每个USB 作为一个节点接在不同级别的Hub 上。

(1)USB Host 控制器:每个PC 的主板上都会有多个Host 控制器,这个Host 控制器其实就是一个PCI 设备,挂载在PCI 总线上。

Host 控制器的驱动由微软公司提供,如图17-3所示,这是笔者PC 中的Host 控制器及USB Hub 的驱动。

值得注意的是,这里Host 分别有两种驱动,一种是1.0,另一种是2.0,分别对应着USB 协议1.0和USB协Windows 驱动开发技术详解432 议2.0。

第17章 USB 设备驱动433图17-2 USB 连接拓扑结构(2)USB Hub :每个USB Host 控制器都会自带一个USB Hub ,被称为根(Root)Hub 。

这个根Hub 可以接子(Sub)Hub ,每个Hub 上挂载USB 设备。

一般PC 有8个USB 口,通过外接USB Hub ,可以插更多的USB 设备。

当USB 设备插入到USB Hub 或从上面拔出时,都会发出电信号通知系统。

这样可以枚举USB 设备,例如当被插入的时候,系统就会创建一个USB 物理总线,并询问用户安装设备驱动。

如图17-4所示为一个典型的USB Hub 的示意图。

图17-3 USB Host 和USB Hub 驱动 图17-4 USB Hub 示意图 (3)USB 设备:USB 设备就是插在USB 总线上工作的设备,广义地讲USB Hub 也算是USB 设备。

每个根USB Hub 下可以直接或间接地连接127个设备,并且彼此不会干扰。

对于用户来说,可以看成是USB 设备和USB 控制器直接相连,之间通信需要满足USB 的通信协议。

有的USB 设备功能单一,直接挂载在USB Hub 上。

而有的USB 设备功能复杂,会将Windows 驱动开发技术详解434 多个USB 功能连在一起,成为一个复合设备,它甚至可以自己内部带一个Hub ,这个Hub 下接多个USB 子设备,其和多个子设备作为一个整体当做一个USB 设备,如图17-5所示。

以上是USB 的物理拓扑结构,但对于用户来说,可以略去USB Hub 的概念,或者说USB Hub 的概念对于用户可以看成是透明的。

用户只需要将USB 设备理解成一个USB Host 连接多个逻辑设备。

可能逻辑设备1和逻辑设备2是集中在第一个物理设备里,例如有的手机连接计算机后,系统会当做多个USB 设备加载。

因此,作为用户需要用如图17-6所示的逻辑拓扑结构理解USB 拓扑结构。

图17-5 符合设备 图17-6 USB 逻辑拓扑结构 但对于具体USB 设备来说,每个USB 设备的传输绝对不会影响其他USB 设备的传输。

例如,在有USB 设备传输的时候,其他USB 设备的带宽不会被占用。

对于USB 设备来说,每个USB 设备是直接连接到USB Host 控制器上的。

因此,应该用如图17-7所示的视角考虑USB 设备的通信。

图17-7 用户对USB 设备的观察17.1.3 USB 通信的流程USB 的连接模式是Host 和Devcie的连接模式,它不同于早期的串口和并口,所有的第17章 USB 设备驱动435请求必须是Host 向Device 发出,这就使Host 端设计相对复杂,而Device 端设计相对简单。

Host 端会在主板的南桥设计好,而Device 的厂商众多,厂商只需要遵循USB 协议,重点精力可以放在设备的研发上,而与PC 的通信不用过多考虑。

在USB 的通信中,可以看成是一个分层的协议。

分为三个层次,即最底层USB 总线接口层、USB 设备层、功能通信层,如图17-8所示。

图17-8 USB 协议以USB 摄像头设备为例,视频播放软件想通过USB 总线得到USB 摄像头捕捉的视频数据,这就相当于在功能层上。

Clinet SW 是视频播放软件,Function 是USB 摄像头。

而这些数据的读取需要USB 设备层提供的服务,在这一层上,主要是USB 设备的驱动调度Host 控制器向USB 摄像头发出读请求。

每个USB 设备会有多个管道,使用哪个管道,传输的大小都需要指定。

这个层次的USB System SW 就是USB 摄像头的驱动程序。

而在USB 设备一端一般会有小单片机或者处理芯片负责响应这种读请求,而这一层的传输又依赖于USB 总线接口层的服务。

在这一层,完全是USB 的物理协议,包括如何分成更小的包(packages )传输,如何保证每次包传输不丢失数据等。

对于USB 设备驱动程序员,主要是工作在USB 设备层,向“上”对应用程序提供读写等接口,向“下”将读取某个管道的请求发往USB Host 控制器驱动程序,它实现了最底层的传输请求。

对于每个USB 设备,都有一个或者多个的接口(Interface ),每个Interface 都有多个端点(Endpoints ),每个端点通过管道(Pipes )和USB Host 控制器连接。

每个USB 设备都会有一个特殊的端点,即Endpoint0,它负责传输设备的描述信息,同时也负责传输PC 与设备之间的控制信息,如图17-9所示。

Windows 驱动开发技术详解436图17-9 USB 管道与端点17.1.4 USB 四种传输模式当USB 插入USB 总线时,USB 控制器会自动为该USB 设备分配一个数字来标示这个设备。

另外,在设备的每个端点都有一个数字来表明这个端点。

USB 设备驱动向USB 控制器驱动请求的每次传输被称为一个事务(Transaction ),事务有四种类型,分别是Bulk Transaction 、Control Transaction 、Interrupt Transaction 和Isochronous Transaction 。

每次事务都会分解成若干个数据包在USB 总线上传输。

每次传输必须历经两个或三个部分,第一部分是USB 控制器向USB 设备发出命令,第二部分是USB 控制器和USB 设备之间传递读写请求,其方向主要看第一部分的命令是读还是写,第二部分有时候可以没有。

第三部分是握手信号。

以下针对这四种传输,分别进行讲解。

1.Bulk 传输事务顾名思义,改种事务传输主要是大块的数据,传送这种事务的管道叫做Bulk 管道。

这种事务传输的时候分为三部分,如图17-10所示。

第一部分是Host 端发出一个Bulk 的令牌请求,如果令牌是IN 请求则是从Device 到Host 的请求,如果是OUT 令牌,则是从Host 到Device 端的请求。

相关文档
最新文档