📄 irqtest_kernel.c
字号:
/*This irqtest device is used to test the interrupt using gpio9 as the interrupt source and using the interrupt to light gpio10.*/#include<linux/module.h>#include<linux/config.h>#include<linux/kernel.h>#include<linux/init.h>#include<asm/uaccess.h>#include<asm/mach-au1x00/au1000.h>#include<asm/io.h>#include<linux/types.h>#include<linux/miscdevice.h>#include<asm/ioctl.h>#include<linux/fs.h>#include<linux/stat.h>#include<linux/sched.h>#include<linux/interrupt.h>#include<linux/mm.h>#define DEBUG#ifdef DEBUG# define PRITNTK(format,args...) printk(KERN_DEBUG "irqtest:"format,##args)#else # define PRITNTK(format,args...) #endif#define IRQTEST_MINOR 137 #define IRQTEST_IS_OPEN 0x1 static spinlock_t irqtest_lock; //spinlock_t变量名static unsigned long irqtest_status = 0;#define IRQTEST_IOC_MAGIC 'F'#define START_IRQTEST _IO(IRQTEST_IOC_MAGIC,0)#define STOP_IRQTEST _IO(IRQTEST_IOC_MAGIC,1)void irqtest_interrupt(int irq, void *dev_id, struct pt_regs *regs){ PRINTK("------irqtest_interrupt------"); int i; for(i=1;i<=10;i++) { au_writel(0x00000400, SYS_OUTPUTSET); mdelay(500); au_writel(0x00000400, SYS_OUTPUTCLR); mdelay(500); }}static int irqtest_open(struct inode *inode, struct file *filp) //static定义内部函数{ PRINTK("irqtest_open\n"); spin_lock_irq(&irqtest_lock); if (irqtest_status & IRQTEST_IS_OPEN) // if(0) { spin_unlock_irq(&irqtest_lock); return -EBUSY; } irqtest_status |= IRQTEST_IS_OPEN; //gpio17_lcd_status=1 spin_unlock_irq(&irqtest_lock); return 0;}static int irqtest_release(struct inode *inode, struct file *filp){ PRINTK("------irqtest_release------\n"); spin_lock_irq(&irqtest_lock); irqtest_status &= ~IRQTEST_IS_OPEN; //gpio17_lcd_status=0 spin_unlock_irq(&irqtest_lock); return 0;}static int irqtest_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg){ PRITNTK("------irqtest_ioctl------"); int result=0; switch (cmd) //switch语句中的return和break都可跳出 { case START_IRQTEST: result=request_irq(AU1000_GPIO_9,irqtest_interrupt,SA_INTERRUPT,"irqtest",NULL); if(result) { printk(KERN_INFO "can't get request irq AU1000_GPIO_9\n"); } break; case STOP_IRQTEST: free_irq(AU1000_GPIO_9,NULL); break; default: return -EINVAL; }return 0;}static struct file_operations irqtest_fops= { .owner= THIS_MODULE, .ioctl= irqtest_ioctl, .open= irqtest_open, .release= irqtest_release, }; static struct miscdevice irqtest_dev = { IRQTEST_MINOR, "irqtest_dev", &irqtest_fops,};static int __init irqtest_init() { PRINTK("------irqtest_init()------\n"); u32 pin_func; pin_func = au_readl(SYS_PINFUNC) & (~((u32)(1<<7))); //Configure pins GPIO[9,10,13,14] as GPIO au_writel(pin_func, SYS_PINFUNC); au_writel(0x00000200, SYS_PININPUTEN); misc_register(&irqtest_dev);}static void __exit au1200_gpio9_lcd_exit(void){ PRINTK("------irq_exit------\n"); misc_deregister(&irq_dev);}MODULE_AUTHOR("kwj");MODULE_LICENSE("GPL");module_init(irqtest_init);module_exit(irttest_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -