minigui的native ial支持键值大于127的输入

本文介绍了如何修改MiniGUI的Native IAL以支持大于127的键值输入。通过调整NR_KEYS宏定义并修改keyboard_update函数,处理大于128的键值在mediumraw模式下的数据传输问题。详细分析了Linux键盘驱动的四种模式,并提供了相应的代码修改方案。
摘要由CSDN通过智能技术生成

增加了遥控和面板输入,自定义遥控和面板的键值,但由于小于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代码。
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值