嵌入式系统中USB驱动程序设计

从Transformer到Harness Engineering:AI应用工程化实战指南 Transformer作为深度学习的基础架构,凭借自注意力机制实现了序列建模的并行化与全局关联,催生了GPT类大模型。然而,在实际AI应用中,模型能力并不等于产品稳定性,如何将大模型封装进可控的生产流程成为关键。提示词工程、AI Agent、RAG等技术的本质都是为了约束和引导模型行为,而Harness Engineering则从系统工程视角,整合模型路由、上下文管理、工具调用与输出校验,构建可靠的应用底座。从时间序列预测到企业级智能助手,工程化已成为AI落地的主要瓶颈和突破口。本文结合实战经验,解析从Tr 阅读详情
摘 要:本文介绍了Windows2000操作系统下,符合WDM模式的USB驱动程序的体系结构及处理流程,并以一个批量数据传输的实例详细介绍了如何编写USB驱动程序。

  关键词:USB;设备驱动程序;WDM模式

  引言

  USB是1995年康柏、微软、IBM, DEC等公司为了解决传统总线的不足,而推出的一种串行总线标准。该总线已经逐渐成为现代数据传输的发展趋势,被广泛地应用于PC机及嵌入式系统上。

  目前,虽然Windows2000提供有多种通用的USB驱动程序,但并不满足本嵌入式系统的设计需求,因此本系统采用W i n d o w s DDK(Device Driver Kit)开发工具,自行开发了基于WDM模型的USB设备功能驱动程序。

  USB驱动程序

  1.USB驱动程序体系结构

  运行在核心态的USB驱动程序是基于WIN32驱动程序模型WDM(Windows Driver Model)的,它采用分层驱动程序模型,由USB总线驱动程序和USB功能驱动程序两部分组成,总线驱动程序由操作系统提供,用户只需编写相应的功能驱动程序即可。

  2.处理流程

  因为I/O管理器把每一个设备对用户程序都抽象成文件,所以用户程序通过调用文件操作API函数就可以实现与驱动程序中某个设备的通信。
用户程序发送的请求由I/O管理器转换为具有不同主功能代码的IRP(I/O请求包)发送给功能驱动程序。功能驱动程序接收该IRP,在回调例程中根据 IRP中包含的具体操作代码,构造相应的URB(USB请求块,在DDK中有URB结构的定义),把它放到一个新的IRP中,并把这个新的IRP传递给 USB总线驱动程序。USB总线驱动程序根据IRP中所包含的URB执行相应操作,再将操作结果通过IRP返还给功能驱动程序。功能驱动程序接收此 IRP,将操作结果通过IRP返还I/O管理器。最后,I/O管理器将此IRP中的操作结果返回给应用程序。至此,应用程序对USB设备的一次I/O操作完成,其处理流程如图1所示。

  3.应用实例

  在本嵌人式系统中,硬件选用了Philips公司生产的USB2.0高速接口器件ISP1581,实现主机与嵌人式系统间的USB数据传输。

  为了适应各种USB外设的需要,USB提供了四种不同的传输类型。这里,为满足嵌入式系统与主机间大量、可靠的数据交换要求,数据传输选用批量传输方式。

  USB功能驱动程序的构成及实现

  本功能驱动程序主要由四个模块组成:初始化模块、I/O模块、即插即用管理模块和电源管理模块。另外,还有一个.INF文件用于驱动程序的安装。

  ★ 初始化模块

  在初始化模块中,包括有每一个设备驱动程序都有的一个初始化入口点:DriverEntry例程,每次设备驱动程序启动时该例程被系统自动调用,其最重要的功能是设置驱动程序对应于I/O请求的主功能代码(MajorFunction)的回调例程。DriverEntry例程如下所示:

  DriverEntry(IN PDRIVER_OBJECT DriverObject, …)
  //驱动程序人口
  {
    DriverObject->DriverExtension->AddDevice=AddDevice;
    DriverObject->DriverUnload=DriverUnload;
    DriverObject->MajorFunction[IRP_MJ_CREATE]=Create;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close;
    DriverObject->MajorFunction[IRP_MJ_READ]=Read;
    DriverObject->MajorFunction[IRP_MJ_WRITE]= Write;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=IoControl;
    DriverObject->MajorFunction[IRP_MJ_PNP]=Pnp;
    DriverObject->MajorFunction[IRP_MJ_POWER]=ProcessPowerIrp;
  }

  初始化模块中还包括有Create和Close两个例程,这是Win32程序获得和释放设备句柄的唯一途径;AddDevice例程在系统添加一个设备时被PnP管理器调用,其主要工作是创建并初始化设备对象;DriverUnload例程在系统卸载硬件时使用,由I/O管理器调用,释放所有资源。

  ★ I/O模块
  
  I/O模块由读写例程Read、Write和设备控制例程IoControl构成。

  · 读写例程

  读写两个例程用于实现批量数据传输。通过设置urb->UrbBulkOrInterruptTransfer. TransferFlags标志位可以决定数据流向,因此将它们放在同一个例程中。读写例程主要处理流程如下:

  (1)调用IoGetCurrentIrpStackLocation(),获得指向自身I/O堆栈单元的指针;
  (2)使用构造宏UsbBuildInterruptOrBulkTransferRequest(),构造一个URB_BULK_OR_INTERRUPT_TRANSFERURB类型的URB结构;
  (3)调用IoGetNextlrp StackLocation()获得下一层驱动程序的I/O堆栈单元位置,并传递构造好的URB;
  (4)调用IoSetCompletionRoutine(),将一个I/O完成例程与IRP关联;
  (5)调用IoCallDriver() ,将请求传递给下层驱动程序处理。

  · IoControl例程

  用户程序使用DeviceIoControl函数传递一个称为I/O控制代码(IOCTL)的32位长度的参数,I/O管理器将IOCTL放在IRP 的  Parameters.DeviceIoControl.IoControlCode域中,在功能驱动程序中由IoControl例程使用该参数确定应执行的功能。

  IOCTL值由CTL_CODE宏生成,CTL_CODE宏有四个宏参数。在本驱动程序中定义了两个IOCTL,分别用于复位管道和向USB固件发送一次批量传输字节数。IoControl例程对这两个IOCTL的处理流程与上面的读写例程类似,这里就不再赘述。 

