对USB驱动程序的理解(1)

Linux USB 驱动开发(三)—— 编写USB 驱动程序 Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更贴切一些,应该称为驱动器比较好吧)的结构体,结构体里面应该包含了驱动程序所需要的所有资源。用术语来说,就是这个驱动器对象所拥有的属性及成员。 一、usb-skeleton        下面先看一下Linux内核源码中的一个usb-skeleton(就是usb驱动的骨架咯),其定义的设备结构体就叫做usb-skel:s 阅读详情
对USB驱动程序的理解(1)

学了两个多星期了,对USB驱动程序的有一小小的理解。现在总结如下!!!!!!!!
1、每个设备对应一个PDO,每个PDO又对应多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO。在USER和KERNEL通信方面,系统将每一个用户请求打包成IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪个设备的。另外,在驱动程序加载方面,WDM不通过驱动程序名称识别,而是通过一个128位的全局唯一的标识符GUID来实现驱动程序的识别,即每一个固件都有一个GUID,你通过GUID来区分是哪个固件。
2、USB主机驱动符合WDM驱动体系结构也使用IRP(I/O请求包)的机制。但实际的USB驱动程序使用URB(USB请求块)结构向其硬件设备发送请求。USB驱动程序高度依赖其总线驱动程序(USBD.SYS),而不直接使用硬件抽象层(HAL)函数与硬件通信。
3、USBD是USB系统软件中最关键的一层,它负责控制全部USB协议的操作和中断处理控制。主要功能有:设备设置、资源管理、数据传输(管道层次)以及公共数据定义等。管道机制和命令机制。管道机制:管道是设备和主机之间的逻辑连接,分为标准管道和逻辑管道,标准管道用语完成一些客户通过命令接口所传递的请求,如设置设备的地址等,但USBD不允许客户直接访问设备的标准管道。客户管道则有客户进行管理,并提供相应的数据缓冲区。命令机制允许客户以读写的方式对设备的数据及其控制部分进行访问,客户所要做的,仅仅是向USBD提供设备的地址及相关的数据缓冲区的指针。命令机制所提供的功能主要是USB总线管理相关的内容,如设备设置管理、设备数据访问、总线设备管理以及电流分配等。
4、USB设备驱动程序设计
    2000DDK+VC6.0(只能用C,不能用C++)
    三个关键的例程:DriverEntry、AddDevice、ReadWrite
(1)DriverEntry,完成某些全局初始化操作,它是内核模式驱动程序主入口点。
extern "C"
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
                IN PUNICODE_STRING RegistryPath )
通过PDRIVER_OBJECT这一重要的数据结构,I/O管理器使用它来定义每一个设备驱动程序,DriverEntry主要工作是各种函数指针填入驱动程序对象的各个域中,这些指针为操作系统指明了驱动程序容器中各种子例程,重要包括下面指针成员:
    1、DriverUnload
    2、DriverExtension->AddDevice指向驱动程序的AddDevice函数
    3、DriverStartIo指向驱动程序处理串行I/O请求的函数。如果驱动程序采用标准的IRP排队的方式,应该设置该成员,使得指向驱动程序的StartIo例程。
    4、MajorFunction是一个指针数组,指向存在于驱动程序中的多种IRP处理函数。
    DriverObject->DriverUnload = DriverUnload;
    DriverObject->DriverExtension->AddDevice =AddDevice;
    DriverObject->MajorFunction[IRP_MJ_CREATE]= DispatchCreate;
 ~~~~~~~~~~~~~~
(2)AddDevice
   一个驱动程序可以被多个设备使用。WDM驱动程序有一个特殊的AddDevice函数,PnP管理器为每个实例调用该函数。原形如下:
NTSTATUS
AddDevice( IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject);
AddDevice函数的基本职责是创建一个设备对象并把它连接到以PDO为底的设备栈中。
具体步骤如下:
1) 用IoCreateDevice创建设备对象,并建立一个私有的设备扩展对象。
PDEVICE_OBJECT fdo;
NTSTATUS status = IoCreateDevice(DriverObject,
                               sizeof(DEVICE_EXTENSION),
                               NULL,
                               FILE_DEVICE_UNKNOWN,
                               FILE_DEVICE_SECURE_OPEN,
                               FALSE,
                               &fdo);
