一、RK3588 PWM简介
RK3588一共有4组PWM,每组有4个通道,共可以产生4*4=16路PWM波形;
PWM0 开始地址:0xfd8b0000
PWM1 开始地址:0xfebd0000
PWM2 开始地址:0xfebe0000
PWM3 开始地址:0xfebf0000
即每组PWM的地址空间是(0xfd8b0000-0xfebd0000=0x1000)64KB(0x1000/1024)
RK3588的PWM支持捕获、连续和单次触发三种模式。
1.捕获模式
用来测量由PWM通道时钟产生的PWM通道波形的高低有效波形,并且在PWM波形极性翻转时触发中断;高有效周期数记录在PWMx_PERIOD_HPC寄存器,低有效周期数记录在PWMx_DUTY_LPC寄存器中。捕获结果也可以保存在FIFO中,并且FIFO有一个指示器,该指示器也可以触发中断或者DMA请求。
2、连续模式
一旦PWM的通道被连续模式使能,即会产生连续的方波;波形有两种对齐方式:左对齐和中间对齐;
左对齐是先运行一个占空比,然后翻转。中间对齐是先运行占空比的一半,再翻转,再运行占空比的一半;简单来说,左对齐一个设定周期内PWM翻转一次而中间对齐则翻转两次。
3、单次触发模式
设定的周期内触发一次,也分为左对齐和中间对齐。
二、Firefly pwm demo的使用
首先在rk3588-firefly-itx-3588j.dts
文件中,将demo的设备树使能;#include "rk3588-firefly-demo.dtsi"
注释打开
在该demo的设备树中,有gpio_demo,adc_demo,pwm_demo,led_demo,几个例子,也分别有对应的驱动,有的需要在kernal中打开,有的默认已经打开,例如pwm的驱动程序名字叫pwm-firefly-demo.c
,里面有一些具体的驱动实现,是参考rockchip的驱动文件pwm-rockchip.c
来写的。但是该demo驱动有个问题,就是用户空间没有接口控制,在linux的pwm子系统的驱动中,我们可以通过命令行的方式来配置pwm,驱动是在/sys/bus/platform/drivers
或者/sys/devices/platform
中可以看到,例如
root@firefly:/sys/devices/platform# ls
10f000.sram fd5b0000.syscon fdb60f00.iommu fddf0000.i2s fdf66400.qos feaf0000.watchdog power
110000.ramoops fd5b4000.syscon fdb70000.rga fddf4000.i2s fdf66600.qos feb20000.spi psci
'Fixed MDIO bus.0' fd5b5000.syscon fdb70f00.iommu fddf8000.i2s fdf66800.qos feb40000.serial psci-cpuidle
adc-keys fd5b8000.syscon fdb80000.rga fdf35000.qos fdf66a00.qos feb60000.serial pwm_demo
arm-pmu fd5bc000.syscon fdb90000.jpegd fdf35200.qos fdf66c00.qos feb70000.serial reg-dummy
av1d-master fd5c0000.syscon fdb90480.iommu fdf35400.qos fdf66e00.qos feb90000.serial regulatory.0
clocks fd5c4000.syscon fdba0000.jpege-core fdf35600.qos fdf67000.qos fec00000.tsadc rkcif-mipi-lvds2
cpufreq-dt fd5c8000.syscon fdba0800.iommu fdf36000.qos fdf67200.qos fec10000.saradc rkvenc-ccu
cpuinfo fd5cc000.syscon fdba4000.jpege-core fdf39000.qos fdf70000.qos fec20000.gpio rockchip-system-monitor
csi2-dphy0 fd5d0000.syscon fdba4800.iommu fdf3d800.qos fdf71000.qos fec30000.gpio serial8250
display-subsystem fd5d4000.syscon fdba8000.jpege-core fdf3e000.qos fdf72000.qos fec40000.gpio timer
dmabuf fd5d8000.syscon fdba8800.iommu fdf3e200.qos fdf72200.qos fec50000.gpio uevent
dmc fd5dc000.syscon fdbac000.jpege-core fdf3e400.qos fdf72400.qos fecc0000.otp usbdrd3_0
fb000000.gpu fd5e0000.syscon fdbac800.iommu fdf3e600.qos fdf80000.qos fed10000.dma-controller usbdrd3_1
fc800000.usb fd5e4000.syscon fdbb0000.iep fdf40000.qos fdf81000.qos fed90000.phy vbus5v0-typec-pwr-en-regulator
fc840000.usb fd5e8000.syscon fdbb0800.iommu fdf40200.qos fdf81200.qos fedc0000.csi2-dphy0-hw vcc-1v1-nldo-s3
fc880000.usb fd5ec000.syscon fdbd0000.rkvenc-core fdf40400.qos fdf82000.qos fee00000.phy vcc-hub-reset-regulator
fc8c0000.usb fd5f0000.syscon fdbdf000.iommu fdf40500.qos fdf82200.qos fee10000.phy vcc-hub3-reset-regulator
fd104000.debug fd880000.i2c fdbe0000.rkvenc-core fdf40600.qos fe060000.dfi fee80000.phy vcc-sata-pwr-en-regulator
fd10c000.cspmu fd890000.serial fdbef000.iommu fdf40800.qos fe170000.pcie ff001000.sram vcc12v-dcin
fd588000.syscon fd8a0000.gpio fdc30000.rkvdec-ccu fdf41000.qos fe1b0000.ethernet fiq-debugger vcc3v3-pcie30
fd58a000.syscon fd8b0030.pwm fdc38100.rkvdec-core fdf41100.qos fe1c0000.ethernet fiq_debugger.0 vcc5v0-host
fd58c000.syscon fd8d8000.power-management fdc38700.iommu fdf60000.qos fe210000.sata firmware:optee vcc5v0-host3
fd590000.syscon fda40000.pvtm fdc48100.rkvdec-core fdf60200.qos fe2e0000.mmc firmware:scmi vcc5v0-sys
fd592000.syscon fda50000.pvtm fdc48700.iommu fdf60400.qos fe378000.rng firmware:sdei vcc5v0-usb
fd594000.syscon fda60000.pvtm fdc70000.av1d fdf61000.qos fe5a0000.hwspinlock hdmiin-dc vcc5v0-usbdcin
fd598000.syscon fdab0000.npu fdca0000.iommu fdf61200.qos fea10000.dma-controller jpege-ccu wireless-bluetooth
fd5a0000.syscon fdab9000.iommu fdce0000.rkcif fdf61400.qos fea30000.dma-controller leds wireless-wlan
fd5a2000.syscon fdaf0000.pvtm fdce0800.iommu fdf62000.qos fea50000.can mpp-srv
fd5a4000.syscon fdb30000.pvtm fdd30000.mipi2-csi2 fdf63000.qos fea60000.can mtd_vendor_storage
fd5a6000.syscon fdb50400.vdpu fdd90000.vop fdf64000.qos fea90000.i2c pcie30-avdd0v75
fd5a8000.syscon fdb50800.iommu fdd97e00.iommu fdf66000.qos feab0000.i2c pcie30-avdd1v8
fd5ac000.syscon fdb60000.rga fddb0000.spdif-tx fdf66200.qos feae0000.timer pinctrl
其中的fd8b0030.pwm
就是启用的PWM,.
前面的即是地址。
这跟设备树中的地址是对应的:
芯片手册中,也可以看到PWM的地址:
基地址0xfd8b0000+0x0030=0xfd8b0030
即通道3的起始地址。
如果设备树启用了demo并且在内核也配置了该demo的使能,那么,platform设备和驱动目录下,是可以看到名字为firefy-pwm-demo
的驱动和设备,并且在对应的io口也可以测量的设备树中设定的周期和占空比。但是具体的设定频率和占空比还需要在该驱动的基础上增加相关的设置接口才能使用。
三、linux pwm子系统驱动框架
rk3588也支持linux pwm子系统驱动框架下的pwm操作。
例如,我们将上面设备树中的pwm3的状态由disabled
改为okay
,那么我们可以在/sys/devices/platform/fd8b0030.pwm/pwm/pwmchip0
或者/sys/class/pwm/pwmchi0
将其导出。pwmchip0
是启用的pwm通道数,如果将15路pwm全部启用,就会有15个类似的目录即从pwmchip0
到pwmchip14
;
导出方式跟gpio类似:
# echo 0 > export
# cd pwm0/
# echo 10000 > period
# echo 5000 > duty_cycle
# echo normal > polarity
# echo 1 > enable
# ls
capture duty_cycle enable output_type period polarity power uevent
上面的指令设置了周期10000,占空比50%,极性为normal的pwm输出。