Linux获取/dev/input目录下的event对应的设备

http://blog.youkuaiyun.com/qq_21792169/article/details/51458855
当我们在Linux操作系统下使用input子系统时,当我们先插鼠标,在插上摄像头与先插摄像头,在插鼠标,操作系统为两个设备分配的event号不是固定的,先插上的是event0,后插上的是event1 。那么问题来了,我们写应用程序,我们怎么知道那个设备对应那个event接口,我们不可能认为指定使用那个接口,因为有时候插播顺序并不一致,下面我用代码来获取event接口。

使用cat /proc/bus/input/devices  

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

主要观察打印信息,Name项是不一样的,我们就可以从这里下手,读取到这个名字,然后在这一类中读取event的值。
[html] view plain copy
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <sys/types.h>  
  4. #include <sys/stat.h>  
  5. #include <unistd.h>  
  6. #include <string.h>  
  7.  #include <sys/mman.h>  
  8.   
  9. //#define DBG_PRINTF(...)    
  10. #define DBG_PRINTF printf  
  11.   
  12. char *command="cat /proc/bus/input/devices > log.txt" ;  
  13. char *file_path="./log.txt";  
  14. char  *file_buff;  
  15.  int number;  
  16. int find_event()  
  17. {  
  18.     int iFd;  
  19.     FILE *tFp;  
  20.     struct stat tStat;  
  21.     char *sub_buff="Handlers=mouse1";    
  22.     /* according  to mouse name find event number*/  
  23.       
  24.     char *buff;  
  25.   
  26.     tFp=fopen(file_path,"r+");    /* check if have log.txt file */  
  27.     if(NULL!=tFp)  
  28.     {  
  29.       fclose(tFp);  
  30.       system("rm log.txt");  
  31.     }  
  32.   
  33.     system(command);  
  34.     /* 打开文件 */  
  35.     tFp = fopen(file_path, "r+");  
  36.     if (tFp == NULL)  
  37.     {  
  38.         DBG_PRINTF("can't open %s\n", file_path);  
  39.         return -1;  
  40.     }  
  41.       
  42.     iFd = fileno(tFp);  
  43.   
  44.     fstat(iFd, &tStat);  
  45.      /* mmap the file to mem */  
  46.     file_buff = (unsigned char *)mmap(NULL , tStat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, iFd, 0);  
  47.     if (file_buff== (unsigned char *)-1)  
  48.     {  
  49.         DBG_PRINTF("mmap error!\n");  
  50.         return -1;  
  51.     }  
  52.     buff=strstr(file_buff,sub_buff);/* in the mem file_buff  find sub_buff name */  
  53.     if(NULL==buff)  
  54.     {  
  55.         DBG_PRINTF("can't find %s\n",sub_buff);  
  56.         munmap(file_buff, tStat.st_size);  
  57.         return -1;  
  58.     }  
  59.        number=*(buff+strlen(sub_buff)+6);/* 6== event */  
  60.     munmap(file_buff, tStat.st_size);  
  61.     fclose(tFp);  
  62.     return  0;  
  63.   
  64. }  
  65.   
  66. int main(int argc, char **argv)  
  67. {  
  68.    find_event();  
  69.   DBG_PRINTF("event%d\n",number-'0');  
  70.   return 0;  
  71. }  


遇到同样的问题我们可以采取同样的措施,先映射到内存上,再来查找。也可以直接使用fopen打开文件,然后使用fgets函数来读取到buf中,在使用strstr来查找。

查看CPU信息:cat /proc/cpuinfo  
  
查看内存信息:cat /proc/meminfo  
  
查看USB设备:cat /proc/bus/usb/devices  
  
查看键盘和鼠标:cat /proc/bus/input/devices  
  
查看各分区使用情况:df  
查看体系结构:busybox uname -a  
  
查看中断信息:cat /proc/interrupts  
版权声明:Linux嵌入式交流加:Linux_Google 请备注优快云 http://blog.youkuaiyun.com/qq_21792169/article/details/51458855


参考资料:

1.Linux如何查看与/dev/input目录下的event对应的设备

http://blog.youkuaiyun.com/cupidove/article/details/23122645

