关于 V831 linux sysfs 调用 pwm 的通用操作(更新到 Python 接口)。

该操作为 linux 用户空间通用操作,在 V831 tina 上也同理。

更新到 Python 接口,看这个 https://github.com/scottellis/pwmpy

检查设备树与原理图的配置

一般 PWM 不需要特别去配置,拿原厂的定义对一遍 /linux-4.9/arch/arm/boot/dts/sun8iw19p1-pinctrl.dtsi,来看一下 pwm6 的情况。


  pwm6_pins_a: pwm6@0 {
    allwinner,pins = "PD7";
    allwinner,pname = "pwm6_positive";
    allwinner,function = "pwm6";
    allwinner,muxsel = <3>;
    allwinner,drive = <1>;
    allwinner,pull = <0>;
  };

  pwm6_pins_b: pwm6@1 {
    allwinner,pins = "PD7";
    allwinner,function = "io_disabled";
    allwinner,muxsel = <7>;
    allwinner,drive = <1>;
    allwinner,pull = <0>;
  };

可以发现它(pwm6_pins_a 和 pwm6_pins_b)被链接到 /linux-4.9/arch/arm/boot/dts/sun8iw19p1.dtsi 的配置


  pwm6: pwm6@0300a000 {
    compatible = "allwinner,sunxi-pwm6";
    pinctrl-names = "active", "sleep";
    reg_base = <0x0300a000>;
    pinctrl-0 = <&pwm6_pins_a>;
    pinctrl-1 = <&pwm6_pins_b>;
    status = "okay";
  };

然而与 M2DOCK 的原理图上 pwm6 (PH6) 是不匹配的。

可以看到它默认定义到 PD7 引脚去了,所以这时候要改到 PH6 去,所以在 device/config/chips/v831/configs/sipeed/m2dock-board.dts 重新配置 pwm0_pins_a 和 pwm0_pins_b 的引脚,从而让 pwm6: pwm6@0300a000 结点重新链接到新的 IO 上。


  pwm6_pins_a: pwm6@0 {
    allwinner,pins = "PH6";
    allwinner,pname = "pwm6_positive";
    allwinner,function = "pwm6";
    allwinner,muxsel = <2>;
    allwinner,drive = <1>;
    allwinner,pull = <0>;
  };

  pwm6_pins_b: pwm6@1 {
    allwinner,pins = "PH6";
    allwinner,function = "io_disabled";
    allwinner,muxsel = <7>;
    allwinner,drive = <1>;
    allwinner,pull = <0>;
  };

现在我们在硬件上的测试已经准备就绪,开始软件调试吧。

使用 sysfs 将操作统一到 io 接口。

用 PWM 举例来说,如果我要用 pwm6 ,然后


echo 6 > /sys/class/pwm/pwmchip0/export && echo 100000 > /sys/class/pwm/pwmchip0/pwm6/period && echo 20000 > /sys/class/pwm/pwmchip0/pwm6/duty_cycle && echo 1 > /sys/class/pwm/pwmchip0/pwm6/enable

echo 100000 > /sys/class/pwm/pwmchip0/pwm6/duty_cycle

上文描述的 duty_cycle 的值限制在 0 ~ period 的范围内,其中 period 是周期,单位是 ns 。

(还未硬件量测具体数据,晚上再说)如果要设置为某频率,比如频率想改成 200Hz, 1/200Hz=0.005s=5000000ns 这里就要改成 5000000

可以看到两个相同 LED 的亮度不同啦~

接口配置实现的参考,看完你也能学会!

本质参考这个

实例参考这个

后记

在配置 pwm 的时候,需要注意的地方就是 pwm[0:3] 已经被我配置成 spi 了,想要使用这附近的 pwm 要更新设备树的配置,你在使用的时候它会提示你的。

root@sipeed:/# echo 0 > /sys/class/pwm/pwmchip0/export && echo 100000 > /sys/cla
ss/pwm/pwmchip0/pwm0/period && echo 20000 > /sys/class/pwm/pwmchip0/pwm0/duty_cy
cle && echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
[ 4948.962630] sun8iw19p1-pinctrl pio: pin PH0 already requested by spi1; cannot claim for soc@03000000:pwm0@0300a000
[ 4948.974434] sun8iw19p1-pinctrl pio: pin-224 (soc@03000000:pwm0@0300a000) status -22
[ 4948.983108] sun8iw19p1-pinctrl pio: could not request pin 224 (PH0) from group PH0  on device pio
[ 4948.993135] platform soc@03000000:pwm0@0300a000: Error applying setting, reverse things back
[ 4949.002640] platform soc@03000000:pwm0@0300a000: pinctrl_select_state(active) failed!
root@sipeed:/# 

官方使用文档截图

posted @ 2021-01-29 12:07  Juwan  阅读(1281)  评论(0编辑  收藏  举报