uboot usb设备驱动 介绍usb device设备驱动 uboot在init_dm中会扫描dtb和代码中driver进行匹配,匹配成功就调用driver驱动进行bind 以dwc3为例进行介绍 DTS中定义 usb0: usb0@ff9d0000 { #address-cells = <2>; #size-cells = <2>; status = "disabled"; compatible = "xlnx,zynqmp-dwc3"; //匹配的compatible reg = <0x 阅读详情

相关推荐

嵌入式系统中HID USB驱动设计要点

深入探讨嵌入式系统中HID类USB驱动的设计核心,涵盖usb驱动的架构、数据传输机制与设备枚举流程,结合实际应用场景优化稳定性与兼容性。

weixin_35294091的博客 384

WinXP下USB驱动开发(六)

3.3.2.3.    操作USBD.SYS正如前面所述,对USBD.SYS驱动操作的中介只URB结构体,因此对USBD.SYS的操作主要可以分构造URB和调用请求两部分,如下以USB读写操作过程为例进行分析。第一步构造URB:由于EasyArm2400下位机固件程序USB采用的是中断方式进行数据传输,因此我们就需要构造一个中断传输的URB,实现如下代码。 UsbBui

Tech is Online(物联网技术传播) 6262

STM32与VC++结合的USB数据传输完整实现

USB(通用串行总线)设备类是一组定义好的协议集合,用来简化设备的开发过程,并确保设备能够与USB主机进行通信。这些设备类有特定的功能和协议,使得操作系统能够识别设备,并自动安装相应的驱动程序,从而实现即插即用。USB设备类被分为多个类别,每个类别针对不同的设备和功能提供特定的通信协议。例如,HID(人机接口设备)类包括键盘、鼠标和游戏控制器,而存储类则包括U盘和移动硬盘。此外,还有通信类(用于调制解调器和网络设备)、视频类、音频类等。

weixin_36238982的博客 446

WinXP下USB驱动开发(五)

3.3.2.  程序设计与传统PC总线(如PCI总线)设备的驱动程序相比,USB设备驱动程序从不直接与硬件对话。相反,它仅靠创建URB(USB请求块)并把URB提交到总线驱动程序就可完成硬件操作。可以把USBD.SYS看作是接受URB的实体,向USBD的调用被转化为带有主功能代码为IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP。然后USBD再调度总线时间,发出URB中

Tech is Online(物联网技术传播) 6318

CH375微控制器芯片在多平台的USB设备管理实现

CH375是一款经典的单片机USB总线接口芯片,它在嵌入式系统中担当“桥接”角色,简化了设备与USB接口的连接过程。它支持各种常见的USB通信协议,包括数据读写、通信配置等。CH375的设计旨在降低开发难度,减少开发时间,提高嵌入式设备的兼容性和稳定性。CH375微控制器芯片包含了多个寄存器,用于控制USB通信和设备状态。其中一些关键寄存器包括:命令寄存器:用于执行不同的操作命令,例如启动数据传输、设置设备模式等。状态寄存器:提供设备的当前状态信息,如传输状态、错误状态等。

weixin_35307279的博客 989

ARM9开发板USB驱动程序详解与实战

本文还有配套的精品资源,点击获取 简介:ARM9微处理器广泛应用于嵌入式系统,其USB驱动程序对于开发板与USB设备通信至关重要。USB驱动包括主机控制器驱动、设备类驱动和设备驱动三个层次,涉及初始化、设备枚举、数据传输、中断处理和错误处理等关键步骤。本文将详细探讨ARM9开发板上的USB驱动程序设计、开发流程、调试技巧及实践应用。 1. ARM9微处理器及其在嵌入式...

weixin_42604188的博客 1424

windows USB 设备驱动开发-使用URB的规则

windows USB 设备驱动开发,使用URB需要注意的事项

王马的博客 969

winform程序通过USB获取数据

通过使用windows的api获取usb驱动

USB transfer sizes 限制

用Bulk传输VBI信息时,发现字幕经常出现拼写错误的问题,查了一下,原来是bulk pipe 的transfer sizes设置错误,超出了大小限制。USB transfer sizes有如下限制:在Windows 2000, Windows XP and Windows 2003 Server中,Transfer Sizes 的最大值:控制管道: 4,000 bytes块、中断管道:256

大鱼的专栏 2572

WDM,USB驱动程序

这是在Windows XP下做的WDM的USB设备功能驱动程序。用AX88772A实现高速以太网转USB的设备。

【数据分析与挖掘实战】金融风控之贷款违约预测详解1(有代码和数据集)

金融风控一.题目理解1.1.题目概况1.2数据概况1.3预测指标二.数据来源三.查看数据四.分类指标计算示例4.1混淆矩阵4.2准确度4.3precision(精确度),recall(召回率),f1-score4.4P-R曲线4.5ROC曲线4.6AUC曲线4.7KS值五.数据分析5.1基本信息5.2查看数据集中特征缺失值,唯一值等5.3查看特征的数值类型有哪些,对象类型有哪些5.3.1数值连续型变量分析5.3.2非数值类别型变量分析5.3.3总结:5.4变量分布可视化5.4.1单一变量分布可视化 更新中~

m0_49263811的博客 1万+

远程播放linux摄像头,基于Linux系统的USB摄像头视频播放实现

摘 要:随着USB摄像头的普及以及Linux系统桌面应用的推广,基于Linux系统的视频播放程序设计有着现实应用的意义>> 基于Video for Linux内核的USB摄像头视频信号采集实现 基于Linux系统的USB摄像头视频播放实现 Linux 下 USB摄像头驱动的实现 基于ARM9和USB摄像头的网络视频采集系统设计 基于USB摄像头的嵌入式视频监控系统 基于USB摄像头的局...

weixin_30286727的博客 532

手把手教你用S7-PLCSIM Advanced V3.0搭建PLC仿真测试环境(含WinPcap避坑指南)

本文详细介绍了如何使用西门子S7-PLCSIM Advanced V3.0搭建PLC仿真测试环境,包括WinPcap 4.1.3驱动的安装避坑指南。从环境准备、软件安装到配置调试,提供了一套完整的解决方案,帮助工程师和教学人员快速构建可靠的PLC仿真环境,解决常见的报错问题。

weixin_30879169的博客 642

周立功的linux开发板例程,USB NXP LPC1766 开发配套例程(周立功开发板自带例程) - 下载 - 搜珍网...

USB/OTG/USBOtgDEVICE.jpgUSB/OTG/USBOtgHOST.jpgUSB/OTG/OTG/config.hUSB/OTG/OTG/Cortex-M3 Execute for lpc1700.OptUSB/OTG/OTG/Cortex-M3 Execute for lpc1700.Uv2USB/OTG/OTG/OTG说明.txtUSB/OTG/OTG/usbOtg.mapU...

weixin_28223453的博客 448

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2527

RT-Thread实战:手把手教你用STM32F04ZGT6通过SPI驱动BMI088(附完整工程)

本文详细介绍了如何使用RT-Thread操作系统在STM32F04ZGT6上通过SPI接口驱动BMI088高性能6轴惯性传感器(包含陀螺仪和加速度计)。从硬件连接到软件配置,再到数据采集与处理,提供了完整的开发指南和优化技巧,帮助开发者快速实现精确的姿态测量功能。

kappa的博客 237

我学习USB设计的历程【转】

最初想学习USB的原因在于当时非常非常想有一台通用编程器,商用的编程器虽然功能好,但是价格昂贵,仅仅为了编程几种芯片就去买一个似乎很可惜(我现在已经买了编程器了:))。于是想自己做一个很简单的,用串口?并口?一想到要加个又大又笨的外置电源就不喜欢,用USB,不错,有总线供电,这点很吸引人,就是当时我对USB一窍不通,那就找资料看看吧。 当时USB技术刚刚兴起,USB器件在电子市场上还...

