我想开发自己的键盘驱动程序到我自己的键盘。我必须使用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个字符 - &gt; “1”
2.特殊键组合用于输入其他3个字符
例如:
关键输入操作如下;
KEY1(直接按)应显示“1”
F1 + KEY1(同时按下)应显示“a”
F2 + KEY1(同时按下)应显示“b”
F3 + KEY1(同时按下)应显示“c”
我的问题是我该如何开发这个界面?
答案 0 :(得分:3)
您最好关注模拟设备的键盘和GPIO Linux驱动程序。我将把你链接到一些GPIO驱动程序。
此驱动程序包含这些功能
答案 1 :(得分:2)
您的问题有点模糊,所以我打算将您链接到一些描述制作此类输入设备的页面:
对于chording,重要的是将键按下与键释放分开。这些操作会单独发送scancodes和most keyboards use them。
如果您对逻辑特别感兴趣,那么阅读chorded keyboard维基百科文章可能会有所帮助:
在Engelbart的原始映射中,他使用了五个键:1,2,4,8,16。该 密钥映射如下:a = 1,b = 2,c = 3,d = 4,依此类推。如果 用户同时按下键1 + 2 = 3字母“c” 出现了。
您需要做的是通过查看按下的键的组合来确定所需的字符,但只有在释放所有键时才发送字符。
因此,如果我按下按键1和2,则按键1和按键2的位置位,但只有在释放所有按键时才会确定并发送该字符,此时所有按键位都会被重置。
这只是一种方法。这是你的系统,你可以任意复杂。
也许您希望将其基于n-gram frequency并发送字符短语而不是单个字符。也许您希望将其基于按下和释放的字母序列,以及任意和弦序列终止,而不是在释放所有键时。这取决于你。
如果您使用的是普通键盘,而不是自己构建的键盘,请注意key rollover的问题。基本上,大多数键盘都限制了可以同时按下哪些键。
答案 2 :(得分:1)
答案取决于您使用的内核版本和架构。
如果您使用的是3.1或更高版本支持的体系结构,则可以使用gpio-keys驱动程序创建键盘事件设备文件,您可以在OpenFirmware设备树中配置该文件,然后从用户空间读取。与OP中建议的方法相比,这种方法的优点是您不必编写任何新的内核代码,并且您可以使用在设备事件文件上执行阻塞读取的循环在用户空间中完全编写更高级别的驱动程序。 (现在我意识到“不必编写任何新的内核代码”并不像编写自己的内核模块那么酷,所以这可能并不是每个人的优势; - )
即使您使用的是较旧的内核,您仍然可以使用gpio_keys驱动程序,使用ADP5589 gpio驱动程序中使用的旧“板文件”配置方法,该驱动程序由user3072817建议作为解决方案。这仍然为您提供了一个设备文件的优势,您可以在该文件上从用户空间进行阻塞读取。
要使用较新的gpio-key方法,您需要在电路板的设备树中添加gpio-keys部分,该部分应位于arch/<your arch>/boot/dts
中。绑定的语法在gpio_keys.txt中指定。您可以在BeagleBone here上看到Manga触摸屏的示例gpio-keys设备树配置。此示例还显示了一个用Python编写的gpio-key用户空间驱动程序。请记住使用CONFIG_KEYBOARD_GPIO
编译内核。