USB驱动编程指南

合集下载

USB驱动程序(较详细)一

USB驱动程序(较详细)一

USB驱动程序(较详细)一内核使用2.6.29.4拓扑结构上, 一个 USB 子系统并不是以总线的方式来分布; 它是一棵由几个点对点连接构成的树。

这些连接是连接设备和集线器的4线电缆(地, 电源, 和 2 个差分信号线), 如同以太网的双绞线。

USB主控制器负责询问每个USB设备是否有数据需要发送。

由于这个拓扑结构,一个 USB 设备在没有主控制器要求的情况下不能发送数据. 也就是说:USB是单主方式的实现,主机轮询各外设。

但是设备也可以要求一个固定的数据传输带宽,以保证可靠的音视频I/O。

USB只作为数据传输通道,对他所收发的数据格式没有特殊的内容和结构上的要求,也就是类似于透传。

Linux内核支持两种主要类型的USB驱动程序:Host系统上的驱动程序(USB device driver)和device上的驱动程序(USB gadget driver)(设备端驱动)。

USB 驱动程序存在于不同的内核子系统和USB硬件控制器之中。

USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,它隐藏了USB控制器的硬件细节。

从这里我们要知道:《LDD3》所谓的USB驱动是针对USB核心提供的接口而写的,并不是真正去操纵USB硬件控制器中的寄存器。

这样你必须保证你的板子上CPU的USB硬件控制器的驱动是可用的。

否则您就得先搞定CPU的USB硬件控制器的驱动才行。

以下是Linux内核中USB驱动的软件构架:如左下图所示,从主机侧的观念去看,在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。

因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB 设备如何与主机通信。

USB设备的驱动程序实现

USB设备的驱动程序实现

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


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

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

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


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

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

WizPro系列编程器USB驱动安装说明-V1

WizPro系列编程器USB驱动安装说明-V1

WizPro100 系列Flash MCU 编程器USB驱动的安装说明版本 1.01.将设备连到电脑的任一USB端口上,此时电脑屏幕上会出现如下的找到新硬件对话窗口:2.请选择“是,仅这一次(Y)”并单击“下一步”,此时电脑屏幕会出现如下窗口:3.请选择“从列表或指定位置安装(高级)(S)”并单击“下一步”,则电脑屏幕将出现如下窗口:4.按上图示,按“浏览”按钮,选择正确的驱动程序位置,并单击“下一步”,系统将自动安装相应的驱动程序并显示如下信息窗口:5.请单击“完成”,则电脑屏幕会再次出现如下的找到新硬件的对话窗口:6.选择“是,仅这一次(Y)”并单击“下一步”,此时会出现如下的对话窗口:7.请选择“从列表或指定位置安装(高级)(S)”并单击“下一步”,则屏幕显示如下:8.按“浏览”按钮,选择正确的驱动程序位置,并单击“下一步”,系统将自动安装相应的驱动程序并显示如下对话窗口:9.请单击“完成”,则系统完成驱动程序的安装,此时设备可用;10.说明:该USB为虚拟串口设备,安装完成后会在设备一栏看到一个串口,正常情况下,其会在原有的基础上增加一个,例如,若本机原来已有2个串口,则该设备会增加一个“COM3”,若原来没有设备,则会增加一个串口“COM1”,若一台电脑有使用多个烧写器,则每一个烧写器会建立一个独立的串口,并以次增加;因此,但完成上述的安装后立即启动烧写器的PC应用程序,则最大编号的一个串口即是该设备的对应串口;如下所示:1.启动烧写PC应用程序的串口选择对话窗口(该机原来已有3个串口),如下图示2.选择下拉菜单来选择设备所对应的COM口,此处为“COM4”。

3.选择数字最大的一个COM口(COM4),并按按钮继续,这时编程器会发出哔的一声,同时应用程序进入主对话窗口,并显示相应的设备的名称合版本信息;否则,系统会显示“未发现设备”,若设备已经连接,则有可能为串口选择不对,需要重新选择串口并查找设备;具体操作见相应的应用程序手册;。

USB驱动程序编写

USB驱动程序编写

