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
29
30
31
35
36
39
40
43
44
45
48
49
52
53
54
57
58
61
62
63
66
67
70
71
74
75
78
79
80
83
84
92
93
94
95
96
97
98
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
123
124
125
126
127
128
132
133
134
135
136
137
138
139
140
141
142
143
149
150
151
152
153
154
155
156
157
158
159
160
175
183
184
185
186
187
188
189
190
191
192
193
194
195
202
203
204
205
206
213
214
215
216
217
218
219
224
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
344
345
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
376
377
383
384
385
386
387
388
389
390
391
392
393
399
400
401
402
403
404
405
406
423
424
429
430
431
432
433
439
440
441
442
448
449
453
454
455
456
463
464
465
466
467
468
469
487
493
494
495
496
497
504
505
506
507
508
509
527
533
534
535
536
537
538
544
545
546
547
548
549
550
551
552
553
554
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
603
604
605
606
627
628
640
641
642
643
644
645
667
668
669
670
671
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
726
727
728
729
734
735
758
759
760
761
762
768
769
770
771
772
773
774
775
776
777
778
779
780
781
803
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
837
838
844
845
851
852
853
854
858
859
860
861
862
863
864
870
871
880
881
887
888
923
924
930
931
932
933
937
938
945
946
947
948
949
955
956
957
958
962
963
970
971
972
973
974
980
987
988
994
995
996
997
998
999
1000
1001
1002
1020
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1064
1065
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1104
1105
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1173
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1204
1205
1206
1209
1210
1211
1214
/* ... */
#include "usbd_core.h"
#ifdef USE_USBD_COMPOSITE
#include "usbd_composite_builder.h"
#endif
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
/* ... */
USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev,
USBD_DescriptorsTypeDef *pdesc, uint8_t id)
{
USBD_StatusTypeDef ret;
if (pdev == NULL)
{
#if (USBD_DEBUG_LEVEL > 1U)
USBD_ErrLog("Invalid Device handle");
#endif
return USBD_FAIL;
}if (pdev == NULL) { ... }
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
pdev->pClass[i] = NULL;
pdev->pUserData[i] = NULL;
pdev->tclasslist[i].Active = 0;
pdev->NumClasses = 0;
pdev->classId = 0;
}for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
pdev->pClass[0] = NULL;
pdev->pUserData[0] = NULL;/* ... */
#endif
pdev->pConfDesc = NULL;
if (pdesc != NULL)
{
pdev->pDesc = pdesc;
}if (pdesc != NULL) { ... }
pdev->dev_state = USBD_STATE_DEFAULT;
pdev->id = id;
ret = USBD_LL_Init(pdev);
return ret;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev)
{
USBD_StatusTypeDef ret;
(void)USBD_LL_Stop(pdev);
pdev->dev_state = USBD_STATE_DEFAULT;
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
pdev->classId = i;
pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config);
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
if (pdev->pClass[0] != NULL)
{
pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config);
}if (pdev->pClass[0] != NULL) { ... }
pdev->pUserData[0] = NULL;
/* ... */
#endif
pdev->pDesc = NULL;
pdev->pConfDesc = NULL;
ret = USBD_LL_DeInit(pdev);
return ret;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)
{
uint16_t len = 0U;
if (pclass == NULL)
{
#if (USBD_DEBUG_LEVEL > 1U)
USBD_ErrLog("Invalid Class handle");
#endif
return USBD_FAIL;
}if (pclass == NULL) { ... }
pdev->pClass[0] = pclass;
#ifdef USE_USB_HS
if (pdev->pClass[pdev->classId]->GetHSConfigDescriptor != NULL)
{
pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetHSConfigDescriptor(&len);
}if (pdev->pClass[pdev->classId]->GetHSConfigDescriptor != NULL) { ... }
/* ... */#else
if (pdev->pClass[pdev->classId]->GetFSConfigDescriptor != NULL)
{
pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetFSConfigDescriptor(&len);
}if (pdev->pClass[pdev->classId]->GetFSConfigDescriptor != NULL) { ... }
/* ... */#endif
pdev->NumClasses ++;
return USBD_OK;
}{ ... }
#ifdef USE_USBD_COMPOSITE
/* ... */
USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass,
USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr)
{
USBD_StatusTypeDef ret = USBD_OK;
uint16_t len = 0U;
if ((pdev->classId < USBD_MAX_SUPPORTED_CLASS) && (pdev->NumClasses < USBD_MAX_SUPPORTED_CLASS))
{
if ((uint32_t)pclass != 0U)
{
pdev->pClass[pdev->classId] = pclass;
ret = USBD_OK;
pdev->tclasslist[pdev->classId].EpAdd = EpAddr;
(void)USBD_CMPSIT_AddClass(pdev, pclass, classtype, 0);
pdev->classId ++;
pdev->NumClasses ++;
}if ((uint32_t)pclass != 0U) { ... }
else
{
#if (USBD_DEBUG_LEVEL > 1U)
USBD_ErrLog("Invalid Class handle");
#endif
ret = USBD_FAIL;
}else { ... }
}if ((pdev->classId < USBD_MAX_SUPPORTED_CLASS) && (pdev->NumClasses < USBD_MAX_SUPPORTED_CLASS)) { ... }
if (ret == USBD_OK)
{
#ifdef USE_USB_HS
pdev->pConfDesc = USBD_CMPSIT.GetHSConfigDescriptor(&len);
#else
pdev->pConfDesc = USBD_CMPSIT.GetFSConfigDescriptor(&len);
#endif
}if (ret == USBD_OK) { ... }
return ret;
}USBD_RegisterClassComposite (USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr) { ... }
/* ... */
USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev)
{
USBD_StatusTypeDef ret = USBD_FAIL;
uint8_t idx1;
uint8_t idx2;
for (idx1 = 0; idx1 < pdev->NumClasses; idx1++)
{
if (pdev->tclasslist[idx1].Active == 1U)
{
pdev->classId = idx1;
if (pdev->pClass[pdev->classId] != NULL)
{
if (pdev->pClass[pdev->classId]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U)
{
#if (USBD_DEBUG_LEVEL > 1U)
USBD_ErrLog("Class DeInit didn't succeed!, can't unregister selected class");
#endif
ret = USBD_FAIL;
}if (pdev->pClass[pdev->classId]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) { ... }
}if (pdev->pClass[pdev->classId] != NULL) { ... }
pdev->pClass[pdev->classId] = NULL;
pdev->tclasslist[pdev->classId].ClassType = CLASS_TYPE_NONE;
pdev->tclasslist[pdev->classId].ClassId = 0U;
pdev->tclasslist[pdev->classId].Active = 0U;
pdev->tclasslist[pdev->classId].NumEps = 0U;
pdev->tclasslist[pdev->classId].NumIf = 0U;
pdev->tclasslist[pdev->classId].CurrPcktSze = 0U;
for (idx2 = 0U; idx2 < USBD_MAX_CLASS_ENDPOINTS; idx2++)
{
pdev->tclasslist[pdev->classId].Eps[idx2].add = 0U;
pdev->tclasslist[pdev->classId].Eps[idx2].type = 0U;
pdev->tclasslist[pdev->classId].Eps[idx2].size = 0U;
pdev->tclasslist[pdev->classId].Eps[idx2].is_used = 0U;
}for (idx2 = 0U; idx2 < USBD_MAX_CLASS_ENDPOINTS; idx2++) { ... }
for (idx2 = 0U; idx2 < USBD_MAX_CLASS_INTERFACES; idx2++)
{
pdev->tclasslist[pdev->classId].Ifs[idx2] = 0U;
}for (idx2 = 0U; idx2 < USBD_MAX_CLASS_INTERFACES; idx2++) { ... }
}if (pdev->tclasslist[idx1].Active == 1U) { ... }
}for (idx1 = 0; idx1 < pdev->NumClasses; idx1++) { ... }
(void)USBD_CMPST_ClearConfDesc(pdev);
pdev->classId = 0U;
pdev->NumClasses = 0U;
return ret;
}USBD_UnRegisterClassComposite (USBD_HandleTypeDef *pdev) { ... }
/* ... */#endif
#if (USBD_USER_REGISTER_CALLBACK == 1U)
/* ... */
USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback)
{
pdev->DevStateCallback = pUserCallback;
return USBD_OK;
}USBD_RegisterDevStateCallback (USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback) { ... }
/* ... */#endif
/* ... */
USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev)
{
#ifdef USE_USBD_COMPOSITE
pdev->classId = 0U;
#endif
return USBD_LL_Start(pdev);
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev)
{
(void)USBD_LL_Stop(pdev);
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
pdev->classId = i;
(void)pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config);
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
pdev->classId = 0U;/* ... */
#else
if (pdev->pClass[0] != NULL)
{
(void)pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config);
}if (pdev->pClass[0] != NULL) { ... }
/* ... */#endif
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev)
{
#ifdef USBD_HS_TESTMODE_ENABLE
USBD_StatusTypeDef ret;
ret = USBD_LL_SetTestMode(pdev, pdev->dev_test_mode);
return ret;/* ... */
#else
UNUSED(pdev);
return USBD_OK;/* ... */
#endif
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
{
USBD_StatusTypeDef ret = USBD_OK;
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
pdev->classId = i;
if (pdev->pClass[i]->Init(pdev, cfgidx) != 0U)
{
ret = USBD_FAIL;
}if (pdev->pClass[i]->Init(pdev, cfgidx) != 0U) { ... }
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
if (pdev->pClass[0] != NULL)
{
ret = (USBD_StatusTypeDef)pdev->pClass[0]->Init(pdev, cfgidx);
}if (pdev->pClass[0] != NULL) { ... }
/* ... */#endif
return ret;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
{
USBD_StatusTypeDef ret = USBD_OK;
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
pdev->classId = i;
if (pdev->pClass[i]->DeInit(pdev, cfgidx) != 0U)
{
ret = USBD_FAIL;
}if (pdev->pClass[i]->DeInit(pdev, cfgidx) != 0U) { ... }
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
if (pdev->pClass[0]->DeInit(pdev, cfgidx) != 0U)
{
ret = USBD_FAIL;
}if (pdev->pClass[0]->DeInit(pdev, cfgidx) != 0U) { ... }
/* ... */#endif
return ret;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup)
{
USBD_StatusTypeDef ret;
USBD_ParseSetupRequest(&pdev->request, psetup);
pdev->ep0_state = USBD_EP0_SETUP;
pdev->ep0_data_len = pdev->request.wLength;
switch (pdev->request.bmRequest & 0x1FU)
{
case USB_REQ_RECIPIENT_DEVICE:
ret = USBD_StdDevReq(pdev, &pdev->request);
break;
case USB_REQ_RECIPIENT_DEVICE:
case USB_REQ_RECIPIENT_INTERFACE:
ret = USBD_StdItfReq(pdev, &pdev->request);
break;
case USB_REQ_RECIPIENT_INTERFACE:
case USB_REQ_RECIPIENT_ENDPOINT:
ret = USBD_StdEPReq(pdev, &pdev->request);
break;
case USB_REQ_RECIPIENT_ENDPOINT:
default:
ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U));
break;default
}switch (pdev->request.bmRequest & 0x1FU) { ... }
return ret;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev,
uint8_t epnum, uint8_t *pdata)
{
USBD_EndpointTypeDef *pep;
USBD_StatusTypeDef ret = USBD_OK;
uint8_t idx;
if (epnum == 0U)
{
pep = &pdev->ep_out[0];
if (pdev->ep0_state == USBD_EP0_DATA_OUT)
{
if (pep->rem_length > pep->maxpacket)
{
pep->rem_length -= pep->maxpacket;
(void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket));
}if (pep->rem_length > pep->maxpacket) { ... }
else
{
switch (pdev->request.bmRequest & 0x1FU)
{
case USB_REQ_RECIPIENT_DEVICE:
/* ... */
idx = 0U;
break;
case USB_REQ_RECIPIENT_DEVICE:
case USB_REQ_RECIPIENT_INTERFACE:
idx = USBD_CoreFindIF(pdev, LOBYTE(pdev->request.wIndex));
break;
case USB_REQ_RECIPIENT_INTERFACE:
case USB_REQ_RECIPIENT_ENDPOINT:
idx = USBD_CoreFindEP(pdev, LOBYTE(pdev->request.wIndex));
break;
case USB_REQ_RECIPIENT_ENDPOINT:
default:
idx = 0U;
break;default
}switch (pdev->request.bmRequest & 0x1FU) { ... }
if (idx < USBD_MAX_SUPPORTED_CLASS)
{
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (pdev->pClass[idx]->EP0_RxReady != NULL)
{
pdev->classId = idx;
pdev->pClass[idx]->EP0_RxReady(pdev);
}if (pdev->pClass[idx]->EP0_RxReady != NULL) { ... }
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
}if (idx < USBD_MAX_SUPPORTED_CLASS) { ... }
(void)USBD_CtlSendStatus(pdev);
}else { ... }
}if (pdev->ep0_state == USBD_EP0_DATA_OUT) { ... }
}if (epnum == 0U) { ... }
else
{
idx = USBD_CoreFindEP(pdev, (epnum & 0x7FU));
if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS))
{
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (pdev->pClass[idx]->DataOut != NULL)
{
pdev->classId = idx;
ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataOut(pdev, epnum);
}if (pdev->pClass[idx]->DataOut != NULL) { ... }
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
if (ret != USBD_OK)
{
return ret;
}if (ret != USBD_OK) { ... }
}if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) { ... }
}else { ... }
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev,
uint8_t epnum, uint8_t *pdata)
{
USBD_EndpointTypeDef *pep;
USBD_StatusTypeDef ret;
uint8_t idx;
if (epnum == 0U)
{
pep = &pdev->ep_in[0];
if (pdev->ep0_state == USBD_EP0_DATA_IN)
{
if (pep->rem_length > pep->maxpacket)
{
pep->rem_length -= pep->maxpacket;
(void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length);
(void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U);
}if (pep->rem_length > pep->maxpacket) { ... }
else
{
if ((pep->maxpacket == pep->rem_length) &&
(pep->total_length >= pep->maxpacket) &&
(pep->total_length < pdev->ep0_data_len))
{
(void)USBD_CtlContinueSendData(pdev, NULL, 0U);
pdev->ep0_data_len = 0U;
(void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U);
}if ((pep->maxpacket == pep->rem_length) && (pep->total_length >= pep->maxpacket) && (pep->total_length < pdev->ep0_data_len)) { ... }
else
{
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (pdev->pClass[0]->EP0_TxSent != NULL)
{
pdev->classId = 0U;
pdev->pClass[0]->EP0_TxSent(pdev);
}if (pdev->pClass[0]->EP0_TxSent != NULL) { ... }
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
(void)USBD_LL_StallEP(pdev, 0x80U);
(void)USBD_CtlReceiveStatus(pdev);
}else { ... }
}else { ... }
}if (pdev->ep0_state == USBD_EP0_DATA_IN) { ... }
if (pdev->dev_test_mode != 0U)
{
(void)USBD_RunTestMode(pdev);
pdev->dev_test_mode = 0U;
}if (pdev->dev_test_mode != 0U) { ... }
}if (epnum == 0U) { ... }
else
{
idx = USBD_CoreFindEP(pdev, ((uint8_t)epnum | 0x80U));
if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS))
{
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (pdev->pClass[idx]->DataIn != NULL)
{
pdev->classId = idx;
ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataIn(pdev, epnum);
if (ret != USBD_OK)
{
return ret;
}if (ret != USBD_OK) { ... }
}if (pdev->pClass[idx]->DataIn != NULL) { ... }
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
}if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) { ... }
}else { ... }
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev)
{
USBD_StatusTypeDef ret = USBD_OK;
pdev->dev_state = USBD_STATE_DEFAULT;
pdev->ep0_state = USBD_EP0_IDLE;
pdev->dev_config = 0U;
pdev->dev_remote_wakeup = 0U;
pdev->dev_test_mode = 0U;
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
pdev->classId = i;
if (pdev->pClass[i]->DeInit != NULL)
{
if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK)
{
ret = USBD_FAIL;
}if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK) { ... }
}if (pdev->pClass[i]->DeInit != NULL) { ... }
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
if (pdev->pClass[0] != NULL)
{
if (pdev->pClass[0]->DeInit != NULL)
{
if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK)
{
ret = USBD_FAIL;
}if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK) { ... }
}if (pdev->pClass[0]->DeInit != NULL) { ... }
}if (pdev->pClass[0] != NULL) { ... }
/* ... */#endif
(void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE);
pdev->ep_out[0x00U & 0xFU].is_used = 1U;
pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE;
(void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE);
pdev->ep_in[0x80U & 0xFU].is_used = 1U;
pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE;
return ret;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev,
USBD_SpeedTypeDef speed)
{
pdev->dev_speed = speed;
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev)
{
if (pdev->dev_state != USBD_STATE_SUSPENDED)
{
pdev->dev_old_state = pdev->dev_state;
}if (pdev->dev_state != USBD_STATE_SUSPENDED) { ... }
pdev->dev_state = USBD_STATE_SUSPENDED;
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev)
{
if (pdev->dev_state == USBD_STATE_SUSPENDED)
{
pdev->dev_state = pdev->dev_old_state;
}if (pdev->dev_state == USBD_STATE_SUSPENDED) { ... }
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev)
{
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
if (pdev->pClass[i]->SOF != NULL)
{
pdev->classId = i;
(void)pdev->pClass[i]->SOF(pdev);
}if (pdev->pClass[i]->SOF != NULL) { ... }
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
if (pdev->pClass[0] != NULL)
{
if (pdev->pClass[0]->SOF != NULL)
{
(void)pdev->pClass[0]->SOF(pdev);
}if (pdev->pClass[0]->SOF != NULL) { ... }
}if (pdev->pClass[0] != NULL) { ... }
/* ... */#endif
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev,
uint8_t epnum)
{
if (pdev->pClass[pdev->classId] == NULL)
{
return USBD_FAIL;
}if (pdev->pClass[pdev->classId] == NULL) { ... }
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (pdev->pClass[pdev->classId]->IsoINIncomplete != NULL)
{
(void)pdev->pClass[pdev->classId]->IsoINIncomplete(pdev, epnum);
}if (pdev->pClass[pdev->classId]->IsoINIncomplete != NULL) { ... }
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev,
uint8_t epnum)
{
if (pdev->pClass[pdev->classId] == NULL)
{
return USBD_FAIL;
}if (pdev->pClass[pdev->classId] == NULL) { ... }
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (pdev->pClass[pdev->classId]->IsoOUTIncomplete != NULL)
{
(void)pdev->pClass[pdev->classId]->IsoOUTIncomplete(pdev, epnum);
}if (pdev->pClass[pdev->classId]->IsoOUTIncomplete != NULL) { ... }
}if (pdev->dev_state == USBD_STATE_CONFIGURED) { ... }
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev)
{
UNUSED(pdev);
return USBD_OK;
}{ ... }
/* ... */
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev)
{
USBD_StatusTypeDef ret = USBD_OK;
pdev->dev_state = USBD_STATE_DEFAULT;
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
if (pdev->pClass[i] != NULL)
{
pdev->classId = i;
if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U)
{
ret = USBD_FAIL;
}if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) { ... }
}if (pdev->pClass[i] != NULL) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
/* ... */#else
if (pdev->pClass[0] != NULL)
{
if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U)
{
ret = USBD_FAIL;
}if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) { ... }
}if (pdev->pClass[0] != NULL) { ... }
/* ... */#endif
return ret;
}{ ... }
/* ... */
uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index)
{
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
for (uint32_t j = 0U; j < pdev->tclasslist[i].NumIf; j++)
{
if (pdev->tclasslist[i].Ifs[j] == index)
{
if (pdev->pClass[i]->Setup != NULL)
{
return (uint8_t)i;
}if (pdev->pClass[i]->Setup != NULL) { ... }
}if (pdev->tclasslist[i].Ifs[j] == index) { ... }
}for (uint32_t j = 0U; j < pdev->tclasslist[i].NumIf; j++) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
return 0xFFU;/* ... */
#else
UNUSED(pdev);
UNUSED(index);
return 0x00U;/* ... */
#endif
}{ ... }
/* ... */
uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index)
{
#ifdef USE_USBD_COMPOSITE
for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++)
{
if ((pdev->tclasslist[i].Active) == 1U)
{
for (uint32_t j = 0U; j < pdev->tclasslist[i].NumEps; j++)
{
if (pdev->tclasslist[i].Eps[j].add == index)
{
if (pdev->pClass[i]->Setup != NULL)
{
return (uint8_t)i;
}if (pdev->pClass[i]->Setup != NULL) { ... }
}if (pdev->tclasslist[i].Eps[j].add == index) { ... }
}for (uint32_t j = 0U; j < pdev->tclasslist[i].NumEps; j++) { ... }
}if ((pdev->tclasslist[i].Active) == 1U) { ... }
}for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) { ... }
return 0xFFU;/* ... */
#else
UNUSED(pdev);
UNUSED(index);
return 0x00U;/* ... */
#endif
}{ ... }
#ifdef USE_USBD_COMPOSITE
/* ... */
uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId)
{
uint8_t idx;
for (idx = 0; idx < pdev->tclasslist[ClassId].NumEps; idx++)
{
if (((pdev->tclasslist[ClassId].Eps[idx].add & USBD_EP_IN) == ep_dir) && \
(pdev->tclasslist[ClassId].Eps[idx].type == ep_type) && \
(pdev->tclasslist[ClassId].Eps[idx].is_used != 0U))
{
return (pdev->tclasslist[ClassId].Eps[idx].add);
}if (((pdev->tclasslist[ClassId].Eps[idx].add & USBD_EP_IN) == ep_dir) && \ (pdev->tclasslist[ClassId].Eps[idx].type == ep_type) && \ (pdev->tclasslist[ClassId].Eps[idx].is_used != 0U)) { ... }
}for (idx = 0; idx < pdev->tclasslist[ClassId].NumEps; idx++) { ... }
return 0xFFU;
}USBD_CoreGetEPAdd (USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId) { ... }
/* ... */#endif
/* ... */
void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr)
{
USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc;
USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc;
USBD_EpDescTypeDef *pEpDesc = NULL;
uint16_t ptr;
if (desc->wTotalLength > desc->bLength)
{
ptr = desc->bLength;
while (ptr < desc->wTotalLength)
{
pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr);
if (pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT)
{
pEpDesc = (USBD_EpDescTypeDef *)(void *)pdesc;
if (pEpDesc->bEndpointAddress == EpAddr)
{
break;
}if (pEpDesc->bEndpointAddress == EpAddr) { ... }
else
{
pEpDesc = NULL;
}else { ... }
}if (pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT) { ... }
}while (ptr < desc->wTotalLength) { ... }
}if (desc->wTotalLength > desc->bLength) { ... }
return (void *)pEpDesc;
}{ ... }
/* ... */
USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr)
{
USBD_DescHeaderTypeDef *pnext = (USBD_DescHeaderTypeDef *)(void *)pbuf;
*ptr += pnext->bLength;
pnext = (USBD_DescHeaderTypeDef *)(void *)(pbuf + pnext->bLength);
return (pnext);
}{ ... }
/* ... */
/* ... */
/* ... */
Includes