Chinaunix
标题:
帮忙看看这个驱动是怎么使用的?
[打印本页]
作者:
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[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);
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2