From 7ca18a5eb79309a6981f53314f45d584b3a192e9 Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Mon, 17 Jun 2024 21:55:31 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=88=9B=E5=BB=BA20=5Finput=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C=E6=96=87=E4=BB=B6=EF=BC=8C=E5=B9=B6=E6=94=B9=E5=90=8D?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 20_input/.vscode/c_cpp_properties.json | 21 ++++ 20_input/.vscode/settings.json | 21 ++++ 20_input/Makefile | 13 +++ 20_input/keyinput.c | 136 +++++++++++++++++++++++++ 20_input/keyinput.code-workspace | 10 ++ 20_input/keyinputApp.c | 49 +++++++++ 6 files changed, 250 insertions(+) create mode 100644 20_input/.vscode/c_cpp_properties.json create mode 100644 20_input/.vscode/settings.json create mode 100644 20_input/Makefile create mode 100644 20_input/keyinput.c create mode 100644 20_input/keyinput.code-workspace create mode 100644 20_input/keyinputApp.c diff --git a/20_input/.vscode/c_cpp_properties.json b/20_input/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..7ee3d5b --- /dev/null +++ b/20_input/.vscode/c_cpp_properties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/**", + "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/**", + "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated/**", + "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers/**" + ], + "defines": [], + "compilerPath": "/usr/bin/clang", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "clang-x64" + } + ], + "version": 4 +} + diff --git a/20_input/.vscode/settings.json b/20_input/.vscode/settings.json new file mode 100644 index 0000000..1a2a04a --- /dev/null +++ b/20_input/.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "search.exclude": { + "**/node_modules": true, + "**/bower_components": true, + "**/*.o":true, + "**/*.su":true, + "**/*.cmd":true, + "Documentation":true, + }, + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/*.o":true, + "**/*.su":true, + "**/*.cmd":true, + "Documentation":true, + } +} \ No newline at end of file diff --git a/20_input/Makefile b/20_input/Makefile new file mode 100644 index 0000000..c8ee05b --- /dev/null +++ b/20_input/Makefile @@ -0,0 +1,13 @@ +KERNELDIR := /home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga +CURRENT_PATH := $(shell pwd) +obj-m := key.o + +build: kernel_modules + +kernel_modules: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean + + diff --git a/20_input/keyinput.c b/20_input/keyinput.c new file mode 100644 index 0000000..d8dc4c4 --- /dev/null +++ b/20_input/keyinput.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KEY_CNT 1 /* 设备号个数 */ +#define KEY_NAME "key" /* 名字 */ + +/* 定义按键值 */ +#define KEY0VALUE 0xF0 /* 按键值*/ +#define INVAKEY 0x00 /* 无效的按键值 */ + + +/* key设备结构体 */ +struct key_dev{ + dev_t devid; /* 设备号 */ + struct cdev cdev; /* cdev */ + struct class *class; /* 类 */ + struct device *device; /* 设备 */ + int major; /* 主设备号 */ + int minor; /* 次设备号 */ + struct device_node *nd; /* 设备节点 */ + int key_gpio; + atomic_t keyvalue; /* 按键值*/ +}; + +struct key_dev keydev; + +static int key_open(struct inode *inode, struct file *filp) +{ + filp->private_data = &keydev; + keydev.nd = of_find_node_by_path("/key"); + if(keydev.nd == NULL){ + return -EINVAL; + } + + keydev.key_gpio = of_get_named_gpio(keydev.nd, "key-gpio",0); + if(keydev.key_gpio < 0) { + printk("can't get key0\r\n"); + return -EINVAL; + } + printk("key_gpio = %d\r\n", keydev.key_gpio); + /* 初始化key所使用的IO */ + gpio_request(keydev.key_gpio, "key0"); + gpio_direction_input(keydev.key_gpio); + + return 0; +} + +static ssize_t key_read(struct file *filp, char __user *buf, + size_t cnt,loff_t *offt) +{ + int ret = 0; + unsigned char value; + struct key_dev *dev = filp->private_data; + if(gpio_get_value(dev->key_gpio) == 0){ + while(!gpio_get_value(dev->key_gpio)) + ; + atomic_set(&dev->keyvalue,KEY0VALUE); + }else{ + atomic_set(&dev->keyvalue,INVAKEY); + } + value = atomic_long_read(&dev->keyvalue); + ret = copy_to_user(buf,&value,sizeof(value)); + return ret; +} + +static struct file_operations key_fops = { + .owner = THIS_MODULE, + .open = key_open, + .read = key_read, +}; + +static __init mykey_init(void) +{ + /* 初始化源自变量 */ + atomic_set(&keydev.keyvalue,INVAKEY); + /* 注册字符设备驱动 */ + /* 1、创建设备号 */ + if(keydev.major){ /* 如果定义了设备号 */ + keydev.devid = MKDEV(keydev.major,0); + register_chrdev_region(keydev.devid,KEY_CNT,KEY_NAME); + }else { /* 没有定义设备号 */ + alloc_chrdev_region(&keydev.devid,0,KEY_CNT,KEY_NAME); + keydev.major = MAJOR(keydev.devid); /* 获取分配的主设备号 */ + keydev.minor = MINOR(keydev.devid); /* 获取分配的次设备号 */ + } + + /* 2、初始化cdev */ + keydev.cdev.owner = THIS_MODULE; + cdev_init(&keydev.cdev,&key_fops); + + /* 3、添加一个cdev */ + cdev_add(&keydev.cdev,keydev.devid,KEY_CNT); + /* 4、创建类 */ + keydev.class = class_create(THIS_MODULE,KEY_NAME); + if(IS_ERR(keydev.class)){ + return PTR_ERR(keydev.class); + } + + /* 5、创建设备 */ + keydev.device = device_create(keydev.class,NULL,keydev.devid,NULL,KEY_NAME); + if(IS_ERR(keydev.device)){ + return PTR_ERR(keydev.device); + } + + return 0; +} + +static __exit mykey_exit(void) +{ + //注销字符设备驱动 + gpio_free(keydev.key_gpio); + cdev_del(&keydev.cdev); + unregister_chrdev_region(keydev.devid,KEY_CNT); + + device_destroy(keydev.class,keydev.devid); + class_destroy(keydev.class); +} + +module_init(mykey_init); +module_exit(mykey_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("zhangchaoliang"); diff --git a/20_input/keyinput.code-workspace b/20_input/keyinput.code-workspace new file mode 100644 index 0000000..f5bceea --- /dev/null +++ b/20_input/keyinput.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings":{ + + } +} \ No newline at end of file diff --git a/20_input/keyinputApp.c b/20_input/keyinputApp.c new file mode 100644 index 0000000..52d7b5a --- /dev/null +++ b/20_input/keyinputApp.c @@ -0,0 +1,49 @@ +#include "stdio.h" +#include "unistd.h" +#include "sys/types.h" +#include "sys/stat.h" +#include "fcntl.h" +#include "stdlib.h" +#include "string.h" + + +/* 定义按键值 */ +#define KEY0VALUE 0xF0 +#define INVAKEY 0x00 + + +/* + +*/ +int main(int argc, char *argv[]){ + int fd, ret; + char *filename; + unsigned char keyvalue; + if (argc != 2) { + printf("Error Usage!\r\n"); + return -1; + } + + filename = argv[1]; + fd = open(filename, O_RDWR); + if(fd < 0) { + printf("file %s open failed\r\n",argv[1]); + return -1; + } + + // 循环读取按键数据! + while(1){ + read(fd,&keyvalue,sizeof(keyvalue)); + if(keyvalue == KEY0VALUE) { + printf("KEY0 Press,value = %#x\r\n",keyvalue);// 按下 + } + } + + ret = close(fd); // close文件 + if(ret <0){ + printf("file %s close failed\r\n",argv[1]); + return -1; + } + + return 0; +} -- Gitee From c8b53553e028d8a730f3758106d2c0b35e0304ad Mon Sep 17 00:00:00 2001 From: D301_Ubuntu <1395769145@qq.com> Date: Tue, 18 Jun 2024 17:28:48 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0input=E5=AD=90=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=AE=9E=E9=AA=8C=EF=BC=8C=E9=A9=B1=E5=8A=A8=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=86=85=E5=AE=B9=E7=BC=96=E5=86=99=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=B9=B6=E7=BC=96=E8=AF=91=E9=80=9A=E8=BF=87=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E5=86=99app=E6=96=87=E4=BB=B6=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: D301_Ubuntu <1395769145@qq.com> --- 20_input/.vscode/c_cpp_properties.json | 45 +++++- 20_input/Makefile | 4 +- 20_input/keyinput.c | 201 ++++++++++++++----------- 20_input/keyinput.code-workspace | 8 +- 4 files changed, 155 insertions(+), 103 deletions(-) diff --git a/20_input/.vscode/c_cpp_properties.json b/20_input/.vscode/c_cpp_properties.json index 7ee3d5b..94ece73 100644 --- a/20_input/.vscode/c_cpp_properties.json +++ b/20_input/.vscode/c_cpp_properties.json @@ -3,19 +3,48 @@ { "name": "Linux", "includePath": [ + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/asm", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", "${workspaceFolder}/**", - "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/**", - "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/**", - "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated/**", - "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers/**" + "${default}" ], - "defines": [], - "compilerPath": "/usr/bin/clang", + "defines": ["__KERNEL__","__linux__"], + "compilerPath": "/usr/bin/g++", "cStandard": "c11", "cppStandard": "c++17", - "intelliSenseMode": "clang-x64" + "intelliSenseMode": "gcc-x64", + "browse": { + "path": [ + "${workspaceFolder}", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/asm", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", + "${workspaceFolder}/**", + "${default}" + ] + } + }, + { + "name": "Win32", + "includePath": [ + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/asm", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", + "${workspaceFolder}/**", + "${default}" + ], + "defines": ["__KERNEL__","__linux__"], + "compilerPath": "C:/Qt/Qt5.12.9/Tools/mingw730_64/bin/gcc.exe", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "linux-gcc-x64" } ], "version": 4 } - diff --git a/20_input/Makefile b/20_input/Makefile index c8ee05b..6cac2dd 100644 --- a/20_input/Makefile +++ b/20_input/Makefile @@ -1,6 +1,6 @@ -KERNELDIR := /home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga +KERNELDIR := ../../../linux-imx-rel_imx_4.1.15_2.1.0_ga CURRENT_PATH := $(shell pwd) -obj-m := key.o +obj-m := keyinput.o build: kernel_modules diff --git a/20_input/keyinput.c b/20_input/keyinput.c index d8dc4c4..b7d9a80 100644 --- a/20_input/keyinput.c +++ b/20_input/keyinput.c @@ -11,126 +11,145 @@ #include #include #include +#include #include +#include #include #include - -#define KEY_CNT 1 /* 设备号个数 */ -#define KEY_NAME "key" /* 名字 */ - -/* 定义按键值 */ -#define KEY0VALUE 0xF0 /* 按键值*/ -#define INVAKEY 0x00 /* 无效的按键值 */ - - -/* key设备结构体 */ -struct key_dev{ - dev_t devid; /* 设备号 */ - struct cdev cdev; /* cdev */ - struct class *class; /* 类 */ - struct device *device; /* 设备 */ - int major; /* 主设备号 */ - int minor; /* 次设备号 */ - struct device_node *nd; /* 设备节点 */ - int key_gpio; - atomic_t keyvalue; /* 按键值*/ +#include + +#define KEYINPUT_CNT 1 +#define KEYINPUT_NAME "keyinput" +#define KEY0VALUE 0X01 +#define INVAKEY 0XFF +#define KEY_NUM 1 + +struct irq_keydesc { + int gpio; /* gpio */ + int irqnum; /* 中断号 */ + unsigned char value; /* 按键对应的值 */ + char name[10]; /* 名字*/ + irqreturn_t (*handler)(int, void *); /* 中断服务函数*/ }; -struct key_dev keydev; -static int key_open(struct inode *inode, struct file *filp) +struct keyinput_dev { - filp->private_data = &keydev; - keydev.nd = of_find_node_by_path("/key"); - if(keydev.nd == NULL){ - return -EINVAL; - } + dev_t devid; /* 中断号 */ + struct cdev cdev; /* cdev */ + struct class* class; /* 类 */ + struct device* device; + struct device_node* nd; + struct timer_list timer; + struct irq_keydesc irqkeydesc; /* 案件描述组 */ + unsigned char curkeynum; /* 当前的按键号 */ + struct input_dev* inputdev; /* input结构体 */ +}; - keydev.key_gpio = of_get_named_gpio(keydev.nd, "key-gpio",0); - if(keydev.key_gpio < 0) { - printk("can't get key0\r\n"); - return -EINVAL; - } - printk("key_gpio = %d\r\n", keydev.key_gpio); - /* 初始化key所使用的IO */ - gpio_request(keydev.key_gpio, "key0"); - gpio_direction_input(keydev.key_gpio); +struct keyinput_dev keyinputdev; - return 0; -} -static ssize_t key_read(struct file *filp, char __user *buf, - size_t cnt,loff_t *offt) +void timer_function(unsigned long arg) { - int ret = 0; unsigned char value; - struct key_dev *dev = filp->private_data; - if(gpio_get_value(dev->key_gpio) == 0){ - while(!gpio_get_value(dev->key_gpio)) - ; - atomic_set(&dev->keyvalue,KEY0VALUE); - }else{ - atomic_set(&dev->keyvalue,INVAKEY); + unsigned char num; + struct irq_keydesc* keydesc; + struct keyinput_dev* dev = (struct keyinput_dev*)arg; + + num = dev->curkeynum; + keydesc = &dev->irqkeydesc; + value = gpio_get_value(keydesc->gpio); + + if (value == 0) + { + input_report_key(dev->inputdev, keydesc->value, 1); + input_sync(dev->inputdev); + } + else { /* 按键松开 */ + input_report_key(dev->inputdev, keydesc->value, 0); + input_sync(dev->inputdev); } - value = atomic_long_read(&dev->keyvalue); - ret = copy_to_user(buf,&value,sizeof(value)); - return ret; + } -static struct file_operations key_fops = { - .owner = THIS_MODULE, - .open = key_open, - .read = key_read, -}; +irqreturn_t key0_handler(int irq, void* dev_id) +{ + struct keyinput_dev *dev = (struct keyinput_dev *)dev_id; + + dev->curkeynum = 0; + dev->timer.data = (volatile long)dev_id; + mod_timer(&dev->timer, jiffies + msecs_to_jiffies(10)); + return IRQ_RETVAL(IRQ_HANDLED); +} -static __init mykey_init(void) +static void keyio_init(void) { - /* 初始化源自变量 */ - atomic_set(&keydev.keyvalue,INVAKEY); - /* 注册字符设备驱动 */ - /* 1、创建设备号 */ - if(keydev.major){ /* 如果定义了设备号 */ - keydev.devid = MKDEV(keydev.major,0); - register_chrdev_region(keydev.devid,KEY_CNT,KEY_NAME); - }else { /* 没有定义设备号 */ - alloc_chrdev_region(&keydev.devid,0,KEY_CNT,KEY_NAME); - keydev.major = MAJOR(keydev.devid); /* 获取分配的主设备号 */ - keydev.minor = MINOR(keydev.devid); /* 获取分配的次设备号 */ + int ret = 0; + keyinputdev.nd = of_find_node_by_path("/key"); + if (keyinputdev.nd == NULL) + { + printk("key node not find!\r\n"); + return -EINVAL; } - /* 2、初始化cdev */ - keydev.cdev.owner = THIS_MODULE; - cdev_init(&keydev.cdev,&key_fops); + keyinputdev.irqkeydesc.gpio = of_get_named_gpio(keyinputdev.nd, "key-gpio", 0); + if (keyinputdev.irqkeydesc.gpio < 0) + { + printk("can't get key0"); + } - /* 3、添加一个cdev */ - cdev_add(&keydev.cdev,keydev.devid,KEY_CNT); - /* 4、创建类 */ - keydev.class = class_create(THIS_MODULE,KEY_NAME); - if(IS_ERR(keydev.class)){ - return PTR_ERR(keydev.class); + /* 初始化key所使用的IO,并且设置成中断模式 */ + memset(keyinputdev.irqkeydesc.name, 0, sizeof(keyinputdev.irqkeydesc.name)); + sprintf(keyinputdev.irqkeydesc.name, "key0"); + gpio_request(keyinputdev.irqkeydesc.gpio, keyinputdev.irqkeydesc.name); + gpio_direction_input(keyinputdev.irqkeydesc.gpio); + keyinputdev.irqkeydesc.irqnum = irq_of_parse_and_map(keyinputdev.nd, 0); + + /* 申请中断 */ + keyinputdev.irqkeydesc.handler = key0_handler; + keyinputdev.irqkeydesc.value = KEY_0; + + ret = request_irq(keyinputdev.irqkeydesc.irqnum, + keyinputdev.irqkeydesc.handler, + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + keyinputdev.irqkeydesc.name, &keyinputdev); + if (ret <0) + { + printk("irq %d request failed !\r\n", keyinputdev.irqkeydesc.irqnum); + return -EFAULT; } - /* 5、创建设备 */ - keydev.device = device_create(keydev.class,NULL,keydev.devid,NULL,KEY_NAME); - if(IS_ERR(keydev.device)){ - return PTR_ERR(keydev.device); + /* 创建定时器 */ + init_timer(&keyinputdev.timer); + keyinputdev.timer.function = timer_function; + /* 申请input_dev */ + keyinputdev.inputdev = input_allocate_device(); + keyinputdev.inputdev->name = KEYINPUT_NAME; + keyinputdev.inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_set_capability(keyinputdev.inputdev, EV_KEY, KEY_0); + + /* 注册输入设备 */ + ret = input_register_device(keyinputdev.inputdev); + if (ret) + { + printk("register input device failed!\r\n"); + return ret; } - return 0; } -static __exit mykey_exit(void) +static __init keyinput_init(void) +{ + keyio_init(); + return 0; +} + +static __exit keyinput_exit(void) { - //注销字符设备驱动 - gpio_free(keydev.key_gpio); - cdev_del(&keydev.cdev); - unregister_chrdev_region(keydev.devid,KEY_CNT); - device_destroy(keydev.class,keydev.devid); - class_destroy(keydev.class); } -module_init(mykey_init); -module_exit(mykey_exit); +module_init(keyinput_init); +module_exit(keyinput_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("zhangchaoliang"); diff --git a/20_input/keyinput.code-workspace b/20_input/keyinput.code-workspace index f5bceea..213b97e 100644 --- a/20_input/keyinput.code-workspace +++ b/20_input/keyinput.code-workspace @@ -4,7 +4,11 @@ "path": "." } ], - "settings":{ - + "settings": { + "files.associations": { + "ide.h": "c", + "init.h": "c" } + + } } \ No newline at end of file -- Gitee From 54d380270588a6207eb5e7b0c0fcd3cc3170a4e2 Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Tue, 18 Jun 2024 22:01:04 +0800 Subject: [PATCH 3/3] =?UTF-8?q?input=E5=AD=90=E7=B3=BB=E7=BB=9F=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C=E9=AA=8C=E8=AF=81=E6=88=90=E5=8A=9F=EF=BC=8C=E5=90=8E?= =?UTF-8?q?=E9=9D=A2=E8=AF=A5=E5=81=9A=E5=86=85=E6=A0=B8=E8=87=AA=E5=B8=A6?= =?UTF-8?q?=E7=9A=84Linux=20=E8=87=AA=E5=B8=A6=E6=8C=89=E9=94=AE=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=E7=A8=8B=E5=BA=8F=E7=9A=84=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 20_input/.vscode/c_cpp_properties.json | 6 +-- 20_input/keyinputApp.c | 61 +++++++++++++++----------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/20_input/.vscode/c_cpp_properties.json b/20_input/.vscode/c_cpp_properties.json index 94ece73..79c6d19 100644 --- a/20_input/.vscode/c_cpp_properties.json +++ b/20_input/.vscode/c_cpp_properties.json @@ -12,10 +12,10 @@ "${default}" ], "defines": ["__KERNEL__","__linux__"], - "compilerPath": "/usr/bin/g++", + "compilerPath": "/usr/bin/gcc", "cStandard": "c11", "cppStandard": "c++17", - "intelliSenseMode": "gcc-x64", + "intelliSenseMode": "linux-gcc-x64", "browse": { "path": [ "${workspaceFolder}", @@ -43,7 +43,7 @@ "compilerPath": "C:/Qt/Qt5.12.9/Tools/mingw730_64/bin/gcc.exe", "cStandard": "c11", "cppStandard": "c++17", - "intelliSenseMode": "linux-gcc-x64" + "intelliSenseMode": "windows-gcc-x64" } ], "version": 4 diff --git a/20_input/keyinputApp.c b/20_input/keyinputApp.c index 52d7b5a..d49d43c 100644 --- a/20_input/keyinputApp.c +++ b/20_input/keyinputApp.c @@ -5,45 +5,56 @@ #include "fcntl.h" #include "stdlib.h" #include "string.h" +#include +#include +#include +#include +#include +#include +static struct input_event inputevent; -/* 定义按键值 */ -#define KEY0VALUE 0xF0 -#define INVAKEY 0x00 - -/* - -*/ int main(int argc, char *argv[]){ - int fd, ret; + int fd; + int err = 0; char *filename; - unsigned char keyvalue; - if (argc != 2) { + + filename = argv[1]; + + if (argc !=2 ) + { printf("Error Usage!\r\n"); return -1; } - - filename = argv[1]; + fd = open(filename, O_RDWR); - if(fd < 0) { - printf("file %s open failed\r\n",argv[1]); + if (fd <0) + { + printf("Can't open file %s \r\n", filename); return -1; } - // 循环读取按键数据! while(1){ - read(fd,&keyvalue,sizeof(keyvalue)); - if(keyvalue == KEY0VALUE) { - printf("KEY0 Press,value = %#x\r\n",keyvalue);// 按下 + err = read(fd, &inputevent, sizeof(inputevent)); + if (err >0) + { + switch (inputevent.type) + { + case EV_KEY: + if (inputevent.code < BTN_MISC) + { + printf("key %d %s \r\n",inputevent.code, + inputevent.value ? "press" : "release"); + } + break; + + default: + break; + } + }else { + printf("读取数据失败\r\n"); } } - - ret = close(fd); // close文件 - if(ret <0){ - printf("file %s close failed\r\n",argv[1]); - return -1; - } - return 0; } -- Gitee