Firefly-RK3399 Buy Specs

Equipped with a six-core 64-bit "server class" processor Rockchip RK3399, and with 2GB/4GB DDR3 and 16G/32GB eMMC, as well as increases PCIe 2.1 M.2, DP 1.2, Type-C, USB3.0 and other high-performance data transmission and display interface.

PWM

Update time:2018-04-13 Views:3218

Introduction

Firefly-RK3288 development board has 4 PWMs, namely PWM0 ~ PWM3. 4 PWMs use for eDP backlight, MIPI backlight, VDD logic , IR . This article describes how to configure and use PWM.

Configure DTS

Add code below to turn on pwm demo .

      pwm_demo: pwm_demo {
              status = "okay";
              compatible = "firefly,rk3399-pwm";
              pwm_id = <1>;
              min_period = <0>;
              max_period = <10000>;
              duty_ns = <5000>;
      };

Configure pwm driver

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

Modify the code as shown below:

(1)、Include the pwm.h file  

        #include <linux/pwm.h>

This file includes the API functions of PWM.  

(2)、 Request PWM.
You can use the pwm_request function to request the PWM device. For example:

        struct pwm_device * pwm1 = NULL;pwm1 = pwm_request(1, “firefly-pwm”);

See The API of PWM device for more detail of this function.  

(3)、Set PWM configuration
You can use the function pwm_config to set the PWM configuration. For example:

        int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
For example:
        pwm_config(pwm1, 500000, 1000000);

See The API of PWM device for more detail of this function.  

(4)、Enable PWM Function

       int pwm_enable(struct pwm_device *pwm);

enable PWM,For example:  

       pwm_enable(pwm0);

See The API of PWM device for more detail of this function.  
== The API of PWM device ==

 /**
  * pwm_request() - request a PWM device
  * @pwm_id: global PWM device index
  * @label: PWM device label
  *
  * This function is deprecated, use pwm_get() instead.
  */struct pwm_device *pwm_request(int pwm_id, const char *label);
/**
 * pwm_free() - free a PWM device
 * @pwm: PWM device
 *
 * This function is deprecated, use pwm_put() instead.
 */void pwm_free(struct pwm_device *pwm);
/**
 * pwm_config() - change a PWM device configuration
 * @pwm: PWM device
 * @duty_ns: "on" time (in nanoseconds)
 * @period_ns: duration (in nanoseconds) of one cycle
 */int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
/**
 * pwm_enable() - start a PWM output toggling
 * @pwm: PWM device
 */int pwm_enable(struct pwm_device *pwm);
/**
 * pwm_disable() - stop a PWM output toggling
 * @pwm: PWM device
 */void pwm_disable(struct pwm_device *pwm);

Sample codeː kernel/drivers/pwm/pwm-firefly.c

Debug

cat  /sys/kernel/debug/pwm  ---success or not,check the address of register

FAQ

Cannot register pwm:
1.Set dts pwm configuration is "okay"
2.Check the io of pwm if it was used by other source .According to the return to figure out the error.