Skip to content

Commit 42decf2

Browse files
authored
Merge pull request #1835 from MasterQ32/otg_bringup
Implements deinit functions for host/device mode switch
2 parents d33fe38 + be25a3f commit 42decf2

33 files changed

+312
-102
lines changed

src/class/audio/audio_device.c

+4
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,10 @@ void audiod_init(void)
13891389
}
13901390
}
13911391

1392+
bool audiod_deinit(void) {
1393+
return false; // TODO not implemented yet
1394+
}
1395+
13921396
void audiod_reset(uint8_t rhport)
13931397
{
13941398
(void) rhport;

src/class/audio/audio_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,7 @@ static inline bool tud_audio_fb_set(uint32_t feedback)
685685
// Internal Class Driver API
686686
//--------------------------------------------------------------------+
687687
void audiod_init (void);
688+
bool audiod_deinit (void);
688689
void audiod_reset (uint8_t rhport);
689690
uint16_t audiod_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
690691
bool audiod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/bth/bth_device.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,14 @@ bool tud_bt_acl_data_send(void *event, uint16_t event_len)
9191
//--------------------------------------------------------------------+
9292
// USBD Driver API
9393
//--------------------------------------------------------------------+
94-
void btd_init(void)
95-
{
94+
void btd_init(void) {
9695
tu_memclr(&_btd_itf, sizeof(_btd_itf));
9796
}
9897

98+
bool btd_deinit(void) {
99+
return true;
100+
}
101+
99102
void btd_reset(uint8_t rhport)
100103
{
101104
(void)rhport;

src/class/bth/bth_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ bool tud_bt_acl_data_send(void *acl_data, uint16_t data_len);
104104
// Internal Class Driver API
105105
//--------------------------------------------------------------------+
106106
void btd_init (void);
107+
bool btd_deinit (void);
107108
void btd_reset (uint8_t rhport);
108109
uint16_t btd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
109110
bool btd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const *request);

src/class/cdc/cdc_device.c

+30-2
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,39 @@ void cdcd_init(void)
253253
// In this way, the most current data is prioritized.
254254
tu_fifo_config(&p_cdc->tx_ff, p_cdc->tx_ff_buf, TU_ARRAY_SIZE(p_cdc->tx_ff_buf), 1, true);
255255

256-
tu_fifo_config_mutex(&p_cdc->rx_ff, NULL, osal_mutex_create(&p_cdc->rx_ff_mutex));
257-
tu_fifo_config_mutex(&p_cdc->tx_ff, osal_mutex_create(&p_cdc->tx_ff_mutex), NULL);
256+
#if OSAL_MUTEX_REQUIRED
257+
osal_mutex_t mutex_rd = osal_mutex_create(&p_cdc->rx_ff_mutex);
258+
osal_mutex_t mutex_wr = osal_mutex_create(&p_cdc->tx_ff_mutex);
259+
TU_ASSERT(mutex_rd != NULL && mutex_wr != NULL, );
260+
261+
tu_fifo_config_mutex(&p_cdc->rx_ff, NULL, mutex_rd);
262+
tu_fifo_config_mutex(&p_cdc->tx_ff, mutex_wr, NULL);
263+
#endif
258264
}
259265
}
260266

267+
bool cdcd_deinit(void) {
268+
#if OSAL_MUTEX_REQUIRED
269+
for(uint8_t i=0; i<CFG_TUD_CDC; i++) {
270+
cdcd_interface_t* p_cdc = &_cdcd_itf[i];
271+
osal_mutex_t mutex_rd = p_cdc->rx_ff.mutex_rd;
272+
osal_mutex_t mutex_wr = p_cdc->tx_ff.mutex_wr;
273+
274+
if (mutex_rd) {
275+
osal_mutex_delete(mutex_rd);
276+
tu_fifo_config_mutex(&p_cdc->rx_ff, NULL, NULL);
277+
}
278+
279+
if (mutex_wr) {
280+
osal_mutex_delete(mutex_wr);
281+
tu_fifo_config_mutex(&p_cdc->tx_ff, NULL, NULL);
282+
}
283+
}
284+
#endif
285+
286+
return true;
287+
}
288+
261289
void cdcd_reset(uint8_t rhport)
262290
{
263291
(void) rhport;

src/class/cdc/cdc_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ static inline bool tud_cdc_write_clear(void)
247247
// INTERNAL USBD-CLASS DRIVER API
248248
//--------------------------------------------------------------------+
249249
void cdcd_init (void);
250+
bool cdcd_deinit (void);
250251
void cdcd_reset (uint8_t rhport);
251252
uint16_t cdcd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
252253
bool cdcd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/dfu/dfu_device.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,14 @@ void dfu_moded_reset(uint8_t rhport)
160160
reset_state();
161161
}
162162

