void R_SWITCHES_Init (void) { /* Unlock protection register */ MPC.PWPR.BYTE &= 0x7F; /* Unlock MPC registers */ MPC.PWPR.BYTE |= 0x40; /* Make switch pins inputs. */ PORT3.PDR.BYTE &= 0xFC; PORTE.PDR.BYTE &= 0xEF; /* Set port mode registers for switches. */ PORT3.PMR.BYTE &= 0xFC; PORTE.PMR.BYTE &= 0xEF; MPC_P30PFS_REG = 0x40; /* P30 is used as IRQ pin */ MPC_P31PFS_REG = 0x40; /* P31 is used as IRQ pin */ MPC_PE4PFS_REG = 0x40; /* PE4 is used as IRQ pin */ /* Set IRQ type (falling edge) */ ICU.IRQCR[ SW1_IRQ_NUMBER ].BYTE = 0x04; ICU.IRQCR[ SW2_IRQ_NUMBER ].BYTE = 0x04; ICU.IRQCR[ SW3_IRQ_NUMBER ].BYTE = 0x04; /* Set interrupt priorities, which must be below configMAX_SYSCALL_INTERRUPT_PRIORITY. */ _IPR( X_IRQ(SW1_IRQ_NUMBER) ) = configKERNEL_INTERRUPT_PRIORITY; _IPR( X_IRQ(SW2_IRQ_NUMBER) ) = configKERNEL_INTERRUPT_PRIORITY; _IPR( X_IRQ(SW3_IRQ_NUMBER) ) = configKERNEL_INTERRUPT_PRIORITY; /* Clear any pending interrupts */ _IR( X_IRQ(SW1_IRQ_NUMBER) ) = 0; _IR( X_IRQ(SW2_IRQ_NUMBER) ) = 0; _IR( X_IRQ(SW3_IRQ_NUMBER) ) = 0; /* Enable the interrupts */ _IEN( X_IRQ(SW1_IRQ_NUMBER) ) = 1; _IEN( X_IRQ(SW2_IRQ_NUMBER) ) = 1; _IEN( X_IRQ(SW3_IRQ_NUMBER) ) = 1; }
/*********************************************************************************************************************** * Function Name: R_SWITCHES_Init * Description : Initializes pins to be input and interrupt on switch presses. * Arguments : detection_hz - * The times per second that the user will call R_SWITCHES_Update(). NOTE: this is only when using * polling mode. If you are using interrupt mode, then this argument will be ignored. * debouce_counts - * The number of times to check the port value before accepting the change. The slower the rate at * which R_SWITCHES_Update() will likely lower this number. * Return Value : none ***********************************************************************************************************************/ void R_SWITCHES_Init (uint32_t detection_hz, uint32_t debounce_counts) { uint32_t i; /* The SW#_XXX defintions are common macros amongst different boards. To see the definitions for these macros see the board defintion file. For example, this file for the RSKRX63N is rskrx63n.h. */ #if defined(MCU_RX62N) || defined(MCU_RX62T) || defined(MCU_RX621) || defined(MCU_RX610) /* Make switch pins inputs. */ SW1_DDR = 0; SW2_DDR = 0; SW3_DDR = 0; /* Enable input buffer control registers. */ SW1_ICR = 1; SW2_ICR = 1; SW3_ICR = 1; #elif defined(MCU_RX63N) || defined(MCU_RX630) || defined(MCU_RX631) || defined(MCU_RX210) || defined(MCU_RX111) /* Unlock protection register */ MPC.PWPR.BIT.B0WI = 0 ; /* Unlock MPC registers */ MPC.PWPR.BIT.PFSWE = 1 ; /* Make switch pins inputs. */ SW1_PDR = 0; SW2_PDR = 0; SW3_PDR = 0; /* Set port mode registers for switches. */ SW1_PMR = 0; SW2_PMR = 0; SW3_PMR = 0; #endif #if SWITCHES_DETECTION_MODE == 0 #if defined(PLATFORM_BOARD_RDKRX63N) /* The switches on the RDKRX63N are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P4.0 IRQ8 SW2 P4.1 IRQ9 SW3 P4.4 IRQ12 */ MPC.P40PFS.BYTE = 0x40; /* P40 is used as IRQ pin */ MPC.P41PFS.BYTE = 0x40; /* P40 is used as IRQ pin */ MPC.P44PFS.BYTE = 0x40; /* P40 is used as IRQ pin */ #elif defined(PLATFORM_BOARD_RSKRX63N) /* The switches on the RSKRX63N are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P3.2 IRQ2 SW2 P0.0 IRQ8 SW3 P0.7 IRQ15 */ MPC.P32PFS.BYTE = 0x40; /* P32 is used as IRQ pin */ MPC.P00PFS.BYTE = 0x40; /* P00 is used as IRQ pin */ MPC.P07PFS.BYTE = 0x40; /* P07 is used as IRQ pin */ #elif defined(PLATFORM_BOARD_RSKRX630) /* The switches on the RSKRX630 are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P3.2 IRQ2 SW2 P4.4 IRQ12 SW3 P0.7 IRQ15 */ MPC.P32PFS.BYTE = 0x40; /* P32 is used as IRQ pin */ MPC.P44PFS.BYTE = 0x40; /* P44 is used as IRQ pin */ MPC.P07PFS.BYTE = 0x40; /* P07 is used as IRQ pin */ #elif defined(PLATFORM_BOARD_RSKRX62N) /* The switches on the RSKRX62N are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P0.0 IRQ8-A SW2 P0.1 IRQ9-A SW3 P0.7 IRQ15-A */ IOPORT.PF8IRQ.BIT.ITS8 = 0; /* IRQ8-A pin is used. */ IOPORT.PF8IRQ.BIT.ITS9 = 0; /* IRQ9-A pin is used. */ IOPORT.PF8IRQ.BIT.ITS15 = 0; /* IRQ15-A pin is used. */ #elif defined(PLATFORM_BOARD_RDKRX62N) /* The switches on the RDKRX62N are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P4.0 IRQ8 SW2 P4.1 IRQ9 SW3 P4.2 IRQ10 */ /* Nothing else needed to do here since RDK has 100-pin package and there are no alternate pins to choose. */ #elif defined(PLATFORM_BOARD_RSKRX62T) /* The switches on the RSKRX62T are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 PE.5 IRQ0-B SW2 PE.4 IRQ1-B SW3 PB.4 IRQ3 */ IOPORT.PF8IRQ.BIT.ITS0 = 1; /* IRQ0-B pin is used. */ IOPORT.PF8IRQ.BIT.ITS1 = 1; /* IRQ1-B pin is used. */ /* IRQ3 is only on 1 pin. */ #elif defined(PLATFORM_BOARD_RSKRX610) /* The switches on the RSKRX610 are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P0.0 IRQ8-A SW2 P0.1 IRQ9-A SW3 P1.3 IRQ3-B */ IOPORT.PFCR8.BIT.ITS8 = 0; /* IRQ8-A pin is used. */ IOPORT.PFCR8.BIT.ITS9 = 0; /* IRQ9-A pin is used. */ IOPORT.PFCR9.BIT.ITS3 = 1; /* IRQ3-B pin is used. */ /* Enable IRQ detection. */ ICU.IRQER[SW1_IRQ_NUMBER].BIT.IRQEN = 1; ICU.IRQER[SW2_IRQ_NUMBER].BIT.IRQEN = 1; ICU.IRQER[SW3_IRQ_NUMBER].BIT.IRQEN = 1; #elif defined(PLATFORM_BOARD_RSKRX210) /* The switches on the RSKRX210 are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P3.1 IRQ1 SW2 P3.3 IRQ3 SW3 P3.4 IRQ4 */ MPC.P31PFS.BYTE = 0x40; /* P31 is used as IRQ pin */ MPC.P33PFS.BYTE = 0x40; /* P33 is used as IRQ pin */ MPC.P34PFS.BYTE = 0x40; /* P34 is used as IRQ pin */ #elif defined(PLATFORM_BOARD_RSKRX111) /* The switches on the RSKRX210 are connected to the following pins/IRQ's Switch Port IRQ ------ ---- ---- SW1 P3.0 IRQ0 SW2 P3.1 IRQ1 SW3 PE.4 IRQ4 */ MPC.P30PFS.BYTE = 0x40; /* P30 is used as IRQ pin */ MPC.P31PFS.BYTE = 0x40; /* P31 is used as IRQ pin */ MPC.PE4PFS.BYTE = 0x40; /* PE4 is used as IRQ pin */ #endif /* Set IRQ type (falling edge) */ ICU.IRQCR[SW1_IRQ_NUMBER].BIT.IRQMD = 0x01; ICU.IRQCR[SW2_IRQ_NUMBER].BIT.IRQMD = 0x01; ICU.IRQCR[SW3_IRQ_NUMBER].BIT.IRQMD = 0x01; /* Set interrupt priorities which muse be below configMAX_SYSCALL_INTERRUPT_PRIORITY. */ _IPR( X_IRQ(SW1_IRQ_NUMBER) ) = configKERNEL_INTERRUPT_PRIORITY; _IPR( X_IRQ(SW2_IRQ_NUMBER) ) = configKERNEL_INTERRUPT_PRIORITY; _IPR( X_IRQ(SW3_IRQ_NUMBER) ) = configKERNEL_INTERRUPT_PRIORITY; /* Clear any pending interrupts */ _IR( X_IRQ(SW1_IRQ_NUMBER) ) = 0; _IR( X_IRQ(SW2_IRQ_NUMBER) ) = 0; _IR( X_IRQ(SW3_IRQ_NUMBER) ) = 0; /* Enable the interrupts */ _IEN( X_IRQ(SW1_IRQ_NUMBER) ) = 1; _IEN( X_IRQ(SW2_IRQ_NUMBER) ) = 1; _IEN( X_IRQ(SW3_IRQ_NUMBER) ) = 1; #else /* This is based upon having 3 counts at 10Hz. */ g_sw_debounce_cnts = debounce_counts; /* Init debounce structures. */ for (i = 0; i < SWITCHES_NUM; i++) { g_switches[i].active = false; g_switches[i].debounce_cnt = 0; } #endif /* SWITCHES_DETECTION_MODE */ }