LCD背光设备的 驱动框架2

2023-11-10 08:59
文章标签 驱动 框架 设备 lcd 背光

本文主要是介绍LCD背光设备的 驱动框架2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文分成两个部分,先对LCD背光设备的驱动开发进行整体的了解,把握其中重点的部分,为后面的驱动开发奠定理论的基础,然后就是对背光驱动的框架进行下分析。

背光设备驱动开发概述

         要想了解驱动的开发,必须先了解Linux的sysfs文件系统。Linux 2.6内核的一个重要特色是提供了统一的内核设备模型,随着技术的不断进步,系统的拓扑结构越来越复杂,对智能电源管理、热插拔等支持要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形势的需要,2.6内核开发了全新的设备模型。

Linux设备模型

图一 LInux设备模型

         Linux 2.6 内核引入了Sysfs文件系统,Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。其顶层目录主要有:block、devices、bus、drivers、class、power和firmware等。其中:block目录包含所有的块设备;devices目录包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构;bus目录包含系统中所有的总线类型;drivers目录包括内核中所有已注册的设备驱动程序;class目录包含系统中的设备类型(如网卡设备,声卡设备等)。在/sys/bus的pci目录下又会再分出drivers和devices目录,而devices目录中的文件是对/sys/devices目录中文件的符号链接。同样的,/sys/class目录下包含许多对/sys/devices下文件的链接,如图一,是描述的2.6内核总线、类、设备和驱动的层级关系,也符合LINUX 2.6内核的设备模型。

         当前多开发的背光设备文件对应于/sys/class/backlight/目录下的文件。前面已将说过,在/sys/class/目录下的文件对应的都是系统中对应的不同设备类型,/sys/class/backlight就是注册的背光设备类型,而在/sys/class/backlight/目录下的文件就是所注册的背光设备。对于背光设备类型的注册一般系统都完成了,代码如下:

static struct class *backlight_class;

static int __init backlight_class_init(void)
{
   backlight_class = class_create(THIS_MODULE, "backlight");//注册背光设备类型;
   if (IS_ERR(backlight_class)) {
       ……

   }

   backlight_class->dev_attrs = bl_device_attributes;    //指定背光设备类型的属性文件;
   return 0;
}

其中class的结构体定义如下:

struct class {
    const char   * name;  //每个类需要一个唯一的名字, 它将显示在/sys/class中
    struct module    * owner;

    struct kset     subsys;         //对应的subsystem
    struct list_head    children;   //class_device链表
    struct list_head    devices;
    struct list_head    interfaces; //class_interface链表
    struct kset         class_dirs;
    struct semaphore    sem;        //children和interfaces链表锁

    struct class_attribute     * class_attrs;         //指向类属性的指针
    struct class_device_attribute * class_dev_attrs;  //指向类中每个设备的一组默认属性的指针
    struct device_attribute    * dev_attrs;           //指向该类中属性文件的指针

    ……
    void  (*release)(struct class_device *dev);       //把设备从类中删除的函数
    void  (*class_release)(struct class *class);      //删除类本身的函数
    ……
};

         通常用device_attribute结构体来定义属性文件,包含四个参数:设备属性名称、权限还有show和store方法。Linux内核提供了关于背光设备驱动的相关框架,包括背光设备的相关数据结构和相关注册函数等,可参考linux内核backlight.h和backlight.c,还有platform_device.h。下面先来几个重要的结构体和相关函数:

          背光设备的结构体:

struct backlight_device {   

     struct backlight_properties props;   //背光设备属性结构体 
     struct mutex update_lock;        
     struct mutex ops_lock;
     struct backlight_ops *ops;           //背光设备的相关操作函数 
     struct notifier_block fb_notif;
     struct device dev;
};

其中backlight_properties和backlight_ops结构体定义如下:

struct backlight_properties {
    int brightness;        //当前亮度,最大值不能超过max_brightness
    int max_brightness;    //最大亮度,只读
    int power;             //当前的电源模式
    int fb_blank;
};

