From 143e60c5f3408914f8436251ec64d902b0d8b666 Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Wed, 27 Mar 2024 22:24:44 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=AE=9E=E9=AA=8C13=E6=AD=A3=E5=9C=A8?= =?UTF-8?q?=E7=BC=96=E5=86=99=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 13_irq/.vscode/c_cpp_properties.json | 21 ++++ 13_irq/.vscode/settings.json | 21 ++++ 13_irq/Makefile | 13 +++ 13_irq/imx6uirq.c | 156 +++++++++++++++++++++++++++ 13_irq/imx6uirq.code-workspace | 35 ++++++ 13_irq/imx6uirqApp.c | 71 ++++++++++++ 6 files changed, 317 insertions(+) create mode 100644 13_irq/.vscode/c_cpp_properties.json create mode 100644 13_irq/.vscode/settings.json create mode 100644 13_irq/Makefile create mode 100644 13_irq/imx6uirq.c create mode 100644 13_irq/imx6uirq.code-workspace create mode 100644 13_irq/imx6uirqApp.c diff --git a/13_irq/.vscode/c_cpp_properties.json b/13_irq/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..7ee3d5b --- /dev/null +++ b/13_irq/.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/13_irq/.vscode/settings.json b/13_irq/.vscode/settings.json new file mode 100644 index 0000000..1a2a04a --- /dev/null +++ b/13_irq/.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/13_irq/Makefile b/13_irq/Makefile new file mode 100644 index 0000000..e229e0a --- /dev/null +++ b/13_irq/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 := imx6uirq.o + +build: kernel_modules + +kernel_modules: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean + + diff --git a/13_irq/imx6uirq.c b/13_irq/imx6uirq.c new file mode 100644 index 0000000..4830414 --- /dev/null +++ b/13_irq/imx6uirq.c @@ -0,0 +1,156 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +#define IMX6UIRQ_CNT 1 /* 设备号个数 */ +#define IMX6UIRQ_NAME "imx6uirq" /* 名字 */ +#define KEY0VALUE 0X01 /* key0的按键值 */ +#define INVAKEY 0XFF /* 无效的按键值 */ +#define KEY_NUM 1 /* 按键数量 */ + + +/* 中断io描述结构体 */ +struct irq_keydesc{ + int gpio; + int irqnum; /* 中断号 */ + unsigned char value; /* 按键对应的键值 */ + char name[10]; /* 名字 */ + irqreturn_t (*handler)(int, void *); /* 中断服务函数*/ +}; + +/* imx6uirq设备结构体 */ +struct imx6uirq_dev +{ + dev_t devid; + struct cdev cdev; + struct class *class; + struct device *device; + int major; + int minor; + struct device_node *nd; + atomic_t keyvalue; /* 有效的按键值 */ + atomic_t releasekey; /* 标记是否完成一次完整的按键 */ + struct timer_list timer; /* 定义一个定时器 */ + struct irq_keydesc irqkeydesc; /* 按键描述数组 */ + unsigned char curkeynum; /* 当前的按键号 */ +}; + +struct imx6uirq_dev imx6uirq; /* irq设备 */ + + + +static int keyio_init(void) +{ + unsigned char i = 0; + int ret = 0; + imx6uirq.nd = of_find_node_by_path("/key"); + if(!imx6uirq.nd){ + printk("key node not find!\r\n"); + return -EINVAL; + } + + /* 提取GPIO */ + imx6uirq.irqkeydesc.gpio = of_get_named_gpio(&imx6uirq.nd, "key-gpio", 0); + if(!gpio_is_valid(imx6uirq.irqkeydesc.gpio)){ + printk("can't get key0 !\r\n"); + return -EINVAL; + } + + memset(imx6uirq.irqkeydesc.name, 0, sizeof(imx6uirq.irqkeydesc.name)); + sprintf(imx6uirq.irqkeydesc.name, "key0"); + gpio_requst() + + return 0; +} + +static int imx6uirq_open(struct inode *inode, struct file *filp) +{ + int ret = 0; + filp->private_data = &imx6uirq; + imx6uirq.timeperiod = 1000; + ret = led_init(); + if(ret < 0) return ret; + return 0; +} +static struct file_operations imx6uirq_fops = { + .owner = THIS_MODULE, + .open = imx6uirq_open, + .open = imx6uirq_read, +}; + + +static __init imx6uirq_init(void) +{ + /* 注册字符设备驱动 */ + /* 1、创建设备号 */ + if(imx6uirq.major){ /* 如果定义了设备号 */ + imx6uirq.devid = MKDEV(imx6uirq.major,0); + register_chrdev_region(imx6uirq.devid,IMX6UIRQ_CNT,IMX6UIRQ_NAME); + }else { /* 没有定义设备号 */ + alloc_chrdev_region(&imx6uirq.devid,0,IMX6UIRQ_CNT,IMX6UIRQ_NAME); + imx6uirq.major = MAJOR(imx6uirq.devid); /* 获取分配的主设备号 */ + imx6uirq.minor = MINOR(imx6uirq.devid); /* 获取分配的次设备号 */ + } + + /* 2、初始化cdev */ + imx6uirq.cdev.owner = THIS_MODULE; + cdev_init(&imx6uirq.cdev,&imx6uirq_fops); + + /* 3、添加一个cdev */ + cdev_add(&imx6uirq.cdev,imx6uirq.devid,IMX6UIRQ_CNT); + /* 4、创建类 */ + imx6uirq.class = class_create(THIS_MODULE,IMX6UIRQ_NAME); + if(IS_ERR(imx6uirq.class)){ + return PTR_ERR(imx6uirq.class); + } + + /* 5、创建设备 */ + imx6uirq.device = device_create(imx6uirq.class,NULL,imx6uirq.devid,NULL,IMX6UIRQ_NAME); + if(IS_ERR(imx6uirq.device)){ + return PTR_ERR(imx6uirq.device); + } + + atomic_set(&imx6uirq.keyvalue,INVAKEY); + atomic_set(&imx6uirq.releasekey,INVAKEY); + keyio_init(); + + return 0; +} + +static __exit imx6uirq_exit(void) +{ + free_irq(imx6uirq.irqkeydesc.irqnum,&imx6uirq); + gpio_free(imx6uirq.irqkeydesc.gpio ); + + // 注销字符设备驱动 + cdev_del(&imx6uirq.cdev); + unregister_chrdev_region(imx6uirq.devid,IMX6UIRQ_CNT); + + device_destroy(imx6uirq.class,imx6uirq.devid); + class_destroy(imx6uirq.class); + +} + +module_init(imx6uirq_init); +module_exit(imx6uirq_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("zhangchaoliang"); diff --git a/13_irq/imx6uirq.code-workspace b/13_irq/imx6uirq.code-workspace new file mode 100644 index 0000000..fe3aba9 --- /dev/null +++ b/13_irq/imx6uirq.code-workspace @@ -0,0 +1,35 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "files.associations": { + "gpio.h": "c", + "*.tcc": "c", + "ioctl.h": "c", + "fstream": "c", + "types.h": "c", + "kernel.h": "c", + "ide.h": "c", + "uaccess.h": "c", + "atomic.h": "c", + "interrupt.h": "c", + "hardirq.h": "c", + "irq.h": "c", + "delay.h": "c", + "init.h": "c", + "module.h": "c", + "cdev.h": "c", + "of_address.h": "c", + "of_gpio.h": "c", + "errno.h": "c", + "device.h": "c", + "of.h": "c", + "of_irq.h": "c", + "timer.h": "c" + } + + } +} \ No newline at end of file diff --git a/13_irq/imx6uirqApp.c b/13_irq/imx6uirqApp.c new file mode 100644 index 0000000..36382ff --- /dev/null +++ b/13_irq/imx6uirqApp.c @@ -0,0 +1,71 @@ +#include "stdio.h" +#include "unistd.h" +#include "sys/types.h" +#include "sys/stat.h" +#include "fcntl.h" +#include "stdlib.h" +#include "string.h" +#include "sys/ioctl.h" + +/* 定义命令 */ +#define CLOSE_CMD (_IO(0XEF, 0X1)) +#define OPEN_CMD (_IO(0XEF, 0X2)) +#define SETPERIOD_CMD (_IOW(0XEF, 0X3,int)) + + + +/* + +*/ +int main(int argc, char *argv[]){ + int fd, ret; + unsigned int cmd; + unsigned int arg; + char *filename; + unsigned char str[99]; + + 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) + { + printf("input CMD: "); + ret = scanf("%d", &cmd); + if(ret != 1){ + gets(str); + } + + if(cmd == 1){ + cmd = CLOSE_CMD; + } + else if(cmd == 2){ + cmd = OPEN_CMD; + } + else if(cmd == 3){ + cmd = SETPERIOD_CMD; + printf("input timer period:"); + ret = scanf("%d", &arg); + if(ret!=1){ + gets(str); + } + } + ioctl(fd, cmd, arg); + } + + ret = close(fd); // close文件 + if(ret <0){ + printf("file %s close failed\r\n",argv[1]); + return -1; + } + + return 0; +} -- Gitee From 20da54d6a369fc5dccd75051095ade500d856b4c Mon Sep 17 00:00:00 2001 From: D301_Ubuntu <1395769145@qq.com> Date: Thu, 28 Mar 2024 22:01:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=AE=9E=E9=AA=8C13irq=E5=86=99=E5=88=B0ke?= =?UTF-8?q?y=5Finit=E9=87=8C=E7=9A=84=E7=94=B3=E8=AF=B7=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=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> --- 13_irq/.vscode/c_cpp_properties.json | 9 +++++---- 13_irq/imx6uirq.c | 10 +++++++++- 13_irq/imx6uirq.code-workspace | 4 +++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/13_irq/.vscode/c_cpp_properties.json b/13_irq/.vscode/c_cpp_properties.json index 7ee3d5b..a209b15 100644 --- a/13_irq/.vscode/c_cpp_properties.json +++ b/13_irq/.vscode/c_cpp_properties.json @@ -3,11 +3,12 @@ { "name": "Linux", "includePath": [ + "/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", "${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", diff --git a/13_irq/imx6uirq.c b/13_irq/imx6uirq.c index 4830414..596ef65 100644 --- a/13_irq/imx6uirq.c +++ b/13_irq/imx6uirq.c @@ -77,7 +77,15 @@ static int keyio_init(void) memset(imx6uirq.irqkeydesc.name, 0, sizeof(imx6uirq.irqkeydesc.name)); sprintf(imx6uirq.irqkeydesc.name, "key0"); - gpio_requst() + gpio_requst(imx6uirq.irqkeydesc.gpio,imx6uirq.irqkeydesc.name); + gpio_direction_input(imx6uirq.irqkeydesc.gpio, imx6uirq); + + /* 获取中断号 */ + imx6uirq.irqkeydesc.irqnum = irq_of_parse_and_map(*imx6uirq.nd, 0); + printk("key0:gpio = %d,irqnum = %d \r\n", imx6uirq.irqkeydesc.gpio, imx6uirq.irqkeydesc.irqnum); + + /* 申请中断 */ + return 0; } diff --git a/13_irq/imx6uirq.code-workspace b/13_irq/imx6uirq.code-workspace index fe3aba9..62259f8 100644 --- a/13_irq/imx6uirq.code-workspace +++ b/13_irq/imx6uirq.code-workspace @@ -28,7 +28,9 @@ "device.h": "c", "of.h": "c", "of_irq.h": "c", - "timer.h": "c" + "timer.h": "c", + "stdlib.h": "c", + "stdio.h": "c" } } -- Gitee From 8fb034e4bb43334a144646781538420f0cfb1ff8 Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Thu, 28 Mar 2024 22:40:36 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E8=AF=A5=E8=AF=B7=E6=B1=82irq=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 13_irq/imx6uirq.c | 7 +++++-- 13_irq/imx6uirq.code-workspace | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/13_irq/imx6uirq.c b/13_irq/imx6uirq.c index 596ef65..a7d25f7 100644 --- a/13_irq/imx6uirq.c +++ b/13_irq/imx6uirq.c @@ -78,14 +78,17 @@ static int keyio_init(void) memset(imx6uirq.irqkeydesc.name, 0, sizeof(imx6uirq.irqkeydesc.name)); sprintf(imx6uirq.irqkeydesc.name, "key0"); gpio_requst(imx6uirq.irqkeydesc.gpio,imx6uirq.irqkeydesc.name); - gpio_direction_input(imx6uirq.irqkeydesc.gpio, imx6uirq); + gpio_direction_input(imx6uirq.irqkeydesc.gpio); /* 获取中断号 */ imx6uirq.irqkeydesc.irqnum = irq_of_parse_and_map(*imx6uirq.nd, 0); printk("key0:gpio = %d,irqnum = %d \r\n", imx6uirq.irqkeydesc.gpio, imx6uirq.irqkeydesc.irqnum); /* 申请中断 */ - + imx6uirq.irqkeydesc.handler = key0_handler; + imx6uirq.irqkeydesc.value = KEY0VALUE; + + /* 请求irq */ return 0; } diff --git a/13_irq/imx6uirq.code-workspace b/13_irq/imx6uirq.code-workspace index 62259f8..aa3ed81 100644 --- a/13_irq/imx6uirq.code-workspace +++ b/13_irq/imx6uirq.code-workspace @@ -30,7 +30,8 @@ "of_irq.h": "c", "timer.h": "c", "stdlib.h": "c", - "stdio.h": "c" + "stdio.h": "c", + "driver.h": "c" } } -- Gitee From d725f5fcebb6746cfa6dc003e2b86222a5b07915 Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Sat, 30 Mar 2024 22:34:44 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E5=92=8Capp=E9=83=BD?= =?UTF-8?q?=E5=86=99=E5=A5=BD=E4=BA=86=EF=BC=8C=E4=BD=86=E6=98=AF=E5=9C=A8?= =?UTF-8?q?=E7=8F=AD=E5=AD=90=E4=B8=8A=E8=BF=90=E8=A1=8C=E4=BC=9A=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 13_irq/.vscode/c_cpp_properties.json | 1 + 13_irq/imx6uirq.c | 63 ++++++++++++++++++++++++---- 13_irq/imx6uirqApp.c | 43 +++++-------------- 3 files changed, 67 insertions(+), 40 deletions(-) diff --git a/13_irq/.vscode/c_cpp_properties.json b/13_irq/.vscode/c_cpp_properties.json index a209b15..209cd66 100644 --- a/13_irq/.vscode/c_cpp_properties.json +++ b/13_irq/.vscode/c_cpp_properties.json @@ -6,6 +6,7 @@ "/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/arch/arm/include/asm", "/home/youxiu/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", "${workspaceFolder}/**", "${default}" diff --git a/13_irq/imx6uirq.c b/13_irq/imx6uirq.c index a7d25f7..d6220f7 100644 --- a/13_irq/imx6uirq.c +++ b/13_irq/imx6uirq.c @@ -57,10 +57,28 @@ struct imx6uirq_dev struct imx6uirq_dev imx6uirq; /* irq设备 */ +static irqreturn_t key0_handler(int irq,void *dev_id) +{ + struct imx6uirq_dev *dev = (struct imx6uirq_dev *)dev_id; + unsigned char keyvalue; + + dev->curkeynum = 0; + + keyvalue = gpio_get_value(dev->irqkeydesc.gpio); + if (keyvalue == 0) /* 按键被按下 */ + { + atomic_set(&dev->keyvalue, dev->irqkeydesc.value); + } + else{ + atomic_set(&dev->keyvalue, 0x80 | dev->irqkeydesc.value); + atomic_set(&dev->releasekey, 1);/* 松开标记 */ + } + + return IRQ_RETVAL(IRQ_HANDLED); +} static int keyio_init(void) { - unsigned char i = 0; int ret = 0; imx6uirq.nd = of_find_node_by_path("/key"); if(!imx6uirq.nd){ @@ -69,7 +87,7 @@ static int keyio_init(void) } /* 提取GPIO */ - imx6uirq.irqkeydesc.gpio = of_get_named_gpio(&imx6uirq.nd, "key-gpio", 0); + imx6uirq.irqkeydesc.gpio = of_get_named_gpio(imx6uirq.nd, "key-gpio", 0); if(!gpio_is_valid(imx6uirq.irqkeydesc.gpio)){ printk("can't get key0 !\r\n"); return -EINVAL; @@ -77,11 +95,11 @@ static int keyio_init(void) memset(imx6uirq.irqkeydesc.name, 0, sizeof(imx6uirq.irqkeydesc.name)); sprintf(imx6uirq.irqkeydesc.name, "key0"); - gpio_requst(imx6uirq.irqkeydesc.gpio,imx6uirq.irqkeydesc.name); + gpio_request(imx6uirq.irqkeydesc.gpio,imx6uirq.irqkeydesc.name); gpio_direction_input(imx6uirq.irqkeydesc.gpio); /* 获取中断号 */ - imx6uirq.irqkeydesc.irqnum = irq_of_parse_and_map(*imx6uirq.nd, 0); + imx6uirq.irqkeydesc.irqnum = irq_of_parse_and_map(imx6uirq.nd, 0); printk("key0:gpio = %d,irqnum = %d \r\n", imx6uirq.irqkeydesc.gpio, imx6uirq.irqkeydesc.irqnum); /* 申请中断 */ @@ -89,19 +107,48 @@ static int keyio_init(void) imx6uirq.irqkeydesc.value = KEY0VALUE; /* 请求irq */ + ret = request_irq(imx6uirq.irqkeydesc.irqnum,imx6uirq.irqkeydesc.handler,IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, + imx6uirq.irqkeydesc.name,&imx6uirq); + if(ret < 0){ + printk("irq %d request failed! \r\n", imx6uirq.irqkeydesc.irqnum); + return -EFAULT; + } return 0; } static int imx6uirq_open(struct inode *inode, struct file *filp) { - int ret = 0; filp->private_data = &imx6uirq; - imx6uirq.timeperiod = 1000; - ret = led_init(); - if(ret < 0) return ret; + return 0; } + +static int imx6uirq_read(struct file *filp,char __user *buf,size_t cnt,loff_t *offt) +{ + int ret = 0; + unsigned int keyvalue = 0; + unsigned int releasekey = 0; + struct imx6uirq_dev *dev = (struct imx6uirq_dev *)filp->private_data; + keyvalue = atomic_read(&dev->keyvalue); + releasekey = atomic_read(&dev->releasekey); + if (releasekey) /* 如果按键已经松开 */ + { + if (keyvalue & 0x80) /* 判断按键是否松开,其实到这里,实际已经松开了,但是为了安全,又判断了一次 */ + { + /* 按键已经松开 */ + keyvalue &= ~0x80; /* 清除按下标志 */ + ret = copy_to_user(buf, &keyvalue, sizeof(keyvalue));/* 发送按键值 */ + }else { + return -EINVAL; + } + atomic_set(&dev->releasekey, 0); /* 清零标志,表示被按下的按键已经被读取 */ + }else{ + return -EINVAL; + } + return 0; +} + static struct file_operations imx6uirq_fops = { .owner = THIS_MODULE, .open = imx6uirq_open, diff --git a/13_irq/imx6uirqApp.c b/13_irq/imx6uirqApp.c index 36382ff..7737cd7 100644 --- a/13_irq/imx6uirqApp.c +++ b/13_irq/imx6uirqApp.c @@ -7,22 +7,12 @@ #include "string.h" #include "sys/ioctl.h" -/* 定义命令 */ -#define CLOSE_CMD (_IO(0XEF, 0X1)) -#define OPEN_CMD (_IO(0XEF, 0X2)) -#define SETPERIOD_CMD (_IOW(0XEF, 0X3,int)) - - -/* - -*/ int main(int argc, char *argv[]){ - int fd, ret; - unsigned int cmd; - unsigned int arg; + int fd; + int ret; + unsigned char data; char *filename; - unsigned char str[99]; if (argc != 2) { printf("Error Usage!\r\n"); @@ -38,27 +28,16 @@ int main(int argc, char *argv[]){ while (1) { - printf("input CMD: "); - ret = scanf("%d", &cmd); - if(ret != 1){ - gets(str); - } - - if(cmd == 1){ - cmd = CLOSE_CMD; - } - else if(cmd == 2){ - cmd = OPEN_CMD; - } - else if(cmd == 3){ - cmd = SETPERIOD_CMD; - printf("input timer period:"); - ret = scanf("%d", &arg); - if(ret!=1){ - gets(str); + ret = read(fd, &data, sizeof(data)); + if (ret<0) + { + + }else{ + if(data){ + printf("keyvalue = %#X\r\n", data); } } - ioctl(fd, cmd, arg); + } ret = close(fd); // close文件 -- Gitee From 979eeca2c588a8ce619bb0e8438f5a0a592554ad Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Fri, 5 Apr 2024 20:58:11 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9C=AA=E5=8A=A0=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E6=B6=88=E6=8A=96=E7=9A=84=E5=AE=9E=E9=AA=8C=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=AE=8C=E6=88=90=E3=80=82bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 13_irq/imx6uirq.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/13_irq/imx6uirq.c b/13_irq/imx6uirq.c index d6220f7..29d52c2 100644 --- a/13_irq/imx6uirq.c +++ b/13_irq/imx6uirq.c @@ -137,22 +137,23 @@ static int imx6uirq_read(struct file *filp,char __user *buf,size_t cnt,loff_t *o if (keyvalue & 0x80) /* 判断按键是否松开,其实到这里,实际已经松开了,但是为了安全,又判断了一次 */ { /* 按键已经松开 */ - keyvalue &= ~0x80; /* 清除按下标志 */ - ret = copy_to_user(buf, &keyvalue, sizeof(keyvalue));/* 发送按键值 */ + keyvalue &= ~0x80; /* 清除按下标志 最高位清零*/ + ret = copy_to_user(buf, &keyvalue, sizeof(keyvalue));/* 发送按键值 0x01 */ }else { return -EINVAL; } atomic_set(&dev->releasekey, 0); /* 清零标志,表示被按下的按键已经被读取 */ + return 0; }else{ return -EINVAL; } - return 0; + } static struct file_operations imx6uirq_fops = { .owner = THIS_MODULE, .open = imx6uirq_open, - .open = imx6uirq_read, + .read = imx6uirq_read, }; @@ -188,7 +189,7 @@ static __init imx6uirq_init(void) } atomic_set(&imx6uirq.keyvalue,INVAKEY); - atomic_set(&imx6uirq.releasekey,INVAKEY); + atomic_set(&imx6uirq.releasekey,0); keyio_init(); return 0; -- Gitee