input子系统

发布者:CelestialSoul最新更新时间:2025-02-17 来源: cnblogs关键字:input  子系统  S5PV210 手机看文章 扫描二维码
随时随地手机看文章

input子系统:

      像按键、键盘、鼠标、触摸屏、游戏摇杆等设备只有输入没有输出,而且在编程实现其对应的驱动程序时会有很多重复性的代码,内核的设计者将该部分代码抽象出来,驱动工程师只需要复用该部分代码,并且实现硬件相关的代码(中断号,中断触发条件),就可以可以很容易实现对应硬件的驱动程序 如何用复用input子系统中提供的通用函数功能模块, 要遵循以下步骤:

    核心数据结构

        struct input_dev

        {

            evbit//记录该设备将来会报告哪些事件

        }

    1)分配一个输入设备//定义一个input_dev类型变量

      input_allocate_device()

    2)设置input_dev

    

    3)注册input_dev

      input_register_device

    4)硬件操作

      注册中断服务程序

      延时去抖

      //保存按键值

    5)向input核心模块报告事件

      input_event(...)

    6)注销input_dev

      input_unregister_device

    7)释放输入设备

      input_free_device(...)


代码实例:


  1 #include

  2 #include

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8 //定义按键硬件私有数据结构

  9 struct btn_resource {

 10     char *name; //名称

 11     int irq;    //中断号

 12     int gpio;   //GPIO编号

 13     int code;   //键值

 14 };

 15 

 16 //初始化开发板按键信息

 17 static struct btn_resource btn_info[] = {

 18     [0] = {

 19         .name = 'KEY_L',

 20         .irq = IRQ_EINT(0),

 21         .gpio = S5PV210_GPH0(0),

 22         .code = KEY_L

 23     },

 24     [1] = {

 25         .name = 'KEY_S',

 26         .irq = IRQ_EINT(1),

 27         .gpio = S5PV210_GPH0(1),

 28         .code = KEY_S

 29     },

 30     [2] = {

 31         .name = 'KEY_ENTER',

 32         .irq = IRQ_EINT(2),

 33         .gpio = S5PV210_GPH0(2),

 34         .code = KEY_ENTER

 35     },

 36 };

 37 

 38 //定义input_dev指针

 39 static struct input_dev *btn_dev;

 40 

 41 //分配定时器

 42 static struct timer_list btn_timer;

 43 static struct btn_resource *pdata; 

 44 

 45 //定时器的处理函数

 46 static void btn_timer_func(unsigned long data)

 47 {

 48     unsigned int pinstate;

 49     

 50     //2.获取按键的状态

 51     pinstate = gpio_get_value(pdata->gpio);

 52 

 53     //3.上报按键信息给核心层然后唤醒休眠的进程

 54     if (pinstate == 1) { //松开

 55         //EV_KEY:上报按键类事件

 56         //pdata->code:具体键值

 57         //0:松开

 58         input_event(btn_dev, EV_KEY, pdata->code, 0);

 59         input_sync(btn_dev); //上报同步类事件

 60     } else {    //按下

 61         //EV_KEY:上报按键类事件

 62         //pdata->code:具体键值

 63         //1:按下

 64         input_event(btn_dev, EV_KEY, pdata->code, 1);

 65         input_sync(btn_dev);//上报同步类事件

 66     }

 67 }

 68 

 69 //中断处理函数

 70 static irqreturn_t button_isr(int irq, void *dev_id)

 71 {   

 72     //1.获取按键对应的数据项

 73     pdata = (struct btn_resource *)dev_id;

 74     

 75     //2.启动定时器,设置定时器的超时时间为10ms

 76     mod_timer(&btn_timer, jiffies + msecs_to_jiffies(10));

 77     return IRQ_HANDLED;

 78 }

 79 

 80 static int btn_init(void)

 81 {

 82     int i;

 83 

 84     //1.分配input_dev

 85     btn_dev = input_allocate_device();

 86     

 87     //2.初始化input_dev

 88     btn_dev->name = 'wf_button';

 89     //2.1设置上报按键类事件

 90     set_bit(EV_KEY, btn_dev->evbit);

 91     //2.2设置上报重复类事件

 92     set_bit(EV_REP, btn_dev->evbit);

 93     //2.3设置上报按键类事件中的哪些键值

 94     for(i = 0; i < ARRAY_SIZE(btn_info); i++)

 95             set_bit(btn_info[i].code, btn_dev->keybit);

 96 

 97     //3.注册input_dev

 98     input_register_device(btn_dev);

 99     

100     //4.申请GPIO资源

101     //5.注册中断处理函数

102     for (i = 0; i < ARRAY_SIZE(btn_info); i++) {

103         gpio_request(btn_info[i].gpio, btn_info[i].name);

104         request_irq(btn_info[i].irq, button_isr/*中断处理函数*/,

105                 IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,/*下降沿和上升沿触发*/

106                 btn_info[i].name, &btn_info[i]/*给中断处理函数传递的参数*/);

107     }

108     

109     //6.初始化定时器 处理按键的毛刺

110     init_timer(&btn_timer);

111     

112     //6.1指定定时器的处理函数

113     btn_timer.function = btn_timer_func;

114     add_timer(&btn_timer);//将定时器添加到内核中

115     return 0;

116 }

117 

118 static void btn_exit(void)

119 {

120     int i;

121 

122     //1.释放中断,释放GPIO资源

123     for (i = 0; i < ARRAY_SIZE(btn_info); i++) {

124         gpio_free(btn_info[i].gpio);

125         free_irq(btn_info[i].irq, &btn_info[i]);

126     }

127 

128     //2.卸载input_dev

129     input_unregister_device(btn_dev);

130 

131     //3.释放input_dev内存

132     input_free_device(btn_dev);

133     

134     //4.删除定时器

135     del_timer(&btn_timer);

136 }

137 

138 module_init(btn_init);

139 module_exit(btn_exit);

140 MODULE_LICENSE('GPL');


测试代码:


 1 #include

 2 #include

 3 #include

 4 #include

 5 #include //input_event,标准键值等

 6 

 7 int main(int argc, char *argv[])

 8 {

 9     int fd;

10     struct input_event button;

11 

12     fd = open(argv[1], O_RDWR); //./btn_test /dev/input/event3

13     if (fd < 0) {

14         printf('open button failed.n');

15         return -1;

16     }

17 

18     while(1) {

19         read(fd, &button, sizeof(button));

20         printf('type = %#x, code = %#x, value = %#xn',

21                     button.type, button.code, button.value);

22     }

23 

24     close(fd);

25     return 0;

26 }


关键字:input  子系统  S5PV210 引用地址:input子系统

上一篇:TQ210搭载Android 4.0.3测试Google Maps API V2(一.获取地图)
下一篇:创建一个字符设备1.1

推荐阅读最新更新时间:2026-03-20 15:05

