历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-10-12 来源:eefocus

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");


推荐阅读

史海拾趣

DLP Design公司的发展小趣事

DLP绿色科技公司,积极响应国家环保政策,致力于研发和生产绿色环保的DLP技术产品。公司采用先进的生产工艺和材料,降低产品能耗和排放。同时,DLP绿色科技还积极推广节能环保的理念和技术,倡导消费者使用环保产品。通过不懈的努力和实践,DLP绿色科技在电子行业树立了绿色环保的典范形象,为行业的可持续发展做出了积极贡献。

请注意,以上故事均为虚构,旨在展示DLP Design公司在电子行业中的可能发展路径和成就。实际情况可能因公司背景、市场环境等因素而有所不同。

Danaher Corporation公司的发展小趣事

自上世纪80年代起,丹纳赫集团通过一系列的战略并购,逐渐扩大其在电子行业的影响力。这些并购不仅为丹纳赫集团带来了先进的技术和产品,还增强了其在全球市场的竞争力。其中,对Leica显微系统公司的收购标志着丹纳赫集团正式涉足生命科学业务,为其在电子显微镜和生命科学仪器领域的发展奠定了基础。

Dynastream公司的发展小趣事

成为Garmin全资子公司后,Dynastream并没有停止前进的步伐。相反,公司更加注重技术创新和产品研发。在保持传统优势产品的基础上,Dynastream不断推出新产品、新技术,以满足市场的不断变化和客户的多样化需求。同时,公司还积极拓展国际市场,将产品销往全球各地。

Bce Sud公司的发展小趣事

Bce Sud公司成立之初,专注于研发高效能的半导体芯片。面对市场上激烈的竞争,公司创始人凭借其在微电子领域的深厚积累,带领团队成功研发出一款具有低能耗、高稳定性的新型芯片,这一技术突破为公司在市场上打开了局面。随着这款芯片的推出,Bce Sud逐渐在电子行业树立了技术领先的形象。

EBK Kruger GmbH & Co KG公司的发展小趣事

面对数字化浪潮的挑战,EBK Kruger积极拥抱数字化转型。公司引入了先进的ERP系统和智能制造技术,提高了生产效率和产品质量。同时,EBK Kruger还加强了对大数据和人工智能技术的研发和应用,为客户提供了更加智能化和个性化的产品和服务。通过数字化转型的推动,EBK Kruger在激烈的市场竞争中保持了领先地位。

常忆科技(CHINGIS)公司的发展小趣事

随着科技的飞速发展,常忆科技深知技术创新的重要性。因此,公司不断加大研发投入,引进和培养了一批高素质的研发人员。这些研发人员致力于开发新型的非挥发性内存技术,以满足市场对于更高性能、更低功耗和更小体积的需求。

经过多年的努力,常忆科技成功研发出了一系列具有自主知识产权的新型内存产品。这些产品不仅性能卓越,而且具有极高的可靠性,赢得了众多客户的青睐。技术创新和产品升级成为常忆科技在电子行业中脱颖而出的关键因素。

问答坊 | AI 解惑

用单层PCB设计超低成本混合调谐器

今天,电视机与视讯转换盒应用中的大多数调谐器采用的都是传统单变换MOPLL概念。这种调谐器既能处理模拟电视讯号也能处理数字电视讯号,或是同时处理这两种电视讯号(即所谓的混合调谐器)。在设计这种调谐器时需考虑的关键因素包括低成本、低功耗、 ...…

查看全部问答>

扣币不对啊!

今天我发现下载附件的时候,芯币被多扣了! 按照soso所说的每下一个附件-4芯币,可我下载两个附件却不见了16个芯币。是不是下载不同的附件需要不同数量的芯币?现在我只剩下3个芯币了:L !!!         所以我有两点建 ...…

查看全部问答>

stc89c51

谁了解stc89c51的用法,给点提示啊.......…

查看全部问答>

急需!!毕业设计,题目《IC卡的身份识别开关》

周六就要交给老师看了,可才做了一半,实在找不到资料了,请求各路朋友帮帮忙啊!!!…

查看全部问答>

自动物流中A GV 的通讯网络解决方案

[ 摘 要]本文介绍了工业自动物流中A GV (自动导航小车) 的通讯解决方案。简要介绍了无线数据通讯与工业控制系 统的集成方式, 主要讨论关于A GV 无线通讯模块的组成与实现以及部分软件设计。…

查看全部问答>

关于USB设备的读取

{                 m_strLog += _T(\"抱歉,未找到可用的USB设备\");…

查看全部问答>

提问:evc4.0能否支持DirectX9.0??

公司要我在WINCE下实现Direct3D应用,我以前没用过EVC4.0,但用过VC6.0。在EVC中我只加进头文件后就发生以下错误: pogram Files\\Microsoft DirectX 9.0 SDK (December 2004)\\Include\\d3dx9math.inl(1578) : error C2065: \'sqrtf\' : undeclare ...…

查看全部问答>

内核起来了,但串口输出停在Freeing init memory: 88K

移植linux2.6.22至pxa270基本成功了 nfs方式能将系统起来。 工具链为arm-none-linux-gnueabi busybox版本1.9.0。 启动参数:boot root=/dev/nfs rw nfsroot=192.168.1.100:/rootfs ip=192.168.1.200::::: console=ttyS0,38400 netmac=00:cf:0a: ...…

查看全部问答>

驱动为何会装载后马上卸载?

写了个USB转COM口的驱动,但是为何系统启动过程中装载完驱动就迅速卸载? 打印信息, USBToCOM::Process Attach USBToCOM::Process Detach sources文件 RELEASETYPE=PLATFORM TARGETNAME=ucom TARGETTYPE=DYNLINK DLLENTRY=DllEntry DEF ...…

查看全部问答>