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

📄 kbdmain.c

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