Skip to main content

PWM

Introduction​

Face-RK3399 has two PWM outputs:

  • PWM1: LCD_BL_PWM
  • PWM2: VDDLOG power supply

This chapter describes how to configure PWM.

The PWM driver of Face-RK3399 is kernel/drivers/pwm/pwm-rockchip.c

Configurtion​

There are three main steps to configure PWM: configure PWM DTS node, configure PWM kernel driver and control PWM device.

DTS Configuration​

Add the PWM DTS configuration in kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-demo.dtsi:

pwm_demo: pwm_demo {
status = "okay";
compatible = "firefly,rk3399-pwm";
pwm_id = <1>;
min_period = <0>;
max_period = <10000>;
duty_ns = <5000>;
&#125;;
  • pwm_id : Number of PWM channels to be applied.
  • min_period : Minimum period length.
  • max_period : Maximum period length.
  • duty_ns : Duty cycle activation time of PWM, unit ns.

Interface specification​

Users can use the PWM nodes generated by the above steps in other driver files. The specific methods are as follows:

  • (1) The following header files are included in the device driver files that need to be controlled by PWM :

    #include <linux/pwm.h>

    This header file mainly contains the PWM function interface.

  • (2) Apply PWM

    struct pwm_device *pwm_request(int pwm_id, const char *label);

    Function to apply for PWM, for example:

    struct pwm_device * pwm1 = NULL;pwm0 = pwm_request(1, “firefly-pwm”);
  • (3) Configue PWM

    int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);

    Configure the duty cycle of PWM, for example:

    pwm_config(pwm0, 500000, 1000000);
  • (4) Enable the PWM function

    int pwm_enable(struct pwm_device *pwm);

    Used to enable PWM, for example:

    pwm_enable(pwm0);
  • (5) Control PWM output mainly uses the following interface functions:

  • function: Request a PWM

    struct pwm_device *pwm_request(int pwm_id, const char *label);
  • function: Release the PWM requested

    void pwm_free(struct pwm_device *pwm);
  • function: Configure the duty cycle of PWM

    int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
  • function: Enable PWM

    int pwm_enable(struct pwm_device *pwm);
  • function: Disable PWM

    void pwm_disable(struct pwm_device *pwm);

Refer to the Demo: kernel/drivers/pwm/pwm-firefly.c.

Debugging​

Check PWM registration status through the rich debug interface of the kernel, adb shell or serial port to enter the android terminal and execute:

cat /sys/kernel/debug/PWM

The interface name and register address will be returned if PWM registration is successful.

FAQs​

Q1: PWM could not register successfully ?

A1:

  • Whether the DTS configuration file opens the corresponding PWM.
  • Whether the IO port where PWM is located is occupied by other resources, you can check the reason according to the error return value.