
Hi:
I'm trying to implement simple USB device in u-boot for at91rm9200 and as a first step I want to see that I can work with interrupts there. I added temporary device initialization code to usb_lowlevel_init():
............................. AT91PS_AIC pAic = AT91C_BASE_AIC;
*AT91C_PMC_SCER = AT91C_PMC_UDP;/* 48MHz clock enabled for UDP */ *AT91C_PMC_PCER = (1 << AT91C_ID_UDP); /* Peripheral Clock Enable Register */
pAic->AIC_IDCR = 1 << AT91C_ID_UDP; pAic->AIC_SVR[AT91C_ID_UDP] = (unsigned int) &dfu_udp_irq; pAic->AIC_SMR[AT91C_ID_UDP] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 1; pAic->AIC_ICCR = 1 << AT91C_ID_UDP;
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_UDP); ..............................................
BTW, I suspect that AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE is not correct one actually in this case.
Interrupt handler just prints something, clears the interrupt and leaves:
static void dfu_udp_irq(void) { AT91PS_UDP pUDP = AT91C_BASE_UDP; AT91_REG isr = pUDP->UDP_ISR; AT91PS_AIC pAic = AT91C_BASE_AIC; static unsigned int counter=0;
printf ("dfu_udp_irq:%u isr = 0x%X (AT91C_ID_UDP=%u) counter %u\n", __LINE__, isr, AT91C_ID_UDP, counter++);
/* clear all interrupts */ pUDP->UDP_ICR = isr;
pAic->AIC_ICCR = AT91C_ID_UDP; }
I issue "usb start" command and then connect my device port to external USB host (I also can do the same, connecting it to card's own host port). I get the interrupt, but system is dead after that - looks like interrupt never gets freed:
U-Boot$ dfu_udp_irq:1554 isr = 0x300 (AT91C_ID_UDP=11) counter 0
Now, interrupt's bits that are set are RXSUSP (USB Suspend Interrupt Status) and RXRSM (USB Resume Interrupt Status). I think my code clears them, but may be I shall do something else provided that USB device is in suspended mode now? Looks like the interrupt doesn't get released after all...
Thanks,
Leonid.