zoukankan      html  css  js  c++  java
  • 关于 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:/# 
    

    官方使用文档截图

  • 相关阅读:
    融云使用
    cocoaPods使用
    电脑硬件
    拖图UI和纯代码UI
    7.2内存管理-ARC
    7内存管理-MRC
    数据刷新
    5.1音频播放
    2.6核心动画
    Git常用操作
  • 原文地址:https://www.cnblogs.com/juwan/p/14343977.html
Copyright © 2011-2022 走看看