我自己的 linux 和弦键盘驱动程序和我的嵌入式应用程序的接口



我想开发自己的键盘驱动程序到我自己的键盘。 我必须使用 GPIO 来识别关键事件,并使用 I2c 来获取扫描代码。我将开发这样的键盘驱动程序。

#include <linux/gpio.h> 
#include <linux/interrupt.h>
#define GPIO 1 //gpio PIN
...
if(gpio_request(GPIO, "Description")){
    Exception
}
gpio_direction_input(GPIO);
...
int irq = 0;
if((irq = gpio_to_irq(GPIO)) < 0 ){
    Exception
}
…
int init_module(){
    int result = request_irq(GPIO, handler_func, IRQF_TRIGGER_LOW,"Description", "Device id");
    if(result){
        Exception
    }
}
void handler_func(...){
    //get scan code via i2c
}

我需要开发一个接口,并且必须处理以下操作

  在我的键盘中,在 [KEY1] .
上打印为"1abc"  1.按键时,按原样显示第一个字符 ->"1">
  阿拉伯数字。特殊组合键用于输入其他 3 个字符
     例如:
          键输入操作如下;

          KEY1(直接按下(应显示"1">
          F1 + KEY1(同时按下(应显示"a">
          F2 + KEY1(同时按下(应显示"b">
          F3 + KEY1(同时按下(应显示"c">
我的问题是我应该如何开发这个界面?

您最好遵循ADI公司的键盘和GPIO Linux驱动程序。我将把你链接到一些GPIO驱动程序。

此驱动程序包括这些功能

  • 可配置的键盘大小矩阵(行、列(。
  • 支持切换事件。
  • 自动按键重复。
  • 锁定/解锁密钥功能。

ADP5588 键盘 - GPIO Linux 驱动程序

ADP5589 键盘 - GPIO Linux 驱动程序

你的问题有点模糊,所以我将把你链接到一些描述制作这种输入设备的页面:

  • 史蒂夫·曼恩的七分抠键手
  • 构建和使用 7 键和弦键盘

对于和弦来说,重要的是将按键与按键释放分开。这些操作会发送单独的扫描码,大多数键盘都使用它们。

如果您对逻辑特别感兴趣,那么阅读和弦键盘维基百科文章可能会有所帮助:

在恩格尔巴特的原始映射中,他使用了五个键:1,2,4,8,16。这 键映射如下:A = 1、B = 2、C = 3、D = 4,依此类推。如果 用户按下键 1 + 2 = 3 同时按下字母"C" 出现。

您需要做的是通过查看按下的键组合来确定所需的字符,但仅在释放所有键时发送该字符。

因此,如果我按下键 1 和 2,则设置键

1 和键 2 的位,但只有在我释放所有键时才会确定并发送字符,此时所有键位都会重置。

这只是一种方法。这是你的系统,你可以让它变得任意复杂。

也许您想将其基于n-gram频率并发送字符短语而不是单个字符。也许您想将其基于按下和释放的字母序列,具有任意和弦序列终止,而不是在您释放所有键时。这取决于你。

如果您使用的是普通键盘,而不是您自己构建的键盘,请注意按键翻转的问题。基本上,大多数键盘对可以同时按下哪些键都有限制。

答案取决于您使用的内核版本和体系结构。

如果您使用的是 3.1 或更高版本支持的体系结构,则可以使用 gpio-keys 驱动程序创建键盘事件设备文件,您可以在 OpenFirmware 设备树中配置该文件,然后从用户空间读取该文件。与 OP 中建议的方法相比,此方法的优点是不必编写任何新的内核代码,并且可以使用对设备事件文件执行阻塞读取的循环完全在用户空间中编写更高级别的驱动程序。(现在我意识到"不必编写任何新的内核代码"并不像编写自己的内核模块那么酷,所以这可能不是每个人都认为是一个优势;-(

即使您使用的是较旧的内核,您仍然可以使用较旧的"板文件"配置方法使用gpio_keys驱动程序,该方法使用 user3072817 建议作为解决方案的ADP5589 gpio 驱动程序。这仍然为您提供了设备文件的优势,您可以在其中从用户空间进行阻止读取。

要使用较新的 gpio 键方法,您需要将 gpio 键部分添加到主板的设备树中,该部分应位于 arch/<your arch>/boot/dts 中。绑定的语法在 gpio_keys.txt 中指定。您可以在此处查看BeagleBone上漫画触摸屏的gpio键设备树配置示例。此示例还显示了用 Python 编写的 gpio 密钥用户空间驱动程序。记得用CONFIG_KEYBOARD_GPIO编译你的内核。

最新更新