static void usb_irq_handler(void) { AT91_REG isr = AT91C_BASE_UDP->UDP_ISR & AT91C_BASE_UDP->UDP_IMR; // tx_hex("i: ", isr); // handle all known interrupt sources if(isr & AT91C_UDP_ENDBUSRES) { AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES; // tx_str("USB bus reset\r\n"); // reset all endpoints AT91C_BASE_UDP->UDP_RSTEP = (unsigned int)-1; AT91C_BASE_UDP->UDP_RSTEP = 0; // Enable the function AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; // Configure endpoint 0 AT91C_BASE_UDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL); // enable ep0 interrupt AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT0; } // data received for endpoint 0 if(isr & AT91C_UDP_EPINT0) { AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_EPINT0; AT91F_CDC_Enumerate(); } // clear all remaining irqs AT91C_BASE_UDP->UDP_ICR = AT91C_BASE_UDP->UDP_ISR; }
//*---------------------------------------------------------------------------- //* \fn usb_check //* \brief Test if the device is configured and handle enumeration //*---------------------------------------------------------------------------- bool usb_check() { AT91_REG isr = pUdp->UDP_ISR; if (isr & AT91C_UDP_ENDBUSRES) { pUdp->UDP_ICR = AT91C_UDP_ENDBUSRES; // reset all endpoints pUdp->UDP_RSTEP = (unsigned int)-1; pUdp->UDP_RSTEP = 0; // Enable the function pUdp->UDP_FADDR = AT91C_UDP_FEN; // Configure endpoint 0 pUdp->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL); } else if (isr & AT91C_UDP_EPINT0) { pUdp->UDP_ICR = AT91C_UDP_EPINT0; AT91F_CDC_Enumerate(); } return (btConfiguration) ? true : false; }