Linux驱动系列-PWM驱动

news2024/11/27 1:23:50

转自:嵌入式系统研发

1.概述

本文主要讲述了Linux的PWM驱动框架、实现方法、驱动添加方法和调试方法。

示例Linux内核版本:6.2.8。

2.原理

PWM是Pulse-Width Modulation的简称,中文译作脉冲宽度调制。作为一种调制技术,PWM的原理是通过调整周期性波形的高电平时间宽度,从而改变有效信号的占空比,实现对设备的供电控制。PWM技术的常见应用领域包括屏幕背光亮度调节、电机转速控制和风扇转速控制等。

Linux内核支持PWM驱动框架,该驱动框架采用结构体数据类型对PWM控制器和PWM信号进行了抽象,提供了PWM驱动框架核心代码和sysfs接口代码。PWM驱动开发者可以方便地利用该驱动框架,添加特定PWM控制器的驱动程序,并使用sysfs接口进行功能调试。

3.驱动框架及实现方法

3.1驱动框架源码

PWM驱动框架的主要源码:

./include/linux/pwm.h //PWM驱动框架头文件

./drivers/pwm/core.c //PWM驱动框架核心代码

./drivers/pwm/sysfs.c //PWM驱动框架sysfs接口代码

3.2驱动框架数据结构

  • (1)struct pwm_chip结构体,表示PWM控制器。

驱动开发者可以根据需要设计专用的PWM控制器结构体,以struct pwm_chip结构体作为一个成员变量,下面是一个示例,在./drivers/pwm/pwm-ab8500.c驱动中定义。

  • (2)struct pwm_ops结构体,包括PWM控制器的操作函数。其中应该由驱动开发者实现的2个基础函数为apply函数和get_state函数;apply函数用于配置PWM控制器,包括配置PWM信号的使能状态、周期、占空比、极性等;get_state函数用于在注册PWM控制器时获取指定PWM通道信号的初始状态,包括使能状态、周期、占空比、极性等。

在这里插入图片描述

  • (3)struct pwm_device结构体,表示PWM控制器输出的PWM信号。

3.3驱动框架核心函数

  • (1)pwmchip_add函数。用于注册一个新的PWM控制器设备。在./drivers/pwm/core.c中定义。

  • (2)pwmchip_remove函数。用于移除一个PWM控制器设备。在./drivers/pwm/core.c中定义。

3.4驱动典型实现方法

  • (1)概要

PWM驱动源文件位于./drivers/pwm路径下,需要驱动开发者添加相应的源文件即可,源文件设计可参考其他厂家的驱动代码。参考原有代码的命名风格,可以将新添加的驱动源文件命名为pwm-xx.c,将probe和remove函数分别命名为xx_pwm_probe和xx_pwm_remove,将PWM控制器结构体定义为struct xx_pwm_chip。./drivers/pwm路径下文件如下。

  • (2)apply函数和get_state函数定义

    根据PWM控制器手册,由驱动开发者定义apply函数和get_state函数。

  • (3)xx_pwm_probe函数定义

    xx_pwm_probe函数的实现方法为:首先对PWM控制器结构体struct xx_pwm_chip变量进行初始化,然后调用PWM驱动框架核心函数pwmchip_add注册一个新的PWM控制器设备。

  • (4)xx_pwm_remove函数定义

    xx_pwm_remove函数的实现方法为:调用PWM驱动框架核心函数pwmchip_remove移除一个PWM控制器设备。

4.驱动添加方法

4.1添加驱动源文件

按3.4节所述方法,编写驱动源文件pwm-xx.c,添加到./drivers/pwm路径下。

4.2添加编译支持

  • (1)修改./drivers/pwm路径下的Kconfig文件,添加所添加的PWM驱动配置选项。

  • (2)修改./drivers/pwm路径下的Makefile文件,添加pwm-xx.c的编译选项。

  • (3)在memuconfig界面,使能所添加的PWM驱动。配置界面如下所示。

4.3添加PWM控制器设备树节点

