免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2188 | 回复: 0
打印 上一主题 下一主题

帮忙看看这个驱动是怎么使用的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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[strlen(led_cdev->name)-1] - 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[EP2AGX_LEDS] = {
        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[i]);
                if (ret < 0) {
                        for (j = i; j >= 0; j--) {
                                led_classdev_unregister(&zlge6x5c_led[i]);
                        }
                        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[i]);
        }
        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);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP