历史上的今天
今天是:2025年11月12日(星期三)
2022年11月12日 | S3C6410输入子系统按键驱动程序
2022-11-12 来源:csdn
以前写的驱动程序要另外写一个测试程序,这样的驱动程序就有很大的局限性,只能自己用,为了通用性,别人的应用程序也可以用我的驱动程序就要引入输入子系统。在这个驱动程序里设置了5个按键L, S, ENTER, LEFTSHIFT, ESC.设置这几个按键主要是为了方便测试。以下是驱动程序button_input.c
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct input_dev * button_dev; static struct pin_desc *irq_pd = NULL; static struct timer_list buttons_timer; static irqreturn_t buttons_irq(int irq, void *dev_id) { irq_pd = (struct pin_desc *)dev_id; mod_timer(&buttons_timer, jiffies + HZ/100); return IRQ_RETVAL (IRQ_HANDLED); } struct pin_desc{ int irq; char *name; unsigned int pin; unsigned int key_val; }; struct pin_desc pins_desc[5] = { {IRQ_EINT(0), "s1", S3C64XX_GPN(0), KEY_L}, {IRQ_EINT(1), "s2", S3C64XX_GPN(1), KEY_S}, {IRQ_EINT(2), "s3", S3C64XX_GPN(2), KEY_ENTER}, {IRQ_EINT(3), "s4", S3C64XX_GPN(3), KEY_LEFTSHIFT}, {IRQ_EINT(4), "s5", S3C64XX_GPN(4), KEY_ESC}, }; 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(button_dev, EV_KEY, pindesc->key_val, 0); input_sync(button_dev); } else { /* 按下的 */ input_event(button_dev, EV_KEY, pindesc->key_val, 1); input_sync(button_dev); } } static int button_init(void) { int i = 0; /*1. 分配一个input_dev结构体 */ button_dev = input_allocate_device(); /* 2.设置 能产生按键类事件*/ /* 哪类事件 */ set_bit(EV_KEY, button_dev->evbit); /* 重复类事件 */ set_bit(EV_REP, button_dev->evbit); /* 能产生哪些事件L,S,ENTER,SHIFT */ for (i = 0; i < 5; i++) { set_bit(pins_desc[i].key_val, button_dev->keybit); } /* 3.注册 */ input_register_device(button_dev); /* 4.硬件相关的操作 */ init_timer(&buttons_timer); buttons_timer.function = buttons_timer_function; buttons_timer.expires = jiffies + HZ/100; add_timer(&buttons_timer); for (i = 0; i < 5; i++) { request_irq(pins_desc[i].irq, buttons_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, pins_desc[i].name, &pins_desc[i]); } return 0; } static void button_exit(void) { int i; for (i = 0; i < 5; i++) { free_irq(pins_desc[i].irq, &pins_desc[i]); } del_timer(&buttons_timer); input_unregister_device(button_dev); input_free_device(button_dev); } module_init(button_init); module_exit(button_exit); MODULE_LICENSE("GPL"); 测试 打开一个记事本 有图有真相 这些字母是在开发板的LCD屏上通过开发板上的按键按下后显示出来的 如果按键足够多,就完全可以做出来一个像电脑键盘一样的驱动 
史海拾趣
|
(求助,在线等)linux下自动运行HELLOHWORLD的问题 刚开始接触ARM,现在用的是S3C44B0的开发板,不知道在uclinux下的rc里该修改哪些东西。 在网上看到应该修改如下第一个地址的rc,而且我照做了,make之后没有报错. uClinux-dist/vendors/Samsung/44B0/rc uClinux-dist/romfs/etc/rc 下面是我u ...… 查看全部问答> |
|
晶体三极管在电路中常用“Q”加数字表示,如:Q17表示编号为17的三极管。 1、特点:晶体三极管(简称三极管)是内部含有2个PN结,并且具有放大能力的特殊器件。 它分NPN型和PNP型两种类型,这两种类型的三极管从工作特性上可互相弥补,所谓OTL ...… 查看全部问答> |
|
http://www.pudn.com/downloads105/sourcecode/embed/detail434612.html 请发到我的邮箱里哈~~谢了 michelle_200312@163.com… 查看全部问答> |
|
版主问下关于小于100脚的STM32F103X的VDDA问题? 请问版主对于小于100脚的STM32F103X的VDDA需要电流是多大啊, 我想用一个3.3V基准源来做VDDA以提高内部AD的采样稳定性。使不受VDD电源 的干扰。不知这样是否可行!关于VDDA有具体参数吗?… 查看全部问答> |




