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 */
114100STATIC 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 */
125112STATIC 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 */
136123STATIC 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 */
151139STATIC 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 */
192182STATIC 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 */
207198STATIC 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
216208const USBD_DescriptorsTypeDef USBD_Descriptors = {
0 commit comments