2012拾忆 发表于 2012-03-22 23:03

问题: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输入数据时使用,因为这个驱动好像不是在用户空间来操作的。。。但我在看源代码时还是看不懂,觉得我的想法又不是,问一下,这个函数如何被调用的,谢谢!

zhangzhaozaki 发表于 2012-04-05 01:13

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]
查看完整版本: 问题:linux自带的led驱动问题