22_backlightLinux内核模块

01_basicLinux内核模块_the kernel was built by-CSDN博客https://blog.csdn.net/m0_37132481/article/details/136157384

效果

复制代码
# 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");
相关推荐
迷途之人不知返9 小时前
【文件系统】-4-软硬连接
linux
1234567890@world11 小时前
正点原子 ATK-DLRK3568 嵌入式Linux系统开发手册V1.3 详细总结
linux·stm32·单片机
sun_weitao11 小时前
极简版 MCP 工具实现方案
java·linux·服务器
Navigator_Z12 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
学逆向的12 小时前
C 多文件开发
c语言·开发语言·网络安全
爱和冰阔落13 小时前
【Linux】线程安全进阶:单例模式、可重入函数与死锁排查
linux·运维·安全·单例模式
先知后行。13 小时前
pimpl
linux
学逆向的13 小时前
C 内存属性
c语言·开发语言·算法·网络安全
Zwawa13 小时前
一盏 LED 不够用了:让同一盏灯说出不同的话
c语言·单片机·嵌入式
q275513004214 小时前
AS8132 DP转HDMI 4K60(420)被动式 国产性价比AS方案
linux·算法·硬件架构·dash