Difference between revisions of "PWM"

From FriendlyELEC WiKi
Jump to: navigation, search
(updated by API)
Line 1: Line 1:
[[PWM/zh|查看中文]]<br>
+
[[PWM/zh|查看中文]]
TODO
+
===H3上配置SYS_PWM===
 +
====先确定内核已经打了这个补丁====
 +
<syntaxhighlight lang="bash">
 +
https://github.com/torvalds/linux/commit/179a79fd740b6b2f66b64bae5cb6ecd483987d20
 +
</syntaxhighlight>
 +
注: FriendlyELEC的内核源代码分支 https://github.com/friendlyarm/linux/tree/sunxi-4.14.y 已包含此提交。
 +
====修改内核dts配置, 启用SYS_PWM (在NanoPi NEO上, 引脚与POWER LED复用)====
 +
参考以下补丁, 配置POWER LED对应的引脚为PWM功能,然后编译并测试:
 +
<syntaxhighlight lang="bash">
 +
diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts b/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 +
index b9826c150c0a..ca62502ad9a3 100644
 +
--- a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 +
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 +
@@ -45,6 +45,10 @@
 +
/ {
 +
        model = "FriendlyElec NanoPi-NEO";
 +
        compatible = "friendlyelec,nanopi-neo", "allwinner,sun8i-h3";
 +
+
 +
+      aliases {
 +
+              pwm1 = &r_pwm;
 +
+      };
 +
};
 +
 +
&emac {
 +
@@ -52,4 +56,14 @@
 +
        phy-mode = "mii";
 +
        allwinner,leds-active-low;
 +
        status = "okay";
 +
-};
 +
\ No newline at end of file
 +
+};
 +
+
 +
+&gpio_leds {
 +
+      pinctrl-0 = <&leds_npi>;
 +
+
 +
+      /delete-node/ pwr;
 +
+};
 +
+
 +
+&r_pwm {
 +
+      status = "okay";
 +
+};
 +
diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
 +
index 5eeb41744735..1802f8ca2c56 100644
 +
--- a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
 +
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
 +
@@ -89,7 +89,7 @@
 +
                };
 +
        };
 +
       
 +
-      leds {
 +
+      gpio_leds: leds {
 +
                compatible = "gpio-leds";
 +
                pinctrl-names = "default";
 +
                pinctrl-0 = <&leds_npi>, <&leds_r_npi>;
 +
</syntaxhighlight>
 +
====测试脚本====
 +
在NanoPi NEO上测试, 可看到POWER LED以淡出效果闪烁10次:
 +
<syntaxhighlight lang="bash">
 +
#!/bin/bash
 +
 
 +
sys_pwm=/sys/class/pwm/pwmchip0
 +
 
 +
[ -d $sys_pwm ] || exit 1
 +
 
 +
if [ ! -d $sys_pwm/pwm0 ]; then
 +
    echo 0 > $sys_pwm/export
 +
fi
 +
 
 +
echo 1000 > $sys_pwm/pwm0/period
 +
echo 1 > $sys_pwm/pwm0/enable
 +
 
 +
for n in $(seq 10); do
 +
    for d in $(seq 0 50 1000); do
 +
        echo $d > $sys_pwm/pwm0/duty_cycle
 +
        sleep .02
 +
    done
 +
    sleep 1
 +
done
 +
</syntaxhighlight>

Revision as of 03:50, 6 January 2022

查看中文

1 H3上配置SYS_PWM

1.1 先确定内核已经打了这个补丁

https://github.com/torvalds/linux/commit/179a79fd740b6b2f66b64bae5cb6ecd483987d20

注: FriendlyELEC的内核源代码分支 https://github.com/friendlyarm/linux/tree/sunxi-4.14.y 已包含此提交。

1.2 修改内核dts配置, 启用SYS_PWM (在NanoPi NEO上, 引脚与POWER LED复用)

参考以下补丁, 配置POWER LED对应的引脚为PWM功能,然后编译并测试:

diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts b/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
index b9826c150c0a..ca62502ad9a3 100644
--- a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
@@ -45,6 +45,10 @@
 / {
        model = "FriendlyElec NanoPi-NEO";
        compatible = "friendlyelec,nanopi-neo", "allwinner,sun8i-h3";
+
+       aliases {
+               pwm1 = &r_pwm;
+       };
 };
 
 &emac {
@@ -52,4 +56,14 @@
        phy-mode = "mii";
        allwinner,leds-active-low;
        status = "okay";
-};
\ No newline at end of file
+};
+
+&gpio_leds {
+       pinctrl-0 = <&leds_npi>;
+
+       /delete-node/ pwr;
+};
+
+&r_pwm {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
index 5eeb41744735..1802f8ca2c56 100644
--- a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
@@ -89,7 +89,7 @@
                };
        };
 
-       leds {
+       gpio_leds: leds {
                compatible = "gpio-leds";
                pinctrl-names = "default";
                pinctrl-0 = <&leds_npi>, <&leds_r_npi>;

1.3 测试脚本

在NanoPi NEO上测试, 可看到POWER LED以淡出效果闪烁10次:

#!/bin/bash
 
sys_pwm=/sys/class/pwm/pwmchip0
 
[ -d $sys_pwm ] || exit 1
 
if [ ! -d $sys_pwm/pwm0 ]; then
    echo 0 > $sys_pwm/export
fi
 
echo 1000 > $sys_pwm/pwm0/period
echo 1 > $sys_pwm/pwm0/enable
 
for n in $(seq 10); do
    for d in $(seq 0 50 1000); do
        echo $d > $sys_pwm/pwm0/duty_cycle
        sleep .02
    done
    sleep 1
done