平台:迅为iMX6UL开发板
说明:PWM 配置和测试方法
测试中不需要添加额外驱动,是基于系统用户态的 sysfs,可以使用命令来直接操作底层。
1 iMX6UL的PWM简介
打开 iMX6UL 的 datasheet,搜索 PWM 关键词,如下图所示。
PWM5-PWM8 的地址如下。
PWM1-PWM4 的地址如下。
可以知道 iMX6UL 最多可以支持 8 路 PWM 输出,也查出了物理地址。
2 iMX6UL的PWM0测试
所有的 ARM 板,默认情况下背光都是采用的 PWM 来调整的,那么它的 PWM 时钟地址
等参数肯定是配置好的,我们可以先使用背光对应 PWM 来做初步的测试。
2.1 硬件简介
打开 iMX6UL 的底板原理图,如下图所示,可以看到背光使用的 PWM 网络标号是
“BLT_PWM”。
如下图所示,“BLT_PWM”和“GPIO_8”接到了一起。
在核心板原理图中搜索“GPIO_8”,可以查到对应的这个网络标号对应的 PAD 为
“GPIO1_IO08”,如下图所示。
2.2 设备树文件分析和修改
在内核源码目录下,打开“arch/arm/boot/dts/imx6ul-14x14-evk.dts ”设备树文件,
在其中搜索“GPIO1_IO08”,如下图所示,管脚已经配置了。
接着搜索“pinctrl_pwm1”,查看在哪里注册了,如下图所示,可以看到“pwm1”中
调用了。
接着搜索“pwm1”,可以看到 pwm1 在背光驱动中调用了,这里仿照下图,将其注释
掉。
请注意:如果这里注释掉,屏幕将无法使用,如果需要使用屏幕,务必在测试完成之后恢
复原样。
然后重新编译设备树文件,烧写到开发板中。
2.3 pwm0测试
烧写新的镜像之后,在串口控制台中依次输入以下命令:
echo 0 > sys/class/pwm/pwmchip0/export
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period
echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
第一个命令为设置 pwm 输出,跳出 pwm0 目录下的节点;
第二个命令为使能 pwm0;
第三个命令为设置周期;
第三个命令为设置占空比。
最后使用示波器测试下面 R129 电阻,可以看到 pwm 输出。
3 PWM2分析和测试
PWM1 测试因为内核中肯定将时钟和 IO 配置好了,我们只需要将背光设备注释掉就可以
完成测试。本小节介绍 PWM2,更进一步介绍时钟和 IO 配置以及 PWM2 注册。
3.1 datasheet和原理图分析
在 datasheet中,搜索 PWM2,如下图所示,可以看到“GPIO1_IO09”这个 pad 可以
被配置为 PWM2。
在核心板原理图上,搜索“GPIO1_IO09”,如下图所示,可知网络标号为
“GPIO_9”。
在底板原理图中搜索“GPIO_9”,如下图所示,可以看出它通过 J38 的管脚 5 引出。
通过在原理图中搜索可以发现这个管脚没有接到其它设备上。
3.3 时钟配置
回到内核源码,很明显在“arch/arm/boot/dts/imx6ul-14x14-evk.dts”设备树文件中
没有对 PWM1 进行时钟配置,但是我们在前面测试 PWM1 的时候是能成功的,这表明它一
定在其它地方配置了。
打开设备树文件,查看其包含的头文件,如下图所示,应该是和设备树同一目录目录下的
“imx6ul.dtsi”。
将其打开,搜索“pwm1”,如下图所示。
如上图所示,可以看到 pwm1 中引用了物理地址“0208_0000”,引用时钟 PWM 时钟
配置“IMX6UL_CLK_PWM1”。在最前面介绍 PWM 的时候,其实有提到物理地址,如下图
所示,这里和 datasheet上是一致(肯定一致,不然前面测试一定不行)。
接着看 pwm2,默认定义了,但是没有将 PWM 时钟打开,如下图所示,将两个
“IMX6UL_CLK_DUMMY”修改为“IMX6UL_CLK_PWM2”。
至此 PWM2 的时钟配置完成,其它 PWM 时钟也可以依照这样的方式,在这个文件中打
开时钟或者新增,新增的话,要注意其中的中断号,PWM1 为 83,PWM2 为 84,依次类
推,仿照着来就成。
3.4 管脚配置和设备注册
前一小节介绍了时钟配置,回到“arch/arm/boot/dts/imx6ul-14x14-evk.dts”设备树
文件,先搜索“PWM2”和“pwm2”,这里搜索 PWM2 是因为有其它 pad 是可能被配置
为 pwm2,如果有配置配置,则宏定义中一定有 PWM2。搜索发现“PWM2”和“pwm2”
都没有。
然后搜索“GPIO1_IO09”,发现被定义为 SD1 的 reset,直接注释掉,如下图所示。
如下图所示,在 pinctrl_pwm1 后面添加 pinctrl_pwm2,将“GPIO1_IO09”配置为
PWM2 模式。
上图添加的代码如下:
pinctrl_pwm2: pwm2grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO09__PWM2_OUT 0x110b0
>;
};
接着添加 PWM2 设备注册的代码,如下图所示。
上图添加的代码如下:
&pwm2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm2>;
status = "okay";
};
至此,时钟,管脚配置,设备注册全部完成。
重新编译烧写到开发板。
3.5 测试
新的镜像烧写之后,依次使用以下命令:
echo 0 > sys/class/pwm/pwmchip1/export
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
echo 1000000 > /sys/class/pwm/pwmchip1/pwm0/period
echo 500000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
然后使用示波器测试 J38 的管脚 5,可以观察到有脉冲波信号。
剩余的 6 路 PWM 可以按照本文档介绍的思路实现,用户如果有需要,可以自行实现。
转自:http://www.topeetboard.com