RK平台PWM开发总结

晟盈英才 2026-02-05 85人围观

一、PWM基础原理与RK平台特性

(一)PWM核心原理

脉宽调制(PWMPulse Width Modulation)通过微处理器数字输出控制模拟电路,核心是调整输出波形的周期信号重复的时间间隔)和占空比(一个周期内高电平持续时间占比),实现对电压、亮度等物理量的精准调控,广泛应用于测量、通信、功率控制等领域。

(二)RK平台PWM关键特性

1.支持模式:共3种模式,不同模式用途差异显著

Continuous mode(连续模式):持续输出固定周期和占空比的波形,是最常用模式,主要用于背光控制、电机调速等场景

One-shot mode(单触发模式):仅输出一个完整波形后停止,适用于单次触发的控制场景(如单次脉冲信号触发)

Capture mode(捕获模式):用于捕获外部输入波形的高低电平宽度,典型应用是红外遥控解码(配合中断实现键值识别)

1.硬件配置:内置4通道,每个通道对应独立控制单元,支持多设备同时使用PWM功能

2.内核兼容性:覆盖Linux 3.104.4及以上(含4.19)内核版本,不同版本在驱动接口DTS配置上存在差异

二、RK平台PWM开发操作流程

(一)驱动相关配置

1.驱动文件路径与差异

统一路径:drivers/pwm/pwm-rockchip.c(所有内核版本通用)

wKgZO2kalr2AWbqsAAIO3PkO3mc787.png

内核版本差异:

Linux 3.10:使用原始接口(pwm_config()pwm_enable()pwm_disable()),仅支持Continuous mode

Linux 4.4及以上(含4.19:将参数配置与使能/禁用封装为pwm_apply_state()函数,支持一次修改多个参数(周期、占空比、极性),效率更高,同样仅支持Continuous mode

1.DTS节点配置:需根据内核版本调整参数数量,与“pwm-cells”值对应

backlight: backlight { compatible ="pwm-backlight"; pwms = <&pwm0 0250000>; brightness-levels = <01...255>;// 256级亮度,0~255对应0%~100%占空比 default-brightness-level = <200>;// 默认亮度(第200级) enable-gpios = <&gpio1 13GPIO_ACTIVE_HIGH>;// 背光使能引脚};

参数说明

参数1index(通道索引),默认0RK平台每个PWM芯片仅1个通道)

参数2:周期(单位:ns),如25000ns对应40KHz频率

参数3:极性(可选),PWM_POLARITY_INVERTED表示负极性,仅“pwm-cells=3”时需配置

版本差异示例

Linux 3.10pwm-cells=2):pwms = <&pwm 0 25000>;

Linux 4.4/4.19pwm-cells=3):pwms = <&pwm 0 25000 PWM_POLARITY_INVERTED>;

背光场景扩展配置:需添加亮度等级、默认亮度、使能引脚等参数,示例如下

