RK3588 PWM调试记录---linux pwm子系统驱动框架

一、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,.前面的即是地址。
这跟设备树中的地址是对应的:
RK3588 PWM调试记录---linux pwm子系统驱动框架_第1张图片
芯片手册中,也可以看到PWM的地址:
RK3588 PWM调试记录---linux pwm子系统驱动框架_第2张图片
RK3588 PWM调试记录---linux pwm子系统驱动框架_第3张图片

基地址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个类似的目录即从pwmchip0pwmchip14;
导出方式跟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输出。

你可能感兴趣的:(rk3588,linux,单片机,运维)