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

minigui 专栏收录该内容
2 篇文章 0 订阅

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

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

duwenyong

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值