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

📄 kbdmain.c

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