打印
[STM32F1]

STM32Cube的USB_device软件库说明

[复制链接]
楼主: 而服务器人
手机看帖
扫描二维码
随时随地手机跟帖
21
而服务器人|  楼主 | 2024-3-30 23:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
USB 设备库功能
6.2.1 USB 设备 - 内核文件
  Core 目录包含了 USB 设备库状态机,它由通用串行总线规范版本 2.0 定义。

使用特权

评论回复
22
而服务器人|  楼主 | 2024-3-30 23:03 | 只看该作者
USB 设备 - 类驱动文件
  Class 目录包含与类实现有关的所有文件,满足了这些类中协议构建规范的要求。

使用特权

评论回复
23
而服务器人|  楼主 | 2024-3-30 23:03 | 只看该作者
usbd_core (.c,.h) 文件功能

使用特权

评论回复
24
而服务器人|  楼主 | 2024-3-30 23:03 | 只看该作者

使用特权

评论回复
25
而服务器人|  楼主 | 2024-3-30 23:04 | 只看该作者
usbd_ioreq (.c,.h) 文件功能

使用特权

评论回复
26
而服务器人|  楼主 | 2024-3-30 23:04 | 只看该作者
usbd_ctrlq (.c,.h) 文件功能

使用特权

评论回复
27
而服务器人|  楼主 | 2024-3-30 23:04 | 只看该作者
USB 设备类接口
  在USB设备库初始化期间选择USB类,方法是选择响应的类回调结构体。类结构体如下定义:

USB 类回调结构体 (usbd_def.h)

typedef struct _Device_cb
{
  uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx);
  uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx);
  /* Control Endpoints*/
  uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef  *req);
  uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev);
  uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev);
  /* Class Specific Endpoints*/
  uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum);
  uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum);
  uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev);
  uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum);
  uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum);

  uint8_t  *(*GetHSConfigDescriptor)(uint16_t *length);
  uint8_t  *(*GetFSConfigDescriptor)(uint16_t *length);
  uint8_t  *(*GetOtherSpeedConfigDescriptor)(uint16_t *length);
  uint8_t  *(*GetDeviceQualifierDescriptor)(uint16_t *length);
#if (USBD_SUPPORT_USER_STRING_DESC == 1U)
  uint8_t  *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index,  uint16_t *length);
#endif

} USBD_ClassTypeDef;

使用特权

评论回复
28
而服务器人|  楼主 | 2024-3-30 23:04 | 只看该作者
Init:当设备收到设置配置请求时,会调用此回调;在此函数中类接口使用的端点打开。
DeInit:当收到清除配置请求时,会调用此回调;此函数会关闭类接口使用的端点。

/* Control Endpoints*/
Setup:调用此回调可处理特定类设置请求。
EP0_TxSent:当发送状态完成时,会调用此回调。
EP0_RxSent:当接收状态完成时,会调用此回调。

/* Class Specific Endpoints*/
DataIn:调用此回调可执行非控制端点相关数据输入阶段的数据。
DataOut:调用此回调可执行非控制端点相关数据输出阶段的数据。
SOF:当收到 SOF 中断时调用此回调;可使用此回调将一些过程与帧开始同步。
IsoINIncomplete:当最后一个同步 IN 传输未完成时,调用此回调。
IsoOUTIncomplete:当最后一个同步 OUT 传输未完成时,调用此回调。

GetHSConfigDescriptor:此回调返回 HS USB 配置描述符。
GetFSConfigDescriptor:此回调返回 FS USB 配置描述符。
GetOtherSpeedConfigDescriptor:此回调返回高速模式中所用类的其它配置描述符。
GetDeviceQualifierDescriptor:此回调返回设备合格描述符

  库还提供了描述符回调结构体,以允许用户在应用运行时管理设备和字符串描述符。描述符结构体如下定义

使用特权

评论回复
29
而服务器人|  楼主 | 2024-3-30 23:05 | 只看该作者
USB 设备描述符结构体 (usbd_def.h)


/* USB Device descriptors structure */
typedef struct
{
  uint8_t  *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
  uint8_t  *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
  uint8_t  *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
  uint8_t  *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
  uint8_t  *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
  uint8_t  *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
  uint8_t  *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
#if (USBD_LPM_ENABLED == 1U)
  uint8_t  *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
#endif
} USBD_DescriptorsTypeDef;


GetDeviceDescriptor:此回调返回设备描述符。
GetLangIDStrDescriptor:此回调返回语言 ID 字符串描述符。
GetManufacturerStrDescriptor:此回调返回制造商字符串描述符。
GetProductStrDescriptor:此回调返回产品字符串描述符。
GetSerialStrDescriptor:此回调返回序列号字符串描述符。
GetConfigurationStrDescriptor:此回调返回配置字符串描述符。
GetInterfaceStrDescriptor:此回调返回接口字符串描述符。

  注 : USB 设备样例内提供的 usbd_desc.c 文件实现了这些回调实体。

使用特权

评论回复
30
而服务器人|  楼主 | 2024-3-30 23:05 | 只看该作者
USB 设备库类模块
  类模块包含了关于类实现的所有文件。它与这些类中构建协议的规范兼容。下表展示了MSC、 HID、 DFU、音频、 CDC 类的 USB 设备类文件。

7.1 USB 设备类文件表


HID 类
HID 类实现
此驱动实现了规范的下列方面:

启动接口子类
鼠标协议
使用页:通用桌面
使用:摇杆
收集:应用

使用特权

评论回复
31
而服务器人|  楼主 | 2024-3-30 23:06 | 只看该作者
HID 用户接口
  输入报告仅通过中断进入管道发送 (HID 鼠标样例)。
  必须通过控制管道或中断输出管道,由主机启动特性和输出报告 (自定义HID 样例)
  USBD_HID_SendReport可被HID鼠标应用使用,来发送HID报告,在这个版本中,HID驱动仅处理 IN 传输。此函数的用法举例如下所示:

static __IO uint32_t counter=0;
HAL_IncTick();
/* check Joystick state every 10ms */
if (counter++ == 10)
{
GetPointerData(HID_Buffer);
/* send data though IN endpoint*/
if((HID_Buffer[1] != 0) || (HID_Buffer[2] != 0))
{
USBD_HID_SendReport(&USBD_Device, HID_Buffer, 4);
}
counter =0;
}
Toggle_Leds();
}

使用特权

评论回复
32
而服务器人|  楼主 | 2024-3-30 23:06 | 只看该作者
HID 类驱动 API
  所有 HID 类驱动 API 都定义于 usbd_hid.c 中,并总结于下表中

使用特权

评论回复
33
而服务器人|  楼主 | 2024-3-30 23:07 | 只看该作者
HID栈由调用USBD_HID_Init()来初始化,之后应用必须调用USBD_HID_SendReport()函数以发送 HID 报告。

  下列 HID 特定请求通过端点 0 (控制)实现:

#define HID_REQ_SET_PROTOCOL 0x0B
#define HID_REQ_GET_PROTOCOL 0x03
#define HID_REQ_SET_IDLE 0x0A
#define HID_REQ_GET_IDLE 0x02
#define HID_REQ_SET_REPORT 0x09
#define HID_REQ_GET_REPORT 0x01

 IN 端点地址和可发送的最大字节数由这些定义给出:

#define HID_EPIN_ADDR 0x81
#define HID_EPIN_SIZE 0x04


使用特权

评论回复
34
而服务器人|  楼主 | 2024-3-30 23:07 | 只看该作者
大容量存储类 (略)
7.1.3 设备固件升级(DFU)类 (略)
7.1.4 音频类
  此驱动管理音频类,符合 “ 音频设备 USB 设备类定义 V1.0 1998-3-18”。
此驱动实现了规范的下列方面:

设备描述符管理
配置描述符管理
标准 AC 接口描述符管理
1 个音频流接口 (单通道、 PCM、立体声模式)
1 个音频流端点
1 个音频终端输入 (1 个通道)
音频特定类 AC 接口
音频特定类 AS 接口
音频控制请求:仅支持 SET_CUR 和 GET_CUR 请求 (静音)
音频特性单元 (限为静音控制)
音频同步类型:异步
单固定音频采样率 (可在 usbd_conf.h 文件中配置)
  注 : 音频类基于 USB 规范 1.0,因此仅支持低速模式和全速模式,不支持高速传输。请参考 “ 音频设备 USB 设备类定义 V1.0 1998-3-18” 以获取更详细信息。


