[ARM应用]按键中断驱动实例
rrupt.h中定义了typedef irqreturn_t (*irq_handler_t)(int, void *);
*************************************************************************
*/
static irqreturn_t isr_button(int irq,void *dev_id,struct pt_regs *regs)
{
disable_irq(0); //禁止中断
dev.status = BUTTON_X;//将按键置为抖动状态,说明有按键中断,但不一定有键按下
enable_irq(0); //使能中断
return 0;
}
/*
**************************s3c2410_button_open()**************************
*描述 :打开设备函数,向系统申请中断
*参数 :struct inode *inode,struct file *filp
*返回值:失败返回错误代码ret,成功返回0
*************************************************************************
*/
static int s3c2410_button_open(struct inode *inode,struct file *filp)
{
int ret;
ret=request_irq(BUTTON_IRQ,isr_button,IRQF_SAMPLE_RANDOM,DEVICE_NAME,NULL); //申请中断
if(ret) {//申请失败
printk("BUTTON_IRQ: could not register interrupt\n");
return ret;
}
return 0;
}
/*
************************s3c2410_button_release()*************************
*描述 :注销设备函数,实现中断释放
*参数 :struct inode *inode,struct file *filp
*返回值:0
*************************************************************************
*/
static int s3c2410_button_release(struct inode *inode,struct file *filp)
{
free_irq(BUTTON_IRQ,NULL); //释放中断
return 0;
}
/*
**************************3c2410_button_ioctl()**************************
*描述 :IO控制函数,本实例中不做任何事
*参数 :cmd: 用户定义的IO控制命令; arg: 传递用户参数
*返回值:0
*************************************************************************
*/
static int s3c2410_button_ioctl(struct inode *inode,struct file *filp,
unsigned int cmd,unsigned long arg)
{
return 0;
}
/*
**************************s3c2410_button_read()**************************
*描述 :读函数,读取按键的状态
*参数 :buffer: 用来存储按键状态;
count: 用来记录用户读取了多少个字符
*返回值:count:用户读取的字符数
*************************************************************************
*/
static ssize_t s3c2410_button_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
int ret = count ;
if(dev.status = BUTTON_X){//如果按键状态是BUTTON_X,说明有按键中断产生。
msleep(20); //延时20毫秒去除按键抖动
disable_irq(0); //禁止中断
s3c2410_gpio_cfgpin(BUTTON,BUTTON_INP); //配置按键中断的端口为输入功能
if(!s3c2410_gpio_getpin(BUT
if(!s3c2410_gpio_getpin(BUTTON)){//读取端口的值,如果是0说明按键按下
dev.status = BUTTON_DOWN;
}
else dev.status = BUTTON_UP; //如果为1,说明只是按键抖动
//重新配置按键中断的端口为中断功能
s3c2410_gpio_cfgpin(BUTTON,S3C2410_GPF0_EINT0);
enable_irq(0); //使能中断
}
put_user(dev.status,(int *)buffer); //将按键状态提交给用户
return ret;
}
/*
**************************3c2410_button_write()**************************
*描述 :写操作函数,本实例中不做任何事
*参数 :
*返回值:count
*************************************************************************
*/
static ssize_t s3c2410_button_write(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
int ret = count;
return ret;
}
/*
**************************s3c2410_button_fops****************************
*描述 :文件操作结构体,实现 s3c2410_button_open()等函数与open()等系统调用的连接
*参数 :
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)