Skip to content

Commit f7f4bf0

Browse files
committed
stm32/usbdev: Move all the USB device descriptor state into its struct.
1 parent db7f4aa commit f7f4bf0

4 files changed

Lines changed: 54 additions & 58 deletions

File tree

ports/stm32/usb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, usb_device_mode_t mode, USBD_H
116116
// only init USB once in the device's power-lifetime
117117

118118
// configure the VID, PID and the USBD mode (interfaces it will expose)
119-
USBD_SetVIDPIDRelease(vid, pid, 0x0200, mode == USBD_MODE_CDC);
119+
USBD_SetVIDPIDRelease(&usb_dev->usbd_cdc_msc_hid_state, vid, pid, 0x0200, mode == USBD_MODE_CDC);
120120
if (USBD_SelectMode(&usb_dev->usbd_cdc_msc_hid_state, mode, hid_info) != 0) {
121121
return false;
122122
}

ports/stm32/usbd_desc.c

Lines changed: 47 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -50,59 +50,45 @@
5050
#define USBD_CONFIGURATION_FS_STRING "Pyboard Config"
5151
#define USBD_INTERFACE_FS_STRING "Pyboard Interface"
5252

53-
// USB Standard Device Descriptor
54-
// needs to be in RAM because we modify the VID and PID
55-
__ALIGN_BEGIN static uint8_t hUSBDDeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = {
56-
0x12, // bLength
57-
USB_DESC_TYPE_DEVICE, // bDescriptorType
58-
0x00, // bcdUSB
59-
0x02,
60-
0xef, // bDeviceClass: Miscellaneous Device Class
61-
0x02, // bDeviceSubClass: Common Class
62-
0x01, // bDeviceProtocol: Interface Association Descriptor
63-
USB_MAX_EP0_SIZE, // bMaxPacketSize
64-
LOBYTE(USBD_VID), // idVendor
65-
HIBYTE(USBD_VID), // idVendor
66-
LOBYTE(USBD_PID), // idVendor
67-
HIBYTE(USBD_PID), // idVendor
68-
0x00, // bcdDevice rel. 2.00
69-
0x02,
70-
USBD_IDX_MFC_STR, // Index of manufacturer string
71-
USBD_IDX_PRODUCT_STR, // Index of product string
72-
USBD_IDX_SERIAL_STR, // Index of serial number string
73-
USBD_MAX_NUM_CONFIGURATION // bNumConfigurations
74-
};
75-
76-
__ALIGN_BEGIN static uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = {
53+
__ALIGN_BEGIN static const uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = {
7754
USB_LEN_LANGID_STR_DESC,
7855
USB_DESC_TYPE_STRING,
7956
LOBYTE(USBD_LANGID_STRING),
8057
HIBYTE(USBD_LANGID_STRING),
8158
};
8259

83-
__ALIGN_BEGIN static uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
84-
8560
// set the VID, PID and device release number
86-
void USBD_SetVIDPIDRelease(uint16_t vid, uint16_t pid, uint16_t device_release_num, int cdc_only) {
61+
void USBD_SetVIDPIDRelease(usbd_cdc_msc_hid_state_t *usbd, uint16_t vid, uint16_t pid, uint16_t device_release_num, int cdc_only) {
62+
uint8_t *dev_desc = &usbd->usbd_device_desc[0];
63+
64+
dev_desc[0] = USB_LEN_DEV_DESC; // bLength
65+
dev_desc[1] = USB_DESC_TYPE_DEVICE; // bDescriptorType
66+
dev_desc[2] = 0x00; // bcdUSB
67+
dev_desc[3] = 0x02; // bcdUSB
8768
if (cdc_only) {
8869
// Make it look like a Communications device if we're only
8970
// using CDC. Otherwise, windows gets confused when we tell it that
9071
// its a composite device with only a cdc serial interface.
91-
hUSBDDeviceDesc[4] = 0x02;
92-
hUSBDDeviceDesc[5] = 0x00;
93-
hUSBDDeviceDesc[6] = 0x00;
72+
dev_desc[4] = 0x02; // bDeviceClass
73+
dev_desc[5] = 0x00; // bDeviceSubClass
74+
dev_desc[6] = 0x00; // bDeviceProtocol
9475
} else {
9576
// For the other modes, we make this look like a composite device.
96-
hUSBDDeviceDesc[4] = 0xef;
97-
hUSBDDeviceDesc[5] = 0x02;
98-
hUSBDDeviceDesc[6] = 0x01;
77+
dev_desc[4] = 0xef; // bDeviceClass: Miscellaneous Device Class
78+
dev_desc[5] = 0x02; // bDeviceSubClass: Common Class
79+
dev_desc[6] = 0x01; // bDeviceProtocol: Interface Association Descriptor
9980
}
100-
hUSBDDeviceDesc[8] = LOBYTE(vid);
101-
hUSBDDeviceDesc[9] = HIBYTE(vid);
102-
hUSBDDeviceDesc[10] = LOBYTE(pid);
103-
hUSBDDeviceDesc[11] = HIBYTE(pid);
104-
hUSBDDeviceDesc[12] = LOBYTE(device_release_num);
105-
hUSBDDeviceDesc[13] = HIBYTE(device_release_num);
81+
dev_desc[7] = USB_MAX_EP0_SIZE; // bMaxPacketSize
82+
dev_desc[8] = LOBYTE(vid); // idVendor
83+
dev_desc[9] = HIBYTE(vid); // idVendor
84+
dev_desc[10] = LOBYTE(pid); // idVendor
85+
dev_desc[11] = HIBYTE(pid); // idVendor
86+
dev_desc[12] = LOBYTE(device_release_num); // bcdDevice
87+
dev_desc[13] = HIBYTE(device_release_num); // bcdDevice
88+
dev_desc[14] = USBD_IDX_MFC_STR; // Index of manufacturer string
89+
dev_desc[15] = USBD_IDX_PRODUCT_STR; // Index of product string
90+
dev_desc[16] = USBD_IDX_SERIAL_STR; // Index of serial number string
91+
dev_desc[17] = USBD_MAX_NUM_CONFIGURATION; // bNumConfigurations
10692
}
10793

10894
/**
@@ -112,8 +98,9 @@ void USBD_SetVIDPIDRelease(uint16_t vid, uint16_t pid, uint16_t device_release_n
11298
* @retval Pointer to descriptor buffer
11399
*/
114100
STATIC uint8_t *USBD_DeviceDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length) {
115-
*length = sizeof(hUSBDDeviceDesc);
116-
return hUSBDDeviceDesc;
101+
uint8_t *dev_desc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->usbd_device_desc;
102+
*length = USB_LEN_DEV_DESC;
103+
return dev_desc;
117104
}
118105

119106
/**
@@ -124,7 +111,7 @@ STATIC uint8_t *USBD_DeviceDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length
124111
*/
125112
STATIC uint8_t *USBD_LangIDStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length) {
126113
*length = sizeof(USBD_LangIDDesc);
127-
return USBD_LangIDDesc;
114+
return (uint8_t*)USBD_LangIDDesc; // the data should only be read from this buf
128115
}
129116