2) 初始化设备扩展和设备对象的Flag成员。
PDEVICE_EXTENSION pdc = (PDEVICE_EXTENSION)fdo->DeviceExtension;
fdo->DeviceExtension;
fdo->Flag2|=DO_BUFFERED_IO;
3) 调用IoAttachDeviceToDeviceStace函数把新设备对象放到堆栈上。
pdx->LowerDeviceObject=IoAttachDeviceToDeviceStack(fdo,pfo);
 设备对象(DEVICE_OBJECT或*PDEVICE_OBJECT)也是DDK定义的一个重要结构。它可以在其设备名称(DeviceName)域中(第三个参数)为设备对象进行命名。 设备对象另一个关键的域为扩展设备对象(DeviceExtension)大小,I/O管理器为设备对象分配一块内存,该指针指向一个用户定义的数据结构,用于保存每个设备实例的信息
typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT DeviceObject; //device object this extension
//belongs to
    PDEVICE_OBJECT LowerDeviceObject;  //next lower driver in//same stack
    PDEVICE_OBJECT Pdo;     //the PDO
    IO_REMOVE_LOCK RemoveLock;  //removal control locking structure
    UNICODE_STRING ifname;     //interface name
    DEVSTATE state     //current state of device
    DEVSTATE prevstate;   //state prior to removal query
    DEVICE_POWER_STATE devpower; //current device power state
    SYSTEM_POWER_STATE syspower;  //currnet system power state
    DEVICE_CAPABILITIES devcaps;   //copy of most recent device capabilities
    LONG handles;    //#open handle
    USBD_DEVICE_DESCRIPTOR dd;   //device descriptor
    USBD_CONFIGURATION_HANDLE hconfig;   //selected configuration handle
    PUSB_CONFIGURATION_DESCRIPTOR pcd;   //Configuration descriptor;
    LANGID langid;     //default language id for strings
    USBD_PIPE_HANDLE hPipe;
    USBD_PIPE_HANDLE hPipe_WriteCode;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;
AddDevice为设备对象注册一个接口,以便应用程序能通过注册接口来访问该设备。一个设备接口被一个128位的GUID唯一标识。
    status = IoRegisterDeviceInferface(pdo,&GUID_INTERFACE_USB,NULL,&pdx->ifname);得到GUID后,当响应PnP请求IRP_MN_START_DEVICE时,驱动程序调用下面函数使其可用,IoSetDeviceInterfacestate(&pdx->ifname,TRUE);
在响应这个调用过程中,I/O管理器将创建一个指向设备的PDO符号连接对象。因为接口名最终指向PDO,所以PDO的安全描述符将最终控制设备的访问权限。(3)ReadWrite实现设备驱动程序功能的各个派遣函数,并实现总线枚举和管理函数,用于设备初始化以及错误恢复。是整个驱动最重要部分,以读数据请求为例子,即主机要求设备向其传输数据。
1)建立并提交一个URB,USB驱动从不直接和硬件对话,通过创建URB并把URB提交到总线驱动程序就可以完成硬件操作,USBD.SYS是接受URB的实体,向USBD的调用被转化为带有主功能代码为IRP_MJ_XXX的IRP。然后USBD再调度总线时间,发出URB中指定的操作。
创建一个URB是USB驱动最基本的工作,首先应该为URB分配内存,然后调用初始化例程把URB结构中的各个域填入请求要求的内容。最后通过创建并发送一个内部I/O控制(IOCTL)请求到USBD驱动程序来发送这个URB包,从而完成USB请求。
2)创建并发送IOCTL请求
创建完URB后,我们创建并发送一个IOCTL(内部I/O控制)请求到USBD,然后等待设备回应,相应的函数为SendAwaitUrb
3) 返回设备完成状态

STM32Cube的USB_device软件库说明 USB 设备库基于通用 USB 底层驱动开发,可在全速和高速模式中工作。它实现了USB 2.0版本定义的USB设备库状态机。此模块功能由USB设备库固件包中"Core" 目录下的文件提供。USB 类模块为类层,与协议规范兼容。 阅读详情

