[ZLG-ARM] S3C2410中断按键驱动

[复制链接]
1565|1
 楼主| reeper 发表于 2009-4-9 15:08 | 显示全部楼层 |阅读模式
#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br />#include&nbsp;<br /><br />MODULE_AUTHOR('XIAOSHOU');<br />MODULE_LICENSE('GPL');<br />MODULE_DESCRIPTION('xiaoshou_IRQ&nbsp;driver&nbsp;&nbsp;test!');<br /><br /><br />//#define&nbsp;DEG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调试<br /><br />#ifdef&nbsp;DEG<br />&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;DEBUG(msg,arg...)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk('kernel_debug&nbsp;message:#&gt:&nbsp;&nbsp;'msg,##arg)<br />#else<br />&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;DEBUG(msg,arg...)&nbsp;<br />#endif<br /><br /><br /><br />#define&nbsp;IO_DEL&nbsp;0<br />#define&nbsp;CMD1&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;CMD2&nbsp;&nbsp;&nbsp;&nbsp;2<br />#define&nbsp;DEV_COUNT&nbsp;1<br />#define&nbsp;DEV_NAME&nbsp;'IRQ_XSH'<br /><br />#define&nbsp;MAX_BUF_LEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16<br />#define&nbsp;SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAX_BUF_LEN<br /><br />#define&nbsp;INCBUF(x)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(++(x)%(MAX_BUF_LEN))<br />#define&nbsp;DECBUF(x)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(--(x)%(MAX_BUF_LEN))<br />struct&nbsp;device_xsh<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;flag;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;buf[MAX_BUF_LEN];<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;head,tail;<br />&nbsp;&nbsp;&nbsp;&nbsp;wait_queue_head_t&nbsp;wq;<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;cdev&nbsp;irq_cdev;<br />};<br /><br />static&nbsp;int&nbsp;minor_num&nbsp;=&nbsp;0;<br />static&nbsp;int&nbsp;major_num&nbsp;=&nbsp;0;<br /><br />static&nbsp;struct&nbsp;device_xsh&nbsp;irq_device;<br /><br />static&nbsp;struct&nbsp;class&nbsp;*irq_class;<br /><br />ssize_t&nbsp;irq_read(struct&nbsp;file&nbsp;*filp,char&nbsp;__user&nbsp;*buf,size_t&nbsp;count,loff_t&nbsp;*f_ops);<br />ssize_t&nbsp;irq_write(struct&nbsp;file&nbsp;*filp,const&nbsp;char&nbsp;__user&nbsp;*buf,size_t&nbsp;count,loff_t&nbsp;*f_ops);<br />int&nbsp;irq_open(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp);<br />int&nbsp;irq_release(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp);<br />int&nbsp;irq_ioctl(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,unsigned&nbsp;int&nbsp;cmd,unsigned&nbsp;long&nbsp;arg);<br /><br /><br />static&nbsp;irqreturn_t&nbsp;buttons_irq_isr(int&nbsp;irq,void&nbsp;*dev_id,struct&nbsp;pt_regs&nbsp;*req);&nbsp;&nbsp;&nbsp;&nbsp;//中断服务程序<br />static&nbsp;void&nbsp;do_task_irq(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//任务队列的执行函数;<br />DECLARE_TASKLET(task_irq,&nbsp;do_task_irq,&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中断服务下半部分的任务队列;<br /><br />struct&nbsp;file_operations&nbsp;irq_fops&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;.owner&nbsp;=&nbsp;THIS_MODULE,<br />&nbsp;&nbsp;&nbsp;&nbsp;.read=irq_read,<br />&nbsp;&nbsp;&nbsp;&nbsp;.write=irq_write,<br />&nbsp;&nbsp;&nbsp;&nbsp;.open=irq_open,<br />&nbsp;&nbsp;&nbsp;&nbsp;.release=irq_release,<br />&nbsp;&nbsp;&nbsp;&nbsp;.ioctl=irq_ioctl,<br />};<br /><br />static&nbsp;int&nbsp;__init&nbsp;irq_init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;dev_t&nbsp;dev_num=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;res;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;bitval&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;//###########分配设备号-start####################<br />&nbsp;&nbsp;&nbsp;&nbsp;if(major_num)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//手动分配设备号<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_num=MKDEV(major_num,minor_num);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res=register_chrdev_region(dev_num,DEV_COUNT,DEV_NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//动态分配设备号<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res=alloc_chrdev_region(&dev_num,minor_num,DEV_COUNT,DEV_NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;major_num=MAJOR(dev_num);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(res&lt0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(&nbsp;'IRQ&nbsp;alloc_chrdev_region&nbsp;error!!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//#########//申请中断//########################<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;set_irq_type(IRQ_EINT3,IRQT_FALLING);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下降沿触发;<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=request_irq(IRQ_EINT3,&buttons_irq_isr,SA_INTERRUPT,DEV_NAME,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(res&lt0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(&nbsp;'request_irq&nbsp;error_num=&nbsp;%d!!<br />',res);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//###########分配设备号-end####################<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//############设备初始化#######################<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(&irq_device,0,sizeof(struct&nbsp;device));<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(irq_device.buf,0,sizeof(unsigned&nbsp;char)*SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_device.flag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;init_waitqueue_head(&(irq_device.wq));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化队列;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//############注册设备-start#######################<br />&nbsp;&nbsp;&nbsp;&nbsp;cdev_init(&(irq_device.irq_cdev),&irq_fops);//cdev&nbsp;结构嵌入一个自己的结构体需初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_device.irq_cdev.owner=THIS_MODULE;<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_device.irq_cdev.ops=&irq_fops;<br />&nbsp;&nbsp;&nbsp;&nbsp;err=cdev_add(&(irq_device.irq_cdev),dev_num,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(err!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('IRQ&nbsp;cdev_add&nbsp;error!!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_class=class_create(THIS_MODULE,&nbsp;'irq_class');&nbsp;&nbsp;&nbsp;&nbsp;//udev自动创建/dev/设备文件<br />&nbsp;&nbsp;&nbsp;&nbsp;class_device_create(irq_class,&nbsp;NULL,&nbsp;dev_num,&nbsp;NULL,&nbsp;DEV_NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('insmod&nbsp;char_irq&nbsp;success!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />static&nbsp;void&nbsp;__exit&nbsp;irq_exit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;dev_t&nbsp;dev_num;<br />&nbsp;&nbsp;&nbsp;&nbsp;dev_num=MKDEV(major_num,minor_num);<br />&nbsp;&nbsp;&nbsp;&nbsp;cdev_del(&(irq_device.irq_cdev));<br />&nbsp;&nbsp;&nbsp;&nbsp;class_device_destroy(irq_class,&nbsp;&nbsp;dev_num);<br />&nbsp;&nbsp;&nbsp;&nbsp;class_destroy(irq_class);<br />&nbsp;&nbsp;&nbsp;&nbsp;free_irq(IRQ_EINT3,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;unregister_chrdev_region(dev_num,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('rmmod&nbsp;char_irq&nbsp;success!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br />}<br /><br />int&nbsp;irq_open(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;device&nbsp;*my_device;<br />&nbsp;&nbsp;&nbsp;&nbsp;try_module_get(THIS_MODULE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示此驱动被使用,记数器增加<br />&nbsp;&nbsp;&nbsp;&nbsp;my_device=container_of(inode-&gti_cdev,struct&nbsp;device_xsh,irq_cdev);<br />&nbsp;&nbsp;&nbsp;&nbsp;filp-&gtprivate_data=my_device;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('IRQ_char&nbsp;open&nbsp;success!!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />int&nbsp;irq_release(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('IRQ_char&nbsp;release&nbsp;success!!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;module_put(THIS_MODULE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示此驱动使用完毕,记数器减一<br />&nbsp;&nbsp;&nbsp;&nbsp;//free_irq(IRQ_EINT3,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />ssize_t&nbsp;irq_read(struct&nbsp;file&nbsp;*filp,char&nbsp;__user&nbsp;*buf,size_t&nbsp;count,loff_t&nbsp;*f_ops)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;tmp;<br />retry:<br />&nbsp;&nbsp;&nbsp;&nbsp;if(irq_device.head!=irq_device.tail)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp=irq_device.buf[irq_device.tail];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err=copy_to_user(buf,&tmp,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('irq_device.buf=0x%x<br />',irq_device.buf[irq_device.tail]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(err!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('irq_char&nbsp;copy_to_user&nbsp;error!!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;irq_device.tail=INCBUF(irq_device.tail);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(filp-&gtf_flags&nbsp;&&nbsp;O_NONBLOCK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-EAGAIN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait_event_interruptible(irq_device.wq,irq_device.flag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;irq_device.flag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(signal_pending(current))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk('rturn&nbsp;-ERESTARTSYS<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-ERESTARTSYS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;retry;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />}<br /><br />ssize_t&nbsp;irq_write(struct&nbsp;file&nbsp;*filp,const&nbsp;char&nbsp;__user&nbsp;*buf,size_t&nbsp;count,loff_t&nbsp;*f_ops)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(irq_device.buf,0,sizeof(char)*SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;err=copy_from_user(irq_device.buf,buf,count);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(err!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('irq_char&nbsp;copy_from_user&nbsp;error!!<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;count;<br />}<br /><br />int&nbsp;irq_ioctl(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,unsigned&nbsp;int&nbsp;cmd,unsigned&nbsp;long&nbsp;arg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(cmd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;IO_DEL:<br />&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;DEBUG(&nbsp;'ioctl&nbsp;IO_DEL&nbsp;success!');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;CMD1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(&nbsp;'kernel_debug&nbsp;:&nbsp;IO&nbsp;&nbsp;CMD1=%d<br />',CMD1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;CMD2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(&nbsp;'kernel_debug&nbsp;:&nbsp;IO&nbsp;&nbsp;CMD2=%d<br />',CMD2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />static&nbsp;irqreturn_t&nbsp;buttons_irq_isr(int&nbsp;irq,void&nbsp;*dev_id,struct&nbsp;pt_regs&nbsp;*req)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(&nbsp;'IRQ_ISR&nbsp;<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;tasklet_schedule(&task_irq);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//任务调度中断下半部分服务程序;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IRQ_HANDLED;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回中断已经获得;<br />}<br />static&nbsp;void&nbsp;do_task_irq(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_device.buf[irq_device.head]='K';<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('irq_device.head=%d<br />',irq_device.head);<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG('irq_device.buf=0x%x<br />',irq_device.buf[irq_device.head]);<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_device.head=INCBUF(irq_device.head);<br />&nbsp;&nbsp;&nbsp;&nbsp;irq_device.flag=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;wake_up_interruptible(&(irq_device.wq));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//DEBUG(&nbsp;'do_task_irq&nbsp;<br />');<br />}<br />module_init(irq_init);<br />module_exit(irq_exit);<br />&nbsp;<br /> &nbsp;&nbsp;<br />
zcying 发表于 2009-4-9 15:09 | 显示全部楼层

linux模块,不是裸机代码。

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

本版积分规则

139

主题

185

帖子

0

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