代码示例_Input 按键驱动

发布者:温柔心情最新更新时间:2025-02-18 来源: cnblogs关键字:按键驱动 手机看文章 扫描二维码
随时随地手机看文章

button_drv.c


  1 #include <linux/module.h>

  2 #include

  3 #include

  4 #include gpio.h>

  5 #include

  6 

  7 

  8 static int irqno;

  9 static struct input_dev *key_inputdev;

 10 

 11 

 12 irqreturn_t  input_key_irq_svc(int irqno, void *dev_id)

 13 {

 14     //区分是按下还是抬起

 15     

 16     int value = gpio_get_value(S5PV210_GPH0(1));

 17 

 18     if(value)

 19     {

 20         printk('-- KEY_DOWN upn');

 21         //抬起

 22         //上报数据--给input handler层

 23 

 24         //参数1--哪个设备上报的

 25         //参数2--哪个按键

 26         //参数3--按键的状态--1按下/0抬起

 27         input_report_key(key_inputdev, KEY_DOWN, 0);

 28         

 29         //最后一定要同步--上报结束

 30         input_sync(key_inputdev);

 31         

 32     }else

 33     {

 34         printk('-- KEY_DOWN pressedn');

 35         //按下

 36         //input_report_key(key_inputdev, KEY_DOWN, 1);

 37         input_event(key_inputdev, EV_KEY, KEY_DOWN, 1);

 38         input_sync(key_inputdev);

 39     }

 40     

 41 

 42     return IRQ_HANDLED;

 43 }

 44 

 45 

 46 

 47 

 48 

 49 static int __init input_key_drv_init(void)

 50 {

 51 

 52     /*

 53         1, 分配一个 input device对象

 54         

 55         2, 初始化input device对象 

 56         

 57         3, 注册input device对象

 58         

 59         4, 硬件初始化,获取到硬件的数据,上报给input handler

 60 

 61     */

 62 

 63     key_inputdev = input_allocate_device();

 64     

 65     //2, 初始化input device对象--其实就是初始化evbit[], keybit[]或者absbit等

 66 

 67 #if 0

 68     // 2.1 设置当前设备能够产生按键类型数据

 69     key_inputdev->evbit[EV_KEY/32] |= 1<<(EV_KEY%32);

 70     // 2.2 设置当前设备能够产生哪些按键

 71     key_inputdev->keybit[KEY_UP/32] |= 1<<(KEY_UP%32);

 72 #else

 73     // 2.1 设置当前设备能够产生按键类型数据

 74     key_inputdev->evbit[BIT_WORD(EV_KEY)] |= BIT_MASK(EV_KEY);

 75 

 76     // 2.2 设置当前设备能够产生哪些按键

 77     key_inputdev->keybit[BIT_WORD(KEY_UP)] |= BIT_MASK(KEY_UP);

 78     key_inputdev->keybit[BIT_WORD(KEY_DOWN)] |= BIT_MASK(KEY_DOWN);

 79     key_inputdev->keybit[BIT_WORD(KEY_LEFT)] |= BIT_MASK(KEY_LEFT);

 80     key_inputdev->keybit[BIT_WORD(KEY_RIGHT)] |= BIT_MASK(KEY_RIGHT);

 81 

 82 #endif

 83     

 84 

 85     // 3, 注册input device对象

 86     input_register_device(key_inputdev);

 87 

 88     // 4, 硬件初始化,获取到硬件的数据,上报给input handler

 89     //申请中断--暂时只申请一次

 90     //irqno = IRQ_EINT(1);

 91     irqno = gpio_to_irq(S5PV210_GPH0(1));

 92     request_irq(irqno, input_key_irq_svc, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,

 93                             'eint1_keydown', NULL);

 94     

 95 

 96     return 0;

 97 }

 98 

 99 static void __exit input_key_drv_exit(void)

100 {

101     free_irq(irqno, NULL);

102     input_unregister_device(key_inputdev);

103     input_free_device(key_inputdev);

104     

105 }

106 

107 module_init(input_key_drv_init);

108 module_exit(input_key_drv_exit);

109 MODULE_LICENSE('GPL');


Makefile


 1 CROSS_COMPILE = arm-none-linux-gnueabi-

 2 CC = $(CROSS_COMPILE)gcc

 3 

 4 #指定内核源码路径

 5 KERNEL_DIR = /home/farsight/s5pv210/kernel/linux-3.0.8

 6 CUR_DIR = $(shell pwd)

 7 

 8 MYAPP = input_key_app

 9 

10 MODULE = input_key_drv

11 

12 all:

13     #让make进入内核源码编译,同时将当前目录中的c程序作为内核模块一起编译

14     make -C $(KERNEL_DIR) M=$(CUR_DIR) modules

15 ifneq ($(MYAPP), )    

16     $(CC)  -o $(MYAPP) $(MYAPP).c

17 endif

18 

19 clean:

20     #删除上面编译生成的文件

21     make -C $(KERNEL_DIR) M=$(CUR_DIR) clean

22     rm -rf $(MYAPP)

23 

24 install:

25     cp *.ko $(MYAPP) /opt/rootfs/drv_module

26 

27 #指定当前目录下哪个文件作为内核模块编

28 obj-m += $(MODULE).o


test


 1 #include

 2 #include

 3 #include

 4 #include

 5 #include

 6 #include

 7 #include

 8 #include

 9 #include

10 

11 

12 int main(void)

