上一节中介绍了BS8112A芯片在荔枝派nano上的驱动实现过程。但是现在需要用到触摸按键的长按短按功能,需要稍加修改。
在BS8112A_probe函数中,设置了__clear_bit(EV_REP, input->evbit); 即取消了上报按键重发的功能,所以我们将其开启。
改为__set_bit(EV_REP, input->evbit);其余什么也不用改,这样,按键长按时驱动就会上报新的事件。
input_report_key(input, keycodes, keyval);这个函数,keycodes是键值,keyval是按下、抬起及长按标志,按下=1 抬起=0 长按=2
所以在应用层可以做如下操作实现长按短按。
if(event.type == EV_KEY)
{
if( event.value > 0 )
{
if( event.value == STA_KEY_DOWN)//按键按下
{
keyrepateCnt = 0;
printf("KEY DOWN:code:%d,val:%d\n", event.code,event.value);
}
else if(event.value == STA_KEY_REPATE)//按键重复发送
{
++keyrepateCnt;
if(keyrepateCnt>=KEY_REPATE_CNT_MAX)
{
keyrepateCnt = 0;
if(!onceflag)//only do once
{
onceflag = 1;
printf("KEY REPATE:code:%d,val:%d\n", event.code,event.value);
}
}
}
}
else //按键抬起
{
onceflag = 0;
keyrepateCnt = 0;
printf("KEY UP:code:%d,val:%d\n", event.code,event.value);
}
}