STM32F407的USB获取描述符请求回调函数USBD_DEVICE
2022-06-16
956
0
STM32F407的USB获取描述符请求回调函数使用结构体USBD_DEVICE来整合。
typedef struct _Device_TypeDef
{
uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length);
} USBD_DEVICE, *pUSBD_DEVICE;
USB获取描述符的请求使用USB的标准请求GET_DESCRIPTOR实现,只是这些请求有的是设备描述符,有的是配置描述符,有些是字符串描述符(包括语言ID).
GetDeviceDescriptor
GetDeviceDescriptor回调函数用于获取设备描述符。
uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length)
{
*length = sizeof(USBD_DeviceDesc);
return USBD_DeviceDesc;
}
参数speed表示该设备的工作速度,这里根据实际的硬件配置和枚举,可能为全速或高速。
参数length以指针的形式,返回设备描述符的长度。
函数返回值则以指针的形式返回USB设备描述符的指针,这里为结构体的指针。
USBD_USR_LangIDStrDescriptor
获取字符串描述符描述符,其中字符串索引ID为0.
uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length)
{
*length = sizeof(USBD_LangIDDesc);
return USBD_LangIDDesc;
}
USBD_USR_ProductStrDescriptor
主机解析USB设备描述符的iProduct为字符串ID索引,获取其对应的字符串描述符,即获取产品信息。
uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length)
{
if(speed == 0)
{
USBD_GetString (USBD_PRODUCT_HS_STRING, USBD_StrDesc, length);
}
else
{
USBD_GetString (USBD_PRODUCT_FS_STRING, USBD_StrDesc, length);
}
return USBD_StrDesc;
}
USBD_USR_ManufacturerStrDescriptor
和USBD_USR_ProductStrDescriptor类似,只是这里以USB设备描述符的iManufacturert为字符串的ID索引,获取其对应的字符串描述符,即获取帮商信息。
uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length)
{
USBD_GetString (USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
return USBD_StrDesc;
}
USBD_USR_SerialStrDescriptor
获取产品的索引列号字符串,对应USB设备描述符中的iSerialNumber。
uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length)
{
if(speed == USB_OTG_SPEED_HIGH)
{
USBD_GetString (USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length);
}
else
{
USBD_GetString (USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length);
}
return USBD_StrDesc;
}
USBD_USR_ConfigStrDescriptor
获取USB设备的配置描述符。
uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length)
{
if(speed == USB_OTG_SPEED_HIGH)
{
USBD_GetString (USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
}
else
{
USBD_GetString (USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length);
}
return USBD_StrDesc;
}
USBD_USR_InterfaceStrDescriptor
获取接口描述符iInterface对应的字符串
uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length)
{
if(speed == 0)
{
USBD_GetString (USBD_INTERFACE_HS_STRING, USBD_StrDesc, length);
}
else
{
USBD_GetString (USBD_INTERFACE_FS_STRING, USBD_StrDesc, length);
}
return USBD_StrDesc;
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936