效果
# cat backlight.c #define pr_fmt(fmt) "hello-backlight# %s " fmt, __func__ #include <linux/module.h> #include <linux/component.h> #include <linux/platform_device.h> #include <linux/backlight.h> #define DRIVER_NAME "demo-backlight" struct hello_backlight_data { struct backlight_device *backlight; }; // called by cat /sys/class/backlight/demo-backlight/actual_brightness static int hello_backlight_get_brightness(struct backlight_device *bl) { pr_info("get brightness\n"); return 0; } // called by echo 1000 > /sys/class/backlight/demo-backlight/brightness static int hello_backlight_update_status(struct backlight_device *bl) { pr_info("set brightness\n"); return 0; } static const struct backlight_ops backlight_ops = { .update_status = hello_backlight_update_status, .get_brightness = hello_backlight_get_brightness, }; static int hello_backlight_probe(struct platform_device *pdev) { struct backlight_properties props; struct hello_backlight_data *data; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (data == NULL) return -ENOMEM; props.type = BACKLIGHT_RAW; props.power = FB_BLANK_UNBLANK; props.max_brightness = 1000; props.brightness = 600; data->backlight = devm_backlight_device_register(&pdev->dev, DRIVER_NAME, &pdev->dev, data, &backlight_ops, &props); if (IS_ERR(data->backlight)) { return PTR_ERR(data->backlight); } platform_set_drvdata(pdev, data); return 0; } static void hello_backlight_remove(struct platform_device *pdev) { platform_set_drvdata(pdev, NULL); } static struct platform_driver hello_backlight_driver = { .driver = { .name = DRIVER_NAME, }, .probe = hello_backlight_probe, .remove = hello_backlight_remove, }; static struct platform_device *pdev; static int __init hello_backlight_init(void) { int err; err = platform_driver_register(&hello_backlight_driver); if (err) { return err; } pdev = platform_device_register_simple(DRIVER_NAME, 0, NULL, 0); if (!pdev) { goto err; } return 0; err: platform_driver_unregister(&hello_backlight_driver); return -1; } static void __exit hello_backlight_exit(void) { platform_device_unregister(pdev); platform_driver_unregister(&hello_backlight_driver); } module_init(hello_backlight_init) module_exit(hello_backlight_exit) MODULE_LICENSE("GPL");
