在前面两章,我们介绍了led子系统的软件框架与数据结构,本章我们实现一个led设备驱动、ledtrigger,用于led子系统的驱动开发练习,本章的主要内容如下:

一、led设备驱动开发流程

二、led trigger驱动开发流程

三、本次练习所涉及的开发内容说明

四、led-gpio驱动开发说明

五、led-trigger-pwm-gpio驱动开发说明

六、验证说明

一、led设备驱动开发流程

针对led设备驱动,主要完成如下几步即可:

  1. 初始化并设置一个struct led_classdev 类型的变量;
  2. 调用led_classdev_register完成led device的注册

二、led trigger驱动开发流程

针对led触发器,主要完成如下几步即可:

  1. 定义并设置struct led_trigger 类型的变量;
  2. 调用led_trigger_register完成led trigger的注册即可。

三、本次练习所涉及的开发内容说明

  1. 需要熟悉platform device、platform driver使用;
  2. 借助上一专栏(gpio子系统分析专栏)实现的virt gpio chip驱动,作为虚拟gpio设备;
  3. 实现一个基于gpio控制的led设备,该设备可完成一个gpio led device的注册,并提供亮度设置接口;
  4. 实现一个基于gpio-led的led trigger,该led trigger实现的功能是输出pwm波形(主要是借助virt gpio实现)

四、led-gpio驱动开发说明

相关数据结构说明

struct led_gpio_data为该gpio-led设备的数据结构:

  1. 其内部包含led_classdev类型的变量led_dev,用于实现led设备的注册;
  2. 包含gpio的值;
  3. 该gpio是否为低有效

struct led_gpio_platform_data主要用于gpio-led对应的platform device设备向platform driver传递参数,参数包含gpio的值、gpio是否低有效,默认gpio值、默认选择的led-trigger名称等内容。

代码实现说明

  1. 在platform driver的probe函数中,完成struct led_gpio_data类型变量的创建,对应gpio的申请及设置为输出模式,并完成struct led_classdev类型变量的设置(主要设置函数brightness_set、默认选择的led-trigger的名称等内容,接着调用led_classdev_register完成注册即可),如下是代码实现

led-trigger-pwm-gpio驱动开发说明

本trigger实现的功能是根据gpio值输出pwm波形(这个是借助led子系统的闪烁功能实现通过gpio进行pwm波形的输出验证,也可以理解成就是led周期闪烁,唯一的不同是使用高精度定时器实现微秒级亮灭罢了,此处主要是为了验证led-trigger功能)

相关数据结构

主要是数据结构struct gpio_pwm_trig_data,包含如下内容:

  1. 定义一个高精度定时器timer,该定时器实现周期亮灭功能;
  2. 定义delay_on指示led亮的时间;
  3. 定义delay_off指示led灭的时间

代码设计

led_trigger的active函数

在该函数中,完成如下功能:

  1. 完成struct gpio_pwm_trig_data类型变量内存的申请;
  2. 完成delay_on、delay_off对应设备属性的创建
  3. 完成高精度定时器的初始化,该定时器的超时函数主要完成亮灭的设置及下一个超时时间的设置(仅在用户设置delay_on、delay_off均不为0时,方可启动定时器)。如下是该接口的定义

led_trigger_deactive函数

该函数完成active函数申请内存的释放,定时器的关闭、设备属性的删除等内容。

六、验证说明

下面说明验证步骤:

  1. insmod virt_gpio_dev.ko、insmod virt_gpio.ko,完成虚拟gpio chip的注册;
  2. insmod led_gpio.ko 、insmod ledtrigger-gpio-pwm.ko完成led device、led trigger的注册;
  3. insmod virt_gpio_led.ko 完成led-gpio对应platform device的注册

完成以上三步,在/sys/class/leds/virt_led_pwm下面就可以设置该led的trigger,此处我们设置为gpiopwm

echo gpiopwm >trigger

然后设置亮灭时间(单位是微秒,此处我们设置亮灭各1秒)

echo 1000000 >delay_on

echo 1000000 >delay_off

然后进入目录/sys/devices/platform/virt_gpio_dev,查看文件vgpio_out,如下所示即实现了周期设置gpio的值。

本次测试代码已在ubuntu16.04上,完成验证。代码链接:https://gitee.com/jerry_chg/led_dev_led_trigger.git。

本篇文章主要介绍如何实现led device、led trigger驱动开发,希望对大家有所帮助。

