翼度科技»论坛 云主机 LINUX 查看内容

嵌入式Linux—输入子系统

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
输入系统

常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与Linux系统进行数据交换。
内核中怎样表示一个输入设备
  1. // include/linux/input.h
  2. struct input_dev {
  3.         const char *name;  //设备名称
  4.         const char *phys;  //设备物理路径
  5.         const char *uniq;  //设备唯一标识码
  6.         struct input_id id;
  7.         unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
  8.         unsigned long evbit[BITS_TO_LONGS(EV_CNT)];   //支持什么类型的输入事件
  9.         unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; //支持按键输入事件的话,支持哪些按键(键盘)
  10.         unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; //支持相对位移事件的话,支持哪些
  11.         unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
  12.         unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
  13.         unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
  14.         unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
  15.         unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
  16.         unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
  17.        
  18.         .......
  19.        
  20.         };
复制代码
查看所有的输入设备:
  1. ls /dev/input/* -l
复制代码
查看输入设备的信息:
  1. cat /proc/bus/input/devices
复制代码
得到如下信息:
  1. [root@imx6ull:~]# cat /proc/bus/input/devices
  2. I: Bus=0019 Vendor=0000 Product=0000 Version=0000
  3. N: Name="20cc000.snvs:snvs-powerkey"
  4. P: Phys=snvs-pwrkey/input0
  5. S: Sysfs=/devices/soc0/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0
  6. U: Uniq=
  7. H: Handlers=kbd event0 evbug
  8. B: PROP=0
  9. B: EV=3
  10. B: KEY=100000 0 0 0
  11. I: Bus=0018 Vendor=dead Product=beef Version=28bb  //设备ID(定义在input.h的struct input_id结构体)
  12. N: Name="goodix-ts"      //名称
  13. P: Phys=input/ts         //物理地址
  14. S: Sysfs=/devices/virtual/input/input1  //sys系统地址
  15. U: Uniq=          //标识号(无)
  16. H: Handlers=event1 evbug
  17. B: PROP=2        //设备属性
  18. B: EV=b          //支持何种输入事件
  19. B: KEY=1c00 0 0 0 0 0 0 0 0 0 0   //设备具有的键
  20. B: ABS=6e18000 0
  21. I: Bus=0019 Vendor=0001 Product=0001 Version=0100
  22. N: Name="gpio-keys"
  23. P: Phys=gpio-keys/input0
  24. S: Sysfs=/devices/soc0/gpio-keys/input/input2
  25. U: Uniq=
  26. H: Handlers=kbd event2 evbug
  27. B: PROP=0
  28. B: EV=3
  29. B: KEY=c
复制代码
APP可以获得什么数据
  1. // include/linux/input.h
  2. struct input_value {
  3.         __u16 type;   //当前数据的事件类型
  4.         __u16 code;   //当前事件类型下的哪一个事件
  5.         __s32 value;  //
  6. };
复制代码
Type的内容:
  1. // include/uapi/linux/input-event-codes.h
  2. /*
  3. * Event types
  4. */
  5. #define EV_SYN                        0x00  //同步事件
  6. #define EV_KEY                        0x01  //键盘事件
  7. #define EV_REL                        0x02  //相对位移事件
  8. #define EV_ABS                        0x03  //绝对位移事件
  9. #define EV_MSC                        0x04
  10. #define EV_SW                        0x05
  11. #define EV_LED                        0x11
  12. #define EV_SND                        0x12
  13. #define EV_REP                        0x14
  14. #define EV_FF                        0x15
  15. #define EV_PWR                        0x16
  16. #define EV_FF_STATUS                0x17
  17. #define EV_MAX                        0x1f
  18. #define EV_CNT                        (EV_MAX+1)
复制代码
code的内容(以EV_KEY举例)
  1. // include/uapi/linux/input-event-codes.h
  2. #define KEY_RESERVED                0
  3. #define KEY_ESC                        1
  4. #define KEY_1                        2
  5. #define KEY_2                        3
  6. #define KEY_3                        4
  7. #define KEY_4                        5
  8. #define KEY_5                        6
  9. #define KEY_6                        7
  10. #define KEY_7                        8
  11. #define KEY_8                        9
  12. #define KEY_9                        10
  13. #define KEY_0                        11
复制代码
获取输入设备信息实例

两个ioctl的request参数说明(input.h)

request说明EVIOCGID返回输入设备IDEVIOCGBIT(ev,len)获取输入设备支持的事件类型列表ev值的说明:ev参数表示要获取的事件类型,它是一个整数值

  • 当ev=0,表示要获取输入设备支持的所有事件类型列表,包括键盘事件、鼠标事件、相对事件、绝对事件、事件同步、杂项事件等。
  • 当ev=1,表示要获取输入设备支持的键盘事件类型列表。
  • 当ev=2,表示要获取输入设备支持的相对事件类型列表。
EVIOCGBIT的iotcl调用说明:必须使用
  1. len = ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit);   
  2. //len是evbit的实际读取大小,如果单独使用sizeof(evbit)得到len,将发生段错误
复制代码
源码:

[code]#include #include #include #include #include #include /* 用法:./get_input_info /dev/input/event0 */int main(int argc, char const **argv){        int fd;        struct input_id id;        int err;        unsigned char byte;        unsigned int evbit[2];        int i;        int bit;        unsigned int len;        char *ev_names[] = {                "EV_SYN ",                "EV_KEY ",                "EV_REL ",                "EV_ABS ",                "EV_MSC ",                "EV_SW        ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "NULL ",                "EV_LED ",                "EV_SND ",                "NULL ",                "EV_REP ",                "EV_FF        ",                "EV_PWR ",        };        if(argc != 2)         {                printf("Usage: %s \n", argv[0]);                return -1;        }        fd = open(argv[1], O_RDWR);        if(fd == -1)         {                printf("can not open %s\n", argv[1]);                return -1;        }        err = ioctl(fd, EVIOCGID, &id);      //返回输入设备ID        if(err == 0)        {                printf("bustype = 0x%x\n", id.bustype );                printf("vendor        = 0x%x\n", id.vendor  );                printf("product = 0x%x\n", id.product );                printf("version = 0x%x\n", id.version );        }        len = ioctl(fd, EVIOCGBIT(0,sizeof(evbit)), evbit);   //返回输入事件类型        printf("support ev type:\n");        for(i = 0;i < len;i++)        {                byte = ((unsigned char *)evbit);                for(bit = 0;bit < 8;bit++)                {                        if(byte & (1

上一篇: Ubuntu安装Zabbix6.0

下一篇: IO多路复用

举报 回复 使用道具