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参考上个程序,测试程序不用写了,注册的中断服务程序有显示!主要把握框架,怎么写中断。
这里的风景美不胜收,真让人流连忘返。