基于RK3399 PWM驱动开发

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
### 关于 `pwm_apply_state` 的功能与使用 在 Linux PWM 驱动框架中,`pwm_apply_state` 是一个重要的函数,用于更新指定 PWM 设备的状态。此函数允许开发者通过传递一个新的状态结构体来调整 PWM 的配置参数,例如周期、占空比以及其他属性。 以下是关于该函数的具体描述: #### 函数定义 `int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *state)` - 参数一:`struct pwm_device *pwm` 表示目标的 PWM 设备对象[^2]。 - 参数二:`struct pwm_state *state` 定义了新的状态设置,包括但不限于周期 (`period`) 和占空比 (`duty_cycle`) 等字段[^1]。 #### 功能解析 当调用 `pwm_apply_state` 时,它会尝试将传入的新状态应用到指定的 PWM 设备上。如果成功,则返回零;否则返回负错误码表示失败原因。具体行为取决于底层硬件支持以及当前驱动程序实现逻辑。 下面是一个简单的代码示例展示如何使用这个API: ```c #include <linux/pwm.h> // 假设已经获取了一个有效的PWM设备指针 'pwm' struct pwm_state state; memset(&state, 0, sizeof(state)); state.period = 1000000; /* 设置周期为1秒 */ state.duty_cycle = 500000; /* 占空比为50% */ if (pwm_apply_state(pwm, &state)) { pr_err("Failed to apply new PWM state\n"); } else { pr_info("Successfully applied new PWM state\n"); } ``` 上述例子展示了怎样构建并提交一个新的PWM工作模式给定好的外设实例[pwm]. 值得注意的是,在实际开发过程中还需要考虑同步机制等问题以确保多线程环境下的安全性。 ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值