1. 主板型号:AIO-3399J
2. 芯片型号:RK3399
3. 操作系统版本:Android 7.1
4. Linux版本:v4.4.103
PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值),驱动的设备是雷达扫描电机RPLIDARA3M1内部带有具有可调速功能的电机驱动器,可通过接口中MOTOCTL信号对旋转电机的启动、停止以及旋转速度进行控制。MOTOCTL可视为特定频率和占空比的PWM信号,此时电机的旋转速度将取决于输入MOTOCTL PWM信号的占空比,它的典型值为25000HZ的方波信号,雷达旋转频率10Hz的高脉宽占空比60%。
5、配置 PWM DTS 节点
- pwm_id:需要申请的pwm通道数。
- min_period:周期时长最小值。
- max_period:周期时长最大值。
- duty_ns:pwm 的占空比激活的时长,单位 ns。
6、 开发PWM 内核驱动:kernel/drivers/pwm/pwm-rockchip.c
实现基本的PWM字符驱动程序,实现以下模块:初始化设备、设备打开、PWM数据的读写和控制、设备释放、设备卸载。
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/pwm.h>
#include <linux/time.h>
#include <linux/rk_fb.h>
#define PWM_CTRL_TIMER_EN (1 << 0)
#define PWM_CTRL_OUTPUT_EN (1 << 3)
#define PWM_ENABLE (1 << 0)
#define PWM_CONTINUOUS (1 << 1)
#define PWM_DUTY_POSITIVE (1 << 3)
#define PWM_DUTY_NEGATIVE (0 << 3)
#define PWM_INACTIVE_NEGATIVE (0 << 4)
#define PWM_INACTIVE_POSITIVE (1 << 4)
#define PWM_POLARITY_MASK (PWM_DUTY_POSITIVE | PWM_INACTIVE_POSITIVE)
#define PWM_OUTPUT_LEFT (0 << 5)
#define PWM_LOCK_EN (1 << 6)
#define PWM_LP_DISABLE (0 << 8)
struct rockchip_pwm_chip {
struct pwm_chip chip;
struct clk *clk;
struct clk *pclk;
const struct rockchip_pwm_data *data;
void __iomem *base;
};
struct rockchip_pwm_regs {
unsigned long duty;
unsigned long period;
unsigned long cntr;
unsigned long ctrl;
};
struct rockchip_pwm_data {
struct rockchip_pwm_regs regs;
unsigned int prescaler;
bool supports_polarity;
bool supports_lock;
u32 enable_conf;
u32 enable_conf_mask;
};
static inline struct rockchip_pwm_chip *to_rockchip_pwm_chip(struct pwm_chip *c)
{
return container_of(c, struct rockchip_pwm_chip, chip);
}
static void rockchip_pwm_get_state(struct pwm_chip *chip,
struct pwm_devi