weixin_30539835的博客 90

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

USB驱动之USB网络共享

一 编译USB/IP组件 USB/IP组件包含两部分:USB/IP协议栈和USB/IP驱动模块 USB/IP协议栈源码位于linux_kernel/tools/usb/usbip USB/IP驱动模块位于linux_kernel/drivers/usb/usbip 1. 1.1编译USB/IP协议栈 1 进入USB/IP协议栈目录 cd linux_kernel/tools/usb/usbip...

weixin_33968104的博客 4998

科研问答:医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

MD Code 1512

6、云计算中的多核技术:架构、并行性与局限性

本博文深入探讨了云计算中多核技术的架构、并行性及其局限性。文章详细介绍了多核处理器的基础概念、并行硬件和软件的设计原理,并对硬件和软件并行性进行了分类和分析。同时,文章讨论了多核架构在实际应用中面临的挑战,如功率墙、内存墙和ILP墙等问题,并提出了应对策略。此外,还总结了多核技术在高性能计算、实时处理和云计算等领域的应用机遇。文章旨在帮助读者更好地理解多核技术的关键问题,并为未来的技术探索提供方向。

java5的博客 122

细说嵌入式系统下的驱动程序设计

嵌入式系统驱动程序的开发有别于WIndows或Linux。后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构)。但在嵌入式系统中,往往是先设计驱动程序再有系统,所以只需要致力于驱动各个外围设备,而且嵌入式产品一般没有后期新增硬件的需求,所以不要求驱动程序编写的有扩展性,只需要逻辑清晰,简单明了就可以。 往往驱动程序分为两层:Driver层和API层。前者是真正驱动硬件设备的程序,后者是负责与系统或应用程序交互的接口,对外隐

