Linux驱动系列-PWM驱动

2023-11-10

转自:嵌入式系统研发

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux驱动系列-PWM驱动 的相关文章

  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp

随机推荐

  • 【华为OD机试】寻找相同子串(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 若依系统(Ruoyi-Vue)去除redis数据库

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目的 一 去除redis 配置 二 去除ruoyi framework下RedisConfig的配置 三 在ruoyi common的core redis下新建My
  • 领域驱动设计-Domain-Driven-Design概念

    2021了 你应该要了解DDD了 不然领导和你吹牛你都听不懂 或者你都没法和别人吹牛了 一 Evans DDD 是什么 1 1 背景 2002年 敏捷宣言诞生 时代处于 CS 到 BS 的转换时期 2003年 Eric Evans 发表 l
  • angular?!小白修仙之路……

    一 简介 Angular是一个功能非常完备的前端框架 最早由 Misko Hevery 等人创建 2009 年被Google 公式收购 用于其多款产品 Angular基于TypeScript 通过增强HTML的方式提供一种便捷开发Web应用
  • 【100%通过率 】【华为OD机试 c++ 】不含 101 的数【2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 小明在学习二进制时 发现了一类不含 101的数 也就是 将数字用二进制表示 不能出现 101 现在给定一个整数区间 l r 请问这个区间包含了多
  • 【python 多线程存数据lock(锁)】

    多线程存数据不会数据丢失 案例一 这里只是简单的线程池 import os from concurrent futures import ThreadPoolExecutor from time import perf counter im
  • PTA-计算工资

    计算工资 某公司员工的工资计算方法如下 一周内工作时间不超过40小时 按正常工作时间计酬 超出40小时的工作时间部分 按正常工作时间报酬的1 5倍计酬 员工按进公司时间分为新职工和老职工 进公司不少于5年的员工为老职工 5年以下的为新职工
  • TypeScript 之类型判断

    在使用 Angular 做项目的时候 对 TypeScript 的类型判断不太熟练 为了方便查找 特意对 TypeScript 的类型判断做了简单梳理 文章只是 TS 官网的内容摘要 没有高深的知识 想要深入学习 TS 还要看官网文档 基础
  • 18M 超轻量系统开源

    图像识别作为深度学习算法的主流实践应用方向 早已在生活的各个领域发挥作用 如安全检查和身份核验时的人脸识别 无人货架和智能零售柜中的商品识别 这些任务背后的关键技术都在于此 图1 PP ShiTu应用于商品识别效果示意 开发者应用展示 然而
  • JMeter压测原则之独立部署监控

    无论是用哪种压测工具 我们都会比较关心压测工具所在机器的的系统资源占用情况 毕竟很多人压着压着 压力机出现性能瓶颈了还不知道 并且还错误的评估成是被测系统的性能问题 很多初学者好像都犯过这种尴尬的错误 文章分成三个部分说明 为什么说Perf
  • a &a &a[0]之间的区别和联系

    数组中 a为数组的首地址 a 0 为数组第一个元素的地址 所以 a a 0 但是 a又是什么东西呢 我们来做下面的代码测试 include
  • Binary operator ‘==‘ cannot be applied to operands of type ‘Int‘ and ‘[Int]‘

    等号两边数据类型不一致进行比较报错 Binary operator cannot be applied to operands of type Int and Int 这个提示也挺明确 二元运算符 两边不能使用 Int 和 Int 写代码时
  • c++ socket、 listen、accept、recv 、send、 connect函数记录

    文章目录 socket bind 和connect 函数 listen 和accept 函数 send recv read 和write 函数 TCP客户端 Tcp服务端 socket int socket int domain int t
  • 如何进行代码审查?

    如何review开发人员的代码 前置的一些概念 review级别 参与人身份和方式不同划分 相关开发自己看代码 非正式会议 开发人员组内 相关开发 直接上级 相关开发 直接上级 总监 1 团队review制度 团队内根据实际情况规定流程 在
  • 与机器学习相关的数学家,你认识几个?

    机器学习 需要一定的数学基础 也需要一定的代码能力 我们发布了一篇 机器学习的数学基础 里面有很多数学公式是数学家的名字命名的 然而 好多人不知道那些数学家长什么样子 于是 我们搜集了十位数学家的资料 排名不分先后 看看大家能从图片中叫出几
  • Vue_test

    文章目录 vue test笔记 1 脚手架文件结构 2 关于不同版本的Vue 3 vue config js配置文件 4 ref属性 5 配置项props 6 mixin 混入 7 插件 8 scoped样式 9 总结TodoList案例
  • Neo4js安装报错:未能加载指定的模块“\Neo4j-Management.psd1”

    情形如下 解决方法 更改bin neo4j ps1文件里Import Module PSScriptRoot Neo4j Management psd1 为绝对路径
  • Mybatis-generator代码自动生成(包含swagger注解,bean中文注释,service接口,serviceImpl实现类)

    Mybatis generator代码自动生成 包含swagger注解 bean中文注释 service接口 serviceImpl实现类 Dao接口是继承tkmybatis 简介 项目地址 代码生成步骤 代码生成图示 简介 由于平时老是需
  • 公众号上传临时素材获取media_id

    公众号上传临时素材获取media id java语言 更新于2018 01 15 public class Util private static final String UPLOAD URL https api weixin qq co
  • Linux驱动系列-PWM驱动

    转自 嵌入式系统研发 1 概述 本文主要讲述了Linux的PWM驱动框架 实现方法 驱动添加方法和调试方法 示例Linux内核版本 6 2 8 2 原理 PWM是Pulse Width Modulation的简称 中文译作脉冲宽度调制 作为