<think>首先,用户的问题是关于Linux系统中/dev/input/jsx对应设备。我需要根据系统级指令来回答。 系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考的站内引用: - [^1]: 关于jsX设备识别和测试命令。 - [^2]: 关于/dev/input/eventX设备的说明。 - [^3]: Linux Input子系统的架构。 - [^4]: dev_t数据类型的定义。 - [^5]: joy package在ROS中的使用。 用户的问题是:我想了解在Linux系统中/dev/input/jsx对应设备。 所以,我需要解释/dev/input/jsx是什么设备。 从引用中: - [^1]提到:如果出现了jsX,说明Linux成功识别了你的游戏手柄。 - [^2]提到:基于input子系统注册的设备在/dev/input/下生成eventX节点。 - [^3]详细描述了Linux Input子系统,支持游戏手柄等设备。 - [^5]提到joy package为Linux操纵杆提供驱动。 因此,/dev/input/jsx 通常对应于游戏手柄或操纵杆设备。jsX中的X是一个数字,表示设备的索引。 在Linux中: - /dev/input/eventX 是输入事件的通用设备节点,用于所有输入设备。 - /dev/input/jsX 是专门为操纵杆(joystick)设备创建的设备节点。 所以,/dev/input/jsx 对应的是操纵杆或游戏手柄设备。 我的回答应该结构清晰: 1. 解释设备是什么。 2. 如何识别和使用。 3. 生成相关问题。 使用中文回答。 生成相关问题:在回答末尾添加相关问题,如指令所要求。 引用标识:在回答中引用段落时添加引用标识。例如,如果我引用[^1],就在末尾加[^1]。 回答结构: - 先介绍设备:/dev/input/jsx 是Linux系统中用于操纵杆或游戏手柄的设备节点。 - 解释如何工作:基于Input子系统。 - 参考引用:自然地融入引用。 例如: 根据Linux Input子系统[^3],/dev/input/jsx 是专门为操纵杆设备创建的节点。当游戏手柄被识别时,系统会生成这样的节点[^1]。 生成相关问题: - 如何测试游戏手柄在Linux中? - 什么是Input子系统? - 如何编写驱动支持游戏手柄? 确保LaTeX正确:用户问题中没有数学内容,但如果有,我会使用$...$或$$...$$。这里可能不需要。 最终回答: 1. 清晰解释。 2. 生成相关问题。</think>### Linux系统中/dev/input/jsx对应设备Linux系统中,`/dev/input/jsx`(其中`x`是一个数字,例如`js0`、`js1`等)是专门为**操纵杆(joystick)或游戏手柄(gamepad)**设备创建的设备节点。这些节点属于Linux Input子系统的一部分,用于处理输入设备的标准化事件。下面我将逐步解释其工作原理和相关细节: 1. **设备的基本定义**: - `/dev/input/jsx` 是操纵杆设备的字符设备节点(character device)。当Linux内核识别到物理游戏手柄(如USB手柄)时,输入子系统会自动在`/dev/input/`目录下生成对应的`jsx`节点[^1][^3]。 - 例如,如果系统检测到一个手柄,它可能生成`/dev/input/js0`;多个设备时,数字`x`会递增(如`js1`、`js2`)。 - 这些节点提供对操纵杆按钮、轴(axes)和方向键事件的直接访问,用户空间程序(如游戏或测试工具)可以通过读取这些节点来获取输入数据。 2. **与Input子系统的关系**: - Linux Input子系统是一个统一的框架,用于管理键盘、鼠标、触摸屏、游戏手柄等多种输入设备。它屏蔽硬件差异,为用户空间提供一致的接口[^3]。 - 操纵杆设备驱动在Input子系统注册后,会生成两类节点: - `/dev/input/eventx`:通用输入事件节点,适用于所有设备(如键盘、鼠标),提供原始事件数据(如按键、坐标)。 - `/dev/input/jsx`:专为操纵杆优化,提供更结构化的数据(如按钮状态和轴位置),便于游戏或模拟器使用[^3][^5]。 - 例如,在ROS(机器人操作系统)中,`joy_node`会读取`/dev/input/jsx`节点,发布`Joy`消息来处理手柄输入[^5]。 3. **如何识别和使用**: - **检查设备**:在终端运行`ls /dev/input/`命令,列出所有输入设备节点。如果看到`jsx`文件(如`js0`),表示系统已识别游戏手柄[^2][^1]。 - **测试设备**:使用`jstest`工具测试手柄功能。例如: ```bash sudo jstest /dev/input/js0 # 替换x为实际数字 ``` 这将输出按钮和轴的实时状态,帮助验证手柄是否正常工作[^1]。 - **编程访问**:开发者可以通过打开`/dev/input/jsx`文件(使用C/Python等),读取`struct js_event`结构的数据来获取输入事件。例如,在Python中使用`evdev`库。 4. **注意事项**: - **权限问题**:普通用户可能需要sudo权限访问`/dev/input/jsx`。可添加用户到`input`组解决:`sudo usermod -aG input $USER`。 - **设备冲突**:如果手柄未被识别,检查内核驱动(如`joydev`模块是否加载:`lsmod | grep joydev`)。 - **替代节点**:某些系统可能只生成`/dev/input/eventx`节点,但`jsx`专为操纵杆设计,提供更友好的API[^3][^5]。 总之,`/dev/input/jsx`是Linux中游戏手柄或操纵杆的标准接口,简化了输入事件处理。如果您的手柄已连接但未出现`jsx`节点,请检查驱动支持或系统日志(`dmesg | grep input`)[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值