主题 : 各位大哥求助 platform自己按照韦东山的方式写的driver模块 一insmod就崩溃 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 79894
精华: 0
发帖: 24
金钱: 125 两
威望: 25 点
综合积分: 48 分
注册时间: 2012-10-15
最后登录: 2013-12-25
楼主  发表于: 2013-02-19 13:30

 各位大哥求助 platform自己按照韦东山的方式写的driver模块 一insmod就崩溃

代码如下:
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/io.h>

#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include <mach/fb.h>
#include <mach/hardware.h>
#include <mach/dma.h>
#include <mach/irqs.h>
#include <asm/irq.h>

#include <plat/regs-serial.h>
#include <plat/udc.h>

#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/regs-spi.h>

static struct class *cls;
static volatile unsigned int *gpio_con;
static volatile unsigned int *gpio_dat;
static int pin;

static int led_probe(struct platform_device *pdev)
{
    #if 0
    struct resource        *res;

    /* 根据platform_device的资源进行ioremap */
    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    gpio_con = ioremap(res->start, res->end - res->start + 1);
    gpio_dat = gpio_con + 1;

    res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
    pin = res->start;

    /* 注册字符设备驱动程序 */


    major = register_chrdev(0, "myled", &led_fops);

    cls = class_create(THIS_MODULE, "myled");

    device_create(cls, NULL, MKDEV(major, 0), NULL, "led"); /* /dev/led */
    #endif
    printk("led_probe, found led\n");
    
    return 0;
}

static int led_remove(struct platform_device *pdev)
{
    #if 0
    /* 卸载字符设备驱动程序 */
    /* iounmap */

    device_destroy(cls, MKDEV(major, 0));
    class_destroy(cls);
    unregister_chrdev(major, "myled");
    iounmap(gpio_con);
    #endif
    printk("led_remove, remove led\n");
    
    return 0;
}


struct platform_driver led_drv = {
    .probe        = led_probe,
    .remove        = led_remove,
    .driver        = {
        .name    = "myled",
    }
};


static int led_drv_init(void)
{
    int ret = -EINVAL;

    printk("led_drv_init, led_drv is 0x%x\n",&led_drv);
    ret = platform_driver_register(&led_drv);
    printk("led_drv_init, ret is %d\n",ret);
    return 0;
}

static void led_drv_exit(void)
{
    platform_driver_unregister(&led_drv);
}

module_init(led_drv_init);
module_exit(led_drv_exit);

MODULE_LICENSE("GPL");



