一个用户空间读取输入事件的例子
2013-12-19 20:32
155 查看
arm
linux设备驱 2010-08-13
20:37:56 阅读250 评论1 字号:大中小 订阅
这是一个读取触摸屏触摸事件的例子
实验程序:
#include
<sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <linux/input.h>
#include <stdlib.h>
#include <string.h>
int fd;
struct input_event event;
void input_handler(int signum)
{
if(read( fd, &event,
sizeof(struct input_event))<0)
{
perror("read:");
}
printf("tv_sec:%d\n",event.time.tv_sec);
printf("tv_usec:%d\n",event.time.tv_usec);
printf("type:%d\n",event.type);
printf("code:%d\n",event.code);
printf("value:%d\n",event.value);
}
main()
{
int oflags;
fd = open("/dev/event0", O_RDWR, S_IRUSR |
S_IWUSR);
if (fd != - 1)
{
signal(SIGIO, input_handler);
fcntl(fd,
F_SETOWN, getpid());
oflags =
fcntl(fd, F_GETFL);
fcntl(fd,
F_SETFL, oflags | FASYNC);
while(1)
{
sleep(100);
}
}
else
{
printf("device open failure\n");
}
}
实验结果:
上图是在等待触摸屏按下。
当触摸屏按下时终端上打印出上图信息。
这些信息是如何产生的:
看触摸屏驱动程序中当触摸屏按下时有如下事件报告函数:
input_report_abs(dev,
ABS_X, xp);
input_report_abs(dev,
ABS_Y, yp);
input_report_key(dev,
BTN_TOUCH, 1);
input_report_abs(dev,
ABS_PRESSURE, 1);
input_sync(dev);
type:
#define
EV_SYN 0x00
#define
EV_ABS 0x03
code:
#define
ABS_X 0x00
#define
ABS_Y 0x01
#define
ABS_PRESSURE 0x18
十进制是24
#define
SYN_REPORT 0
value:
分别是x坐标值300,y坐标值239,按下事件值1,同步事件值0。
还有就是事件发生时的时间值,秒,毫秒。
还有一个键盘事件的值没有打印出来一开始我也很纳闷儿,仔细一检查才发现驱动程序有bug。
在驱动源程序中有这样一句代码:
dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] =
BIT(BTN_TOUCH);
将其更改如下:
dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] |=
BIT_MASK(BTN_TOUCH);
BTN_TOUCH的定义是:
#define
BTN_TOUCH 0x14a
上面两个宏的定义在文件linux/bitops.h中
#define
BIT(nr) (1UL
<< (nr))
#define BIT_MASK(nr) (1UL
<< ((nr) % BITS_PER_LONG))
现在该明白问题在哪儿了吧,^_^
^_^。
当然这个代码不是linux内核源码,这是天嵌科技提供的驱动代码。
linux设备驱 2010-08-13
20:37:56 阅读250 评论1 字号:大中小 订阅
这是一个读取触摸屏触摸事件的例子
实验程序:
#include
<sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <linux/input.h>
#include <stdlib.h>
#include <string.h>
int fd;
struct input_event event;
void input_handler(int signum)
{
if(read( fd, &event,
sizeof(struct input_event))<0)
{
perror("read:");
}
printf("tv_sec:%d\n",event.time.tv_sec);
printf("tv_usec:%d\n",event.time.tv_usec);
printf("type:%d\n",event.type);
printf("code:%d\n",event.code);
printf("value:%d\n",event.value);
}
main()
{
int oflags;
fd = open("/dev/event0", O_RDWR, S_IRUSR |
S_IWUSR);
if (fd != - 1)
{
signal(SIGIO, input_handler);
fcntl(fd,
F_SETOWN, getpid());
oflags =
fcntl(fd, F_GETFL);
fcntl(fd,
F_SETFL, oflags | FASYNC);
while(1)
{
sleep(100);
}
}
else
{
printf("device open failure\n");
}
}
实验结果:
上图是在等待触摸屏按下。
当触摸屏按下时终端上打印出上图信息。
这些信息是如何产生的:
看触摸屏驱动程序中当触摸屏按下时有如下事件报告函数:
input_report_abs(dev,
ABS_X, xp);
input_report_abs(dev,
ABS_Y, yp);
input_report_key(dev,
BTN_TOUCH, 1);
input_report_abs(dev,
ABS_PRESSURE, 1);
input_sync(dev);
type:
#define
EV_SYN 0x00
#define
EV_ABS 0x03
code:
#define
ABS_X 0x00
#define
ABS_Y 0x01
#define
ABS_PRESSURE 0x18
十进制是24
#define
SYN_REPORT 0
value:
分别是x坐标值300,y坐标值239,按下事件值1,同步事件值0。
还有就是事件发生时的时间值,秒,毫秒。
还有一个键盘事件的值没有打印出来一开始我也很纳闷儿,仔细一检查才发现驱动程序有bug。
在驱动源程序中有这样一句代码:
dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] =
BIT(BTN_TOUCH);
将其更改如下:
dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] |=
BIT_MASK(BTN_TOUCH);
BTN_TOUCH的定义是:
#define
BTN_TOUCH 0x14a
上面两个宏的定义在文件linux/bitops.h中
#define
BIT(nr) (1UL
<< (nr))
#define BIT_MASK(nr) (1UL
<< ((nr) % BITS_PER_LONG))
现在该明白问题在哪儿了吧,^_^
^_^。
当然这个代码不是linux内核源码,这是天嵌科技提供的驱动代码。
相关文章推荐
- 一个用户空间读取输入事件的例子
- Java 小例子:读取控制台的用户输入
- Java 小例子:读取控制台的用户输入
- 对于内核输入系统驱动(例如keypad, sensor, touch panel),内核如何发送事件给用户空间
- java小例子:读取控制台用户输入数据
- C#--第2周实验--任务2(1)--用户输入一个字符,并用Console类的Readkey()方法读取该字符,并在控制台上输出该字符
- 分享一个Go按行读取命令行输入的例子
- C#--第2周实验--任务2(1)--用户输入一个字符,并用Console类的Readkey()方法读取该字符,并在控制台上输出该字符(改进版)
- Java 小例子:读取控制台的用户输入
- 每日一题(44)—— 请列举一个软件中时间换空间或者空间换时间的例子
- Oracle10g创建一个完整的用户、表空间
- 提示用户通过键盘输入一个用户名,来判断这个用户是否存在,如果存在就显示一下用户默认的shell
- 编写一个程序,接受用户的输入并保存为新的文件
- 例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“#”为止。
- 一个例子理解Rxjava的事件流转换原理
- 判断用户输入的一个整数是否在以已知数组中
- 编写一个程序,用于接收用户输入的数,然后显示从0到该数为止表示的所有字符,询问用户是否愿意再次继续同样的过程
- 黑马程序员---------------------编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期, * 程序计算这一天是星期几,并且计算出是一年中的第几天
- //编写一个程序,显示用户输入的一个日期是该年度的第几天。
- 一个C#写的模拟键盘输入的例子