29#if CFG_TUD_ENABLED && ( CFG_TUSB_MCU == OPT_MCU_MM32F327X )
31#include "reg_usb_otg_fs.h"
32#include "mm32_device.h"
105 uint8_t setup_packet[8];
119 const unsigned out_odd =
_dcd.endpoint[0][0].odd;
120 const unsigned in_odd =
_dcd.endpoint[0][1].odd;
121 if (
_dcd.bdt[0][0][out_odd].own) {
122 TU_LOG1(
"DCD fail to prepare the next SETUP %d %d\r\n", out_odd, in_odd);
125 _dcd.bdt[0][0][out_odd].data = 0;
126 _dcd.bdt[0][0][out_odd ^ 1].data = 1;
127 _dcd.bdt[0][1][in_odd].data = 1;
128 _dcd.bdt[0][1][in_odd ^ 1].data = 0;
130 _dcd.setup_packet,
sizeof(
_dcd.setup_packet));
135 if (USB_OTG_FS->EP_CTL[0] & USB_ENDPT_EPSTALL_MASK) {
138 USB_OTG_FS->EP_CTL[0] &= ~USB_ENDPT_EPSTALL_MASK;
144 const unsigned s = USB_OTG_FS->STAT;
145 USB_OTG_FS->INT_STAT = USB_ISTAT_TOKDNE_MASK;
148 unsigned odd = (s & USB_STAT_ODD_MASK) ? 1 : 0;
151 const unsigned pid = bd->
tok_pid;
161 USB_OTG_FS->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;
165 TU_LOG1(
"TKDNE %x\r\n", s);
168 const unsigned bc = bd->
bc;
169 const unsigned remaining = ep->remaining - bc;
170 if (remaining && bc == ep->max_packet_size) {
172 ep->remaining = remaining;
173 const int next_remaining = remaining - ep->max_packet_size;
174 if (next_remaining > 0) {
176 bd->
addr += ep->max_packet_size * 2;
177 bd->
bc = next_remaining > ep->max_packet_size ? ep->max_packet_size: next_remaining;
183 const unsigned length = ep->length;
185 ((s & USB_STAT_TX_MASK) << 4) | (s >> USB_STAT_ENDP_SHIFT),
187 if (0 == (s & USB_STAT_ENDP_MASK) && 0 == length) {
193 USB_OTG_FS->ADDR =
_dcd.addr;
202 USB_OTG_FS->CTL |= USB_CTL_ODDRST_MASK;
203 USB_OTG_FS->ADDR = 0;
204 USB_OTG_FS->INT_ENB = (USB_OTG_FS->INT_ENB & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;
206 USB_OTG_FS->EP_CTL[0] = USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;
207 for (
unsigned i = 1; i < 16; ++i) {
208 USB_OTG_FS->EP_CTL[i] = 0;
211 for (
unsigned i = 0; i <
sizeof(
_dcd.bdt)/
sizeof(*bd); ++i, ++bd) {
220 _dcd.endpoint[0][0] = ep0;
221 _dcd.endpoint[0][1] = ep0;
222 tu_memclr(
_dcd.endpoint[1],
sizeof(
_dcd.endpoint) -
sizeof(
_dcd.endpoint[0]));
225 USB_OTG_FS->CTL &= ~USB_CTL_ODDRST_MASK;
232 const unsigned inten = USB_OTG_FS->INT_ENB;
233 USB_OTG_FS->INT_ENB = (inten & ~USB_INTEN_SLEEPEN_MASK) | USB_INTEN_RESUMEEN_MASK;
240 const unsigned inten = USB_OTG_FS->INT_ENB;
241 USB_OTG_FS->INT_ENB = (inten & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;
253 USB_OTG_FS->BDT_PAGE_01 = (uint8_t)((uintptr_t)
_dcd.bdt >> 8);
254 USB_OTG_FS->BDT_PAGE_02 = (uint8_t)((uintptr_t)
_dcd.bdt >> 16);
255 USB_OTG_FS->BDT_PAGE_03 = (uint8_t)((uintptr_t)
_dcd.bdt >> 24);
258 NVIC_ClearPendingIRQ(USB_FS_IRQn);
261#define USB_DEVICE_INTERRUPT_PRIORITY (3U)
265 irqNumber = USB_FS_IRQn;
267 USB_OTG_FS->INT_ENB = USB_INTEN_USBRSTEN_MASK | USB_INTEN_TOKDNEEN_MASK |
268 USB_INTEN_SLEEPEN_MASK | USB_INTEN_ERROREN_MASK | USB_INTEN_STALLEN_MASK;
269 NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY);
270 NVIC_EnableIRQ(USB_FS_IRQn);
276 NVIC_DisableIRQ(USB_FS_IRQn);
277 USB_OTG_FS->INT_ENB = 0;
289#pragma GCC diagnostic push
290#pragma GCC diagnostic ignored "-Wredundant-decls"
296#pragma GCC diagnostic pop
303 USB_OTG_FS->CTL |= USB_CTL_RESUME_MASK;
304 while (cnt--) __NOP();
305 USB_OTG_FS->CTL &= ~USB_CTL_RESUME_MASK;
311 USB_OTG_FS->CTL |= USB_CTL_USBENSOFEN_MASK;
336 const unsigned epn = ep_addr & 0xFu;
340 const unsigned odd = ep->
odd;
347 unsigned val = USB_ENDPT_EPCTLDIS_MASK;
349 val |= dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;
350 USB_OTG_FS->EP_CTL[epn] |= val;
356 bd[odd ^ 1].
data = 1;
372 const unsigned epn = ep_addr & 0xFu;
376 const unsigned msk = dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;
377 USB_OTG_FS->EP_CTL[epn] &= ~msk;
387 NVIC_DisableIRQ(USB_FS_IRQn);
388 const unsigned epn = ep_addr & 0xFu;
413 NVIC_EnableIRQ(USB_FS_IRQn);
420 const unsigned epn = ep_addr & 0xFu;
422 USB_OTG_FS->EP_CTL[epn] |= USB_ENDPT_EPSTALL_MASK;
434 const unsigned epn = ep_addr & 0xFu;
436 const unsigned odd =
_dcd.endpoint[epn][dir].odd;
440 bd[odd ^ 1].
data = 1;
454 uint32_t is = USB_OTG_FS->INT_STAT;
455 uint32_t msk = USB_OTG_FS->INT_ENB;
456 USB_OTG_FS->INT_STAT = is & ~msk;
458 if (is & USB_ISTAT_ERROR_MASK) {
460 uint32_t es = USB_OTG_FS->ERR_STAT;
461 USB_OTG_FS->ERR_STAT = es;
462 USB_OTG_FS->INT_STAT = is;
466 if (is & USB_ISTAT_USBRST_MASK) {
467 USB_OTG_FS->INT_STAT = is;
471 if (is & USB_ISTAT_SLEEP_MASK) {
472 USB_OTG_FS->INT_STAT = USB_ISTAT_SLEEP_MASK;
476 if (is & USB_ISTAT_RESUME_MASK) {
477 USB_OTG_FS->INT_STAT = USB_ISTAT_RESUME_MASK;
481 if (is & USB_ISTAT_SOFTOK_MASK) {
482 USB_OTG_FS->INT_STAT = USB_ISTAT_SOFTOK_MASK;
486 if (is & USB_ISTAT_STALL_MASK) {
487 USB_OTG_FS->INT_STAT = USB_ISTAT_STALL_MASK;
491 if (is & USB_ISTAT_TOKDNE_MASK) {
static TU_ATTR_ALWAYS_INLINE void dcd_event_bus_signal(uint8_t rhport, dcd_eventid_t eid, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_setup_received(uint8_t rhport, uint8_t const *setup, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_bus_reset(uint8_t rhport, tusb_speed_t speed, bool in_isr)
static void process_bus_reset(uint8_t rhport)
struct TU_ATTR_PACKED endpoint_state_t
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(uint8_t rhport)
static void process_tokdne(uint8_t rhport)
void dcd_edpt_close_all(uint8_t rhport)
void dcd_int_disable(uint8_t rhport)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *ep_desc)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
TU_VERIFY_STATIC(sizeof(buffer_descriptor_t)==8, "size is not correct")
static void process_stall(uint8_t rhport)
void dcd_connect(uint8_t rhport)
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
CFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(512)
void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
struct TU_ATTR_PACKED buffer_descriptor_t
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
static void process_bus_active(uint8_t rhport)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
static void process_bus_inactive(uint8_t rhport)
void dcd_sof_enable(uint8_t rhport, bool en)
xfer_td_t xfer[EP_CBI_COUNT+1][2]
static void prepare_next_setup_packet(uint8_t rhport)
AUDIO Channel Cluster Descriptor (4.1)
uint8_t data[CFG_TUD_NCM_IN_NTB_MAX_SIZE]
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
static TU_ATTR_ALWAYS_INLINE uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const *desc_ep)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)