在设备树添加PWM控制器设备树节点。该节点的基本属性包括兼容性、寄存器和#pwm-cells数量,按需添加中断、时钟、复位等属性。

PWM控制器设备树设计方法可参考./Documentation/devicetree/bindings/pwm

下面是PWM控制器设备树节点的示例。参考文档如下:

./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml。

5.调试方法

使用sysfs接口对PWM驱动进行功能调试,主要调试命令示例如下。

  • (1)查看PWM控制器节点

ls /sys/class/pwm/pwmchip0

  • (2)打开指定PWM通道信号
echo n > /sys/class/pwm/pwmchip0/export 

//n为通道编号

  • (3)设置PWM信号周期
echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period   

//pvalue为周期值

  • (4)设置PWM信号占空比
echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle  

//dvalue为有效电平宽度值

  • (5)使能某个PWM通道信号
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
  • (6)禁止某个PWM通道信号
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot实现异步调用的几种方式

一、使用 CompletableFuture 实现异步任务 CompletableFuture 是 Java 8 新增的一个异步编程工具,它可以方便地实现异步任务。使用 CompletableFuture 需要满足以下条件: 异步任务的返回值类型必须是 CompletableFuture 类型; 在异步任务中…

基于vasp计算材料红外与Raman光谱信息

使用方法一:获取材料raman活性信息 代码链接:VASP/Sibulk-VASP at master raman-sc/VASP GitHub 前置计算材料的振动频率和介电常数等,参考INCAR如下: SYSTEM Si_bulk ISTART 0 # From-scratch; job : 0-new 1-cont 2-same…

4-2 贪心算法的基本要素

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 1.什么是贪心选择性质 贪心选择性质是一种在算法设计中经常使用的策略。它基于这样的思想:在每一步选择中,都选择当前看起来最优…

多篇论文入选ICASSP 2023,火山语音有效解决多类实践问题

近日由IEEE主办、被誉为世界范围内最大规模、也是最全面的信号处理及其应用方面的顶级学术会议ICASSP2023于希腊召开,该会议具有权威、广泛的学界以及工业界影响力,备受AI领域多方关注。会上火山语音多篇论文被接收并发表,内容涵盖众多前沿领…

superset db upgrade报错记录

