历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2018年10月12日 | Tiny210按键输入子系统

发布者:Meiren520 来源: eefocus关键字:Tiny210  按键输入  子系统 手机看文章 扫描二维码
随时随地手机看文章

buttons.c驱动源码:

// 参考drivers\input\keyboard\gpio_keys.c 

#include "linux/module.h"

#include "linux/version.h"

#include "linux/module.h"

#include "linux/init.h"

#include "linux/fs.h"

#include "linux/interrupt.h"

#include "linux/irq.h"

#include "linux/sched.h"

#include "linux/pm.h"

#include "linux/slab.h"

#include "linux/sysctl.h"

#include "linux/proc_fs.h"

#include "linux/delay.h"

#include "linux/platform_device.h"

#include "linux/input.h"

#include "linux/gpio_keys.h"

#include "linux/workqueue.h"

#include "linux/gpio.h"

struct pin_desc{

    int irq;

    char *name;

    unsigned int pin;

    unsigned int key_val;

};

struct pin_desc pins_desc[4] = {

    {IRQ_EINT(19), "K4", S5PV210_GPH2(3),  KEY_L},

    {IRQ_EINT(24), "K5", S5PV210_GPH3(0),  KEY_S},

    {IRQ_EINT(25), "K6", S5PV210_GPH3(1),  KEY_ENTER},

    {IRQ_EINT(26), "K7", S5PV210_GPH3(2),  KEY_LEFTSHIFT},

};

static struct input_dev *buttons_dev;

static struct pin_desc *irq_pd;

static struct timer_list buttons_timer;

static irqreturn_t buttons_irq(int irq, void *dev_id)

{

    // 10ms后启动定时器 

    irq_pd = (struct pin_desc *)dev_id;

    mod_timer(&buttons_timer, jiffies+HZ/100);

    return IRQ_RETVAL(IRQ_HANDLED);

}

static void buttons_timer_function(unsigned long data)

{

    struct pin_desc * pindesc = irq_pd;

    unsigned int pinval;

    if (!pindesc)

        return;

    

    pinval = gpio_get_value(pindesc->pin);

    if (pinval)

    {

        // 松开 : 最后一个参数: 0-松开, 1-按下 

        input_event(buttons_dev, EV_KEY, pindesc->key_val, 0);

        input_sync(buttons_dev);

    }

    else

    {

        // 按下 

        input_event(buttons_dev, EV_KEY, pindesc->key_val, 1);

        input_sync(buttons_dev);

    }

}

static int buttons_init(void)

{

    int i;

    

    // 1. 分配一个input_dev结构体 

    buttons_dev = input_allocate_device();;

    // 2. 设置 

    // 2.1 能产生哪类事件 

    set_bit(EV_KEY, buttons_dev->evbit);

    set_bit(EV_REP, buttons_dev->evbit);

    

    // 2.2 能产生这类操作里的哪些事件: L,S,ENTER,LEFTSHIT 

    set_bit(KEY_L, buttons_dev->keybit);

    set_bit(KEY_S, buttons_dev->keybit);

    set_bit(KEY_ENTER, buttons_dev->keybit);

    set_bit(KEY_LEFTSHIFT, buttons_dev->keybit);

    // 3. 注册 

    input_register_device(buttons_dev);

    

    // 4. 硬件相关的操作 

    init_timer(&buttons_timer);

    buttons_timer.function = buttons_timer_function;

    add_timer(&buttons_timer);

    

    for (i = 0; i < 4; i++)

    {

        request_irq(pins_desc[i].irq, buttons_irq, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,

                            pins_desc[i].name, &pins_desc[i]);

    }

    

    return 0;

}

static void buttons_exit(void)

{

    int i;

    for (i = 0; i < 4; i++)

    {

        free_irq(pins_desc[i].irq, &pins_desc[i]);

    }

    del_timer(&buttons_timer);

    input_unregister_device(buttons_dev);

    input_free_device(buttons_dev);    

}

module_init(buttons_init);

module_exit(buttons_exit);

MODULE_LICENSE("GPL");


关键字:Tiny210  按键输入  子系统 引用地址:Tiny210按键输入子系统

上一篇:Tiny210按键分层分离(总线-驱动-设备模型)
下一篇:Tiny210按键阻塞访问驱动

推荐阅读