struct backlight_ops {
    int (*update_status)(struct backlight_device *);    //更新背光设备亮度等属性
    int (*get_brightness)(struct backlight_device *);   //获取背光设备亮度
    int (*check_fb)(struct fb_info *);
};

在/sys/class/backlight/目录下注册和移除具体的背光设备时调用下面两个函数:

struct backlight_device *backlight_device_register(const char *name,struct device *dev, void *devdata, struct backlight_ops *ops);

void backlight_device_unregister(struct backlight_device *bd);

背光设备驱动框架分析

        下面我们来对IMX233LCD背光设备的驱动框架进行下分析,设计到的硬件的不做介绍,不同的开发平台具有硬件差异性,下篇文章将会对当前平台硬件相关的部分做介绍。

module_init(genericbl_init);
module_exit(genericbl_exit);

static int __init genericbl_init(void)
{
    return platform_driver_register(&genericbl_driver);
}

static void __exit genericbl_exit(void)
{
    platform_driver_unregister(&genericbl_driver);
}

module_init() –>  genericbl_init() –> platform_driver_register(&genericbl_driver);
module_exit() –>  genericbl_exit() –>  platform_driver_unregister(&genericbl_driver);

genericbl_driver如下:

static int genericbl_probe(struct platform_device *pdev);

static int genericbl_remove(struct platform_device *pdev);

static struct platform_driver genericbl_driver = {
    .probe         = genericbl_probe,
    .remove        = genericbl_remove,
    .driver        = {
        .name      = "generic-bl",
    },
};

         platform_device和platform_driver结构体分别对应平台设备和驱动,具体看参见platform_device.h头文件。genericbl_probe回调函数很关键,可以看做一个探测函数,在注册设备驱动之后如果探测到与此驱动相对应的背光设备时才会运行genericbl_probe函数,同时会传递一个保存此设备信息的platform_device结构体,并且在会在/sys/class/backlight目录下注册并建立具体的背光设备文件(包括对应背光设备的属性文件),最后还要进行相关的初始化工作。genericbl_remove回调函数是移除/sys/class/backlight/目录下相应的设备文件(包括对应背光设备的属性文件)。genericbl_probe函数中在/sys/class/backlight目录下注册具体的背光设备时调用如下函数:

struct backlight_device *backlight_device_register(const char *name,struct device *parent, void *devdata, struct backlight_ops *ops)

想进一步了解backlight_device_register函数实现的代码可阅读backlight.c,该函数返回一个backlight_device背光设备结构体的指针,背光设备文件注册创建之后其目录会包含几个属性文件(见图二),主要属性文件是brightness和max_brightness,分别表示背光灯的亮度和最大亮度。需要注意的是注册完设备文件之后要进行相关的属性文件初始化。背光设备注册函数的第四个参数是个backlight_ops结构体指针,参考backlight.h,本驱动对应的结构体指针genericbl_ops初始化如下:

static struct backlight_ops genericbl_ops = {
    .get_brightness = genericbl_get_intensity,
    .update_status  = genericbl_send_intensity,
};

static int genericbl_send_intensity(struct backlight_device *bd)会接触到硬件相关的部分,它主要通过修改寄存器来达到修改背光灯设备亮度等相关属性,而static int genericbl_get_intensity(struct backlight_device *bd)是获取背光设备的亮度属性,不需要接触硬件。

tt

图二 背光设备属性文件

        当更新背光灯亮度的时候我们,我们会通过修改/sys/class/backlight/背光设备文件名/下的brightness这个背光属性文件,它的值一般为0 – 10 ,最大值为同目录下max_brightness属性文件的值,修改brightness文件的值后会最终调用背光等驱动的genericbl_send_intensity函数来修改相对应的寄存器,从而形成对应的波形输入到RT9284B15PJ6芯片,最后来更改LCD背光灯的亮度,具体的原理看参考前一篇背光设备的原理。

这篇关于LCD背光设备的 驱动框架2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381679

相关文章

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应