当前位置:文档之家› USB复合设备

USB复合设备

USB复合设备
USB复合设备

usb真是很强很大,强是现在很多产品都用她来做,为了方便,不用开发驱动。大是因为usb 协议太多了,就光hid都有好多种。还是扯回正题,这次总

结复合型设备,前面总结了hid和mass storage设备,如果在正常情况下两个设备都正常了的,那么现在就可以来做做复合型设备了。

百度和google都没找到她的定义,那么我来定义一下(见笑),复合型设备:具有两种usb 设备功能的一种设备,无论是相同的设备功能,还是不同的

设备功能,只要同时具有两种以上的功能就是复合型设备。其实很直白,大家都看的出来。

现在就把hid keyboard and usb mass storage复合起来,组成一个设备。

首先要说的是既然是复合型设备,那么就有多个interface,这里有两个设备,那么就需要两个interface,需要几个设备描述符呢,一个就够了,那配

置描述符呢,也只需要一个就好了,那需要几个端点描述符呢,这个嘛,我就不知道了(开玩笑,你在总结你不知道),这个就得讲讲usb的几种传输

模式了。

在usb里面一共有四种传输:控制传输、中断传输、批量传输、等时传输。控制和批量端点用于异步的数据传输,驱动需要他们就立马工作。中断和等

时端点是周期性的,即在固定时间段连续的传输数据。是不是有点熟悉,的确,前面总结过的,在这里再提提。所以有几个端点,还是得看你在用哪种

传输模式,hid keyboard和usb mass storage他们使用的传输方式是中断传输和批量传输。

中断传输:interrupt in ,在这里只需要interrupt in就ok了,既只要一个端点,至于interrupt out 就不用管了。

批量传输:bulk in和bulk out,由于u盘是双向的,当然需要有两个端点哦,毕竟他们通信要有来回才行啊。

所以要复合hid keyboard和usb mass storage就需要三个端点。好了,前面说来复合型设备的描述符分别是:设备描述符*1+配置描述符*1+端点描

述符*3,那么到这里就完了吗,如果只是usb mass storage,在加一个端点就完了,但是这里是Hid,还需要一个子类,在hid里面还有很多子类,那么

就需要区分他们,不然host不知道你是哪家的,好比有很多人叫张三,但是这个世界那么多是张三,你知道他应该是哪家的呢,还是只有slave主动说

自己是谁方便。现在配置是设备描述符*1+配置描述符*1+端点描述符*3+子类描述符,但是描述符排列是有顺序的,写完一个在写另外一个。

// Descriptors for the GET_DESCRIPTOR and SET_DESCRIPTOR requests.

typedef struct usb_device_descriptor {

unsigned char length; // USB_DEVICE_DESCRIPTOR_LENGTH == 18

unsigned char type; // USB_DEVREQ_DESCRIPTOR_TYPE unsigned char usb_spec_lo;

unsigned char usb_spec_hi;

unsigned char device_class;

unsigned char device_subclass;

unsigned char device_protocol;

unsigned char max_packet_size;

unsigned char vendor_lo;

unsigned char vendor_hi;

unsigned char product_lo;

unsigned char product_hi;

unsigned char device_lo;

unsigned char device_hi;

unsigned char manufacturer_str;

unsigned char product_str;

unsigned char serial_number_str;

unsigned char number_configurations;

} __attribute__((packed)) usb_device_descriptor;

/*设备描述符*/

const usb_device_descriptor device_desc = {

.length = USB_DEVICE_DESC_SIZE, //0x12

.type = USB_DEVICE_DESCRIPTOR_TYPE, // 1

.usb_spec_lo =0x00,

.usb_spec_hi =0x02,

.device_class = 0x00,

.device_subclass = 0x00,

.device_protocol = 0x00,

.max_packet_size = USB_MAX_PACKET0,

.vendor_lo = 0x51,

.vendor_hi = 0xC2,

.product_lo = 0x03,

.product_hi = 0x20,

.device_lo =0x00,

.device_hi = 0x01,

.manufacturer_str = 0x01,

.product_str= 0x02,

.serial_number_str = 0x03,

.number_configurations = 0x01, //

};

typedef struct usb_configuration_descriptor {

unsigned char length;

unsigned char type;

unsigned char total_length_lo;

unsigned char total_length_hi; //totallength

unsigned char number_interfaces;

unsigned char configuration_id;

unsigned char configuration_str;

unsigned char attributes;

unsigned char max_power;

} __attribute__((packed)) usb_configuration_descriptor;

typedef struct usb_interface_descriptor {

unsigned char length;

unsigned char type;

unsigned char interface_id;

unsigned char alternate_setting;

unsigned char number_endpoints;

unsigned char interface_class;

unsigned char interface_subclass;

unsigned char interface_protocol;

unsigned char interface_str;

} __attribute__((packed)) usb_interface_descriptor;

typedef struct usb_endpoint_descriptor {

unsigned char length;

unsigned char type;

unsigned char endpoint;

unsigned char attributes;

unsigned char max_packet_lo;

unsigned char max_packet_hi;

unsigned char interval;

} __attribute__((packed)) usb_endpoint_descriptor;

typedef struct usb_hid_descriptor

