On Monday 11 May 2009, Narnakaje, Snehaprabha wrote: >> Kevin, Dave, >> >> We checked this with the hardware team - >> >> "The GPIO module does't seem to have the ability to >> enable/disable the direct/banked GPIO[0:9] at the GPIO >> Level (it does via the SET register, but it doesn't >> prevent triggering both Interrupts to the CPU). But the >> option to mask between the direct GPIO interrupts and >> the bank0 for GPIO[15:0] does exist at the ARM level. > >That's not quite clear... if SET_FALLING.BIT(5) has >enabled one edge and SET_RISING.BIT(1) enables another >edge on a different GPIO, and BANK0 is enabled in the >AINTC, then BANK0 can be triggered by either of those >two events, right? (That's what we expect, and I've >seen no reason to think otherwise. BINTEN.BIT(0) set.) > >If we then toss direct GPIO5 and GPIO1 IRQs into the >mix, and they're both enabled in the AINTC ... you're >saying both should arrive, yes? Triggered according to >those RISING/FALLING settings? Or always active-low? > >If the RISING/FALLING registers are all clear, but the >direct GPIO5 and GPIO1 IRQs are enabled in AINTC, are >you saying we still get a BANK0 interrupt?
You need to setup either a rising or falling edge interrupt in order for an interrupt to be generated. If you don't set either one then you will not generate any interrupts (bank or individual). I think the ultimate issue here is that the output of the interrupt generation is tied directly to both the bank interrupt and the individual interrupt. That means that the gating of this interrupt is happening at the AINTC level. Therefore if you have both the individual interrupt and the bank interrupt enabled at the AINTC level then you will be interrupted twice for that specific interrupt. So, for example, if at the AINTC level you enable the individual interrupt, but disable the bank interrupt, then you would be fine (i.e. only one interrupt generated). However, if some other code in the system turns on the bank interrupt then you will get interrupted twice for a given interrupt (once for the individual and once for the bank). You could solve this issue a few different ways. (I have not so much as opened the driver so sorry that I have no idea how easy/difficult these approaches will be to implement.) 1. Use only individual interrupts for GPIO[9:0] and don't let anyone in the system use GPIO[15:10]. 2. Use only bank interrupts for GPIO[15:0] and don't let anyone use the individual interrupts (GPIO[9:0]). 3. Use a mix of bank interrupts and individual interrupts, but whenever an individual interrupt gets used you "plug" the corresponding bank interrupt with a NOP. The first 2 solutions work by doing the gating at the AINTC level and only allowing one of the interrupts to be enabled, thereby making it impossible to be interrupted twice. Those solutions will be the most efficient from a cycle perspective. The 3rd solution is the most flexible because it allows both interrupts to be enabled but will have wasted overhead from taking unnecessary interrupts. I hope that helps clarify! Brad _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
