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.
25 #include "peripheral_common.h"
27 #define SYSFS_PWM_PATH "/sys/class/pwm"
29 #define PATH_BUF_MAX 64
30 #define PWM_BUF_MAX 16
31 #define MAX_ERR_LEN 255
33 int pwm_open(int device, int channel)
36 char pwm_dev[PATH_BUF_MAX] = {0};
37 char pwm_buf[PWM_BUF_MAX] = {0};
39 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/export", device);
40 fd = open(pwm_dev, O_WRONLY);
42 char errmsg[MAX_ERR_LEN];
43 strerror_r(errno, errmsg, MAX_ERR_LEN);
44 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
48 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", channel);
49 status = write(fd, pwm_buf, len);
51 _E("Failed to export pwmchip%d, pwm%", device, channel);
60 int pwm_close(int device, int channel)
63 char pwm_dev[PATH_BUF_MAX] = {0};
64 char pwm_buf[PWM_BUF_MAX] = {0};
66 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/unexport", device);
67 fd = open(pwm_dev, O_WRONLY);
69 char errmsg[MAX_ERR_LEN];
70 strerror_r(errno, errmsg, MAX_ERR_LEN);
71 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
75 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", channel);
76 status = write(fd, pwm_buf, len);
78 _E("Failed to unexport pwmchip%d, pwm%", device, channel);
87 int pwm_set_period(int device, int channel, int period)
90 char pwm_buf[PWM_BUF_MAX] = {0};
91 char pwm_dev[PATH_BUF_MAX] = {0};
93 _D("Set period : %d, device : %d, channel : %d", period, device, channel);
94 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/period", device, channel);
95 fd = open(pwm_dev, O_WRONLY);
97 char errmsg[MAX_ERR_LEN];
98 strerror_r(errno, errmsg, MAX_ERR_LEN);
99 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
103 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", period);
104 status = write(fd, pwm_buf, len);
107 _E("Failed to set period, path : %s", pwm_dev);
115 int pwm_get_period(int device, int channel, int *period)
117 int fd, result, status;
118 char pwm_buf[PWM_BUF_MAX] = {0};
119 char pwm_dev[PATH_BUF_MAX] = {0};
121 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/period", device, channel);
122 fd = open(pwm_dev, O_RDONLY);
124 char errmsg[MAX_ERR_LEN];
125 strerror_r(errno, errmsg, MAX_ERR_LEN);
126 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
130 status = read(fd, pwm_buf, PWM_BUF_MAX);
133 _E("Failed to get period, path : %s", pwm_dev);
136 result = atoi(pwm_buf);
143 int pwm_set_duty_cycle(int device, int channel, int duty_cycle)
146 char pwm_buf[PWM_BUF_MAX] = {0};
147 char pwm_dev[PATH_BUF_MAX] = {0};
149 _D("Set duty_cycle : %d, device : %d, channel : %d", duty_cycle, device, channel);
150 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/duty_cycle", device, channel);
151 fd = open(pwm_dev, O_WRONLY);
153 char errmsg[MAX_ERR_LEN];
154 strerror_r(errno, errmsg, MAX_ERR_LEN);
155 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
159 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", duty_cycle);
160 status = write(fd, pwm_buf, len);
163 _E("Failed to set duty cycle, path : %s", pwm_dev);
171 int pwm_get_duty_cycle(int device, int channel, int *duty_cycle)
173 int fd, result, status;
174 char pwm_buf[PWM_BUF_MAX] = {0};
175 char pwm_dev[PATH_BUF_MAX] = {0};
177 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/duty_cycle", device, channel);
178 fd = open(pwm_dev, O_RDONLY);
180 char errmsg[MAX_ERR_LEN];
181 strerror_r(errno, errmsg, MAX_ERR_LEN);
182 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
186 status = read(fd, pwm_buf, PWM_BUF_MAX);
189 _E("Failed to get duty cycle, path : %s", pwm_dev);
192 result = atoi(pwm_buf);
193 *duty_cycle = result;
199 int pwm_set_polarity(int device, int channel, pwm_polarity_e polarity)
202 char pwm_dev[PATH_BUF_MAX] = {0};
204 _D("Set polarity : %d, device : %d, channel : %d", polarity, device, channel);
205 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/polarity", device, channel);
206 fd = open(pwm_dev, O_WRONLY);
208 char errmsg[MAX_ERR_LEN];
209 strerror_r(errno, errmsg, MAX_ERR_LEN);
210 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
214 if (polarity == PWM_POLARITY_NORMAL)
215 status = write(fd, "normal", strlen("normal")+1);
216 else if (polarity == PWM_POLARITY_INVERSED)
217 status = write(fd, "inversed", strlen("inversed")+1);
219 _E("Invalid pwm polarity : %d", polarity);
226 _E("Failed to set polarity, path : %s", pwm_dev);
234 int pwm_get_polarity(int device, int channel, pwm_polarity_e *polarity)
237 char pwm_buf[PWM_BUF_MAX] = {0};
238 char pwm_dev[PATH_BUF_MAX] = {0};
240 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/polarity", device, channel);
241 fd = open(pwm_dev, O_RDONLY);
243 char errmsg[MAX_ERR_LEN];
244 strerror_r(errno, errmsg, MAX_ERR_LEN);
245 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
249 status = read(fd, pwm_buf, PWM_BUF_MAX);
251 _E("Failed to get polarity, path : %s", pwm_dev);
256 if (0 == strncmp(pwm_buf, "normal", strlen("normal")))
257 *polarity = PWM_POLARITY_NORMAL;
258 else if (0 == strncmp(pwm_buf, "inversed", strlen("inversed")))
259 *polarity = PWM_POLARITY_INVERSED;
262 _E("Invalid pwm polarity : %d", pwm_buf);
270 int pwm_set_enable(int device, int channel, int enable)
273 char pwm_buf[PWM_BUF_MAX] = {0};
274 char pwm_dev[PATH_BUF_MAX] = {0};
276 _D("Set enable : %d, device : %d, channel : %d", enable, device, channel);
277 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/enable", device, channel);
278 fd = open(pwm_dev, O_WRONLY);
280 char errmsg[MAX_ERR_LEN];
281 strerror_r(errno, errmsg, MAX_ERR_LEN);
282 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
286 len = snprintf(pwm_buf, sizeof(pwm_buf), "%d", enable);
287 status = write(fd, pwm_buf, len);
290 _E("Failed to set enable, path : %s", pwm_dev);
298 int pwm_get_enable(int device, int channel, int *enable)
300 int fd, result, status;
301 char pwm_buf[PWM_BUF_MAX] = {0};
302 char pwm_dev[PATH_BUF_MAX] = {0};
304 snprintf(pwm_dev, PATH_BUF_MAX, SYSFS_PWM_PATH "/pwmchip%d/pwm%d/enable", device, channel);
305 fd = open(pwm_dev, O_RDONLY);
307 char errmsg[MAX_ERR_LEN];
308 strerror_r(errno, errmsg, MAX_ERR_LEN);
309 _E("Can't Open %s, errmsg : %s", pwm_dev, errmsg);
313 status = read(fd, pwm_buf, PWM_BUF_MAX);
316 _E("Failed to get enable, path : %s", pwm_dev);
319 result = atoi(pwm_buf);