{

unsigned char length;

unsigned char type;

unsigned char bcdhid_lo;

unsigned char bcdhid_hi;

unsigned char countrycode;

unsigned char numdescriptor;

unsigned char descriptortype;

unsigned char descriptorlength_lo;

unsigned char descriptorlength_hi;

}__attribute__((packed)) usb_hid_descriptor;

typedef struct usb_scsi_hid_config

{

const usb_configuration_descriptor config;

const usb_interface_descriptor scsi_inter;

const usb_endpoint_descriptor scsi_endpoint_in;

const usb_endpoint_descriptor scsi_endpoint_out;

const usb_interface_descriptor hid_inter;

const usb_hid_descriptor hid_desc;

const usb_endpoint_descriptor hid_endpoint_in;

}__attribute__((packed)) USB_CON_INT_ENDP_DESCRIPTOR_STRUCT;

#define USB_CON_INT_ENDP_DESCRIPTOR_STRUCT_LENGTH (sizeof(USB_CON_INT_ENDP_DESCRIPTOR_STRUCT))

const USB_CON_INT_ENDP_DESCRIPTOR_STRUCT usb_scsi_hid_con_int_endp = {

/*config*/

{

.length= USB_CONFIGUARTION_DESC_SIZE,

.type = USB_CONFIGURATION_DESCRIPTOR_TYPE,

.total_length_lo = USB_CON_INT_ENDP_DESCRIPTOR_STRUCT_LENGTH&0xff, .total_length_hi = (USB_CON_INT_ENDP_DESCRIPTOR_STRUCT_LENGTH>>8)&0xff,

.number_interfaces = 0x02, /*两个interface*/

.configuration_id = 0x01, /*一个configuration*/

.configuration_str = 0x00,

.attributes = USB_CONFIG_BUS_POWERED,

.max_power = USB_CONFIG_POWER_MA(300)

},

/*usb mass storage interface descriptor*/

{

.length = USB_INTERFACE_DESC_SIZE,

.type = USB_INTERFACE_DESCRIPTOR_TYPE,

.interface_id = 0x00,

.alternate_setting = 0x00,

.number_endpoints = 0x02,

.interface_class = USB_DEVICE_CLASS_STORAGE, /*0x08表示mass storage*/ .interface_subclass = 0x06, /*表示支持SCSI Primary command-2*/

.interface_protocol = 0x50, /*仅使用批量传输*/

.interface_str = 0x04

},

/*usb mass storage Bulk in 2*/

{

/* Endpoint, EP2 Bulk IN */

.length = USB_ENDPOINT_DESC_SIZE, /* bLength */

.type = USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */

.endpoint = USB_ENDPOINT_IN(2), /* bEndpointAddress */

.attributes = USB_ENDPOINT_TYPE_BULK, /* bmAttributes */

.max_packet_lo = 0x40, /* wMaxPacketSize */

.max_packet_hi =0x00,

.interval = 0x00, /* bInterval: ignore for Bulk transfer */ },

/*usb mass storage Bulk out 3*/

{

/* Endpoint, EP3 Bulk OUT */

.length = USB_ENDPOINT_DESC_SIZE, /* bLength */

.type = USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */

.endpoint = USB_ENDPOINT_OUT(3), /* bEndpointAddress */

.attributes = USB_ENDPOINT_TYPE_BULK, /* bmAttributes */

.max_packet_lo = 0x40, /* wMaxPacketSize */

.max_packet_hi =0x00,

.interval = 0x00, /* bInterval: ignore for Bulk transfer */

},

/*hid interface descriptor */

{

.length = USB_INTERFACE_DESC_SIZE,

.type = USB_INTERFACE_DESCRIPTOR_TYPE, // 4

.interface_id = 0x01,

.alternate_setting = 0x00,

.number_endpoints = 0x01,

.interface_class = USB_DEVICE_CLASS_HUMAN_INTERFACE, //03

.interface_subclass = HID_SUBCLASS_BOOT, /*0x01*/

.interface_protocol = HID_PROTOCOL_NONE, /*0x00,没有协议,也可以写你需要的协议具体的看hid协议*/

.interface_str = 0x00

},

/*hid subclass descriptor*/

{

.length = HID_DESC_SIZE,

.type = HID_HID_DESCRIPTOR_TYPE,

.bcdhid_lo = 0x00,

.bcdhid_hi =0x01,

.countrycode = 0x00,

.numdescriptor = 0x01,

.descriptortype = HID_REPORT_DESCRIPTOR_TYPE,

.descriptorlength_lo = HID_REPORT_DESC_SIZE&0xff,

.descriptorlength_hi = (HID_REPORT_DESC_SIZE>>8)&0xff

},

/*hid endpoint interrupt in 1*/

{

.length = USB_ENDPOINT_DESC_SIZE,

.type = USB_ENDPOINT_DESCRIPTOR_TYPE,

.endpoint = USB_ENDPOINT_IN(1),

.attributes = USB_ENDPOINT_TYPE_INTERRUPT,

.max_packet_lo =0x08,

.max_packet_hi =0x00,

.interval = 0x20

},

};

到这里基本就完成了复合设备,只要你的代码两部分都整合在一起,就好了,

USB设备访问权限