错误信息如下:
# insmod nineled_drv.ko
led_drv_init, led_drv is 0xbf000114
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c3a50000
[00000000] *pgd=33a54031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
last sysfs file: /sys/devices/platform/soc-audio/sound/card0/controlC0/dev
Modules linked in: nineled_drv(+)
CPU: 0    Not tainted  (2.6.32.2 #9)
PC is at strcmp+0x14/0x40
LR is at platform_match+0x68/0x74
pc : [<c018951c>]    lr : [<c01cc928>]    psr: 60000013
sp : c3a47e68  ip : 00000000  fp : c3a47e74
r10: 00000000  r9 : c3a46000  r8 : c03ecb54
r7 : c39eb660  r6 : bf000128  r5 : c0026e04  r4 : 00000000
r3 : c01cc8c0  r2 : 00000000  r1 : bf0000a0  r0 : 00000000
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: c000717f  Table: 33a50000  DAC: 00000015
Process insmod (pid: 750, stack limit = 0xc3a46260)
Stack: (0xc3a47e68 to 0xc3a48000)
7e60:                   c3a47e8c c3a47e78 c01cc928 c0189518 c0026e0c c01cb608
7e80: c3a47ea8 c3a47e90 c01cb634 c01cc8d0 00000000 c01cb608 bf000128 c3a47ecc
7ea0: c3a47eac c01cad88 c01cb618 c3804938 c3837c90 bf000114 bf000128 bf000128
7ec0: c3a47edc c3a47ed0 c01cb3c0 c01cad44 c3a47f08 c3a47ee0 c01ca66c c01cb3b0
7ee0: bf0000a0 bf000114 bf000170 bf000128 bf000040 00000000 000c7f7c c3a47f2c
7f00: c3a47f0c c01cb980 c01ca5d8 bf000114 bf000170 00000000 bf000040 00000000
7f20: c3a47f3c c3a47f30 c01cca30 c01cb8e4 c3a47f50 c3a47f40 bf000064 c01cc9f4
7f40: 00000000 c3a47f80 c3a47f54 c002b3a8 bf000050 00000000 000cb258 c002c084
7f60: 00000000 bf000170 00000000 000cb258 c002c084 c3a47fa4 c3a47f84 c0063320
7f80: c002b350 c0093050 00014712 000ca1b0 000cb050 00000080 00000000 c3a47fa8
7fa0: c002bee0 c0063268 000ca1b0 000cb050 00900080 000cb258 00014712 000cb080
7fc0: 00014712 000ca1b0 000cb050 00000000 000cb068 be9a7908 000c7f7c 00000002
7fe0: be9a5fa8 be9a5f9c 00052354 401b7a00 60000010 00900080 6f420900 0200001d
Backtrace:
[<c0189508>] (strcmp+0x0/0x40) from [<c01cc928>] (platform_match+0x68/0x74)
[<c01cc8c0>] (platform_match+0x0/0x74) from [<c01cb634>] (__driver_attach+0x2c/0x84)
r5:c01cb608 r4:c0026e0c
[<c01cb608>] (__driver_attach+0x0/0x84) from [<c01cad88>] (bus_for_each_dev+0x54/0x88)
r6:bf000128 r5:c01cb608 r4:00000000
[<c01cad34>] (bus_for_each_dev+0x0/0x88) from [<c01cb3c0>] (driver_attach+0x20/0x28)
r6:bf000128 r5:bf000128 r4:bf000114
[<c01cb3a0>] (driver_attach+0x0/0x28) from [<c01ca66c>] (bus_add_driver+0xa4/0x228)
[<c01ca5c8>] (bus_add_driver+0x0/0x228) from [<c01cb980>] (driver_register+0xac/0x138)
[<c01cb8d4>] (driver_register+0x0/0x138) from [<c01cca30>] (platform_driver_register+0x4c/0x60)
r8:00000000 r7:bf000040 r6:00000000 r5:bf000170 r4:bf000114
[<c01cc9e4>] (platform_driver_register+0x0/0x60) from [<bf000064>] (led_drv_init+0x24/0x44 [nineled_drv])
[<bf000040>] (led_drv_init+0x0/0x44 [nineled_drv]) from [<c002b3a8>] (do_one_initcall+0x68/0x1c0)
r4:00000000
[<c002b340>] (do_one_initcall+0x0/0x1c0) from [<c0063320>] (sys_init_module+0xc8/0x1f4)
r8:c002c084 r7:000cb258 r6:00000000 r5:bf000170 r4:00000000
[<c0063258>] (sys_init_module+0x0/0x1f4) from [<c002bee0>] (ret_fast_syscall+0x0/0x28)
r7:00000080 r6:000cb050 r5:000ca1b0 r4:00014712
Code: e92dd800 e24cb004 e3a02000 e1a0c000 (e7dc0002)
---[ end trace fade11e1cc592378 ]---
Segmentation fault

我不明白 我platform_driver类型的定义的结构体指针是有效的 怎么说是无效句柄呢???? 本人新手
级别: 新手上路
UID: 89451
精华: 0
发帖: 31
金钱: 160 两
威望: 32 点
综合积分: 62 分
注册时间: 2013-03-28
最后登录: 2016-05-12
1楼  发表于: 2013-04-28 15:58
有可能没设置好resource结构体