📄 kbdmain.c
字号:
KBD.repeat_time,
KBDRepeatHandler,
NULL);
IRQUnmask(IRQ_KPAD_CODE);
return;
}
#endif /*KBD_DBGMODE*/
kbd_push_onekey_to_kbdbuffer(kbd_onekey_repeated,key_save);
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
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*/
}
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
GPTI_StartItem(handle,
KBD.repeat_time,
KBDRepeatHandler,
parameter);
#else /* __TWO_KEY_DETECTION_SWITCHABLE__ */
GPTI_StartItem(KBD.gpthandle,
KBD.repeat_time,
KBDRepeatHandler,
NULL);
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
IRQUnmask(IRQ_KPAD_CODE);
}
void KBDTimeOutHandler(void *parameter)
{
ilm_struct *Kp_ilm;
kal_uint8 roomleft;
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
kal_uint8 handle;
kal_uint8 index;
#endif
IRQMask(IRQ_KPAD_CODE);
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft != 0);
#endif
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
index = (parameter == 0) ? 0: 1;
handle = KBD.gpthandle[index];
#ifndef KBD_DBGMODE
if (roomleft <= kbd_press_event_count)
{
GPTI_StartItem(handle,
KBD.repeat_time,
KBDTimeOutHandler,
parameter);
IRQUnmask(IRQ_KPAD_CODE);
return;
}
#endif
kbd_push_onekey_to_kbdbuffer(kbd_onekey_longpress, kbd_saved_pressed_key[index]);
#else /* __TWO_KEY_DETECTION_SWITCHABLE__ */
#ifndef KBD_DBGMODE
if (roomleft == kbd_press_event_count)
{
GPTI_StartItem(KBD.gpthandle,
KBD.repeat_time,
KBDTimeOutHandler,
NULL);
IRQUnmask(IRQ_KPAD_CODE);
return;
}
#endif /*KBD_DBGMODE*/
kbd_push_onekey_to_kbdbuffer(kbd_onekey_longpress,key_save);
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
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*/
}
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
GPTI_StartItem(handle,
KBD.repeat_time,
KBDRepeatHandler,
parameter);
IRQUnmask(IRQ_KPAD_CODE);
#else /* __TWO_KEY_DETECTION_SWITCHABLE__ */
GPTI_StartItem(KBD.gpthandle,
KBD.repeat_time,
KBDRepeatHandler,
NULL);
IRQUnmask(IRQ_KPAD_CODE);
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
}
#ifdef __KBD_2STEP_KEY_SUPPORT__
void KBD2KeyHandler(void *parameter)
{
ilm_struct *Kp_ilm;
kal_uint8 roomleft;
IRQMask(IRQ_KPAD_CODE);
if(keypadCustomFunc->keypad_check_fullpress())
{
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft != 0);
#else
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
if (roomleft <= (kbd_press_event_count+1))
{
GPTI_StartItem(KBD.gpthandle[0],
10,
KBD2KeyHandler,
NULL);
#else /* __TWO_KEY_DETECTION_SWITCHABLE__ */
if (roomleft == kbd_press_event_count)
{
GPTI_StartItem(KBD.gpthandle,
10,
KBD2KeyHandler,
NULL);
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
IRQUnmask(IRQ_KPAD_CODE);
return;
}
#endif /*KBD_DBGMODE*/
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
kbd_push_onekey_to_kbdbuffer(kbd_onekey_fullpress,kbd_saved_pressed_key[0]);
/* start longpress timer after full press. */
GPTI_StartItem(KBD.gpthandle[0],
KBD.longpress_timeout,
KBDTimeOutHandler,
0);
#else /* __TWO_KEY_DETECTION_SWITCHABLE__ */
kbd_push_onekey_to_kbdbuffer(kbd_onekey_fullpress,key_save);
/* start longpress timer after full press. */
GPTI_StartItem(KBD.gpthandle,
KBD.longpress_timeout,
KBDTimeOutHandler,
NULL);
#endif /* __TWO_KEY_DETECTION_SWITCHABLE__ */
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*/
}
GPTI_StopItem(KBD.kbd_2key_handle);
}
else
{
GPTI_StartItem(KBD.kbd_2key_handle,
10,
KBD2KeyHandler,
NULL);
}
IRQUnmask(IRQ_KPAD_CODE);
}
#endif
#ifdef __TWO_KEY_DETECTION_SWITCHABLE__
#define KEY_INVALID 0xFF
/* To store keypad mode it is now. */
static kal_bool kbd_2key_detection_enable = KAL_FALSE;
/*************************************************************************
* FUNCTION
* kbd_two_key_detection_switch
*
* DESCRIPTION
* This function is to enable/disable the two key detction mode.
*
* PARAMETERS
* KAL_TRUE - To enable the two key detction mode.
* KAL_FALSE - To disable the two key detction mode.
*
* RETURNS
* KAL_TRUE - Enable or disable two key dection mode successfully.
* KAL_FALSE - Already in the mode. No need to set.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool kbd_two_key_detection_switch(kal_bool enable)
{
if (enable == kbd_2key_detection_enable)
return KAL_FALSE;
/* Set event to keypad task. */
kal_set_eg_events(KBD.event,2,KAL_OR);
return KAL_TRUE;
}
void kbd_task_main( task_entry_struct * task_entry_ptr )
{
kal_uint32 event_group;
kal_uint32 kbd_map_temp_reg;
#if (defined(MT6218)||defined(MT6218B)|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
kal_uint32 kbd_map_temp_reg1;
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
kal_uint8 key_presscount;
kal_uint8 key_releasecount;
kal_uint8 key_index;
kal_uint8 kbd_press_key[2];
kal_uint8 kbd_release_key[2];
ilm_struct *Kp_ilm;
kal_uint8 key_total_count;
kal_uint8 roomleft;
kal_uint8 end_press_count, end_release_count;
kal_bool buf_full;
kbd_saved_pressed_key[0] = KEY_INVALID;
kbd_saved_pressed_key[1] = KEY_INVALID;
#ifdef __KBD_2STEP_KEY_SUPPORT__
kbd_is_2steps_key = KAL_FALSE;
#endif
kbd_press_event_count = 0;
buf_full = KAL_FALSE;
while(1)
{
kal_retrieve_eg_events(KBD.event,3,KAL_OR_CONSUME
,&event_group,KAL_SUSPEND);
#ifndef __PRODUCTION_RELEASE__
ASSERT(kbd_press_event_count < (kbd_buffer_size/2));
#endif
/* Check if there's swtich mode request. */
#ifdef KBD_DBGMODE
if (event_group & 2)
#else /*KBD_DBGMODE*/
if ((event_group & 2) || (buf_full == KAL_TRUE))
#endif /*KBD_DBGMODE*/
{
/* Stop all longpress or repeated timer. */
GPTI_StopItem(KBD.gpthandle[0]);
GPTI_StopItem(KBD.gpthandle[1]);
#ifdef __KBD_2STEP_KEY_SUPPORT__
GPTI_StopItem(KBD.kbd_2key_handle);
kbd_is_2steps_key = KAL_FALSE;
#endif
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft >= (kbd_press_event_count+1));
#else /*KBD_DBGMODE*/
/* Buffer room left should more than reserved release key events and plus one
switch mode event. */
if (roomleft <= (kbd_press_event_count+1))
{
/* Not enough room, should wait. */
buf_full = KAL_TRUE;
}
else
{
buf_full = KAL_FALSE;
#endif /*KBD_DBGMODE*/
/* Compel to send key release event before mode switch. */
if (kbd_saved_pressed_key[0] != KEY_INVALID)
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_saved_pressed_key[0]);
if (kbd_saved_pressed_key[1] != KEY_INVALID)
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_saved_pressed_key[1]);
/* Reset all key status. */
kbd_press_event_count = 0;
kbd_saved_pressed_key[0] = KEY_INVALID;
kbd_saved_pressed_key[1] = KEY_INVALID;
/* Push two key detection enable/disable event to key buffer. */
if (kbd_2key_detection_enable == KAL_TRUE)
{
kbd_push_onekey_to_kbdbuffer(kbd_twokey_detection_disable,0);
kbd_2key_detection_enable = KAL_FALSE;
}
else
{
kbd_push_onekey_to_kbdbuffer(kbd_twokey_detection_enable,0);
kbd_2key_detection_enable = KAL_TRUE;
}
#ifndef KBD_DBGMODE
} /* if (roomleft >= (kbd_press_event_count+1)) */
#endif
}
/* Skip the codes beblow, if there's no any key detection interrupt. */
if (!(event_group & 1))
continue;
key_total_count=0;
end_press_count = 0;
end_release_count = 0;
#if ( (defined(MT6205)) || (defined(MT6205B)) || (defined(MT6208)) || (defined(FPGA)) )
kbd_map_temp_reg = ( ((kal_uint32)(DRV_Reg(KP_HI_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_LOW_KEY))) );
if (KBD.kbdmap_reg != kbd_map_temp_reg)
#elif (defined(MT6218)||defined(MT6218B)|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
kbd_map_temp_reg = ( ((kal_uint32)(DRV_Reg(KP_MID_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_LOW_KEY))) );
kbd_map_temp_reg1 = (kal_uint32)(DRV_Reg(KP_HI_KEY));
if ((KBD.kbdmap_reg != kbd_map_temp_reg) || (KBD.kbdmap_reg1 != kbd_map_temp_reg1 ))
#endif /*MT6205,MT6205B,MT6208,FPGA*//*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
{
key_presscount = 0;
key_releasecount = 0;
/*The first for loop is to check first 2 status register*/
#if ( (defined(MT6205)) || (defined(MT6205B)) || (defined(MT6208)) || (defined(FPGA)) )
for(key_index=0;key_index<kbd_allkeys;key_index++)
#elif (defined(MT6218)||defined(MT6218B)|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
for(key_index=0;key_index<32;key_index++)
#endif /*MT6205,MT6205B,MT6208,FPGA*//*MT6218, MT6218B, MT6219, MT6217, MT6228,MT6229*/
{
/* For each key position, if its status has changed. */
if( (KBD.kbdmap_reg &(1<<key_index)) != (kbd_map_temp_reg &(1<<key_index)) )
{
/* If the key is pressed now.... */
if (!(kbd_map_temp_reg &(1<<key_index)))
{
if (key_presscount == 0)
{
/* Record the 1st pressed key event. */
kbd_press_key[0] = keypad_comm_def->keypad[key_index];
key_presscount = 1;
}
else if (key_presscount == 1)
{
if (kbd_press_key[0] != keypad_comm_def->keypad[key_index])
{
/* Record the 2nd pressed key event. */
kbd_press_key[1] = keypad_comm_def->keypad[key_index];
key_presscount = 2;
}
}
else if ((kbd_2key_detection_enable == KAL_TRUE) && (key_presscount == 2))
{
/* More than 2 keys are pressed. */
if ((kbd_press_key[0] != keypad_comm_def->keypad[key_index])
&& (kbd_press_key[1] != keypad_comm_def->keypad[key_index]))
key_presscount = 3;
}
}
/* Else if the key is released. */
else
{
//KBD.kbdmap_reg |= (1<<key_index);
/* Only deal with those keys that we've recorded as pressed. */
if ((KEY_INVALID != kbd_saved_pressed_key[0]) && (kbd_saved_pressed_key[0] == keypad_comm_def->keypad[key_index]))
{
/* Record the released key event. */
kbd_release_key[key_releasecount] = kbd_saved_pressed_key[0];
key_releasecount++;
#ifdef __KBD_2STEP_KEY_SUPPORT__
/* Note that 2-steps key is only enable when 2 key detection is disable. */
if (kbd_is_2steps_key == KAL_TRUE)
{
GPTI_StopItem(KBD.kbd_2key_handle);
kbd_is_2steps_key = KAL_FALSE;
}
#endif /*__KBD_2STEP_KEY_SUPPORT__*/
/* Stop the longpress/repeate timer for this key. */
GPTI_StopItem(KBD.gpthandle[0]);
kbd_saved_pressed_key[0] = KEY_INVALID;
kbd_press_event_count--;
}
/* Only if 2key detection is enable, 2nd key may have been recorded as pressed. */
else if (kbd_2key_detection_enable == KAL_TRUE)
{
if((KEY_INVALID != kbd_saved_pressed_key[1]) && (kbd_saved_pressed_key[1] == keypad_comm_def->keypad[key_index]))
{
/* Record the released key event. */
kbd_release_key[key_releasecount] = kbd_saved_pressed_key[1];
key_releasecount++;
/* Stop the longpress/repeate timer for this key. */
GPTI_StopItem(KBD.gpthandle[1]);
kbd_saved_pressed_key[1] = KEY_INVALID;
kbd_press_event_count--;
}
}
}
} /* if( (KBD.kbdmap_reg &(1<<key_index)) != (kbd_map_temp_reg &(1<<key_index)) ) */
} /* for(key_index=0; */
#if (defined(MT6218)||defined(MT6218B)|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
/*to check the last status register*/
for(key_index=0;key_index<(kbd_allkeys-32);key_index++)
{
kal_uint8 array_idx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -