void udd_attach(void) { irqflags_t flags; flags = cpu_irq_save(); // At startup the USB bus state is unknown, // therefore the state is considered IDLE to not miss any USB event udd_sleep_mode(true); // Enable peripheral clock and USB clock udd_enable_periph_ck(); // Authorize attach if VBus is present udd_enable_transceiver(); udd_attach_device(); // Enable USB line events udd_enable_suspend_interrupt(); udd_enable_wake_up_interrupt(); udd_enable_resume_interrupt(); udd_enable_ext_resume_interrupt(); udd_enable_sof_interrupt(); cpu_irq_restore(flags); }
void udd_attach(void) { irqflags_t flags; flags = cpu_irq_save(); // At startup the USB bus state is unknown, // therefore the state is considered IDLE to not miss any USB event udd_sleep_mode(true); otg_unfreeze_clock(); while (!Is_otg_clock_usable()); // Authorize attach if Vbus is present udd_attach_device(); // Enable USB line events udd_enable_reset_interrupt(); udd_enable_suspend_interrupt(); udd_enable_wake_up_interrupt(); udd_enable_sof_interrupt(); // Reset following interrupts flag udd_ack_reset(); udd_ack_sof(); // The first suspend interrupt must be forced udd_raise_suspend(); udd_ack_wake_up(); otg_freeze_clock(); cpu_irq_restore(flags); }
void udd_attach(void) { irqflags_t flags; flags = cpu_irq_save(); // At startup the USB bus state is unknown, // therefore the state is considered IDLE to not miss any USB event udd_sleep_mode(true); otg_unfreeze_clock(); // This section of clock check can be improved with a chek of // USB clock source via sysclk() #if UC3A3 // For parts with high speed feature, the "USABLE" clock is the UTMI clock, // and the UTMI clock is disabled in suspend mode. Thereby, the utmi clock // can't be checked when USB line is not attached or in suspend mode // But it is not a issue, because the clock source is the OSC #else // Check USB clock because the source can be a PLL while( !Is_clock_usable() ); #endif // Authorize attach if VBus is present udd_attach_device(); // (RESET_AND_WAKEUP) // After the attach and the first USB suspend, the following USB Reset time can be inferior to CPU restart clock time. // Thus, the USB Reset state is not detected and endpoint control is not allocated // In this case, a Reset is do automatically after attach. udc_reset(); // Reset USB Device Stack Core udd_reset_ep_ctrl(); // Reset endpoint control udd_ctrl_init(); // Reset endpoint control management // Enable USB line events udd_enable_reset_interrupt(); udd_enable_suspend_interrupt(); udd_enable_wake_up_interrupt(); #ifdef UDC_SOF_EVENT udd_enable_sof_interrupt(); #endif // Reset following interupts flag udd_ack_reset(); udd_ack_sof(); // The first suspend interrupt must be forced #if UC3A3 // With UTMI, the first suspend is detected but must be cleared to reoccur interrupt udd_ack_suspend(); #else // The first suspend interrupt is not detected else raise it udd_raise_suspend(); #endif udd_ack_wake_up(); otg_freeze_clock(); cpu_irq_restore(flags); }
void udd_attach(void) { irqflags_t flags; flags = cpu_irq_save(); // At startup the USB bus state is unknown, // therefore the state is considered IDLE to not miss any USB event udd_sleep_mode(true); otg_unfreeze_clock(); while( !Is_otg_clock_usable() ); // Authorize attach if Vbus is present udd_attach_device(); // Enable USB line events udd_enable_reset_interrupt(); udd_enable_suspend_interrupt(); udd_enable_wake_up_interrupt(); udd_enable_sof_interrupt(); #ifdef USB_DEVICE_HS_SUPPORT udd_enable_msof_interrupt(); #endif // Reset following interrupts flag udd_ack_reset(); udd_ack_sof(); udd_ack_msof(); // The first suspend interrupt must be forced #if UC3A3 // With UTMI, the first suspend is detected but must be cleared to reoccur interrupt udd_ack_suspend(); #else // The first suspend interrupt is not detected else raise it udd_raise_suspend(); #endif udd_ack_wake_up(); otg_freeze_clock(); cpu_irq_restore(flags); }