分类∙首页标签∙about love(8)∙recollect(6)∙Study DAY(17)∙FPGA(16)∙USB(3)∙VOIP(1)∙Linux(17)∙ C Language(25)日历<<< 2006 - 5 >>>日一二三四五六123456 78910111213 14151617181920 21222324252627 28293031登陆用户名:密码:记住密码登录用户注册忘记密码最新文章∙鬼故事下载∙鬼故事下载∙OS 推荐∙ARM的开发步骤∙s3c44b0x + uclinux∙74系列芯片资料∙集成电路应用索引∙密码学里的随机数发生器∙研究密码学的网站集锦∙10分钟完成一个USB驱动程序回复∙::签写留言::∙WISHBONE System-on站点统计∙日志总数:96∙评论数量:7∙留言数量:1∙访问次数:6461∙加为好友发送短信友情链接sunny sky with wind and rainWork Place10分钟完成一个USB驱动程序2006-5-16 9:45:0010分钟完成一个USB驱动程序很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的。

但是,现在也有不少人都开始借助一些辅助工具。

笔者去年开始接触到riverStudio,发现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和DDK的结合很好。

当然,也有很多人觉得用DriverStudio不够正宗,或者说不能很好的理解Windows Device Driver的架构。

我感觉这就有点像MFC和SDK的关系,关于这个问题在很多地方都有争论,比如在万千新闻组上,就讨论了将近2个月。

每个人都有自己的最爱,都有自己的习惯,只要你能把事情做好,我想用什么方法应该都是一样的。

如果你已经习惯了用DDK开发,那完全还可以继续用下去;如果你觉得DriverStudio不错,那尝试用一个可以给你按照OOP概念来编程的工具有什么不好呢?在驱动开发网上,经常看到有人询问一些关于DriverStudio的使用的问题。

RIGOL产品USB程控开发指南

RIGOL产品USB程控开发指南

RIGOL产品USB程控开发指南1. 正确安装USB驱动首次使用USB线连接计算机与RIGOL产品时计算机会自动弹出“找到新硬件向导”,如图1-2所示。

如果没有弹出,可在“我的电脑”的右键菜单中选择“管理”,选择“设备管理器”进入图1-1所示的界面。

图1-1 设备管理器这时会如图1-1所示看到USB Device处有一个黄色感叹号,表明该设备没有驱动。

这时可在该项目的右键菜单中选择“更新驱动程序”则进入如图1-2所示的“找到新硬件向导”。

图1-2 新硬件向导选择“否,暂时不”进入下一步,如图1-3所示界面。

图1-3 从指定位置安装驱动选择“从列表或指定位置安装”,进入下一步,如图1-4所示界面。

图1-4 在指定位置上搜索驱动选择“在这些位置上搜索最佳驱动程序”,选择“在搜索中包括这个位置”浏览选中DEMO程序中的Dirver文件夹。

进入下一步,如图1-5所示界面。

图1-5 更新驱动在自动安装结束后,选择“完成”即完成硬件更新。

驱动名为“Rigol USB Test and Measurement Device” ,如图1-6所示界面。

图1-6 完成向导2.USB外设初始化使用USB接口对仪器进行程控开发需要首先对USB接口进行初始化,初始化的内容包括“获取当前系统中的设备数目”以及“外设仪器识别”两个部分。

在RigolTMCUsb_UI.dll中提供了获取系统中TMC设备数目的函数“GetTMCDeviceNum”。

该函数返回值为Byte型变量。

可用于判断系统中连接的TMC设备数目,0表示没有TMC设备连接。

在得到了所连接的TMC外设数量后,系统都会为每一个外设都分配一个设备序号,该序号用于在读/写USB函数中的“devIndex”参数,区分该读/写命令所对应的仪器。

识别仪器时可采用SCPI 命令“*IDN?”来查询仪器厂商名、型号、序列号、版本号等信息。

3.读写USB函数说明3.1 建立传输标志在进行写USB函数前,需要为该“写”操作建立一个独立的传输标志,BuildBulkbTag()函数就提供了建立传输标志的功能,其中的bulkOutbTag定义为0到255之间的字节形变量,每次调用该函数后,bulkOutbTag自加1,该参数用于写USB函数中做传输标志位参数“bTag”使用。

