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

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