2 * Copyright (c) 2016-2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 #include "peripheral_common.h"
28 #define SYSFS_PWM_PATH "/sys/class/pwm"
30 #define PATH_BUF_MAX 64
31 #define PWM_BUF_MAX 16
32 #define MAX_ERR_LEN 255
34 int pwm_open(int chip, int pin)
37 char pwm_dev[PATH_BUF_MAX] = {0};
38 char pwm_buf[PWM_BUF_MAX] = {0};
40 _D("chip : %d, pin : %d", chip, pin);
42 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/export", chip);
43 fd = open(pwm_dev, O_WRONLY);
45 char errmsg[MAX_ERR_LEN];
46 strerror_r(errno, errmsg, MAX_ERR_LEN);
47 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
51 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", pin);
52 status = write(fd, pwm_buf, len);
54 _E("Failed to export pwmchip%d, pwm%d", chip, pin);
63 int pwm_close(int chip, int pin)
66 char pwm_dev[PATH_BUF_MAX] = {0};
67 char pwm_buf[PWM_BUF_MAX] = {0};
69 _D("chip : %d, pin : %d", chip, pin);
71 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/unexport", chip);
72 fd = open(pwm_dev, O_WRONLY);
74 char errmsg[MAX_ERR_LEN];
75 strerror_r(errno, errmsg, MAX_ERR_LEN);
76 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
80 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", pin);
81 status = write(fd, pwm_buf, len);
83 _E("Failed to unexport pwmchip%d, pwm%", chip, pin);
92 int pwm_set_period(int chip, int pin, int period)
95 char pwm_buf[PWM_BUF_MAX] = {0};
96 char pwm_dev[PATH_BUF_MAX] = {0};
98 _D("chip : %d, pin : %d, period : %d", chip, pin, period);
100 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/period", chip, pin);
101 fd = open(pwm_dev, O_WRONLY);
103 char errmsg[MAX_ERR_LEN];
104 strerror_r(errno, errmsg, MAX_ERR_LEN);
105 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
109 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", period);
110 status = write(fd, pwm_buf, len);
113 _E("Failed to set period, path : %s", pwm_dev);
121 int pwm_get_period(int chip, int pin, int *period)
123 int fd, result, status;
124 char pwm_buf[PWM_BUF_MAX] = {0};
125 char pwm_dev[PATH_BUF_MAX] = {0};
127 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/period", chip, pin);
128 fd = open(pwm_dev, O_RDONLY);
130 char errmsg[MAX_ERR_LEN];
131 strerror_r(errno, errmsg, MAX_ERR_LEN);
132 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
136 status = read(fd, pwm_buf, PWM_BUF_MAX);
139 _E("Failed to get period, path : %s", pwm_dev);
142 result = atoi(pwm_buf);
149 int pwm_set_duty_cycle(int chip, int pin, int duty_cycle)
152 char pwm_buf[PWM_BUF_MAX] = {0};
153 char pwm_dev[PATH_BUF_MAX] = {0};
155 _D("chip : %d, pin : %d, duty_cycle : %d", chip, pin, duty_cycle);
157 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/duty_cycle", chip, pin);
158 fd = open(pwm_dev, O_WRONLY);
160 char errmsg[MAX_ERR_LEN];
161 strerror_r(errno, errmsg, MAX_ERR_LEN);
162 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
166 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", duty_cycle);
167 status = write(fd, pwm_buf, len);
170 _E("Failed to set duty cycle, path : %s", pwm_dev);
178 int pwm_get_duty_cycle(int chip, int pin, int *duty_cycle)
180 int fd, result, status;
181 char pwm_buf[PWM_BUF_MAX] = {0};
182 char pwm_dev[PATH_BUF_MAX] = {0};
184 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/duty_cycle", chip, pin);
185 fd = open(pwm_dev, O_RDONLY);
187 char errmsg[MAX_ERR_LEN];
188 strerror_r(errno, errmsg, MAX_ERR_LEN);
189 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
193 status = read(fd, pwm_buf, PWM_BUF_MAX);
196 _E("Failed to get duty cycle, path : %s", pwm_dev);
199 result = atoi(pwm_buf);
200 *duty_cycle = result;
206 int pwm_set_polarity(int chip, int pin, pwm_polarity_e polarity)
209 char pwm_dev[PATH_BUF_MAX] = {0};
211 _D("chip : %d, pin : %d, polarity : %d", chip, pin, polarity);
213 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/polarity", chip, pin);
214 fd = open(pwm_dev, O_WRONLY);
216 char errmsg[MAX_ERR_LEN];
217 strerror_r(errno, errmsg, MAX_ERR_LEN);
218 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
222 if (polarity == PWM_POLARITY_NORMAL)
223 status = write(fd, "normal", strlen("normal")+1);
224 else if (polarity == PWM_POLARITY_INVERSED)
225 status = write(fd, "inversed", strlen("inversed")+1);
227 _E("Invalid pwm polarity : %d", polarity);
234 _E("Failed to set polarity, path : %s", pwm_dev);
242 int pwm_get_polarity(int chip, int pin, pwm_polarity_e *polarity)
245 char pwm_buf[PWM_BUF_MAX] = {0};
246 char pwm_dev[PATH_BUF_MAX] = {0};
248 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/polarity", chip, pin);
249 fd = open(pwm_dev, O_RDONLY);
251 char errmsg[MAX_ERR_LEN];
252 strerror_r(errno, errmsg, MAX_ERR_LEN);
253 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
257 status = read(fd, pwm_buf, PWM_BUF_MAX);
259 _E("Failed to get polarity, path : %s", pwm_dev);
264 if (0 == strncmp(pwm_buf, "normal", strlen("normal")))
265 *polarity = PWM_POLARITY_NORMAL;
266 else if (0 == strncmp(pwm_buf, "inversed", strlen("inversed")))
267 *polarity = PWM_POLARITY_INVERSED;
270 _E("Invalid pwm polarity : %d", pwm_buf);
278 int pwm_set_enable(int chip, int pin, bool enable)
281 char pwm_buf[PWM_BUF_MAX] = {0};
282 char pwm_dev[PATH_BUF_MAX] = {0};
284 _D("chip : %d, pin : %d, enable : %d", chip, pin, enable);
286 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/enable", chip, pin);
287 fd = open(pwm_dev, O_WRONLY);
289 char errmsg[MAX_ERR_LEN];
290 strerror_r(errno, errmsg, MAX_ERR_LEN);
291 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
295 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", enable);
296 status = write(fd, pwm_buf, len);
299 _E("Failed to set enable, path : %s", pwm_dev);
307 int pwm_get_enable(int chip, int pin, bool *enable)
309 int fd, result, status;
310 char pwm_buf[PWM_BUF_MAX] = {0};
311 char pwm_dev[PATH_BUF_MAX] = {0};
313 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/enable", chip, pin);
314 fd = open(pwm_dev, O_RDONLY);
316 char errmsg[MAX_ERR_LEN];
317 strerror_r(errno, errmsg, MAX_ERR_LEN);
318 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
322 status = read(fd, pwm_buf, PWM_BUF_MAX);
325 _E("Failed to get enable, path : %s", pwm_dev);
328 result = atoi(pwm_buf);