0%

Linux驱动之PWM

PWM概述

  • Ton:信号高电平持续时间
  • Toff:信号底电平持续时间
  • Period: 完整pwm周期
  • Duty cycle:pwm信号周期内保持为ON的时间百分比

Linux下PWM驱动

数据结构

pwm的数据结构如下图所示:原图

  • pwm_chip结构体用于抽象soc的pwm控制器
  • pwm_device用来抽象设备
  • pwm_state表示pwm设备的周期、占空比、极性等信息
  • pwm ops结构体提供一系列回调函数。这些回调函数的操作对象是具体的pwm device

实现

pwm驱动分为consumer和provider。其中consumer提供接口如下:

1
2
3
static inline int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) //配置pwm device的频率、占空比。
static inline int pwm_enable(struct pwm_device *pwm) //使能/禁止pwm信号输出
static inline void pwm_disable(struct pwm_device *pwm)

这些接口实现对pwm设备的配置,使能等(这些接口最终会调用到pwm_ops结构体提供的函数),操作struct pwm_device结构体,代表了具体的pwm设备。这些struct pwm_device结构体指针由以下函数获得:

1
2
3
struct pwm_device *pwm_get(struct device *dev, const char *con_id)
void pwm_put(struct pwm_device *pwm)
struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id)

其中pwm_get接口流程如下:原图

pwm_get/devm_pwm_get,从指定设备(dev)的DTS节点中,获得对应的PWM句柄。可以通过con_id指定一个名称,或者会获取和该设备绑定的第一个PWM句柄。

provider提供以下接口:

1
2
int pwmchip_add(struct pwm_chip *chip)
int pwmchip_remove(struct pwm_chip *chip)

将一个pwm_chip注册到内核添加到pwm_chips链表中去。

参考文献

http://www.wowotech.net/comm/pwm_overview.html
《Linux设备驱动开发》