• 基于tiny4412的Linux内核移植 -- PWM子系统学习(七)


    作者信息

    作者: 彭东林

    邮箱:pengdonglin137@163.com

    QQ:405728433

    平台简介

    开发板:tiny4412ADK + S700 + 4GB Flash

    要移植的内核版本:Linux-4.4.0 (支持device tree)

    u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动)

    busybox版本:busybox 1.25

    交叉编译工具链: arm-none-linux-gnueabi-gcc

          (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29))

    概述

         Exynos4412一共可以输出4路PWM(timer0、timer1、timer2、timer3产生的PWM有对应的输出引脚,timer4没有对应的引脚),但是在tiny4412上只有两路PWM引出供片外外设使用,分别来自timer0和timer1,其中timer0输出的PWM0用于控制底板上的有源蜂鸣器(TMB12A05),timer1产生的PWM1用于控制LCD的背光亮度。

    核心板:

    image

    底板(有源蜂鸣器):

    image 

    底板(LCD背光):

    image

    下面我们以用PWM控制蜂鸣器为例学习一下PWM子系统和backlight子系统。

    实验一、用PWM控制板子上的蜂鸣器

    对应的驱动文件:drivers/pwm/pwm-samsung.c

    修改设备树文件 arch/arm/boot/dts/exynos4412-tiny4412.dts

       1: diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b/arch/arm/boot/dts/exynos4412-tiny4412.dts
       2: index 585cab7..0425200 100644
       3: --- a/arch/arm/boot/dts/exynos4412-tiny4412.dts
       4: +++ b/arch/arm/boot/dts/exynos4412-tiny4412.dts
       5: @@ -123,6 +123,13 @@
       6:      cap-mmc-highspeed;
       7:  };
       8:  
       9: +&pwm {
      10: +    pinctrl-0 = <&pwm0_out &pwm1_out>;
      11: +    pinctrl-names = "default";
      12: +    samsung,pwm-outputs = <0>, <1>;
      13: +    status = "okay";
      14: +};
      15: +
      16:  &serial_0 {
      17:      status = "okay";
      18:  };

    其中 pinctrl-0后的参数是为了设置用到的gpio的复用功能,pwm0_out是在arch/arm/boot/dts/exynos4x12-pinctrl.dtsi中定义的:

       1: pwm0_out: pwm0-out {
       2:     samsung,pins = "gpd0-0";
       3:     samsung,pin-function = <2>;
       4:     samsung,pin-pud = <0>;
       5:     samsung,pin-drv = <0>;
       6: };

    意思是将gpiod0_0引脚设置的功能复用设置为2,2是什么意思呢?对于Samsung来说:

    image

    这里的2表示设置为TOUT_0,即PWM0的脉冲输出引脚。同理可以理解pwm1_out的意思。

    samsung,pwm_outs后的参数表示只有PWM0和PWM1两路可以供板级外设使用,解析过程可以参考驱动程序。

    其中pwm是在 arch/arm/boot/dts/exynos4.dtsi

       1: pwm: pwm@139D0000 {
       2:     compatible = "samsung,exynos4210-pwm";
       3:     reg = <0x139D0000 0x1000>;
       4:     interrupts = <0 37 0>, <0 38 0>, <0 39 0>, <0 40 0>, <0 41 0>;
       5:     clocks = <&clock CLK_PWM>;
       6:     clock-names = "timers";
       7:     #pwm-cells = <3>;
       8:     status = "disabled";
       9: };

    测试

    重新编译设备树:

    make dtbs

    用新的设备树镜像启动内核

    [root@tiny4412 ]# cd /sys/class/pwm/
    [root@tiny4412 pwm]# ls
    pwmchip0
    [root@tiny4412 pwm]# cd pwmchip0/
    [root@tiny4412 pwmchip0]# ls
    device     export     npwm       power      subsystem  uevent     unexport

    在/sys/class/pwm中有注册的pwmchip0,PWM0-3都对应这个pwmchip0,是调用pwmchip_add函数创建的。

    [root@tiny4412 pwmchip0]# ls
    device     export     npwm       power      subsystem  uevent     unexport
    [root@tiny4412 pwmchip0]# cat npwm 
    5
    [root@tiny4412 pwmchip0]# echo 0 > export 
    [root@tiny4412 pwmchip0]# ls
    device     npwm       pwm0       uevent
    export     power      subsystem  unexport
    [root@tiny4412 pwmchip0]# cd pwm0/
    [root@tiny4412 pwm0]# ls
    duty_cycle  enable      period      polarity    power       uevent

    npwm的意思是Exynos4412支持的pwm通道个数(在驱动里将这个值设置为了5,即将timer4也包含在内了)。蜂鸣器对应的的PWM0,所以我们向export中写入0,然后就会在当前目录下产生了一个名为pwm0的新目录,其中是设置PWM0参数的配置文件。

    在pwm0目录下:

    polarity:接受normal或inversed两个参数,表示TOUT_0电平翻转;在exynos4412的用户手册的第24节:

    image 

    period:表示pwm波的周期(单位:纳秒);

    duty_cycle:在normal模式下,表示一个周期内高电平持续的时间(单位:纳秒),所以duty_cycle <= period;在reversed模式下,表示一个周期中低电平持续的时间(单位:纳秒);

    enable:向其中写入1表示启动pwm,写入0,表示关闭pwm;

    更多详情请参考内核文档:Documentation/pwm.txt

    下面分享一个判断tiny4412底板上的蜂鸣器是有源的还是无源的方法:

    首先先关闭pwm,即向enable中写入0;然后向polarity中写入inversed,如果蜂鸣器开始响,那么就是有源蜂鸣器,否则就是无源蜂鸣器。原理是:关闭了pwm后,在normal下,TOUT_0输出低电平,在inversed模式下,TOUT_0输出高电平。(从tiny4412的原理图中看到,pwm输出高电平时,三极管导通,蜂鸣器开始响,有源蜂鸣器的特点是,只要给它一个高电平,就响,而无源的特点是,必须给脉冲才响)

    下面实现一个频率为1Hz, 占空比为1:9的例子:

    [root@tiny4412 ]# cd /sys/class/pwm/pwmchip0/
    [root@tiny4412 pwmchip0]# ls
    device     export     npwm       power      subsystem  uevent     unexport
    [root@tiny4412 pwmchip0]# echo 0 > export 
    [root@tiny4412 pwmchip0]# ls
    device     npwm       pwm0       uevent
    export     power      subsystem  unexport
    [root@tiny4412 pwmchip0]# cd pwm0/
    [root@tiny4412 pwm0]# ls
    duty_cycle  enable      period      polarity    power       uevent
    [root@tiny4412 pwm0]# echo normal > polarity 
    [root@tiny4412 pwm0]# echo 1000000000 > period 
    [root@tiny4412 pwm0]# echo 100000000 > duty_cycle 
    [root@tiny4412 pwm0]# echo 1  > enable 
    [root@tiny4412 pwm0]#

    这里:1秒 = 1 000 000 000 纳秒

    向unexport中写入0,pwm0目录会被自动删除。

    [root@tiny4412 pwmchip0]# ls
    device     npwm       pwm0       uevent
    export     power      subsystem  unexport
    [root@tiny4412 pwmchip0]# echo 0 > unexport 
    [root@tiny4412 pwmchip0]# ls
    device     export     npwm       power      subsystem  uevent     unexport

    未完待续。

  • 相关阅读:
    动态规划(DP计数):HDU 5117 Fluorescent
    动态规划(DP计数):HDU 5116 Everlasting L
    动态规划(区间DP):HDU 5115 Dire Wolf
    数学(扩展欧几里得算法):HDU 5114 Collision
    二叉树面试题
    linux eval命令
    关于Shell中命令替换$(...)与后置引用`...`的不同
    linux set,env和export
    linux crontab 命令
    排序
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/5171275.html
Copyright © 2020-2023  润新知