您的位置:首页 > 其它

字符设备驱动之Buttons-中断

2011-09-14 16:14 295 查看
buttons.c

#include <linux/fs.h>

#include <linux/module.h>

#include <linux/errno.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/cdev.h>

#include <linux/ioport.h>

#include <linux/pci.h>

#include <asm/uaccess.h>

#include <asm/io.h>

#include <asm/irq.h>

#include <linux/interrupt.h>

#include <asm/mach/irq.h>

static int major = 0;

static struct class *cls;

/* gpecon 0x56000040 */

/* gpfcon 0x56000050 */

/* gpgcon 0x56000060 */

static volatile unsigned long *gpecon;

static volatile unsigned long *gpedat;

static volatile unsigned long *gpfcon;

static volatile unsigned long *gpfdat;

static volatile unsigned long *gpgcon;

static volatile unsigned long *gpgdat;

static irqreturn_t
buttons_irq(int irq, void *dev_id)/*中断处理函数*/

{

char *str = (char *)dev_id;

printk("irq = %d, dev_id = %s\n", irq, dev_id);

return IRQ_HANDLED;

}

int buttons_open(struct inode *inode, struct file *file)

{

return 0;

}

ssize_t buttons_read(struct file *inode, char __user *buf, size_t size, loff_t *offset)

{

return 0;

}

static const struct file_operations buttons_fops = {

.owner = THIS_MODULE,

.read = buttons_read,

.open = buttons_open /* 设置引脚,申请资源 */

};

char *id = "K10";

int buttons_init(void)

{

major = register_chrdev(0, "buttons", &buttons_fops);

/* sysfs */

cls = class_create(THIS_MODULE, "buttons_class");

class_device_create(cls, NULL, MKDEV(major, 0), NULL, "buttons");

gpecon = ioremap(0x56000040, 4096);

gpedat = gpecon + 1;

gpfcon = gpecon + 4;

gpfdat = gpfcon + 1;

gpgcon = gpecon + 8;

gpgdat = gpgcon + 1;

/* 注册中断 */

request_irq(IRQ_EINT0, buttons_irq,

IRQF_SHARED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,

"K1_irq", id);

/* 设置GPIO为中断引脚

* 设置触发方式

* 使能中断

*/

/* 设置KSCAN0(GPE11)为输出引脚,输出0 */

*gpecon &= ~(0x3 << 22);

*gpecon |= (1 << 22);

*gpedat &= ~(1<<11);

return 0;

}

void buttons_exit(void)

{

unregister_chrdev(major, "buttons");

class_device_destroy(cls, MKDEV(major, 0));

class_destroy(cls);

iounmap(gpecon);

free_irq(IRQ_EINT0, id);/*释放中断资源*/

}

module_init(buttons_init);

module_exit(buttons_exit);

MODULE_LICENSE("GPL");

Makefile参考上个程序,测试程序不用写了,注册的中断服务程序有显示!主要把握框架,怎么写中断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: