最近,我收到了一個使用OK1028A-C輸出pwm方波的需求.但是發現OK1028平臺沒有相關的說明,于是我著手寫下了這篇文章。
在查閱OK1028A-C原理圖和《QorIQ LS1028A Reference Manual》后得知,LS1028默認有8個FlexTimer (FTM) ,每個FTM有8路pwm。
默認背光采用的是FTM1產生的pwm,我們使用FTM7做pwm測試。
如下圖所示:
LS1028 RCWSR12寄存器的12-14為I2C4的管腳復用。
如下圖所示:
I2C4管腳可以復用為六種管腳功能。OK1028A-C將管腳設置為can2 的rx 和tx ,在原理圖《OK1028A-C_V1.1》中可以看到T6_CAN2_RX、U7_CAN2_TX。
我們可以通過修改rcw文件,將I2C4設置為pwm管腳。
OK1028A-C默認是支持pwm功能的,所以我們無需移植驅動,所做的工作只是修改pinmux和在設備樹中增加pwm的相應設備節點即可。修改packages/firmware
/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw中IIC4_PMUX的設置,將pin設置為pwm輸出。
將IIC4_PMUX=2修改為 IIC4_PMUX=4
如下圖所示:
完成上述設置后我們需要修改設備樹代碼,增加PWM配置。我們的修改的文件路徑如下:
packages/linux/linux/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi。
然后添加pwm7設備
Pwm7: pwm@2860000 {
compatible = "fsl,ls1028a-ftm-pwm";
reg = <0x0 0x2860000 0x0 0x10000>;
#pwm-cells = <3>;
clock-names = "ftm_sys";
clocks = <&ftm_sysclk>;
};
如下圖所示:
? ?啟動OK1028A-C系統
root@forlinx:~#cat /sys/kernel/debug/pwm 查看我們當前的pwm設備
如下圖所示:
我們現在打開了一個pwm控制器,可以看到FTM1支持8個通道,而背光使用的是pwm-1通道。將我們修改后的設備樹文件和firmware編譯,燒寫到飛凌LS1028A-C開發板,啟動系統。
root@forlinx:~#cat /sys/kernel/debug/pwm 查看我們當前的pwm設備。
如下圖所示:
此時,雖然我們添加的pwm設備打開了,但和pwm0設備還是有差別的,新添加的pwm設備的每一路通道都沒有設置周期和占空比。
所以下一步我們不需要再增加驅動代碼,而是利用sys即可直接設置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 period為1000000,單位為ns,即1kHZ。
root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置 duty_cycle 為500000,一個周期中on的時間即占空比,單位為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 配置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配置和設備樹文件就可以使用相應的功能了。
責任編輯:lq
評論
查看更多