📄 keys4.c
字号:
#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/timer.h>#include <linux/interrupt.h>#include <asm/irq.h>#include <asm/hardware.h>#include <asm/uaccess.h>#include <asm/arch/irqs.h>#include <asm/io.h>#include <asm/semaphore.h> #include <linux/major.h>#include <linux/vmalloc.h>#include <linux/fs.h>#define KEYS4_MAJOR 138 #define NOKEY 0#define KEY1 '1'#define KEY2 '2'#define KEY3 '3'#define KEY4 '4'static struct semaphore key_sem;static char key = NOKEY;devfs_handle_t devfs_keys4;static void keys4_clearirq(void){/*respond to EINT2-EINT5*/ SRCPND &= (~0x0000001c); //bit2,3,4 INTPND = INTPND; EINTPEND &= (~0x0000003c); //bit2,3,4,5}static void key1_irq_isr(int irq, void *dev_id, struct pt_regs *regs){ keys4_clearirq();// SRCPND &= (~0x0000001c); //bit2,3,4// INTPND = INTPND;// EINTPEND &= (~0x0000003c); //bit2,3,4,5 key=KEY1; up(&key_sem);}static void key2_irq_isr(int irq, void *dev_id, struct pt_regs *regs){ keys4_clearirq();// SRCPND &= (~0x0000001c); //bit2,3,4// INTPND = INTPND;// EINTPEND &= (~0x0000003c); //bit2,3,4,5 key=KEY2; up(&key_sem);}static void key3_irq_isr(int irq, void *dev_id, struct pt_regs *regs){ keys4_clearirq();// SRCPND &= (~0x0000001c); //bit2,3,4// INTPND = INTPND;// EINTPEND &= (~0x0000003c); //bit2,3,4,5 key=KEY3; up(&key_sem);}static void key4_irq_isr(int irq, void *dev_id, struct pt_regs *regs){ keys4_clearirq();// SRCPND &= (~0x0000001c); //bit2,3,4// INTPND = INTPND;// EINTPEND &= (~0x0000003c); //bit2,3,4,5 key=KEY4; up(&key_sem);}static ssize_t keys4_read(struct inode *inode, char *buf, unsigned long count){ down_interruptible(&key_sem); put_user(key,buf); key=NOKEY; return 1;}int keys4_open(struct inode *inode, struct file *file){// keys4_clearirq();// enable_irq(IRQ_EINT2);// enable_irq(IRQ_EINT3);// enable_irq(IRQ_EINT4);// enable_irq(IRQ_EINT5); sema_init(&key_sem,0); return 0;}void keys4_release(struct inode *inode, struct file *filp){// keys4_cleanirq();// disable_irq(IRQ_EINT2);// disable_irq(IRQ_EINT3);// disable_irq(IRQ_EINT4);// disable_irq(IRQ_EINT5); printk("release ok!\n"); return;}struct file_operations keys4_fops = { read:keys4_read, open:keys4_open, release:keys4_release,};static int __init keys4_init(void){ static int rc; unsigned long gpfup; set_external_irq(IRQ_EINT2,EXT_FALLING_EDGE, GPIO_PULLUP_DIS); set_external_irq(IRQ_EINT3,EXT_FALLING_EDGE, GPIO_PULLUP_DIS); set_external_irq(IRQ_EINT4,EXT_FALLING_EDGE, GPIO_PULLUP_DIS); set_external_irq(IRQ_EINT5,EXT_FALLING_EDGE, GPIO_PULLUP_DIS); gpfup = ioremap(0x56000058,4); (*(volatile unsigned long *)gpfup) &= 0xc3; //bit2,3,4,5 = 0. disable_irq(IRQ_EINT2); enable_irq(IRQ_EINT2); disable_irq(IRQ_EINT3); enable_irq(IRQ_EINT3); disable_irq(IRQ_EINT4); enable_irq(IRQ_EINT4); disable_irq(IRQ_EINT5); enable_irq(IRQ_EINT5); rc = request_irq(IRQ_EINT5, key1_irq_isr, SA_INTERRUPT, "keys4", NULL); if (rc) { printk("<1>keys4irq 1 irq not registered. Error: %d\n", rc); } rc = request_irq(IRQ_EINT4, key2_irq_isr, SA_INTERRUPT, "keys4", NULL); if (rc) { printk("<1>keyirq 2 irq not registered. Error: %d\n", rc); } rc = request_irq(IRQ_EINT3, key3_irq_isr, SA_INTERRUPT, "keys4", NULL); if (rc) { printk("<1>keyirq 3 irq not registered. Error: %d\n", rc); } rc = request_irq(IRQ_EINT2, key4_irq_isr, SA_INTERRUPT, "keys4", NULL); if (rc) { printk("<1>keyirq 4 irq not registered. Error: %d\n", rc); } // disable_irq(IRQ_EINT2);// disable_irq(IRQ_EINT3);// disable_irq(IRQ_EINT4);// disable_irq(IRQ_EINT5); printk("*********keys4 init ok!***********\n"); /* Register myirq as character device */ devfs_keys4 = devfs_register(NULL,"keys4",DEVFS_FL_DEFAULT,KEYS4_MAJOR, 0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP, &keys4_fops, NULL); /* if ((rc = register_chrdev(keyirq_MAJOR, "keys4", &keys4_fops)) < 0) { printk("keyirq: can't get major %d\n",keyirq_MAJOR); return; } */ return 0;}static void __exit keys4_exit(void){ disable_irq(IRQ_EINT2); disable_irq(IRQ_EINT3); disable_irq(IRQ_EINT4); disable_irq(IRQ_EINT5); free_irq(IRQ_EINT5, key1_irq_isr); free_irq(IRQ_EINT4, key2_irq_isr); free_irq(IRQ_EINT3, key3_irq_isr); free_irq(IRQ_EINT2, key4_irq_isr); devfs_unregister(devfs_keys4);}module_init(keys4_init);module_exit(keys4_exit);//__initcall(keys4_init);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -