MTK 轨迹球(JOG_BALL)

声明:本资料来自公司同事整理

 

 

1.轨迹球(JOG_BALL


1.1JOG_BALL原理

如下图所示,轨迹球里面有4个霍尔传感器+4个小的径向充磁的小磁铁。当从上到下推球或者从左到右推动球时,如果球接触到齿条,并带动齿条旋转一个小角度,此时齿条上的磁环也跟着旋转同样的角度,此时磁铁会转动另一个极性(南极北极的切换或者北极南极的切换),这样磁通量会发生变化,由磁信号转化的一个电脉冲信号将被释放出,电平变化会触发相应的霍尔元件对应的中断,上层会根据报上的中断来执行上下左右等操作。

 


1.2  JOG_BALL代码流程和细节

如下图示是霍尔对应的PCB和原理图

MTK 轨迹球(JOG_BALL)_第1张图片


MTK 轨迹球(JOG_BALL)_第2张图片

 

从上面可以看到每个JOG_BALL有四个霍尔,而且初始化时候是上拉的,否则不能工作。

1.2.1初始化函数在keymain.cKbd_Init()函数:

Void Kbd_Initvoid

………

    // power on

    GPIO_ModeSetup(gpio_jog_ball_enable_pin, 0);

    GPIO_InitIO(1, gpio_jog_ball_enable_pin);

    GPIO_WriteIO(0, gpio_jog_ball_enable_pin);

 

    // set jog ball eint

    if (JOG_BALL_EINT1_NO < EINT_CHANNEL_NOT_EXIST)

    {

        GPIO_ModeSetup(JOG_BALL_EINT1_NO+41, 1);

        EINT_Registration(JOG_BALL_EINT1_NO, KAL_FALSE, JOG_BALL_EINT_1_Polarity, JOG_BALL_EINT_1_HISR, KAL_TRUE);

}

{……}

…………

在初始化函数中使能开启JOG_BALL 2.8V电压,给中断管脚赋了初值并注册了四个中断。

 

1.2.2响应中断的函数void JOG_BALL_EINT_1_HISR(void)

void JOG_BALL_EINT_2HISR(void)

void JOG_BALL_EINT_3HISR(void)

void JOG_BALL_EINT_4HISR(void)

void JOG_BALL_EINT_1_HISR(void)

………

    if (JOG_BALL_EINT_1_Polarity == 1)

    {

        if (JOG_BALL_EINT_1_tick == JOG_BALL_EINT_tick_launch)

………

                kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,DEVICE_KEY_UP);

                kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,DEVICE_KEY_UP);

                 #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*/

 }

 

 

    JOG_BALL_EINT_1_Polarity = !JOG_BALL_EINT_1_Polarity;

                                         EINT_Set_Polarity(JOG_BALL_EINT1_NO, JOG_BALL_EINT_1_Polarity);

函数为例,在中断响应函数中设置了JOG_BALL_EINT_1_tick中断响应计数器,当达到门限JOG_BALL_EINT_tick_launch才会确实发出消息给上层执行操作,这样是为了消抖,避免误操作和干扰。在函数结尾将触发电平又恢复成低电平。

1.2.3上层接受消息处理函数:在函数mmi_task()中,根据上面中断函数中kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,DEVICE_KEY_UP);

                kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,DEVICE_KEY_UP);

压栈的按键和事件类型依次遍历处理。

小贴士:

电平触发,就是只有高电平(或者低电平)的时候才能触发的动作,
边沿触发,就是有高电平向低电平转换,或者翻过来转换,这个转换过程触发一个动作。

上升沿,就是低电平向高电平转换的瞬间(过程),比如

 

 

 

你可能感兴趣的:(工作,ext,null,UP,MTK)