如何读写/dev/input/eventN
我自己做了USB hid 设备,暂定为joystick(不是mouse或keyboard),其作用就是向PC上传数据,同时接受PC下行数据。在windows可以通过bushound看到这些上传的数据,当然也可以接受PC下行数据。现在到了linux-2.6.26系统下,遇到了以下问题:
1。FC8(linux-2.6.26)系统默认把usbhid驱动编入到了内核中,而不是编译成可卸载的模块(.ko文件),这样我的usb设备一插入就被usbhid截获,无法自己写驱动。由于编写的是应用软件,不能编译用户机器的内核,所以不考虑重新编译内核。
2。基于问题1,我考虑读写设备文件,但是却读不到数据。我的usb设备对应的设备文件是event5。读写代码如下:
///////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
int main()
{
int fd, retval;
unsigned char buf[13];
fd_set readfds;
struct timeval tv;
fd = open("/dev/input/event5", O_RDONLY);
if(!fd)
{
printf("Failed to open \"/dev/input/js1\"\n");
return -1;
}
while(1)
{
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
if((retval = select(fd+1, &readfds, NULL, NULL, &tv)) == 1)
{
if(read(fd, buf, 12) <= 0)
{
//printf("read fail ... \n");
continue;
}
//printf("Button type = %d, X = %d, Y = %d\n", (buf[0] & 0x07), buf[1], buf[2]);
printf("0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x \n",
buf[0], buf[1], buf[2],buf[3],buf[4], buf[5], buf[6],buf[7],buf[8], buf[9], buf[10],buf[11]);
//sleep(1);
}
}
close(fd);
return 0;
}
///////////////////////////////////////////////////////////
但是没有任何反应。可是 cat /dev/input/event5 却有乱码。
3。/dev/input 下有多个event文件,有的是键盘的设备文件,可是我的这段代码都不能读取event的数据。哪位知道event的读写方法吗?
4。/dev/input 下的mouse文件是可以通过我的代码读取的,mouse文件和event文件有什么本质的区别。
以上就是我的问题,请大家指教,若有更好的系统解决方案,还望不吝赐教。小弟谢谢了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
自己顶一个
搜个叫evtest的源程序编译下测测看
谢谢wqhl.mark.
这个方法(evtest.c)可以操作/dev/input/eventN,但是有一些细节需要处理.我要好好研究一下
主要看event与用户层的接口了!
我使用 cat /proc/bus/input/devices ,有如下结果:
I: Bus=0003 Vendor=1234 Product=5678 Version=0111
N: Name="Test Joy"
P: Phys=usb-0000:00:1d.3-1/input3
S: Sysfs=/class/input/input4
U: Uniq=TestJoy
H: Handlers=event4
B: EV=9
B: ABS=ffff00 0
然后我使用evtest.c经过简单修改读取数据,可是为什么每次读取的数据长度都是变的。(我的usb设备每10ms固定上传12个byte的数据)