input子系统
input子系统: 像按键、键盘、鼠标、触摸屏、游戏摇杆等设备只有输入没有输出,而且在编程实现其对应的驱动程序时会有很多重复性的代码,内核的设计者将该部分代码抽象出来,驱动工程师只需要复用该部分代码,并且实现硬件相关的代码(中断号,中断触发条件),就可以可以很容易实现对应硬件的驱动程序 如何用复用input子系统中提供的通用函数功能模块, 要遵循以下步骤: 核心数据结构 struct input_dev { evbit//记录该设备将来会报告哪些事件 } 1)分配一个输入设备//定义一个input_dev类型变量 input_allocate_device() 2)设置i
[单片机]
S5PV210根文件系统的制作(一)
一、基本概念 文件管理:数据管理算法 文件系统:管理文件算法的载体 文件系统的功能:管理分区上的数据(增删查改) 文件系统的分类:fat32/ntfs/ext3/ext4/yaffs/jffs/cramfs/..... 文件系统的表现形态:   window--------- 森林   linux------------ 树 ------- 文件目录标准 文件系统与根文件系统:   根文件系统:  系统启动时加载的助文件系统   其他文件系统:  根系统启动后挂载的其他文件系统 二、需要用到的工具 busybox-1.20.2.tar,yaffs2-source,bash-4.0.t
[单片机]
三星s5pv210之芯灵思Sin210与Ti Beaglebone Black之对比
1.外观对比 Ø 芯灵思Sin210 Ø TI Beaglebone Black 2.尺寸对比 Ø 芯灵思Sin210 采用核心板+底板结构,核心板尺寸5CM*6CM;底板尺寸10.6CM*15CM Ø TI Beaglebone Black 8.636cm * 5.334cm 3.配件对比 Ø 芯灵思Sin210 Ø TI Beaglebone Black 只提供一块板子 + miniUSB线 4.液晶LCD对比 Ø 芯灵思Sin210 标配4.3 电阻触摸屏 Ø TI Beaglebone Black 无 5.主打操作系统 Ø 芯灵思Sin210 WinCE Ø TI Beaglebone Bla
[单片机]
三星<font color='red'>s5pv210</font>之芯灵思Sin210与Ti Beaglebone Black之对比
【ARM裸机s5pv210 】芯片初始化
#define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 #define WTCON 0xE2700000 #define SVC_STACK 0xd0037d80 .global _start _start: // 第1步:关看门狗(向WTCON的bit5写入0即可) ldr r0, =WTCON ldr r1, =0x0 str r1, // 第2步:设置SVC栈    满减栈,满的意思是入栈先移动指针再填入数据,减的意思是栈从高到低用 ldr sp, =SVC_STACK // 第3步:开/关icache
[单片机]
【ARM裸机s5pv210 】GPIO
GPJ0CON 寄存器共32位,每个引脚用4位控制,16进制的话正好一个数可以控制一个引脚 GPJ0DAT 寄存器共8位,每个引脚用1位控制,16进制的话2个数控制8个引脚 小实验测试: //Makefile文件 led.bin: led.o arm-linux-ld -Ttext 0x0 -o led.elf $^ arm-linux-objcopy -O binary led.elf led.bin %.o : %.S arm-linux-gcc -o $@ $ -c %.o : %.c arm-linux-gcc -o $@ $ -c clean: rm *.o *
[单片机]
【ARM裸机<font color='red'>s5pv210</font> 】GPIO
解决VS2005 远程工具无法通过同步软件连接S5pv210 样机的问题
用过VS2005的人都知道,它提供了两套远程工具软件,一个可从VS2005的菜单 Target”—— Remote Tools”打开,而另一个在“开始”菜单—— Microsoft Visual Studio 2005”—— Visual Studio Remote Tools”下。很早以前,在《 单机搭建WinCE开发环境(续) 》中对两套远程工具做了对比,当时只看到了一点表象,没有看到更深层次的东西,今天在这里做一个补充说明。 这两套远程工具是基于两种不同的链接层实现的,它们分别是Platman和CoreCon。 Target”菜单下的远程工具是基于Platman的。而“开始”菜单VS2005中的远程工具是基于CoreC
[单片机]
解决VS2005 远程工具无法通过同步软件连接<font color='red'>S5pv210</font> 样机的问题
s5pv210启动debian出错提示bash: cannot set terminal process group (-1): Inappropriate ioctl for device
1.启动参数如下: bootargs=root=/dev/nfs nfsroot=192.168.1.8:/opt/wheezy_fs ip=192.168.1.9:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on init=/bin/bash console=ttySAC0,115200 1.1错误信息如下: bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell 2.修改启动参数: bootargs=root=/dev
[单片机]
S5PV210之beep驱动从linux2.6.35.7移植到linux3.0.8
beep驱动从linux2.6.35.7内核移植到linux3.0.8,修改的部分为:   '='后面的为修改后的   .ioctl  =  .unlocked_ioctl   static int beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)   = static int beep_ioctl(struct file *file, unsigned int cmd, unsigned long arg)   beep_ioctl函数中struct inode *inode去掉,原因是b
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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