作者信息

作者: 彭东林

邮箱: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的背光亮度。

核心板:

底板(有源蜂鸣器):

底板(LCD背光):

下面我们以用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来说:

这里的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节:

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

未完待续。

基于tiny4412的Linux内核移植 -- PWM子系统学习(七)的更多相关文章

  1. 基于tiny4412的Linux内核移植 -- PWM子系统学习(八)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  2. 基于tiny4412的Linux内核移植 -- 设备树的展开

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  3. 基于tiny4412的Linux内核移植 -- 设备树的展开【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...

  4. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  5. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  6. 基于tiny4412的Linux内核移植(支持device tree)(三)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  7. 基于tiny4412的Linux内核移植(支持device tree)(一)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  8. 基于tiny4412的Linux内核移植 --- aliases节点解析

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  9. 基于tiny4412的Linux内核移植 --- aliases节点解析【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5252348.html 阅读目录(Content) 作者信息 平台简介 正文 回到顶部(go to top) ...

随机推荐

  1. 访问dubbo没有权限,通过ip进行跳转服务器,并通过有权限服务器代理访问

    #启动ip跳转 echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward =1 sysctl ...

  2. springboot在不同环境下进行不同的配置

    原文链接:http://www.cnblogs.com/java-zhao/p/5469183.html 不同的环境设置一个配置文件,例如:dev(开发)环境下的配置设置在application-de ...

  3. CentOS 7下安装php-redis扩展及简单使用

    前言: 在本篇文章中,我将给大家介绍如何在CentOS7上安装PHP-Redis扩展以及一些简单的实用,关于如何在Centos上安装redis的,可以参考 Redis在CentOS 7上的安装部署   ...

  4. IE7下面iframe滚动条无法用鼠标轮滚 其他浏览器可以

    1.让 IFRAME 隐藏滚动条,通常的做法就是在嵌入  IFRAME 的页面的 CSS 中指定以下规则:   html, body {overflow: hidden}   2.如果只是想隐藏横向滚 ...

  5. django的事务

    在某些时候,你可能会在视图修改两张数据表.并且想让他们同时成功或者同时失败.这就是事务的原子性(atomicity).在django中应该怎么做呢? 详细可以参考官方文档:https://yiyibo ...

  6. 【转载】Python测试框架doctest

    原文在这里 :Python测试框架doctest 先记录一下,直接复制粘贴后,排版是乱的,后续再弄.

  7. Centos6.9下安装OpenOffice 4.1.4

    # 对一下时间,时间不准,解压不了yum install -y ntp unzipntpdate -u 202.112.10.36yum install libXext.x86_64 -yyum gr ...

  8. django使用MySQL时部分配置

    若是Django中使用MySQL,需要在项目名文件目录下(而不是应用文件)的__init__.py文件中添加: import pymysqlpymysql.install_as_MySQLdb()

  9. CF1025B Weakened Common Divisor【数论/GCD/思维】

    #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...

  10. 字符串匹配&Rabin-Karp算法讲解

    问题描述: Rabin-Karp的预处理时间是O(m),匹配时间O( ( n - m + 1 ) m )既然与朴素算法的匹配时间一样,而且还多了一些预处理时间,那为什么我们还要学习这个算法呢?虽然Ra ...