|
1.轨迹球(JOG_BALL)
1.1.JOG_BALL原理
如下图所示,轨迹球里面有4个霍尔传感器+4个小的径向充磁的小磁铁。当从上到下推球或者从左到右推动球时,如果球接触到齿条,并带动齿条旋转一个小角度,此时齿条上的磁环也跟着旋转同样的角度,此时磁铁会转动另一个极性(南极北极的切换或者北极南极的切换),这样磁通量会发生变化,由磁信号转化的一个电脉冲信号将被释放出,电平变化会触发相应的霍尔元件对应的中断,上层会根据报上的中断来执行上下左右等操作。
1.2 JOG_BALL代码流程和细节
如下图示是霍尔对应的PCB和原理图
从上面可以看到每个JOG_BALL有四个霍尔,而且初始化时候是上拉的,否则不能工作。
1.2.1初始化函数在keymain.c中Kbd_Init()函数:
Void Kbd_Init(void)
{
………
// 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);
压栈的按键和事件类型依次遍历处理。
小贴士:
电平触发,就是只有高电平(或者低电平)的时候才能触发的动作,
边沿触发,就是有高电平向低电平转换,或者翻过来转换,这个转换过程触发一个动作。
上升沿,就是低电平向高电平转换的瞬间(过程),比如
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiangyu912/archive/2010/08/12/5805976.aspx