S3C6410输入子系统按键驱动程序

本文介绍了一种基于Linux平台的按键驱动程序实现方法。该驱动程序能够支持五种不同的按键,并通过输入子系统与其他应用程序交互。文中详细展示了驱动程序的代码结构及按键事件的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前写的驱动程序要另外写一个测试程序,这样的驱动程序就有很大的局限性,只能自己用,为了通用性,别人的应用程序也可以用我的驱动程序就要引入输入子系统。在这个驱动程序里设置了5个按键L, S, ENTER, LEFTSHIFT, ESC.设置这几个按键主要是为了方便测试。以下是驱动程序button_input.c
#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 <asm/irq.h>
#include <asm/io.h>
#include <mach/gpio.h>




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屏上通过开发板上的按键按下后显示出来的
如果按键足够多,就完全可以做出来一个像电脑键盘一样的驱动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值