免费注册 查看新帖 |

Chinaunix

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

问题:linux自带的led驱动问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-22 23:03 |只看该作者 |倒序浏览
本帖最后由 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输入数据时使用,因为这个驱动好像不是在用户空间来操作的。。。但我在看源代码时还是看不懂,觉得我的想法又不是,问一下,这个函数如何被调用的,谢谢!

论坛徽章:
0
2 [报告]
发表于 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()函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP