⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irqtest_kernel.c

📁 用gpio9作中断
💻 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 + -