热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linuxled子系统分析之二led子系统软件架构及数据结构

上一章对led子系统进行了概述,本章我们主要分析led子系统软件架构及数据结构。led子系统涉及的数据结构不多,软件架构也相对简单,下面我

 

     上一章对led子系统进行了概述,本章我们主要分析led子系统软件架构及数据结构。led子系统涉及的数据结构不多,软件架构也相对简单,下面我们就简要说明一下。本章的主要内容如下:

 

一、led子系统数据结构及关联

 

二、led子系统相关数据结构说明

 

 

一、led子系统实现说明

针对led子系统,其实现主要分为三部分:

  1. led-trigger部分主要提供led触发器(或者led控制方法)的注册接口、led blink设置等;
  2. led-class部分主要完成led器件对应逻辑设备的注册、led设备对应属性参数的添加(如亮度参数brightness、最大亮度值max_brightness、该设备关联led-trigger属性参数trigger)led-trigger相关的设备属性参数的添加(即led-trigger );
  3. led-core部分主要提供led亮度设置的接口、led软件闪烁定时器的启动等接口。

 

 

 

二、led子系统相关数据结构说明

 

     其实针对led子系统而言,其本身实现的功能也比较简单,目标就是控制led的亮(包括亮度调节)、灭以及闪烁这三种情况,而针对led亮、灭、闪烁的控制策略依据业务会有所不同,因此基于这些要求,led子系统抽象了两个数据结构:struct led_classdev、struct led-trigger。下面我们首先从需求入手,分析所需要实现的功能,然后再和led子系统针对数据结构的定义进行比较。

 

led设备需要实现的功能:

  1. 需要提供亮度设置的接口,以便对led进行亮度设置;
  2. 需要支持led闪烁的功能;
  3. 能够针对具体的功能模块,提供相应的亮度调节等(以上两条是通用需求,而第三条则是可扩展的需求,以便让led实现不同的功能)

led触发器所需要实现的功能:

  1. 提供一个led控制策略接口,该接口可实现对led功能的控制(如呼吸灯策略、backlight等)

 

而led子系统中关于struct led_classdev、struct led-trigger也就是实现上述的功能,下面我们分析一下。

 

struct led_classdev

 

如下即为led_classdev,所包含的内容:

  1. led亮度设置值以及最大亮度值
  2. led亮度设置与获取当前亮度的接口;
  3. 该led自行实现的闪烁接口;
  4. 为该led提供一个定时器,通过定时器实现通用的led闪烁功能(若该led不需要该定时器实现闪烁,则只需要实现上述3中所说的接口即可);
  5. 该led所需要绑定的led-trigger,即为该led绑定一个led控制方法;
  6. 该led定义了一个struct device类型的变量,用于将该led与led相关的class关联,并为应用程序提供了一个访问led-device的方式(通过向sysfs中创建文件,应用程序访问这些文件即可实现与led-device的交互)。

 

 

struct led-trigger

 

该数据结构的定义如下:

  1. 调用activate接口(当led-dev与led-trigger完成绑定时,即调用该接口),使能该led的控制策略;
  2. 调用deactivate接口(当led-dev与led-trigger解除绑定时,即调用该接口),关闭该led的控制策略;

 

   除了上述的数据结构之外,led子系统还提供了led-dev的注册与注销接口、led亮度设置接口、定时器实现的led闪烁接口、led-trigger的注册与注销接口等对外接口。

 

 

 

 

以上即是led_classdev、led_trigger以及led子系统提供接口的关联图,主要说明如下:

  1. 所有注册的led_classdev均会链接到leds_list;
  2. 所有注册的led_trigger均会链接到链表trigger_list上;
  3. 一个led_trigger可以与多个led_classdev关联,而一个led_classdev只能绑定一个led_trigger,即一个led只能同时使用一种led控制策略(这也符合我们的需求)。
  4. 每一个led_classdev均会提供一个定时器,用于实现led闪烁功能,但是否启用该软件定时器由绑定的led-trigger决定(当然也与led-trigger所要实现的功能关联,如ledtrigger-timer,则就是借助该软件定时器实现闪烁的(前提是该led-classdev未实现自己的闪烁接口))。

 

 

 

      以上就是本文章的主要内容,led子系统相对来说是一个小系统,实现的功能也较简单,led-classdev、led-trigger的注册与注销也就是完成上述数据结构间的关联或取消上述数据结构间的关联。而上述数据结构的实现也较简单,因此也就不打算继续分析led-classdev、led-trigger的注册与注销接口了,由读者自行分析。下一篇文章我们实现一个ledtrigger-gpio-pwm,并借助上次实现的virt gpio,进行驱动的验证工作。



推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有