⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbdmain.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 4 页
字号:
                     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 + -