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

我自己的linux和弦键盘驱动程序和嵌入式应用程序接口,linux,linux-kernel,linux-device-driver,embedded-linux,Linux,Linux Kernel,Linux Device Driver,Embedded 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);

我想开发我自己的键盘驱动程序到我自己的键盘。我必须使用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
}
#包括
#包括
#定义GPIO 1//GPIO引脚
...
if(gpio_请求(gpio,“说明”)){
例外情况
}
gpio_方向_输入(gpio);
...
int-irq=0;
如果((irq=gpio_至_irq(gpio))<0){
例外情况
}
…
int init_模块(){
int result=request_irq(GPIO、handler_func、IRQF_TRIGGER_LOW、“Description”、“Device id”);
如果(结果){
例外情况
}
}
void handler_func(…){
//通过i2c获取扫描代码
}
我需要开发一个接口,并且必须处理以下操作

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

按键1(直接按下)应显示“1”
F1+1键(同时按下)应显示“a”
F2+键1(同时按下)应显示“b”
F3+1键(同时按下)应显示“c”


我的问题是我应该如何开发这个界面?

您的问题有点含糊不清,因此我将把您链接到一些页面,介绍如何制作这种输入设备:

对于和弦来说,重要的是将按键和释放键分开。这些操作分别发送和

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

在恩格尔巴特的原始地图中,他使用了五个键:1、2、4、8、16。这个 关键点映射如下:a=1、b=2、c=3、d=4,依此类推。如果 用户同时按下1+2=3键,输入字母“c” 出现了

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

因此,如果我按下键1和键2,那么键1和键2的位被设置,但是只有在我释放所有键时,字符才被确定并发送,此时所有键位都被重置

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

也许你想基于它发送字符短语而不是单个字符。也许你想把它建立在按下和释放字母序列的基础上,以任意和弦序列终止,而不是当你释放所有键时。这取决于你


如果您使用的是普通键盘,而不是您自己制作的键盘,请注意键盘的问题。基本上,大多数键盘都有同时按键的限制。

您最好遵循模拟设备的键盘和GPIO Linux驱动程序。我将把你链接到一些GPIO驱动程序

此驱动程序包括这些功能

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


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

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

即使您使用的是较旧的内核,也可以使用ADP5589 gpio驱动程序中使用的较旧的“板文件”配置方法来使用gpio_密钥驱动程序,该方法被推荐为解决方案。这仍然为您提供了设备文件的优势,您可以在该文件上执行从用户空间的阻塞读取


要使用较新的gpio密钥方法,您需要在电路板的设备树中添加gpio密钥部分,该部分应位于
arch//boot/dts
中。绑定的语法在中指定。您可以在BeagleBone上看到Manga触摸屏的gpio按键设备树配置示例。这个示例还显示了一个用Python编写的gpio密钥用户空间驱动程序。记得用
CONFIG\u KEYBOARD\u GPIO编译内核

非常感谢。这对我更有帮助