Linux led子系统分析之三 led设备驱动与ledtrigger驱动实现
在前面两章,我们介绍了led子系统的软件框架与数据结构,本章我们实现一个led设备驱动、ledtrigger,用于led子系统的驱动开发练习,本章的主要内容如下:
一、led设备驱动开发流程
二、led trigger驱动开发流程
三、本次练习所涉及的开发内容说明
四、led-gpio驱动开发说明
五、led-trigger-pwm-gpio驱动开发说明
六、验证说明
一、led设备驱动开发流程
针对led设备驱动,主要完成如下几步即可:
- 初始化并设置一个struct led_classdev 类型的变量;
- 调用led_classdev_register完成led device的注册
二、led trigger驱动开发流程
针对led触发器,主要完成如下几步即可:
- 定义并设置struct led_trigger 类型的变量;
- 调用led_trigger_register完成led trigger的注册即可。
三、本次练习所涉及的开发内容说明
- 需要熟悉platform device、platform driver使用;
- 借助上一专栏(gpio子系统分析专栏)实现的virt gpio chip驱动,作为虚拟gpio设备;
- 实现一个基于gpio控制的led设备,该设备可完成一个gpio led device的注册,并提供亮度设置接口;
- 实现一个基于gpio-led的led trigger,该led trigger实现的功能是输出pwm波形(主要是借助virt gpio实现)
四、led-gpio驱动开发说明
相关数据结构说明
struct led_gpio_data为该gpio-led设备的数据结构:
- 其内部包含led_classdev类型的变量led_dev,用于实现led设备的注册;
- 包含gpio的值;
- 该gpio是否为低有效
struct led_gpio_platform_data主要用于gpio-led对应的platform device设备向platform driver传递参数,参数包含gpio的值、gpio是否低有效,默认gpio值、默认选择的led-trigger名称等内容。
代码实现说明
- 在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,包含如下内容:
- 定义一个高精度定时器timer,该定时器实现周期亮灭功能;
- 定义delay_on指示led亮的时间;
- 定义delay_off指示led灭的时间
代码设计
led_trigger的active函数
在该函数中,完成如下功能:
- 完成struct gpio_pwm_trig_data类型变量内存的申请;
- 完成delay_on、delay_off对应设备属性的创建
- 完成高精度定时器的初始化,该定时器的超时函数主要完成亮灭的设置及下一个超时时间的设置(仅在用户设置delay_on、delay_off均不为0时,方可启动定时器)。如下是该接口的定义
led_trigger_deactive函数
该函数完成active函数申请内存的释放,定时器的关闭、设备属性的删除等内容。
六、验证说明
下面说明验证步骤:
- insmod virt_gpio_dev.ko、insmod virt_gpio.ko,完成虚拟gpio chip的注册;
- insmod led_gpio.ko 、insmod ledtrigger-gpio-pwm.ko完成led device、led trigger的注册;
- 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驱动实现相关推荐
- Linux pinctrl子系统分析之三 数据结构分析
在上一章我们通过数据结构间的关联,说明了pinctrl子系统的软件框架.本章我们主要介绍每一个数据结构的定义,从而加深对pinctrl子系统相关的数据结构理解.本章我们依然从soc pin描述.boa ...
- linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备
在< linux IIC子系统分析(四)--I2c bus初始化> 中我们创建了I2C 总线驱动,I2C adapter device 和adapter drivers也在这时创建 在&l ...
- linux input子系统分析--子系统核心.事件处理层.事件传递过程
linux input子系统分析--子系统核心.事件处理层.事件传递过程 一. 输入子系统核心分析. 1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注 ...
- linux input子系统分析--概述与数据结构
linux input子系统分析--概述与数据结构 Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互.输入设 ...
- Linux MMC子系统分析(二)——Host分析
Linux MMC子系统分析(二)--Host分析 前言 通过前面对mmc子系统的模型分析,我们能够知道host是对应于硬件控制器的具体操作.本文将以sdhci-s3c.c为例对host进行简单的分析 ...
- linux IIC子系统分析(二)—— linux i2c 架构概述
I2C总线因为它及简单的硬件连接和通讯方式,在现在的很多设备上它是一种不可或缺的通讯总线.如果用当单片机直接操作I2C,其实很简单,只要正确把握IIC的操作时序就可以了.但是在linux系统中,I2C ...
- Linux input子系统分析
输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...
- linux input子系统分析--主要函数
linux input子系统分析--主要函数 一. 各种注册函数 因为分析一所讲的每种数据结构都代表一类对象,所以每种数据结构都会对应一个注册函数,他们都定义在子系统核心的input.c文件中.主要有 ...
- Linux I2C子系统分析-I2C设备驱动
接下来以一个实际的例子来看I2C设备驱动,就以drivers/i2c/i2c-dev.c为例. 先看它的初始化和注销函数 [cpp] view plaincopy static int __init ...
- [arm 驱动]Linux输入子系统分析
首先说明一下,本文是基于Linux-2.6.38版本内核来分析Linux输入子系统架构和原理的.这阵子本来没有打算花时间来分析Linux input system的,然而当在研究S3C6410触摸屏驱 ...
最新文章
- 28 模态框拖动案例
- 来聊聊COCO数据集上两大霸榜模型-CBNet和DetectoRS
- 【OpenCV】8邻域种子填充法剔除短连通域的高效算法
- 如何诊断crs 安装时 root.sh 脚本执行错误
- 怎么开启PHP 的错误提示?
- word List 07
- 如何确定Ionic是否适合您的项目
- 红橙Darren视频笔记 自定义sidebar 自定义View ViewGroup套路
- 在Android软件开发教学过程中应当注意的事项总结
- 利用MO实现流场显示
- Matlab定义自定义深度学习网络中间层
- Java全栈学习路线
- 台式计算机用手机流量上网,台式机如何使用手机流量上网
- homework2的进展
- Expression:vector subscript out of range
- 突破体系结构的错误–当Dreamliner成为噩梦时
- app中使用企业微信sdk分享小程序报错:小程序路径错误,加载超时 解决办法。
- 海报看起来很普通?数字平原概念设计来制作
- 衡量风控模型优劣的曲线-PR曲线、ROC曲线、K-S曲线、Lift曲线
- SAS概念知识点 (复习1)
热门文章
- 产品读书《Facebook效应:看Facebook如何打造无与伦比的社交帝国》
- php aria2离线下载器,下载神器——Aria2,打造你自己的离线下载服务器
- 【联邦学习】综述《Advances and Open Problems in Federated Learning》论文结构
- wjh2005:GitHub 上有哪些完整的 iOS-App 源码值得参考?
- 6319. 【省选组】【USACO 2019 February Platinum】Problem 3. Mowing Mischief
- java excel 单元格 斜线_POI实现excel单元格画斜线
- 文件夹加密狗的加密原理与解密
- Failed to process import candidates for configuration class [com.gsy.ServiceRibbonApplication]; nest
- 视频如何去水印-免费视频水印去除工具
- 彼得·林奇的25条黄金规则