RK3566调试PWM

修改文件

以开启PWM14_M1为例进行说明。

在rk3568.dtsi文件中配置时钟及管脚:

	pwm14: pwm@fe700020 {
		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";
	};

在rk3566-rk817-tablet.dts文件中使能pwm14:

&pwm14 {
	status = "okay";
};

有尝试在&pwm14下重新配置pinctrl-0,但是不能成功。

编译固件并烧写

重新编译内核生成boot.img,将boot.img烧写到设备,设备启动后通过shell指令查询pwm相关信息。

查看pwm debug:

[root@RK356X:/]# cat /sys/kernel/debug/pwm 
platform/fe700020.pwm, 1 PWM device
 pwm-0   ((null)              ): period: 0 ns duty: 0 ns polarity: inverse

platform/fe6f0010.pwm, 1 PWM device
 pwm-0   (backlight           ): requested enabled period: 25000 ns duty: 20125 ns polarity: inverse

platform/fe6e0000.pwm, 1 PWM device
 pwm-0   ((null)              ): period: 0 ns duty: 0 ns polarity: inverse

可以看出总共有三个pwm,第二个作为backlight,并且配置了周期和占空比;

查看pwm节点:

[root@RK356X:/]# cd /sys/class/pwm/
[root@RK356X:/sys/class/pwm]# ls
pwmchip0  pwmchip1  pwmchip2
[root@RK356X:/sys/class/pwm]# cd pwmchip2
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2]# 

可以看到有三个pwm,编号从0开始,pwm0对应所有使能的pwm通道中编号最小的一个,也可以通过外设地址来确认,如pwm14的外设地址为fe700020 ;

设置 pwm0 输出频率 100K,占空比 50%, 极性为正极性:

enable:写入 1 使能 pwm,写入 0 关闭 pwm;
polarity:有 normal 或 inversed 两个参数选择,表示输出引脚电平翻转;
duty_cycle:在 normal 模式下,表示一个周期内高电平持续的时间(单位:纳秒),在 reversed 模
式下,表示一个周期中低电平持续的时间(单位:纳秒);
period:表示 pwm 波的周期(单位:纳秒);

[root@RK356X:/]# cd /sys/class/pwm/
[root@RK356X:/sys/class/pwm]# ls
pwmchip0  pwmchip1  pwmchip2
[root@RK356X:/sys/class/pwm]# cd pwmchip2
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2]# echo 0 > export 
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2]# cd pwm0/
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2/pwm0]# echo 10000 >
 period
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2/pwm0]# echo 5000 > 
duty_cycle
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2/pwm0]# echo normal 
> polarity
[root@RK356X:/sys/devices/platform/fe700020.pwm/pwm/pwmchip2/pwm0]# echo 1 > ena
ble

如硬件上没有产生PWM波,则需要查看下DTS文件中此管脚是否配置了其它功能。

