主题 : 新加的驱动,错误信息,大家帮忙分析一下是什么原因 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 56004
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2011-09-27
最后登录: 2017-09-13
楼主  发表于: 2011-10-18 21:26

 新加的驱动,错误信息,大家帮忙分析一下是什么原因

Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = cd600000
[00000000] *pgd=5d48d831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#3] PREEMPT
last sysfs file: /sys/devices/virtual/misc/RS485/dev
Modules linked in: mycom_rs485
CPU: 0    Tainted: G      D      (2.6.38-FriendlyARM #10)
PC is at mycom_rs485_ioctl+0x6c/0xd4 [mycom_rs485]
LR is at do_vfs_ioctl+0x538/0x5bc
pc : [<bf00006c>]    lr : [<c01f2ad8>]    psr: 60000013
sp : cd67ff10  ip : 000003e7  fp : 00000000
r10: 00000000  r9 : cd67e000  r8 : c0175788
r7 : cd156000  r6 : 00000000  r5 : 00000000  r4 : 7f005000
r3 : 00000000  r2 : 7f005800  r1 : 00000000  r0 : cd647820
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 00c5387d  Table: 5d600008  DAC: 00000015
Process rs485 (pid: 1007, stack limit = 0xcd67e268)
Stack: (0xcd67ff10 to 0xcd680000)
ff00:                                     cd647820 00000000 00000000 cd647820
ff20: 00000000 c01f2ad8 00000005 00000000 cd453c24 00000002 cd453c24 00000002
ff40: cd67ff50 00000003 cd453c24 cd453c00 cd647820 00000020 00000001 00000001
ff60: cd67ff74 c0186194 00000003 cd647820 00000000 00000000 00000003 c0175788
ff80: cd67e000 c01f2b90 00000003 00000000 00000000 00000003 00000001 00000000
ffa0: 00000036 c01755e0 00000003 00000001 00000003 00000000 00000000 00000000
ffc0: 00000003 00000001 00000000 00000036 00000000 00000000 400bb000 00000000
ffe0: 00000000 be9e2cd0 0000857c 402654ec 60000010 00000003 5fffe821 5fffec21
[<bf00006c>] (mycom_rs485_ioctl+0x6c/0xd4 [mycom_rs485]) from [<c01f2ad8>] (do_vfs_ioctl+0x538/0x5bc)
[<c01f2ad8>] (do_vfs_ioctl+0x538/0x5bc) from [<c01f2b90>] (sys_ioctl+0x34/0x54)
[<c01f2b90>] (sys_ioctl+0x34/0x54) from [<c01755e0>] (ret_fast_syscall+0x0/0x30)
Code: e150000c dafffff9 e5530001 e5c20020 (e4d30001)
---[ end trace 8d6db23fc19efd45 ]---
Segmentation fault



---------------------驱动代码是----------------------------------
#其他头文件
#include <mach/gpio-bank-b.h>
#include <mach/gpio-bank-h.h>

#define DEVICE_NAME "RS485"
#define WrUTXH0(ch)     (*(volatile unsigned char *)(S3C_PA_UART2+0x20))=(unsigned char)(ch)
#define RdURXH0()        (*(volatile unsigned char *)(S3C_PA_UART3+0x24))

#define UART2_BASE    (0x7F005800)
#define rULCON2        (*(volatile unsigned *)(UART2_BASE+0x00))
#define rUCON2        (*(volatile unsigned *)(UART2_BASE+0x04))
#define rUFCON2        (*(volatile unsigned *)(UART2_BASE+0x08))
#define rUBRDIV2        (*(volatile unsigned *)(UART2_BASE+0x28))
#define rUDIVSLOT2     (*(volatile unsigned *)(UART2_BASE+0x2C))

static void Delay(void)
{
    volatile int i;

    for(i=0 ; i < 1000 ; i++)
    {
    }
}


static long mycom_rs485_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    switch(cmd) {
        unsigned tmp;
                char *pt = "Hello, mycom";
    case 0:  //send
        tmp = readl(S3C_PA_UART2 + 0x10);
                while(!(tmp & 0x2));   //Wait until THR is empty.
                Delay();
                WrUTXH0(*pt);//只发送'H'

        return 0;
    case 1: //receive
        printk(DEVICE_NAME"received: ");
        
                tmp = readl(S3C_PA_UART3 + 0x10);
            while(tmp & 0x1)
            printk("%c", RdURXH0());

        return 0;
    default:
        return -EINVAL;
    }
}

static struct file_operations dev_fops = {
    .owner            = THIS_MODULE,
    .unlocked_ioctl    = mycom_rs485_ioctl,
};

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};

static int __init dev_init(void)
{
    int ret;

    {
        unsigned tmp;
        tmp = readl(S3C64XX_GPBCON);        
        tmp = (tmp & ~(0xffff<<0))|(0x2222<<0); //TXD2/GPB1 RXD2/GPB0 TXD3/GPB3 RXD3/GPB2
        writel(tmp, S3C64XX_GPBCON);
        
        tmp = readl(S3C64XX_GPBPUD);        
        tmp = (tmp & ~(0xf<<0))|(0x1<<0);
        writel(tmp, S3C64XX_GPBPUD);

        //UART2
        tmp = readl(S3C64XX_GPHDAT);
        tmp = (tmp & ~(0x11<<2));
        writel(tmp, S3C64XX_GPHDAT);                    
    }

    ret = misc_register(&misc);

    printk (DEVICE_NAME"\tinitialized\n");

    return ret;
}

static void __exit dev_exit(void)
{
    misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("mycom Inc.");
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
1楼  发表于: 2011-10-19 09:56
从core dump信息可以初步确定是在 mycom_rs485_ioctl 函数中, 你可以加些打印, 很快就能找到导致异常的代码的

另外, ioctl的cmd不要使用0,1,2这些