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");
相关推荐
CodeOfCC7 小时前
Linux 嵌入式arm64安装openclaw
linux·运维·服务器
聆风吟º8 小时前
【C标准库】深入理解C语言strcat函数:字符串拼接的利器
c语言·开发语言·strcat·库函数
宵时待雨8 小时前
linux笔记归纳3:linux开发工具
linux·运维·笔记
magrich9 小时前
安装NoMachine并解决无外接显示器桌面黑屏
linux·运维·服务器
fish_xk9 小时前
Linus基础指令
linux·服务器
宁波阿成9 小时前
在ubuntu22.04源码级安装sub2api
linux·运维·ubuntu·ai·api·token·中转站
charlie11451419110 小时前
嵌入式Linux驱动开发(7) 从虚拟设备到真实硬件 —— LED驱动硬件基础
linux·开发语言·驱动开发·内核·c
Mortalbreeze10 小时前
软件包管理器yum和编辑器vim详解 —— 附带vim配置链接
linux·服务器
李日灐10 小时前
< 7 > Linux 开发工具:git 版本控制器 和 cgdb/gdb 调试器
linux·运维·服务器·开发语言·git·调试器·gdb/cgdb
我不是懒洋洋11 小时前
手写一个一致性哈希:从原理到分布式缓存实战
c语言