问题:linux自带的led驱动问题
本帖最后由 2012拾忆 于 2012-03-23 00:01 编辑来自linux自带的/driver/leds/leds-gpio.c文件
static void gpio_led_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct gpio_led_data *led_dat =
container_of(led_cdev, struct gpio_led_data, cdev);
int level;
if (value == LED_OFF)
level = 0;
else
level = 1;
if (led_dat->active_low)
level = !level;
if (led_dat->can_sleep) {
led_dat->new_level = level;
schedule_work(&led_dat->work);
} else
gpio_set_value(led_dat->gpio, level);
}
static int gpio_led_probe(struct platform_device *pdev)
{
......
led_dat->cdev.brightness_set = gpio_led_set;
......
ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
if (ret < 0) {
gpio_free(led_dat->gpio);
goto err;
}
}
......
}
}
kfree(leds_data);
return ret;
}
static struct platform_driver gpio_led_driver = {
.probe = gpio_led_probe,
.remove = __devexit_p(gpio_led_remove),
.driver = {
.name = "leds-gpio",
.owner = THIS_MODULE,
},
};
static int __init gpio_led_init(void)
{
return platform_driver_register(&gpio_led_driver);
}
static void __exit gpio_led_exit(void)
{
platform_driver_unregister(&gpio_led_driver);
}
请问一下,
gpio_led_set()这个函数如何使用,在用户空间如何调用。。。。我自己的想法就是通过往/sys/class/leds/.../brightness输入数据时使用,因为这个驱动好像不是在用户空间来操作的。。。但我在看源代码时还是看不懂,觉得我的想法又不是,问一下,这个函数如何被调用的,谢谢!
gpio_led_set()是GPIO LED驱动里面的函数,它没有EXPORT出去,所以其它驱动也不使用这个函数。
内核LED Core提供了下面的函数来控制LED的,它可以在其他驱动程序中使用。
void led_brightness_set(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
led_stop_software_blink(led_cdev);
led_cdev->brightness_set(led_cdev, brightness);
}
EXPORT_SYMBOL(led_brightness_set);
上面都在驱动中使用函数,按内核的LED架构完成的驱动,如gpio-led,好像在用户空间只提供了/sys/class/led/.../brightness文件接口。
当你向brightness文件写值时,就会调用 led_brightness_set()函数,接着就会调用gpio_led_set()函数。
页:
[1]