实验10 USB闪存驱动器访问权限 实验目标:学习如何设置USB闪存驱动器的访问权限。 实验情景:假设你是ABC公司的网络安全管理员,已使用Kaspersky Security Center 管理Kaspersky Endpoint Security来保护公司网络安全。 在整个公司的网络中,你已经禁止USB闪存驱动器的访问。然而,该策略过于苛刻:有些用户在工作中还是需要用到USB闪存驱动器的。 现在,你将允许用户从USB闪存驱动器中读取和复制文件,并且让你对自己的USB闪存驱动器有完全的读取和写入权限。 所以,你的任务是配置Kaspersky Endpoint Security 1.让所有用户拥有对任意USB闪存驱动器的读取权限; 2.授予你对自己的USB闪存驱动器有全部权限。 实验内容:在本实验中,我们将完成这些目标。 准备工作 开启域控制器DC 按照实验文档提示将USB闪存驱动器插入计算机。 Security-Center Desktop 1.启动计算机Security-Center 2.以Administrator账户登录,密码是 Ka5per5Ky 3.启动计算机Desktop 4.以Alex账户登录,密码是Ka5per5Ky

任务 1 让所有用户拥有对任意USB闪存驱动器的读取权限 在此任务中,你将授予所有用户对任意类型的USB闪存驱动器读取和查看的权限。 Security-Center Desktop 1.打开虚拟机Desktop的窗口 2.在虚拟机的菜单栏中,点击VM—Removable Devices—“本实验所用的设备类型”— Connect (Disconnect from Host) 3.点击开始—计算机 4.确认USB闪存驱动器已经连接上 5.启动管理控制台 6.打开Workstations子组,并且切换到策略选 项卡

USB HID报告描述符详解

USB 之人性化接口装置的报告描述元(1) 作者: 林锡宽 e-mail: sklin@https://www.doczj.com/doc/a98286624.html,.tw (原文刊于e 科技杂志vol. 30,2003 年6 月号) 关于USB 的标准描述元已经在 e 科技杂志的第24 和25 期中作了完整的介绍。有些读者来函希望能早日刊出报告描述元的介绍。人性化接口装置HID 的类别 特定描述元有三种,其中HID 描述元因为需要连接在接口描述元(标准描述元 之一)之后,所以也已经在前文介绍了。其他二个HID 类别特定描述元为报告 描述元和实体描述元。实体描述元几乎很少使用到,所以不拟介绍,虽然它不会 很复杂。本文仅专注介绍报告描述元。相对来说,报告描述元最复杂,也不容易 理解,可是却最重要,因为HID 装置与主机间的经常性数据传输都由报告描述 元来规范。因为报告描述元的复杂和难理解,使得此文的编撰花了不少时间,因 此无法在上次刊完USB 标准描述元后,接着刊出。 由于内容篇幅颇长,所以仅能分为三篇陆续刊出。本期的第一篇中仅介绍到区域 性项目,下期的第二篇再继续介绍全局性项目和主项目。这三类项目构成一个报 告描述元。最后仍需要以一个实际的范例来解说使用方法,所以第三篇文章将提 供一个实际的范例:整合鼠标的键盘装置。此外,也会将该范例的韧体程序代码提 供给有兴趣的读者。这个韧体程序代码不只是该范例的报告描述元,也含括了它的 标准描述元。 概述 报告(report)在这里意指数据传输(data transfer),而报告描述元则是对这些传输的 数据作用途(usage)的说明。 USB 通讯协议的规范是以1 毫秒产生一个USB 讯框(frame),USB 装置可以在每 一个讯框中传送和接收一个交易(transaction)。交易是由数个封包(packet)组成, 而传输是由一或数个交易来完成传递一串有意义的数据。在这里,传输和报告的 意义大同小异。传输方式有四种,初学者只要了解控制型传输(control transfer) 和中断型传输(interrupt transfer)即可。控制型传输是当需要时才执行传输要求, 是最一般的传输,组态、命令和状态的通讯都可以使用,主要用于讯息型数据(message-type data)。中断型传输目的在做重复的数据更新(recurring data)传输, 精确一点而言,即是在每个有限的周期内(bounded period)作至少一次的小量数据 传送或接收﹔所以适用于流动型数据(stream-type data),注意这里所谓的周期时

USB设备的识别以及驱动安装问题

USB设备的识别以及驱动安装问题 问题描述 USB设备的硬件ID简介以故障判断和驱动安装方法 解决方案 通用串行总线(Universal Serial Bus,USB)是我们目前经常使用的计算机接口,可以连接的设备也是多种多样的,在日常咨询中难免遇到产品相关或其他第三方USB设备安装驱动的问题,对于此类问题,我们应该如何处理呢? 硬件ID是电脑中每个硬件的一个编号,固化在硬件的芯片里,所有设备都有此类编号。所有测试软件都有可能会出错,只有硬件ID是最可靠的,只要确认好INF文件中包含需要的硬件ID,就可以保证驱动是可以用的。 对于USB相关ID的简介 常见的USB硬件ID格式:USB\Vid_xxxx&Pid_yyyy&Rev_zzzz其中Vid表示硬件厂商信息,Pid表示产品编号,对于一般驱动安装我们需要核实Vid,Pid信息,其中Vid的厂商对照表已经更新到《驱动下载&软件安装汇总》(知识库编号:30118)中以便于查询。 比如ThinkPad鼠标设备ID如上图通过VID_04B3,在《驱动下载&软件安装汇总》中查询,结果IBM Corp.表示是IBM授权的设备。 另外,其中的HID表示的是人体学接口设备(Human Interface Device, HID),目前USB设备常见的的有人体学接口设备(Human Interface Device,HID)、通信设备类(Communication Device Class,CDC)和大容量存储设备(Mass Storage Device,MSD)等几类设备,也可以从兼容ID中的Class字段来判断是什么类型的设备,如下图: 比如上图中的Class_03表示的就是HID设备,一般情况下典型代码为1,2,3,6,7,8,

