增加了遥控和面板输入,自定义遥控和面板的键值,但由于小于128都是标准键盘定义,所
以只能定义大于等于128的值。
在ial/native.c中修改了NR_KEYS的宏定义,如下
#undef NR_KEYS
#define NR_KEYS MGUI_NR_KEYS //在common.h中定义MGUI_NR_KEYS为255
以为这个修改就可以,但仍然不行,在keyboard_update(void)函数中把所接收到的键值显
示出来,发现键值大于等于128的键,不这按下还是放开,每次都是发三个数值过来。查了
kernel中drivers/char/keyboard.c中,才知道如果键盘模式设成mediumraw的模式,就是这
样:
if (keycode < 128) {
put_queue(vc, keycode | (!down << 7));
} else {
put_queue(vc, !down << 7);
put_queue(vc, (keycode >> 7) | 0x80);
put_queue(vc, keycode | 0x80);
}
而确实在kbd_tty.c中是设置成mediumraw模式
if (ioctl(kbd_fd, KDSKBMODE, K_MEDIUMRAW) < 0)
goto err;
所以修改keyboard_update对输入键值的处理,如下
#if(NR_KEYS>128)//(2010-6-22 duwenyong)add. 支持大于128的键输入
//对于大于128的键,如0xB8,则按下时数据为0x00 0x81 0xB8
// 释放时数据为0x80 0x81 0xB8
static int longcode = 0;
static int longcount = 0;
is_pressed = !(buf & 0x80);
ch = buf & 0x7f;
if(longcode)
{
longcount++;
if(longcount==1)
{
longcode |= (ch<<7);
return 0;
}
else// if(longcount==2)
{
longcode |= ch;
is_pressed = !(longcode&0x80000000);
ch = (longcode&0x0000FFFF);
longcode = 0;
longcount = 0;
if(ch>=NR_KEYS)
return 0;
}
}
if(buf==0x00)
{
longcount = 0;
longcode = 0x40000000;
return 0;
}
if(buf==0x80)
{
longcount = 0;
longcode = 0x80000000;
return 0;
}
//printf("press:%d, ch:0x%02X/r/n", is_pressed,ch);
#else
is_pressed = !(buf & 0x80);
ch = buf & 0x7f;
#endif
附:详见《Linux键盘驱动详解》或drivers/char/keyboard.c
键盘模式
键盘模式有4种, 在Linux 下你可以用kbd_mode -参数 来设置和显示你的模式:
1) Scancode mode (raw )raw模式:将键盘端口上读出的扫描码放入缓冲区
2) Keycode mode (mediumraw) mediumraw模式:将扫描码过滤为键盘码放入缓冲区
3) ASCII mode (XLATE ) XLATE模式:识别各种键盘码的组合,转换为TTY终端代码放
入缓冲区
4) UTF-8 MODE (UNICODE) Unicode 模式:UNICODE模式基本上与XLATE相同,只不过
可以通过数字小键盘间接输入UNICODE代码。