// Interrupt on "pin change" from SW0 to do wakeup on USB // Note: // This interrupt is enable when the USB host enable remotewakeup feature // This interrupt wakeup the CPU if this one is in idle mode static void UI_WAKEUP_HANDLER(void) { sysclk_enable_peripheral_clock(EIC); if(eic_line_interrupt_is_pending(EIC, UI_WAKEUP_EIC_LINE)) { eic_line_clear_interrupt(EIC, UI_WAKEUP_EIC_LINE); ui_disable_asynchronous_interrupt(); // It is a wakeup then send wakeup USB udc_remotewakeup(); // Wakeup, ignore button change until button is back to default state btn_wakeup = true; } sysclk_disable_peripheral_clock(EIC); }
/** * \brief Interrupt handler for interrupt pin change */ static void UI_WAKEUP_HANDLER(void) { if (ui_b_host_mode) { if (uhc_is_suspend()) { ui_disable_asynchronous_interrupt(); /* Wakeup the devices connected */ uhc_resume(); } } else { /* In device mode, wakeup the USB host. */ udc_remotewakeup(); } }
/** * \brief Interrupt handler for interrupt pin change */ static void UI_WAKEUP_HANDLER(void) { sysclk_enable_peripheral_clock(EIC); if (eic_line_interrupt_is_pending(EIC, UI_WAKEUP_EIC_LINE)) { eic_line_clear_interrupt(EIC, UI_WAKEUP_EIC_LINE); if (ui_b_host_mode) { if (!uhc_is_suspend()) { /* USB is not in suspend mode * Let's interrupt enable. */ return; } ui_disable_asynchronous_interrupt(); /* Wakeup the devices connected */ uhc_resume(); } else { /* In device mode, wakeup the USB host. */ udc_remotewakeup(); } } sysclk_disable_peripheral_clock(EIC); }
/* Interrupt on "pin change" from push button to do wakeup on USB * Note: * This interrupt is enable when the USB host enable remote wakeup feature * This interrupt wakeup the CPU if this one is in idle mode */ static void ui_wakeup_handler(void) { /* It is a wakeup then send wakeup USB */ udc_remotewakeup(); LED_On(LED_0_PIN); }
int main(void) { DBG_LED_ENA; DBG_1_ENA; DBG_1_OFF; DBG_2_ENA; DBG_2_OFF; DBG_3_ENA; DBG_3_OFF; debug_code_init(); CLK_init(); ADC0_init(); SR_EXP_Init(); #ifdef RGB_MATRIX_ENABLE i2c1_init(); #endif // RGB_MATRIX_ENABLE matrix_init(); USB2422_init(); DBGC(DC_MAIN_UDC_START_BEGIN); udc_start(); DBGC(DC_MAIN_UDC_START_COMPLETE); DBGC(DC_MAIN_CDC_INIT_BEGIN); CDC_init(); DBGC(DC_MAIN_CDC_INIT_COMPLETE); while (USB2422_Port_Detect_Init() == 0) {} DBG_LED_OFF; #ifdef RGB_MATRIX_ENABLE while (I2C3733_Init_Control() != 1) {} while (I2C3733_Init_Drivers() != 1) {} I2C_DMAC_LED_Init(); i2c_led_q_init(); for (uint8_t drvid = 0; drvid < ISSI3733_DRIVER_COUNT; drvid++) I2C_LED_Q_ONOFF(drvid); //Queue data #endif // RGB_MATRIX_ENABLE keyboard_setup(); keyboard_init(); host_set_driver(&arm_atsam_driver); #ifdef CONSOLE_ENABLE uint64_t next_print = 0; #endif //CONSOLE_ENABLE v_5v_avg = adc_get(ADC_5V); debug_code_disable(); while (1) { main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals if (g_usb_state == USB_FSMSTATUS_FSMSTATE_SUSPEND_Val || g_usb_state == USB_FSMSTATUS_FSMSTATE_SLEEP_Val) { if (suspend_wakeup_condition()) { udc_remotewakeup(); //Send remote wakeup signal wait_ms(50); } continue; } keyboard_task(); #ifdef CONSOLE_ENABLE if (timer_read64() > next_print) { next_print = timer_read64() + 250; //Add any debug information here that you want to see very often //dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n", v_5v, v_5v_avg, v_5v_avg - V5_LOW, v_5v_avg - V5_HIGH, gcr_actual, gcr_desired); } #endif //CONSOLE_ENABLE } return 1; }