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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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
87
88
89
90
91
92
98
99
100
101
102
106
107
108
109
110
111
112
113
114
115
116
117
123
124
125
126
127
128
129
130
131
132
138
139
140
141
142
143
144
145
146
147
148
154
155
169
170
176
177
183
184
190
191
192
193
194
195
196
197
198
200
201
202
203
204
205
211
212
226
227
233
234
248
249
254
255
256
257
258
259
260
261
262
263
264
269
270
271
278
279
280
281
282
283
284
288
292
293
294
295
296
297
/* ... */
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
Includes
#define USBD_VID 0x0483
#define USBD_PID 0x5720
#define USBD_LANGID_STRING 0x409
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PRODUCT_HS_STRING "Mass Storage in HS Mode"
#define USBD_PRODUCT_FS_STRING "Mass Storage in FS Mode"
#define USBD_CONFIGURATION_HS_STRING "MSC Config"
#define USBD_INTERFACE_HS_STRING "MSC Interface"
#define USBD_CONFIGURATION_FS_STRING "MSC Config"
#define USBD_INTERFACE_FS_STRING "MSC Interface"
10 defines
Private define
uint8_t *USBD_MSC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t * length);
uint8_t *USBD_MSC_LangIDStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length);
uint8_t *USBD_MSC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length);
uint8_t *USBD_MSC_ProductStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length);
uint8_t *USBD_MSC_SerialStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length);
uint8_t *USBD_MSC_ConfigStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length);
uint8_t *USBD_MSC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length);
Private function prototypes
USBD_DescriptorsTypeDef MSC_Desc = {
USBD_MSC_DeviceDescriptor,
USBD_MSC_LangIDStrDescriptor,
USBD_MSC_ManufacturerStrDescriptor,
USBD_MSC_ProductStrDescriptor,
USBD_MSC_SerialStrDescriptor,
USBD_MSC_ConfigStrDescriptor,
USBD_MSC_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_MSC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t * length)
{
UNUSED(speed);
*length = sizeof(USBD_DeviceDesc);
return (uint8_t *) USBD_DeviceDesc;
}{ ... }
/* ... */
uint8_t *USBD_MSC_LangIDStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length)
{
UNUSED(speed);
*length = sizeof(USBD_LangIDDesc);
return (uint8_t *) USBD_LangIDDesc;
}{ ... }
/* ... */
uint8_t *USBD_MSC_ProductStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length)
{
if (speed == 0)
{
USBD_GetString((uint8_t *) (uint8_t *) USBD_PRODUCT_HS_STRING, USBD_StrDesc,
length);
}if (speed == 0) { ... }
else
{
USBD_GetString((uint8_t *) (uint8_t *) USBD_PRODUCT_FS_STRING, USBD_StrDesc,
length);
}else { ... }
return USBD_StrDesc;
}{ ... }
/* ... */
uint8_t *USBD_MSC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length)
{
USBD_GetString((uint8_t *) (uint8_t *) USBD_MANUFACTURER_STRING, USBD_StrDesc,
length);
return USBD_StrDesc;
}{ ... }
/* ... */
uint8_t *USBD_MSC_SerialStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length)
{
UNUSED(speed);
*length = USB_SIZ_STRING_SERIAL;
/* ... */
Get_SerialNum();
return (uint8_t *) USBD_StringSerial;
}{ ... }
/* ... */
uint8_t *USBD_MSC_ConfigStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length)
{
if (speed == USBD_SPEED_HIGH)
{
USBD_GetString((uint8_t *) (uint8_t *) USBD_CONFIGURATION_HS_STRING,
USBD_StrDesc, length);
}if (speed == USBD_SPEED_HIGH) { ... }
else
{
USBD_GetString((uint8_t *) (uint8_t *) USBD_CONFIGURATION_FS_STRING,
USBD_StrDesc, length);
}else { ... }
return USBD_StrDesc;
}{ ... }
/* ... */
uint8_t *USBD_MSC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed,
uint16_t * length)
{
if (speed == 0)
{
USBD_GetString((uint8_t *) (uint8_t *) USBD_INTERFACE_HS_STRING,
USBD_StrDesc, length);
}if (speed == 0) { ... }
else
{
USBD_GetString((uint8_t *) (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, (uint8_t *) & USBD_StringSerial[2], 8);
IntToUnicode(deviceserial1, (uint8_t *) & 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++) { ... }
}{ ... }