微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > [ARM应用]按键中断驱动实例

[ARM应用]按键中断驱动实例

时间:12-02 来源:互联网 点击:

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()等系统调用的连接

*参数 :

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top