USB驱动的制作过程与体会
u盘启动盘的制作心得体会
u盘启动盘的制作心得体会在计算机的使用中,我们经常会遇到一些系统故障或者需要重装操作系统的情况。
这时候,使用U盘启动盘可以帮助我们快速修复系统问题或者重新安装系统。
下面我将分享一下我制作U盘启动盘的心得体会。
首先,选择合适的U盘非常重要。
一般来说,容量在8GB以上的U盘就可以满足制作启动盘的需求。
同时,为了确保U盘的稳定性和持久性,最好选择品牌的高质量U盘来制作启动盘。
其次,选择合适的启动盘制作工具也很关键。
市面上有很多种U盘启动盘制作工具,如Rufus、WinToFlash等。
我个人比较喜欢使用Rufus,因为它操作简单,界面友好,而且支持大多数Windows系统版本的制作。
接着,下载系统镜像文件。
在制作U盘启动盘之前,我们需要下载对应版本的系统镜像文件。
可以在官方网站上下载,也可以通过其他渠道获取,但一定要确保系统镜像文件的来源可靠,以免植入恶意软件。
然后,打开选定的启动盘制作工具,选择U盘驱动器和系统镜像文件,点击开始制作。
这个过程可能需要一段时间,取决于系统镜像文件的大小和U盘的速度。
制作过程中最好不要中断,以免导致U盘启动盘损坏。
最后,制作完成后,即可将U盘插入需要修复或安装系统的计算机上,重启计算机并设置从U盘启动。
在启动过程中,按照提示进行相应操作,就可以修复系统故障或者重新安装系统了。
通过以上的实践经验,我对制作U盘启动盘有了更深入的了解,并且懂得了如何选择合适的工具和操作步骤。
希望我的经验和体会能够帮助到有需要的朋友们,让计算机维护和系统安装变得更加轻松和高效。
感谢阅读!。
USB设备的驱动程序实现
USB设备的驱动程序实现
USB驱动是用来控制使用USB接口的设备的软件程序,其实现是将实
际的硬件设备抽象为虚拟的设备,使其能够在计算机操作系统上应用。
一
般来讲,当你将USB设备插入你的计算机时,它将通过计算机的USB主控
芯片找到USB设备,然后测试它的功能,并决定它是否能够被用来通信,
最后安装相应的驱动程序。
实际的USB驱动程序的实现有若干方法,其中
有两种常用的技术:应用程序编程接口(API)和驱动程序模板。
1、应用程序编程接口(API)
API是一组用于访问操作系统提供的服务和功能的特殊指令序列。
应
用程序编程接口(API)可以用来创建USB驱动程序,其实现包括以下步骤:
(1)定义硬件设备的描述
在编写USB驱动程序时,首先需要定义硬件设备,即定义设备的功能,记录其编号、最大支持通信速率、硬件连接方式、发送和接收设备数据的
方式以及支持的驱动软件要求等信息。
(2)实现设备驱动的关键函数
关键函数是控制USB设备正常工作所必需的函数,包括初始化函数、
发送和接收数据的函数、获取设备状态的函数以及关闭设备的函数等。
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 驱动开发原理USB驱动开发原理USB(Universal Serial Bus,通用串行总线)是一种用于连接计算机与外部设备的通信接口标准。
USB驱动开发是为了实现计算机与USB设备之间的数据传输而进行的软件编程。
本文将介绍USB驱动开发的原理和步骤。
一、USB驱动开发的基本原理USB驱动开发的基本原理是通过驱动程序与USB设备之间的通信来实现数据的传输。
USB驱动程序负责管理和控制USB设备,将计算机的请求传递给USB设备,并将USB设备的响应传递给计算机。
USB驱动开发的基本流程如下:1. 初始化USB驱动程序:驱动程序需要初始化USB控制器和USB设备。
这包括初始化数据结构、分配内存空间、设置中断处理程序等操作。
2. 建立通信连接:驱动程序需要与USB设备建立通信连接。
这包括检测和识别USB设备、分配端点和接口、设置传输模式等操作。
3. 数据传输:驱动程序通过读取和写入USB设备的寄存器来实现数据的传输。
这包括发送和接收数据包、处理中断和错误等操作。
4. 终止通信连接:在完成数据传输后,驱动程序需要关闭通信连接。
这包括释放端点和接口、清除中断和错误等操作。
二、USB驱动开发的步骤USB驱动开发的步骤如下:1. 确定USB设备的功能和特性:USB设备可以具有多种功能和特性,例如存储设备、打印机、摄像头等。
驱动程序需要了解USB设备的功能和特性,以便正确地管理和控制USB设备。
2. 编写驱动程序:驱动程序是实现USB驱动开发的核心部分。
驱动程序需要根据USB设备的功能和特性编写相应的代码,以实现数据的传输和设备的控制。
3. 进行调试和测试:在编写驱动程序后,需要进行调试和测试来验证驱动程序的正确性和稳定性。
这包括检查驱动程序的功能、性能和兼容性等方面。
4. 发布和维护驱动程序:在通过调试和测试后,可以将驱动程序发布给用户使用。
同时,还需要对驱动程序进行维护,以修复bug和提升性能。
三、USB驱动开发的挑战和解决方案USB驱动开发面临一些挑战,例如设备的兼容性、驱动程序的稳定性、传输性能的优化等。
USB设备驱动程序的设计
USB设备驱动程序的设计是1995年微软、IBM等公司推出的一种新型通信标准总线,特点是速度快、价格低、自立供电、支持热插拔等,其版本从早期的1.0、1.1已经进展到目前的2.0版本,2.0版本的最高数据传输速度达到480Mbit/s,能满足包括视频在内的多种高速外部设备的数据传输要求,因为其众多的优点,USB总线越来越多的被应用到计算机与外设的接口中,芯片厂家也提供了多种USB接口芯片供设计者用法,为了开发出功能强大的USB设备,设计者往往需要自己开发USB设备驱动程序,驱动程序开发向来是WINDOWS开发中较难的一个方面,但是通过用法特地的驱动程序开发包能减小开发的难度,提高工作效率,本文用法Compuware Numega公司的DriverStudio3.2开发包,开发了基于PHILIPS公司USB2.0控制芯片ISP1581的USB设备驱动程序。
USB设备驱动程序的模型图1 USB驱动程序模型USB设备驱动程序是一种典型的WDM(Windows Driver Model)驱动程序,其程序模型1所示。
用户应用程序工作在Windows操作系统的用户模式层,它不能挺直拜访USB设备,当需要拜访时,通过调用操作系统的API(Application programminginterface)函数生成I/O哀求信息包(IRP),IRP被传输到工作于内核模式层的设备驱动程序,并通过驱动程序完成与UBS外设通信。
设备驱动程序包括两层:函数驱动程序层和总线驱动程序层,函数驱动程序一方面通过IRP及API函数与应用程序通信,另一方面调用相应的总线驱动程序,总线驱动程序完成和外设硬件通信。
USB总线驱动程序已经由操作系统提供,驱动程序开发的重点是函数驱动程序。
USB设备驱动程序的设计用法DriverStudio3.2开发USB设备驱动程序该驱动程序的主要功能包括:从控制端点0读取规定个数的数据、向端点0发出控制指令、从端点2批量读数据、向端点2批量写数据,驱动程序的开发采纳DriverStudio3.2驱动程序开发包及VC++6.0,用法开发包中的向导程序DriverWizard就可以便利的生成驱动程序框架、模块及部分程序源代码,开发者只需要在功能模块中加入自己的实现程序就能完成复杂的USB设备驱动程序设计,下面介绍用法DriverWizard 生成ISP1581驱动程序的过程:1)启动DriverWizard,挑选DriverWorks Project制造一个名为USBDIO 的VC++项目;2)在驱动程序类型中挑选WDM Driver,WDM Function Driver,在硬件设备所支持的总线类型中挑选USB(WDM Only),在USB Vendor ID(厂商识别码)中填写0741,在USB Product ID(产品识别码)中填写0821;3)增强USB设备端点,设置端点2为批量输入/输出传输方式;4)在驱动程序支持的功能项中挑选Read、Write、Device Control、Cleanup;5)挑选自动产生批量读及批量写程序代码; 6)在I/O哀求IRP处理方式中挑选None,即IRP不排队;7)在接口的打开方式中挑选Symbolic link:UsbdioDevice,即应用程序以符号链接名打开设备;8)定义应用程序调用DeviceIoControl函数对WDM驱动程序通信的控制指令,结果2所示。
usb开发过程总结
USB开发过程总结(1)集线器检测新设备主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。
(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。
当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。
)(2)主机知道了新设备连接后每个集线器用中断传输来报告在集线器上的事件。
当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。
返回的消息告诉主机一个设备是什么时候连接的。
(3)集线器重新设置这个新设备当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。
集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。
(4)集线器在设备和主机之间建立一个信号通路主机发送一个Get_Status请求来验证设备是否激起重启状态.返回的数据有一位表示设备仍然处于重启状态。
当集线器释放了重启状态,设备就处于默认状态了,即设备已经准备好通过Endpoint 0 的默认流程响应控制传输。
即设备现在使用默认地址0x0与主机通信。
(5)集线器检测设备速度集线器通过测定那根信号线(D+或D—)在空闲时有更高的电压来检测设备是低速设备还是全速设备。
(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻).(6)获取最大数据包长度PC向address 0发送USB协议规定的Get_Device_Descriptor命令,以取得却缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节.注意,主机一次只能列举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0.以下操作雷同,不同操作系统设定时延是不一样的,比如说win2k大概是几毫秒,如果没有反应就再发送一次命令,重复三次。
一文入门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. 提交并分发驱动程序开发完成后,需要向操作系统供应商提交驱动程序以进行认证和分发。
遵守供应商的准则并提供必要的文档。
u盘启动盘的制作心得体会
u盘启动盘的制作心得体会在当今社会中,电脑已经成为我们日常生活中不可或缺的一部分。
而制作U盘启动盘则是我们操作电脑时常常会面对的问题之一。
在这篇文章中,我将分享我对制作U盘启动盘的心得和体会,希望能给读者带来一些启发和帮助。
首先,制作U盘启动盘之前,我们需要准备一些必要的工具和材料。
首当其冲的是一台可靠稳定的电脑,并且要确保U盘的容量足够用于存储操作系统镜像文件。
此外,还需要一个操作系统的ISO镜像文件,可通过官方渠道下载到。
最后,我们还需要一款U盘启动盘制作工具,如Rufus、UNetbootin等。
准备齐这些工具和材料后,我们便可开始制作U盘启动盘了。
制作U盘启动盘的第一步是插入U盘并打开制作工具。
接下来,我们需要选择正确的U盘,并设置其引导方式为UEFI或Legacy BIOS,具体设置要根据自己的电脑硬件来确定。
然后,我们需要选择正确的操作系统对应的ISO镜像文件,并将其导入到制作工具中。
此外,还可以进行一些自定义设置,如分区大小、文件系统选择等。
完成这些设置后,我们可以点击开始制作按钮,开始制作U盘启动盘。
制作过程中需要注意的是,制作时间可能会比较长,取决于U盘的容量和ISO镜像文件的大小。
此外,制作过程中电脑需要保持稳定的供电状态,避免在制作过程中出现突然断电等情况,会影响制作的成功率。
当制作完成后,我们可以将U盘插入需要安装操作系统的电脑中。
在开机时,进入BIOS设置界面,并将U盘设置为第一启动选项。
保存设置后,重新启动电脑,便可进入U盘启动盘进行操作系统的安装或修复。
通过多次制作U盘启动盘的实践,我深刻体会到了它的重要性和便利性。
制作好U盘启动盘后,我们可以随时随地进行操作系统安装和修复,大大提高了工作效率和便捷性。
同时,制作U盘启动盘还可以帮助我们解决一些因电脑系统问题而无法正常启动的困扰,节省了很多不必要的麻烦和时间。
当然,制作U盘启动盘也存在一些潜在的问题和挑战。
比如,在选择U盘启动盘制作工具时,我们要选择可靠的、常用的工具,并确保版本的兼容性。
开发usb驱动程序的方法
开发驱动程序的方法(连载一)开始驱动程序设计下面的文字是从的帮助中节选出来的,它让我们明白在开始设计驱动程序应该注意些什么问题,这些都是具有普遍意义的开发准则。
应该支持哪些请求在开始写任何代码之前,应该首先确定我们的驱动程序应该处理哪些例程。
如果你在设计一个设备驱动程序,你应该支持和其他相同类型设备的驱动程序相同的和请求代码。
如果你是在设计一个中间层驱动程序,应该首先确认你下层驱动程序所管理的设备,因为一个高层的驱动程序必须具有低层驱动程序绝大多数例程入口。
高层驱动程序在接到请求时,在确定自身当前堆栈单元参数有效的前提下,设置好中下一个低层驱动程序的堆栈单元,然后再调用将请求传递给下层驱动程序处理。
一旦决定好了你的驱动程序应该处理哪些,就可以开始确定驱动程序应该有多少个例程。
当然也可以考虑把某些处理的例程合并为同一例程处理。
例如在和里,对和处理的例程就是同一函数。
对和处理的例程也是同一个函数。
应该有多少个对象?一个驱动程序必须为它所管理的每个可能成为请求的目标的物理和逻辑设备创建一个命名对象。
一些低层的驱动程序还可能要创建一些不确定数目的对象。
例如一个硬盘驱动程序必须为每一个物理硬盘创建一个对象,同时还必须为每个物理磁盘上的每个逻辑分区创建一个对象。
一个高层驱动驱动程序必须为它所代表的虚拟设备创建一个对象,这样更高层的驱动程序才能连接它们的对象到这个驱动程序的对象。
另外,一个高层驱动程序通常为它低层驱动程序所创建的对象创建一系列的虚拟或逻辑对象。
尽管你可以分阶段来设计你的驱动程序,因此一个处在开发阶段的驱动程序不必一开始就创建出所有它将要处理的所有对象。
但从一开始就确定好你最终要创建的所有对象将有助于设计者所要解决的任何同步问题。
另外,确定所要创建的对象还有助于你定义对象的的内容和数据结构。
开始驱动程序开发驱动程序的开发是一个从粗到细逐步求精的过程。
的\ 目录下有一个庞大的样板代码,几乎覆盖了所有类型的设备驱动程序、高层驱动程序和过滤器驱动程序。
usb驱动总结
2、USB URB
1)urb(usb request block)是usb设备驱动中描述usb设备通信所用的基本载体和核心结构
2)urb处理流程:
创建urb函数,usb_alloc_urb(iso_packets(urb包含等时数据包个数),mem_flags);
usb_config_descriptor desc;根据协议对配置描述符的定义
}
5)接口描述:usb_interface
{
usb_host_interface;描述一个usb接口的设置
}
USB设备列表:usb_device_id
{
idVendor;制造商ID
idProduct;产品ID
OHCI HCD suppor(主控制驱动)
HID Devices
usb Human Interface Device support(设备驱动)
4、RNDIS功能,把开发板模拟成网卡
配置情况 device driver
}
配置VS设置
一个配置包含一个或者多个接口,一个接口包含一个或多个设置
6)端点描述:usb_host_endpoint
{
usb_endpoint_descriptor desc;对应协议中端点描述符
给核心提交urb int usb_submit_urb(urb,men_flags)
核心再传给usb主控制器驱动,usb主控制器驱动根据urb的设置,访问端点,把数据填充buff,或者把buff里的数据填充端点。
处理完后,会调用完成函数。当urb->status=0,表示urb处理成功,其实不管成功与否,都会调用完成函数
利用windriver开发了个usb的驱动,写个开发心得
利用windriver开发了个usb的驱动,写个开发心得利用windriver 开发了个usb的驱动,写个开发心得项目组需要利用2440采集数字电视的采样数据,所以让我开发一个usb的数据采集系统,就两个要求1 速度要达到500kbyte/s以上2 稳定由于之前没有做过windows驱动的经验,所以花了3,4天时间读了读ddk的文档,期间还上chinapub找个本书,读了免费的第1章,按照他配置了vc的编译环境,呵呵。
然后就吧ddk下面的bulkusb源代码进行了修改,写好usb device的驱动,有些了个应用程序,测试一下,采集数据是ok了,但是发现有时候蓝屏,特别是采集100m左右,就会出现蓝品!这下没办法了,由于我本身就对windows内核编程不熟悉,有调试了大概3,4天确认问题可能处在电源管理方面,联系到自己对这方面不是很熟悉,而且时间紧迫,没办法转向windriver开发!我安装的是9.21版本(请到迅雷下载)。
1. 驱动的开发:a 这步开发比较简单,首先确认你的device固件正确能枚举成功,然后将device连接到pc usb ho st 端。
b 按照向导指引刷出你的设备进行配置,然后点击编译按钮生成代码。
这部分内容请参考安装文档的快速开发向导!2.应用程序开发:最主要的几个函数是,opendevice 和readwrite 函数:其实大家只要摘录向导生成代码的内容即可,这里贴一个我的static WDU_DRIVER_HANDLE hDriver = 0;static DRIVER_CONTEXT DrvCtx ;static BOOL DLLCALLCONVDeviceAttach(WDU_DEVICE_HANDLE hDevice,WDU_DEVICE *pDeviceInfo, PVOID pUserData){DRIVER_CONTEXT *pDrvCtx = (DRIVER_CONTEXT *)pUserData;DEVICE_CONTEXT *pDevCtx, **ppDevCtx;DWORD dwInterfaceNum = pDeviceInfo->pActiveInterface[0]->pActiveAltSetting->Descript or.bInterf aceNumber;DWORD dwAlternateSetting = pDeviceInfo->pActiveInterface[0]->pActiveAltSetting->Descript or.bAlt ernateSetting;TRACE("\nDeviceAttach: received and accepted attach for vendor id 0x%x, ""product id 0x%x, interface %ld, device handle 0x%p\n",pDeviceInfo->Descriptor.idVendor,pDeviceInfo->Descriptor.idProduct,dwInterfaceNum, hDevice);/* Add our device to the device list */pDevCtx = (DEVICE_CONTEXT *)malloc(sizeof(DEVICE_CONTEXT));if (!pDevCtx){ERR("DeviceAttach: failed allocating memory\n");return FALSE;}BZERO(*pDevCtx);pDevCtx->hDevice = hDevice;pDevCtx->dwInterfaceNum = dwInterfaceNum;pDevCtx->dwVendorId = pDeviceInfo->Descriptor.idVendor;pDevCtx->dwProductId = pDeviceInfo->Descriptor.idProduct;pDevCtx->dwAlternateSetting = dwAlternateSetting;OsMutexLock(pDrvCtx->hMutex);for (ppDevCtx = &pDrvCtx->deviceContextList; *ppDevCtx;ppDevCtx = &((*ppDevCtx)->pNext));*ppDevCtx = pDevCtx;pDrvCtx->dwDeviceCount++;OsMutexUnlock(pDrvCtx->hMutex);OsEventSignal(pDrvCtx->hEvent);/* Accept control over this device */return TRUE;}static VOID DLLCALLCONV DeviceDetach(WDU_DEVICE_HANDLE hDevice, PVOID pUserData) {DRIVER_CONTEXT *pDrvCtx = (DRIVER_CONTEXT *)pUserData;DEVICE_CONTEXT **pCur;DEVICE_CONTEXT *pTmpDev;BOOL bDetachActiveDev = FALSE;TRACE("\nDeviceDetach: received detach for device handle 0x%p\n", hDevice);OsMutexLock(pDrvCtx->hMutex);for (pCur = &pDrvCtx->deviceContextList;*pCur && (*pCur)->hDevice != hDevice;pCur = &((*pCur)->pNext));if (*pCur == pDrvCtx->pActiveDev){pDrvCtx->pActiveDev = NULL;pTmpDev = *pCur;*pCur = pTmpDev->pNext;free(pTmpDev);pDrvCtx->dwDeviceCount--;OsMutexUnlock(pDrvCtx->hMutex);if (bDetachActiveDev){/* When hDeviceUnusedEvent is not signaled, hDevice is possibly in use,* and therefore the detach callback needs to wait on it until it is* certain that it cannot be used.* When it is signaled - hDevice is no longer used. */OsEventWait(pDrvCtx->hDeviceUnusedEvent, INFINITE);}}DWORD DriverInit(WDU_MATCH_TABLE *pMatchTables, DWORD dwNumMatchTables, const PCHAR sDriverName, const PCHAR sLicense, DRIVER_CONTEXT *pDrvCtx) {DWORD dwError;WDU_EVENT_TABLE eventTable;/* Set Driver Name */if (!WD_DriverName(sDriverName))ERR("Error: Could not set driver name to %s, exiting\n",sDriverName);return WD_SYSTEM_INTERNAL_ERROR;}dwError = OsEventCreate(&pDrvCtx->hEvent);if (dwError)ERR("DriverInit: OsEventCreate() failed on event 0x%p: error 0x%lx " "(\"%s\")\n", pDrvCtx->hEvent, dwError, Stat2Str(dwError));return dwError;}dwError = OsMutexCreate(&pDrvCtx->hMutex);if (dwError){ERR("DriverInit: OsMutexCreate() failed on mutex 0x%p: error 0x%lx " "(\"%s\")\n", pDrvCtx->hMutex, dwError, Stat2Str(dwError));return dwError;}dwError = OsEventCreate(&pDrvCtx->hDeviceUnusedEvent);if (dwError){ERR("DriverInit: OsEventCreate() failed on event 0x%p: error 0x%lx " "(\"%s\")\n", pDrvCtx->hDeviceUnusedEvent, dwError, Stat2Str(dwError));return dwError;OsEventSignal(pDrvCtx->hDeviceUnusedEvent);BZERO(eventTable);eventTable.pfDeviceAttach = DeviceAttach;eventTable.pfDeviceDetach = DeviceDetach;eventTable.pUserData = pDrvCtx;dwError = WDU_Init(&hDriver, pMatchTables, dwNumMatchTables, &eventTabl e, sLicense, WD_ACKNOWLEDGE);if (dwError)ERR("DriverInit: failed to initialize USB driver: error 0x%lx ""(\"%s\")\n", dwError, Stat2Str(dwError));return dwError;}return WD_STATUS_SUCCESS;}VOID DriverUninit(DRIVER_CONTEXT *pDrvCtx){DEVICE_CONTEXT *pCur, *pTmpDev;if (pDrvCtx->hEvent)OsEventClose(pDrvCtx->hEvent);if (pDrvCtx->hMutex)OsMutexClose(pDrvCtx->hMutex);if (pDrvCtx->hDeviceUnusedEvent)if (hDriver)WDU_Uninit(hDriver);/* Release any remaining devices */ pCur = pDrvCtx->deviceContextList; while (pCur){pTmpDev = pCur;pCur = pCur->pNext;free(pTmpDev);}}DWORD OpenUsbDevice( void){DWORD dwError;WORD wVendorId = 0;WORD wProductId = 0;WDU_MATCH_TABLE matchTable; BZERO(DrvCtx);wVendorId = USE_DEFAULT;wProductId = USE_DEFAULT;/* use defaults */if (wVendorId == USE_DEFAULT)if (wProductId == USE_DEFAULT)wProductId = DEFAULT_PRODUCT_ID;BZERO(matchTable);matchTable.wVendorId = wVendorId;matchTable.wProductId = wProductId;dwError = DriverInit(&matchTable, 1, DEFAULT_DRIVER_NAME,DEFAULT_LICENSE_STRING, &DrvCtx);if (dwError){goto Exit;}/* Wait for the device to be attached */dwError = OsEventWait(DrvCtx.hEvent, ATTACH_EVENT_TIMEOUT); if (dwError){if (dwError==WD_TIME_OUT_EXPIRED){ERR("Timeout expired for connection with the device.\n""Check that the device is connected and try again.\n");}else{ERR("main: OsEventWait() failed on event 0x%p: error 0x%lx " "(\"%s\")\n", DrvCtx.hEvent, dwError, Stat2Str(dwError));}goto Exit;OsMutexLock(DrvCtx.hMutex);if (!DrvCtx.dwDeviceCount){OsMutexUnlock(DrvCtx.hMutex);return 1;}OsMutexUnlock(DrvCtx.hMutex);if (!DrvCtx.pActiveDev)DrvCtx.pActiveDev = DrvCtx.deviceContextList; OsEventReset(DrvCtx.hDeviceUnusedEvent);return 0 ;Exit:DriverUninit(&DrvCtx);return dwError;}void CloseUsbDevice( void){DriverUninit(&DrvCtx);}DWORD UsbRead(char *pBuffer , DWORD dwBufferSize , PDWORD pdwBytesTransferred){DWORD dwError ;WDU_DEVICE_HANDLE hDevice;OsMutexLock(DrvCtx.hMutex);hDevice = DrvCtx.pActiveDev->hDevice;OsMutexUnlock(DrvCtx.hMutex);dwError = WDU_TransferBulk(hDevice, 0x81,TRUE, 0, pBuffer,dwBufferSize,pdwBytesTransferred, TRANSFER_TIMEOUT);return dwError ;}3.驱动程序的发布:这个也比较简单,请参考自带文档usb manual 的11章节,其实就是用到了他的一个wdreg工具,我写了个批处理文件,想安装的直接点批处理即可!windriver开发驱动是比较方便,至于稳定性,现在正在测试,看来比较稳定!速度方面500kB是没问题!不过速度方面pc驱动固然有影响,device的firmware影响也是很大的,特别是双缓冲的ep,处理不当速度很难上去!。
USB生产工艺
USB生产工艺USB的生产工艺指的是将USB接口及其相关组件制造成成品的过程。
USB的生产工艺一般包括以下几个步骤:1. 原材料准备:USB的主要原材料是金属、塑料、电子元件等。
生产工艺的第一步是准备这些原材料,其中金属通常是铜和镀锡铜。
塑料一般采用注塑成型,需要准备塑胶颗粒。
电子元件包括IC芯片、晶振、电容、电阻等,需要提前购买。
2. 模具制造:USB的外壳一般是塑料制成的,需要制作注塑模具。
模具制造是生产工艺中的关键步骤之一。
制作模具需要根据产品设计绘制图纸,然后将图纸交给模具厂进行加工。
模具制造完成后,就可以进行注塑成型。
3. 注塑成型:注塑成型是将塑胶颗粒加热熔化后注入模具中的过程。
注塑机会将塑胶颗粒加热并推入模具中,待塑胶冷却凝固后,即可取出成品。
这个过程需要控制好温度、压力和注塑时间,以保证成品的质量。
4. 钣金加工:USB的插头和线材通常是由金属材料制成的。
这一步需要进行钣金加工,通过剪裁、冲压、焊接等工艺将金属加工成所需要的形状。
5. 基板组装:USB的基板上有很多电子元件,这些元件需要在基板上进行焊接。
焊接方式常用的有手工焊接和波峰焊接。
焊接完成后,需要进行功能测试,确保焊接的质量。
6. 组装和测试:USB的组装包括将外壳、基板、插头和线材等组装到一起,形成最终的产品。
组装完成后,需要进行功能测试,确保产品的正常工作。
7. 包装和质量检测:USB生产完成后需要进行包装,一般采用塑料袋、纸盒等包装材料。
此外,还需要进行质量检测,测试产品是否符合规定的技术标准和质量要求。
以上是USB的生产工艺的基本步骤,不同厂商、不同产品可能会有一些细微的差别。
但总的来说,USB的生产工艺包括原材料准备、模具制造、注塑成型、钣金加工、基板组装、组装和测试、包装和质量检测等环节。
只有每个环节都严格进行,才能生产出质量可靠、性能稳定的USB产品。
linux设备驱动(28)usb驱动开发过程总结
linux设备驱动(28)usb驱动开发过程总结设备驱动程序是操作系统内核和机器硬件之间的接⼝,由⼀组函数和⼀些私有数据组成,是应⽤程序和硬件设备之间的桥梁。
在应⽤程序看来,硬件设备只是⼀个设备⽂件,应⽤程序可以像操作普通⽂件⼀样对硬件设备进⾏操作。
设备驱动程序是内核的⼀部分,主要完成以下功能:对设备的初始化和释放;把数据从内核传送到硬件设备和从硬件设备读取数据;读取应⽤程序数据传送给设备⽂件和回送应⽤程序请求的数据;检测和处理硬件设备出现的错误。
1 Linux USB⼦系统分析在Linux系统中,USB主机驱动程序由3部分组成:USB主机控制器驱动(HCD)、USB核⼼驱动(USBD)和不同种类的USB设备类驱动,如下所⽰。
其中HCD和USBD被称为协议软件或者协议栈,这两部分共同处理与协议相关的操作。
USB设备类驱动可以包含多个,不同的功能接⼝对应不同的驱动程序,它们不直接与USB设备硬件打交道,⽽是通过协议软件的抽象处理来完成与设备的不同功能接⼝之间的通信。
在Linux USB⼦系统中,HCD是直接和硬件进⾏交互的软件模块,是USB协议栈的最底层部分,是USB主机控制器硬件和数据传输的⼀种抽象。
HCD向上仅对USB总线驱动程序服务,HCD提供了⼀个软件接⼝,即HCDI,使得各种USB主机控制器的硬件特性都被软件化,并受USB总线驱动程序的调⽤和管理。
HCD向下则直接管理和检测主控制器硬件的各种⾏为。
HCD提供的功能主要有:主机控制器硬件初始化;为USBD层提供相应的接⼝函数;提供根HUB(ROOT HUB)设备配置、控制功能;完成4种类型的数据传输等。
USBD部分是整个USB主机驱动的核⼼,主要实现的功能有:USB总线管理;USB总线设备管理、USB总线带宽管理、USB的4种类型数据传输、USB HUB驱动、为USB设备驱动提供相关接⼝、提供应⽤程序访问USB系统的⽂件接⼝等。
其中USB HUB作为⼀类特殊的USB设备,其驱动程序被包含在USBD层。
制作u盘启动实训报告
制作u盘启动实训报告
本文报告将给出如何制作USB闪存启动的步骤。
首先,准备USB闪存驱动器,然后将你想要安装的操作系统映像文件,如Microsoft Windows ISO文件或其他Linux发行版映像文件拷贝到这个U盘上。
下一步,根据您的操
作系统类型,您可以使用Universal USB Installer(或UUI),这是一款自由开源的免
费软件,可轻松制作按键启动U盘,这是一种可在不让您在系统上安装任何内容的情况下
从USB闪存驱动器启动计算机的过程。
然后,插入U盘驱动器。
将其USB口连接到计算机上,然后运行UUI软件。
使用UUI软件,你只需点击几下就可以运行一次性安装程序,
以将操作系统映像文件复制到该U盘并准备进行系统启动。
最后,将U盘从计算机中拔出,将其插入你想启动的计算机上,并按下U盘启动键,即可开始启动。
总的来说,使用UUI对制作U盘启动只需几步:准备U盘驱动器,下载要部署的操作
系统映像文件,运行UUI软件,将该U盘插入到你想启动的计算机上,并按下U盘启动键
开始启动。
使用该方法,在不安装任何信息到计算机上的情况下,就可以更轻松,快速地
为系统实施新操作系统。
usb软驱
USB软驱概述USB软驱是一种外部设备,用于读写软盘。
它通过USB接口连接到计算机,提供了使用软盘的功能,使得没有软驱接口的现代计算机也能够读取和写入软盘。
本文档将介绍USB软驱的原理、使用方法以及一些常见问题的解决方案。
原理USB软驱的工作原理类似于常规软驱。
软盘的数据通过磁头读取或写入磁盘上的磁珠来完成。
USB软驱通过将计算机发送的指令转化为对应的信号,控制软盘的旋转和磁头的移动,从而实现数据的读写。
USB软驱通常内置了相应的软件和固件,用于实现与计算机的通信和数据处理。
使用方法使用USB软驱非常简单。
首先,将USB软驱插入计算机的USB接口。
接下来,在计算机上安装相应的驱动程序。
这些驱动程序通常随着软驱一起提供,也可以从驱动程序的官方网站上下载。
安装驱动程序后,计算机将能够识别USB软驱。
要读取或写入软盘,只需将软盘插入USB软驱的软盘槽中。
然后,打开计算机上的文件管理器或类似的软件,访问软盘的内容。
您可以像使用常规软驱一样操作软盘,包括复制、删除和重命名文件等。
常见问题解决方案1. USB软驱无法识别或连接不稳定如果USB软驱无法被计算机识别,或者连接不稳定,可以尝试以下解决方案:•确保驱动程序已正确安装。
重新安装驱动程序,或者更新到最新版本。
•检查USB软驱的USB接口,确保接口没有松动或损坏。
•将USB软驱连接到另一个USB接口上,以排除USB接口故障的可能性。
•确保计算机的操作系统已更新到最新版本。
有时,旧的操作系统版本可能不兼容USB设备。
2. 无法读取或写入软盘如果USB软驱无法读取或写入软盘,可以尝试以下解决方案:•检查软盘是否正常。
尝试使用另一个软盘进行测试,以确定问题是否出在软盘上。
•确保软盘没有写保护。
软盘上的写保护开关可能被错误地打开,导致无法写入数据。
•检查USB软驱的连接线缆是否正常。
如果连接线缆损坏或接触不良,可能导致数据传输错误。
•尝试在不同的计算机上使用USB软驱。
第一次制作U盘启动盘的心酸经历、方法详述和成功经验总结!求精求置顶哈
第一次制作U盘启动盘的心酸经历、方法详述和成功经验总结!求精求置顶哈第一次制作U盘启动盘的心酸经历、方法详述和成功经验总结!作为一个使用电脑20多年的老鸟,近日为了把我的1G的老U盘(移动之星1G ~2004年生产)做成启动盘,居然被小小的U盘折磨得差点走火入魔、欲仙欲死啊,搞得我火大、晕死!熬了3个通宵哈。
感觉真是有点无奈、无语,但是经过我的几天辛苦,上网搜索、下载工具、摸索、试验,最终还是取得了成功,真是痛并快乐着啊!为了让各位和我类似没有经验的朋友自己做启动盘有个参考借鉴,也为了纪念我这次的酸甜苦辣,特别写下此文,希望对看官有所帮助。
----------------------------------------------------------------------------------------------------------------------------------------------整篇文章我就采用日记叙事的文体吧。
如下所述:今天,突然想起要把我的U盘做成启动盘来用,以前只是把它拿来存文件。
那就开始干。
手头正好有以前无事下载的两个工具:HP格式化制启动盘和USBoot v1.70 简体中文版。
1。
用HP格式化制启动盘制作启动盘,怎么出现“U盘限制写入”的提示,无法完成格式化,失败;2。
那就用USBoot v1.70 简体中文版,按提示选择U盘设备、启动方式为USB-ZIP,整个制作过程很顺利,按其提示操作,完成。
嘿嘿,很简单嘛。
重启计算机,进CMOS,设置好启动顺序为FIRST:USB-ZIP;继续启动计算机,怎么不行啊,直接进XP了,再来一次,还是没用。
那就换启动方式,继续用USBoot v1.70 简体中文版,将U盘做成USB-HDD启动盘,制作过程很好完成。
重启,调CMOS为USB-HDD,启动,还是不行啊!为什么啊?明明显示做启动盘成功了的嘛。
再试试,重复N次,最终失败,这时很是迷茫啊。
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,并且已经编译好了各个库文件。
制作U盘驱动
用U盘装系统的三种方法(2009-02-18 16:23:31)标签:休闲用U盘装系统的三种方法我今天上午花了70多元买了一个4G的Kingston牌的U盘,学习制作U 盘启动盘,用U盘装系统。
我刚试验成了三种U盘装系统的方法,现在说出来让大家分享。
(一)制作好U盘启动盘。
1. 下载MaxDOS+WinPE,本论坛上有。
解压后,点击[安装.bat] 2.在安装界面输入“Y”回车。
3.安装程序将检测到你当前已连接好的U盘,并列表出来。
如果没有检测到U盘,请你重插U盘,并按“Y”返回主菜单,重新开始安装。
4.按任意键后,弹出格式化工具,-----------选中U盘---------------FAT32------------------ga开始格式化U盘。
5.格式化完成后,点击“确定”,再点击下面的“关闭”,安装程序将进入下一步,写入引导记录,按任意键进入写入引导记录。
6.按任意键后,(1)磁盘:选U盘。
(2)选项:可以不作任何改变,也可以勾选四项:不保存原来MBR,不引导原来MBR,输出详细信息,启动时不搜索软盘。
点[安装]开始写入引导。
7.写入引导记录后,回车------------退出。
8.按任意键,数据写入。
9.数据写入界面,在‘目标文件夹’处,点‘浏览’,选择U盘,点击[安装] 10.安装完成后,按任意键退出 11.至此,双启动U盘启动盘就制作好了,重启电脑,在BIOS里设置HDD中的USB启动。
12,把系统光盘镜像文件ISO和GHOST镜像文件复制到U盘里。
(二)用U盘安装系统的三种方法:1 U盘启动,进PE,开始--------程序------------磁盘光盘工具----------Virtual Drive Manager (PE自带的虚拟光驱)--------装载---------浏览---------选中U盘上的光盘镜像文件ISO,------打开--------------确定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB驱动的制作过程与体会作者:hoguowi联系QQ:175047360电子DIY于2007年6月一、.在写USB的驱动文件的时候,首先要安装WIN2KDDK.EXE,然后再安装DriverStudio2.6通过"开始"->"程序"->"NuMega DriverStudio"->"Tools"->"DDK Build Settings (SetDDKGo)"进行环境设置并由此进入VC++在VC的"TOOL"->"options"->"Directories"添加头文件目录C:\PROGRAM FILES\NUMEGA\DRIVERSTUDIO\DRIVERWORKS\INCLUDE不添加的话向导生成的文件#include <devintf.h> // DriverWorks将找不到头文件而出错二、安装完DDK和DriverStudio后,我们接下来是要编译库在你利用DriverWorks开始工作之前,你必须编译需要的库文件。
你可以在Microsoft Visual Studio 环境中,或者用命令行方式编译库文件。
下面介绍怎样在VC环境中编译库。
1从"Start"->...->Tools->DDK Build Settings2 单击"Launch Program"启动VC++;3.选择菜单 File|Open Workspace。
打开位于DriverStudio\DriverWorks\Source\vdwlibs.dsw的工作空间文件。
4选择菜单 Build|Batch Build(编译|批构件),在弹出的对话框中只选NdisVdm-Win32 NDIS VDM Checked.NdisVdm-Win32 NDIS VDM Free.VdwLibs-Win32 WDM Checked.VdwLibs-Win32 WDM Free.这四个库,然后单击Build编译。
应该就没有问题了,试试看吧!5.点击Build编译你选择的库。
------------------------------------------------------------------------------------------------------------------------------三、编译vdwlibs.dsw完毕没有错误后。
我们通过单击"Launch Program"再次启动VC++ 利用DriverStudio向导生成USB驱动图1 保存工程路径接着下一步Next,如图图2在此我们默认是WDM,直接Next下一步图3在此我们选USB(WDM only),USB Vendor ID 填写0471(为飞利浦厂商号),USB Product ID 填写1983(为我的出生年份),嘿嘿,这里是厂品号,你可以自己随便填写。
但是注意USB Vendor ID和USB Product ID要与固件程序一致。
否则驱动不了硬件。
填写完后,Next继续图4这里我们要填我们要用到的端点。
让驱动配置端点的类型与缓冲数据大小。
写完后点击Suggest,让系统自动为我们命名Endpoint Name,要说明的是端点0不需要我们配置,那是控制端点必须存在的!下面是我配置好的端点图5接下来Next下一步图6这里设置Driver Class 类名和File Name 文件名,默认PASS下去,当然你也可以改好听的名字。
:)继续Next下一步图7这里我全部打勾了,其实只需要用到Read,Write,Decive Control 就可以了。
我们主要是通过Decive Control来操作USB的好了,继续Next图8图9图8与图9是让驱动向导自动为我们生成端点读写程序。
这里我选了端点1。
端点2可以COPY端点1的代码,当然要相应改动一点程序。
快要完了。
再继续Next图10 这里我们不用理会,继续下一步。
图11 这里我们也不用理会,继续下一步图12这里的Class GUID是我们连接USB的接口,不需要改动。
我们选择Buffers一栏。
图13这里我们进行一些小批量数据的传输,选Buffered.如果是高速之类的数据则可以考虑Direct好了接着下面是比较复杂点的功能设置了。
设计用户接口函数要与硬件相匹配。
比如我要做USB通信,则要有数据的发送与接收。
但驱动向导只帮我们完成了枚举设备和一些电源管理的功能。
他还不能响应何时发数据何时接收数据。
这要我们来完成这部分的功能!下面我们添加几个功能,为读和写数据。
其中下面的HOGUOWI_IOCTL_CONTROL是,让PC发相应的厂商请求给USB硬件响应后面将会说到下面的功能HOGUOWI_IOCTL_CONTROLHOGUOWI_IOCTL_READ_DATAHOGUOWI_IOCTL_WRITE_DATA图14最后一步Next图15此时已经用向导完成了USB驱动文件。
但是我们要实现USB通信的读和写数据还要填加相应的代码!下面我们将会针对我们填加的IOCTLHOGUOWI_IOCTL_CONTROLHOGUOWI_IOCTL_READ_DATAHOGUOWI_IOCTL_WRITE_DATA着重讲解用向导生成USB驱动完后在VC的WorkSpace里应该有两个工程应当把要生成SYS驱动的工程设置为当前的Active的工程,然后再编译(BUILD)应该就可以了。
否则会生成EXE文件注意要选CLASS类为当前的Active的工程--------------------------------------------------------------------要完成PC对设备的USB端点1的写则要在驱动程序中加入下面的程序才行NTSTATUS Isp1581Device::HOGUOWI_IOCTL_WRITE_DATA_Handler(KIrp I){ULONG ulReturned = 0;NTSTATUS status = STATUS_SUCCESS;//t << "Entering Isp1581Device::HOGUOWI_IOCTL_WRITE_DATA_Handler, " << I << EOL;// TODO: Verify that the input parameters are correctreturnSTATUS_INV ALID_PARAMETERnot,// If// Always ok to write 0 elements./*if (I.WriteSize() == 0){rmation()0;=I.PnpComplete(this,STATUS_SUCCESS);return}ULONG dwTotalSize = I.WriteSize(CURRENT);ULONG dwMaxSize = m_Endpoint1OUT.MaximumTransferSize();if (dwTotalSize > dwMaxSize){ASSERT(dwMaxSize);dwTotalSizedwMaxSize;=}PUCHAR pBuffer = (PUCHAR)I.IoctlBuffer();*///KMemorydwTotalSize);Mem(pBuffer,//Mem.SetPageArray();// TODO: Handle the the HOGUOWI_IOCTL_WRITE_DATA request, or// defer the processing of the IRP (i.e. by queuing) and setSTATUS_PENDING.to// statusm_Endpoint1OUT.BuildBulkTransfer(=PURBpUrbchar*)I.IoctlBuffer(), // Where is data coming from?(unsignedI.IoctlInputBufferSize(), // How much data to read?OUT)=FALSE, //(FALSEdirectionNULL // Link to next URB);if (pUrb == NULL){pCompInfo;//delete=0;rmation()STATUS_INSUFFICIENT_RESOURCES);I.PnpComplete(this,return}status = m_Endpoint1OUT.SubmitUrb(pUrb, NULL, NULL, 1500L);ulReturnedpUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;=pUrb;//delete// TODO: Assuming that the request was handled here. Set rmation// to indicate how much data to copy back to the user.=ulReturned;rmation()status;=I.Status()0;//rmation()=status;return}要完成PC对设备的读比较复杂一点,因为SLA VE从机USB不能主动发USB数据给PC,要响应请求才能发数据给PC读。
这里我们设置硬件低层厂商请求读READ_DATA为 11.则我们添加PC驱动发送请求代码为:其中 #define CMD_READ_DATA 11,因为我们低层响应厂商请求读READ_DATA为 11,所以上层驱动也要相应的发厂商请求代码11。
随着低层硬件的改动而改动。
NTSTATUS Isp1581Device::ISP1581_IOCTL_CONTROL_Handler(KIrp I){NTSTATUS status = STATUS_SUCCESS;ULONG ulReturned = 0;//t << "Entering ISP1581Device::ISP1581_IOCTL_CONTROL_Handler, " << I << EOL;// TODO: Verify that the input parameters are correctSTATUS_INV ALID_PARAMETER// Ifreturnnot,// TODO: Handle the the ISP1581_IOCTL_CONTROL request, or// defer the processing of the IRP (i.e. by queuing) and set// statusSTATUS_PENDING.toPURB pUrb = m_Lower.BuildVendorRequest(buffertransferchar*)I.IoctlBuffer(), //(unsignedbuffertransfersizeI.IoctlInputBufferSize(),//0, // request reserved bitsrequest//(unsignedchar)CMD_READ_DATA,0, // ValueFALSE, // bInTRUE, // bShortOkNULL, // Link0 // Index);transmit//status = m_Lower.SubmitUrb(pUrb, NULL, NULL, 1500L);if(NT_SUCCESS(status)){pUrb->UrbControlVendorClassRequest.TransferBufferLength;=ulReturned}pUrb;//delete// TODO: Assuming that the request was handled here. Set rmation// to indicate how much data to copy back to the user.=ulReturned;rmation()=status;I.Status()0;//rmation()=status;return}完成这段还不行。