<think>好的,用户现在想调试RK3588的PWM输出波形。首先,我需要回忆之前提供的配置指南中的相关内容,并结合用户现在提供的引用资料来综合回答。 用户之前的问题是关于如何输出PWM波,现在他转向调试波形的问题。根据引用内容,特别是引用[2]中提到RK3588的PWM有16路,支持捕获、连续和单次触发模式。调试波形可能需要用到捕获模式来检测输出是否正确。 接下来,用户提到的引用[1]中提到了pwms参数的配置,比如周期和极性,这可能在调试时需要注意是否正确设置。引用[4]中的设备树示例显示如何配置PWM的极性,如果极性设置错误,波形可能相反,导致调试时出现问题。 用户可能遇到的常见问题包括无输出、波形频率或占空比不正确、极性错误等。我需要分步骤说明调试方法,包括硬件检查、软件配置、使用工具等。 硬件方面,需要确认引脚复用是否正确,电压是否正常。软件方面,检查设备树的配置,特别是时钟和复用功能。用户空间调试可以通过sysfs接口快速验证,比如导出PWM通道并设置周期和占空比。此外,使用示波器或逻辑分析仪实际测量波形是必要的步骤。 引用[3]中提到compute_duty_cycle函数,这可能涉及到占空比的计算,调试时需要确认计算是否正确,是否应用到了PWM控制器。如果使用内核驱动,需要检查pwm_apply_state是否正确调用,参数是否正确。 另外,引用[2]提到寄存器地址和三种工作模式,调试寄存器可能需要查阅技术手册,确认寄存器的配置是否符合预期,比如模式选择是否正确。如果波形异常,可能需要检查时钟源是否使能,分频系数是否正确。 最后,用户可能需要了解如何通过日志和调试工具排查问题,比如dmesg查看驱动加载情况,检查是否有申请PWM失败的信息。如果用户使用示波器没有看到波形,可能是引脚复用未配置,或者PWM未使能,需要逐步排查。</think>### RK3588 PWM波形调试方法 根据Rockchip官方文档和实际开发经验[^1][^2][^3][^4],RK3588 PWM波形调试可通过以下步骤进行: #### 一、硬件准备 1. **物理连接验证** - 确认PWM输出引脚复用配置正确(使用$pinctrl$工具检查GPIO状态) - 使用万用表测量引脚电压:正常输出范围应为0-3.3V - 示波器/逻辑分析仪连接建议带宽≥50MHz #### 二、软件配置检查 1. **设备树关键参数验证** ```dts pwms = <&pwm1 0 25000 PWM_POLARITY_INVERTED>; //[参数1][参数2][参数3]对应索引/周期/极性[^4] ``` - 确认$clock-frequency$与预期频率匹配:$f = 1/(周期 \times 10^{-9})$[^1] - 检查极性配置是否与硬件设计匹配($PWM\_POLARITY\_NORMAL/INVERTED$) 2. **内核驱动状态查询** ```bash # 查看PWM设备注册情况 dmesg | grep pwm # 检查时钟树配置 cat /sys/kernel/debug/clk/clk_summary | grep pwm ``` #### 三、波形参数调试 1. **用户空间实时调节(调试推荐)** ```bash # 导出PWM通道(以PWM1通道0为例) echo 0 > /sys/class/pwm/pwmchip1/export # 设置周期与占空比(单位:ns) echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period # 20kHz echo 30000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable # 实时监控寄存器状态 devmem 0xfebd0000 32 # PWM1基地址[^2] ``` 2. **示波器测量要点** - **频率验证**:$f_{实际} = \frac{1}{(T_{high} + T_{low})}$ - **占空比验证**:$DutyCycle = \frac{T_{high}}{T_{high} + T_{low}} \times 100\%$ - **上升时间**:应≤10ns(典型值) #### 四、常见问题诊断 | 现象 | 可能原因 | 解决方法 | |------|----------|----------| | 无波形输出 | 1. GPIO复用未配置<br>2. 时钟未使能<br>3. 未执行enable操作 | 检查$pinctrl$配置<br>验证clk_pwmX时钟状态<br>确认/sys/class/pwm使能状态 | | 频率偏差 | 1. 输入时钟源错误<br>2. 分频系数计算错误 | 检查时钟树配置[^3]<br>重新计算$period = \frac{10^9}{f_{desired}}$ | | 占空比异常 | 1. duty_cycle > period<br>2. 极性配置错误 | 确保$duty\_cycle ≤ period$<br>切换PWM_POLARITY参数 | #### 五、高级调试手段 1. **寄存器级调试** ```bash # 查看PWM控制寄存器(以PWM1为例) devmem 0xfebd0000 # PWM_CTRL devmem 0xfebd0004 # PWM_PERIOD devmem 0xfebd0008 # PWM_DUTY ``` 关键位说明: - **CTRL_REG**:bit0(ENABLE), bit2(POLARITY), bit5:4(PRESCALE)[^2] 2. **触发模式验证** ```c // 配置单次触发模式(需驱动支持) state.output_type = PWM_OUTPUT_FIXED; pwm_apply_state(pwm, &state);[^3] ``` #### 六、调试案例 **问题现象**:配置40kHz PWM但实测仅10kHz **分析步骤**: 1. 检查设备树:`pwms = <&pwm1 0 25000 ...>`对应$T=25μs \Rightarrow f=40kHz$[^1] 2. 读取寄存器:`devmem 0xfebd0004`显示值为100000 3. **定位原因**:驱动中覆盖了设备树配置 4. **解决方案**:修复驱动中的period值覆盖逻辑 --相关工具推荐-- 1. **PWM信号发生器**:$sigrok$ + $PulseView$(开源方案) 2. **Rockchip调试工具**:rkdeveloptool, rkflashtool
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火柴棍mcu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值