关于 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 的亮度不同啦~
接口配置实现的参考,看完你也能学会!
本质参考这个
实例参考这个
- https://blog.csdn.net/weixin_43094346/article/details/84338119
- http://bbs.16rd.com/thread-567583-1-1.html
后记
在配置 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:/#
官方使用文档截图