130117
/**
@@ -134,12 +121,13 @@ STATIC uint8_t *USBD_LangIDStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *len
134121
* @retval Pointer to descriptor buffer
135122
*/
136123
STATIC uint8_t *USBD_ProductStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length) {
124+
uint8_t *str_desc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->usbd_str_desc;
137125
if (pdev->dev_speed == USBD_SPEED_HIGH) {
138-
USBD_GetString((uint8_t *)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length);
126+
USBD_GetString((uint8_t *)USBD_PRODUCT_HS_STRING, str_desc, length);
139127
} else {
140-
USBD_GetString((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length);
128+
USBD_GetString((uint8_t *)USBD_PRODUCT_FS_STRING, str_desc, length);
141129
}
142-
return USBD_StrDesc;
130+
return str_desc;
143131
}
144132

145133
/**
@@ -149,8 +137,9 @@ STATIC uint8_t *USBD_ProductStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *le
149137
* @retval Pointer to descriptor buffer
150138
*/
151139
STATIC uint8_t *USBD_ManufacturerStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length) {
152-
USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
153-
return USBD_StrDesc;
140+
uint8_t *str_desc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->usbd_str_desc;
141+
USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, str_desc, length);
142+
return str_desc;
154143
}
155144

156145
/**
@@ -179,8 +168,9 @@ STATIC uint8_t *USBD_SerialStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *len
179168
"%02X%02X%02X%02X%02X%02X",
180169
id[11], id[10] + id[2], id[9], id[8] + id[0], id[7], id[6]);
181170

182-
USBD_GetString((uint8_t *)serial_buf, USBD_StrDesc, length);
183-
return USBD_StrDesc;
171+
uint8_t *str_desc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->usbd_str_desc;
172+
USBD_GetString((uint8_t *)serial_buf, str_desc, length);
173+
return str_desc;
184174
}
185175

186176
/**
@@ -190,12 +180,13 @@ STATIC uint8_t *USBD_SerialStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *len
190180
* @retval Pointer to descriptor buffer
191181
*/
192182
STATIC uint8_t *USBD_ConfigStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length) {
183+
uint8_t *str_desc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->usbd_str_desc;
193184
if (pdev->dev_speed == USBD_SPEED_HIGH) {
194-
USBD_GetString((uint8_t *)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
185+
USBD_GetString((uint8_t *)USBD_CONFIGURATION_HS_STRING, str_desc, length);
195186
} else {
196-
USBD_GetString((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length);
187+
USBD_GetString((uint8_t *)USBD_CONFIGURATION_FS_STRING, str_desc, length);
197188
}
198-
return USBD_StrDesc;
189+
return str_desc;
199190
}
200191

201192
/**
@@ -205,12 +196,13 @@ STATIC uint8_t *USBD_ConfigStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *len
205196
* @retval Pointer to descriptor buffer
206197
*/
207198
STATIC uint8_t *USBD_InterfaceStrDescriptor(USBD_HandleTypeDef *pdev, uint16_t *length) {
199+
uint8_t *str_desc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->usbd_str_desc;
208200
if (pdev->dev_speed == USBD_SPEED_HIGH) {
209-
USBD_GetString((uint8_t *)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length);
201+
USBD_GetString((uint8_t *)USBD_INTERFACE_HS_STRING, str_desc, length);
210202
} else {
211-
USBD_GetString((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length);
203+
USBD_GetString((uint8_t *)USBD_INTERFACE_FS_STRING, str_desc, length);
212204
}
213-
return USBD_StrDesc;
205+
return str_desc;
214206
}
215207

216208
const USBD_DescriptorsTypeDef USBD_Descriptors = {

ports/stm32/usbd_desc.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
#ifndef MICROPY_INCLUDED_STMHAL_USBD_DESC_H
2727
#define MICROPY_INCLUDED_STMHAL_USBD_DESC_H
2828

29+
#include "usbd_cdc_msc_hid.h"
30+
2931
extern const USBD_DescriptorsTypeDef USBD_Descriptors;
3032

31-
void USBD_SetVIDPIDRelease(uint16_t vid, uint16_t pid, uint16_t device_release_num, int cdc_only);
33+
void USBD_SetVIDPIDRelease(usbd_cdc_msc_hid_state_t *usbd, uint16_t vid, uint16_t pid, uint16_t device_release_num, int cdc_only);
3234

3335
#endif // MICROPY_INCLUDED_STMHAL_USBD_DESC_H

ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ typedef struct _usbd_cdc_msc_hid_state_t {
105105
USBD_MSC_BOT_HandleTypeDef MSC_BOT_ClassData;
106106
USBD_HID_HandleTypeDef HID_ClassData;
107107

108-
// RAM to hold the current configuration descriptor, which we configure on the fly
108+
// RAM to hold the current descriptors, which we configure on the fly
109+
__ALIGN_BEGIN uint8_t usbd_device_desc[USB_LEN_DEV_DESC] __ALIGN_END;
110+
__ALIGN_BEGIN uint8_t usbd_str_desc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
109111
__ALIGN_BEGIN uint8_t usbd_config_desc[MAX_TEMPLATE_CONFIG_DESC_SIZE] __ALIGN_END;
110112

111113
void *cdc;

0 commit comments

Comments
 (0)