USB的描述符详解总结

USB的描述符与命令请求详解 一、描述符 1.什么是描述符 所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。 2.描述符的作用 描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。 3.描述符的分类 描述符分为三大类:标准描述符、设备类描述符、厂商描述符。 除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符。 在USB1.0中规定了5种标准的描述符: 设备描述符 配置描述符 接口描述符 端点描述符 字符串描述符 规定的设备类描述符有:集线器类描述符、人机接口类描述符。 下表是三种描述符的类型值: 4.使用的几种类 设备类DeviceClass 下表是设备类值的含义。

接口类InterfaceClass 下表是接口类值的含义。 类的交叉与独享 在描述符中,只有设备描述符和接口描述符中会有类别之分,即只有设备和接口会分 类使用,不过有些类别的使用只需经过设备或接口的区分就可彻底清楚明白,这说明在设备类别和接口类别的定义上会有共同的类别名称。而有些类别则是设备或接口独享的,下表是与使用设备相关的类别划分交叉或共享情况:

(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义) 【说明:】在设备或接口分类上均可彻底分清使用的(Usage = Both),即在任一处描述符中定义即可的分清楚使用的类(Usage = Both)的基本类有: 02h ------------- 通信及CDC控制类; DCh ------------ 诊断设备类; EFh ------------- 混杂设备类; FFh ------------- 厂商定义的设备类。 5.标准描述符 设备描述符

USB设备无法识别 unknown device

USB设备无法识别或者 unknown device 的故障解决 2008年09月08日星期一 15:10 插入U盘,出现“USB设备无法识别”等提示的解决办法 2008年07月08日星期二 14:12 故障现象: 插入1G以上大容量U盘,出现“USB设备无法识别”或者“unknown device”提示,在我电脑中无法显示U盘盘符。 故障原因: 1、主要是由于电脑主板供电不稳定或者对 USB2.0 支持性不好。例如:Intel(R) 82801 DB、Intel(R) 82801 EB、SIS 7001等芯片组的主板。 2、连接电脑和打印机的 USB 数据线如果过长或者损坏了,也会出现“unknown device”的提示信息。建议 USB 数据线长度不要超过 2 米。 解决方法: 1、在设备管理器的通用串行总线控制器中停用 USB2.0 的设备。 2、在 CMOS 中禁用 USB2.0 Controller。 3、如果确认是 USB 数据线导致的故障,可以更换符合标准的数据线。 通用串行总线控制器中停用 USB2.0 的设备,操作方法如下: 1、桌面上“我的电脑”右键点击属性,然后依次点击“硬件”,“设备管理器”,“通用串行总线控制器”,在 USB2 的设备上右键点击停用。如图 1 “通用串行总线控制器”所示: 1.图 1: 通用串行总线控制器

2、禁用 USB2.0 设备后,再重新把数据线连接上电脑 USB 端口应该可以正确的识别打印机端口。 CMOS 中禁用 USB2.0 Controller,操作方法如下: 1、开机后,按 F10 键或者 DEL 键进入 CMOS,如图 2 “CMOS” 所示: 1.图 2: CMOS

USB简介及USB设备常见问题的解决方案

USB通用串行总线(英文:Universal Serial Bus,简称USB)是连接外部装置的一个串口汇流排标准,在计算机上使用广泛,但也可以用在机顶盒和游戏机上,补充标准On-The-Go(OTG)使其能够用于在便携装置之间直接交换资料。USB是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。USB接口支持设备的即插即用和热插拔功能。USB接口可用于连接多达127种外设,如鼠标、调制解调器和键盘等。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,并成为当今个人电脑和大量智能设备的必配的接口之一。从1994年11月11日发表了USB V0.7版本以后,USB版本经历了多年的发展,到现在已经发展为3.0版本。(摘自百度百科) 传输速率 在了解USB的传输速率之前先来看一下几个常见单位 1字节=1B(Byte)=8位=8b(bit) 1KB(Kilobyte 千字节)=1024B, 1MB(Megabyte 兆字节简称“兆”)=1024KB, 1GB(Gigabyte 吉字节又称“千兆”)=1024MB, 1TB(Trillionbyte 万亿字节太字节)=1024GB, 其中1024=2^10( 2 的10次方),后面还有不再多说。看图 . b/s 一般表示位传输速度,bps 表示位传输速率,数值上相等。B/s与b/s,BPS(字节每秒)与bps(位每秒)不能混淆。1MB/s(兆字节/秒)=8Mbps(兆位/秒), 12Mbps=1.5MB/s,大部分MP3为此类接口类型。USB 1.0是在1996年出现的,速度只有1.5Mb/s(位每秒); 1998年升级为USB 1.1,速度也大大提升到12Mb/s,在部分旧设备上还能看到这种标准的接口。USB1.1是较为普遍的USB规范,其高速方式的

Linux中USB描述符详解-wxc-2018-03-31

