1、问题
通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序
代码是在unbuntu10.04编译执行通过的
2、input_event描述
在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作就是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为Input子系统已经完成了文件操作接口
linux/input.h 这个文件定义了event事件的结构体,API和标准按键的编码等;
struct input_event {
struct timeval time; //按键时间
__u16 type; //事件类型
__u16 code; //要模拟成什么按键
__s32 value;//是按下还是释放
};
type,指事件类型,常见的事件类型有:
EV_KEY, 按键事件,如键盘的按键(按下哪个键),鼠标的左键右键(是非击下)等;
EV_REL, 相对坐标,主要是指鼠标的移动事件(相对位移);
EV_ABS, 绝对坐标,主要指触摸屏的移动事件
code:事件的代码.
如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.0~127为键盘上的按键代码
关于按键代码的定义,部分如下所示:
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_0 11
#define KEY_MINUS 12
#define KEY_EQUAL 13
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_Q 16
#define KEY_W 17
#define KEY_E 18
#define KEY_R 19
#define KEY_T 20
value:
事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_REL,value的正数值和负数值分别代表两个不同方向的值.
3、相关代码
key_simulator.c
#include
#include
#include
#include
#include
int main ()
{
int keys_fd;
char ret[2];
struct input_event t;
keys_fd = open ("/dev/input/event2", O_RDONLY);
if (keys_fd <= 0)
{
printf ("open /dev/input/event2 device error!\n");
return 0;
}
while (1)
{
if (read (keys_fd, &t, sizeof (t)) == sizeof (t))
{
if (t.type == EV_KEY)
if (t.value == 0 || t.value == 1)
{
printf ("key %d %s\n", t.code,
(t.value) ? "Pressed" : "Released");
if(t.code==KEY_ESC)
break;
}
}
}
close (keys_fd);
return 0;
}
4、注意问题
1)不同的类型计算机,设备对应event信息会有所不同
可以用cat获得的设备对应event信息:
# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
U: Uniq=
H: Handlers=kbd event0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0017 Vendor=0001 Product=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=mouse0 event1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input2
U: Uniq=
H: Handlers=kbd event2
B: EV=120013
B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input3
U: Uniq=
H: Handlers=mouse1 event3
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
I line:这行包含身份信息,显示了 bus type是 3 (usb), vendor, product, version等信息。
N line:这行包含了名字信息。
P line:这行包含了物理设备信息。
H line: 这行包含了与设备关联的 handler drivers。
B line: 这些行包含了显示设备能力的一些位域 (bitfield)。
我的键盘对应的事件类型是event2
2)open /dev/input/event2 device error
需要使用sudo或者改变设备的属性
如下:
sudo ./key_simulator
或者
chmod 777 /dev/input/event2
本文欢迎转载,转载请注明作者与出处
作者:流星
出处:http://blog.sina.com.cn/staratsky
分享到:
相关推荐
在QT框架下开发Linux应用程序时,获取键盘和鼠标事件是常见的需求,这有助于实现用户交互和界面控制。本文将深入探讨如何在Linux环境下利用QT库来捕获和处理这些事件。 首先,QT是一个跨平台的应用程序开发框架,...
// 处理键盘按下事件 ... return CallNextHookEx(keyboardHook, nCode, wParam, lParam); } return CallNextHookEx(keyboardHook, nCode, wParam, lParam); } ``` 5. 在应用程序关闭时卸载钩子: ```cpp ...
在Linux环境下,使用QT进行GUI应用程序开发时,往往需要对用户的键盘输入做出响应。本文将详细介绍如何在QT应用程序中捕获并处理键盘键值,实现简单的键盘事件监听功能。 #### 二、关键技术点 1. **QT键盘事件**:...
4. **设备文件**:对于字符设备驱动,按键驱动会在/dev目录下创建一个设备文件,用户空间程序可以通过读写这个文件来获取按键状态或发送命令。 5. **电源管理**:考虑到低功耗需求,驱动可能包含电源管理逻辑,比如...
这两个函数分别对应于按键按下和释放。 ```cpp void MyWidget::keyPressEvent(QKeyEvent *event) { // event->key()可以获取被按下的键盘键码 // 在这里添加你的处理代码 } void MyWidget::keyReleaseEvent...
同时,为了响应按键事件,可能还会有一个循环不断地检查ADC值,当检测到变化时,就触发相应的处理函数。 其次,`Makefile` 是构建系统的重要部分,用于编译和链接源代码。在Linux环境下,`make` 命令会根据`...
本篇将深入探讨如何在海思平台上编写GPIO按键驱动程序,利用中断机制来响应按键事件。 一、GPIO驱动基本原理 GPIO驱动是Linux内核的一部分,它负责初始化GPIO引脚,设置其方向(输入或输出),读取或设置引脚状态,...
它的主要任务是读取GPIO状态,确认按键是否真正被按下,然后可能更新内核中的输入子系统状态,以便应用程序可以通过标准的读取接口获取按键信息。 5. **中断去激活**:在按键释放时,可能也需要清除中断状态,以便...
驱动程序需要设置中断处理函数,例如 `irq_handler`,在接收到中断时响应并处理按键事件。 3. **I/O 编程**:驱动程序需要与 ARM11 SoC 上的 GPIO(通用输入/输出)端口交互,配置它们为输入模式,并可能使用边沿...
本篇文章将详细介绍如何在Linux环境下利用多线程来获取并打印键盘按键状态。 首先,我们需要了解Linux中的键盘事件处理机制。在Linux中,键盘输入被抽象为设备文件,通常位于`/dev/input`目录下,例如`/dev/input/...
而在Linux或Unix类系统中,可能需要利用`ncurses`库或者直接操作 `/dev/input/event*` 设备文件来获取键盘事件。 在C语言中,实现多按键处理的一个常见方法是使用轮询(polling)机制。例如,可以设置一个循环,...
例如,当一个进程正在读取按键状态时,其他进程可能也需要获取按键事件,这就需要我们用到互斥锁或信号量来保证数据的一致性。 3. 基于platform平台的按键驱动: Platform驱动主要用于板级设备,如SoC(System on ...
在分析输入子系统模型时,需要理解如何注册和管理设备节点,以及如何处理中断和polling机制来获取按键事件。 具体到MAX7359,开发者需要编写相应的驱动代码来初始化和配置该芯片,设置中断处理程序来响应按键按下和...
对于更复杂的系统,如Linux环境,可以使用`/dev/input`目录下的设备文件,通过读取它们来获取按键事件。 在实验3 "按键输入实验"中,学生可能会接触到以下几个关键知识点: 1. **硬件接口**:理解微控制器与外界...
设备产生的每一个动作(如按键按下、鼠标移动)都被封装成一个事件结构体,包含了事件类型、时间戳、设备特定的数据等信息。这些事件通过内核中的队列进行缓冲,然后按照顺序传递到用户空间。 四、内核-应用接口 1...
2. **事件上报**:当检测到返回键按下时,同样通过`input_event`及`input_sync`上报按键事件至Linux输入子系统。 3. **定时器回调**:通过定时器回调函数`keys_timer`处理按键抬起的状态。 #### 四、总结 通过对RK...
根据提供的文件信息,本文将详细解释如何在基于Linux/ARM/单片机的环境中使用状态机来实现对多个按键的扫描,并区分短按与长按的操作。本篇内容将涵盖以下知识点: ### 1. 按键扫描原理 #### 1.1 按键扫描简介 ...
- 每个注册的input设备都会在/dev/input目录下创建一个设备文件,用户空间程序通过打开、读取这个文件来获取设备事件。 - evtest工具就是一个例子,它可以用来测试和显示输入设备的事件。 7. 模块化设计: - ...
这个库就是为此目的设计的,它允许开发者在不依赖特定窗口的情况下捕获全局的鼠标点击、移动、释放以及键盘按键、释放事件。 对于Windows平台,库可能利用`WH_MOUSE_LL`和`WH_KEYBOARD_LL`低级钩子,这些钩子允许...