13 {

14 

15     int fd;

16     int ret;

17 

18     struct input_event package;

19 

20  

21     fd = open('/dev/event0',O_RDWR);

22     if(fd < 0)

23     {

24         perror('open');

25         exit(1);

26     }

27 

28     while(1)

29     {

30         bzero(&package,sizeof(package));

31         ret = read(fd, &package,sizeof(package));

32         if(ret < 0)

33         {

34             perror('read');

35             exit(1);

36         }

37         //拆包

38         if(package.type == EV_KEY)

39         {

40             if(package.code == KEY_DOWN)

41             {

42                 if(package.value)

43                 {

44                     printf('-- KEY_DOWN pressedn');

45                 }else

46                 {

47                     printf('-- KEY_DOWN upn');

48                 }

49             }

50             if(package.code == KEY_POWER)

51             {

52                 if(package.value)

53                 {

54                     printf('-- KEY_POWER pressedn');

55                 }else

56                 {

57                     printf('-- KEY_POWER upn');

58                 }

59             }

60         }

61     }

62 

63     close(fd);

64     

65     return 0;

66 }


关键字:按键驱动 引用地址:代码示例_Input 按键驱动

上一篇:关于x210开发板和主机、虚拟机ping通问题
下一篇:3-Uboot源码目录分析

推荐阅读最新更新时间:2026-03-24 12:20

代码示例_Input 按键驱动
button_drv.c 1 #include linux/module.h 2 #include linux/init.h 3 #include linux/input.h 4 #include linux/gpio.h 5 #include linux/interrupt.h 6 7 8 static int irqno; 9 static struct input_dev *key_inputdev; 10 11 12 irqreturn_t input_key_irq_svc(int irqno, void *dev_id) 13 { 14 //区分是按下还是抬起 15
[单片机]
Linux驱动入门(四)非阻塞方式实现按键驱动
一、注册字符设备 二、操作硬件 2.1 操作按键 2.2 通用方式实现 2.3 gpiolib实现 三、源码 3.1 通用方式实现 3.2 gpiolib实现 四、测试 本文目标:实现一个按键驱动,通过read函数非阻塞读取按键的状态 一、注册字符设备 首先第一步,先编写字符设备的框架,这一部分在Linux驱动入门(一)字符设备驱动基础中已经做了详细介绍,这里直接给出源码,不做过多的解释 #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/cdev.h #include linux/slab.h #include linu
[单片机]
驱动程序实例(四):按键驱动程序(platform + input子系统 + 外部中断方式)
正文 结合之前对Linux内核的platform总线与input子系统的分析 ,本文将编写基于platform总线和input子系统的Button设备的实例代码并对其进行分析。 platform总线的分析,详见Linux platform驱动模型。 input子系统的分析,详见Linux字符设备驱动框架(四):Linux内核的input子系统。 硬件接口:   CPU:s5pv210;   Button的GPIO:GPIO_H0_2,EINT2;   LED的工作方式:按键弹起,低电平;按键按下,高电平。 1. device 在/kernel/arch/arm/mach-s5pv210/includ
[单片机]
S5PV210(TQ210)学习笔记——按键驱动程序
经过前面的配置,S5PV210开发已经可以成功进入Linux控制台了,那么,有了这个环境就可以开始学习Linux驱动的编写和测试了。学习Linux设备驱动,通常是从字符设备驱动开始。由于linux驱动开发具有比较系统的体系结构,我很难在一篇文章中阐述其开发思路,为了简单起见,从本文开始,自行编写的驱动将直接附上代码,对开发过程中感触比较深的地方稍作陈述。 我写的第一个驱动程序是Led的,但是感觉没有必要发出来了,S5PV210(TQ210)的按键驱动程序源码,仅供参考: #include linux/types.h #include linux/module.h #include linux/cdev.h #incl
[单片机]
OK6410按键驱动程序(改)亲测可以运行
#include linux/kernel.h #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/gpio.h #include linux/types.h #include linux/cdev.h #include linux/interrupt.h #include linux/sched.h #include linux/device.h #include linux/poll.h #include linux/semaphore.h #include linux/
[单片机]
【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序
一、使用struct pin_desc 管理按键的值 1.定义结构体 2.将前面我们申请中断时写的(void *)1修改为 &pins_desc 在ioctl中,设置中断中修改 在key_release中释放中修改 3.在中断程序中利用我们定义的struc pins_desc判断并得到按键的值 4.得到按键键值后,唤醒程序,在read函数中返回键值 附上驱动源程序: 1 /****************************** 2 linux key_query 3 *****************************/ 4 #include linux/module.h 5
[单片机]
【改进】IMX257实现GPIO-IRQ中断<font color='red'>按键</font>获取键值<font color='red'>驱动</font>程序
【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序
按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用Poll函数,来控制一定时间内,如果有按键发生,则立即返回键值。 同时,poll也可以同时监控多个(比如说按键,鼠标,等)一旦发生事件则立即返回。 我们在linux查看帮助: 从帮助中的说明得知, poll, ppoll - wait for some event on a file descriptor poll就是监控某个设备的事件。 修改驱动程序 1.增加头文件 #include linux/poll.h 2.增加key_poll 方法 static unsigned key_poll(struct file *fil
[单片机]
【改进Poll定时查询】IMX257实现GPIO-IRQ中断<font color='red'>按键</font>获取键值<font color='red'>驱动</font>程序
驱动编译进内核的3种方法(mini2440 key按键为例)
把驱动编译进内核的3种方法-----(mini2440 key按键为例) 方法1:单独以模块的方式编译及加入内核的方法(最简单的方法) 说明:key.c(key_hui.c)是驱动的代码,Makefile是编译规则,key.ko是驱动。key_irq是测试代码. (1). 在源程序目录make arch=arm ,就会生成key.ko文件 (2) 系统启动进入控制台后insmod key.ko (3) 查看设备号cat /proc/devices (4) 创建节点mknod /dev/globalmem c 235 0(有的内核支持自动创建节点有的不支持) 或者:在文件系统的启动脚本,例如在etc/profile末尾添加一行:so
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved