📄 kbdmain.c
字号:
array_idx = key_index+32;
if( (KBD.kbdmap_reg1 &(1<<key_index)) != (kbd_map_temp_reg1 &(1<<key_index)) )
{
if (!(kbd_map_temp_reg1 &(1<<key_index)))
{
if (key_presscount == 0)
{
kbd_press_key[0] = keypad_comm_def->keypad[array_idx];
key_presscount = 1;
}
else if (key_presscount == 1)
{
if (kbd_press_key[0] != keypad_comm_def->keypad[array_idx])
{
kbd_press_key[1] = keypad_comm_def->keypad[array_idx];
key_presscount = 2;
}
}
else if ((kbd_2key_detection_enable == KAL_TRUE) && (key_presscount == 2))
{
if ((kbd_press_key[0] != keypad_comm_def->keypad[array_idx])
&& (kbd_press_key[1] != keypad_comm_def->keypad[array_idx]))
key_presscount = 3;
}
}
else
{
//KBD.kbdmap_reg1 |= (1<<key_index);
if ((KEY_INVALID != kbd_saved_pressed_key[0]) && (kbd_saved_pressed_key[0] == keypad_comm_def->keypad[array_idx]))
{
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__*/
GPTI_StopItem(KBD.gpthandle[0]);
kbd_saved_pressed_key[0] = KEY_INVALID;
kbd_press_event_count--;
}
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[array_idx]))
{
kbd_release_key[key_releasecount] = kbd_saved_pressed_key[1];
key_releasecount++;
GPTI_StopItem(KBD.gpthandle[1]);
kbd_saved_pressed_key[1] = KEY_INVALID;
kbd_press_event_count--;
}
}
}
} /* if( (KBD.kbdmap_reg1 &(1<<key_index)) != (kbd_map_temp_reg1 &(1<<key_index)) ) */
} /* for(key_index=0; */
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
/* Process the release key first. */
switch (key_releasecount)
{
case 1:
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft>1);
#else /*KBD_DBGMODE*/
/* Check if buffer room is enough or not. Note there should be one buffer left for
2key detection enable/disable event. */
if (roomleft <= 1)
{
/* Not enough room. So we recover saved press key event. */
if (KEY_INVALID == kbd_saved_pressed_key[0])
kbd_saved_pressed_key[0] = kbd_release_key[0];
else if (KEY_INVALID == kbd_saved_pressed_key[1])
kbd_saved_pressed_key[1] = kbd_release_key[0];
kbd_press_event_count++;
continue;
}
#endif /*KBD_DBGMODE*/
#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:
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft>2);
#else
/* Check if buffer room is enough or not. Note there should be one buffer left for
2key detection enable/disable event. */
if (roomleft <= 2)
{
/* Not enough room. So we recover saved press key event. */
kbd_saved_pressed_key[0] = kbd_release_key[0];
kbd_saved_pressed_key[1] = kbd_release_key[1];
kbd_press_event_count = 2;
continue;
}
#endif
#if ( (defined(MT6205)) || (defined(MT6208)) )
if (TargetReset)
DRV_RESET();
#endif /*MT6205,MT6208*/
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_release_key[0]);
kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,kbd_release_key[1]);
break;
default:
break;
}
/* Update the keypad scan registers for release keys here. */
KBD.kbdmap_reg |= 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) )
KBD.kbdmap_reg1 |= kbd_map_temp_reg1;
#endif
/* Calculate the total press keys count now. */
key_total_count = kbd_press_event_count + key_presscount;
/* Check if the total press keys count exceeds the limitation. */
if (((kbd_2key_detection_enable) && (key_total_count > 2))
|| ((!kbd_2key_detection_enable) && (key_total_count > 1)))
{
/* Exceed the press key count so we don't process the newly pressed keys. */
if (key_releasecount == 0)
continue;
}
else
{
switch(key_presscount)
{
case 0:
if (key_releasecount == 0)
continue;
break;
case 1:
//key_save = kbd_press_key[0];
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(roomleft >= (kbd_press_event_count+3));
#else
/* Note the left buffer room should more than the sum of
1. kbd_press_event_count: for release key events later.
2. 2: newly press key. (1 for press, 1 for release later).
3. 1: 2key detection enable/disable event. */
if (roomleft < (kbd_press_event_count+3))
{
break;
}
#endif /*KBD_DBGMODE*/
if (!kbd_2key_detection_enable)
{
/* Store the press key event. */
kbd_saved_pressed_key[0] = kbd_press_key[0];
key_index = 0;
}
else
{
/* Store the press key event. */
if (kbd_saved_pressed_key[0] == KEY_INVALID)
{
kbd_saved_pressed_key[0] = kbd_press_key[0];
key_index = 0;
}
else
{
#ifdef KBD_DBGMODE
ASSERT(kbd_saved_pressed_key[1] == KEY_INVALID);
#endif
kbd_saved_pressed_key[1] = kbd_press_key[0];
key_index = 1;
}
}
kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,kbd_press_key[0]);
kbd_press_event_count++;
/* Start the longpress timer for this key. */
#ifdef __KBD_2STEP_KEY_SUPPORT__
/* Check if it's 2-steps key. Note that 2-steps key is disable in 2 key detection mode. */
if(!kbd_2key_detection_enable && keypadCustomFunc->keypad_is_fullpress(kbd_press_key[0]))
{
kbd_is_2steps_key = KAL_TRUE;
GPTI_StartItem(KBD.kbd_2key_handle,
10,
KBD2KeyHandler,
NULL);
}
else
{
#endif /*__KBD_2STEP_KEY_SUPPORT__*/
GPTI_StartItem(KBD.gpthandle[key_index],
KBD.longpress_timeout,
KBDTimeOutHandler,
(void *)key_index);
#ifdef __KBD_2STEP_KEY_SUPPORT__
}
#endif /*__KBD_2STEP_KEY_SUPPORT__*/
/* Update the keypad scan registers for press keys here. */
KBD.kbdmap_reg &= 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) )
KBD.kbdmap_reg1 &= kbd_map_temp_reg1;
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
break;
case 2:
kbdbuffer_get_roomleft(roomleft);
#ifdef KBD_DBGMODE
ASSERT(kbd_press_event_count==0);
ASSERT(roomleft >= (2*2+1));
#else
/* Note the left buffer room should more than the sum of
1. 4: 2 newly press key. (2 for press, 2 for release later).
2. 1: 2key detection enable/disable event. */
if (roomleft < (2*2+1))
{
break;
}
#endif /*KBD_DBGMODE*/
#ifdef KBD_DBGMODE
ASSERT(kbd_saved_pressed_key[0] == KEY_INVALID);
ASSERT(kbd_saved_pressed_key[1] == KEY_INVALID);
#endif /*KBD_DBGMODE*/
/* Store the press key event. */
kbd_saved_pressed_key[0] = kbd_press_key[0];
kbd_saved_pressed_key[1] = kbd_press_key[1];
kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,kbd_press_key[0]);
kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,kbd_press_key[1]);
kbd_press_event_count=2;
/* Start the longpress timer for these 2 keys. */
GPTI_StartItem(KBD.gpthandle[0],
KBD.longpress_timeout,
KBDTimeOutHandler,
0);
GPTI_StartItem(KBD.gpthandle[1],
KBD.longpress_timeout,
KBDTimeOutHandler,
(void *)1);
/* Update the keypad scan registers for press keys here. */
KBD.kbdmap_reg &= 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) )
KBD.kbdmap_reg1 &= kbd_map_temp_reg1;
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
break;
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)*/
}
}
#else /* __TWO_KEY_DETECTION_SWITCHABLE__ */
kal_bool kbd_two_key_detection_switch(kal_bool enable)
{
return KAL_FALSE;
}
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;
while(1)
{
kal_retrieve_eg_events(KBD.event,1,KAL_OR_CONSUME
,&event_group,KAL_SUSPEND);
#ifndef __PRODUCTION_RELEASE__
ASSERT(kbd_press_event_count < (kbd_buffer_size/2));
#endif
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*/
{
//GPTI_StopItem(KBD.gpthandle);
#if 0
#ifdef __KBD_2STEP_KEY_SUPPORT__
/* under construction !*/
#endif
#endif
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*/
{
if ( (kbd_map_temp_reg &(1<<key_index))==0 )
key_total_count++;
if( (KBD.kbdmap_reg &(1<<key_index)) != (kbd_map_temp_reg &(1<<key_index)) )
{
if (!(kbd_map_temp_reg &(1<<key_index)))
{
kbd_press_key[key_presscount&1] = keypad_comm_def->keypad[key_index];
#if (defined(__MAUI_BASIC__)) && (defined(MONZA))
monza_kp_control(keypad_comm_def->keypad[key_index]);
#endif
key_presscount++;
if(kbd_is_mutiple_key(keypad_comm_def->keypad[key_index]))
{
end_press_count++;
}
}
else
{
kbd_release_key[key_releasecount&1] = keypad_comm_def->keypad[key_index];
key_releasecount++;
if(kbd_is_mutiple_key(keypad_comm_def->keypad[key_index]))
{
end_release_count++;
}
}
}
}
#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++)
{
if ( (kbd_map_temp_reg1 &(1<<key_index)) == 0 )
key_total_count++;
if( (KBD.kbdmap_reg1 &(1<<key_index)) != (kbd_map_temp_reg1 &(1<<key_index)) )
{
if (!(kbd_map_temp_reg1 &(1<<key_index)))
{
kbd_press_key[key_presscount&1] = keypad_comm_def->keypad[key_index+32];
key_presscount++;
if(kbd_is_mutiple_key(keypad_comm_def->keypad[key_index+32]))
{
end_press_count++;
}
}
else
{
kbd_release_key[key_releasecount&1] = keypad_comm_def->keypad[key_index+32];
key_releasecount++;
if(kbd_is_mutiple_key(keypad_comm_def->keypad[key_index+32]))
{
end_release_count++;
}
}
}
}
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229*/
if(0!=end_press_count)/*to cover one<->multiple */
{
key_total_count = key_total_count - end_press_count + 1;
key_presscount = key_presscount - end_press_count + 1;
}
if(0!=end_release_count)/*to cover one<->multiple */
key_releasecount = key_releasecount - end_release_count + 1;
#ifdef TWO_KEY_ENABLE
if ((key_presscount<=2) && (key_total_count <= 2) )
#else /*!TWO_KEY_ENABLE*/
if ( (key_presscount<=1) && (key_total_count <= 1) )
#endif /*TWO_KEY_ENABLE*/
{
#ifdef KBD_DBGMODE
KBD.kbdmap_reg = 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) )
KBD.kbdmap_reg1 = kbd_map_temp_reg1;
#endif /*MT6218, MT6218B, MT6219, MT6217, MT6228,MT6229*/
#else /*!KBD_DBGMODE*/
/*Predict*/
kbdbuffer_get_roomleft(roomleft);
if ( (roomleft <=key_presscount*2+kbd_press_event_count) && (key_releasecount == 0) )
{
continue;
}
else
{
KBD.kbdmap_reg = 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) )
KBD.kbdmap_reg1 = kbd_map_temp_reg1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -