PWM驱动

        pwm驱动一般由芯片厂商编写.他的驱动编写和使用方法和GPIO高度相似.例如一个芯片1到多个多个GPIO控制器,和0到多个pwm控制器,一个gpio控制器在代码里对应一个stuct gpiochip,同样一个pwm控制器在代码里对饮搞一个 struct pwmchip. 并且使用方法也很相似.后面可以看到.

PWM驱动分为pwm驱动和pwm设备pwm驱动由厂商提供位于:drivers/pwm/xxx.c目录下

一 pwm驱动

pwm驱动由厂商提供位于:drivers/pwm/xxx.c目录下

在设备树里的节点:

            pwm3: pwm@02088000 {

                compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";

                reg = <0x02088000 0x4000>;

                interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>;

                clocks = <&clks IMX6UL_CLK_PWM3>,

                     <&clks IMX6UL_CLK_PWM3>;

                clock-names = "ipg", "per";

                #pwm-cells = <2>;

                status = "disabled";

            };



            pwm4: pwm@0208c000 {

                compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";

                reg = <0x0208c000 0x4000>;

                interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;

                clocks = <&clks IMX6UL_CLK_PWM4>,

                     <&clks IMX6UL_CLK_PWM4>;

                clock-names = "ipg", "per";

                #pwm-cells = <2>;

                status = "disabled";

            };

这里配置了时钟,如果要用pwm 还要添加引脚

 &pwm3 {

 pinctrl-names = "default";

 pinctrl-0 = <&xxxxxx>;

    status = "okay";

 }

源码了GPIO的类似,

debugfs接口

和GPIO一样,注册了debugfs文件系统的接口可以通过如下命令查看调试信息:

debugfs查看pwm信息

cat /sys/kernel/debug/pwm

cat /d/pwm

sysfs接口


驱动注册pwm设备也提供了sysfs的接口, 并且可以像导出gpio一样通过这些接口控制pwm如下:

sysfs查看pwm信息并手动设置PWM

/sys/class/pwm 目录看到注册的pwmchip

导出一个通道

/sys/class/pwm/pwmchip0 # echo 0 > export

这里导出pwmchip0的通道0, 执行成功后可以看到当前目录下的pwm0文件.

pwmchip0支持多少个通道可以通过 cat npwm 查看.

使能pwm

echo 1 > pwm0/enable

设置pwm通道的周期,单位ns

/sys/class/pwm/pwmchip0 # echo 5000000 > pwm0/period

设置pwm 高电平持续时间.单位ns

/sys/class/pwm/pwmchip0 # echo 2000000 > pwm0/duty_cycle

capture   //电平捕获,用于捕获脉冲的宽度,这个很少用到.

duty_cycle //设置占空比(高电平时间),单位ns "5000" 高电平5000ns

enable    //开关控制 "0" "1"

period   //周期, 同 duty_cycle

polarity //极性,"normal",或 "inversed"

power

uevent


 

应用层直接访问pwm

参考:

https://www.cnblogs.com/wmate/p/14266140.html

https://blog.csdn.net/qq_37858386/article/details/115174952


二, 如何添加和使用pwm

使用方式和GPIO类似,仅仅是API不同.

设备树节点添加

如下是一个节点:

pwm_backlight: sprd_backlight {

    compatible = "pwm-backlight";

    pwms = <&pwm1 2 40000 0>;

    pwm-names = "backlight";

pwms = <&pwm1 2 40000 0>;

"pwm", 名字必须是pwms

&pwm1, 指定pwm所在的pwmchip

2,     指定PWM在pwmchip中通道编号.

40000, 一般表示pwm的周期,单位ns

0, 制定极性, 一般是0即可,也可设置PWM_POLARITY_INVERTED 表示极性翻转

pwm-names = "backlight";

pwm-names 可有可无, 如果一个节点只用了一个pwm设备,则可以不用编写pwm-names属性, 驱动中使用pwm_get(&dev->dev, NULL); 即可获得PWM设备.

如果一个节点使用了多个设备,或者要应用层直接使用pwm设备则可以加上名字例如:

一个可选的属性 "pwm-names" 可能包含一系列字符串,用于标记 "pwms" 属性中列出的每个 PWM 设备。如果没有提供 "pwm-names" 属性,则使用用户节点的名称作为备用。

backlight {  

    compatible = "some-vendor,some-backlight";  

    pwms = <&pwm0 1 1000000 0>, <&pwm1 2 2000000 0>;  

    pwm-names = "backlight-dim", "backlight-brightness";  

    // 其他属性...  

};

驱动中可以使用pwm_get(&dev->dev,backlight-dim)指定获取哪个pwm设备.


 

驱动中调用pwm

pwm = pwm_get(&dev->dev, NULL); //从节点获取pwm设备, 获取完成后就可以使用了

pwm_put();//释放申请的pwm设备.


 

/*

 * struct pwm_state - state of a PWM channel

 * @period: PWM period (in nanoseconds)

 * @duty_cycle: PWM duty cycle (in nanoseconds)

 * @polarity: PWM polarity

 * @enabled: PWM enabled status

 */

struct pwm_state {

    unsigned int period;

    unsigned int duty_cycle;

    enum pwm_polarity polarity;

    bool enabled;

};

/*修改pwm*/

struct pwm_state state;  

int error;

pwm_get_state(beeper->pwm, &state);

state.enabled = true;

state.period = period;

/*协助设置占空比.这里设置了周期,使用该函数设置 50占空比情况下高电平时间*/

pwm_set_relative_duty_cycle(&state, 50, 100);  

/*执行修改.*/

error = pwm_apply_state(beeper->pwm, &state);

总结: 可以把PWM类比成一个gpio, 操作方法几乎相同,找到对应的API即可.

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当使用Linux时,PWM驱动程序是一种非常常见的驱动程序类型,用于控制数字信号,如LED的亮度,风扇的速度等等。 以下是一些在Linux中使用PWM驱动程序的步骤: 1. 确认您的系统支持PWM驱动程序。要检查此功能,请执行以下操作: $ ls /sys/class/pwm 如果输出结果为“pwmchip0”,则您的系统支持PWM驱动程序。 2. 选择一个PWM引脚。要选择PWM引脚,请执行以下操作: $ ls /sys/class/pwm/pwmchip0 这将显示您的系统中可用的所有PWM通道。选择一个通道,并记下其索引号。 3. 设置PWM参数。要设置PWM参数,请执行以下操作: $ cd /sys/class/pwm/pwmchip0/pwm0 $ echo 1000000 > period $ echo 500000 > duty_cycle $ echo 1 > enable 这将设置PWM周期为1秒(1000000微秒),占空比为50%(500000微秒)并启用PWM信号。 4. 您还可以使用PWM驱动程序的API来编写自己的PWM控制程序。这些API包括pwm_request,pwm_config和pwm_enable等。 这些API可用于从用户空间直接控制PWM驱动程序,以实现更高级的PWM控制功能。 希望这些步骤对您有所帮助! ### 回答2: PWM(Pulse Width Modulation)顾名思义是一种脉冲宽度调制技术,在电子工程领域中广泛应用于数字信号处理中。PWM技术可以通过改变脉冲信号的脉冲宽度,来控制电路中的电压、电流或功率大小。PWM控制技术在电机调速、LED亮度调节、UPS、DC-DC变换器等各种电子设备中均有较为广泛的应用。 在linux内核中,PWM是通过相应的PWM驱动程序来控制的。PWM驱动程序所做的工作主要包括以下几个方面: 第一,初始化PWM。在系统启动过程中,通过相应的平台设备驱动程序,向内核注册PWM设备,设置相应的参数,包括PWM的周期和脉冲宽度等信息。 第二,控制PWM输出。PWM输出可以通过向PWM设备文件写入相应的数值来完成。输出数值由占空比和周期组成,通过改变参数可以控制PWM输出的占空比和频率。 第三,提供用户接口。PWM驱动程序同时还提供相应的用户接口文件,用户可以通过读写PWM设备对应的文件来实现对PWM的控制。例如,在/sys/class/pwm目录下,可以找到相应的PWM设备子目录,通过读写相应的文件即可对PWM进行控制。 第四,支持中断处理。在PWM输出过程中,一般需要在到达周期末尾时触发中断,进行相应的处理。PWM驱动程序也需要对中断处理进行支持。 总之,PWM技术在现代电子领域中应用非常广泛,linux PWM驱动程序也是相应的关键组成部分之一。通过PWM驱动程序的实现,我们可以轻松地控制LED亮度、电机转速等各种应用场景。而PWM驱动程序在日后的不断发展和完善中,也将不断地被改进和优化,为现代电子技术的不断进步提供更为稳定可靠的支持。 ### 回答3: PWM(Pulse Width Modulation)或脉宽调制是一种控制电子器件的技术,通过调整脉冲的宽度和周期来达到控制电子设备的功率、速度和亮度的目的。Linux PWM驱动则是一种跨平台的PWM控制器,使用Linux的内核从驱动器中执行PWM协议操作。 Linux PWM驱动是基于Linux系统内核提供的高级驱动程序接口(API)实现对PWM设备的控制和管理。Linux PWM驱动使得PWM设备的编程接口更加简单和便捷,可以自由配置PWM信号的频率、占空比和周期等参数以控制输出信号。 Linux PWM驱动通常被用于控制一些设备,比如LED、电机、声音发生器和传感器等等。例如,我们可以通过PWM控制器驱动LED的亮度和颜色,也可以通过PWM控制器驱动电机来调节速度和方向。 要在Linux中使用PWM驱动程序,需要安装相应的内核模块并配置设备驱动程序参数。LinuxPWM API接口包括PWM子系统,该子系统提供了PWM设备的管理、底层硬件驱动和访问函数等。此外,Linux的设备树(Device Tree)也提供一种类似于BIOS的抽象层,用于描述硬件平台的配置,包括PWM控制器等设备的物理和逻辑地址。 总之,Linux PWM驱动是一种实现PWM控制的程序接口,可用于管理和控制PWM设备。通过LinuxPWM API和设备树,开发人员可以轻松地访问硬件PWM信号并实现有用的控制功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值