#include #include #include #include #include #ifdef DEBUG_FIRMWARE #include #include #else #define printf(...) #endif volatile __bit dosud = FALSE; volatile __bit dosuspend = FALSE; // custom functions extern void main_loop(); extern void main_init(); void main() { #ifdef DEBUG_FIRMWARE SETCPUFREQ(CLK_48M); // main_init can still set this to whatever you want. sio0_init(57600); // needed for printf if debug defined #endif main_init(); // set up interrupts. USE_USB_INTS(); ENABLE_SUDAV(); ENABLE_USBRESET(); ENABLE_HISPEED(); ENABLE_SUSPEND(); ENABLE_RESUME(); /* global interrupt enable */ EA = 1; // iic files (c2 load) don't need to renumerate/delay // trm 3.6 #ifndef NORENUM RENUMERATE(); #else USBCS &= ~bmDISCON; #endif while (TRUE) { main_loop(); if (dosud) { dosud = FALSE; handle_setupdata(); } if (dosuspend) { dosuspend = FALSE; do { printf("I'm going to Suspend.\n"); WAKEUPCS |= bmWU | bmWU2; // make sure ext wakeups are cleared SUSPEND = 1; PCON |= 1; __asm nop nop nop nop nop nop nop __endasm; } while (!remote_wakeup_allowed && REMOTE_WAKEUP()); printf("I'm going to wake up.\n"); // resume // trm 6.4 if (REMOTE_WAKEUP()) { delay(5); USBCS |= bmSIGRESUME; delay(15); USBCS &= ~bmSIGRESUME; } } } } void resume_isr() __interrupt RESUME_ISR { CLEAR_RESUME(); } void sudav_isr() __interrupt SUDAV_ISR { dosud = TRUE; CLEAR_SUDAV(); } void usbreset_isr() __interrupt USBRESET_ISR { handle_hispeed(FALSE); CLEAR_USBRESET(); } void hispeed_isr() __interrupt HISPEED_ISR { handle_hispeed(TRUE); CLEAR_HISPEED(); } void suspend_isr() __interrupt SUSPEND_ISR { dosuspend = TRUE; CLEAR_SUSPEND(); }