void usb_isr_rst(void) { UEIR = 0; UIR = 0; UEIE = 0x9F; UIE = STANDARD_INTS & ~__USB_UIF_ACTIVE; UADDR = 0; usb_disable_endpoints(); usb_token_reset(); UEP(0) = ENDPT_CONTROL | 0x10; while (UIR_TRN) { usb_clear_trn(); } UCON_PKTDIS = 0; //SIE token and packet processing enabled usb_init_ep0_setup(); usb_state = USB_STATE_DEFAULT; //put usb mcu into default state }
void usb_isr(void) { unsigned int8 TRNAttempts; clear_interrupt(INT_USB); if (usb_state == USB_STATE_DETACHED) return; //should never happen, though if (UIR) { debug_usb(debug_putc,"\r\n\n[%X] ",UIR); //activity detected. (only enable after sleep) if (UIR_ACTV && UIE_ACTV) {usb_isr_activity();} if (UCON_SUSPND) return; if (UIR_STALL && UIE_STALL) {usb_isr_stall();} //a stall handshake was sent if (UIR_UERR && UIE_UERR) {usb_isr_uerr();} //error has been detected if (UIR_URST && UIE_URST) {usb_isr_rst();} //usb reset has been detected if (UIR_IDLE && UIE_IDLE) {usb_isr_uidle();} //idle time, we can go to sleep if (UIR_SOF && UIE_SOF) {usb_isr_sof();} TRNAttempts = 0; do { if (UIR_TRN && UIE_TRN) { USTATCopy = U1STAT; usb_clear_trn(); usb_isr_tok_dne(); } else break; } while (TRNAttempts++ < 4); } }