stm32 USB

stm32 USB

DEVICE

wireshark的usb抓包分析

STM32F103 USB EP0通信数据详解

USB的端点描述符详解

Custom HID

  • 1.描述符:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
    {
    /* USER CODE BEGIN 0 */
    0x05, 0x8c, /* USAGE_PAGE (ST Page) */
    0x09, 0x01, /* USAGE (Demo Kit) */
    0xa1, 0x01, /* COLLECTION (Application) */

    // The Input report
    0x09,0x03, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8bit)
    0x95,0x40, // REPORT_COUNT (64Byte)
    0x81,0x02, // INPUT (Data,Var,Abs)

    // The Output report
    0x09,0x04, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8bit)
    0x95,0x40, // REPORT_COUNT (64Byte)
    0x91,0x02, // OUTPUT (Data,Var,Abs)
    /* USER CODE END 0 */
    0xC0 /* END_COLLECTION */
    };
  • 2.usbd_conf.h做buff长度修改:
    1
    2
    3
    #define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE      64

    #define USBD_CUSTOM_HID_REPORT_DESC_SIZE 33
    usbd_customhid.h文件中的发送与接收长度
    1
    2
    3
    #define CUSTOM_HID_EPIN_SIZE               0x40

    #define CUSTOM_HID_EPOUT_SIZE 0x40
  • 3.收发内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    uint8_t USB_Recive_Buffer[64];
    static uint8_t USBD_CUSTOM_HID_DataOut (USBD_HandleTypeDef *pdev,
    uint8_t epnum)
    {

    USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)pdev->pClassData;

    /* ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],
    hhid->Report_buf[1]);

    USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR , hhid->Report_buf,
    USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);
    */
    USBD_CUSTOM_HID_SendReport(pdev,USB_Recive_Buffer,64);
    USBD_LL_PrepareReceive( pdev, CUSTOM_HID_EPOUT_ADDR , USB_Recive_Buffer, sizeof( USB_Recive_Buffer ) );

    return USBD_OK;
    }

CDC
接收

1
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)

发送

1
CDC_Transmit_FS

HID_MOUSE

Demo:鼠标每秒右移10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct mouseHID_t {
uint8_t buttons;//左0x0001 右0x0010 中0x0100
int8_t x;//+:右 -:左
int8_t y;
int8_t wheel;//+:上 -:下
};
struct mouseHID_t mouseHID;

mouseHID.buttons = 0;
mouseHID.x = 10;
mouseHID.y = 0;
mouseHID.wheel = 0;

mouseHID.x = 10;
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*)&mouseHID, sizeof(struct mouseHID_t));
HAL_Delay(1000);

HID_KEY

usbd_hid.h文件

1
2
#define HID_EPIN_SIZE  0x08
#define HID_MOUSE_REPORT_DESC_SIZE 63

usbd_desc.c文件

1
2
//  #define USBD_VID     0x1111
#define USBD_PID_FS 0x1111

usbd_hid.c文件

1
0x01,   /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]
0x05, 0x01, // USAGE_PAGE (Generic Desktop) //63
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTION

Demo:输出按键A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
* buffer[0] - bit0: Left CTRL
* -bit1: Left SHIFT
* -bit2: Left ALT
* -bit3: Left GUI
* -bit4: Right CTRL
* -bit5: Right SHIFT
* -bit6: Right ALT
* -bit7: Right GUI
* buffer[1] - Padding = Always 0x00
* buffer[2] - Key 1
* buffer[3] - Key 2
* buffer[4] - Key 3
* buffer[5] - Key 4
* buffer[6] - Key 5
* buffer[7] - Key 6
*/
buffer[0] = 0x02; //shift
buffer[2] = 0x04; // a
USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8); //send
HAL_Delay(15); //delay

buffer[0] = 0x00;
buffer[2] = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8);
HAL_Delay(15);

HOST

HID_KeyMouse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void USBMouseHandler(void)
{
static uint8_t temp;
if (Appli_state == APPLICATION_READY)
{
//keyboard
if (USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
{
HID_KEYBD_Info_TypeDef *KeyEvent = USBH_HID_GetKeybdInfo(&hUsbHostFS);
if (temp != USBH_HID_GetASCIICode(KeyEvent))
{
temp = USBH_HID_GetASCIICode(KeyEvent);
printf("%c",USBH_HID_GetASCIICode(KeyEvent));
}
}
//mouse
else if (USBH_HID_GetDeviceType(&hUsbHostFS) == HID_MOUSE)
{
HID_MOUSE_Info_TypeDef *MouseEvent = USBH_HID_GetMouseInfo(&hUsbHostFS);
if (MouseEvent != NULL)
{
printf("button:%d\r\n",MouseEvent->buttons[0]);
}
}
}
}

需要对枚举状态判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static uint8_t i;
//--------------------------------
case HOST_ENUMERATION:
//--------------------------------

i = 0;
}
else
{
i++;
USBH_Delay(10);
if (i>200)
{
i = 0;
phost->gState = HOST_DEV_DISCONNECTED;
}
}

长时间枚举失败 返回

-->

请我喝杯咖啡吧~

支付宝
微信