相关推荐

USB 驱动程序介绍(一)

 vv    USB 底层驱动程序:USB 底层驱动程序由操作系统提供,它位于 USB 功能驱动程序的下面,负责与实际的硬件打交道,实现繁琐的底层通信。     USB 功能驱动程序:USB 功能驱动程序由设备开发者编写,位于 USB 底层驱动程序的上面,不与实际的硬件打交道,而是通过向 USB 底层驱动程序发送包含 URB(USB Request Bloc

MannHello的专栏 4808

USB CDC库的改造和使用

USB CDC库的改造和使用 为了方便使用,对HAL库的USB设备库例子进行了改造,只保留最核心的USB接收和发送功能。如果只是使用USB收发数据,可以直接使用本例程,而不用去详细学习USB规范。下面是改造过程及使用方法的说明。 一、初始化 HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)函数是初始化GPIO接口硬件和时钟的,包

AmonYoung的专栏 1万+

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。       设备驱动程序是内核的一部分,主要完成以下功能:对设备的初始化和释放;把数据从内核传送到硬件设备和从硬件设备读取数据;读取应用程序数据传送给设备文件和回送应用程序请求的数据;检测和处理

知秋一叶 2万+

如何编写Windows CE.net的usb驱动程序(1)

随着USB设备的普及,摆在开发人员面前的驱动开发任务也是越来越繁重了,特别是对于一些嵌入式开发厂商来讲,由于设备所采用的操作系统不同,相应的硬件接口也是不一样的,开发相关的USB驱动程序更是难上加难。Windows CE.NET 是微软推出的功能强大的嵌入式操作系统,国内采用此操作系统的厂商已经很多了,本文就以windows ce.net为例,简单介绍一下如何开发windows ce.net下的U

IT强哥的专栏 739

USB 驱动程序开发之几个重要函数分析

  下面介绍的函数都出自以下的Linux源码文件:driver/usb/core/message.c  该文件内包含许多关于同步信息处理的函数,具体内容在文件中都有注释介绍,该处我只选择在USB驱动程序设计中常用到的几个函数进行分析,当然,都是我个人理解,有问题请指教。  另外,这里我想说,美国人真的很喜欢递归,不论是makefile文件的语法,还是编程习惯,几乎无处不用递归。他们总是从问题的根源开始,慢慢告知你这些东西的用处,写代码的时候,也是最基础的函数写在前,最终的大型函数在后。这里我就不再用这种方式

WInScar的专栏 3895

从零开始学USB(九、USB的传输类型(1))

一、传输类型 USB通过与主机上的客户端软件相对应的内存储器区和USB设备上的端点之间的管道传输数据。 消息管道传输的数据以USB定义的结构传输,但USB允许特定设备的结构化数据在USB定义的消息数据有效负载内传输。 USB还定义了对于任何管道(流或消息),数据经过总线时都要进行分组,但最终在总线事务的数据有效载荷中传输的数据的格式化和解释是客户端软件和功能的责任。 但是,USB提都要供了不同的...

To_run_away的博客 7601

C#中的USB库 WinUSB

NET C#中的USB库WinUSB,的libusb - Win32和的libusb - 1.0。使用公共设备类,应用程序与所有未经修改的操作系统和驱动程序。大量的示例代码。 官方网站:http://www.open-open.com/lib/view/home/1334189497592

yizhiduxiu11的专栏 3362

Windows USB驱动程序安装与管理指南

USB驱动程序是一种软件组件,它允许操作系统与连接到USB端口的硬件设备进行交互。它负责处理设备的初始化、配置以及数据传输等任务。

weixin_36019375的博客 2279

对USB驱动程序的理解

对USB驱动程序的理解 学了两个多星期了,对USB驱动程序的有一小小的理解。现在总结如下!!!!!!!!1、每个设备对应一个PDO,每个PDO又对应多个FDO,在驱动程序中直

小发猫 2580

USB转串口驱动程序安装与应用