使用特权

评论回复
35
而服务器人|  楼主 | 2024-3-30 23:07 | 只看该作者
可针对特定用户应用增加或修改这些方面。
  此驱动没有实现规范的下述方面 (但有可能修改驱动以管理这些特性):

音频控制端点管理
SET_CUR 和 GET_CUR 以外的音频控制请求
音频控制请求的抽象层 (仅管理静音功能)
音频同步类型:自适应
音频压缩模块和接口
MIDI 接口和模块
混合 / 选择 / 处理 / 扩展单元 (所列单元限为静音控制)
其它任何特定应用模块
复合及可变的音频采样率
音频输出流端点 / 接口 (麦克风)

使用特权

评论回复
36
而服务器人|  楼主 | 2024-3-30 23:07 | 只看该作者
音频类实现
  音频传输基于同步端点事务。 音频控制请求还通过控制端点 (端点 0)管理。
  在每一帧传输的音频数据包必须在此帧时间之内 (下一帧之前)处理掉。音频质量取决于数据传输和数据处理之间的同步情况。此驱动依赖所交付 I2S时钟的精度,实现简单的同步机制。在每帧开始时,驱动会检查是否正确执行了前一帧的处理,若仍在进行则将其停止。 为防止任何数据覆盖,主要使用了两种保护方式:

在 USB 缓冲和输出设备寄存器 (I2S)之间使用 DMA 进行数据传输。
使用多缓冲存储从 USB 接收的数据。
  基于此机制,如果时钟精度或处理速率不够高,则会导致较差的音频质量。
  此机制可通过实现更灵活的音频流控制来加强,如 USB 反馈模式、动态音频时钟纠正,或使用 SOF 事件生成 / 控制音频时钟。

使用特权

评论回复
37
而服务器人|  楼主 | 2024-3-30 23:08 | 只看该作者
 驱动还支持基本音频控制请求。为简化驱动,仅实现了两个请求。然而,仅需稍微修改音频内核驱动即可支持其他请求。



使用特权

评论回复
38
而服务器人|  楼主 | 2024-3-30 23:08 | 只看该作者
音频内核文件 usbd_audio (.c, .h)
  usbd_audio (.c, .h)此驱动为音频内核。它管理音频数据传输并控制请求。它不直接处理音频硬件 (由底层驱动管理)。

使用特权

评论回复
39
而服务器人|  楼主 | 2024-3-30 23:08 | 只看该作者
底层硬件接口通过它们相应的驱动结构体管理:

typedef struct
{
  int8_t (*Init)(uint32_t  AudioFreq, uint32_t Volume, uint32_t options);
  int8_t (*DeInit)(uint32_t options);
  int8_t (*AudioCmd)(uint8_t *pbuf, uint32_t size, uint8_t cmd);
  int8_t (*VolumeCtl)(uint8_t vol);
  int8_t (*MuteCtl)(uint8_t cmd);
  int8_t (*PeriodicTC)(uint8_t cmd);
  int8_t (*GetState)(void);
} USBD_AUDIO_ItfTypeDef;


使用特权

评论回复
40
而服务器人|  楼主 | 2024-3-30 23:08 | 只看该作者
每个音频硬件接口驱动都应该提供一个类型为USBD_AUDIO_ItfTypeDef的结构体指针。(下边的章节会写该结构体所指向的函数和变量)。如果给定的存储器接口不支持某功能,则相应的字段置为 NULL 值。

usbd_audio_if (.c, .h)
  usbd_audio_if (.c, .h)此驱动管理底层音频硬件。 usbd_audio_if.c/.h 驱动管理音频输出接口 (从 USB 到音频扬声器 / 耳机)。用户可调用底层编解码器驱动(即 stm324xg_eval_audio.c/.h)以进行基本的音频操作 (播放 / 暂停 / 音量控制…)。
此驱动提供了结构体指针:

/** AUDIO_IF Interface callback. */
extern USBD_AUDIO_ItfTypeDef USBD_AUDIO_fops_FS;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则