君正X系列开发11---pwm配置、分析

该芯片提供了4路PWM, 可以通过配置内核实现pwm节点;

具体配置

->Device Drivers

    -> Pulse-Width Modulation (PWM) Support (PWM [=y]) 

        --- Pulse-Width Modulation (PWM) Support

        <*>   JZPWM support for LED or Beeper drivers

        [*]   JZ PWM driver  

        *** JZ PWM function pinselect *** 

         [*]     GPIO Port pwm0                                                                                               

         [ ]     GPIO Port pwm1                                                                                

        []GPIO Port pwm2                                                                                               

        [ ]     GPIO Port pwm3                                                                                              

         [ ]     GPIO Port pwm4                                                                                               

         [ ]     GPIO Port E pwm0                                                                                              

         [ ]     GPIO Port E pwm1                                                                                             

         [ ]     GPIO Port E pwm2                                                                                              

         [ ]     GPIO Port E pwm3                                                                                             

         [ ]     GPIO Port E pwm4                                                                                              

         [ ]     GPIO Port E pwm5                                                                                             

         [ ]     GPIO Port D pwm6                                                                                          

         [ ]     GPIO Port D pwm7


如果pwm输出控制LED灯,需要在内核配置

-> Device Drivers

    -> LED Support (NEW_LEDS [=y])

        <*>   PWMdriven LED Support

Defined at drivers/leds/Kconfig:330

Depends on: NEW_LEDS [=y] && LEDS_CLASS [=y]&& PWM [=y]



如果pwm驱动蜂鸣器,配置

Device Drivers  --->
    Input device support  ---> 
        [*]   Miscellaneous devices  --->

        <* >   PWM beeper support (NEW)


pwm驱动所在目录

arch/arm/plat-samsung/pwm-clock.c
arch/arm/mach-imx/devices/platform-mxc_pwm.c
drivers/input/misc/pwm-beeper.c
drivers/clocksource/samsung_pwm_timer.c
drivers/gpu/drm/nouveau/core/subdev/therm/fanpwm.c
drivers/video/backlight/atmel-pwm-bl.c
drivers/video/backlight/pwm_bl.c
drivers/misc/ep93xx_pwm.c
drivers/misc/atmel_pwm.c
drivers/pwm/pwm-imx.c
drivers/pwm/pwm-pxa.c
drivers/pwm/jz_pwm_dev/pwm-class.c
drivers/pwm/jz_pwm_dev/jz-pwm-dev.c
drivers/pwm/pwm-twl-led.c
drivers/pwm/pwm-puv3.c
drivers/pwm/pwm-tiehrpwm.c
drivers/pwm/pwm-spear.c
drivers/pwm/pwm-mxs.c
drivers/pwm/pwm-atmel-tcb.c
drivers/pwm/pwm-jz4740.c
drivers/pwm/pwm-vt8500.c
drivers/pwm/pwm-bfin.c
drivers/pwm/pwm-tipwmss.c
drivers/pwm/pwm-lpc32xx.c
drivers/pwm/pwm-tegra.c
drivers/pwm/pwm-ab8500.c
drivers/pwm/pwm-twl.c
drivers/pwm/pwm-jz.c
drivers/pwm/pwm-samsung.c
drivers/pwm/pwm-tiecap.c
drivers/leds/leds-pwm.c

drivers/leds/leds-atmel-pwm.c



修改内核实现pwm控制LED

需要修改代码:
一、drivers/leds/leds-pwm.c
将文件夹20中的leds_pwm.c文件替换内核中文件drivers/leds/leds-pwm.c




二、在arch/mips/xburst/soc-x1000/chip-x1500/yak/common/board_base.c
添加包含的头文件
#include <linux/pwm.h>
#include <linux/leds_pwm.h>