本文还有配套的精品资源,点击获取 简介:USB转串口驱动程序让现代计算机能通过虚拟串口与传统设备通信。本文介绍了USB转串口技术的重要性、串口通信标准、USB接口的优势以及驱动程序安装步骤。文档列表中的文件提供了安装过程中的关键信息,如设备序列号和驱动下载链接。USB转串口驱动程序是现代设备与传统串口设备间数据通信的关键。 1. USB转串口驱动程序的功能和重要性...

weixin_26907223的博客 2155

深入理解USB串口工具与驱动程序及其应用

本文还有配套的精品资源,点击获取 简介:USB串口工具及驱动是连接计算机与外部设备的关键技术,广泛应用于嵌入式系统和物联网设备的硬件调试。本文将深入探讨USB串口工具的功能、驱动程序的作用,以及在zigbee芯片CC2403中如何应用这些工具进行编程和调试。USB串口工具通过模拟传统串口提供便捷的通信界面,而USB驱动程序则确保操作系统能正确识别和管理USB设备。此外,文章...

weixin_28949937的博客 2620

深入解析USB驱动程序:原理与设计精要

在本章节中,我们将深入探讨USB设备类的定义及其实现。USB设备类为USB设备提供了一种标准化的方法来定义其功能和通信协议,使得操作系统能够更容易地识别和管理这些设备。我们将从USB设备类的基本概念讲起,逐步介绍其实现方法,并讨论其实现过程中的优点和局限性。USB设备类是USB规范的一部分,它定义了一系列的设备类别,如大容量存储、人机接口设备(HID)、图像设备等。这些类别的定义允许设备与主机进行标准化的通信,而无需针对每种不同功能的设备编写特定的驱动程序。

weixin_28931507的博客 1297

USB驱动程序开发指南与实践

USB(Universal Serial Bus)通信协议是设计用来实现外围设备与主机计算机之间的连接和数据交换的标准。这一协议的核心目的是为了简化PC与外围设备的连接,包括PC的鼠标、键盘、打印机、存储设备以及许多其他类型的设备。USB传输模型基于四个数据传输类型:控制传输(Control Transfer)、中断传输(Interrupt Transfer)、批量传输(Bulk Transfer)以及同步传输(Isochronous Transfer)。

weixin_32251525的博客 1005

C6713 DSP USB驱动程序深入解析

C6713 DSP开发板是基于TI(德州仪器)TMS320C6713芯片的一款高性能数字信号处理板。其核心处理器拥有高达225MHz的时钟频率,并支持多个指令集,使得其在执行复杂的数学运算时拥有优异的性能表现。开发板通常包含高速的内存接口、多种通信端口以及扩展接口,例如PCI、USB和以太网接口,为实现各种数据处理功能提供了硬件支持。开发板主要面向实时数据处理应用,特别适合在处理要求高精度、高计算强度的场合中使用。

weixin_30299319的博客 907

USB 1.1与USB 2.0协议深入解析

USB,即通用串行总线,是一种广泛使用的计算机接口标准,它支持设备的热插拔和即插即用功能,极大地方便了用户对计算机外围设备的管理。USB接口从最初的USB 1.0发展至今,经历了多个版本的迭代,每个新版本都在传输速度、电源管理、连接能力等方面进行了显著的改进。USB驱动程序位于操作系统与USB设备之间,是实现两者通信的桥梁。它们处理设备的枚举、配置、数据传输以及错误处理等功能。驱动程序通常包括设备驱动程序(DD)、总线驱动程序(BD)和主机控制器驱动程序(HCD)三部分,每部分负责不同的层面。

weixin_30838971的博客 1577

CP210x USB驱动程序安装与应用

CP210x系列是由Silicon Labs公司开发的一系列USB至串行桥接芯片,广泛应用于各种需要USB通信的设备中。它支持全速USB2.0通信协议,提供了从USB接口到标准串行端口的简单转换,并且不需要安装任何额外的USB驱动程序。CP210x驱动程序是使得操作系统能够识别和使用CP210x系列USB至串行桥接芯片的关键软件组件。如果需要进行更高级的配置,您可以下载Silicon Labs提供的CP210x配置工具。这个工具提供了丰富的配置选项,您甚至可以设置特定的引脚功能。

weixin_35257663的博客 1291
上一篇: 问一个AddDevice和设备符号链的问题??
下一篇: 对extern "C"的一点小认识
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值