I want to use wait_event_interruptible and wake_up_interruptible to do
some jobs,but some error ouccor when wake_up_interruptible. Attach is
the code.please help me.
The errors messages as follow:
irq7: nobody
cared
Pid: 497, comm:
ir_send_stream
CPU:
0
PC is at ir_open+0x3c/0x64
[ir]
LR is at ir_open+0x3c/0x64
[ir]
pc : [<bf00c350>] lr : [<bf00c350>] Not
tainted
sp : c0851e78 ip : 00000000 fp :
c0851e88
r10: c0de86cc r9 : c0e22e04 r8 :
c023bf98
r7 : 0000003d r6 : 00000001 r5 : c023bea8 r4 :
00000000
r3 : 00000004 r2 : c1869410 r1 : 00000004 r0 :
00000000
Flags: Nzcv IRQs on FIQs on Mode SVC_32 Segment
user
Control: 5317F Table: 60648000 DAC:
00000015
[<c0023a48>] (show_regs+0x0/0x4c) from [<c0022a18>] (report_bad_irq
+0x6c/0xcc)
r4 =
C0851E30
[<c00229ac>] (report_bad_irq+0x0/0xcc) from [<c0022d4c>] (do_level_IRQ
+0x8c/0xc)
r5 = 00000007 r4 =
C027C12C
[<c0022cc0>] (do_level_IRQ+0x0/0xc8) from [<c0022ddc>] (asm_do_IRQ
+0x54/0x150)
r6 = 00000001 r5 = C027C12C r4 =
00000007
[<c0022d88>] (asm_do_IRQ+0x0/0x150) from [<c00219b8>] (__irq_svc
+0x38/0x8c)
[<bf00c314>] (ir_open+0x0/0x64 [ir]) from [<c0117eb4>] (misc_open
+0x28c/0x458)
r4 =
BF00D148
[<c0117c28>] (misc_open+0x0/0x458) from [<c0087ef4>] (chrdev_open
+0x1b8/0x1e0)
[<c0087d3c>] (chrdev_open+0x0/0x1e0) from [<c007c1c0>] (__dentry_open
+0x138/0x2)
[<c007c088>] (__dentry_open+0x0/0x2b0) from [<c007c3b4>] (filp_open
+0x7c/0x98)
[<c007c338>] (filp_open+0x0/0x98) from [<c007c60c>] (do_sys_open
+0x44/0xd0)
r7 = 00000005 r6 = 00000004 r5 = 00000180 r4 =
00000002
[<c007c5c8>] (do_sys_open+0x0/0xd0) from [<c007c6a8>] (sys_open
+0x10/0x14)
[<c007c698>] (sys_open+0x0/0x14) from [<c0021de0>] (ret_fast_syscall
+0x0/0x2c)
[<c0027078>] (dump_stack+0x0/0x14) from [<c0022a1c>] (report_bad_irq
+0x70/0xcc)
[<c00229ac>] (report_bad_irq+0x0/0xcc) from [<c0022d4c>] (do_level_IRQ
+0x8c/0xc)
r5 = 00000007 r4 =
C027C12C
[<c0022cc0>] (do_level_IRQ+0x0/0xc8) from [<c0022ddc>] (asm_do_IRQ
+0x54/0x150)
r6 = 00000001 r5 = C027C12C r4 =
00000007
[<c0022d88>] (asm_do_IRQ+0x0/0x150) from [<c00219b8>] (__irq_svc
+0x38/0x8c)
[<bf00c314>] (ir_open+0x0/0x64 [ir]) from [<c0117eb4>] (misc_open
+0x28c/0x458)
r4 =
BF00D148
[<c0117c28>] (misc_open+0x0/0x458) from [<c0087ef4>] (chrdev_open
+0x1b8/0x1e0)
[<c0087d3c>] (chrdev_open+0x0/0x1e0) from [<c007c1c0>] (__dentry_open
+0x138/0x2)
[<c007c088>] (__dentry_open+0x0/0x2b0) from [<c007c3b4>] (filp_open
+0x7c/0x98)
[<c007c338>] (filp_open+0x0/0x98) from [<c007c60c>] (do_sys_open
+0x44/0xd0)
r7 = 00000005 r6 = 00000004 r5 = 00000180 r4 =
00000002
[<c007c5c8>] (do_sys_open+0x0/0xd0) from [<c007c6a8>] (sys_open
+0x10/0x14)
[<c007c698>] (sys_open+0x0/0x14) from [<c0021de0>] (ret_fast_syscall
+0x0/0x2c)
handlers:
[<bf00c2f0>] (ir_in_irq+0x0/0x24 [ir])
/******************************************************************
*file: ir.c
*history:2007.10.24 add ir carry
*
******************************************************************/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/miscdevice.h>
#include <linux/time.h>
#include <asm/semaphore.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "ir.h"
#include "hi_gpio.h"
#define IR_PORT GPIO_1_BASE
#define Irq_1 7
DECLARE_WAIT_QUEUE_HEAD(ir_wait_q);
struct semaphore ir_sem;
unsigned char sleep_flag=0;
void gpio_init(void);
/**************************receive*******************************/
void gpio_init(void)
{
unsigned int tmp;
/*set gpio1 dir:out 3 in 2 */
gpio_dirgetbyte(1,&tmp);
tmp=tmp&0xfb;
tmp=tmp|0x08;
gpio_dirsetbyte(1,tmp);
/*set gpio1 interrupt:raise edge interrpt 2bit*/
gpio_interruptsenseset(1,2,SENSE_EDGE);
gpio_interruptsenseboth(1,2,SENSE_SINGLE);
gpio_interruptevenset(1,2,EVENT_RISING_EDGE);
/*disable gpio1_2 interrupt*/
tmp=0x04;
gpio_interruptdisable_byte(1,tmp);
/*clear data gpio1_3*/
gpio_writebit(1,3,0);
/*clear interrupt:gpio1_2*/
gpio_interruptclear(1,2);
/*enable interrupt gpio1_2*/
/*tmp=0x04;
gpio_interruptenable_byte(1,tmp);*/
}
int ir_save_stream(void)
{
unsigned char current_irq;
unsigned char flag;
unsigned int tmp;
unsigned int count;
unsigned int i;
i=1;
flag=1;
current_irq=readw(IR_PORT+GPIO_RIS);
if(!(current_irq&0x4))
{
printk("this is not ir_in_irq\n");
return -1;
}
udelay(250);
gpio_readbit(1,2,&tmp);
if (tmp!=1) // false irq;
{
printk("false ir_irq\n") ;
return -1;
}
else
{
count=5;
}
while(count<250&&i<128)
{
udelay(50);
gpio_readbit(1,2,&tmp);
if(tmp==1) //high level
{
if(flag==1) //1 rising;0 falling
{
count=count+1;
}
else
{
ir_receive_stream[i].high_low=0;
ir_receive_stream[i].counter_time=count;
i++;
count=1;
flag=1;
}
}
else //low level
{
if(flag==0)
{
count=count+1;
}
else
{
ir_receive_stream[i].high_low=1;
ir_receive_stream[i].counter_time=count;
i++;
count=1;
flag=0;
}
}
if(i>127)
{
printk("ir_receive_stream buffer full!\n");
}
if(count>=250)
{
printk("count biger than count!\n");
}
}
printk("ir save stream finished\n");
sleep_flag=1;
printk("wake up ir_wait_q\n");
wake_up_interruptible(&ir_wait_q);
return 0;
}
int ir_send_stream(void)
{
unsigned char i;
unsigned char level;
unsigned char count_delay;
unsigned int bcount_delay;
for(i=1;i<128;i++)
{
level=ir_temp_stream[i].high_low;
count_delay=ir_temp_stream[i].counter_time;
if(level)
{
bcount_delay=(unsigned int)(4*count_delay);
for(;bcount_delay>0;bcount_delay--)
{
gpio_writebit(1,3,level);
udelay(13);
level=(~level)&0x01;
}
}
else
{
gpio_writebit(1,3,level);
further_delay_n50us(count_delay);
}
}
return 0;
}
static irqreturn_t ir_in_irq(int irq,void *dev_id,struct pt_regs *reg)
{
unsigned int tmp;
int handled=0;
tmp=0x04;
gpio_interruptdisable_byte(1,tmp);
ir_save_stream();
//gpio_interruptenable_byte(1,0x04);
return IRQ_RETVAL(handled);
}
/***************************************************************************
**************************************************************************/
static int ir_open(struct inode *inode,struct file *file)
{
int i;
for(i=0;i<128;i++)
{
ir_receive_stream[i].high_low=0;
ir_receive_stream[i].counter_time=0;
}
gpio_interruptenable_byte(1,0x04);
printk("ir_irq enable\n");
sleep_flag=0;
return 0;
}
static int ir_close(struct inode *inode,struct file *file)
{
gpio_interruptdisable_byte(1,0x04);
printk("ir_irq disable\n");
return 0;
}
static int ir_read(struct file *file,char __user *buffer,size_t count,loff_t *ppos)
{
struct ir_stream *user_buf;
int ret;
user_buf=(struct ir_stream *)buffer;
printk("process %i(%s) going to sleep\n",current->pid,current->comm);
wait_event_interruptible(ir_wait_q,sleep_flag!=0);
printk("process %i(%s) awoken\n",current->pid,current->comm);
ret=copy_to_user(user_buf,(struct ir_stream *)ir_receive_stream,128*sizeof(struct ir_stream));
if(ret)
{
printk("IR_error:error_val is %lu\n",ret);
}
else
{
printk("get ir stream success\n");
printk("copy_return val is %lu\n",ret);
}
sleep_flag=0;
return 0;
}
static int ir_write(struct file *file,char __user *buffer,size_t count,loff_t *ppos)
{
struct ir_stream *user_buf;
int ret;
user_buf=(struct ir_stream *)buffer;
ret=copy_from_user((struct ir_stream *)ir_temp_stream,user_buf,128*sizeof(struct ir_stream));
if(ret)
{
printk("IR_error:cpy_error_val is %lu\n",ret);
}
else
{
printk("get stream from user success\n");
printk("copy_return val is %lu\n",ret);
}
ir_send_stream();
return 0;
}
static int ir_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
void __user *argp=(void __user *)arg;
switch(cmd)
{
case IR_GET_STREAM:
{
break;
}
default:
return -EINVAL;
}
}
static struct file_operations ir_fops=
{
.owner=THIS_MODULE,
.open =ir_open,
.release=ir_close,
.ioctl=ir_ioctl,
.read=ir_read,
.write=ir_write,
};
static struct miscdevice ir_dev=
{
MISC_DYNAMIC_MINOR,
"irdev",
&ir_fops,
};
static int __init ir_init(void)
{
int ret;
ret=misc_register(&ir_dev);
if(ret)
{
printk("could not register ir devices.\n");
return ret;
}
gpio_remap();
ret=request_irq(Irq_1,&ir_in_irq,0,"irdev",NULL);
if(ret)
{
misc_deregister(&ir_dev);
printk("can't request irq 7\n");
return ret;
}
gpio_init();
return 0;
}
static void __exit ir_exit(void)
{
misc_deregister(&ir_dev);
free_irq(Irq_1,NULL);
gpio_unmap();
}
module_init(ir_init);
module_exit(ir_exit);
MODULE_LICENSE("GPL");
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "ir_common.h"
static struct ir_stream ir_get_stream[128];
int ir_check_stream(unsigned char ir_nomber)
{
FILE * fp;
int fdesc;
int i;
fp=fopen("ir_stream","w");
fdesc=open("/dev/misc/irdev",O_RDWR,S_IRUSR|S_IWUSR);
if (fdesc<0)
{
printf("Cannot open /dev/misc/irdev\n");
}
else
{
printf("open the devies: irdev\n");
}
read(fdesc,(struct ir_stream *)ir_get_stream,128*sizeof(struct ir_stream));
ir_get_stream[0].high_low=ir_nomber;//index information;
printf("the ir_nomber is %d\n",ir_nomber);
if(fwrite((struct ir_stream *)ir_get_stream,sizeof(struct ir_stream),128,fp)!=128)
{
printf("write error!\n");
}
else
{
printf("fwrite success\n");
}
for(i=0;i<128;i++)
{
printf("ir_get_tream.hl and count_time is %d %d\n",ir_get_stream[i].high_low,ir_get_stream[i].counter_time);
}
close(fdesc);
fclose(fp);
return 0;
}
int main(void)
{
int ir_nomber;
ir_nomber=1;
ir_check_stream(ir_nomber);
return 0;
}