birdthree 发表于 2012-05-12 16:42

帮忙看看这个驱动是怎么使用的?

这个驱动是点亮8位LED的,细节部分不用管他

我只是想知道我该如何 使用 这个驱动。。。




#define LED_NAME        "zlge6x5c:red:"

static void __iomem *led_membase;

static void zlge6x5c_led_set(struct led_classdev *led_cdev, enum led_brightness value)
{
        int c;
        u32 val;

        c = led_cdev->name - 0x30;
        val = ioread32(led_membase);
        val &= ~(1<<c);
        if (value)
                val |= (1<<c);
        iowrite32(val, led_membase);
}
#define DEFINE_LED(X)        {        .name = LED_NAME#X, .brightness_set = zlge6x5c_led_set, }

#define EP2AGX_LEDS        8
static struct led_classdev zlge6x5c_led = {
        DEFINE_LED(0), DEFINE_LED(1), DEFINE_LED(2), DEFINE_LED(3),
        DEFINE_LED(4), DEFINE_LED(5), DEFINE_LED(6), DEFINE_LED(7),
};
static int zlge6x5c_led_probe(struct platform_device *pdev)
{
        struct resource *res;
        int ret;
        int i, j;

        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res)
                goto err_missing;
               
        if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
                dev_err(&pdev->dev, "Memory region busy\n");
                ret = -EBUSY;
                goto err_missing;
        }

        led_membase = ioremap(res->start, resource_size(res));
        if (!led_membase) {
                dev_err(&pdev->dev, "Unable to map registers\n");
                ret = -EIO;
                goto map_failed;
        }
        for (i = 0; i < EP2AGX_LEDS; i++) {
                ret = led_classdev_register(&pdev->dev, &zlge6x5c_led);
                if (ret < 0) {
                        for (j = i; j >= 0; j--) {
                                led_classdev_unregister(&zlge6x5c_led);
                        }
                        goto led_register_failed;
                }
        }

        return 0;

led_register_failed:
        iounmap(led_membase);
map_failed:
        release_mem_region(res->start, resource_size(res));
        return ret;
err_missing:
        return -ENOENT;
}

static int zlge6x5c_led_remove(struct platform_device *pdev)
{
        struct resource *res;
        int i;

        for (i = 0; i < EP2AGX_LEDS; i++) {
                led_classdev_unregister(&zlge6x5c_led);
        }
        iounmap(led_membase);

        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res)
                release_mem_region(res->start, resource_size(res));

        return 0;
}

static struct platform_driver zlge6x5c_led_driver = {
        .probe                = zlge6x5c_led_probe,
        .remove                = zlge6x5c_led_remove,
        .driver                = {
                .name                = "zlge6x5c-led",
        },
};

static int __init zlge6x5c_led_init(void)
{
        return platform_driver_register(&zlge6x5c_led_driver);
}

static void __exit zlge6x5c_led_exit(void)
{
        platform_driver_unregister(&zlge6x5c_led_driver);
}


module_init(zlge6x5c_led_init);
module_exit(zlge6x5c_led_exit);
页: [1]
查看完整版本: 帮忙看看这个驱动是怎么使用的?