This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM437x SDK v5.2x Linux平台,配置PWM

Other Parts Discussed in Thread: AM4372

Hi,
我们在AM437x Linux平台下调试PWM功能,
DTS中配置如下:
myecap2_pins_default: myecap2_pins_default {
pinctrl-single,pins = <
AM4372_IOPAD(0x188, PIN_OUTPUT | MUX_MODE3) /* (AB24) I2C0_SDA.eCAP2_in_PWM2_out */
>;
};

&epwmss2 {
status = "okay";
};

&ecap2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&myecap2_pins_default>;
};

系统启动后,SYSFS下看到PWM设备;
参考文档进行如下配置,但是用示波器没有抓到波形;
processors.wiki.ti.com/index.php
root@am437x-evm:~# echo 0 > /sys/class/pwm/pwmchip0/export
root@am437x-evm:~# echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
-sh: echo: write error: Invalid argument
root@am437x-evm:~# echo 1000000000 > /sys/class/pwm/pwmchip0/pwm0/period
root@am437x-evm:~# echo 50 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
root@am437x-evm:~# echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
root@am437x-evm:~#
请问是否还需要其他配置,或者硬件需要添加相关电路。

  • 设备树里配置pinmux用的是PWM2,在sysfs下也要改成pwmchip2。
  • 你好,
    pwmchip0是DTS配出后系统自动生成,
    我尝试将pwmchip0改写为pwmchip2并不成功,log如下:
    root@am437x-evm:~# cd /sys/class/pwm/
    root@am437x-evm:/sys/class/pwm# ls -l
    total 0
    lrwxrwxrwx 1 root root 0 Dec 16 03:32 pwmchip0 -> ../../devices/platform/44000000.ocp/48304000.epwmss/48304100.ecap/pwm/pwmchip0
    root@am437x-evm:/sys/class/pwm# cd ../../devices/platform/44000000.ocp/48304000.epwmss/48304100.ecap/pwm/
    root@am437x-evm:/sys/devices/platform/44000000.ocp/48304000.epwmss/48304100.ecap/pwm# cp -r pwmchip0/ pwmchip2
    cp: can't create directory 'pwmchip2': Operation not permitted
    root@am437x-evm:/sys/devices/platform/44000000.ocp/48304000.epwmss/48304100.ecap/pwm# mv pwmchip0/ pwmchip2
    mv: can't rename 'pwmchip0/': Operation not permitted
    root@am437x-evm:/sys/devices/platform/44000000.ocp/48304000.epwmss/48304100.ecap/pwm# mkdir pwmchip2
    mkdir: can't create directory 'pwmchip2': Operation not permitted
  • 节点改成下面的试试。
    &epwmss2 {
    status = "okay";
    ehrpwm2: pwm@48304200 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&myecap2_pins_default>;
    };
    };
  • 因为我用的是ecap模块,是否应该将节点改成如下配置:
    &epwmss2 {
    status = "okay";
    ecap2: ecap@48304100 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&myecap2_pins_default>;
    };
    };
    上述两种配置均试过,改变占空比,测量对应pin脚电压,电压无变化;
    而且系统生成的文件仍为pwmchip0
  • 有什么方法可以确认该pin确实配置成了PWM输出功能呢?
  • 查询手册知,pin AB24对应的control mode register offset为0x988,
    进入系统后,查询该寄存器值为pin 98 (PIN98) 44e10988 000e0000 pinctrl-single, mode value为0,配成了I2C0_SDA功能,并不是eCAP2_in_PWM2_out(mode:0x3),而我在设备树中并未配置I2C 0功能;
    是否因为该pin在uboot中配成了I2C0_SDA,因此在设备树种配置成PWM out功能无效?
  • 设备树是内核用的,由uboot加载。在uboot中配成了I2C0_SDA,内核会根据设备树的pinmux重新配置管脚功能。
  • 谢谢答复。
    但是为什么读取control mode register ,该管脚没有配置成eCAP2_in_PWM2_out(mode:0x3)呢,我重新确认了DTS配置,确实只有PWM用到了该管脚。
  • 我在uboot中修改44e10988 寄存器值为000e0003,启动系统后,按照手册修改PWM配置,能看到该管脚电压有明显的改变。
    现在的疑问点在于,为什么内核没有重新配置管脚为PWM功能。
    dmesg查询pinmux加载情况,发现错误挺多,其中有ecap模块不知为什么,
    root@am437x-evm:~# dmesg |grep pinmux
    [ 0.176106] omap_i2c 4802a000.i2c: could not find pctldev for node /ocp@44000000/l4_wkup@44c00000/scm@210000/pinmux@800/my_i2c_1_pins_default, deferring probe
    [ 0.176160] omap_i2c 4819c000.i2c: could not find pctldev for node /ocp@44000000/l4_wkup@44c00000/scm@210000/pinmux@800/my_i2c_2_pins_default, deferring probe
    [ 0.197382] pinctrl-single 44e10800.pinmux: 199 pins at pa f9e10800 size 796
    [ 0.198397] pinctrl-single 44e10800.pinmux: mux offset out of range: 0xfffff988 (0x31c)
    [ 0.198412] pinctrl-single 44e10800.pinmux: could not add functions for myecap2_pins_default 4294965640x
    [ 1.036705] pinctrl-single 44e10800.pinmux: mux offset out of range: 0xfffff950 (0x31c)
    [ 1.044918] pinctrl-single 44e10800.pinmux: could not add functions for my_spi_0_pins_default 4294965584x
    [ 1.065747] pinctrl-single 44e10800.pinmux: mux offset out of range: 0xfffff9b8 (0x31c)
    [ 1.073830] pinctrl-single 44e10800.pinmux: could not add functions for my_spi_2_pins_default 4294965688x
    [ 1.094483] pinctrl-single 44e10800.pinmux: mux offset out of range: 0xfffff8d0 (0x31c)
    [ 1.102560] pinctrl-single 44e10800.pinmux: could not add functions for my_spi_3_pins_default 4294965456x
    [ 1.123118] pinctrl-single 44e10800.pinmux: mux offset out of range: 0xfffffa50 (0x31c)
    [ 1.131186] pinctrl-single 44e10800.pinmux: could not add functions for my_spi_4_pins_default 4294965840x
  • 我已经找到原因,是因为DTS包含的文件am43xx.h中,计算register address时,会减去0x800,
    #define AM4372_IOPAD(pa, val) (((pa) & 0xffff) - 0x0800) (val)
    而在上述DTS配置中的AM4372_IOPAD(0x188, PIN_OUTPUT | MUX_MODE3) ,0x188已经是0x988减去0x800的结果,
    所以多减去了一次0x800,导致mux offset out of range,其他模块加载错误原因也是一样。
    该管脚配置是我用最新的PinMux Tool v4.0.1530配出来的,我在PinMux Tool没找到在哪里能设置address偏移的选项,

    请问我在PinMux Tool中该怎么配置才能不会多减去一次0x800呢?
    PS:
    SDK默认使用的DTS中register address是没有减去0x800的

  • 我已经找到原因,是因为DTS包含的文件am43xx.h中,计算register address时,会减去0x800,
    #define AM4372_IOPAD(pa, val) (((pa) & 0xffff) - 0x0800) (val)
    而在上述DTS配置中的AM4372_IOPAD(0x188, PIN_OUTPUT | MUX_MODE3) ,0x188已经是0x988减去0x800的结果,
    所以多减去了一次0x800,导致mux offset out of range,其他模块加载错误原因也是一样。
    该管脚配置是我用最新的PinMux Tool v4.0.1530配出来的,我在PinMux Tool没找到在哪里能设置address偏移的选项,请问我在PinMux Tool中该怎么配置才能不会多减去一次0x800呢?
    PS:
    SDK默认使用的DTS中register address是没有减去0x800的
  • 已经确认,此问题为pinmux tool引入的bug,参考如下链接:

    https://e2e.ti.com/support/processors/f/791/t/789270