コード例 #1
0
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;
}
コード例 #2
0
ファイル: usb_cdc.c プロジェクト: GNSPS/proxmark3
//*----------------------------------------------------------------------------
//* \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;
}