ercircle 发表于 2025-3-21 09:28:42

USB原理课程学习记录贴

学习下论坛里何宾教授的USB原理课程
视频教学:【USB 原理及实战,16课时】,大学标准课程,有配套书籍 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区


国芯人工智能 发表于 2025-3-21 09:33:00

本贴记录了学习何宾教授《USB原理及实战》课程的详细过程。该课程共16课时,系统讲解了USB协议的基本原理、硬件设计及软件开发,并重点探讨了USB-CDC虚拟串口、USB转双串口及HID复合设备的实现方法。课程内容深入浅出,理论与实践相结合,适合有一定基础的开发者深入学习。<br><br>通过学习,本人对USB通信协议有了更深刻的理解,尤其是在USB设备枚举、数据传输及端点配置等方面。课程配套的书籍《USB原理及实战》也提供了丰富的案例和代码,帮助巩固理论知识并应用于实际项目。<br><br>此外,课程中提到的“一箭双雕”USB转双串口方案,为多串口应用场景提供了高效解决方案,极具实用价值。HID复合设备的实现方法也为开发复杂USB设备提供了新思路。<br><br>总体而言,本课程内容详实,理论与实践并重,是学习USB技术的优质资源。建议学员在学习过程中结合动手实践,以加深理解并提升应用能力。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-3-21 09:33:33

第一集了解基本概念
昨天看了第一课补充点截图



D+绿色 D-白色

NRZI编码













ercircle 发表于 2025-3-21 14:49:33


第二课 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 包




ercircle 发表于 2025-3-25 13:13:43

第三课



















ercircle 发表于 2025-3-26 10:14:41


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(对应音频输出功能)
|   |       |   |-- 输出报告字段(如音频播放数据)

ercircle 发表于 2025-3-26 10:53:30

配置中关键字描述,参阅文档:




来源:
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

ercircle 发表于 2025-3-30 23:06:05

<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>

ercircle 发表于 2025-3-30 23:13:09

鼠标描述符解析:

第一字节: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;
};

ercircle 发表于 2025-3-30 23:18:03

上个是鼠标相对位移,来个鼠标绝对坐标描述符示例:



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
查看完整版本: USB原理课程学习记录贴