USB描述符(转)
//============================================================================
// 文件名: USBDESC.C
// 用 途: USB描述符
// 作 者: shenfei5
// 时 间: 2007.2.3
// 版 本: V1.10
//============================================================================
#include <RTL.h>
#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), // 用法最小值
HID_LogicalMax(1), // 用法最大值
HID_ReportCount(8), // 报告计数值
HID_ReportSize(1), // 报告大小 (1)
HID_Output(HID_Data | HID_Variable | HID_Absolute), // 输出 (2)
HID_EndCollection, // 报告结束
};
// HID报告描述符大小
const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor);
//
// USB 设备描述符
//
const U8 USB_DeviceDescriptor[] = {
USB_DEVICE_DESC_SIZE, // bLength 描述符长度 = 12H
USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 1H
WBVAL(0x0110), // 1.10 // bcdUSB 设备版本号 = 你发行的版本的号
0x00, // bDeviceClass 类型代码 = 由USB指定
0x00, // bDeviceSubClass 子类型代码 = 由USB分配
0x00, // bDeviceProtocol 协议代码 = 由USB分配
USB_MAX_PACKET0, // bMaxPacketSize0 端点0的容量 = 64(只能是 8,16,32,64)
WBVAL(0x1977), // idVendor 供应商ID(同USB协会分配,我就自己分配一份)
WBVAL(0X1006), // idProduct 产品ID(由厂商分配)
WBVAL(0x0100), // 1.00 // bcdDevice ( 设备出厂编号 )
0x04, // iManufacturer ( 厂商描述字符串索引, 用来在字符串索引中查找字符串 )
0x20, // iProduct ( 产品描述字符串索引, 用来在字符串索引中查找字符串 )
0x42, // iSerialNumber ( 设备序列号描述字符串索引, 用来在字符串索引中查找字符串 )
0x01 // bNumConfigurations ( 配置字符串的个数 )
};
//
// USB 描述符集
// 所有描述符 (配置描述符, 接口描述符, 端点描述符, USB类描述符, 设备描述符
//
const U8 USB_ConfigDescriptor[] = {
// 配置描述符
USB_CONFIGUARTION_DESC_SIZE, // bLength 描述符长度 = 9H
USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 2H
WBVAL( // wTotalLength
USB_CONFIGUARTION_DESC_SIZE + // 返回描述符串集的长度, 配置描述字符长度
USB_INTERFACE_DESC_SIZE + // 接口描述字符长度
HID_DESC_SIZE + // HID描述字符长度
USB_ENDPOINT_DESC_SIZE // 端点描述字符长度
),
0x01, // bNumInterfaces
// 支持接口数
0x01, // bConfigurationValue
// 配置值
0x00, // iConfiguration
// 配置字符串描述索相
// 0: 不使用
// 如果使用,必须在字符串描述符中添加相应的字符串.
USB_CONFIG_BUS_POWERED | // bmAttributes 设置的供电特性
USB_CONFIG_REMOTE_WAKEUP, // 总线供电
// 有唤醒功能
USB_CONFIG_POWER_MA(100), // bMaxPower 设备从供电总线吸取的电流值
//// 当前配置为 100MA
// 接口类描述符
// 接口 0 ,位置 0 , HID类
// Interface 0, Alternate Setting 0, HID Class
USB_INTERFACE_DESC_SIZE, // bLength 描述符长度 = 9H
USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 4H
0x00, // bInterfaceNumber ( 接口编号 )
0x00, // bAlternateSetting ( 可代替位置 )
0x01, // bNumEndpoints 使用端点(不含端点0)
USB_DEVICE_CLASS_HUMAN_INTERFACE, // bInterfaceClass
// USB 类
// USB_DEVICE_CLASS_HUMAN_INTERFACE == 3
// HID类
HID_SUBCLASS_NONE, // bInterfaceSubClass
// 子类,没有.
HID_PROTOCOL_NONE, // bInterfaceProtocol
// 协议代码
0x5C, // iInterface
// 字符串描述符索引,要使用该字符串必须在字符串描述符里添加相应的字符串
// HID类描述符
// HID_DESC_OFFSET = 0x0012
// HID类描述符的偏移量
HID_DESC_SIZE, // bLength 描述符长度 =
HID_HID_DESCRIPTOR_TYPE, // bDescriptorType HID描述符类型 = 21H
WBVAL(0x0100), // 1.00 // bcdHID HID版本号
0x00, // bCountryCode 国家代码
0x01, // bNumDescriptors 支持其它类描述符个数
HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType 从属类描述类型 = 报告描述符22H
WBVAL(HID_REPORT_DESC_SIZE), // wDescriptorLength 从属类描述的长度
// Endpoint, HID Interrupt In
// HID 端点描述描,端点1输入
USB_ENDPOINT_DESC_SIZE, // bLength 端点描述符长度
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType 端点描述符类型 = 5H
USB_ENDPOINT_IN(1), // bEndpointAddress 逻辑端点号 BIT.7 = DIR
// BIT.0..3 端点号
// 这个值是用来把逻辑端点号换成物理端点号
USB_ENDPOINT_TYPE_INTERRUPT, // bmAttributes 端点属性 = 中断
WBVAL(0x0004), // wMaxPacketSize 端点容量
10, // 10ms // bInterval
// 传输间隔时间.只对中断端点有效
// Terminator
0 // bLength
// 结果码.
};
//
// USB 字符串描述符 (可选)
// 字符描述符结构:
// {
// 字符串描述符 1 大小
// 描述符类型 = 字符串描述符(0X03)
// 描述符内容.
// ... ...
// 字符串描述符n 1 大小
// 描述符类型n = 字符串描述符(0X03)
// 描述符内容n.
// }
//
const U8 USB_StringDescriptor[] = {
// 字符串索引: 0x00:
// 字符串用途: 语言代码
0x04, // 描述符长度 bLength
USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)
//WBVAL(0x0409), // 使用 English 语言// 描述符内容 wLANGID
WBVAL(0x0804), // 试一下中文的行不行,改了之后,在硬件属性里看不到,在客户端可以看到,不明原因.
// 字符串索引: 0x04:
// 字符串用途: 生产产商字符描述符
0x1C, // 描述符长度 bLength
USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)
0xc1,0,
0xd6,0,
0xca,0,
0xa4,0,
0xb7,0,
0xe1,0,
' ',0,
' ',0,
' ',0,
' ',0,
' ',0,
' ',0,
' ',0,
// 字符串索引: 0x20
// 字符串用途: 产品名称
0x22, // 描述符长度 bLength
USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)
0xc1,0,
0xd6,0,
0xca,0,
0xa4,0,
0xb7,0,
0xe1,0,
' ',0,
' ',0,
' ',0,
' ',0,
' ',0,
' ',0,
' ',0,
'H',0,
'I',0,
'D',0,
// 字符串索引: 0x42
// 字符串用途: 产品系列号
0x1A, // 描述符长度 bLength
USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)
'T',0,
'E',0,
'S',0,
'T',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
// 字符串索引号 0x5C
// 接口 Interface 0, 位置 Alternate Setting 0
0x08, // 描述符长度 bLength
USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)
'H',0,
'I',0,
'D',0,
};
USB描述符(转)的更多相关文章
- USB描述符概述
在USB总线接口协议中,规定了一些标准的USB描述符,如表所示. 对于USB设备来说,有些USB描述符是必需的,例如: 设备描述符 配置描述符 字符串描述符 接口描述符 端点描述符 其余一些描述符并非 ...
- USB 描述符
标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. // Standard Device Descriptor typedef struct { u8 ...
- USB描述符解析-->枚举.
枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源.一般都是使用中断传输方式通信. 常用的描述符有以下几种:01H.设备描述符 02H ...
- usb描述符简述(二)
title: usb描述符简述 tags: linux date: 2018/12/18/ 18:25:23 toc: true --- usb描述符简述 转载自cnblog 具体描述符 https: ...
- USB学习笔记连载(十二):USB描述符
USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...
- 2.6 USB摄像头驱动之USB描述符
学习目标:分析USB摄像头驱动的描述符: 一.USB设备描述符 在usb设备驱动分析那一节,也用到了usb描述符. usb描述符可分为: USB设备描述符(usb_device_descriptor) ...
- USB描述符【整理】
USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主 ...
- 自己总结的USB数据结构及其描述符
背景: USB理论知识光看着空想总觉着丢三落四,好像哪里没法理解到位,自己做个总结. 正文: 1. USB通信的最基本单位是“包”.如果把“包”肢解的话,可以分为各种“域”(7类,即一串二进制数.每类 ...
- usb驱动开发7之接口描述符
前面struct usb_interface里表示接口设置的struct usb_host_interface被有意的飘过了,咱们在这节主要讲讲这个结构体,同样在include/linux/usb.h ...
随机推荐
- 92.QuerySet API中的切片操作详细使用
切片操作: 使用情况分析:在我们的CSDN的个人主页会显示我们个人发布的多篇文章(20篇),如果还想查看更多,就可以点击最下方的"查看更多"按钮,在这里对首页的文章的个数的限制就用 ...
- 线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板
线段树(区间修改,区间和): #include <cstdio> #include <iostream> #include <cstring> using name ...
- raw_input|active:|continue|break|
a = "please" b = "say something:" c =a+b m = 0 a = True while a: m = int(raw_inp ...
- tesseract系列(2) -- tesseract的使用
上文说了怎么编译成库,这次说说怎么使用,先验证下编译出来的结果. 下图是debug生成的文件,里面有个tesseract的应用程序. cmd进入目录下,执行命令:tesseract eurotext. ...
- Hibernate相关概念及序列化和持久化的区别
hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中. hibernate要做的事, ...
- LeetCode No.121,122,123
No.121 MaxProfit 买卖股票的最佳时机 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你 ...
- day37-进程-锁和信号量
#1.锁:房间的门上有一把锁,锁上有一把钥匙,一个人使用这把钥匙开锁之后,带上钥匙进入房间,把门给反锁了,他在房间干活, # 只要他不出来还锁,别人是无法进入房间的.同时只能有一个人在房间里干活.效率 ...
- SwipeRefreshLayout 下拉刷新
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com ...
- 创想变现:斯坦福设计创新课堂ME310分享(上篇)
编者按:今年6月,微软亚洲研究院人机交互组研究员顾嘉唯,在美国斯坦福大学担任了d-School的ME310设计课程的项目评审.该课程是斯坦福大学的全球联合新产品设计创新课程,学习方式以小组为单位,每个 ...
- linux 上安装 keepalive
1.keepalive 单机安装 1.1 安装环境 yum -y install kernel-devel* openssl-* popt-devel lrzsz openssh-clients li ...