USB原理课程学习记录贴
学习下论坛里何宾教授的USB原理课程视频教学:【USB 原理及实战,16课时】,大学标准课程,有配套书籍 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区
本贴记录了学习何宾教授《USB原理及实战》课程的详细过程。该课程共16课时,系统讲解了USB协议的基本原理、硬件设计及软件开发,并重点探讨了USB-CDC虚拟串口、USB转双串口及HID复合设备的实现方法。课程内容深入浅出,理论与实践相结合,适合有一定基础的开发者深入学习。<br><br>通过学习,本人对USB通信协议有了更深刻的理解,尤其是在USB设备枚举、数据传输及端点配置等方面。课程配套的书籍《USB原理及实战》也提供了丰富的案例和代码,帮助巩固理论知识并应用于实际项目。<br><br>此外,课程中提到的“一箭双雕”USB转双串口方案,为多串口应用场景提供了高效解决方案,极具实用价值。HID复合设备的实现方法也为开发复杂USB设备提供了新思路。<br><br>总体而言,本课程内容详实,理论与实践并重,是学习USB技术的优质资源。建议学员在学习过程中结合动手实践,以加深理解并提升应用能力。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考] 第一集了解基本概念
昨天看了第一课补充点截图
D+绿色 D-白色
NRZI编码
第二课 USB通讯报文解析
特殊数据包:不常用
低速 SYNC KJKJKJKK 0000 0001
PID A5SOF+帧号+CRC5bit
USB中文网关键字@USB2.0 SOF令牌包
PID 0x96 IN 令牌
USB中文网关键字@USB2.0 IN令牌包
SYNC+PID+地址7bit+EP4bit+CRC5bit+EOP
NACK 包
第三课
struct usb_configuration_descriptor {
uint8_tbLength; // 描述符长度
uint8_tbDescriptorType; // 描述符类型(固定为0x02,表示配置描述符)
uint16_t wTotalLength; // 该配置下所有描述符的总长度
uint8_tbNumInterfaces; // 该配置包含的接口数量
uint8_tbConfigurationValue; // 配置编号
uint8_tiConfiguration; // 配置的字符串描述索引
uint8_tbmAttributes; // 配置属性(如是否支持远程唤醒等)
uint8_tMaxPower; // 设备在该配置下的最大功耗
};struct usb_device_descriptor {
uint8_tbLength; // 描述符长度
uint8_tbDescriptorType; // 描述符类型(固定为0x01,表示设备描述符)
uint16_t bcdUSB; // USB协议版本
uint8_tbDeviceClass; // 设备类
uint8_tbDeviceSubClass; // 设备子类
uint8_tbDeviceProtocol; // 设备协议
uint8_tbMaxPacketSize0; // 端点0的最大包大小
uint16_t idVendor; // 厂商ID
uint16_t idProduct; // 产品ID
uint16_t bcdDevice; // 设备版本号
uint8_tiManufacturer; // 厂商字符串描述索引
uint8_tiProduct; // 产品字符串描述索引
uint8_tiSerialNumber; // 设备序列号字符串描述索引
uint8_tbNumConfigurations;// 设备支持的配置数量
};一个设备,只包含一个设备描述符,可以关联多个配置描述符,一个配置描述符包含多个接口描述符,一个接口描述符包含多个端点描述符,并且接口描述符可以包含多个ReportID用于区分端点上传输不同数据
设备描述符(Device Descriptor)
|
|-- 配置描述符 1(Configuration Descriptor 1,bConfigurationValue = 1)
| |
| |-- 接口描述符 1(Interface Descriptor 1)
| | |
| | |-- 端点描述符 1(Endpoint Descriptor 1,bEndpointAddress = 0x81,批量 IN 端点)
| | |-- 端点描述符 2(Endpoint Descriptor 2,bEndpointAddress = 0x01,批量 OUT 端点)
| | |-- 报告描述符(Report Descriptor)
| | |
| | |-- ReportID 1(对应鼠标功能)
| | | |-- 输入报告字段(如鼠标 X 轴移动、Y 轴移动)
| | |-- ReportID 2(对应键盘功能)
| | | |-- 输入报告字段(如按键状态)
| |
| |-- 接口描述符 2(Interface Descriptor 2)
| | |
| | |-- 端点描述符 3(Endpoint Descriptor 3,bEndpointAddress = 0x82,中断 IN 端点)
| | |-- 端点描述符 4(Endpoint Descriptor 4,bEndpointAddress = 0x02,中断 OUT 端点)
| | |-- 报告描述符(Report Descriptor)
| | |
| | |-- ReportID 3(对应游戏手柄功能)
| | | |-- 输入报告字段(如摇杆位置、按键状态)
|
|-- 配置描述符 2(Configuration Descriptor 2,bConfigurationValue = 2)
| |
| |-- 接口描述符 3(Interface Descriptor 3)
| | |
| | |-- 端点描述符 5(Endpoint Descriptor 5,bEndpointAddress = 0x83,批量 IN 端点)
| | |-- 端点描述符 6(Endpoint Descriptor 6,bEndpointAddress = 0x03,批量 OUT 端点)
| | |-- 报告描述符(Report Descriptor)
| | |
| | |-- ReportID 4(对应传感器数据功能)
| | | |-- 输入报告字段(如温度、湿度)
|
|-- 配置描述符 3(Configuration Descriptor 3,bConfigurationValue = 3)
| |
| |-- 接口描述符 4(Interface Descriptor 4)
| | |
| | |-- 端点描述符 7(Endpoint Descriptor 7,bEndpointAddress = 0x84,等时 IN 端点)
| | |-- 端点描述符 8(Endpoint Descriptor 8,bEndpointAddress = 0x04,等时 OUT 端点)
| | |-- 报告描述符(Report Descriptor)
| | |
| | |-- ReportID 5(对应音频输入功能)
| | | |-- 输入报告字段(如音频采样数据)
| | |-- ReportID 6(对应音频输出功能)
| | | |-- 输出报告字段(如音频播放数据)
配置中关键字描述,参阅文档:
来源:
www.usb.org/document-library/hid-usage-tables-16
www.usb.org/document-library/device-class-definition-hid-111
www.usb.org/document-library/usb-20-specification
<p>第四课</p>
<p><img src="data/attachment/forum/202503/30/230317dv5oi35oizkk3du3.png" alt="image.png" title="image.png" /></p>
<p>usb_req_std.c</p>
<p><img src="data/attachment/forum/202503/30/230332jhh3rpjih7jk0qjq.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230339asih3syot3ylltot.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230346q863v66tzdghlp8d.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230352z94qnhpqttzaqquh.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230358x9hhgym446zrpr4y.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230417detmqm5lett3hqdl.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230423l99mfer1jer11zfi.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230431rjn051o883mjror6.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230440aczr9mny90xn9ymw.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230447gt69ll2t0n66zts2.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230454ipir6t5jcrmdppmc.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230501dstjjk1wixxiiiis.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230511ys87yurtvvvmumgm.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230517vvj4zp9v5zuu9jln.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230524h6ycgz4faccw7xf7.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/30/230530i4dae2d2l7lz3sm2.png" alt="image.png" title="image.png" /></p>
鼠标描述符解析:
第一字节:bit0 鼠标左键 bit1鼠标右键,bit2鼠标中键,bit3~bit7占位
第二字节:鼠标x轴移动,>0:right; <0:left
第三字节:鼠标y轴移动,>0:down; <0:up
/*
Input Report:
0 Buttons (D0:LButton D1:RButton D2:MButton :Pad)
1 X displacement (>0:right; <0:left)
2 Y displacement (>0:down; <0:up)
*/
char code MOUSEREPORTDESC =
{
0x05,0x01, //USAGE_PAGE(Generic Desktop);
0x09,0x02, //USAGE(Mouse);
0xa1,0x01, //COLLECTION(Application);
0x09,0x01, //USAGE(Pointer);
0xa1,0x00, //COLLECTION(Physical);
0x05,0x09, // USAGE_PAGE(Buttons);
0x19,0x01, // USAGE_MINIMUM(1);
0x29,0x03, // USAGE_MAXIMUM(3);
0x15,0x00, // LOGICAL_MINIMUM(0);
0x25,0x01, // LOGICAL_MAXIMUM(1);
0x75,0x01, // REPORT_SIZE(1);
0x95,0x03, // REPORT_COUNT(3);
0x81,0x02, // INPUT(Data,Variable,Absolute);
0x75,0x05, // REPORT_SIZE(5);
0x95,0x01, // REPORT_COUNT(1);
0x81,0x01, // INPUT(Constant);
0x05,0x01, // USAGE_PAGE(Generic Desktop);
0x09,0x30, // USAGE(X);
0x09,0x31, // USAGE(Y);
0x15,0x81, // LOGICAL_MINIMUM(-127);
0x25,0x7f, // LOGICAL_MAXIMUM(127);
0x75,0x08, // REPORT_SIZE(8);
0x95,0x02, // REPORT_COUNT(2);
0x81,0x06, // INPUT(Data, Variable, Relative);
0xc0, //END_COLLECTION;
0xc0, //END_COLLECTION;
};
上个是鼠标相对位移,来个鼠标绝对坐标描述符示例:
const uint8_t ABSOLUTE_MOUSE_REPORT_DESC[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xA1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xA1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Buttons)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x05, // REPORT_SIZE (5)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x7F,// LOGICAL_MAXIMUM (32767)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xC0, // END_COLLECTION
0xC0 // END_COLLECTION
};
页:
[1]
2