代码如下:
#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类型的定义的结构体指针是有效的 怎么说是无效句柄呢???? 本人新手