/**
|
******************************************************************************
|
* @file xl_kbi.c
|
* @author Kirk ,xu.wang
|
* @version 4.5.2
|
* @date Fri Mar 26 17:29:12 2021
|
* @brief This file provide function about KBI firmware program
|
******************************************************************************
|
* @attention
|
*
|
* 2019 by Chipways Communications,Inc. All Rights Reserved.
|
* This software is supplied under the terms of a license
|
* agreement or non-disclosure agreement with Chipways.
|
* Passing on and copying of this document,and communication
|
* of its contents is not permitted without prior written
|
* authorization.
|
*
|
* <h2><center>© COPYRIGHT 2019 Chipways</center></h2>
|
******************************************************************************
|
*/
|
|
#if defined(__cplusplus)
|
extern "C" {
|
#endif /* __cplusplus */
|
|
/* Includes ---------------------------------------------------------------*/
|
#include "xl_kbi.h"
|
|
/** @addtogroup XL6600_StdPeriph_Driver
|
* @{
|
*/
|
|
/** @defgroup KBI KBI Module
|
* @brief KBI Driver Modules Library
|
* @{
|
*/
|
|
/* Private typedef -----------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
/* Private macro -------------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
|
/** @defgroup KBI_Private_Functions
|
* @{
|
*/
|
|
/**
|
* @brief KBIĬÈϳõʼ»¯
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè.
|
* @retval None.
|
*/
|
void KBI_Deinit(KBI_Type *KBIx)
|
{
|
/* De-initialize the KBI module return to the default state. */
|
KBIx->PE = 0u ;
|
KBIx->ES = 0u;
|
KBIx->SC = 0u ;
|
}
|
|
/**
|
* @brief KBI³õʼ»¯
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè.
|
* @param KBI_InitStruct: Ö¸Ïò°üº¬Ö¸¶¨KBIÍâÉèÅäÖÃÐÅÏ¢µÄKBI_InitTypeDef½á¹¹.
|
* @retval None.
|
*/
|
void KBI_Init(KBI_Type *KBIx, const KBI_InitTypeDef *KBI_InitStruct)
|
{
|
uint32_t tmpreg;
|
|
/* configure the register */
|
/* Get the CS Register. */
|
tmpreg = KBIx->SC;
|
/* clear the KBSPEN,KBMOD bit*/
|
tmpreg &= ~ (KBI_SC_KBSPEN_MASK | KBI_SC_KBMOD_MASK);
|
/* set the KBI_SC register */
|
tmpreg |= ((KBI_InitStruct->KBI_SPRegValue)|(KBI_InitStruct->KBI_DetectMode));
|
/* Write to KBI SC */
|
KBIx->SC = tmpreg ;
|
}
|
|
/**
|
* @brief ÅäÖÃÒ»¸öÖ¸¶¨µÄpinλ.
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè.
|
* @param KBI_Pin: Ö¸¶¨pin(KBI_P0~KBI_P31)
|
* @param EdgeSelect: ±ßԵѡÔñ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg KBI_FallEdge_LowLevel: Ñ¡ÔñϽµÑØºÍµÍµçÆ½
|
* @arg KBI_RiseEdge_HighLevel: Ñ¡ÔñÉÏÉýÑØºÍ¸ßµçƽ
|
* @retval None.
|
*/
|
void KBI_PinConfig(KBI_Type *KBIx, uint8_t KBI_Pin,uint8_t EdgeSelect)
|
{
|
/*Enable the KBI pin speified.*/
|
KBIx->PE |= (( (uint32_t)1 << KBI_Pin) & KBI_PE_KBIPE_MASK);
|
|
/*first clear the KBI Edge Select speified.*/
|
KBIx->ES &= ~(( (uint32_t)1u << KBI_Pin) & KBI_ES_KBEDG_MASK);
|
|
/*Selet the falling edge/low-lever or rising edge/high-lever.*/
|
KBIx->ES |= ( ((uint32_t)EdgeSelect << KBI_Pin) & KBI_ES_KBEDG_MASK);
|
}
|
|
/**
|
* @brief ÅäÖÃËùÓеÄpinλ.
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè.
|
* @param KBI_Pin: Ö¸¶¨pin(KBI_P0~KBI_P31)
|
* @param EdgeRegSelect: Ñ¡Ôñpin±ßÔµ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg KBI_FallEdge_LowLevel: ϽµÑØºÍµÍµçÆ½
|
* @arg KBI_RiseEdge_HighLevel: ÉÏÉýÑØºÍ¸ßµçƽ
|
* @retval None.
|
*/
|
void KBI_BatchPinConfig(KBI_Type *KBIx, uint32_t KBI_Pin, uint32_t EdgeRegSelect)
|
{
|
/* Set the pins whether enable or not.*/
|
KBIx->PE = KBI_Pin;
|
|
/* Set the pins edge selection.*/
|
KBIx->ES = EdgeRegSelect;
|
}
|
|
/**
|
* @brief Æô¶¯Ò»¸öKBIÖжÏ.
|
* Õâ¸öº¯ÊýÓÃÓÚÆô¶¯Ò»¸öKBIÖжÏ.
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè
|
* @param NewState:KBIÖжÏʹÄÜ״̬
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE: ʹÄÜKBIÖжÏ
|
* @arg DISABLE: ʹÄÜKBIÖжÏ
|
* @retval None.
|
*/
|
void KBI_InterruptEn(KBI_Type *KBIx,FunctionalState NewState)
|
{
|
if(NewState != DISABLE )
|
{
|
/* Enable KBI Interrupt. */
|
KBIx ->SC |= KBI_SC_KBIE_MASK;
|
}
|
else
|
{
|
/* Disable KBI Interrupt. */
|
KBIx ->SC &= ~KBI_SC_KBIE_MASK;
|
}
|
}
|
|
/**
|
* @brief ָʾºÎʱ¼ì²âµ½KBIÖжÏÇëÇó.
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè¡£
|
* @retval ÊÇ·ñ¼ì²âµ½ÁËÒ»¸öKBIÖжÏÇëÇ󣺣¨SET or RESET£©
|
*/
|
FlagStatus KBI_GetInterruptFlag(const KBI_Type *KBIx)
|
{
|
FlagStatus ret;
|
/*Whether a KBI interrupt request is detected or not.*/
|
if((KBIx->SC & KBI_SC_KBF_MASK) == KBI_SC_KBF_MASK)
|
{
|
ret = SET;
|
}
|
else
|
{
|
ret = RESET;
|
}
|
return ret;
|
}
|
|
/**
|
* @brief Çå³ýÏàÓ¦µÄÖжϱê־λ¡£
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè¡£
|
* @retval None.
|
*/
|
void KBI_ClrInterruptFlag(KBI_Type *KBIx)
|
{
|
/*Write a 1 to KBACK to clear the flag.*/
|
KBIx->SC |= KBI_SC_KBACK_MASK;
|
}
|
|
/**
|
* @brief ¸´Î»KIB_SP¼Ä´æÆ÷.
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè¡£
|
* @retval None.
|
*/
|
void KBI_RstSP(KBI_Type *KBIx)
|
{
|
/*Write a 1 to RSTKBSP to reset clesr the KBIxSP register.*/
|
KBIx->SC |= KBI_SC_RSTKBSP_MASK;
|
}
|
|
/**
|
* @brief »ñÈ¡KBIÔ´pin¼Ä´æÆ÷×ֶΡ£
|
* @param KBIx: Ñ¡ÔñKBIÍâÉè¡£
|
* @retval the active pin defined as keyboard interrupt which is push.
|
*/
|
uint32_t KBI_GetSP(const KBI_Type *KBIx)
|
{
|
/*Get the active pin defined as keyboard interrrupt which is pushed.*/
|
return (KBIx->SP & KBI_SP_SP_MASK);
|
}
|
|
/**
|
* @}
|
*/
|
|
/**
|
* @}
|
*/
|
|
/**
|
* @}
|
*/
|
|
|
#ifdef __cplusplus
|
}
|
#endif /* __cplusplus */
|