Toradex Colibri IMX8X引脚63启用PWM失败求助
我需要在Toradex Colibri IMX8X的引脚63(对应PWM_H - ADMA.FTM.CH2)上启用PWM功能,为此修改了imx8qxp-ss-adma.dtsi、imx8x-colibri.dtsi、imx8x-colibri-eval-v3.dtsi三个设备树文件,修改可正常编译并部署至SOM,但该引脚始终无PWM信号输出。
已尝试操作
- 尝试不同pinmux选项(如
IMX8QXP_UART2_RX_ADMA_FTM_CH0)及配置值(0x61、0x60、0x62) - 尝试用
adma_pwm替代添加ftm_pwm0至imx8qxp-ss-adma.dtsi - 保留潜在冲突外设(lpuart2、flexcan1、backlight)启用状态,排除意外禁用导致的问题
系统报错与输出
启动时始终出现报错:fsl-ftm-pwm 5a8a0000.pwm: regmap init failed,表明PWM通道初始化异常。以下是SOM相关操作输出:
root@imx8-26:~# echo 255 > /sys/class/leds/col1_heater/brightness # 配置PWM占空比的操作 root@imx8-26:~# cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep -A5 -B5 "63" pin 63 (IMX8QXP_ESAI0_TX4_RX1): (MUX UNCLAIMED) (GPIO UNCLAIMED) root@imx8-26:~# dmesg | grep -i ftm [ 0.252602] fsl-ftm-pwm 5a8a0000.pwm: regmap init failed root@imx8-26:~# cat /sys/kernel/debug/pwm platform/5a8a0000.pwm, 8 PWM devices pwm-0 ((null) ): period: 0 ns duty: 0 ns polarity: normal pwm-1 ((null) ): period: 0 ns duty: 0 ns polarity: normal pwm-2 (col1_heater ): requested period: 1000000 ns duty: 0 ns polarity: normal pwm-3 ((null) ): period: 0 ns duty: 0 ns polarity: normal pwm-4 ((null) ): period: 0 ns duty: 0 ns polarity: normal pwm-5 ((null) ): period: 0 ns duty: 0 ns polarity: normal pwm-6 ((null) ): period: 0 ns duty: 0 ns polarity: normal pwm-7 ((null) ): period: 0 ns duty: 0 ns polarity: normal
相关设备树代码
imx8x-colibri.dtsi
&iomuxc { colibri-imx8qxp { pinctrl_ftm_pwm_0: ftmpwm0 { fsl,pins = < IMX8QXP_FLEXCAN1_RX_ADMA_FTM_CH2 0x60 /* SODIMM 63 */ >; }; }; };
imx8x-colibri-eval-v3.dtsi
/* Disable conflicting interfaces */ &lpuart2 { status = "disabled"; }; &flexcan1 { status = "disabled"; /delete-property/ pinctrl-names; /delete-property/ pinctrl-0; /delete-property/ xceiver-supply; }; &backlight { status = "disabled"; /delete-property/ pwms; }; &ftm_pwm0 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_ftm_pwm_0>; status = "okay"; }; / { leds { compatible = "pwm-leds"; col1_heater { label = "col1_heater"; pwms = <&ftm_pwm0 2 1000000 0>; /* Channel 2 for FTM_CH2 */ max-brightness = <255>; default-brightness-level = <0>; }; }; };
问题排查与解决方案
核心问题分析
regmap init failed报错说明FTM PWM驱动无法正确初始化寄存器映射,通常关联以下因素:
- ADMA子系统的时钟未正确启用
- 设备树中FTM节点的寄存器地址或属性配置错误
- 驱动依赖的硬件资源(如电源域)未正确初始化
具体修复步骤
1. 检查ADMA FTM时钟配置
在imx8qxp-ss-adma.dtsi中,确保ftm_pwm0节点的时钟配置正确:
ftm_pwm0: pwm@5a8a0000 { compatible = "fsl,imx8qxp-ftm-pwm"; reg = <0x5a8a0000 0x10000>; clocks = <&clk IMX8QXP_ADMA_FTM0_CLK>, <&clk IMX8QXP_ADMA_FTM0_CLK>; clock-names = "ftm", "ftm_en"; #pwm-cells = <3>; status = "disabled"; };
确认clocks和clock-names属性正确引用ADMA FTM的时钟源,且对应时钟在系统启动时已启用。
2. 修正Pinmux配置
根据Toradex Colibri IMX8X规格书,引脚63对应的Pinmux选项IMX8QXP_FLEXCAN1_RX_ADMA_FTM_CH2是正确的,但需调整配置值:
- 将原配置值
0x60改为0x61(启用高驱动强度,适配PWM信号输出需求) - 再次确认无其他外设占用该引脚
3. 确保ADMA子系统初始化正常
检查imx8qxp-ss-adma.dtsi中的ADMA子系统节点状态:
adma_subsys: bus@5a000000 { compatible = "fsl,imx8qxp-adma-subsys"; reg = <0x5a000000 0x1000000>; clocks = <&clk IMX8QXP_ADMA_ROOT_CLK>; clock-names = "bus"; #address-cells = <1>; #size-cells = <1>; ranges = <0 0x5a000000 0x1000000>; status = "okay"; };
保证该节点status为okay,确保ADMA总线和时钟正常工作。
4. 验证PWM节点兼容性
确认ftm_pwm0节点的compatible属性为"fsl,imx8qxp-ftm-pwm",而非通用的"fsl,ftm-pwm",避免驱动匹配错误。
验证操作
修改完成后重新编译设备树并部署,执行以下步骤验证:
- 查看
dmesg输出,确认无regmap init failed报错 - 执行
cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep -A5 -B5 "63",确认引脚已被FTM PWM占用 - 配置PWM后用示波器测量引脚输出,或通过
cat /sys/kernel/debug/pwm确认pwm-2的duty值是否更新
内容的提问来源于stack exchange,提问作者Allen McDermott

