void hal_interrupt_configure(int vector, int level, int up) { #ifdef HAL_EXTENDED_INTERRUPT_CONFIGURE // Use platform specific handling, if defined // Note: this macro should do a 'return' for "extended" values of 'vector' // Normal vectors are handled by code subsequent to the macro call. HAL_EXTENDED_INTERRUPT_CONFIGURE(vector, level, up); #endif if (vector >= CYGNUM_HAL_INTERRUPT_GPIO64) { if (level) { if (up) { // Enable both edges *PXA2X0_GRER2 |= (1 << (vector - 96)); *PXA2X0_GFER2 |= (1 << (vector - 96)); } else { // Disable both edges *PXA2X0_GRER2 &= ~(1 << (vector - 96)); *PXA2X0_GFER2 &= ~(1 << (vector - 96)); } } else { // Only interested in one edge if (up) { // Set rising edge detect and clear falling edge detect. *PXA2X0_GRER2 |= (1 << (vector - 96)); *PXA2X0_GFER2 &= ~(1 << (vector - 96)); } else { // Set falling edge detect and clear rising edge detect. *PXA2X0_GFER2 |= (1 << (vector - 96)); *PXA2X0_GRER2 &= ~(1 << (vector - 96)); } } } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO32) { if (level) { if (up) { // Enable both edges *PXA2X0_GRER1 |= (1 << (vector - 64)); *PXA2X0_GFER1 |= (1 << (vector - 64)); } else { // Disable both edges *PXA2X0_GRER1 &= ~(1 << (vector - 64)); *PXA2X0_GFER1 &= ~(1 << (vector - 64)); } } else { // Only interested in one edge if (up) { // Set rising edge detect and clear falling edge detect. *PXA2X0_GRER1 |= (1 << (vector - 64)); *PXA2X0_GFER1 &= ~(1 << (vector - 64)); } else { // Set falling edge detect and clear rising edge detect. *PXA2X0_GFER1 |= (1 << (vector - 64)); *PXA2X0_GRER1 &= ~(1 << (vector - 64)); } } } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO2) { if (level) { if (up) { // Enable both edges *PXA2X0_GRER0 |= (1 << (vector - 32)); *PXA2X0_GFER0 |= (1 << (vector - 32)); } else { // Disable both edges *PXA2X0_GRER0 &= ~(1 << (vector - 32)); *PXA2X0_GFER0 &= ~(1 << (vector - 32)); } } else { // Only interested in one edge if (up) { // Set rising edge detect and clear falling edge detect. *PXA2X0_GRER0 |= (1 << (vector - 32)); *PXA2X0_GFER0 &= ~(1 << (vector - 32)); } else { // Set falling edge detect and clear rising edge detect. *PXA2X0_GFER0 |= (1 << (vector - 32)); *PXA2X0_GRER0 &= ~(1 << (vector - 32)); } } } else if (vector == CYGNUM_HAL_INTERRUPT_GPIO0 || vector == CYGNUM_HAL_INTERRUPT_GPIO1) { if (level) { if (up) { // Enable both edges *PXA2X0_GRER0 |= (1 << (vector - 8)); *PXA2X0_GFER0 |= (1 << (vector - 8)); } else { // Disable both edges *PXA2X0_GRER0 &= ~(1 << (vector - 8)); *PXA2X0_GFER0 &= ~(1 << (vector - 8)); } } else { // Only interested in one edge if (up) { // Set rising edge detect and clear falling edge detect. *PXA2X0_GRER0 |= (1 << (vector - 8)); *PXA2X0_GFER0 &= ~(1 << (vector - 8)); } else { // Set falling edge detect and clear rising edge detect. *PXA2X0_GFER0 |= (1 << (vector - 8)); *PXA2X0_GRER0 &= ~(1 << (vector - 8)); } } } }
void hal_interrupt_configure(int vector, int level, int up) { cyg_bool falling = level || !up; cyg_bool rising = level || up; #ifdef HAL_EXTENDED_INTERRUPT_CONFIGURE // Use platform specific handling, if defined // Note: this macro should do a 'return' for "extended" values of 'vector' // Normal vectors are handled by code subsequent to the macro call. HAL_EXTENDED_INTERRUPT_CONFIGURE(vector, level, up); #endif #ifdef CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(96)) { if (falling) *PXA2X0_GFER3 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96)); else *PXA2X0_GFER3 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96)); if (rising) *PXA2X0_GRER3 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96)); else *PXA2X0_GRER3 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96)); } else #endif if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(64)) { if (falling) *PXA2X0_GFER2 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64)); else *PXA2X0_GFER2 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64)); if (rising) *PXA2X0_GRER2 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64)); else *PXA2X0_GRER2 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64)); } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(32)) { if (falling) *PXA2X0_GFER1 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32)); else *PXA2X0_GFER1 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32)); if (rising) *PXA2X0_GRER1 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32)); else *PXA2X0_GRER1 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32)); } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(2)) { if (falling) *PXA2X0_GFER1 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS)); else *PXA2X0_GFER1 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS)); if (rising) *PXA2X0_GRER1 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS)); else *PXA2X0_GRER1 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS)); } else if (vector == CYGNUM_HAL_INTERRUPT_GPIO0 || vector == CYGNUM_HAL_INTERRUPT_GPIO1) { if (falling) *PXA2X0_GFER0 |= (1 << (vector - 8)); else *PXA2X0_GFER0 &= ~(1 << (vector - 8)); if (rising) *PXA2X0_GRER0 |= (1 << (vector - 8)); else *PXA2X0_GRER0 &= ~(1 << (vector - 8)); } }