| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- /******************************************************************************
- *
- * @brief providing APIs for configuring KBI.
- *
- *******************************************************************************
- *
- * provide APIs for configuring KBI
- ******************************************************************************/
- #include "common.h"
- #include "kbi.h"
- /******************************************************************************
- * External objects
- ******************************************************************************/
- /******************************************************************************
- * Global variables
- ******************************************************************************/
- KBI_CallbackType KBI_Callback[KBI_MAX_NO] = {(KBI_CallbackType)NULL};
- /******************************************************************************
- * Constants and macros
- ******************************************************************************/
- /******************************************************************************
- * Local types
- ******************************************************************************/
- /******************************************************************************
- * Local function prototypes
- ******************************************************************************/
- /******************************************************************************
- * Local variables
- ******************************************************************************/
- /******************************************************************************
- * Local functions
- ******************************************************************************/
- /******************************************************************************
- * KBI api list
- *
- *//*! @addtogroup kbi_api_list
- * @{
- *******************************************************************************/
- /******************************************************************************
- * Global functions
- ******************************************************************************/
- /*****************************************************************************//*!
- *
- * @brief initialize KBI module.
- *
- * @param[in] pKBI pointer to KBI module.
- * @param[in] pConfig pointer to KBI configuration structure.
- *
- * @return none.
- *
- * @ Pass/ Fail criteria: none.
- *
- * @see KBI_DeInit.
- *
- *****************************************************************************/
- void KBI_Init(KBI_Type *pKBI, KBI_ConfigType *pConfig)
- {
- #if defined(CPU_NV32)
- uint16_t i;
- uint8_t sc = 0;
- uint8_t u8Port;
- uint8_t u8PinPos;
- uint16_t u16PinMapping[KBI_MAX_NO][8] =
- {
- {
- 0, 1, 2, 3, 8, 9, 10, 11 /* KBI0 pins position in GPIOA register */
- },
- {
- 24, 25, 26, 27, 28, 29, 30, 31 /* KBI1 pins position in GPIOA register */
- }
- };
- #elif defined(CPU_NV32M3)
- uint16_t i;
- uint8_t sc = 0;
- uint8_t u8Port;
- uint8_t u8PinPos;
- uint16_t u16PinMapping[KBI_MAX_NO][8] =
- {
- {
- 0, 1, 2, 3, 8, 9, 10, 11 /* KBI0 pins position in GPIOA register */
- },
- {
- 20, 21, 16, 17, 18, 19, 12, 13 /* KBI1 pins position in GPIOA register */
- }
- };
- #elif defined(CPU_NV32M4)
- uint32_t i;
- uint32_t sc = 0;
- uint32_t u8Port;
- uint32_t u8PinPos;
- uint32_t u16PinMapping[KBI_MAX_NO][KBI_MAX_PINS_PER_PORT] =
- {
- {/* KBI0P0~KBI0P31 pins position in GPIOA register */
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
- },
- {/* KBI1P0~KBI1P31 pins position in GPIOB register */
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
- }
- };
- #endif
-
-
- if(KBI0 == pKBI)
- {
- SIM->SCGC |= SIM_SCGC_KBI0_MASK; /* enable clock to KBI0 */\
- u8Port = 0;
- }
- else if (KBI1 == pKBI)
- {
- SIM->SCGC |= SIM_SCGC_KBI1_MASK; /* enable clock to KBI1 */
- u8Port = 1;
- }
-
- /* mask keyboard interrupts first */
- sc = pConfig->sBits.bMode;
- pKBI->SC = sc;
- /* configure KBI pin polarity and others */
- for (i = 0; i < KBI_MAX_PINS_PER_PORT; i++)
- {
- if(pConfig->sPin[i].bEn)
- {
- pKBI->PE |= (1<<i); /* enable this KBI pin */
- pKBI->ES = (pKBI->ES & ~(1<<i)) | (pConfig->sPin[i].bEdge << i);
- u8PinPos = u16PinMapping[u8Port][i];
- ASSERT(!(u8PinPos & 0x80));
- #if defined(CPU_NV32)|| defined(CPU_NV32M3)
- FGPIOA->PIDR &= ~(1<<u8PinPos); /* enable GPIO input */
- FGPIOA->PDDR &= ~(1<<u8PinPos); /* configure pin as input */
- PORT->PUEL |= (1<<u8PinPos); /* enable pullup for the pin */
- #elif defined(CPU_NV32M4)
- if (u8Port == 0) /* KBI0 */
- {
- FGPIOA->PIDR &= ~(1<<u8PinPos); /* enable GPIO input */
- FGPIOA->PDDR &= ~(1<<u8PinPos); /* configure pin as input */
- PORT->PUE0 |= (1<<u8PinPos); /*enable pullup for the pin */
- }
- else if (u8Port == 1) /* KBI1 */
- {
- FGPIOB->PIDR &= ~(1<<u8PinPos); /* enable GPIO input */
- FGPIOB->PDDR &= ~(1<<u8PinPos); /* configure pin as input */
- PORT->PUE1 |= (1<<u8PinPos); /*enable pullup for the pin */
- }
- #endif
- }
- }
-
- #if defined(CPU_NV32M4)
- /*Reset KBI_SP register*/
- sc = pConfig->sBits.bRstKbsp<<KBI_SC_RSTKBSP_SHIFT;
- pKBI->SC |= sc;
-
- /*Real KBI_SP register enable*/
- sc = pConfig->sBits.bKbspEn<<KBI_SC_KBSPEN_SHIFT;
- pKBI->SC |= sc;
- #endif
-
- /* write to KBACK to clear any false interrupts */
- pKBI->SC = sc;
-
- /* enable interrupt if needed */
- if(pConfig->sBits.bIntEn)
- {
- pKBI->SC |= KBI_SC_KBIE_MASK;
-
- if(KBI0 == pKBI)
- {
- NVIC_EnableIRQ(KBI0_IRQn);
- }
- else
- {
- NVIC_EnableIRQ(KBI1_IRQn);
- }
- }
- }
- /*****************************************************************************//*!
- *
- * @brief set up KBI callback routine.
- *
- * @param[in] pKBI pointer to KBI module.
- * @param[in] pfnCallback pointer to callback routine.
- *
- * @return none.
- *
- * @ Pass/ Fail criteria: none.
- *
- *****************************************************************************/
- void KBI_SetCallback(KBI_Type *pKBI, KBI_CallbackType pfnCallback)
- {
- if(KBI0 == pKBI)
- {
- KBI_Callback[0] = pfnCallback;
- }
- else
- {
- KBI_Callback[1] = pfnCallback;
- }
- }
- /*****************************************************************************//*!
- *
- * @brief deinit the kbi module.
- *
- * @param[in] pKBI pointer to KBI module.
- *
- * @return none.
- *
- * @ Pass/ Fail criteria: none.
- *
- * @see KBI_Init.
- *
- *****************************************************************************/
- void KBI_DeInit(KBI_Type *pKBI)
- {
- if(KBI0 == pKBI)
- {
- NVIC_DisableIRQ(KBI0_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(KBI1_IRQn);
- }
-
- pKBI->PE = 0;
- pKBI->SC = 0;
- pKBI->ES = 0;
-
- if(KBI0 == pKBI)
- {
- SIM->SCGC &= ~SIM_SCGC_KBI0_MASK; /* disable clock to KBI0 */
- }
- else
- {
- SIM->SCGC &= ~SIM_SCGC_KBI1_MASK; /* disable clock to KBI1 */
- }
- }
- /*! @} End of acmp_api_list */
- /*****************************************************************************//*!
- *
- * @brief button group 0 (KBI0) interrupt service routine.
- *
- * @param none.
- *
- * @return none.
- *
- * @ Pass/ Fail criteria: none.
- *
- *****************************************************************************/
- void KBI0_Isr(void)
- {
- KBI0->SC |= KBI_SC_KBACK_MASK; /* clear interrupt flag */
- if(KBI_Callback[0])
- {
- KBI_Callback[0]();
- }
- }
- /*****************************************************************************//*!
- *
- * @brief button group 0 (KBI0) interrupt service routine.
- *
- * @param none.
- *
- * @return none.
- *
- * @ Pass/ Fail criteria: none.
- *
- *****************************************************************************/
- void KBI1_Isr(void)
- {
- KBI1->SC |= KBI_SC_KBACK_MASK; /* clear interrupt flag */
-
- if(KBI_Callback[1])
- {
- KBI_Callback[1]();
- }
- }
|