Leon的博客 2805

HTOL集成电路老化测试学习总结-20250510

电子元器件的可靠性在产品开发中至关重要,尤其是在微电子技术迅速发展的今天。电子元器件的失效率通常遵循“浴盆曲线”,分为早期失效期、可使用期和老化期。为了评估芯片的可靠性,常采用高温操作寿命测试(HTOL),通过高温和高压加速芯片老化,以筛选出早期失效的芯片并评估其长期可靠性。HTOL测试中,芯片在高温下运行并监控其性能变化,通过阿伦尼乌斯公式计算加速因子,预测芯片的失效率和寿命。此外,Burn-in测试用于加速芯片老化,提前发现并剔除不合格产品,而早期失效率测试(ELFR)则用于评估产品初期使用阶段的可靠性

歌颂苦难的行为是无耻的; 2106

USB 串口驱动分享

本文深入探讨USB串口驱动的工作原理与实现方法。首先分析USB与UART的技术差异,包括通信方式、传输速率等关键特性。接着详细解析驱动架构,重点介绍Linux系统中的usbserial框架和Windows WDM模型。在实现层面,文章阐述了数据传输流程、设备枚举过程以及串口参数配置等技术细节。针对开发实践,提供了基于CP2102芯片的驱动开发实例和调试技巧。最后讨论了性能优化策略和常见问题解决方案,并展望了USB4标准等未来发展趋势。

Mr_-G,一名勤奋底层软件开发工程师的博客 3159

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

USB驱动

USB设备初识 USB的接口有4条线(5V、GND、D-、D+),其中PC上的D-和D+都接有15k的下拉电阻,未接入设备时未低电平,USB设备的D-或D+接有1.5k的上拉电阻,USB设备接入PC后,就会把PC上的USB口的D-或D+拉高,通过硬件方式通知PC机有新设备接入,新接入的USB设备的默认编号为0,在未分配新编号前,PC使用0编号和它通信。USB总线驱动程序向USB设备发出命令获取US...

weixin_42889383的博客 670

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux驱动开发——USB设备驱动

Linux驱动开发——USB设备驱动

qq_52479948的博客 3775

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 应用程序实现方法的猜测
下一篇: 根据ip地址查交换机端口
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值