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 ...
随机推荐
- Mybatis入门——基础方式的增删该查、mapper动态代理方式的CRUD、类型转换器
一.基础方式的增删该查: 1.mybatis约定:输入参数parameterType和输出参数resulrType在形式上只能有一个. 2.如果输入/输出参数:是简单类型(8个基本类型加String) ...
- python文件读写 文件修改
#设置一个变量f为文件对象,并打开文件#写文件#f = open('user.txt','w',encoding='utf-8') #f是一个文件对象f=open(r'c:\Users\PL\Desk ...
- 通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法
WinForm 上放置的控件多了或者有大背景图,窗体加载时就会闪烁,对于一般的闪烁,设置 DoubleBuffer=True或许有一点改善,要立竿见影的解决可以重载 CreateParams 使用 W ...
- Matlab高级教程_第三篇:Matlab转码C/C++方式(混编)_第一部分
0. 其实Matlab的转码混编大多数就是为了现成的算法函数不用再写了,2就是为了方便提高代码运行速度用C语言去运行. 1. MEX文件: Mex文件是一种可在matlab环境中嗲用C语言(或fort ...
- 【shell基础】条件测试
例1 判断目录是否存在 #!/usr/bin/bash back_dir=/var/mysql_back if ! test -d $back_dir;then mkdir -p $back_dir ...
- PAT甲级——1050 String Subtraction
1050 String Subtraction Given two strings S1 and S2, S=S1−S2 is defined to be the remain ...
- 直击LG曲面OLED首发现场,高端品质更出众
简直是太棒了,我可以去看LG曲面OLED电视新品发布会了.这可是LG向中国首次推出的曲面OLED电视.在网上我就已经看到其实曲面OLED电视已经在韩国.美国还有欧洲都上市了,听说现在反响还挺不错.真没 ...
- KVC解析
• 阅读 valueForKey (总体规划,先找相关方法,再找相关变量) 1.先是找相关方法,如果方法找不到 2.那么去判断 1 2 3 + (BOOL)accessInstanceVariab ...
- [从 0 开始的 Angular 生活]No.38 实现一个 Angular Router 切换组件页面(一)
前言 今天是进入公司的第三天,为了能尽快投入项目与成为团队可用的战力,我正在努力啃官方文档学习 Angular 的知识,所以这一篇文章主要是记录我如何阅读官方文档后,实现这个非常基本的.带导航的网页应 ...
- go proxy转发工作中碰到的问题
A-B 需求是一个中转 A-Proxy-B 读取来源请求A,在proxy读取body作些处理,再转给B,再把返回内容转给A 问题出在proxy这里 如果先把请求给B,再读body res, err : ...