Linux led子系统分析之三 led设备驱动与ledtrigger驱动实现相关推荐

  1. Linux pinctrl子系统分析之三 数据结构分析

    在上一章我们通过数据结构间的关联,说明了pinctrl子系统的软件框架.本章我们主要介绍每一个数据结构的定义,从而加深对pinctrl子系统相关的数据结构理解.本章我们依然从soc pin描述.boa ...

  2. linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备

    在< linux IIC子系统分析(四)--I2c bus初始化> 中我们创建了I2C 总线驱动,I2C adapter device 和adapter drivers也在这时创建 在&l ...

  3. linux input子系统分析--子系统核心.事件处理层.事件传递过程

    linux input子系统分析--子系统核心.事件处理层.事件传递过程 一.  输入子系统核心分析. 1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注 ...

  4. linux input子系统分析--概述与数据结构

    linux input子系统分析--概述与数据结构 Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互.输入设 ...

  5. Linux MMC子系统分析(二)——Host分析

    Linux MMC子系统分析(二)--Host分析 前言 通过前面对mmc子系统的模型分析,我们能够知道host是对应于硬件控制器的具体操作.本文将以sdhci-s3c.c为例对host进行简单的分析 ...

  6. linux IIC子系统分析(二)—— linux i2c 架构概述

    I2C总线因为它及简单的硬件连接和通讯方式,在现在的很多设备上它是一种不可或缺的通讯总线.如果用当单片机直接操作I2C,其实很简单,只要正确把握IIC的操作时序就可以了.但是在linux系统中,I2C ...

  7. Linux input子系统分析

    输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...

  8. linux input子系统分析--主要函数

    linux input子系统分析--主要函数 一. 各种注册函数 因为分析一所讲的每种数据结构都代表一类对象,所以每种数据结构都会对应一个注册函数,他们都定义在子系统核心的input.c文件中.主要有 ...

  9. Linux I2C子系统分析-I2C设备驱动

    接下来以一个实际的例子来看I2C设备驱动,就以drivers/i2c/i2c-dev.c为例. 先看它的初始化和注销函数 [cpp] view plaincopy static int __init  ...

  10. [arm 驱动]Linux输入子系统分析

    首先说明一下,本文是基于Linux-2.6.38版本内核来分析Linux输入子系统架构和原理的.这阵子本来没有打算花时间来分析Linux input system的,然而当在研究S3C6410触摸屏驱 ...

最新文章

  1. 28 模态框拖动案例
  2. 来聊聊COCO数据集上两大霸榜模型-CBNet和DetectoRS
  3. 【OpenCV】8邻域种子填充法剔除短连通域的高效算法
  4. 如何诊断crs 安装时 root.sh 脚本执行错误
  5. 怎么开启PHP 的错误提示?
  6. word List 07
  7. 如何确定Ionic是否适合您的项目
  8. 红橙Darren视频笔记 自定义sidebar 自定义View ViewGroup套路
  9. 在Android软件开发教学过程中应当注意的事项总结
  10. 利用MO实现流场显示
  11. Matlab定义自定义深度学习网络中间层
  12. Java全栈学习路线
  13. 台式计算机用手机流量上网,台式机如何使用手机流量上网
  14. homework2的进展
  15. Expression:vector subscript out of range
  16. 突破体系结构的错误–当Dreamliner成为噩梦时
  17. app中使用企业微信sdk分享小程序报错:小程序路径错误,加载超时 解决办法。
  18. 海报看起来很普通?数字平原概念设计来制作
  19. 衡量风控模型优劣的曲线-PR曲线、ROC曲线、K-S曲线、Lift曲线
  20. SAS概念知识点 (复习1)

热门文章

  1. 产品读书《Facebook效应:看Facebook如何打造无与伦比的社交帝国》
  2. php aria2离线下载器,下载神器——Aria2,打造你自己的离线下载服务器
  3. 【联邦学习】综述《Advances and Open Problems in Federated Learning》论文结构
  4. wjh2005:GitHub 上有哪些完整的 iOS-App 源码值得参考?
  5. 6319. 【省选组】【USACO 2019 February Platinum】Problem 3. Mowing Mischief
  6. java excel 单元格 斜线_POI实现excel单元格画斜线
  7. 文件夹加密狗的加密原理与解密
  8. Failed to process import candidates for configuration class [com.gsy.ServiceRibbonApplication]; nest
  9. 视频如何去水印-免费视频水印去除工具
  10. 彼得·林奇的25条黄金规则