在static struct jz_platform_device platform_devices_array[] __initdata = {中添加:
#ifdef CONFIG_LEDS_PWM
        DEF_DEVICE(&led_platform_device, 0, 0),
#endif


在static int __init board_base_init(void)中添加如下红色字体所示的代码:

int pdevices_array_size, i;

#ifdef CONFIG_LEDS_PWM
        static struct pwm_lookup jz_pwm_lookup[]= {
        PWM_LOOKUP("jz-pwm", 4,"leds_pwm", "leds_pwm4"),
        };
        pwm_add_table(jz_pwm_lookup,ARRAY_SIZE(jz_pwm_lookup));
#endif

三、在arch/mips/xburst/soc-x1000/chip-x1500/yak/common/board_base.h中添加
#ifdef CONFIG_LEDS_PWM
extern struct platform_device led_platform_device;
#endif

四、在arch/mips/xburst/soc-x1000/chip-x1500/yak/common/misc.c文件中添加:

#include<linux/leds_pwm.h>

#ifdef CONFIG_LEDS_PWM
static struct led_pwm led_pwm[] = {
        {
                .name = "leds_pwm4",
                .default_trigger= "none", //改为timer会起始闪烁,none的话起始常亮
                .pwm_id = 4,
                .active_low = 1,
                .max_brightness = 255,
                .pwm_period_ns = 100000,
        }
};
 
static struct led_pwm_platform_data led_data = {
        .num_leds       = 1,
        .leds           = led_pwm,
};
struct platform_device led_platform_device = {
        .name           = "leds_pwm",
        .id             = -1,
        .num_resources  = 0,
        .dev            = {
                .platform_data  = &led_data,
        }
};
 
//static struct pwm_lookup jz_pwm_lookup[] = {
//      PWM_LOOKUP("jz-pwm", 4, "leds_pwm", "leds_pwm4"),
//};
#endif

五、修改arch/mips/xburst/soc-x1000/common/tcu.c中的
static int tcu_pwm_output_enable(int id)函数中的
if (id > 3) {
改为
if (id > 4) {

上述操作应该是只有pwm4的操作;若需要添加pwm3,
主要添加一个leds_pwm3的注册,还有把下面的num_leds改为2

驱动中选上pwm3的驱动



在内核配置

在内核配置

->Device Drivers                                                                                                                   

    -> Pulse-Width Modulation (PWM) Support (PWM [=y])                                                                                  --- Pulse-Width Modulation (PWM) Support                                                             

            <*>   JZ PWM support for LED or Beeper drivers                                                         

            [*]   JZ PWM driver                                                                                   

            *** JZ PWM function pin select ***                                                           

            [*]     GPIO Port pwm0                                                                               

            [ ]     GPIO Port pwm1                                                                                 

            [ ]     GPIO Port pwm2                                                                               

            [* ]     GPIO Port pwm3                                                                                 

            [* ]     GPIO Port pwm4                                                                               

            [ ]     GPIO Port E pwm0                                                                             

            [ ]     GPIO Port E pwm1                                                                             

            [ ]     GPIO Port E pwm2                                                                             

            [ ]     GPIO Port E pwm3                                                                             

            [ ]     GPIO Port E pwm4                                                                             

            [ ]     GPIO Port E pwm5                                                                             

            [ ]     GPIO Port D pwm6                                                                             

            [ ]     GPIO Port D pwm7



如果pwm输出控制LED灯,需要在内核配置

-> Device Drivers                                                                                                                   

    -> LED Support (NEW_LEDS [=y])

    <*>   LED Class Support
    ......
    <*>   PWM driven LED Support
    ......

      *** LED Triggers ***                                                                           

    [*]   LED Trigger support  --->

        <*>   LED Timer Trigger


操作如下:



# echo timer > /sys/class/leds/leds_pwm4/trigger
# echo none > /sys/class/leds/leds_pwm4/trigger
# echo 255 > /sys/class/leds/leds_pwm4/trigger
sh: write error: Invalid argument
# echo 255 > /sys/class/leds/leds_pwm4/brightness 
# echo 0 > /sys/class/leds/leds_pwm4/brightness 
# echo 255 > /sys/class/leds/leds_pwm4/brightness 
# echo 0 > /sys/class/leds/leds_pwm4/brightness 
# echo 255 > /sys/class/leds/leds_pwm4/brightness 

# echo 0 > /sys/class/leds/leds_pwm4/brightness

在这里添加这项arch/mips/xburst/soc-x1000/chip-x1500/yak/common/misc.c
注意:.pwm_id = 3
.default_trigger = “timer”  //起始闪烁
.default_trigger = “no”  //起始不闪烁或none

A和B的问答:

A时开发者,B是FAE;

A:怎么用c代码操作pwm控制led灯呢?

A:有没有范例呀?
B:直接用system("要执行的echo命令就可以")
B:或者您用文件方式去读写相应的设备节点下的具体文件
A:用文件方式,直接写0-255的数字就可以控制亮度了?
B:可以
A:设置占空比等其他参数怎么通过文件的方式设置呢?
B:或者直接按照我给您邮件里说的echo那些就行
A:用echo只能在板子上调试,没办法写到c代码程序里呀
B:亮度调节调的就是pwm的占空比
B:直接用system("要执行的echo命令就可以")
B:在c中按照上面的可以直接调用命令行的语录
B:用system
A:哦 频率怎么设置呢?
B:频率在板级定定义中设置

B:需要改变频率?


B:您设置的是多少?
A:是的
A:100k
B:这个你根据主要自己修改
A:还需要用pwm3控制照明LED灯;需要重新添加设备代码吗?
A:100K应该可以的
A:其实和pwm4实现的功能是一样的
B:用pwm功能还是普通gpio功能?
A:这两种方式输出有区别吗?
B:pwm亮度可以调节,gpio输出不能调节亮度
A:那还是pwm吧

A:代码需要怎么加呢?


A:只需要在这个结构体数组中添加一项就可以了吗?
B:主要添加一个leds_pwm3的注册,还有把下面的num_leds改为2
B:驱动中选上pwm3的驱动

A:OK


A:这两个id一样吗?
B:忘了改了,pwm3那个改为3
A:.default_trigger=“timer”
A:这一项呢?使用同一个
B:如果默认不闪烁的话,改为none
B:我是昨天测试去掉串口是时候添加的
A:但是这两个灯是分开控制的哦
B:生成两个设备节点
A:默认不闪烁,就改为none了
B:嗯的

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/80215345