start.S文件:.globl _start_start:1、硬件相关的设置:把外设的基地址告诉CPU,因为内存和外设寄存器的访问方式不同,所以要告诉CPU外设地址范围:0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间 ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-...
一、串口初始化void usart_init(){SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD = 0x20; //定时器工作方式2PCON = 0x00;TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (11.0592M)TL1 = 0xFD;ES = 1; //开串口中断EA = 1; //开总中断TR1 = 1; //启动定时器}SCON寄存器 1.SM0、SM1:串行口工作方式控制位 2.S...
很多人都看过那部电影,计算机高手捣鼓几下,就能把一大堆汽车全都控制了,想让它们往哪里冲就往哪里冲。看了电影,感到过瘾的同时,忍不住想,我的车会不会也出现这种情况?黑客能控制我们的汽车吗?观众的看法主要有两种,一种认为:假的,电影嘛,总要带点科幻色彩才比较震撼!另一种则认为:不行,现在的汽车太不安全了,我还是开回我的老捷达吧。今天...
由全球首屈一指的晶圆代工厂台积电生产制造,英华达股份有限公司率先将Montara用于旗下的泫音旗舰TR-X TWS入耳式耳机中国,北京-2021年10月12日-xMEMS Labs(美商知微电子)今天宣布,世界首款单芯片MEMS扬声器Montara现已投产。凭借与全球首屈一指的半导体晶圆代工伙伴台积电密切合作,Montara通过了所有性能与可靠度验证。英华达股份有限公司(IAC)也...

史海拾趣

问答坊 | AI 解惑

探寻对数放大器中的噪声成因与机理

  将对数放大器用作功率测量器件时,噪声系数是不是有意义的衡量指标?   这个问题的答案应该由用户来确定。但是,只要对数限幅放大器应用在信号通路(在PM或FM应用)中,噪声系数显然就是重要的指标,因为它可以衡量系统从伴随有噪声的信 ...…

查看全部问答∨

滤波器

请问什么是滤波器的截止频率?中心频率?…

查看全部问答∨

什么是有源器件,什么是无源器件?

1.问题:1.二极管是有源器件吗?个人认为是。2.那什么是有源器件,什么是无源器件?3.网上看到有人说需要加电源的就是有源器件,不用加电源的就是无源器件。二极管就不用加电源,那是无源器件喽????本人认为这种说法纯属扯淡。2.传言:此“源” ...…

查看全部问答∨

关于STM8的问题

请教st 的STM8单片机推出后将用什么开发工具(硬件,软件)进行开发相关的中文资料什么时候能出…

查看全部问答∨

竞猜!!!2011国赛出题大猜想之高精度液位控制

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 2011年国赛讨论,肯定有电源部分,放大部分肯定也有,可能实现方面必以前有很大的难度,还有好多的方面在这里就不说了,大家多讨论,关键一部分是国赛后封闭式训练,用的是赞助商的单片机,这个大家 ...…

查看全部问答∨

Cadence Allegro 16.50.000 详细破解步骤(win7和XP亲自验证)

Cadence Allegro 16.50.000 详细破解步骤(鉴于网上的一些和crack一起的破解攻略有些人说不行,我整理一个,需要安装程序的我可以通过迅雷网盘分享给大家) 具体的步骤:1、下载SPB16.5下来后,点setup.exe,先安装第一项licensemanager,问licen ...…

查看全部问答∨

诚信求教:mini2440怎么才能显示出Residentflash?

买了块mini2440,自己用光盘里给的工程编译了一个ce6镜像,烧进去看不到Residentflash,结果能用的存储空间就5M,完全不够用。我NANDFLASH是1G的,怎么样才能看到剩下的NANDFLASH空间啊? 到官方论坛根本没人理,看这里高手挺多,诚心求教。…

查看全部问答∨

题目!题目大家过来看看

本帖最后由 paulhyde 于 2014-9-15 03:01 编辑 题目!    …

查看全部问答∨

想通过DA输出模拟信号,如何设定滤波器使其变平滑?

      原始信号是一个类似正弦波的信号,周期是10微秒,信号频率90-110KHz,中心频率为100KHz,采样时取得1.25微秒一个点,然后用DA将采样得到的数据输出,输出也是1.25微秒输出一个点。想用RC滤波电路将DA输出的信号变平滑, ...…

查看全部问答∨

1mv低频信号放大

请教各位放大一个低频信号<50hz,且信号幅度1mv左右的小信号,该如何选择放大器?其余频率有噪声干扰 谢谢…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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