主题 : 驱动的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 29846
精华: 0
发帖: 18
金钱: 90 两
威望: 18 点
综合积分: 36 分
注册时间: 2010-10-07
最后登录: 2011-06-12
楼主  发表于: 2011-04-17 18:39

 驱动的问题

仿写的驱动出现了问题帮忙看看  下面是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);

级别: 新手上路
UID: 29846
精华: 0
发帖: 18
金钱: 90 两
威望: 18 点
综合积分: 36 分
注册时间: 2010-10-07
最后登录: 2011-06-12
1楼  发表于: 2011-04-18 15:06
有人能提示下吗
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
2楼  发表于: 2011-04-19 10:27
看日志, 很明显是button_irq_hander中的处理导致的core dump
只需要用最笨的办法, 多加一些打印就能找到是哪一行了

另外, 自己写的驱动应该发到linux交流区