最近收到一个使用OK1028A-C输出pwm方波的请求。然而我发现OK1028平台没有相关说明,所以我开始写这篇文章。
查阅OK1028A-C原理图和《QorIQ LS1028A参考手册》得知,LS1028默认有8个FlexTimers(FTM),每个FTM有8个pwm。
默认背光使用FTM1 生成的PWM。我们使用FTM7 进行PWM 测试。
如下图:
LS1028的RCWSR12寄存器的12-14是I2C4引脚复用。
如下图:
I2C4 引脚可复用为6 个引脚功能。 OK1028A-C将引脚设置为can2的rx和tx。您可以在原理图“OK1028A-C_V1.1”中看到T6_CAN2_RX和U7_CAN2_TX。
我们可以通过修改rcw文件将I2C4设置为pwm引脚。
OK1028A-C默认支持pwm功能,所以我们不需要移植驱动程序。我们要做的就是修改pinmux,在设备树中添加pwm对应的设备节点。修改软件包/固件
/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw 中IIC4_PMUX 的设置将引脚设置为pwm 输出。
修改IIC4_PMUX=2为IIC4_PMUX=4
如下图:
完成上述设置后,我们需要修改设备树代码,添加PWM配置。我们修改后的文件路径如下:
包/linux/linux/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi。
然后添加pwm7设备
Pwm7: pwm@2860000 {
兼容='fsl,ls1028a-ftm-pwm';
reg=0x00x28600000x00x10000;
#pwm-cells=3;
时钟名称='ftm_sys';
时钟=ftm_sysclk;
};
如下图:
启动OK1028A-C系统
root@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备
如下图:
我们现在打开一个pwm控制器,可以看到FTM1支持8个通道,背光使用pwm-1通道。编译我们修改后的设备树文件和固件,烧录到飞凌LS1028A-C开发板上,并启动系统。
root@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备。
如下图:
此时,我们添加的pwm设备虽然打开了,但是和pwm0设备还是有区别的。新添加的pwm设备的每个通道没有周期和占空比设置。
所以下一步我们不需要添加驱动代码,而是可以直接使用sys.pwm参数来设置pwm参数。 Pwmchip8是我们添加的pwm设备。
使能所使用的pwm通道
root@forlinx:~#echo 1 /sys/class/pwm/pwmchip8/export 初始化pwm 通道1
root@forlinx:~#echo 2 /sys/class/pwm/pwmchip8/export 初始化pwm 通道2
root@forlinx:~#cat /sys/kernel/debug/pwm 命令查看我们当前的pwm设备:
如果想取消对应的pwm通道,可以使用“echo 1 /sys/class/pwm/pwmchip8/unexport”
“echo 2 /sys/class/pwm/pwmchip8/unexport”命令。
因为我们一次只能启用一个pwm,所以我们首先配置并打开pwm1。
root@forlinx:~#echo 1000000 /sys/class/pwm/pwmchip8/pwm1/period 配置pwm1周期为1000000,单位为ns,即1kHZ。
root@forlinx:~#echo 500000 /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置duty_cycle为500000,一个周期内的导通时间为占空比,单位为ns,占空比为50%
root@forlinx:~#echo 1 /sys/class/pwm/pwmchip8/pwm1/enable 启用
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm1/{enable, period, Duty_cycle}命令可以查看我们的pwm使能状态、周期和占空比。
如下图:
使用示波器测试T6_CAN2_RX产生1khz方波
由于一次只能启用一个pwm,如果要启用pwm2,我们需要先关闭pwm1。
root@forlinx:~#echo 0 /sys/class/pwm/pwmchip8/pwm1/enable
root@forlinx:~#echo 1000000 /sys/class/pwm/pwmchip8/pwm2/period 配置周期为1000000
root@forlinx:~#echo 500000 /sys/class/pwm/pwmchip8/pwm2/duty_cycle 将duty_cycle 配置为500000。 root@forlinx:~#echo 1 /sys/class/pwm/pwmchip8/pwm2/enable 启用
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm2/{enable,period,duty_cycle}
使用示波器测试U7_CAN2_TX产生1khz方波
当我们使用OK1028A-C时,由于引脚复用,很多功能模块引脚没有引出,但模块驱动支持。这种情况下,我们只需要修改rcw对应的pinmux配置和设备树文件就可以使用对应的功能了。
好了,以上就是我在OK1028A-C开发板上实现PWM输出方波的方法了。如果您需要帮助或理解,可以在左侧在线客服留言。