历史上的今天
返回首页

历史上的今天

今天是:2025年11月12日(星期三)

正在发生

2022年11月12日 | MINI2440 按键输入子系统 驱动及测试代码分析

2022-11-12 来源:csdn

按键输入子系统驱动:


#include

#include

#include

#include

#include

#include /* for -EBUSY */

#include /* for request_region */

#include /* for loops_per_jiffy */

#include    /* for inb_p, outb_p, inb, outb, etc. */

#include /* for get_user, etc. */

#include   /* for wait_queue */

#include   /* for __init, module_{init,exit} */

#include   /* for POLLIN, etc. */

#include

#include

#include

#include

#include

#include


struct pin_desc {

    int     irq;

    int     pin;

    int     pin_state;

    char    *name;

    int     key_val;

    int     pin_val;

};


static struct pin_desc buttons_pin[] = {

    {IRQ_EINT8,    S3C2410_GPG(0),   S3C2410_GPG0_EINT8,    "KEY1",   BTN_0},

    {IRQ_EINT11,   S3C2410_GPG(3),   S3C2410_GPG3_EINT11,   "KEY3",   BTN_1},

    {IRQ_EINT13,   S3C2410_GPG(5),   S3C2410_GPG5_EINT13,   "KEY2",   BTN_2},

    {IRQ_EINT14,   S3C2410_GPG(6),   S3C2410_GPG6_EINT14,   "KEY4",   BTN_3},

    {IRQ_EINT15,   S3C2410_GPG(7),   S3C2410_GPG7_EINT15,   "KEY5",   BTN_4},

    {IRQ_EINT19,   S3C2410_GPG(11),  S3C2410_GPG11_EINT19,  "KEY6",   BTN_5},

};


static struct input_dev *buttons_input;


static irqreturn_t buttons_interrupt(int irq,void *dev_id)

{

    struct pin_desc *pin_desc = (struct pin_desc *)dev_id;

    int val;

    val = s3c2410_gpio_getpin(pin_desc->pin);


    input_event(buttons_input,EV_KEY,pin_desc->key_val, !val);

    input_sync(buttons_input);


    return IRQ_HANDLED;

}


static int __init buttons_init(void)

