一个相当详细的S3C2440按键驱动详解
### S3C2440 按键驱动详解 #### 概述 本文将详细介绍如何为S3C2440处理器上的按键设计并实现一个驱动程序。S3C2440是一款由Samsung公司生产的高性能、低功耗ARM920T微处理器,广泛应用于嵌入式系统中。在设计按键驱动时,我们需要考虑硬件接口的设计、中断处理机制以及软件编程技巧等多方面因素。 #### 硬件接口设计 在S3C2440上,按键通常通过GPIO(General Purpose Input Output)引脚连接。每个按键都对应一个或多个GPIO引脚,并且每个引脚可以配置为外部中断输入(EINT)。以下是S3C2440上按键与GPIO引脚的对应关系: - **K1**: GPG0 (EINT8) - **K2**: GPG3 (EINT11) - **K3**: GPG5 (EINT13) - **K4**: GPG6 (EINT14) - **K5**: GPG7 (EINT15) - **K6**: GPG11 (EINT19) 这些引脚可以通过编程设置为输入模式,并启用相应的外部中断功能。当按键被按下时,会触发外部中断,从而调用中断服务程序进行处理。 #### 软件编程技巧 为了更好地管理按键及其对应的中断处理程序,我们定义了一个结构体`button_irq_desc`来存储按键的相关信息: ```c struct button_irq_desc { int irq; // 对应的中断号 int pin; // GPIO引脚编号 int pin_setting; // GPIO引脚配置 int number; // 按键编号 char *name; // 按键名称 }; ``` 此结构体用于描述每一个按键的信息,例如: ```c static struct button_irq_desc button_irqs[] = { {IRQ_EINT8, S3C2410_GPG0, S3C2410_GPG0_EINT8, 0, "KEY1"}, {IRQ_EINT11, S3C2410_GPG3, S3C2410_GPG3_EINT11, 1, "KEY2"}, {IRQ_EINT13, S3C2410_GPG5, S3C2410_GPG5_EINT13, 2, "KEY3"}, {IRQ_EINT14, S3C2410_GPG6, S3C2410_GPG6_EINT14, 3, "KEY4"}, {IRQ_EINT15, S3C2410_GPG7, S3C2410_GPG7_EINT15, 4, "KEY5"}, {IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_EINT19, 5, "KEY6"} }; ``` 此外,我们还需要定义一个全局数组`key_values`,用来存储当前各按键的状态: ```c static volatile int key_values[] = {0, 0, 0, 0, 0, 0}; ``` 这里使用了`volatile`关键字,确保编译器不会对`key_values`数组中的值进行优化,保证数据的一致性。 #### 中断处理程序 当某个按键被按下时,会触发相应的中断。为了响应这些中断,我们需要编写中断处理函数。在Linux内核中,可以通过注册中断处理函数来实现这一功能。例如: ```c void buttons_interrupt(unsigned int irq, void *dev_id, struct pt_regs *regs) { int i; for (i = 0; i < ARRAY_SIZE(button_irqs); i++) { if (irq == button_irqs[i].irq) { // 处理按键中断 if (input_get_value(button_irqs[i].pin) == 0) { key_values[i] = 1; wake_up_interruptible(&button_waitq); } else { key_values[i] = 0; wake_up_interruptible(&button_waitq); } break; } } } ``` 在这个函数中,我们遍历所有的按键,并检查当前触发的中断是否与按键相关联。如果匹配,则更新`key_values`数组中的值,并唤醒等待队列`button_waitq`。 #### 等待队列 为了提高按键驱动的效率,我们可以使用Linux内核提供的等待队列(`wait_queue_head_t`)。当按键状态发生变化时,通过唤醒等待队列来通知正在等待的进程。具体实现如下: ```c static DECLARE_WAIT_QUEUE_HEAD(button_waitq); ``` 这里定义了一个名为`button_waitq`的等待队列头,用于等待按键状态的变化。在中断处理函数中,每当按键状态发生改变时,就会调用`wake_up_interruptible()`函数来唤醒等待队列中的进程。 #### 结论 通过上述步骤,我们可以成功地为S3C2440设计并实现一个完整的按键驱动程序。这个驱动不仅可以高效地检测到按键的按压事件,还能通过中断机制及时响应按键操作,大大提高了用户体验。在实际开发过程中,还需要根据具体的硬件配置和需求进行相应的调整和完善。
转:一个相当详细的MINI2440按键驱动详解 转:一个相当详细的MINI2440按键驱动详解
原文地址:http://hi.baidu.com/messm/blog/item/4a2d65f261855859352acc5f.html
/*mini2440_buttons_my.c*/
/*后面加了_my*/
/*按键驱动程序*/
/*mini2440所用到的按键资源*/
/**************************************************/
/* 按键 对应的IO寄存器 对应的中断引脚*/
/* K1 GPG0 EINT8 */
/* K2 GPG3 EINT11 */
/* K3 GPG5 EINT13 */
/* K4 GPG6 EINT14 */
/* K5 GPG7 EINT15 */
/* K6 GPG11 EINT19 */
/**************************************************/
/*要搞清楚谁是输入*/
/*在这里,按键控制对应的中断引脚,从而控制对应的IO寄存器*/
/*相当于信息从外面输入*/
/*我们要做的是根据对应的输入信息,来采取相应的响应动作*/
/*这就达到了中断响应的目的*/
/*其核心就是要检测*/
/*那么,该如何去检测呢?*/
/*通过什么来检测呢?*/
/*这是个非常重要的问题*/
/*我想应该看具体的电路原理图*/
/*只有看图,才能了解具体的电路连接情况*/
/*从而得知设备所需的硬件资源*/
/*厂商的原理图通常给的都比较详细*/
/*引用的头文件*/
#include <linux/module.h> /*模块有关的*/
#include <linux/kernel.h> /*内核有关的*/
#include <linux/fs.h> /*文件系统有关的*/
#include <linux/init.h> /*init*/
#include <linux/delay.h> /*delay*/
#include <linux/poll.h> /*poll*/
#include <asm/irq.h> /*中断*/
#include <linux/interrupt.h> /*linux中断*/
#include <asm/uaccess.h> /*uaccess*/
#include <asm/arch/regs-gpio.h> /*寄存器设置*/
#include <asm/hardware.h> /*hardware*/
剩余21页未读,继续阅读
- 狸猫塔塔2015-01-27参考看看,并不会特别有用
- xshch1112012-09-04很适合新手看看
- 粉丝: 18
- 资源: 392
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助