2012年(44)
分类: LINUX
2012-08-08 17:00:52
2010-08-13 20:37:56| 分类: arm linux设备驱 | 标签: |字号大中小
这是一个读取触摸屏触摸事件的例子
实验程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
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");
}
}
实验结果:
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内核源码,这是天嵌科技提供的驱动代码。