对USB驱动程序的理解

快速理解USB转485驱动程序下载安装关键点 详解USB转485驱动程序下载与安装过程中的核心步骤和常见问题,帮助用户快速完成设备连接与通信配置,确保稳定高效的数据传输体验。 阅读详情
对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) 返回设备完成状态
 
快速理解USB转485驱动程序下载后提示代码28的含义 USB转485驱动程序下载后出现代码28,通常表示系统未能识别或加载驱动。这多因驱动不兼容、签名缺失或硬件未正确枚举所致。重新安装带数字签名的USB转485驱动程序下载包、禁用驱动强制签名或更换USB端口常可解决。务必选用匹配操作系统版本的驱动。 阅读详情

相关推荐

Linux USB 驱动开发(三)—— 编写USB 驱动程序

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

知秋一叶 2万+

windows驱动开发-设备栈

设备栈

王马的博客 1367

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

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

知秋一叶 2万+

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

对USB驱动程序的理解(1)学了两个多星期了,对USB驱动程序的有一小小的理解。现在总结如下!!!!!!!!1、每个设备对应一个PDO,每个PDO又对应多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO。在USER和KERNEL通信方面,系统将每一个用户请求打包成IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪个设备的。另外,在驱动程序加载方面,WDM不通

小发猫 4067

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

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

weixin_28949937的博客 2620

深入理解PIC32MX开发及USB I2C驱动程序编写

本文详细解读了如何在PIC32MX平台上构建并烧写新应用程序,测试驱动程序的步骤和所需硬件。通过连接LTC3206 DC749A演示板和Curiosity PIC32MX470开发板,读者将学习到驱动程序的主要代码部分,包括创建ID表、私有数据结构、probe()函数以及初始化I2C传输方法。文章还提供了代码清单和构建模块的指南,强调了从GitHub下载源代码的重要性。

weixin_28809949的博客 423

USB2.0驱动分析Kernel3.10.24

可以用wireshark+usbmon捕捉usb协议数据包。 /****************************************************** * *    加载usbcore *        添加hub interface driver *        添加hub interface device * *************

hpp205的专栏 1176

深入理解USB Bulk驱动程序:usbbulk的设计与实现

USB Bulk传输是一种在USB设备间传递数据的方式,以其高效和可靠著称。Bulk传输不保证传输速度,但会保证数据的完整无误。这使得其在处理大量数据传输时非常有用,如打印机、扫描仪以及网络摄像头等设备,都广泛使用Bulk传输。usbbulk 是一个典型的USB Bulk传输示例程序,用于演示如何在Linux环境下开发USB驱动程序。该程序的代码框架主要分为三个部分:驱动程序代码、用户空间程序和配置文件。驱动程序代码负责处理USB设备的枚举、配置、数据传输等底层操作。

weixin_35755640的博客 888

[转]++对USB驱动程序的理解

导读: 对USB驱动程序的理解(1)学了两个多星期了,对USB驱动程序的有一小小的理解。现在总结如下!!!!!!!!1、每个设备对应一个PDO,每个PDO又对应多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO。在USER和KERNEL通信方面,系统将每一个用户请求打包成IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪个设备的。另

719

USB_Program:一个测试USB通信设备的程序

#USB_Program 一个测试USB通信设备的程序 需要win2000或者winxp的DDK,才能编译。

51_USB_program(PDIUSBD12)

51单片机USB固件编程的(PDIUSBD12)源代码

对USB驱动程序的的理解

1、每个设备对应一个PDO,每个PDO又对应多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO。在USER和KERNEL通信方面,系统将每一个用户请求打包成IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪个设备的。另外,在驱动程序加载方面,WDM不通过驱动程序名称识别,而是通过一个128位的全局唯一的标识符GUID来实现驱动程序的识别,即每一个固件都有一个

chinaplus的专栏 1929

STM32F10x移植USB驱动示例.pdf

STM32F103 系列芯片都自带了 USB,不过 STM32F103 的 USB 都只能用来做设备,而不能用作主机。STM32F103 的 MCU 自带 USB 从控制器,符合 USB 规范的通信连接; PC 主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被 USB 外设直接访问。 USB ,是英文 Universal Serial BUS(通用串行总线)的缩写,而其中文简称为“通串线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。

USBBULK与USBSERIAL驱动程序及USBlyzer实践资源:深入理解USB通信机制的不二选择

USBBULK与USBSERIAL驱动程序及USBlyzer实践资源:深入理解USB通信机制的不二选择 去发现同类优质开源项目:https://gitcode.com/ 在嵌入式开发领域,USB接口作为数据传输的重要通道,其稳定性和效率至关重要。今天,我们就来介绍一个开源项目——USBBULK与USBSERIAL驱动程序及USBlyzer实践资源,帮助开发者深入理解USB通信机制,并在实际开发中游...

gitblog_06785的博客 392

stm32的USB驱动

STM32F103、F105、F107的USB驱动,采用bulk方式,支持EP1和EP2的双向传输,USB的收发速度可以达到700k/s。用户只需要调用usbio.c和usbio.h文件即可完成USB的初始化,数据发送,数据接收工作,使用非常方便,经过测试工作比较稳定。如需开发usb的上位机驱动,可以发送邮件hjj670550@163.com索要。

瑞芯微RK3588开发板VSCode远程开发全攻略:从SSH配置到插件优化

本文详细介绍了如何在瑞芯微RK3588开发板上配置VSCode远程开发环境。从Ubuntu系统下的SSH服务设置、VSCode Remote-SSH扩展安装,到连接建立、基础工具链部署,再到针对ARM平台的性能优化与调试配置,提供了一套完整的实战指南,帮助开发者高效利用本地资源进行嵌入式开发。

weixin_28831341的博客 625
上一篇: 终于比IceSword底层了
下一篇: ACPI BIOS RootKit 实践
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值