superset db upgrade报错记录 报错1报错2报错3报错4报错5报错6成功了 报错1 (superset) [hyjhadoop102 ~]$ superset db upgradefrom markupsafe import soft_unicode ImportError: cannot import name soft_unicode from markupsafe (/opt/module/miniconda3/envs/superset/l…

git基本操作(笔记)

安装 查看是否安装成功 git --version配置用户名和邮箱 参数global表示全局配置,对所有仓库生效,system表示系统配置,对所有用户生效,省略是(local)表示本地配置,只对本地仓库有效。 git config…

奇安信 渗透测试(攻防类)一面复盘

奇安信 渗透测试(攻防类)一面复盘 1.你是哪里人2.你是做安全研发的,在qax这边除了这个红队的岗位还投递其他了吗3.看你研发做的比较多,为什么投递这个岗位4.给了一个具体的场景,问你做渗透测试的思路5.后渗透有了解吗&…

form-inserter 让你的表单插入更轻松

挖SRC的时候经常需要向 input 框或者textarea 框中插入一些payload,但是遇到某个网页需要插入的输入框很多或者payload 很复杂的时候,就需要多次复制粘贴,过程比较繁琐。 例如如下两种情况: 情况1:输入框很多 情况2:…

C语言趣味小游戏---利用二维数组实现三子棋游戏

学习了C语言中的二维数组,本照着学以致用的原则,现在利用对二维数组的操作来实现一个简单版的三子棋游戏。 三子棋其实我们都玩过,在我们这边又叫"一条龙"。就是一个九空格,下棋的双方依次在九个空格里面下棋&#xff0…

Jetson Nano之ROS入门 - - SLAM之Gmapping建图与路径规划

文章目录 前言一、Gmapping建图算法1、Gmapping算法流程原理2、Gmapping建图实操 二、AMCL蒙特卡洛定位1、自适应蒙特卡洛定位算法原理2、AMCL定位实操 三、move_base路径规划1、路径规划算法简介2、代价地图简介2、move_base路径规划实操 总结 前言 SLAM(Simultane…

Water valve concept流水法判断D-separation

Water valve concept流水法判断D-separation 文章目录 Water valve concept流水法判断D-separationD-separation流水法判断例子 D-separation 概率图模型中的D-separation是一种刻画随机变量之间条件独立性的方法。具体来说,给定一个概率图模型,如果其中…

Yarn【关于配置yarn-site.xml的注意事项】

注意事项 配置文件的<description>表签内容可以删&#xff0c;不影响配置文件的读取。最重要的<name><value>标签中间的内容一定要好好检查&#xff0c;尤其是在复制别人的配置信息的时候格外要注意&#xff1a;value中有没有空格、有没有因为你打开工具的不…

【IT经验实战】教你如何真正有效地学习一门IT技术

前言 在写博客之前&#xff0c;我在CSDN中搜寻了一下 “如何系统学习一门it技术” &#xff0c;琳琅满目&#xff0c;有些借鉴了ChatGPT生成的内容&#xff08;几乎一模一样&#xff09;、有些写得比较笼统没有针对性、有的偏向理论难以实操。 下文内容着实强调求学经历和过程…

SpringCloud组件介绍

一&#xff1a;什么是微服务&#xff08;Microservice&#xff09; 微服务英文名称Microservice&#xff0c;Microservice架构模式就是将整个Web应用组织为一系列小的Web服务。这些小的Web服务可以独立地编译及部署&#xff0c;并通过各自暴露的API接口相互通讯。它们彼此相互协…

小作文--流程图(练习1)

【【雅思写作】带你打破小作文‘流程图’的传说】 https://www.bilibili.com/video/BV1QP411Q7Gh/?share_sourcecopy_web&vd_source78768d4ae65c35ff26534bbaa8afc267 雅思小作文-流程图, 看这一篇就够了! - 冯凯文的文章 - 知乎 https://zhuanlan.zhihu.com/p/35868880 …

跳出零和博弈,AIGC是元宇宙的“催命符”还是“续命丹”?

文 | 智能相对论 作者 | 青月 从科幻小说《雪崩》里走出来的元宇宙&#xff0c;如今正在上演“地价雪崩”。 CoinGecko的一项调查显示&#xff0c;Otherdeed for Otherside、The Sandbox、Decentraland、Somnium Space和Voxels Metaverse 这五款知名元宇宙土地价格近期均出现…

Linux发送接收邮件

目录 一、实验 1.linux用户发送给linux中的其它用户 2.linux用户发送给外网用户 一、实验 1.linux用户发送给linux中的其它用户 &#xff08;1&#xff09;使用命令 yum install -y sendmail 安装sendmail软件 &#xff08;2&#xff09;使用yum install -y mailx 安装 mail…

获奖名单公布|Builder House首尔站及首次线下黑客松圆满收官!

由Sui基金会举办的Builder House首尔站于6月4日圆满收官&#xff0c;为期两天半的活动吸引了来自全球各地的区块链专业人士和Sui生态项目爱好者前来参加。 出席本次活动的Sui基金会成员有活动负责人Anthony、开发者关系工程师Will & Henry & Shayan、增长负责人Koh &a…

高校毕业就业信息管理系统

基于SpringSpringMVCMybatis实现的高校毕业就业信息管理系统 主要模块&#xff1a; 1&#xff09;学生模块&#xff1a; 已投简历、未投简历、录入简历、浏览招聘中岗位、 浏览已投岗位、未提交面试问卷、已提交面试问卷、 收到的就业协议、签订成功的就业协议、个人基本信…

mac docker桌面版k8s启动成功却无法访问

1. 问题复现 在mac使用docker桌面版搭建k8s 成功 但是 kubectl 控制k8s集群命令却无法使用 报错信息如下 使用登录的用户访问 ~ kubectl version W0607 14:32:39.410809 54201 loader.go:221] Config not found: /etc/kubernetes/a…