基于tiny4412的Linux内核移植 -- PWM子系统学习(七)
作者信息
作者: 彭东林
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子系统学习(七)的更多相关文章
- 基于tiny4412的Linux内核移植 -- PWM子系统学习(八)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开【转】
转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植(支持device tree)(三)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植(支持device tree)(一)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 --- aliases节点解析
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 --- aliases节点解析【转】
转自:https://www.cnblogs.com/pengdonglin137/p/5252348.html 阅读目录(Content) 作者信息 平台简介 正文 回到顶部(go to top) ...
随机推荐
- mongodb实现批量修改数据
var rds = db.REGIPATIENTREC.find({mzh:{$lt:"0"},usrOrg:"石景山中西医结合医院"}); var show ...
- linux命令(41):watch命令
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...
- POJ 1177 Picture(线段树:扫描线求轮廓周长)
题目链接:http://poj.org/problem?id=1177 题目大意:若干个矩形,求这些矩形重叠形成的图形的轮廓周长. 解题思路:这里引用一下大牛的思路:kuangbin 总体思路: 1. ...
- LeetCode解题报告—— Jump Game & Merge Intervals & Permutation Sequence
1. Jump Game Given an array of non-negative integers, you are initially positioned at the first inde ...
- OpenCL与CUDA,CPU与GPU
OpenCL OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计 ...
- [水煮 ASP.NET Web API2 方法论](12-2)管理 OData 路由
问题 如何控制 OData 路由 解决方案 为了注册路由,可以使用 HttpConfigurationExtension 类中 MapODataServiceRoute 的扩展方法.对于单一路由这样 ...
- Openstack 云主机深入了解 (十六)
一)云主机深入了解 1.云主机在计算节点以进程方式运行 2.监听vnc的端口,vnc默认端口从5900开始, 多台云主机,端口递增 3.云主机桥接网卡,与宿主机联通网络 提示:在openstack环境 ...
- 【剑指offer】面试题 55. 二叉树的深度
面试题 55. 二叉树的深度 题目一:二叉树的深度 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. Java 实现 ...
- cocos2djs ctor init onEnter的区别
cocos2d-html5 onEnter init ctor构造函数 ---js特有特性(和c++有点不一样 ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认c ...
- 将excel中的sheet1导入到sqlserver中
原文地址:C#将Excel数据表导入SQL数据库的两种方法作者:windream 方式一: 实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环来拼接sql,这样做不但 ...