免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8201 | 回复: 5
打印 上一主题 下一主题

如何读写/dev/input/eventN [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-17 16:41 |只看该作者 |倒序浏览
我自己做了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文件有什么本质的区别。

以上就是我的问题,请大家指教,若有更好的系统解决方案,还望不吝赐教。小弟谢谢了

论坛徽章:
0
2 [报告]
发表于 2008-12-18 08:20 |只看该作者
自己顶一个

论坛徽章:
0
3 [报告]
发表于 2008-12-18 09:34 |只看该作者

回复 #1 immember 的帖子

搜个叫evtest的源程序编译下测测看

论坛徽章:
0
4 [报告]
发表于 2008-12-18 13:06 |只看该作者
原帖由 wqhl.mark 于 2008-12-18 09:34 发表
搜个叫evtest的源程序编译下测测看


谢谢wqhl.mark.
这个方法(evtest.c)可以操作/dev/input/eventN,但是有一些细节需要处理.我要好好研究一下

论坛徽章:
0
5 [报告]
发表于 2008-12-18 16:04 |只看该作者
主要看event与用户层的接口了!

论坛徽章:
0
6 [报告]
发表于 2008-12-19 16:13 |只看该作者
原帖由 force_eagle 于 2008-12-18 16:04 发表
主要看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的数据)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP