PWM 使用 前言 本章主要描述如何配置 PWM。 ROC-RK3506B-CC的 PWM 驱动为:"kernel/drivers/pwm/pwm-rockchip.c" DTS配置 配置 PWM 主要有以下三大步骤:配置 PWM DTS 节点、配置 PWM 内核驱动、控 制 PWM 设备。 配置 PWM DTS节点 例如 DTS 源文件 "kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b- cc-mipi101-BSD1218-A101KL68.dtsi" PWM DTS 配置,如下所示: /{ backlight: backlight { compatible = "pwm-backlight"; enable-gpios = <&pca9555 PCA_IO0_1 GPIO_ACTIVE_HIGH>; pwms = <&pwm0_4ch_2 0 50000 1>; //pwm0_4ch_2:PWM number 0 50000:PWM period in nanoseconds 1:polarity ... }; &pwm0_4ch_2 { pinctrl-names = "active"; pinctrl-0 = <&rm_io3_pwm0_ch2>; status = "okay"; }; pwms参数分析: "&pwm0_4ch_2": 在 rk3502.dtsi 中有定义。 "0" :表示 chip index ,一般是0,因为rockchip pwm每个chip只有一个。 "50000" : 一个 周期时间为100000000纳秒 ,一秒有10个100000000纳秒 ,所以这个pwm输出周 期为20000Hz。 "1": 表示极性, 0为正常极性,1为反转极性。 接口说明 用户可在其它驱动文件中使用以上步骤生成的 PWM 节点。具体方法如下: (1)在要使用 PWM 控制的设备驱动文件中包含以下头文件: #include 该头文件主要包含 PWM 的函数接口。 (2)申请 PWM 使用 struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); 函数申请 PWM。 例如: struct pwm_device * pwm0 = devm_pwm_get(&pdev->dev, NULL); (3)配置 PWM 使用 int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); 配置 PWM 的占空比,例如: pwm_config(pwm0, 500000, 1000000); (4)使能PWM函数 int pwm_enable(struct pwm_device *pwm); 用于使能 PWM,例如: pwm_enable(pwm0); (5)控制 PWM 输出主要使用以下接口函数: 功能:用于申请 PWM struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); 功能:用于释放所申请的 PWM void pwm_free(struct pwm_device *pwm); 功能:用于配置 PWM 的占空比 int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); 功能:使能 PWM int pwm_enable(struct pwm_device *pwm); 功能:禁止 PWM void pwm_disable(struct pwm_device *pwm); 调试方法 通过内核丰富的 debug 接口查看 PWM 注册状态,"adb shell" 或者串口进入系 统终端执行: cat /sys/kernel/debug/pwm 查看注册是否成功,成功则返回接口名和寄存器地址。 FAQs PWM 无法注册成功: dts 配置文件是否打开对应的 PWM。 PWM 所在的 IO 口是否被其他资源占用,可以根据报错的返回值去查看原因。