目录
前言
一、PWM驱动介绍
二、设备树DTS节点配置
三、PWM使用
四、PWM backlight
五、FAQ
1、PWM 无法注册成功:
2、PWM 在 U-Boot 与 kernel 之间的衔接问题
3、PWM Regulator 时 PWM pin 脚上下拉配置问题
总结
前言
PWM即脉冲宽度调制,是英文“Pulse Width ModulaTIon”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM控制技术就是对脉冲的宽度进行调制的技术,即通过对一系列脉冲的宽度进行调制,来等效的获得所需要的波形(含形状和幅值)。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。本文主要介绍RK3568平台PWM使用方法。
一、PWM驱动介绍
驱动文件在SDK kernel目录下,驱动文件为drivers/pwm/pwm-rockchip.c 。3.10 和 4.4 及以上版本内核下驱动文件名字是同一个,pwm-rockchip.c 只支持 Continuous mode,但是里 面的代码有些差别。4.4 及以上内核版本将 pwm_config(),pwm_enable() 和 pwm_disable() 包装pwm_apply_state() 函数里面,这样做的好处是可以一次改变几个 PWM 参数,3.10 内核的 PWM 驱动还 是原来的接口。
驱动接口说明如下所示:
1、头文件包含,该头文件包含PWM模块具体的函数接口
#include <linux/pwm.h>
2、PWM设备资源申请
struct pwm_device *pwm_request(int pwm_id, const char *label);struct pwm_device * pwm1 = NULL;
pwm0 = pwm_request(1, “test-pwm”);
3、使用pwm_config 函数配置 PWM 的占空比
int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);pwm_config(pwm0, 500000, 1000000);
4、使用pwm_enable函数使能PWM函数
int pwm_enable(struct pwm_device *pwm);pwm_enable(pwm0);
5、使用pwm_free函数释放所申请的 PWM
void pwm_free(struct pwm_device *pwm);pwm_free(pwm0);
6、使用pwm_disable函数禁用 PWM
void pwm_disable(struct pwm_device *pwm);pwm_disable(pwm0);
二、设备树DTS节点配置
官方SDK对于RK3568各路PWM节点配置已经在基础设备树文件中已经详细定义,我们只需在我们的板级设备数配置文件中引用打开即可,如在板级配置文件中打开PWM7节点如下所示:
&pwm7 {status = "okay";
};
从调试过程来看,pwm容易被其他资源所占用,特别是背光等节点,本人使用的这块pwm就被backlight节点占用,需要在设备树文件关闭backlight节点,不然不能够使用该路PWM节点:
&backlight {status = "disabled";
};&backlight1 {status = "disabled";
};
除此之外,我们可以设置pwm的一些其他参数,此处参考背光节点节点参数设置:
bl: backlight {
pwms = <&pwm 0 25000 PWM_POLARITY_INVERTED>;
pwm-names = "backlight";
};
三、PWM使用
本文主要介绍在终端通过命令方式控制pwm波输出。控制指令如下所示:以下是 pwmchip0 的例子,设置 pwm0 输出频率 100K,占空比 50%, 极性为正极性:
cd /sys/class/pwm/pwmchip0/echo 0 > exportcd pwm0echo 10000 > periodecho 5000 > duty_cycleecho normal > polarityecho 1 > enable
四、PWM backlight
背光使用 PWM 的连续模式较为频繁,以下是 DTS 文件中背光很常见的背光配置节点:
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm0 0 25000 0>;
brightness-levels = <
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87
88 89 90 91 92 93 94 95
96 97 98 99 100 101 102 103
104 105 106 107 108 109 110 111
112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127
128 129 130 131 132 133 134 135
136 137 138 139 140 141 142 143
144 145 146 147 148 149 150 151
152 153 154 155 156 157 158 159
160 161 162 163 164 165 166 167
168 169 170 171 172 173 174 175
176 177 178 179 180 181 182 183
184 185 186 187 188 189 190 191
192 193 194 195 196 197 198 199
200 201 202 203 204 205 206 207
208 209 210 211 212 213 214 215
216 217 218 219 220 221 222 223
224 225 226 227 228 229 230 231
232 233 234 235 236 237 238 239
240 241 242 243 244 245 246 247
248 249 250 251 252 253 254 255>;
default-brightness-level = <200>;
enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
};
五、FAQ
1、PWM 无法注册成功:
dts 配置文件是否打开对应的 PWM。
该路PWM 是否被其他资源占用,可以根据报错的返回值去查看原因。
2、PWM 在 U-Boot 与 kernel 之间的衔接问题
3、PWM Regulator 时 PWM pin 脚上下拉配置问题
pwm2_pin_pull_down: pwm2-pin-pull-down {rockchip,pins =<1 19 RK_FUNC_1 &pcfg_pull_down>;
};
c、在 dts 中重新 PWM 覆盖 pinctrl:
&pwm2 {status = "okay";pinctrl-names = "active";pinctrl-0 = <&pwm2_pin_pull_down>;
};
总结
以上为在RK3568平台上使用PWM功能的一些记录和总结,如果pwm功能不能正常使用,主要检查该路pwm是否被其他功能复用。