29#if CFG_TUD_ENABLED && defined(TUP_USBIP_CHIPIDEA_FS)
31#ifdef TUP_USBIP_CHIPIDEA_FS_KINETIS
32 #include "fsl_device_registers.h"
35 #error "MCU is not supported"
109 uint8_t setup_packet[8];
123 const unsigned out_odd =
_dcd.endpoint[0][0].odd;
124 const unsigned in_odd =
_dcd.endpoint[0][1].odd;
125 TU_ASSERT(0 ==
_dcd.bdt[0][0][out_odd].own, );
127 _dcd.bdt[0][0][out_odd].data = 0;
128 _dcd.bdt[0][0][out_odd ^ 1].data = 1;
129 _dcd.bdt[0][1][in_odd].data = 1;
130 _dcd.bdt[0][1][in_odd ^ 1].data = 0;
132 _dcd.setup_packet,
sizeof(
_dcd.setup_packet));
137 for (
int i = 0; i < 16; ++i) {
138 unsigned const endpt = KHCI->ENDPOINT[i].ENDPT;
140 if (endpt & USB_ENDPT_EPSTALL_MASK) {
145 KHCI->ENDPOINT[i].ENDPT = endpt & ~USB_ENDPT_EPSTALL_MASK;
152 const unsigned s = KHCI->STAT;
153 KHCI->ISTAT = USB_ISTAT_TOKDNE_MASK;
155 uint8_t
const epnum = (s >> USB_STAT_ENDP_SHIFT);
156 uint8_t
const dir = (s & USB_STAT_TX_MASK) >> USB_STAT_TX_SHIFT;
157 unsigned const odd = (s & USB_STAT_ODD_MASK) ? 1 : 0;
163 const unsigned pid = bd->
tok_pid;
174 KHCI->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;
178 const unsigned bc = bd->
bc;
179 const unsigned remaining = ep->remaining - bc;
180 if (remaining && bc == ep->max_packet_size) {
182 ep->remaining = remaining;
183 const int next_remaining = remaining - ep->max_packet_size;
184 if (next_remaining > 0) {
186 bd->
addr += ep->max_packet_size * 2;
187 bd->
bc = next_remaining > ep->max_packet_size ? ep->max_packet_size: next_remaining;
193 const unsigned length = ep->length;
197 if (0 == epnum && 0 == length) {
203 KHCI->ADDR =
_dcd.addr;
212 KHCI->USBCTRL &= ~USB_USBCTRL_SUSP_MASK;
213 KHCI->CTL |= USB_CTL_ODDRST_MASK;
215 KHCI->INTEN = USB_INTEN_USBRSTEN_MASK | USB_INTEN_TOKDNEEN_MASK | USB_INTEN_SLEEPEN_MASK |
216 USB_INTEN_ERROREN_MASK | USB_INTEN_STALLEN_MASK;
218 KHCI->ENDPOINT[0].ENDPT = USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;
219 for (
unsigned i = 1; i < 16; ++i) {
220 KHCI->ENDPOINT[i].ENDPT = 0;
223 for (
unsigned i = 0; i <
sizeof(
_dcd.bdt)/
sizeof(*bd); ++i, ++bd) {
232 _dcd.endpoint[0][0] = ep0;
233 _dcd.endpoint[0][1] = ep0;
234 tu_memclr(
_dcd.endpoint[1],
sizeof(
_dcd.endpoint) -
sizeof(
_dcd.endpoint[0]));
237 KHCI->CTL &= ~USB_CTL_ODDRST_MASK;
244 const unsigned inten = KHCI->INTEN;
246 KHCI->INTEN = (inten & ~USB_INTEN_SLEEPEN_MASK) | USB_INTEN_RESUMEEN_MASK;
247 KHCI->USBTRC0 |= USB_USBTRC0_USBRESMEN_MASK;
248 KHCI->USBCTRL |= USB_USBCTRL_SUSP_MASK;
256 const unsigned inten = KHCI->INTEN;
258 KHCI->USBCTRL &= ~USB_USBCTRL_SUSP_MASK;
259 KHCI->USBTRC0 &= ~USB_USBTRC0_USBRESMEN_MASK;
260 KHCI->INTEN = (inten & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;
273 #if defined(FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED) && FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED == 1
274 uint32_t clk_recover_irc_en = KHCI->CLK_RECOVER_IRC_EN;
275 uint32_t clk_recover_ctrl = KHCI->CLK_RECOVER_CTRL;
278 KHCI->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;
279 while (KHCI->USBTRC0 & USB_USBTRC0_USBRESET_MASK);
282 #if defined(FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED) && FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED == 1
283 KHCI->CLK_RECOVER_IRC_EN = clk_recover_irc_en;
284 KHCI->CLK_RECOVER_CTRL |= clk_recover_ctrl;
288 KHCI->USBTRC0 |= TU_BIT(6);
289 KHCI->BDTPAGE1 = (uint8_t)((uintptr_t)
_dcd.bdt >> 8);
290 KHCI->BDTPAGE2 = (uint8_t)((uintptr_t)
_dcd.bdt >> 16);
291 KHCI->BDTPAGE3 = (uint8_t)((uintptr_t)
_dcd.bdt >> 24);
293 KHCI->INTEN = USB_INTEN_USBRSTEN_MASK;
296 NVIC_ClearPendingIRQ(USB0_IRQn);
304 NVIC_EnableIRQ(USB0_IRQn);
310 NVIC_DisableIRQ(USB0_IRQn);
324 KHCI->CTL |= USB_CTL_RESUME_MASK;
327 while (cnt--) __NOP();
329 KHCI->CTL &= ~USB_CTL_RESUME_MASK;
336 KHCI->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
337 KHCI->CTL |= USB_CTL_USBENSOFEN_MASK;
344 KHCI->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;
367 const unsigned odd = ep->
odd;
374 unsigned val = USB_ENDPT_EPCTLDIS_MASK;
376 val |= dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;
377 KHCI->ENDPOINT[epn].ENDPT |= val;
383 bd[odd ^ 1].
data = 1;
392 const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);
393 NVIC_DisableIRQ(USB0_IRQn);
394 for (
unsigned i = 1; i < 16; ++i) {
395 KHCI->ENDPOINT[i].ENDPT = 0;
397 if (ie) NVIC_EnableIRQ(USB0_IRQn);
399 for (
unsigned i = 2; i <
sizeof(
_dcd.bdt)/
sizeof(*bd); ++i, ++bd) {
403 for (
unsigned i = 2; i <
sizeof(
_dcd.endpoint)/
sizeof(*ep); ++i, ++ep) {
419 const unsigned msk = dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;
420 const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);
421 NVIC_DisableIRQ(USB0_IRQn);
422 KHCI->ENDPOINT[epn].ENDPT &= ~msk;
428 if (ie) NVIC_EnableIRQ(USB0_IRQn);
438 TU_ASSERT(0 == bd->
own);
440 const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);
441 NVIC_DisableIRQ(USB0_IRQn);
460 if (ie) NVIC_EnableIRQ(USB0_IRQn);
470 KHCI->ENDPOINT[epn].ENDPT |= USB_ENDPT_EPSTALL_MASK;
473 const unsigned odd =
_dcd.endpoint[epn][dir].odd;
475 TU_ASSERT(0 == bd->
own,);
477 const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);
478 NVIC_DisableIRQ(USB0_IRQn);
484 if (ie) NVIC_EnableIRQ(USB0_IRQn);
494 const unsigned odd =
_dcd.endpoint[epn][dir].odd;
496 TU_VERIFY(bd[odd].own,);
498 const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);
499 NVIC_DisableIRQ(USB0_IRQn);
509 bd[odd ^ 1].
data = 1;
512 const unsigned endpt = KHCI->ENDPOINT[epn].ENDPT;
513 if (endpt & USB_ENDPT_EPSTALL_MASK) {
514 KHCI->ENDPOINT[epn].ENDPT = endpt & ~USB_ENDPT_EPSTALL_MASK;
517 if (ie) NVIC_EnableIRQ(USB0_IRQn);
525 uint32_t is = KHCI->ISTAT;
526 uint32_t msk = KHCI->INTEN;
529 KHCI->ISTAT = is & ~msk;
532 if (is & USB_ISTAT_ERROR_MASK) {
534 uint32_t es = KHCI->ERRSTAT;
539 if (is & USB_ISTAT_USBRST_MASK) {
544 if (is & USB_ISTAT_SLEEP_MASK) {
549 KHCI->ISTAT = USB_ISTAT_SLEEP_MASK;
554 if (is & USB_ISTAT_RESUME_MASK) {
556 KHCI->ISTAT = USB_ISTAT_RESUME_MASK;
561 if (KHCI->USBTRC0 & USB_USBTRC0_USB_RESUME_INT_MASK) {
566 if (is & USB_ISTAT_SOFTOK_MASK) {
567 KHCI->ISTAT = USB_ISTAT_SOFTOK_MASK;
571 if (is & USB_ISTAT_STALL_MASK) {
572 KHCI->ISTAT = USB_ISTAT_STALL_MASK;
576 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_sleep(uint8_t rhport)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
static void process_bus_resume(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 uint8_t tu_edpt_number(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const *desc_ep)
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)