USB编程器软件安装和驱动程序安装说明

USB编程器软件安装和驱动程序安装说明

软件安装说明首先将光碟上的内容复制到D盘或者E盘,复制完后,在D盘或者E盘打开文件夹里面的内容,看到“”双击进入里面,将这个发送到桌面上,在桌面上双击软件,如图:然后在桌面上的软件打开之后,安装这二个驱动程序,点击“”就可以安装编程器的二个驱动程序了,如提示这样的图标LCDUSB编程器驱动程序安装说明为了能更清楚的了解编程器的关键部件位置,方便下面的叙述,请看一下上面的图片,上图中标注了各部分的功能。

此处有三个跳线选择端口,标有1、2都是写液晶数据的跳线接口,3是在线读写DVD时的跳线选择端口。

接口定义:1:12-15针,2:4-11针,3:13-14针(用于读写DVD数据)本编程器在正式使用之前,必须安装驱动,因使用编程器上的IC座读写芯片(以下简称“编程器状态”)与通过连线在DVD解码板上在线读写(以下简称“在线读写状态”)使用的不是两种通讯模式,所以要经过两次驱动。

状态指示灯“”为绿色表示为“在线读写状态”,此二个灯全亮“”表示为“编程器状态”。

下面详细叙述驱动的安装过程。

注意:在开始安装驱动时,请不要将编程器与电脑连接,在下面提到需要插入编程器的时候再连接编程器,否则您的安装可能与本说明不符而使安装变复杂。

01:点击桌面上软件的“”。

会看到下图所示的窗口界面。

02、鼠标单击上图所示的“”按钮,稍等片刻会看到下图所示的窗口界面,表示正在安装驱动文件。

03、在上图所示的复制进程结束后,会出现下图所示的窗口界面,表示驱动的安装前期工作完成。

04、在上图所示的界面中点“确定”按钮,上图所示的界面消失,表示“编程器状态”的驱动预安装完毕。

05、接下来我们安装“在线读写状态”的驱动,鼠标点击驱动软件的“”的向下的小箭头,将鼠标向下移动到“”选择“在线读写驱动.INF”,会看到下图所示的窗口界面。

06、鼠标单击上图所示的“”按钮,稍等片刻会看到下图所示的窗口界面,表示正在安装驱动文件。

07、在上图所示的复制进程结束后,会出现下图所示的窗口界面,表示驱动的安装前期工作完成。

(简易USB驱动)开发指导

(简易USB驱动)开发指导

实验七(2)设备驱动开发指导块设备种类多,使用广泛,其驱动程序的开发也比字符设备复杂。

通过本实验,大家要开发一个实际块设备(U盘)的驱动程序,将能够更深入地掌握块设备驱动程序的开发方法。

Linux下已经有一个通用的U盘驱动程序usb-storage.o,其源程序放在目录drivers\usb\storage下(相对于内核源码根目录)。

但这个驱动的实现相当复杂,本实验希望开发一个相对简单些的U盘驱动程序,不求高性能,只求结构明朗、清晰易懂,主要是让大家掌握一个实际块设备的驱动方式,从而加深理解。

事实上,本实验开发的驱动程序应该能够适用于所有基于Bulkonly传输协议的USB大容量存储设备(USB Mass Storage),比如USB移动硬盘和USB外置光驱,USB闪存盘(U 盘)只是其中的一种。

由于USB大容量存储设备具有容量大、速度快、连接灵活、即插即用、总线供电等优点,它们得到了广泛使用,掌握这类设备驱动程序的开发技术无疑具有很强的实用性。

实验内容编写一个U盘驱动程序myudisk,只要求能够驱动某个型号的U盘,能够支持U盘的常规操作,如命令hexdump、mke2fs和mount等。

同时,要求在系统内核日志中显示出U盘的容量。

若有余力,可增加多分区支持功能。

实验基础和思路在教材中P130,讲解了如何编写一个Ramdisk块设备驱动程序(sbull.c),称为radimo;在文献《Linux Device Drivers》讲解了如何编写一个USB设备驱动程序,并以Linux源代码中的usb-skeleton.c为例。

虽然前者驱动的并不是一个实际的块设备,且后者又只是针对usb字符设备,但是它们提供了一个不错的基础,通过合并我们就能基本得到一个支持usb块设备的驱动程序。

之所以说基本得到,是因为合并后只是有了块设备、USB设备的驱动支持框架,但还缺一样:对U盘(USB块设备)的实际访问操作。

USB驱动程序编写和安装导入

USB驱动程序编写和安装导入

USB驱动程序编写和安装导入10分钟完成一个USB驱动程序很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的。

但是,现在也有不少人都开始借助一些辅助工具。

笔者去年开始接触到riverStudio,发现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和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,并且已经编译好了各个库文件。

usb驱动教程

usb驱动教程

usb驱动教程Windows驱动编程基础教程我经常在网上遇到心如火燎的提问者。

他们碰到很多工作中的技术问题,是关于驱动开发的。

其实绝大部分他们碰到的“巨大困难”是被老牛们看成初级得不能再初级的问题。

比如经常有人定义一个空的UNICODE_STRING,然后往里面拷贝字符串。

结果无论如何都是蓝屏。

也有人在堆栈中定义一个局部SPIN_LOCK,作为下面的同步用——这样用显然没有任何意义。

我无法一一回答这些问题:因为往往要耐心的看他们的代码,才能很不容易的发现这些错误。

而且我又不是总是空闲的,可以无休止的去帮网友阅读代码和查找初级错误。

但是归根结底,这些问题的出现,是因为现在写驱动的同行越来越多,但是做驱动开发又没有比较基础的,容易读懂的资料。

为此我决定从今天开始连载一篇超级入门级的教程,来解决那些最基本的开发问题。

老牛们就请无视这篇教程,一笑而过了。

Windows驱动编程基础教程(1.1-1.3)1.1 使用字符串结构常常使用传统C语言的程序员比较喜欢用如下的方法定义和使用字符串:char *str = { “my first string” }; // ansi字符串wchar_t *wstr = { L”my first string” }; // unicode字符串size_t len = strlen(str); // ansi字符串求长度size_t wlen = wcslen(wstr); // unicode字符串求长度printf(“%s %ws %d %d”,str,wstr,len,wlen); // 打印两种字符串但是实际上这种字符串相当的不安全。

很容易导致缓冲溢出漏洞。

这是因为没有任何地方确切的表明一个字符串的长度。

仅仅用一个’\0’字符来标明这个字符串的结束。

一旦碰到根本就没有空结束的字符串(可能是攻击者恶意的输入、或者是编程错误导致的意外),程序就可能陷入崩溃。

使用高级C++特性的编码者则容易忽略这个问题。

USB编程电缆驱动程序安装指南详细说明书

USB编程电缆驱动程序安装指南详细说明书

USB编程电缆驱动程序安装说明概述USB编程电缆是通过将电脑的USB接口模拟成传统的串行口(通常为COM3),从而使用现有的编程软件或通信软件,通过编程电缆与PLC等设备的传统接口进行通信。

功能●支持的操作系统Windows2000/Windows XP●完全兼容USB V1.1和USB CDC V1.1规范●USB总线供电(非隔离电缆)、或USB总线供电与PLC的编程口同时供电(隔离型电缆)●波特率:300bps~1Mbps自动适应●每台PC只支持一根USB编程电缆系统要求请在使用USB编程电缆之前确认你的电脑是IBM PC兼容型并具备以下最低系统要求:●Intel兼容586DX4-100MHz中央处理器或更高●一个标准的USB接口(4-pin A型插座)●运行操作系统为Windows2000或Windows XP驱动程序的安装驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行:1、打开将要连接USB编程电缆的电脑电源,并确认电脑的USB口已经启动并正常工作。

2、将USB编程电缆插入电脑的USB接口,Windows将检测到设备并运行添加新硬件向导帮助你设置新设备,插入驱动程序光盘并单击下一步继续。

如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中,展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键并运行更新驱动程序。