163-
void dfu_moded_init(void)
164-
{
163+
void dfu_moded_init(void) {
165164
dfu_moded_reset(0);
166165
}
167166

167+
bool dfu_moded_deinit(void) {
168+
return true;
169+
}
170+
168171
uint16_t dfu_moded_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len)
169172
{
170173
(void) rhport;

src/class/dfu/dfu_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ TU_ATTR_WEAK void tud_dfu_abort_cb(uint8_t alt);
8686
// Internal Class Driver API
8787
//--------------------------------------------------------------------+
8888
void dfu_moded_init(void);
89+
bool dfu_moded_deinit(void);
8990
void dfu_moded_reset(uint8_t rhport);
9091
uint16_t dfu_moded_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
9192
bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/dfu/dfu_rt_device.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,11 @@
5151
//--------------------------------------------------------------------+
5252
// USBD Driver API
5353
//--------------------------------------------------------------------+
54-
void dfu_rtd_init(void)
55-
{
54+
void dfu_rtd_init(void) {
55+
}
56+
57+
bool dfu_rtd_deinit(void) {
58+
return true;
5659
}
5760

5861
void dfu_rtd_reset(uint8_t rhport)

src/class/dfu/dfu_rt_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void tud_dfu_runtime_reboot_to_dfu_cb(void);
4343
// Internal Class Driver API
4444
//--------------------------------------------------------------------+
4545
void dfu_rtd_init(void);
46+
bool dfu_rtd_deinit(void);
4647
void dfu_rtd_reset(uint8_t rhport);
4748
uint16_t dfu_rtd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
4849
bool dfu_rtd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/hid/hid_device.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,14 @@ bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id,
179179
//--------------------------------------------------------------------+
180180
// USBD-CLASS API
181181
//--------------------------------------------------------------------+
182-
void hidd_init(void)
183-
{
182+
void hidd_init(void) {
184183
hidd_reset(0);
185184
}
186185

186+
bool hidd_deinit(void) {
187+
return true;
188+
}
189+
187190
void hidd_reset(uint8_t rhport)
188191
{
189192
(void) rhport;

src/class/hid/hid_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ static inline bool tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y
465465
// Internal Class Driver API
466466
//--------------------------------------------------------------------+
467467
void hidd_init (void);
468+
bool hidd_deinit (void);
468469
void hidd_reset (uint8_t rhport);
469470
uint16_t hidd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
470471
bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/midi/midi_device.c

+30-6
Original file line numberDiff line numberDiff line change
@@ -373,25 +373,49 @@ bool tud_midi_n_packet_write (uint8_t itf, uint8_t const packet[4])
373373
//--------------------------------------------------------------------+
374374
// USBD Driver API
375375
//--------------------------------------------------------------------+
376-
void midid_init(void)
377-
{
376+
void midid_init(void) {
378377
tu_memclr(_midid_itf, sizeof(_midid_itf));
379378

380-
for(uint8_t i=0; i<CFG_TUD_MIDI; i++)
381-
{
379+
for (uint8_t i = 0; i < CFG_TUD_MIDI; i++) {
382380
midid_interface_t* midi = &_midid_itf[i];
383381

384382
// config fifo
385383
tu_fifo_config(&midi->rx_ff, midi->rx_ff_buf, CFG_TUD_MIDI_RX_BUFSIZE, 1, false); // true, true
386384
tu_fifo_config(&midi->tx_ff, midi->tx_ff_buf, CFG_TUD_MIDI_TX_BUFSIZE, 1, false); // OBVS.
387385

388386
#if CFG_FIFO_MUTEX
389-
tu_fifo_config_mutex(&midi->rx_ff, NULL, osal_mutex_create(&midi->rx_ff_mutex));
390-
tu_fifo_config_mutex(&midi->tx_ff, osal_mutex_create(&midi->tx_ff_mutex), NULL);
387+
osal_mutex_t mutex_rd = osal_mutex_create(&midi->rx_ff_mutex);
388+
osal_mutex_t mutex_wr = osal_mutex_create(&midi->tx_ff_mutex);
389+
TU_ASSERT(mutex_wr != NULL && mutex_wr != NULL, );
390+
391+
tu_fifo_config_mutex(&midi->rx_ff, NULL, mutex_rd);
392+
tu_fifo_config_mutex(&midi->tx_ff, mutex_wr, NULL);
391393
#endif
392394
}
393395
}
394396

397+
bool midid_deinit(void) {
398+
#if CFG_FIFO_MUTEX
399+
for(uint8_t i=0; i<CFG_TUD_MIDI; i++) {
400+
midid_interface_t* midi = &_midid_itf[i];
401+
osal_mutex_t mutex_rd = midi->rx_ff.mutex_rd;
402+
osal_mutex_t mutex_wr = midi->tx_ff.mutex_wr;
403+
404+
if (mutex_rd) {
405+
osal_mutex_delete(mutex_rd);
406+
tu_fifo_config_mutex(&midi->rx_ff, NULL, NULL);
407+
}
408+
409+
if (mutex_wr) {
410+
osal_mutex_delete(mutex_wr);
411+
tu_fifo_config_mutex(&midi->tx_ff, NULL, NULL);
412+
}
413+
}
414+
#endif
415+
416+
return true;
417+
}
418+
395419
void midid_reset(uint8_t rhport)
396420
{
397421
(void) rhport;

src/class/midi/midi_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ static inline bool tud_midi_packet_write (uint8_t const packet[4])
158158
// Internal Class Driver API
159159
//--------------------------------------------------------------------+
160160
void midid_init (void);
161+
bool midid_deinit (void);
161162
void midid_reset (uint8_t rhport);
162163
uint16_t midid_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
163164
bool midid_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/msc/msc_device.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,15 @@ static inline void set_sense_medium_not_present(uint8_t lun)
251251
//--------------------------------------------------------------------+
252252
// USBD Driver API
253253
//--------------------------------------------------------------------+
254-
void mscd_init(void)
255-
{
254+
void mscd_init(void) {
256255
tu_memclr(&_mscd_itf, sizeof(mscd_interface_t));
257256
}
258257

258+
bool mscd_deinit(void) {
259+
// nothing to do
260+
return true;
261+
}
262+
259263
void mscd_reset(uint8_t rhport)
260264
{
261265
(void) rhport;

src/class/msc/msc_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ TU_ATTR_WEAK bool tud_msc_is_writable_cb(uint8_t lun);
150150
// Internal Class Driver API
151151
//--------------------------------------------------------------------+
152152
void mscd_init (void);
153+
bool mscd_deinit (void);
153154
void mscd_reset (uint8_t rhport);
154155
uint16_t mscd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
155156
bool mscd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * p_request);

src/class/net/ecm_rndis_device.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,14 @@ void netd_report(uint8_t *buf, uint16_t len)
132132
//--------------------------------------------------------------------+
133133
// USBD Driver API
134134
//--------------------------------------------------------------------+
135-
void netd_init(void)
136-
{
135+
void netd_init(void) {
137136
tu_memclr(&_netd_itf, sizeof(_netd_itf));
138137
}
139138

139+
bool netd_deinit(void) {
140+
return true;
141+
}
142+
140143
void netd_reset(uint8_t rhport)
141144
{
142145
(void) rhport;

src/class/net/ncm_device.c

+4
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ void netd_init(void)
260260
ncm_prepare_for_tx();
261261
}
262262

263+
bool netd_deinit(void) {
264+
return true;
265+
}
266+
263267
void netd_reset(uint8_t rhport)
264268
{
265269
(void) rhport;

src/class/net/net_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ void tud_network_link_state_cb(bool state);
105105
// INTERNAL USBD-CLASS DRIVER API
106106
//--------------------------------------------------------------------+
107107
void netd_init (void);
108+
bool netd_deinit (void);
108109
void netd_reset (uint8_t rhport);
109110
uint16_t netd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
110111
bool netd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

src/class/usbtmc/usbtmc_device.c

+7
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,13 @@ void usbtmcd_init_cb(void)
260260
usbtmcLock = osal_mutex_create(&usbtmcLockBuffer);
261261
}
262262

263+
bool usbtmcd_deinit(void) {
264+
#if OSAL_MUTEX_REQUIRED
265+
osal_mutex_delete(usbtmcLock);
266+
#endif
267+
return true;
268+
}
269+
263270
uint16_t usbtmcd_open_cb(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len)
264271
{
265272
(void)rhport;

src/class/usbtmc/usbtmc_device.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,12 @@ bool tud_usbtmc_start_bus_read(void);
9898

9999
/* "callbacks" from USB device core */
100100

101+
void usbtmcd_init_cb(void);
102+
bool usbtmcd_deinit(void);
101103
uint16_t usbtmcd_open_cb(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
102104
void usbtmcd_reset_cb(uint8_t rhport);
103105
bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
104106
bool usbtmcd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
105-
void usbtmcd_init_cb(void);
106107

107108
/************************************************************
108109
* USBTMC Descriptor Templates

src/class/vendor/vendor_device.c

+32-6
Original file line numberDiff line numberDiff line change
@@ -169,21 +169,47 @@ uint32_t tud_vendor_n_write_available (uint8_t itf)
169169
//--------------------------------------------------------------------+
170170
// USBD Driver API
171171
//--------------------------------------------------------------------+
172-
void vendord_init(void)
173-
{
172+
void vendord_init(void) {
174173
tu_memclr(_vendord_itf, sizeof(_vendord_itf));
175174

176-
for(uint8_t i=0; i<CFG_TUD_VENDOR; i++)
177-
{
175+
for(uint8_t i=0; i<CFG_TUD_VENDOR; i++) {
178176
vendord_interface_t* p_itf = &_vendord_itf[i];
179177

180178
// config fifo
181179
tu_fifo_config(&p_itf->rx_ff, p_itf->rx_ff_buf, CFG_TUD_VENDOR_RX_BUFSIZE, 1, false);
182180
tu_fifo_config(&p_itf->tx_ff, p_itf->tx_ff_buf, CFG_TUD_VENDOR_TX_BUFSIZE, 1, false);
183181

184-
tu_fifo_config_mutex(&p_itf->rx_ff, NULL, osal_mutex_create(&p_itf->rx_ff_mutex));
185-
tu_fifo_config_mutex(&p_itf->tx_ff, osal_mutex_create(&p_itf->tx_ff_mutex), NULL);
182+
#if OSAL_MUTEX_REQUIRED
183+
osal_mutex_t mutex_rd = osal_mutex_create(&p_itf->rx_ff_mutex);
184+
osal_mutex_t mutex_wr = osal_mutex_create(&p_itf->tx_ff_mutex);
185+
TU_ASSERT(mutex_rd && mutex_wr,);
186+
187+
tu_fifo_config_mutex(&p_itf->rx_ff, NULL, mutex_rd);
188+
tu_fifo_config_mutex(&p_itf->tx_ff, mutex_wr, NULL);
189+
#endif
190+
}
191+
}
192+
193+
bool vendord_deinit(void) {
194+
#if OSAL_MUTEX_REQUIRED
195+
for(uint8_t i=0; i<CFG_TUD_VENDOR; i++) {
196+
vendord_interface_t* p_itf = &_vendord_itf[i];
197+
osal_mutex_t mutex_rd = p_itf->rx_ff.mutex_rd;
198+
osal_mutex_t mutex_wr = p_itf->tx_ff.mutex_wr;
199+
200+
if (mutex_rd) {
201+
osal_mutex_delete(mutex_rd);
202+
tu_fifo_config_mutex(&p_itf->rx_ff, NULL, NULL);
203+
}
204+
205+
if (mutex_wr) {
206+
osal_mutex_delete(mutex_wr);
207+
tu_fifo_config_mutex(&p_itf->tx_ff, NULL, NULL);
208+
}
186209
}
210+
#endif
211+
212+
return true;
187213
}
188214

189215
void vendord_reset(uint8_t rhport)

src/class/vendor/vendor_device.h

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ static inline uint32_t tud_vendor_write_available (void)
139139
// Internal Class Driver API
140140
//--------------------------------------------------------------------+
141141
void vendord_init(void);
142+
bool vendord_deinit(void);
142143
void vendord_reset(uint8_t rhport);
143144
uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
144145
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);

src/class/video/video_device.c

+4
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,10 @@ void videod_init(void) {
12361236
}
12371237
}
12381238

1239+
bool videod_deinit(void) {
1240+
return true;
1241+
}
1242+
12391243
void videod_reset(uint8_t rhport) {
12401244
(void) rhport;
12411245
for (uint_fast8_t i = 0; i < CFG_TUD_VIDEO; ++i) {

0 commit comments

Comments
 (0)