USB描述符的作用 USB 设备第一次连接到主机时, 要接收主机枚举( Enumera tion) 和配置(Configuration) , 目的是让主机知道设备功能、是哪一类的USB 设备、占用多少资源、使用了哪些传输方式以及传输的数据量等等。只有主机完全确认了这些信息后, 设备才能真正开始工作。这些信息是通过存储在设备中的USB 描述符来体现的。因此, 这种USB 描述符也可以看作是USB 设备的身份证明。 描述符(Descriptor )是一个完整的数据结构, 存储在USB 设备中, 用于描述一个USB 设备的所有属性。USB主机通过一系列命令要求设备发送这些信息。 USB描述符的种类 描述符分为三大类:标准描述符、设备类描述符、厂商描述符。 三种描述符的类型值bDescriptorType: 设备的类别bDeviceClass

接口类别bInterfaceClass Linux中各种描述符的定义 在include/linux/usb/Ch9.h中定义 USB设备描述符: struct usb_device_descripto r { __u8 bLength; //此描述符的字节数 __u8 bDescriptorType; //描述符的类型(此处应为0x01,即设备描述符) __le16 bcdUSB; // USB版本号(BCD 码)

__u8 bDeviceClass; //设备的类别---可查看上表格 __u8 bDeviceSubClass; //设备子类码:这些码值的具体含义根据bDeviceClass 域来看。 __u8 bDeviceProtocol; /*协议码 这些码的值视bDeviceClass 和bDeviceSubClass 的值而定。如果设备支持设备类相关的 协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然 而,可能它的接口支持设备类相关的协议。如果此域的值为FFH,此设备使用厂商定义的议。*/ __u8 bMaxPacketSize0; //端点0的最大包大小(仅8,16,32,64为合法值) __le16 idVendor; //厂商标志(由USB-IF组织赋值) __le16 idProduct; //产品标志(由厂商赋值) __le16 bcdDevice; //设备版本号(BCD 码) __u8 iManufacturer; //描述厂商信息的字符串描述符的索引值。 __u8 iProduct; //描述产品信息的字串描述符的索引值。 __u8 iSerialNumber; //描述设备序列号信息的字串描述符的索引值。 __u8 bNumConfigurations; //可能的配置描述符数目 } USB配置描述符 配置描述符中包含了配置描述符本身的长度、所有配置信息的总长度、供电方式及远 程唤醒、供电量。 如果主机发出标准命令Get_Descriptor要求获得设备的某个配置描述符时,该配置应用的所有信息都将发给主机,它包括:该标准配置符本身、该配置所包含的所有接口、端点描述符及设备类描述符和厂商描述符。 struct usb_config_descriptor { __u8 bLength; //此描述符的字节数 __u8 bDescriptorType; //配置描述表类型(此处为0x02) __le16 wTotalLength; //此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符),即:将要返回的配置信息总长度。 __u8 bNumInterfaces; //此配置所支持的接口个数 __u8 bConfigurationValue;//在SetConfiguration()请求中用作参数来选定此配置。 __u8 iConfiguration;//描述此配置的字串描述符的索引 __u8 bmAttributes; /* 配置特性:

USB设备的配置过程

驱动程序中USB设备的配置过程(参考Windows XP DDK) DDK驱动程序写得很规范,USB初始化、数据传输的过程写的很清楚。通过阅读DDK驱动程序,我对原来USB驱动程序中许多不理解的地方有了更清楚的理解.下面就参照DDK提供的iso_usb例子对USB设备的配置过程进行总结。 1.驱动程序加载后首先执行DriverEntry入口函数。该函数设定了对各个IRP 进行处理的派遣函数。 2.DriverEntry函数执行完成后,开始执行AddDevice函数。这个函数创建设备对象把设备对象连接到设备堆栈上,清除DO_DEVICE_INITIALIZING标志。然后配置管理器向驱动程序发送一个即插即用请求IRP_MN_START_DEVICE,而调用下面的HandleStartDevice函数。 3. 在HandleStartDevice函数中完成了USB设备的配置过程:首先为设备选择一个配置(大多数设备仅有一种配置)。选定了某种配置后,接着应该选择配置中的一个或多个接口。然后向总线驱动程序发送配置选择URB,总线驱动程序接收到该URB后向设备发出命令使用选定的配置和接口。 (1)为设备选择配置的过程其实就是获取设备的配置描述符的过程。Iso_usb 中使用了两个URB来读取配置描述符。 //首先获取固定大小的配置描述符,这时,此描述符不包含接口描述符和端点描述符。 siz = sizeof(USB_CONFIGURATION_DESCRIPTOR); configurationDescriptor = ExAllocatePool(NonPagedPool, siz); if(configurationDescriptor) { //UsbBuildGetDescriptorRequest函数构造指定类型的urb UsbBuildGetDescriptorRequest( urb, (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, configurationDescriptor, NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL); //CallUSBD函数负责把urb转发到底层总线驱动程序 ntStatus = CallUSBD(DeviceObject, urb); …… } …… //然后获取全部的配置描述符,包括接口描述符和端点描述符 siz = configurationDescriptor->wTotalLength; ExFreePool(configurationDescriptor); configurationDescriptor = ExAllocatePool(NonPagedPool, siz);

USB_HID报告及报告描述符_入门简介

USB HID报告及报告描述符简介 USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB 设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。 而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USB HOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看USB HID协议。USB报告描述符可以通过使用HID Descriptor tool 来生成,这个工具可以网上下载。 下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。 code char KeyBoardReportDescriptor[63] = { //表示用途页为通用桌面设备 0x05, 0x01, // USAGE_PAGE (Generic Desktop) //表示用途为键盘 0x09, 0x06, // USAGE (Keyboard) //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01, // COLLECTION (Application) //表示用途页为按键 0x05, 0x07, // USAGE_PAGE (Keyboard) //用途最小值,这里为左ctrl键 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) //用途最大值,这里为右GUI键,即window键 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) //逻辑最小值为0 0x15, 0x00, // LOGICAL_MINIMUM (0) //逻辑最大值为1 0x25, 0x01, // LOGICAL_MAXIMUM (1) //报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1 0x75, 0x01, // REPORT_SIZE (1) //报告的个数为8,即总共有8个bits 0x95, 0x08, // REPORT_COUNT (8) //输入用,变量,值,绝对值。像键盘这类一般报告绝对值, //而鼠标移动这样的则报告相对值,表示鼠标移动多少 0x81, 0x02, // INPUT (Data,Var,Abs) //上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键

usb接口描述符

一、背景知识 1、USB Mass Storage类规范概述 USB 组织在universal Serial Bus Mass Storage Class Spaceification 1.1版本中定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个 独立的子类规范,即: 1. USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport https://www.doczj.com/doc/a98286624.html,B Mass Storage Class Bulk-Only Transport https://www.doczj.com/doc/a98286624.html,B Mass Storage Class ATA Command Block https://www.doczj.com/doc/a98286624.html,B Mass Storage Class UFI Command Specification 前两个子规范定义了数据/命令/状态在USB 上的传输方法。Bulk- Only 传输规范仅仅使用Bulk 端点传送数据/命令/状态,CBI 传输规范则使用Control/Bulk/Interrupt 三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA 命令规范用于硬盘,UFI 命令规范是针对USB 移动存储。 Microsoft Windows 中提供对Mass Storage 协议的支持,因此USB 移动设备只需要遵循Mass Storage 协议来组织数据和处理命令,即可实现与PC 机交换数据。而Flash 的存储单元组织形式采用FAT16 文件系统,这样,就可以直接在Windows 的浏览器中通过可移动磁盘来交换数据了,Windows 负责对FAT16 文件系统的管理,USB 设备不需要干预FAT16 文件系统操作的具体细节。 USB(Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述符,是USB 设备正常工作的先决条件。 Linux-2.6.26内核中在利用USB gadget驱动实现模拟U盘时主要涉及到file_storage.c、s3c2410_udc.c等驱动文件(这些文件的具体结构,将在下一篇文章中描述)。此时我们想先从这些代码中找到USB描述描述符,从中确定使用的存储类规范,从而确定协议。确定通讯协议是我们调试的基础。 存储类规范是由接口描述符决定的。接口描述符各项的定义义如下:

USB设备问题的一般解决方法

USB设备问题的一般解决方法 注意:某些USB设备不能很好的支持APM/ACPI模式,因此从挂起或休眠状态恢复后某些USB设备可能无法正常工作。 1. 确认操作系统能够支持USB功能,且外接的USB设备正确地插入到ThinkPad笔记本电脑的USB 端口上; 如下图所示,ThinkPad笔记本电脑上的USB端口 2. 运行PC Doctor程序来诊断USB端口是否可用; 要下载PC Doctor程序(DOS版),请访问IBM网站: https://www.doczj.com/doc/a98286624.html,/cn/pc/support 3. 确认ThinkPad笔记本电脑的BIOS程序是最新版本的; 查询最新的显卡驱动程序文件,请访问IBM中文技术支持网站https://www.doczj.com/doc/a98286624.html,/cn/pc/support 4. 确认在BIOS中USB端口已经被启用; 对于ThinkPad A/T/X/R系列机型,按下列步骤来确认设置: a. 打开计算机; b. 屏幕左下方出现Press F1 for IBM BIOS Setup Utility提示时,按F1键进入BIOS; 如果出现输入口令的提示,请输入正确的口令; c. 选择Config,然后选择USB; d. 在USB选项中,将USB BIOS Support设置为Enable; 对于ThinkPad 600E,600E,770,770E/ED,770X,770Z机型,按下列步骤来确认设置: a. 按住F1键,然后打开计算机;一直按着F1键,直到出现Easy-Setup的画面时; 如果出现输入口令的提示,请输入正确的口令; b. 选择Config; c. 选择Initialize,点击OK; d. 点击Exit,点击Restart,然后点击OK,重新启动计算机; 二. USB设备的某些特殊问题的一般解决方法 5. 确认USB设备及其驱动程序是按照厂家的安装指南正确加载或安装的。 有必要的情况下,请取下USB设备并卸载设备驱动程序,然后重新插入USB设备并安装最新的设备驱动程序; 6. 确认该USB设备在其他的电脑上是否可以正常工作;

USB描述符完全解析

USB设备描述符完全解析 //======================================================= ===================== // 文件名: USBDESC.C // 用途: USB描述符 // 作者: shenfei5 // 时间: 2007.2.3 // 版本: V1.10 //======================================================= ===================== #include #include "usb.h" // USB模块 #include "hid.h" // HID设备 #include "usbcfg.h" // 配置USB #include "usbdesc.h" // USB描述符 // // HID报文描述符 // const U8 HID_ReportDescriptor[] = { HID_UsagePageVendor(0x00), // 报告页版本: 0X06 0X00 0XFF HID_Usage(0x01), // 用途页: 0X05 0X01 // 如果是MOUSE,KEY,在这里应该有用法索引 HID_Collection(HID_Application), // 用法集合开始: 0XA1 0X01 HID_UsagePage(HID_USAGE_PAGE_BUTTON), // BUTTON用法页 HID_UsageMin(1), // 用法最小值 HID_UsageMax(3), // 用法最小值 HID_LogicalMin(0), // 逻辑最小值 HID_LogicalMax(1), // 逻辑最大值 HID_ReportCount(3), // 报告计数(3) HID_ReportSize(1), // 报告页大小(1) HID_Input(HID_Data | HID_Variable | HID_Absolute), // 输入(2) HID_ReportCount(1), // 报告计数值 HID_ReportSize(5), // 报告大小 HID_Input(HID_Constant), // 输入1 HID_UsagePage(HID_USAGE_PAGE_LED), // LED用法页 HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR), // 用法页 HID_LogicalMin(0), // 用法最小值

USB设备类及设备子类及接口采用的设备类协议

USB设备类及设备子类及接口采用的设备类协议 USB Class Codes November17,2009 USB defines class code information that is used to identify a device’s functionality and to nominally load a device driver based on that functionality.The information is contained in three bytes with the names Base Class,SubClass,and Protocol.(Note that‘Base Class’is used in this description to identify the first byte of the Class Code triple.That terminology is not used in the USB Specification).There are two places on a device where class code information can be placed.One place is in the Device Descriptor,and the other is in Interface Descriptors.Some defined class codes are allowed to be used only in a Device Descriptor,others can be used in both Device and Interface Descriptors,and some can only be used in Interface Descriptors.The table below shows the currently defined set of Base Class values,what the generic usage is,and where that Base Class can be used (either Device or Interface Descriptors or both). Base Class Descriptor Usage Description 00h Device Use class information in the Interface Descriptors 01h Interface Audio 02h Both Communications and CDC Control 03h Interface HID(Human Interface Device) 05h Interface Physical 06h Interface Image 07h Interface Printer 08h Interface Mass Storage 09h Device Hub 0Ah Interface CDC-Data 0Bh Interface Smart Card 0Dh Interface Content Security 0Eh Interface Video 0Fh Interface Personal Healthcare DCh Both Diagnostic Device

USB_HID协议中文版——USB接口HID设备

第8章USB接口HID设备 HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。 Wndows操作系统最先支持的HID设备。在windows 98以及后来的版本中内置有HID 设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。 在设计一个USB接口的计算机外部设备时,如果HID类型的设备可以满足需要,可以将其设计为HID类型设备,这样可以省去比较复杂的USB驱动程序的编写,直接利用Windows操作系统对标准的HID类型USB设备的支持。 8.1 HID设备简介 8.1.1 HID设备的特点 ?交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持HlD报表的格式。主机通过控制和中断传输中的传送和请求报表来传送和接收数据。报表的格式非常灵活。 ?每一笔事务可以携带小量或中量的数据。低速设备每一笔事务最大是8B,全速设备每一笔事务最大是64B,高速设备每一笔事务最大是1024B。一个报表可以使用多笔事务。 ?设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。所以主机会定时轮询设备,以取得最新的数据。 ?HID设备的最大传输速度有限制。主机可以保证低速的中断端点每10ms内最多1笔事务,每一秒最多是800B。保证全速端点每lms一笔事务,每一秒最多是64000B。保证高速端点每125 us三笔事务,每一秒最多是24.576MB。 ?HID设备没有保证的传输速率。如果设备是设置在10ms的时距,事务之间的时间可能等于或小于10ms。除非设备是设置在全速时在每个帧传输数据,或是在高速时在每个微帧传输数据。这是最快的轮询速率,所以端点可以保证有正确的带宽可供使用。 HID设备除了传送数据给主机外,它也会从主机接收数据。只要能够符合HlD类别规范的设备都可以是HID设备。 设备除了HlD接口之外,它可能同时还包含有其他的USB接口。例如影像显示设备可能使用HID接口来做亮度、对比度的软件控制,而使用传统的影像接口来传送要显示的数据。USB扩音器可以使用实时传输来播放语音,同时使用HID接口来控制音量、低音等。 HID类别设备的规范文件主要是以下两份: ?Device Class Definition for Human interface Devices ?HID Usage Tables 其中前者是HID的基本规范文件,后者可以是前者的附件,为开发人员提供实际的控制类型的描述。文件是用来定义让主机了解以及使用HID数据的数值。这两份文件是由USB Device Working Group制定的,可以在网址https://www.doczj.com/doc/a98286624.html,/developers/hidpage/ #Class _Definition下载。

USB设备无法识别

USB设备无法识别 1、运行REGEDIT, 2、展开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR, 3、右击Start,将其值改为3,则可将U盘启用,若要禁用,只需将3改回4 故障现象: 插入1G以上大容量U盘,出现“USB设备无法识别”或者“unknown device” 提示,在我电脑中无法显示U盘盘符。 故障原因: 1、主要是由于电脑主板供电不稳定或者对 USB2.0 支持性不好。例如:Intel(R) 82801 DB、Intel(R) 82801 EB、SIS 7001等芯片组的主板。 2、连接电脑和打印机的 USB 数据线如果过长或者损坏了,也会出现“unknown device”的提示信息。建议 USB 数据线长度不要超过 2 米。 解决方法: 1、在设备管理器的通用串行总线控制器中停用 USB2.0 的设备。 2、在 CMOS 中禁用 USB2.0 Controller。 3、如果确认是 USB 数据线导致的故障,可以更换符合标准的数据线。 通用串行总线控制器中停用 USB2.0 的设备,操作方法如下: 1、桌面上“我的电脑”右键点击属性,然后依次点击“硬件”,“设备管理器”, “通用串行总线控制器”,在 USB2 的设备上右键点击停用。如图 1 “通用串行总线控制器”所示: 1.图 1: 通用串行总线控制器 2、禁用 USB2.0 设备后,再重新把数据线连接上电脑 USB 端口应该可以正确的 识别打印机端口。 CMOS 中禁用 USB2.0 Controller,操作方法如下: 1、开机后,按 F10 键或者 DEL 键进入 CMOS,如图 2 “CMOS” 所示:

USB复合设备

usb真是很强很大,强是现在很多产品都用她来做,为了方便,不用开发驱动。大是因为usb 协议太多了,就光hid都有好多种。还是扯回正题,这次总 结复合型设备,前面总结了hid和mass storage设备,如果在正常情况下两个设备都正常了的,那么现在就可以来做做复合型设备了。 百度和google都没找到她的定义,那么我来定义一下(见笑),复合型设备:具有两种usb 设备功能的一种设备,无论是相同的设备功能,还是不同的 设备功能,只要同时具有两种以上的功能就是复合型设备。其实很直白,大家都看的出来。 现在就把hid keyboard and usb mass storage复合起来,组成一个设备。 首先要说的是既然是复合型设备,那么就有多个interface,这里有两个设备,那么就需要两个interface,需要几个设备描述符呢,一个就够了,那配 置描述符呢,也只需要一个就好了,那需要几个端点描述符呢,这个嘛,我就不知道了(开玩笑,你在总结你不知道),这个就得讲讲usb的几种传输 模式了。 在usb里面一共有四种传输:控制传输、中断传输、批量传输、等时传输。控制和批量端点用于异步的数据传输,驱动需要他们就立马工作。中断和等 时端点是周期性的,即在固定时间段连续的传输数据。是不是有点熟悉,的确,前面总结过的,在这里再提提。所以有几个端点,还是得看你在用哪种 传输模式,hid keyboard和usb mass storage他们使用的传输方式是中断传输和批量传输。 中断传输:interrupt in ,在这里只需要interrupt in就ok了,既只要一个端点,至于interrupt out 就不用管了。 批量传输:bulk in和bulk out,由于u盘是双向的,当然需要有两个端点哦,毕竟他们通信要有来回才行啊。 所以要复合hid keyboard和usb mass storage就需要三个端点。好了,前面说来复合型设备的描述符分别是:设备描述符*1+配置描述符*1+端点描 述符*3,那么到这里就完了吗,如果只是usb mass storage,在加一个端点就完了,但是这里是Hid,还需要一个子类,在hid里面还有很多子类,那么 就需要区分他们,不然host不知道你是哪家的,好比有很多人叫张三,但是这个世界那么多是张三,你知道他应该是哪家的呢,还是只有slave主动说 自己是谁方便。现在配置是设备描述符*1+配置描述符*1+端点描述符*3+子类描述符,但是描述符排列是有顺序的,写完一个在写另外一个。 // Descriptors for the GET_DESCRIPTOR and SET_DESCRIPTOR requests. typedef struct usb_device_descriptor { unsigned char length; // USB_DEVICE_DESCRIPTOR_LENGTH == 18 unsigned char type; // USB_DEVREQ_DESCRIPTOR_TYPE unsigned char usb_spec_lo;

USB命令

一、USB命令 在USB规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与设备之间的主从关系,将它定义成“命令”。 所有的USB设备都要求对主机发给自己的控制命令作出响应,USB规范定义了11个标准命令,它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、 Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所有USB设备都必须支持这些命令(个别命令除外,如Set_Descriptor、Synch_Frame)。 不同的命令虽然有不同的数据和使用目的,但所有的USB命令结构是一样的。下表所示为USB命令的结构: 下表列出了USB的11种标准命令

其中bRequest为命令编码值,含意见表3:

二、USB描述符 USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符,还有百标准描述符,如类描述符。USB设备通过这些描述符向USB主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。 USB设备通过描述符反映自己的设备特性。USB描述符是由特定格式排列的一组数据结构组成。 在USB设备枚举过程中,主机端的协义软件需要解析从USB设备读取的所有描述符信息。在USB主向设备发送读取描述符的请求后,USB设备将所有的描述符以连续的数据流方式传输给USB主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流。 USB描述符包含标准描述符、类描述符和厂商特定描述3种形式。任何一种设备必须USB标准描述符(队字符串描述符可选外)。 在USB1.X中,规定了5种标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。 每个USB设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即USB设备可以有多种配置。设备的每一个配置中又可以包含一个或多个接口描述符,即USB设备可以支持多种功能(接口),接口的特性通过描述符提供。 在USB主机访问USB设备的描述符时,USB设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符,如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。

相关主题
文本预览
相关文档 最新文档