3、Windows将检测到安装信息,显示“ USB High Speed Serial Converter ”设备,并出现如下没有通过Windows徽标测试的信息框,单击“仍然继续”。

4、继续安装,让Windows拷贝驱动程序文件到你的硬盘。

5、当Windows显示完成找到新硬件向导,单击“完成”结束安装。

6、安装完成后,请确认在Windows的“开始\设置\控制面板\系统\硬件\设备管理器”菜单的“端口(COM和LPT)”展开条目中出现“ USB Serial Port(COMx)”,这个COMx就是USB编程电缆使用的COM口号。

一文入门usb设备的驱动编写方法

一文入门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. 提交并分发驱动程序开发完成后,需要向操作系统供应商提交驱动程序以进行认证和分发。

遵守供应商的准则并提供必要的文档。

USB编程器使用说明

USB编程器使用说明

一体板USB编程器使用说明本说明仅介绍使用一体板USB编程器上的IC座直接操作芯片的说明,在线读写的说明另有介绍。

一、芯片的位置方向及编程器设置:一体板USB编程器的此微动开关为“编程读写和在线读写转换选择开关”,此二个灯全亮“”表示工作在“编程器IC座读写状态”,这样方可使用IC座对芯片进行操作。

按一下,单独此指示灯亮为“在线读写32脚或者48脚的储存IC的数据,”如29、39系列。

此微动开关为“在线读写数据转换开关”,这个微动开关就是用来转换二条数据线的方式,这样就不用焊下来反接线,方便很多。

三、应用程序的使用:复制过程是在光盘的该文件夹上点鼠标右键,选择“复制”,然后到硬盘的某个盘(分区)下,在空白处点鼠标右键,选择“粘贴”即可将该文件夹复制到硬盘上了,然后就可以取出光盘了。

双击,打开的主画面如图:USB口24-25系列编程器:“”,本编程器在使用IC座操作芯片的配套软件,可操作24与25系列芯片。

DVD-IRKEY:“”用于修改替换DVD数据文件中的遥控代码的工具软件。

电视ROM数据文件管理:“”,内含近两万个电视数据的查询软件,操作方便简洁。

为了操作方便,可将这三款软件发送快捷方式到桌面,以后就可以在桌面直接启动这三款软件了。

操作方法是,在某文件上点鼠标右键,依次选择“发送到----桌面快捷方式”,这时您就可以使用桌面的图标启动该软件了。

下面分别介绍这三款软件的功能用法:UCB口24-25系列编程器软件:在使用此软件的时候,请先插入编程器到电脑,是状态指示灯为红色,并装上芯片到IC座上。

否则可能会引起程序假死现象,请注意。

芯片选择区域:用于选择您想操作的芯片型号,对于24系列的芯片,直接鼠标点选相应的型号,对于25系列的芯片,选择该芯片的存储字节的数量即可,例如25T80芯片请选择“1M字节”。

状态指示:底部左侧的文字用于显示当前是否已经插入编程器,但不检测是否插入芯片。

代码编辑区:中间的白色矩形区域是用于显示打开的文件内容或从存储器芯片中读出的数据内容,为十六进制代码。

USB驱动简明配置

USB驱动简明配置

USB驱动的制作过程与体会作者:hoguowi电子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编译。

USB驱动程序说明

USB驱动程序说明

如何安装USB驱动
欢迎使用我公司黑匣子/记录仪,要使用本产品,需先安装USB驱动程序。

请按照以下步骤和安装画面进行驱动的安装:
1、将产品配套驱动光盘放入电脑的光驱内;
2、打开光盘中的文件夹,双击文件,会出现以下提示:
3、等待程序自动安装完成,直到以上安装画面自动消失;
4、用温(湿)度黑匣子自带的USB线连接电脑的USB接口,系统会自动找到此设备的COM口;
5、系统自动搜索驱动程序,等待系统提示“你的新硬件已经安装且可以使用”;
6、要查看安装后的设备,可以在“我的电脑”上点击鼠标右键,在弹出的功能表上点
击“属性”:
7、在打开“系统属性”对话框后,单击“硬件”选项中的“设备管理器”
8、可以在打开的“设备管理器”窗口中,发现你所安装的硬件端口号,如下图:
9、完成完上述所有的步骤,恭喜您,USB驱动安装已经完成,
您可以使用黑匣子/记录仪了!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