{

    int error;

    int i;


    buttons_input = input_allocate_device();

    if(!buttons_input)

        return  -ENOMEM;


#if 0

    buttons_input->evbit[0] = BIT(EV_KEY);


    buttons_input->keybit[BITS_TO_LONGS(KEY_L)] = BIT(KEY_L);

    buttons_input->keybit[BITS_TO_LONGS(KEY_S)] = BIT(KEY_S);

    buttons_input->keybit[BITS_TO_LONGS(KEY_ENTER)] = BIT(KEY_ENTER);

    buttons_input->keybit[BITS_TO_LONGS(KEY_LEFTSHIFT)] = BIT(KEY_LEFTSHIFT);

#endif


    set_bit(EV_KEY,buttons_input->evbit);


    for(i = 0;i    {

        set_bit(buttons_pin[i].key_val,buttons_input->keybit);

    }


    error = input_register_device(buttons_input);

    if(error){

        input_free_device(buttons_input);

        return -1;

    }

   

    for(i = 0;i    {

       s3c2410_gpio_cfgpin(buttons_pin[i].pin,buttons_pin[i].pin_state);

       request_irq(buttons_pin[i].irq,buttons_interrupt, IRQF_SHARED | IRQF_TRIGGER_RISING

               | IRQF_TRIGGER_FALLING,buttons_pin[i].name,(void *)&buttons_pin[i]);

    }

   

    return 0;


}

static void __exit buttons_exit(void)

{

    int i;

   

    for(i = 0; i< sizeof(buttons_pin)/sizeof(buttons_pin[0]); i++)

    {

        free_irq(buttons_pin[i].irq, (void *)&buttons_pin[i]);

    }


    input_unregister_device(buttons_input);

    input_free_device(buttons_input);

}


module_init(buttons_init);

module_exit(buttons_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("RopenYuan");

 


按键输入子系统测试程序


 


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


int main(void)

{

 int buttons_fd;

 int key_value,i=0,count;


 struct input_event ev_key;

 buttons_fd = open("/dev/input/event0", O_RDWR);

 if (buttons_fd < 0) {

  perror("open device buttons");

  exit(1);

 }


 for (;;) {

  count = read(buttons_fd,&ev_key,sizeof(struct input_event));

  for(i=0; i<(int)count/sizeof(struct input_event); i++)

   if(EV_KEY==ev_key.type)

    printf("type:%d,code:%d,value:%dn", ev_key.type,ev_key.code,ev_key.value);


   if(EV_SYN==ev_key.type)

    printf("syn eventnn");


    }


 close(buttons_fd);

 return 0;

}


MAKEFILE


ifneq ($(KERNELRELEASE),)


obj-m := buttons.o


else

  

#KDIR := /home/yuanpengjun/home/linuxeditorkernelfilesystem/kernal/linux-2.6.32/linux-2.6.32.2/

KDIR := /home/yuanpengjun/mini2440/kernel/linux-2.6.32.2/

all:

#  make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

  make -C $(KDIR) M=$(PWD) modules

  /home/yuanpengjun/mini2440/editor/4.4.3/bin/arm-none-linux-gnueabi-gcc -o button button_app.c


clean:

  rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*


endif


以上驱动代码未加入容错处理,只是为了验证是否能成功运行。


在模块加载时出现input: Unspecified device as /devices/virtual/input/input0  


原因为没有在驱动中设置struct input_dev 中的成员名name,若有成员名为 XXXX->name = "yyyyyyy",驱动模块加载后会出现如下情况:


input: yyyyyyy as /devices/virtual/input/input0  


在模块卸载时出现rmmod: chdir(2.6.32.2): No such file or directory,并且不能将模块从系统中卸载掉;


原因为:现在的内核模块在插入卸载时都会要转到/lib/modules/内核版本号/ 这个目录里,格式为/lib/modules/2.6.32.2/ 在这种情况下,不会再出现模块不能卸载情况;


推荐阅读

史海拾趣

DALLAS公司的发展小趣事

Dallas公司非常重视与全球客户的合作关系。公司积极与全球各地的客户建立联系,了解他们的需求和反馈,为他们提供定制化的产品和服务。这种紧密的合作关系不仅为Dallas公司带来了稳定的订单和收入来源,也促进了公司产品的不断改进和创新。

赛微(Cellwise)公司的发展小趣事

赛微公司自创立之初,就专注于模拟芯片的研发和销售。公司汇聚了一批资深的模拟集成电路设计专家和电池电化学专家,致力于在电池管理芯片和电源管理芯片领域实现技术突破。通过不断的技术创新和研发投入,赛微成功推出了一系列高性能、高可靠性的电池安全芯片、电池计量芯片和充电管理芯片等产品,赢得了市场的广泛认可。

ETL [E-Tech Electronics LTD]公司的发展小趣事

随着市场竞争的加剧,ETL意识到只有不断创新才能在市场中立于不败之地。因此,公司加大了对研发的投入,积极引进先进技术和设备,不断推出具有创新性的电子产品。这些产品不仅具有更高的性能和更长的使用寿命,而且更符合市场需求,使得ETL在市场中的竞争力得到了显著提升。

Coherent Inc公司的发展小趣事

尽管电子行业竞争激烈,市场变化莫测,但Coherent Inc.始终保持着坚定的前行步伐。公司不断适应市场变化,调整战略方向,积极应对各种挑战。同时,公司也注重与合作伙伴的紧密合作,共同推动激光技术的创新和应用。这种坚定前行的态度,使得Coherent Inc.在电子行业中始终保持着领先的地位。

这五个故事只是Coherent Inc.发展历程中的一部分,但它们足以展示公司在电子行业中的崛起和发展。通过不断的探索、创新、收购与整合,以及坚定的前行态度,Coherent Inc.已经成为了激光技术领域的佼佼者,为电子行业的发展做出了重要贡献。

China Semiconductor Corp公司的发展小趣事

为了进一步提升竞争力,CSC开始着手进行产业链整合。公司通过与上下游企业的深度合作,形成了紧密的产业链协同关系。这不仅降低了生产成本,提高了生产效率,还使得CSC能够更好地把握市场动态和技术趋势,为公司的持续发展提供了有力保障。

Hewlett Packard Co公司的发展小趣事
在电路组装完成后进行充分的调试和测试,确保各项功能正常且音质满足要求。

问答坊 | AI 解惑

LED手电筒电路

一般的小手电筒通常存在的问题是电池寿命太短。据统计,普通的手电筒耗电量大约在为2瓦。如图所示的LED手电筒所消耗的电量仅仅只有24mW,4节5号碱性电池可提供超过80次的服务(这意味着,可持续使用1个月)尽管这个手电筒的亮度很有限, 但用于普通 ...…

查看全部问答>

安防英文词解释

MPG 用MPEG-1压缩标准压缩的文件格式。它可以同进包括图像文件的画面和伴音面分,出可以只包括画面成分。        AVI AAVI是 Audio Video Interleave 的缩写,Windows3.1的视频格式,兼容好、调用方便、图象质量好,体积大。& ...…

查看全部问答>

头像问题

是不是弄一个模型人的头像啊?就两个坛子叠加在一起,好像不吸引眼球啊,上传自己的头像又怕吃亏,呵呵,效仿一下qq头像行吗?不知道有没有问题?…

查看全部问答>

89C51定时器初始值计算程序

本帖最后由 paulhyde 于 2014-9-15 09:32 编辑 89C51定时器初始值计算程序  …

查看全部问答>

高手请教如何设计交通控制灯

内容:设计一个十字路口的红、绿、黄三色信号交通灯控制电路 设计要求与数据:1. 用红、绿、黄三色发光二极管作信号灯。主干道为东西向,有红、绿、黄三个灯;支干道为南北向,也有红、绿、黄三个灯。红灯亮禁止通行;绿灯亮允许通行;黄灯亮则给 ...…

查看全部问答>

关于KEIL C中CODE定址问题

现在有一个程序是分BANK的,在某一BANK中有一条 printf(\"test0000000000000000000\");编译完后发现 \"test0000000000000000000\"被放到了common bank中,有没有什么办法能让这个字符串被编译到一个指字的地址之后? 比如要把test0000000000000000 ...…

查看全部问答>

我想学硬件编程学什么好呀

我是学java的向学点硬件的知识,谁能介绍介绍…

查看全部问答>

多核 — 面向 7 岁以上儿童

让孩子熟悉多核的含义!让孩子有着单核多核的不同体验——亲子工作体验活动(德州仪器TI在马里兰州日耳曼敦举行) 欲知更多,请下载附件一探究竟~~~ …

查看全部问答>

开关电源的功率因数低是为什么

小弟有个疑问,需要大家帮助解答一下,开关电源的功率因数低是为什么?跟什么因素有关系呢?…

查看全部问答>