RK3566开发板PWM驱动实战从设备树配置到Shell调试全解析刚拿到RK3566开发板时面对密密麻麻的芯片手册和零散的社区资料配置一个简单的PWM外设可能会让不少开发者感到无从下手。本文将以PWM14_M1为例带你完整走通从设备树修改到命令行调试的全流程过程中会特别标注那些官方文档没写清楚但实际开发中一定会遇到的坑。1. 理解RK3566的PWM子系统架构RK3566的PWM控制器采用多通道设计每个PWM控制器可以支持多个通道。以PWM14为例它属于PWM3控制器组硬件地址从0xfe700020开始。与STM32等MCU不同Linux环境下配置PWM需要先理解几个关键概念设备树(DTS)描述硬件资源配置的静态定义文件PWM子系统Linux内核提供的统一接口层Sysfs接口用户空间控制PWM的调试入口注意RK3566的PWM通道编号与硬件地址的对应关系容易混淆建议先通过/sys/kernel/debug/pwm确认实际映射关系芯片手册中容易忽略的关键参数参数说明典型值示例CLK_PWM3PWM3控制器时钟源24MHzPCLK_PWM3PWM3外设总线时钟100MHzpinctrl-0管脚复用配置pwm14m1_pins2. 设备树配置实战2.1 定位正确的DTS文件RK3566开发板通常有两个关键设备树文件需要修改通用芯片定义rk3568.dtsi路径arch/arm64/boot/dts/rockchip/板级配置如rk3566-rk817-tablet.dts# 在kernel源码目录下快速查找 find arch/arm64/boot/dts/rockchip -name *rk3566*.dts2.2 修改PWM节点配置在rk3568.dtsi中找到PWM14的基础定义确保包含以下关键属性pwm14: pwmfe700020 { compatible rockchip,rk3568-pwm, rockchip,rk3328-pwm; reg 0x0 0xfe700020 0x0 0x10; #pwm-cells 3; pinctrl-names active; pinctrl-0 pwm14m1_pins; clocks cru CLK_PWM3, cru PCLK_PWM3; clock-names pwm, pclk; status disabled; };然后在板级DTS中启用该节点pwm14 { status okay; // 重要某些开发板需要显式指定pinctrl pinctrl-0 pwm14m1_pins; };常见坑点排查如果修改后不生效检查是否有其他DTS覆盖了你的配置使用fdtdump工具验证编译后的dtb是否包含你的修改fdtdump /boot/dtbs/$(uname -r)/rockchip/rk3566-your-board.dtb | grep pwm143. 内核编译与烧写技巧3.1 选择性编译内核模块为节省时间可以只重新编译设备树部分make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- dtbs -j$(nproc)3.2 烧写验证流程生成新的boot.imgmkimage -f kernel.its kernel.img通过Rockchip开发工具烧写rkdeveloptool write 0x200000 kernel.img提示开发阶段建议保留串口调试连接可实时查看内核启动日志4. Shell调试完整流程4.1 确认PWM设备注册# 查看已注册的PWM控制器 cat /sys/kernel/debug/pwm # 典型输出示例 platform/fe700020.pwm, 1 PWM device pwm-0 ((null)): period: 0 ns duty: 0 ns polarity: inverse4.2 配置PWM参数# 进入PWM控制目录 cd /sys/class/pwm/pwmchip2 # 导出PWM通道 echo 0 export # 配置参数 cd pwm0 echo 10000 period # 设置周期为10us (100kHz) echo 5000 duty_cycle # 占空比50% echo normal polarity # 正常极性 echo 1 enable # 启动输出调试技巧用示波器测量实际波形时如果无输出检查dmesg | grep pwm是否有错误日志确认GPIO复用配置正确cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep gpio35. 进阶自动化控制脚本创建/usr/local/bin/pwm_ctrl.sh#!/bin/bash PWM_CHIP${1:-2} PWM_CHAN${2:-0} PERIOD_NS${3:-10000} DUTY_NS${4:-5000} PWM_PATH/sys/class/pwm/pwmchip${PWM_CHIP}/pwm${PWM_CHAN} # 初始化PWM if [ ! -d $PWM_PATH ]; then echo $PWM_CHAN /sys/class/pwm/pwmchip${PWM_CHIP}/export sleep 0.1 fi # 配置参数 echo $PERIOD_NS $PWM_PATH/period echo $DUTY_NS $PWM_PATH/duty_cycle echo normal $PWM_PATH/polarity echo 1 $PWM_PATH/enable使用示例# 控制PWM14输出1kHz30%占空比 pwm_ctrl.sh 2 0 1000000 3000006. 硬件连接验证要点当软件配置正确但硬件无输出时按以下步骤排查电压测量确认PWM引脚电压在使能前后有变化默认GPIO电压应为3.3V示波器检测观察波形频率是否与配置一致检查占空比精度RK3566的PWM分辨率约为4.17ns替代方案测试尝试其他PWM通道排除硬件故障用LED串联电阻直接测试PWM频率建议设置在100Hz-1kHz区间在Firefly-RK3566开发板上PWM14_M1默认对应GPIO3_C6引脚位置在40针扩展口的第33脚。实际项目中遇到过一个典型案例某散热风扇需要先给使能信号才能响应PWM控制这种硬件特性往往不会体现在芯片手册中