/*************************************
按键的驱动,在TQ2440A上做测试
维护记录: 2010-11-13 V1.0 by ZZC
linux内核:2.6.31
硬件接法:
KEY1 --> GPF1
KEY2 --> GPF4
KEY3 --> GPF2
KEY4 --> GPF0
*************************************/
#include <linux/module.h> //所有模块都需要这个头文件
#include <linux/kernel.h> //声明了printk()这个内核态用的函数
#include <linux/fs.h> //文件系统有关的,结构体file_operations在头文件 linux/fs.h中定义
#include <linux/init.h> //init和exit相关宏
#include <linux/delay.h> //延迟函数的定义声明
#include <asm/irq.h> //arm中断定义,如中断号的定义IRQ_EINT1
#include <linux/interrupt.h> //interrupt.h中包含了与中断相关的大部分宏及struct结构的定义,如request_irq函数
#include <asm/uaccess.h> //Linux 中的用户和内核态内存交互函数 如copy_from_user
//#include <asm/arch/regs-gpio.h> //寄存器设置
#include <mach/regs-gpio.h>
//#include <asm/hardware.h>
#include <mach/hardware.h> //IO空间的物理地址定义
#include <linux/device.h> //在这个头文件中主要是misc(混合)设备注册和注销
#include <linux/poll.h> //本例中定义了POLLIN | POLLRDNORM
#include <linux/gpio.h>
#define BUFFER_SIZE 256
#define DEVICE_NAME "TX2440-button" /* 设备名称 */
static int BUTTON_MAJOR = 0; /* 主设备号 */
static volatile int key_values [] = {0, 0, 0, 0};
static DECLARE_WAIT_QUEUE_HEAD(button_waitq); //定义一个等待队列头,并初始化该等待队列头
static volatile int ev_press = 0;
struct button_irq_desc
{
int irq; //中断号
int pin; //中断引脚
int pin_setting; //设置引脚功能
int number; //按键的值
char *name; //自定义的中断名称
};
/* 用来指定按键所用的外部中断引脚及中断触发方式, 名字
IRQ_EINT0~IRQ_EINT4在arch/arm/mach-s3c2410/include/mach/irqs.h文件中有定义*/
static struct button_irq_desc button_irqs [] =
{
{IRQ_EINT1, S3C2410_GPF(1), S3C2410_GPF1_EINT1, 0, "KEY1"}, /* K1 */
{IRQ_EINT4, S3C2410_GPF(4), S3C2410_GPF4_EINT4, 1, "KEY2"}, /*
linux下驱动之按键驱动总结
最新推荐文章于 2022-11-28 18:52:27 发布
本文总结了Linux环境下驱动开发中按键驱动的相关知识,包括如何解决rmmod卸载驱动时遇到的问题,理解用户空间与系统空间的区别,以及程序睡眠的含义。同时,列举了多个关于字符设备驱动、中断处理、等待队列和2440处理器中断的参考资料链接,是Linux驱动学习者的实用指南。
摘要由CSDN通过智能技术生成