通过PWM框架注册的PWM设备,可通过sysfs 方式进行操控。sysfs文件路径为/sys/class/pwm。
/sys/class/pwm/pwmchipX表示PWM控制器。
通过 export 导出之后,会生成 pwmX目录。
# export 之后就会生成/sys/class/pwm/pwmchip0/pwmN目录。
echo N > /sys/class/pwm/pwmchip0/export
# 设置PWM一个周期的时间,单位为ns,即一个周期为1KHZ。
echo 1000000 > /sys/class/pwm/pwmchip0/pwmN/period
# 设置PWM一个周期中高电平的时间,单位为ns,即占空比=duty_cycle/period=50%。
echo 500000 > /sys/class/pwm/pwmchip0/pwmN/duty_cycle
echo 1 > /sys/class/pwm/pwmchip0/pwmN/enable
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
static char pwm_path[100];
static int pwm_config(const char *attr, const char *val) //配置PWM
{
char file_path[100];
int len;
int fd;
sprintf(file_path, "%s/%s", pwm_path, attr);
if (0 > (fd = open(file_path, O_WRONLY))) {
perror("open error");
return fd;
}
len = strlen(val);
if (len != write(fd, val, len)) {
perror("write error");
close(fd);
return -1;
}
close(fd); //关闭文件
return 0;
}
int main(int argc, char *argv[])
{
/* 校验传参 */
if (4 != argc) {
fprintf(stderr, "usage: %s <id> <period> <duty>\n",
argv[0]);
exit(-1);
}
/* 打印配置信息 */
printf("PWM config: id<%s>, period<%s>, duty<%s>\n",
argv[1], argv[2],
argv[3]);
/* 导出 pwm */
sprintf(pwm_path, "/sys/class/pwm/pwmchip%s/pwm0", argv[1]);
if (access(pwm_path, F_OK)) {//如果 pwm0 目录不存在, 则导出
char temp[100];
int fd;
sprintf(temp, "/sys/class/pwm/pwmchip%s/export", argv[1]);
if (0 > (fd = open(temp, O_WRONLY))) {
perror("open error");
exit(-1);
}
if (1 != write(fd, "0", 1)) {//导出 pwm
perror("write error");
close(fd);
exit(-1);
}
close(fd); //关闭文件
}
/* 配置 PWM 周期 */
if (pwm_config("period", argv[2]))
exit(-1);
/* 配置占空比 */
if (pwm_config("duty_cycle", argv[3]))
exit(-1);
/* 使能 pwm */
pwm_config("enable", "1");
/* 退出程序 */
exit(0);
}