该芯片提供了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
#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:嗯的