仿写的驱动出现了问题帮忙看看 下面是oops
Unable to handle kernel paging request at virtual address f9a44448
pgd = c3ae0000
[f9a44448] *pgd=00000000
Internal error: Oops: 5 [#1]
last sysfs file: /sys/devices/virtual/vc/vcsa4/dev
Modules linked in: my_button [last unloaded: my_button]
CPU: 0 Not tainted (2.6.32.2-FriendlyARM #3)
PC is at button_irq_hander+0x18/0x78 [my_button]
LR is at handle_IRQ_event+0x60/0x134
pc : [<bf006140>] lr : [<c006f4e0>] psr: 40000013
sp : c0445ea0 ip : c0445ec0 fp : c0445ebc
r10: 3001e884 r9 : 41129200 r8 : 3001e8b8
r7 : 00000039 r6 : c3aa3e14 r5 : 00000000 r4 : c3928e40
r3 : f9a44444 r2 : 00000000 r1 : c3aa3e14 r0 : 00000039
Flags: nZcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: c000717f Table: 33ae0000 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc0444270)
Stack: (0xc0445ea0 to 0xc0446000)
5ea0: c3928e40 00000000 00000000 00000039 c0445edc c0445ec0 c006f4e0 bf006138
5ec0: c044e32c 00000039 c04a4a9c c0448428 c0445f04 c0445ee0 c0071048 c006f490
5ee0: 00000009 0000000a 3001e8b8 00000000 00000001 00000039 c0445f24 c0445f08
5f00: c0039be0 c0070fb0 c045a30c 00000015 00000000 c0448428 c0445f44 c0445f28
5f20: c002f044 c0039b5c ffffffff f4000000 00000020 c0448428 c0445f9c c0445f48
5f40: c002fac4 c002f010 00fbfff4 f4100000 f4100000 60000013 c0444000 c0481364
5f60: c0448430 c0448428 3001e8b8 41129200 3001e884 c0445f9c c0445fa0 c0445f90
5f80: c00315fc c00310a4 60000013 ffffffff c0445fbc c0445fa0 c00315fc c0031028
5fa0: c04a4b1c c0020ca0 c0020c9c c0448428 c0445fcc c0445fc0 c032769c c0031594
5fc0: c0445ff4 c0445fd0 c000893c c0327650 c00084e4 00000000 00000000 c0020ca0
5fe0: c0007175 c0481410 00000000 c0445ff8 30008034 c0008748 00000000 00000000
Backtrace:
[<bf006128>] (button_irq_hander+0x0/0x78 [my_button]) from [<c006f4e0>] (handle)
r7:00000039 r6:00000000 r5:00000000 r4:c3928e40
[<c006f480>] (handle_IRQ_event+0x0/0x134) from [<c0071048>] (handle_edge_irq+0x)
r7:c0448428 r6:c04a4a9c r5:00000039 r4:c044e32c
[<c0070fa0>] (handle_edge_irq+0x0/0x178) from [<c0039be0>] (s3c_irq_demux_extin)
r6:00000039 r5:00000001 r4:00000000
[<c0039b4c>] (s3c_irq_demux_extint8+0x0/0xa0) from [<c002f044>] (asm_do_IRQ+0x4)
r7:c0448428 r6:00000000 r5:00000015 r4:c045a30c
[<c002f000>] (asm_do_IRQ+0x0/0x8c) from [<c002fac4>] (__irq_svc+0x24/0xa0)
Exception stack(0xc0445f48 to 0xc0445f90)
5f40: 00fbfff4 f4100000 f4100000 60000013 c0444000 c0481364
5f60: c0448430 c0448428 3001e8b8 41129200 3001e884 c0445f9c c0445fa0 c0445f90
5f80: c00315fc c00310a4 60000013 ffffffff
r7:c0448428 r6:00000020 r5:f4000000 r4:ffffffff
[<c0031018>] (default_idle+0x0/0x98) from [<c00315fc>] (cpu_idle+0x78/0xb0)
[<c0031584>] (cpu_idle+0x0/0xb0) from [<c032769c>] (rest_init+0x5c/0x70)
r7:c0448428 r6:c0020c9c r5:c0020ca0 r4:c04a4b1c
[<c0327640>] (rest_init+0x0/0x70) from [<c000893c>] (start_kernel+0x204/0x24c)
[<c0008738>] (start_kernel+0x0/0x24c) from [<30008034>] (0x30008034)
Code: e24cb004 e59f3058 e1a06001 e0833201 (e5930004)
---[ end trace 73f1fb7d3a99d96e ]---
Kernel panic - not syncing: Fatal exception in interrupt
Backtrace:
[<c00341cc>] (dump_backtrace+0x0/0x10c) from [<c0329458>] (dump_stack+0x18/0x1c)
r7:bf006140 r6:c0445d34 r5:bf006140 r4:c0481970
[<c0329440>] (dump_stack+0x0/0x1c) from [<c03294a8>] (panic+0x4c/0x114)
[<c032945c>] (panic+0x0/0x114) from [<c00344cc>] (die+0x1f4/0x23c)
r3:00010000 r2:c044b618 r1:c044b638 r0:c03db940
[<c00342d8>] (die+0x0/0x23c) from [<c0036914>] (__do_kernel_fault+0x6c/0x7c)
[<c00368a8>] (__do_kernel_fault+0x0/0x7c) from [<c0036b4c>] (do_bad_area+0x48/0)
r7:c0445e58 r6:33ae0000 r5:00003e68 r4:00000000
[<c0036b04>] (do_bad_area+0x0/0x74) from [<c0036bf8>] (do_translation_fault+0x6)
[<c0036b90>] (do_translation_fault+0x0/0x7c) from [<c002f284>] (do_DataAbort+0x)
r7:c0445e58 r6:f9a44448 r5:c0448648 r4:00000005
[<c002f248>] (do_DataAbort+0x0/0xa4) from [<c002fa80>] (__dabt_svc+0x40/0x60)
Exception stack(0xc0445e58 to 0xc0445ea0)
5e40: 00000039 c3aa3e14
5e60: 00000000 f9a44444 c3928e40 00000000 c3aa3e14 00000039 3001e8b8 41129200
5e80: 3001e884 c0445ebc c0445ec0 c0445ea0 c006f4e0 bf006140 40000013 ffffffff
r7:00000039 r6:c3aa3e14 r5:c0445e8c r4:ffffffff
[<bf006128>] (button_irq_hander+0x0/0x78 [my_button]) from [<c006f4e0>] (handle)
r7:00000039 r6:00000000 r5:00000000 r4:c3928e40
[<c006f480>] (handle_IRQ_event+0x0/0x134) from [<c0071048>] (handle_edge_irq+0x)
r7:c0448428 r6:c04a4a9c r5:00000039 r4:c044e32c
[<c0070fa0>] (handle_edge_irq+0x0/0x178) from [<c0039be0>] (s3c_irq_demux_extin)
r6:00000039 r5:00000001 r4:00000000
[<c0039b4c>] (s3c_irq_demux_extint8+0x0/0xa0) from [<c002f044>] (asm_do_IRQ+0x4)
r7:c0448428 r6:00000000 r5:00000015 r4:c045a30c
[<c002f000>] (asm_do_IRQ+0x0/0x8c) from [<c002fac4>] (__irq_svc+0x24/0xa0)
Exception stack(0xc0445f48 to 0xc0445f90)
5f40: 00fbfff4 f4100000 f4100000 60000013 c0444000 c0481364
5f60: c0448430 c0448428 3001e8b8 41129200 3001e884 c0445f9c c0445fa0 c0445f90
5f80: c00315fc c00310a4 60000013 ffffffff
r7:c0448428 r6:00000020 r5:f4000000 r4:ffffffff
[<c0031018>] (default_idle+0x0/0x98) from [<c00315fc>] (cpu_idle+0x78/0xb0)
[<c0031584>] (cpu_idle+0x0/0xb0) from [<c032769c>] (rest_init+0x5c/0x70)
r7:c0448428 r6:c0020c9c r5:c0020ca0 r4:c04a4b1c
[<c0327640>] (rest_init+0x0/0x70) from [<c000893c>] (start_kernel+0x204/0x24c)
[<c0008738>] (start_kernel+0x0/0x24c) from [<30008034>] (0x
下面是驱动代码 :
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/sched.h>
#include <linux/gpio.h>
MODULE_LICENSE("GPL");
#define BUTTON_COUNT 6
#define BUTTON_DOWN 0
#define BUTTON_UP 1
//#define BUTTON_UN 2
static DECLARE_WAIT_QUEUE_HEAD(button_wait);
static struct cdev button_cdev;
static volatile int button_press; //1 down 0 up
static volatile int button_status[BUTTON_COUNT];
struct button_irq_dec{
int irq;
int pin;
int pin_setting;
char *name;
};
static struct button_irq_dec button_irqs[6]=
{
{IRQ_EINT8,S3C2410_GPG(0),S3C2410_GPG0_EINT8,"KeY0"},
{IRQ_EINT11,S3C2410_GPG(3),S3C2410_GPG3_EINT11,"Key1"},
{IRQ_EINT13,S3C2410_GPG(5),S3C2410_GPG5_EINT13,"Key2"},
{IRQ_EINT14,S3C2410_GPG(6),S3C2410_GPG6_EINT14,"Key3"},
{IRQ_EINT15,S3C2410_GPG(7),S3C2410_GPG7_EINT15,"Key4"},
{IRQ_EINT19,S3C2410_GPG(11),S3C2410_GPG11_EINT19,"Key5"},
};
static irqreturn_t button_irq_hander(int irq,void *dev_id,struct pt_regs *reg)
{
int i=(int)dev_id;
int down;
down=s3c2410_gpio_getpin(button_irqs.pin);
if(down!=button_status)
{
button_status=down;
button_press=1;
wake_up_interruptible(&button_wait);
}
return IRQ_RETVAL(IRQ_HANDLED);
//if(button_status==BUTTON_UP)
// {
// button_status=BUTTON_DOWN;
// }
}
static int button_open(struct inode *inode,struct file *file )
{
int i=0;
int err;
for(;i<BUTTON_COUNT;i++)
{
s3c2410_gpio_cfgpin(button_irqs.pin,button_irqs.pin_setting);
//set_irq_type(button_irqs.irq, IRQ_TYPE_EDGE_FALLING);
err=request_irq(button_irqs.irq,button_irq_hander,IRQ_TYPE_EDGE_BOTH,button_irqs.name,(void *)i);
if(err)
{
printk(KERN_ALERT"Wrong in request_irq !!!");
break;
}
//break;
button_status=BUTTON_UP;
}
if(err)
{
printk(KERN_ALERT"Wrong!!!\n");
i--;
for(;i>=0;i--)
{
disable_irq(button_irqs.irq);
free_irq(button_irqs.irq, (void *)i);
}
return -EBUSY;
}
button_press=0;
return 0;
}
static int button_close(struct inode*inode,struct file*file)
{
int i=0;
for(;i<BUTTON_COUNT;i++)
{
free_irq(button_irqs.irq,(void *)i);
}
return 0;
}
static int button_read(struct file *file,char *buf,size_t count,loff_t *ppos)
{
int err;
if(!button_press)
{
if(file->f_flags&O_NONBLOCK)
{
return -EAGAIN;
}
wait_event_interruptible(button_wait,button_press!=0);
}
button_press=0;
err=copy_to_user(buf,(void *)button_status,min(count,(size_t)BUTTON_COUNT));
return err?-EFAULT : min(count,(size_t)BUTTON_COUNT);
}
static struct file_operations button_operations=
{
.owner= THIS_MODULE,
.open= button_open,
.release=button_close,
.read=button_read,
};
static int __init s3c2410_button_init(void)
{
int result;
dev_t button_dev_t;
alloc_chrdev_region(&button_dev_t,0,BUTTON_COUNT,"My_Button");
//if(result<0)
//{
//printk(KERN_ALERT"Alloc_dev Wrong!!!\n");
//return -1;
//}
cdev_init(&button_cdev,&button_operations);
button_cdev.owner=THIS_MODULE;
button_cdev.ops=&button_operations;
if(cdev_add(&button_cdev,button_dev_t,BUTTON_COUNT)<0)
{
printk(KERN_ALERT"Cdev_add Wrong!!1\n");
return -1;
}
//printk(KERN_ALERT"init successful!!")
return 0;
}
static void __exit s3c2410_button_exit(void)
{
cdev_del(&button_cdev);
}
module_init(s3c2410_button_init);
module_exit(s3c2410_button_exit);