(二)PWM工作流程(以Linux 4.4为例,Continuous mode

1.状态应用(Apply State:触发PWM参数配置流程,先判断是否需要加锁

需加锁:先执行Lock操作,避免配置过程中参数被篡改

无需加锁:直接进入参数配置

1.参数配置

必选:配置周期(Period)和占空比(Duty Cycle

可选:若支持极性配置(pwm-cells=3),设置极性(Normal/Inverted

1.锁操作:若之前加锁,配置完成后执行Unlock

2.使能/禁用控制

需使能(Enable PWM=yes):执行Enable操作,PWM开始输出波形

需禁用(Enable PWM=no):执行Disable操作,PWM停止输出

1.状态同步(Sync State:确保硬件状态与配置参数一致,完成流程

(三)用户空间使用(通过/sys/class/pwm接口)

1.导出PWM通道:进入/sys/class/pwm/pwmchip0/,执行echo 0 > export,生成pwm0目录(关闭通道执行echo 0 > unexport

2.配置参数:进入pwm0目录,通过文件写入配置

周期:echo 10000 > period10000ns=10μs,对应100KHz频率)

占空比:echo 5000 > duty_cycle5000ns,占空比50%

极性:echo normal > polaritynormal =正极性,inversed =负极性)

1.使能输出echo 1 > enable(禁用执行echo 0 > enable

三、RK平台PWM主要用途

(一)背光控制(最典型场景)

基于Continuous mode,通过调整PWM占空比控制背光亮度:

正极性:亮度等级0~255对应占空比0%~100%(等级越高越亮)

负极性:亮度等级与占空比反向(等级越高越暗)

应用:显示屏背光调节,如手机、平板、电视等设备

(二)红外遥控解码(基于Capture mode

1.原理PWM捕获红外接收头输出的高低电平宽度,触发中断后CPU读取寄存器值,根据NEC编码协议(RK平台仅支持NEC)解码用户码和键值码

2.操作流程

&remotectl { handle_cpu_id = <2>;// 中断处理CPU核心(4核0~3,双核0~1) ir_key1{ rockchip,usercode = <0x4040>; rockchip,key_table = <0xf4KEY_UP>, <0xf1KEY_DOWN>;// 键值与功能映射 };};

打开调试开关:

echo1 > sys/module/rockchip_pwm_remotectl/parameters/code_print

记录键值:按下遥控器按键,通过打印获取usercode(如0x4040)和键值(如0xe9

添加键值到DTS:在&remotectl {}节点中配置usercodekey_table,示例

(三)其他用途

电机调速:通过调整PWM占空比控制电机转速(如风扇、小功率电机)

电压调节(PWM Regulator):配合电源管理模块,输出不同占空比的PWM信号实现电压动态调整

四、常见问题与解决方案

(一)U-BootKernel衔接问题

1.问题现象U-Boot中使用PWM调压后,进入Kernel阶段PWM失效(如电压不足死机)

2.原因

Kernel未同步U-Boot阶段的PWM硬件状态(如clock count

两者时钟源频率、极性、周期配置不一致

1.解决方案

更新驱动文件:drivers/pwm/pwm-rockchip.c

统一配置:U-BootKernelGPLL时钟频率(PWM时钟挂在GPLL下)、极性、周期保持一致;U-Boot频率通过开机log查看,Kernel频率通过cat /sys/kernel/debug/clock/clock_tree | grep gpll查看

(二)PWM Regulator引脚上下拉配置问题

1.问题现象:系统重启(reboot)后,PWM Regulator默认电压变化

2.原因:重启时GRF寄存器不复位,但PWM控制器复位,引脚上下拉配置为“none”导致状态异常

3.解决方案

// dtsi中定义pwm2_pin_pull_down: pwm2-pin-pull-down { rockchip,pins = <119RK_FUNC_1 &pcfg_pull_down>;};// dts中覆盖&pwm2 { status ="okay"; pinctrl-names ="active"; pinctrl-0= <&pwm2_pin_pull_down>;};

确认硬件默认上下拉:通过原理图查看引脚标识(“d”=下拉,“u”=上拉,如RK3399 PWM2引脚GPIO1_C3/PWM2_d为默认下拉)

DTS配置引脚上下拉:在dtsi中定义pinctrldts中覆盖配置,示例

(三)PWM波形示波器无法检测

1.第一步:检查PWM是否工作(通过Counter Register寄存器)

寄存器值变化:PWM工作正常,问题在引脚

可能原因:iomux配置错误(引脚功能未切换为PWM)、io-domain配置错误、外部硬件干扰

解决方案:重新配置iomuxio-domain,排查硬件接线或干扰源

寄存器值无变化:PWM工作异常,问题在核心配置

可能原因:时钟未使能、PWM未使能、duty>period(占空比配置无效)、RK3368未配置GRF_SOC_CON15寄存器bit12=1

解决方案:使能时钟和PWM,修正dutyperiod关系,RK3368额外配置GRF寄存器

五、思维导图总结

wKgZO2kalr2AdsqLAAIfT8nNExI298.png  

不容错过
Powered By Z-BlogPHP