📄 kbdmain.c
字号:
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
}
#endif
}
else
continue;
GPTI_StopItem(KBD.gpthandle);
#ifdef __KBD_2STEP_KEY_SUPPORT__
GPTI_StopItem(KBD.kbd_2key_handle);
#endif
switch(key_releasecount)
{
case 1:
#ifndef KBD_DBGMODE
if (!kbd_press_event_count)
break;
#endif
kbdbuffer_get_roomleft(roomleft);
ASSERT(roomleft!=0);
kbd_press_event_count--;
#if ( (defined(MT6205)) || (defined(MT6208)) )
if (TargetReset)
DRV_RESET();
#endif /*MT6205,MT6208*/
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_release_key[0]);
break;
case 2:
#ifndef KBD_DBGMODE
if (!kbd_press_event_count)
break;
#endif
kbdbuffer_get_roomleft(roomleft);
ASSERT(roomleft>=2);
kbd_press_event_count-=2;
#if ( (defined(MT6205)) || (defined(MT6208)) )
if (TargetReset)
DRV_RESET();
#endif /*MT6205,MT6208*/
#ifdef TWO_KEY_ENABLE
kbd_push_twokey_to_kbdbuffer(kbd_twokey_release,kbd_release_key[0],kbd_release_key[1]);
#else /*!TWO_KEY_ENABLE*/
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_release_key[0]);
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_release_key[1]);
#endif /*TWO_KEY_ENABLE*/
break;
default:
break;
}
switch(key_presscount)
{
case 1:
key_save = kbd_press_key[0];
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft!=0);
#else
if ( roomleft < (kbd_press_event_count+2))
{
break;
}
#endif /*KBD_DBGMODE*/
kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,kbd_press_key[0]);
kbd_press_event_count++;
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
#ifdef __KBD_2STEP_KEY_SUPPORT__
if(keypadCustomFunc->keypad_is_fullpress(kbd_press_key[0]))
{
GPTI_StartItem(KBD.kbd_2key_handle,
10,
KBD2KeyHandler,
NULL);
}
else
{
GPTI_StartItem(KBD.gpthandle,
KBD.longpress_timeout,
KBDTimeOutHandler,
NULL);
}
#else
GPTI_StartItem(KBD.gpthandle,
KBD.longpress_timeout,
KBDTimeOutHandler,
NULL);
#endif
break;
#ifdef TWO_KEY_ENABLE
case 2:
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft!=0);
#else
if ( roomleft < (kbd_press_event_count+4))
{
break;
}
#endif /*KBD_DBGMODE*/
kbd_push_twokey_to_kbdbuffer(kbd_twokey_press,kbd_press_key[0],kbd_press_key[1]);
kbd_press_event_count+=2;
break;
#endif /*TWO_KEY_ENABLE*/
default:
break;
}
if (send_kbdilm)
{
send_kbdilm = KAL_FALSE;
#ifndef L4_NOT_PRESENT
DRV_BuildPrimitive(Kp_ilm,
MOD_DRVKBD,
MOD_UEM,
MSG_ID_DRVUEM_KEYPAD_IND,
NULL);
msg_send_ext_queue(Kp_ilm);
#endif /*L4_NOT_PRESENT*/
}
} /*if (KBD.kbdmap_reg != KBD.kbdmap_reg)*/
}
}
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
/*************************************************************************
* FUNCTION
* kbd_task_reset
*
* DESCRIPTION
* This function implements xyz's reset handler
*
* PARAMETERS
* task_index - task's index
*
* RETURNS
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool
kbd_task_reset(task_indx_type task_indx)
{
/* Do task's reset here.
* Notice that: shouldn't execute modules reset handler since
* stack_task_reset() will do. */
return KAL_TRUE;
}
/*************************************************************************
* FUNCTION
* kbd_task_end
*
* DESCRIPTION
* This function implements xyz's termination handler
*
* PARAMETERS
* task_index - task's index
*
* RETURNS
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool
kbd_task_end(task_indx_type task_indx)
{
/* Do task's termination here.
* Notice that: shouldn't execute modules reset handler since
* stack_task_end() will do. */
return KAL_TRUE;
}
/*
* FUNCTION
* Kbd_LISR
*
* DESCRIPTION
* This function is keypad interrupt handler.
*
* CALLS
* This function is called when keypad IRQ signal is coming.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void Kbd_LISR(void)
{
//kal_activate_hisr(KBD.hisr);
drv_active_hisr(DRV_KP_HISR_ID);
}
void Kbd_HisrEntry(void)
{
kal_set_eg_events(KBD.event,1,KAL_OR);
}
/*the tick unit is 10ms*/
void Kbd_SetLongPressTime(kal_uint32 ticks)
{
KBD.longpress_timeout = ticks;
}
void Kbd_SetRepeatTime(kal_uint32 ticks)
{
KBD.repeat_time = ticks;
}
/*
* FUNCTION
* Kbd_Init
*
* DESCRIPTION
* This function is keypad ini. function.
*
* CALLS
* This function should be called before any keypad signal is coming
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void Kbd_Init(void)
{
if (KBD.event == NULL)
KBD.event = kal_create_event_group("KBDEVT");
if ( KBD.hisr == NULL)
{
//KBD.hisr = kal_create_hisr("KP_HISR",2,512,Kbd_HisrEntry,NULL);
KBD.hisr=(void*)0x1234;
DRV_Register_HISR(DRV_KP_HISR_ID, Kbd_HisrEntry);
}
IRQ_Register_LISR(IRQ_KPAD_CODE, Kbd_LISR,"KBD handler");
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
GPTI_GetHandle(&KBD.gpthandle[0]);
GPTI_GetHandle(&KBD.gpthandle[1]);
#else
GPTI_GetHandle(&KBD.gpthandle);
#endif
#ifdef __KBD_2STEP_KEY_SUPPORT__
GPTI_GetHandle(&KBD.kbd_2key_handle);
#endif
/* Bind callback functions */
#if ( (defined(MT6205)) || (defined(MT6205B)) || (defined(MT6208)) || (defined(FPGA)) )
KBD.kbdmap_reg = ( ((kal_uint32)(DRV_Reg(KP_HI_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_LOW_KEY))) );
#endif /*MT6208,MT6205,MT6205B,FPGA*/
#if (defined(MT6218)||defined(MT6218B)|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
KBD.kbdmap_reg = ( ((kal_uint32)(DRV_Reg(KP_MID_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_LOW_KEY))) );
KBD.kbdmap_reg1 = (kal_uint32)(DRV_Reg(KP_HI_KEY));
DRV_WriteReg(KP_DEBOUNCE,KP_DEBOUNCE_TIME);/*16ms*/
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
KBD.longpress_timeout = 200; /*2s*/
KBD.repeat_time = 100; /*1s*/
/**(volatile kal_uint16 *)KP_DEBOUNCE = KP_DEBOUNCE_TIME; // 1/32 sec */
/* *(volatile kal_uint16 *)KP_SCAN = KP_SCAN_4KHZ; */
IRQSensitivity(IRQ_KPAD_CODE,EDGE_SENSITIVE);
IRQUnmask(IRQ_KPAD_CODE);
}
/*
* FUNCTION
* PowerKey_Pressed
*
* DESCRIPTION
* This function is to check if power key is pressed
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* return keypressed result
*
* GLOBALS AFFECTED
* None
*/
kal_bool PowerKey_Pressed(void)
{
kal_uint16 i;
kal_uint16 pwrkey_reg=0;
kal_uint16 pwrkey_bit=0;
kal_uint16 powerkey_status=0;
for(i=0;i<kbd_allkeys;i++)
{
if(keypad_comm_def->keypad[i]==keypad_comm_def->powerkey_position)
{
pwrkey_reg=(i/16);
pwrkey_bit=0x0001 <<(i&0xf);
break;
}
}
switch(pwrkey_reg)
{
case low_key:
powerkey_status= DRV_Reg(KP_LOW_KEY);
break;
#if ( (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219)) ||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
case medium_key:
powerkey_status= DRV_Reg(KP_MID_KEY);
break;
#endif
case high_key:
powerkey_status= DRV_Reg(KP_HI_KEY);
break;
default:
ASSERT(0);
break;
}
if((DRV_Reg(KP_STS) & KP_STS_KEYPRESS) &&
((~powerkey_status)&(pwrkey_bit))//((~DRV_Reg(KP_LOW_KEY))&(PWRKEY_index))
)
{
return KAL_TRUE;
}
else
return KAL_FALSE;
}
/*
* FUNCTION
* kbd_is_mutiple_key
*
* DESCRIPTION
* This function is to check if the key is multi-defined
*
* CALLS
*
* PARAMETERS
* kal_uint8 key
*
* RETURNS
* kal_bool
*
* GLOBALS AFFECTED
* None
*/
kal_bool kbd_is_mutiple_key(kal_uint8 key)
{
kal_uint8 i, key_count=0;
for(i=0;i<42;i++)
{
if(keypad_comm_def->keypad[i]==key)
{
key_count++;
if(key_count>=2)
return KAL_TRUE;
}
}
return KAL_FALSE;
}
/*
* FUNCTION
* kbd_find_2step
*
* DESCRIPTION
* This function is to find who are 2 step key
*
* CALLS
*
* PARAMETERS
* *number: number of 2 step keys
* *two_step: 2 step key definition
*
* RETURNS
* none
*
* GLOBALS AFFECTED
* None
*/
void kbd_find_2step(kal_uint32 *number, kal_uint8 *two_step)
{
#ifdef __KBD_2STEP_KEY_SUPPORT__
*number=1;
*two_step=DEVICE_KEY_FUNCTION;
#else
*number=0;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -