1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
46
47
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
92
93
94
95
96
97
101
102
103
104
105
106
107
108
109
110
111
117
118
119
120
121
122
123
124
125
126
132
133
134
135
136
137
138
139
140
141
147
159
160
166
167
168
169
170
171
172
173
174
175
181
182
183
184
185
186
187
188
189
190
191
192
193
194
200
212
213
219
231
232
237
238
239
240
241
242
243
244
245
246
247
252
253
254
261
262
263
264
265
266
267
271
275
276
277
278
279
280
/* ... */
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
Includes
#define USBD_VID 0x0483
#define USBD_PID 0xDF11
#define USBD_LANGID_STRING 0x409
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PRODUCT_HS_STRING "DFU in HS Mode"
#define USBD_PRODUCT_FS_STRING "DFU in FS Mode"
#define USBD_CONFIGURATION_HS_STRING "DFU Config"
#define USBD_INTERFACE_HS_STRING "DFU Interface"
#define USBD_CONFIGURATION_FS_STRING "DFU Config"
#define USBD_INTERFACE_FS_STRING "DFU Interface"
10 defines
Private define
uint8_t *USBD_DFU_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t *USBD_DFU_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t *USBD_DFU_ManufacturerStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t *USBD_DFU_ProductStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t *USBD_DFU_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t *USBD_DFU_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t *USBD_DFU_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
Private function prototypes
USBD_DescriptorsTypeDef DFU_Desc = {
USBD_DFU_DeviceDescriptor,
USBD_DFU_LangIDStrDescriptor,
USBD_DFU_ManufacturerStrDescriptor,
USBD_DFU_ProductStrDescriptor,
USBD_DFU_SerialStrDescriptor,
USBD_DFU_ConfigStrDescriptor,
USBD_DFU_InterfaceStrDescriptor,
...};
#if defined ( __ICCARM__ )
#pragma data_alignment=4
#endif
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = {
0x12,
USB_DESC_TYPE_DEVICE,
0x00,
0x02,
0x00,
0x00,
0x00,
USB_MAX_EP0_SIZE,
LOBYTE(USBD_VID),
HIBYTE(USBD_VID),
LOBYTE(USBD_PID),
HIBYTE(USBD_PID),
0x00,
0x02,
USBD_IDX_MFC_STR,
USBD_IDX_PRODUCT_STR,
USBD_IDX_SERIAL_STR,
USBD_MAX_NUM_CONFIGURATION
...};
#if defined ( __ICCARM__ )
#pragma data_alignment=4
#endif
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = {
USB_LEN_LANGID_STR_DESC,
USB_DESC_TYPE_STRING,
LOBYTE(USBD_LANGID_STRING),
HIBYTE(USBD_LANGID_STRING),
...};
#if defined ( __ICCARM__ )
#pragma data_alignment=4
#endif
__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END =
{
USB_SIZ_STRING_SERIAL,
USB_DESC_TYPE_STRING,
...};
#if defined ( __ICCARM__ )
#pragma data_alignment=4
#endif
__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
Private variables
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len);
static void Get_SerialNum(void);
/* ... */
uint8_t *USBD_DFU_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
UNUSED(speed);
*length = sizeof(USBD_DeviceDesc);
return (uint8_t*)USBD_DeviceDesc;
}{ ... }
/* ... */
uint8_t *USBD_DFU_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
UNUSED(speed);
*length = sizeof(USBD_LangIDDesc);
return (uint8_t*)USBD_LangIDDesc;
}{ ... }
/* ... */
uint8_t *USBD_DFU_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
if(speed == 0)
{
USBD_GetString((uint8_t *)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length);
}if (speed == 0) { ... }
else
{
USBD_GetString((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length);
}else { ... }
return USBD_StrDesc;
}{ ... }
/* ... */
uint8_t *USBD_DFU_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
UNUSED(speed);
USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
return USBD_StrDesc;
}{ ... }
/* ... */
uint8_t *USBD_DFU_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
UNUSED(speed);
*length = USB_SIZ_STRING_SERIAL;
Get_SerialNum();
return (uint8_t*)USBD_StringSerial;
}{ ... }
/* ... */
uint8_t *USBD_DFU_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
if(speed == USBD_SPEED_HIGH)
{
USBD_GetString((uint8_t *)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
}if (speed == USBD_SPEED_HIGH) { ... }
else
{
USBD_GetString((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length);
}else { ... }
return USBD_StrDesc;
}{ ... }
/* ... */
uint8_t *USBD_DFU_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{
if(speed == 0)
{
USBD_GetString((uint8_t *)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length);
}if (speed == 0) { ... }
else
{
USBD_GetString((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length);
}else { ... }
return USBD_StrDesc;
}{ ... }
/* ... */
static void Get_SerialNum(void)
{
uint32_t deviceserial0, deviceserial1, deviceserial2;
deviceserial0 = *(uint32_t*)DEVICE_ID1;
deviceserial1 = *(uint32_t*)DEVICE_ID2;
deviceserial2 = *(uint32_t*)DEVICE_ID3;
deviceserial0 += deviceserial2;
if (deviceserial0 != 0)
{
IntToUnicode (deviceserial0, &USBD_StringSerial[2] ,8);
IntToUnicode (deviceserial1, &USBD_StringSerial[18] ,4);
}if (deviceserial0 != 0) { ... }
}{ ... }
/* ... */
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len)
{
uint8_t idx = 0;
for( idx = 0; idx < len; idx ++)
{
if( ((value >> 28)) < 0xA )
{
pbuf[ 2* idx] = (value >> 28) + '0';
}if (((value >> 28)) < 0xA) { ... }
else
{
pbuf[2* idx] = (value >> 28) + 'A' - 10;
}else { ... }
value = value << 4;
pbuf[ 2* idx + 1] = 0;
}for (idx = 0; idx < len; idx ++) { ... }
}{ ... }