FS2410下的键盘驱动,为什么不能注册中断?

[复制链接]
 楼主| wangben85 发表于 2009-2-23 15:17 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;以下是网上找到的FS2410下面的键盘驱动,本人稍作修改。可以编译通过,但是下到板子里insmod,发现不能注册中断。即request_irq函数有什么问题么?希望高手帮忙!<br />&nbsp;&nbsp;#include&nbsp;&ltlinux/module.h&gt<br />#include&nbsp;&ltlinux/init.h&gt<br />#include&nbsp;&ltlinux/delay.h&gt<br />#include&nbsp;&ltlinux/config.h&gt<br />#include&nbsp;&ltlinux/errno.h&gt<br />#include&nbsp;&ltlinux/kernel.h&gt<br />#include&nbsp;&ltlinux/major.h&gt<br />#include&nbsp;&ltlinux/sched.h&gt<br />#include&nbsp;&ltlinux/devfs_fs_kernel.h&gt<br />#include&nbsp;&ltlinux/slab.h&gt<br />#include&nbsp;&ltlinux/fcntl.h&gt<br />#include&nbsp;&ltlinux/delay.h&gt<br />#include&nbsp;&ltlinux/poll.h&gt<br />#include&nbsp;&ltlinux/console.h&gt<br />#include&nbsp;&ltlinux/parport.h&gt<br />#include&nbsp;&ltlinux/lp.h&gt<br />#include&nbsp;&ltasm/io.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#include&nbsp;&ltlinux/ioport.h&gt&nbsp;&nbsp;<br />#include&nbsp;&ltlinux/interrupt.h&gt<br />#include&nbsp;&ltasm/uaccess.h&gt<br /><br />#define&nbsp;GPECON&nbsp;(0x56000040)<br />#define&nbsp;GPFCON&nbsp;(0x56000050)<br />#define&nbsp;GPGCON&nbsp;(0x56000060)<br />#define&nbsp;GPEDAT&nbsp;(0x56000044)<br />#define&nbsp;GPFDAT&nbsp;(0x56000054)<br />#define&nbsp;GPGDAT&nbsp;(0x56000064)<br />#define&nbsp;SRCPND&nbsp;(0x4A000000)<br />#define&nbsp;EINTMASK&nbsp;(0x560000A4)<br />#define&nbsp;INTMASK&nbsp;(0x4A000008)<br />static&nbsp;void&nbsp;*gpecon;<br />static&nbsp;void&nbsp;*gpfcon;<br />static&nbsp;void&nbsp;*gpgcon;<br />static&nbsp;void&nbsp;*gpedat;<br />static&nbsp;void&nbsp;*gpfdat;<br />static&nbsp;void&nbsp;*gpgdat;<br />static&nbsp;void&nbsp;*srcpnd;<br />static&nbsp;void&nbsp;*eintmask;<br />static&nbsp;void&nbsp;*intmask;<br />MODULE_LICENSE(&quot;GPL&quot;);&nbsp;//2.6内核必须有,否则不能加载<br />#define&nbsp;keyirq_MAJOR&nbsp;242<br />#define&nbsp;NAME&nbsp;&quot;buttons&quot;<br />#define&nbsp;NOKEY&nbsp;&nbsp;0xff<br />static&nbsp;struct&nbsp;semaphore&nbsp;key_sem;<br />static&nbsp;char&nbsp;key=NOKEY;<br />/*----------清除中断------------------*/<br />static&nbsp;void&nbsp;inline&nbsp;clearIrq(void)<br />{<br />&nbsp;&nbsp;//mdelay(100);&nbsp;&nbsp;&nbsp;//防抖动<br />&nbsp;&nbsp;writel(readl(srcpnd)|0x25,srcpnd);//clear&nbsp;srcpnd&nbsp;0&nbsp;2&nbsp;11&nbsp;19<br />}<br />/*---------键盘扫描-----------------*/<br />static&nbsp;int&nbsp;Key_Scan(&nbsp;void&nbsp;)<br />{<br />//mdelay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgdat)&(~((1&lt&lt6)|(1&lt&lt2)))&nbsp;|&nbsp;(1&lt&lt6)&nbsp;|&nbsp;(0&lt&lt2)&nbsp;,gpgdat);&nbsp;&nbsp;//GPG2&nbsp;output&nbsp;0;GP6&nbsp;output&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpedat)&(~((1&lt&lt13)|(1&lt&lt11)))&nbsp;|&nbsp;(1&lt&lt13)&nbsp;|&nbsp;(1&lt&lt11)&nbsp;&nbsp;,gpedat);&nbsp;&nbsp;//GPE13,11&nbsp;output&nbsp;1<br />if(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;0))&nbsp;==&nbsp;0&nbsp;)&nbsp;return&nbsp;16&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;2))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;15&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt&nbsp;3))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;14&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt11))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;13&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgdat)&(~((1&lt&lt6)|(1&lt&lt2)))&nbsp;|&nbsp;(0&lt&lt6)&nbsp;|&nbsp;(1&lt&lt2)&nbsp;,gpgdat);&nbsp;&nbsp;//GPG6&nbsp;output&nbsp;0;GPG2&nbsp;output&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpedat)&(~((1&lt&lt13)|(1&lt&lt11)))&nbsp;|&nbsp;(1&lt&lt13)&nbsp;|&nbsp;(1&lt&lt11)&nbsp;&nbsp;,gpedat);&nbsp;&nbsp;//GPE13,11&nbsp;output&nbsp;1<br />if(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;0))&nbsp;==&nbsp;0&nbsp;)&nbsp;return&nbsp;11&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;2))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;8&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt&nbsp;3))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;5&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt11))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;2&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgdat)&(~((1&lt&lt6)|(1&lt&lt2)))&nbsp;|&nbsp;(1&lt&lt6)&nbsp;|&nbsp;(1&lt&lt2)&nbsp;,gpgdat);&nbsp;&nbsp;//GPG6,2&nbsp;output&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpedat)&(~((1&lt&lt13)|(1&lt&lt11)))&nbsp;|&nbsp;(1&lt&lt13)&nbsp;|&nbsp;(0&lt&lt11)&nbsp;,gpedat);&nbsp;&nbsp;//GPE13&nbsp;output&nbsp;1;GPE11&nbsp;output&nbsp;0<br />if(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;0))&nbsp;==&nbsp;0&nbsp;)&nbsp;return&nbsp;10&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;2))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;7&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt&nbsp;3))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;4&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt11))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;1&nbsp;;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgdat)&(~((1&lt&lt6)|(1&lt&lt2)))&nbsp;|&nbsp;(1&lt&lt6)&nbsp;|&nbsp;(1&lt&lt2)&nbsp;,gpgdat);&nbsp;&nbsp;//GPG6,2&nbsp;output&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpedat)&(~((1&lt&lt13)|(1&lt&lt11)))&nbsp;|&nbsp;(0&lt&lt13)&nbsp;|&nbsp;(1&lt&lt11)&nbsp;,gpedat);&nbsp;&nbsp;//GPE11&nbsp;output&nbsp;1;GPE13&nbsp;output&nbsp;0<br />if(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;0))&nbsp;==&nbsp;0&nbsp;)&nbsp;return&nbsp;12&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpfdat)&(1&lt&lt&nbsp;2))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;9&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt&nbsp;3))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;6&nbsp;;<br />else&nbsp;if(&nbsp;(readl(gpgdat)&(1&lt&lt11))&nbsp;==&nbsp;0&nbsp;)&nbsp;&nbsp;return&nbsp;3&nbsp;;<br />return&nbsp;0xff&nbsp;;<br />}<br />static&nbsp;irqreturn_t&nbsp;irq_isr(int&nbsp;irq,&nbsp;void&nbsp;*dev_id,&nbsp;struct&nbsp;pt_regs&nbsp;*regs)<br />{<br />//GPGCON&nbsp;=&nbsp;GPGCON&nbsp;&&nbsp;(~((3&lt&lt22)|(3&lt&lt6)))&nbsp;|&nbsp;((0&lt&lt22)|(0&lt&lt6))&nbsp;;&nbsp;&nbsp;//GPG11,3&nbsp;set&nbsp;input<br />//GPFCON&nbsp;=&nbsp;GPFCON&nbsp;&&nbsp;(~((3&lt&lt4)|(3&lt&lt0)))&nbsp;|&nbsp;((0&lt&lt4)|(0&lt&lt0))&nbsp;;&nbsp;&nbsp;//GPF2,0&nbsp;set&nbsp;input<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgcon)&&nbsp;(~((3&lt&lt22)|(3&lt&lt6)))&nbsp;|&nbsp;((0&lt&lt22)|(0&lt&lt6)),gpgcon);//set&nbsp;gpg11&nbsp;3&nbsp;to&nbsp;input<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpfcon)&&nbsp;(~((3&lt&lt4)|(3&lt&lt0)))&nbsp;|&nbsp;((0&lt&lt4)|(0&lt&lt0)),gpfcon);//set&nbsp;gpf2&nbsp;0&nbsp;to&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;<br />//查询按键键值<br />key&nbsp;=&nbsp;Key_Scan()&nbsp;;<br />if(&nbsp;key&nbsp;!=&nbsp;0xff&nbsp;)<br />&nbsp;&nbsp;printk(&quot;Interrupt&nbsp;occur...&nbsp;K%d&nbsp;is&nbsp;pressed!\n&quot;,&nbsp;key&nbsp;)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printk(&quot;Interrupt&nbsp;&quot;&nbsp;)&nbsp;;<br />//Beep(&nbsp;2000,&nbsp;3000&nbsp;)&nbsp;;<br /><br />//重新初始化IO口<br />//rGPGCON&nbsp;=&nbsp;rGPGCON&nbsp;&&nbsp;(~((3&lt&lt12)|(3&lt&lt4)))&nbsp;|&nbsp;((1&lt&lt12)|(1&lt&lt4))&nbsp;;&nbsp;&nbsp;//GPG6,2&nbsp;set&nbsp;output<br />//rGPGDAT&nbsp;=&nbsp;rGPGDAT&nbsp;&&nbsp;(~((1&lt&lt6)|(1&lt&lt2)));&nbsp;&nbsp;//GPG6,2&nbsp;output&nbsp;0<br /><br />//rGPECON&nbsp;=&nbsp;rGPECON&nbsp;&&nbsp;(~((3&lt&lt26)|(3&lt&lt22)))&nbsp;|&nbsp;((1&lt&lt26)|(1&lt&lt22));&nbsp;&nbsp;//GPE13,11&nbsp;set&nbsp;output<br />//rGPEDAT&nbsp;=&nbsp;rGPEDAT&nbsp;&&nbsp;(~((1&lt&lt13)|(1&lt&lt11)));&nbsp;&nbsp;//GPE13,11&nbsp;output&nbsp;0<br /><br />//rGPGCON&nbsp;=&nbsp;rGPGCON&nbsp;&&nbsp;(~((3&lt&lt22)|(3&lt&lt6)))&nbsp;|&nbsp;((2&lt&lt22)|(2&lt&lt6))&nbsp;;&nbsp;&nbsp;//GPG11,3&nbsp;set&nbsp;EINT<br />//rGPFCON&nbsp;=&nbsp;rGPFCON&nbsp;&&nbsp;(~((3&lt&lt4)|(3&lt&lt0)))&nbsp;|&nbsp;((2&lt&lt4)|(2&lt&lt0))&nbsp;;&nbsp;&nbsp;//GPF2,0&nbsp;set&nbsp;EINT<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpecon)&&nbsp;(~((3&lt&lt26)|(3&lt&lt22)))&nbsp;|&nbsp;((1&lt&lt26)|(1&lt&lt22)),gpecon);//set&nbsp;gpe11&nbsp;13&nbsp;to&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpedat)&(~((1&lt&lt13)|(1&lt&lt11)))&nbsp;,gpedat);&nbsp;&nbsp;//set&nbsp;GPE11&nbsp;13&nbsp;to&nbsp;00<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgcon)&nbsp;&&nbsp;(~((3&lt&lt12)|(3&lt&lt4)))&nbsp;|&nbsp;((1&lt&lt12)|(1&lt&lt4)),gpgcon);//set&nbsp;gpe2&nbsp;6&nbsp;to&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgdat)&(~((1&lt&lt6)|(1&lt&lt2)))&nbsp;,gpgdat);&nbsp;&nbsp;//set&nbsp;GPG2&nbsp;6&nbsp;to&nbsp;00&nbsp;:<br />&nbsp;&nbsp;&nbsp;writel(readl(gpgcon)&(~((3&lt&lt22)|(3&lt&lt6)))&nbsp;|&nbsp;((2&lt&lt22)|(2&lt&lt6)),gpgcon);&nbsp;&nbsp;//set&nbsp;GPG3/EINT11,GPG11/EINT19<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpfcon)&(~((3&lt&lt4)|(3&lt&lt0)))&nbsp;|&nbsp;((2&lt&lt4)|(2&lt&lt0)),gpfcon);//set&nbsp;GPF0/EINT0,GPF2/EINT2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;up(&key_sem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IRQ_HANDLED;<br />}<br /><br />static&nbsp;ssize_t&nbsp;keyirq_read(struct&nbsp;file&nbsp;*filp,&nbsp;char&nbsp;__user&nbsp;*buf,&nbsp;size_t&nbsp;count,&nbsp;loff_t&nbsp;*f_pos)<br />{<br />&nbsp;&nbsp;if(down_interruptible(&key_sem))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-ERESTARTSYS;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;put_user(key,&nbsp;buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;NOKEY;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />}<br />int&nbsp;keyirq_open(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*file)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;clearIrq();<br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT0);<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT2);<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT11);<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT19);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;sema_init(&key_sem,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />int&nbsp;keyirq_release(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*filp)<br />{<br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT0);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT2);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT11);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT19);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />static&nbsp;int&nbsp;keyirq_ioctl(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*file,&nbsp;unsigned&nbsp;int&nbsp;cmd,&nbsp;unsigned&nbsp;long&nbsp;arg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />struct&nbsp;file_operations&nbsp;keyirq_fops&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.owner=&nbsp;THIS_MODULE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.read&nbsp;=&nbsp;keyirq_read,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.open&nbsp;=&nbsp;keyirq_open,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.release&nbsp;=&nbsp;keyirq_release,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ioctl&nbsp;=&nbsp;keyirq_ioctl,<br />};<br />int&nbsp;__init&nbsp;keyirq_init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((rc&nbsp;=&nbsp;register_chrdev(keyirq_MAJOR,&nbsp;NAME,&nbsp;&keyirq_fops))&nbsp;&lt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;keyirq:&nbsp;can't&nbsp;get&nbsp;major&nbsp;%d\n&quot;,&nbsp;keyirq_MAJOR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;buttons.ko&nbsp;register&nbsp;success&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gpecon=ioremap_nocache(GPECON,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gpfcon=ioremap_nocache(GPFCON,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gpgcon=ioremap_nocache(GPGCON,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srcpnd=ioremap_nocache(SRCPND,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intmask=ioremap_nocache(INTMASK,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eintmask=ioremap_nocache(EINTMASK,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gpedat=ioremap_nocache(GPEDAT,0x0000004);//remap,&nbsp;ready&nbsp;for&nbsp;follow&nbsp;step<br />&nbsp;&nbsp;&nbsp;gpfdat=ioremap_nocache(GPFDAT,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gpgdat=ioremap_nocache(GPGDAT,0x0000004);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;writel(readl(gpgcon)&0xffbfffbf,gpgcon);&nbsp;&nbsp;//set&nbsp;GPG3/EINT11,GPG11/EINT19<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgcon)|0x800080,gpgcon);//...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpfcon)&0xffffffee,gpfcon);//set&nbsp;GPF0/EINT0,GPF2/EINT2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpfcon)|0x22,gpfcon);//...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(intmask)&0xffffffda,intmask);//set&nbsp;interr&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(eintmask)&0xfff7f7ff,eintmask);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpecon)&&nbsp;(~((3&lt&lt26)|(3&lt&lt22)))&nbsp;|&nbsp;((1&lt&lt26)|(1&lt&lt22)),gpecon);//set&nbsp;gpe11&nbsp;13&nbsp;to&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpedat)&(~((1&lt&lt13)|(1&lt&lt11)))&nbsp;,gpedat);&nbsp;&nbsp;//set&nbsp;GPE11&nbsp;13&nbsp;to&nbsp;00<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgcon)&nbsp;&&nbsp;(~((3&lt&lt12)|(3&lt&lt4)))&nbsp;|&nbsp;((1&lt&lt12)|(1&lt&lt4)),gpgcon);//set&nbsp;gpe2&nbsp;6&nbsp;to&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(readl(gpgdat)&(~((1&lt&lt6)|(1&lt&lt2)))&nbsp;,gpgdat);&nbsp;&nbsp;//set&nbsp;GPG2&nbsp;6&nbsp;to&nbsp;00&nbsp;:<br />&nbsp;&nbsp;&nbsp;printk(KERN_ERR&nbsp;&quot;have&nbsp;initial&nbsp;interr,ok!\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;set_irq_type(IRQ_EINT0,&nbsp;IRQT_FALLING);<br />&nbsp;&nbsp;&nbsp;&nbsp;set_irq_type(IRQ_EINT2,&nbsp;IRQT_FALLING);<br />&nbsp;&nbsp;&nbsp;&nbsp;set_irq_type(IRQ_EINT11,&nbsp;IRQT_FALLING);<br />&nbsp;&nbsp;&nbsp;&nbsp;set_irq_type(IRQ_EINT19,&nbsp;IRQT_FALLING);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;request_irq(IRQ_EINT0,&nbsp;irq_isr,&nbsp;SA_INTERRUPT,&nbsp;NAME,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk&nbsp;(&quot;&lt1&gtkeyirq&nbsp;1&nbsp;irq&nbsp;not&nbsp;registered.&nbsp;Error:%d\n&quot;,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;request_irq(IRQ_EINT2,&nbsp;irq_isr,&nbsp;SA_INTERRUPT,&nbsp;NAME,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk&nbsp;(&quot;&lt1&gtkeyirq&nbsp;2&nbsp;irq&nbsp;not&nbsp;registered.&nbsp;Error:%d\n&quot;,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;request_irq(IRQ_EINT11,&nbsp;irq_isr,&nbsp;SA_INTERRUPT,&nbsp;NAME,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk&nbsp;(&quot;&lt1&gtkeyirq&nbsp;4&nbsp;irq&nbsp;not&nbsp;registered.&nbsp;Error:%d\n&quot;,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />rc&nbsp;=&nbsp;request_irq(IRQ_EINT19,&nbsp;irq_isr,&nbsp;SA_INTERRUPT,&nbsp;NAME,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk&nbsp;(&quot;&lt1&gtkeyirq&nbsp;4&nbsp;irq&nbsp;not&nbsp;registered.&nbsp;Error:%d\n&quot;,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT0);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT2);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT11);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT19);<br />#if&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT0);<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT2);<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT11);<br />&nbsp;&nbsp;&nbsp;&nbsp;enable_irq(IRQ_EINT19);<br />#endif<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;&nbsp;if&nbsp;((rc&nbsp;=&nbsp;register_chrdev(keyirq_MAJOR,&nbsp;NAME,&nbsp;&keyirq_fops))&nbsp;&lt&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;keyirq:&nbsp;can't&nbsp;get&nbsp;major&nbsp;%d\n&quot;,&nbsp;keyirq_MAJOR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}*/<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />void&nbsp;keyirq_exit(void)<br />{<br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT0);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT2);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT11);<br />&nbsp;&nbsp;&nbsp;&nbsp;disable_irq(IRQ_EINT19);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;free_irq(IRQ_EINT0,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;free_irq(IRQ_EINT2,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;free_irq(IRQ_EINT11,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;free_irq(IRQ_EINT19,&nbsp;NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;unregister_chrdev(keyirq_MAJOR,&nbsp;NAME);<br />}<br />module_init(keyirq_init);<br />module_exit(keyirq_exit);
阿南 发表于 2009-2-23 20:02 | 显示全部楼层

看装载的错误信息,中断是否已经被占用

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部