USB驱动编写指南1 概念:模块和设备文件1.1模块模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。

模块最主要的用处就是用来实现设备驱动程序。

Linux下对于一个硬件的驱动,可以有两种方式:直接加载到内核代码中,启动内核时就会驱动此硬件设备。

另一种就是以模块方式,编译生成一个.ko文件(在2.4以下内核中是用.o作模块文件,我们以2.6的内核为准,以下同)。

当应用程序需要时再加载到内核空间运行。

所以我们所说的一个硬件的驱动程序,通常指的就是一个驱动模块。

1.2设备文件设备文件对于一个设备,它可以在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。

这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。

主设备号表明了某一类设备,一般对应着确定的驱动程序;次设备号一般是区分不同属性,例如不同的使用方法,不同的位置,不同的操作。

这个设备号是从/proc/devices文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。

这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。

驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序。

对于一个硬件,Linux是这样来进行驱动的:首先,我们必须提供一个.ko的驱动模块文件。

我们要使用这个驱动程序,首先要加载它,我们可以用insmod xxx.ko,这样驱动就会根据自己的类型(字符设备类型或块设备类型,例如鼠标就是字符设备而硬盘就是块设备)向系统注册,注册成功系统会反馈一个主设备号,这个主设备号就是系统对它的唯一标识。

驱动就是根据此主设备号来创建一个一般放置在/dev目录下的设备文件。

在我们要访问此硬件时,就可以对设备文件通过open、read、write、close等命令进行。

而驱动就会接收到相应的read、write操作而根据自己的模块中的相应函数进行操作了。

2 USB驱动程序如何应用了解了上述理论后,我们就可以动手写驱动程序,如果你基本功好,而且写过linux下的硬件驱动,USB的硬件驱动和pci_driver很类似,那么写USB的驱动就比较简单了,如果你只是大体了解了linux的硬件驱动,那也不要紧,因为在linux的内核源码中有一个框架程序可以拿来借用一下,这个框架程序在/usr/src/~(你的内核版本,以下同)/drivers/usb下,文件名为usb-skeleton.c。

写一个USB的驱动程序最基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)(当然也可以不用urb来传输数据,下文我们会说到)。

2.1驱动程序支持的设备驱动程序支持的设备有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:/* 驱动程序支持的设备列表*/static struct usb_device_id skel_table = {{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },{ } /* 终止入口*/};MODULE_DEVICE_TABLE (usb, skel_table);对于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_ID和USB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID 了,我们在程序中把定义的值改为我们这款USB的,如:/* 定义制造商和产品的ID号*/#define USB_SKEL_VENDOR_ID 0x1234#define USB_SKEL_PRODUCT_ID 0x2345这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。

或者查看厂商的USB 设备的手册也能得到,在我机器上运行lsusb是这样的结果:Bus 004 Device 001: ID 0000:0000Bus 003 Device 002: ID 1234:2345 Abc Corp.Bus 002 Device 001: ID 0000:0000Bus 001 Device 001: ID 0000:0000得到这两个值后把它定义到程序里就可以了。

2.2注册USB驱动程序注册USB驱动程序所有的USB驱动程序都必须创建的结构体是struct usb_driver。

这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。

创建一个有效的struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的:static struct usb_driver skel_driver = {.owner = THIS_MODULE,.name = "skeleton",.probe = skel_probe,.disconnect = skel_disconnect,.id_table = skel_table,};struct module *owner :指向该驱动程序的模块所有者的批针。

USB核心使用它来正确地对该USB驱动程序进行引用计数,使它不会在不合适的时刻被卸载掉,这个变量应该被设置为THIS_MODULE宏。

const char *name:指向驱动程序名字的指针,在内核的所有USB驱动程序中它必须是唯一的,通常被设置为和驱动程序模块名相同的名字。

int (*probe) (struct usb_interface *intf,const struct usb_device_id *id):这个是指向USB驱动程序中的探测函数的指针。

当USB核心认为它有一个接口(usb_interface)可以由该驱动程序处理时,这个函数被调用。

void (disconnect)(struct usb_interface *intf):指向USB驱动程序中的断开函数的指针,当一个USB接口(usb_interface)被从系统中移除或者驱动程序正在从USB核心中卸载时,USB 核心将调用这个函数。

const struct usb_device_id *id_table:指向ID设备表的指针,这个表包含了一列该驱动程序可以支持的USB设备,如果没有设置这个变量,USB驱动程序中的探测回调函数就不会被调用。

在这个结构体中还有其它的几个回调函数不是很常用,这里就不一一说明了。

以structusb_driver 指针为参数的usb_register_driver函数调用把struct usb_driver注册到USB核心。

一般是在USB驱动程序的模块初始化代码中完成这个工作的:static int __init usb_skel_init(void){int result;/* 驱动程序注册到USB子系统中*/result = usb_register(&skel_driver);if (result)err("usb_register failed. Error number %d", result);return result;}当USB驱动程序将要被卸开时,需要把struct usb_driver从内核中注销。

通过调用usb_deregister_driver来完成这个工作,当调用发生时,当前绑定到该驱动程序上的任何USB 接口都被断开,断开函数将被调用:static void __exit usb_skel_exit(void){/* 从子系统注销驱动程序*/usb_deregister(&skel_driver);}2.3探测和断开探测和断开当一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。

当驱动程序因为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。

探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它还把所需的任何设备相关信息保存到一个局部结构体中,下面是探测函数的部分源码,我们加以分析。

/* 设置端点信息*//* 只使用第一个批量IN和批量OUT端点*/iface_desc = interface->cur_altsetting;for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {endpoint = &iface_desc->endpoint.desc;if (!dev->bulk_in_endpointAddr &&(endpoint->bEndpointAddress & USB_DIR_IN) &&((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)== USB_ENDPOINT_XFER_BULK)) {/* 找到一个批量IN端点*/buffer_size = endpoint->wMaxPacketSize;dev->bulk_in_size = buffer_size;dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);if (!dev->bulk_in_buffer) {err("Could not allocate bulk_in_buffer");goto error;}}if (!dev->bulk_out_endpointAddr &&!(endpoint->bEndpointAddress & USB_DIR_IN) &&((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)== USB_ENDPOINT_XFER_BULK)) {/* 找到一个批量OUT端点*/dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;}}if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {err("Could not find both bulk-in and bulk-out endpoints");goto error;}在探测函数里,这个循环首先访问该接口中存在的每一个端点,给该端点一个局部指针以便以后访问:for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {endpoint = &iface_desc->endpoint.desc;在一轮探测过后,我们就有了一个端点,在还没有发现批量IN类型的端点时,探测该端点方向是否为IN,这可以通过检查USB_DIR_IN是否包含在bEndpointAddress端点变量有确定,如果是的话,我们在探测该端点类型是否为批量,先用USB_ENDPOINT_XFERTYPE_MASK位掩来取bmAttributes变量的值,然后探测它是否和USB_ENDPOINT_XFER_BULK值匹配:if (!dev->bulk_out_endpointAddr &&!(endpoint->bEndpointAddress & USB_DIR_IN) &&((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)== USB_ENDPOINT_XFER_BULK))如果所有这些探测都通过了,驱动程序就知道它已经发现了正确的端点类型,可以把该端点的相关信息保存到一个局部结构体中以便稍后用它来和端点进行通信:/* 找到一个批量IN类型的端点*/buffer_size = endpoint->wMaxPacketSize;dev->bulk_in_size = buffer_size;dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);if (!dev->bulk_in_buffer) {err("Could not allocate bulk_in_buffer");goto error;}因为USB驱动程序要在设备的生命周期的稍后时间获取和接口相关联的局部数据结构体,所以调用了usb_set_intfdata函数,把它保存到struct usb_interface结构体中以便后面的访问/* 把数据指针保存到这个接口设备中*/usb_set_intfdata(interface, dev);我们以后调用usb_set_intfdata函数来获取数据。

相关文档
最新文档