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");
相关推荐
wuminyu10 小时前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
皆圥忈11 小时前
文件描述符与重定向
linux
实心儿儿11 小时前
Linux —— 线程池(2)
linux
AI帮小忙11 小时前
主机安全排查
linux·服务器·安全
asdfg125896311 小时前
C 语言中产生伪随机数的标准做法
c语言·开发语言
玖玥拾11 小时前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
半壶清水11 小时前
ubuntu下利用ns-3 + NetAnim搭建可视化路由选路过程的方法
linux·运维·ubuntu
程序员老舅12 小时前
从内核视角,看Linux文件读写过程
linux·服务器·c++·内核·linux内核·vfs·linux内存
李少兄12 小时前
Linux服务器IP地址查询
linux·服务器·tcp/ip
皆圥忈12 小时前
磁盘物理结构与文件系统基础讲解
linux·算法