blob: 40106f3fd29efed175ff07d72141f3fc9f2badd2 [file] [log] [blame]
b.liu98a8ebf2024-06-14 15:53:25 +08001#include <stdio.h>
2#include <errno.h>
3#include <unistd.h>
4#include <stdlib.h>
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <string.h>
8#include <fcntl.h>
9
10#include "mbtk_log.h"
11#include "mbtk_utils.h"
12#include "mbtk_gpio.h"
13
14
15static int gpio_export(int gpio)
16{
17 int fd = -1;
18 char buffer[50];
19
20 memset(buffer, 0, sizeof(buffer));
21 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
22 if(access(buffer , F_OK) == 0)
23 {
24 LOGD("%d has export.", gpio);
25 return 0;
26 }
27
28 fd = open("/sys/class/gpio/export", O_WRONLY);
29 if(fd < 0)
30 {
31 LOGE("Open gpio export file fail.");
32 return -1;
33 }
34
35 memset(buffer, 0, sizeof(buffer));
36 sprintf(buffer , "%d", gpio);
37 if(write(fd, buffer, strlen(buffer)) <= 0)
38 {
39 LOGE("Gpio[%d] export fail.", gpio);
40 close(fd);
41 return -1;
42 }
43 close(fd);
44 return 0;
45}
46
47static int gpio_unexport(int gpio)
48{
49 int fd = -1;
50 char buffer[50];
51
52 memset(buffer, 0, sizeof(buffer));
53 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
54 if(access(buffer , F_OK))
55 {
56 LOGD("%d not export.", gpio);
57 return 0;
58 }
59
60 fd = open("/sys/class/gpio/unexport", O_WRONLY);
61 if(fd < 0)
62 {
63 LOGE("Open gpio unexport file fail.");
64 return -1;
65 }
66
67 memset(buffer, 0, sizeof(buffer));
68 sprintf(buffer , "%d", gpio);
69 if(write(fd, buffer, strlen(buffer)) <= 0)
70 {
71 LOGE("Gpio[%d] unexport fail.", gpio);
72 close(fd);
73 return -1;
74 }
75 close(fd);
76 return 0;
77}
78
79mbtk_gpio_direct_t mbtk_gpio_direct_get(int gpio)
80{
81 char buffer[50];
82 int fd = -1;
83
84 memset(buffer, 0, sizeof(buffer));
85 sprintf(buffer, "/sys/class/gpio/gpio%d/direction", gpio);
86 fd = open(buffer, O_RDONLY);
87 if(fd < 0)
88 {
89 LOGE("Open gpio[%d] direct fail.", gpio);
90 return MBTK_GPIO_DIRECT_UNKNOWN;
91 }
92
93 memset(buffer, 0x0, sizeof(buffer));
94 if(read(fd, buffer, sizeof(buffer)) <= 0)
95 {
96 LOGE("Get gpio[%d] direct fail.", gpio);
97 close(fd);
98 return MBTK_GPIO_DIRECT_UNKNOWN;
99 }
100 close(fd);
101
102 if(strcmp(buffer, "out") == 0) {
103 return MBTK_GPIO_DIRECT_OUT;
104 } else if(strcmp(buffer, "in") == 0) {
105 return MBTK_GPIO_DIRECT_IN;
106 } else {
107 LOGE("direct : %s", buffer);
108 return MBTK_GPIO_DIRECT_UNKNOWN;
109 }
110}
111
112int mbtk_gpio_direct_set(int gpio, mbtk_gpio_direct_t dir)
113{
114 char buffer[50];
115 int fd = -1;
116 int ret = 0;
117
118 if(gpio_export(gpio)) {
119 return -1;
120 }
121
122 memset(buffer, 0, sizeof(buffer));
123 sprintf(buffer, "/sys/class/gpio/gpio%d/direction", gpio);
124 fd = open(buffer, O_WRONLY);
125 if(fd < 0)
126 {
127 LOGE("Open gpio[%d] direct fail.", gpio);
128 return -1;
129 }
130
131 if(MBTK_GPIO_DIRECT_OUT == dir) {
132 if(write(fd, "out", 3) != 3) {
133 ret = -1;
134 LOGE("Write out fail:%d", errno);
135 }
136 } else if(MBTK_GPIO_DIRECT_IN == dir) {
137 if(write(fd, "in", 2) != 2) {
138 ret = -1;
139 LOGE("Write in fail:%d", errno);
140 }
141 } else {
142 LOGE("Unknown direct : %d", dir);
143 ret = -1;
144 }
145
146 close(fd);
147 return ret;
148}
149
150int mbtk_gpio_value_get(int gpio)
151{
152 char buffer[50];
153 int fd =-1;
154
155 memset(buffer, 0, sizeof(buffer));
156 sprintf(buffer, "/sys/class/gpio/gpio%d/value", gpio);
157 fd = open(buffer, O_RDONLY);
158 if(fd == -1)
159 {
160 LOGE("Open gpio[%d] fail.", gpio);
161 return -1;
162 }
163
164 if(read(fd, buffer, sizeof(buffer)) <= 0)
165 {
166 LOGE("Get gpio[%d] value fail", gpio);
167 close(fd);
168 return -1;
169 }
170
171 close(fd);
172 return atoi(buffer);
173}
174
175int mbtk_gpio_value_set(int gpio, mbtk_gpio_direct_t dir, int value)
176{
177 char buffer[50];
178 int fd = -1;
179 int ret =-1;
180
181 if(gpio_export(gpio)) {
182 return -1;
183 }
184
185 if(mbtk_gpio_direct_set(gpio, dir)) {
186 return -1;
187 }
188
189 memset(buffer, 0, sizeof(buffer));
190 sprintf(buffer, "/sys/class/gpio/gpio%d/value", gpio);
191 fd = open(buffer, O_WRONLY);
192 if(fd == -1)
193 {
194 LOGE("Open gpio[%d] value fail.", gpio);
195 return -1;
196 }
197 if(value == 0) {
198 ret = write(fd, "0", 1);
199 } else {
200 ret = write(fd, "1", 1);
201 }
202
203 close(fd);
204 if(ret != 1)
205 {
206 LOGE("Set gpio[%d] value fail.", gpio);
207 return -1;
208 } else {
209 return 0;
210 }
211}
212
r.xiaoa1493632024-10-25 02:19:35 -0700213int gpio_direct_get(int gpio, char *value, int value_size)
214{
215 char buffer[50]= {0};
216 int file =-1;
217 int result =-1;
218
219 memset(buffer,0,50);
220 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
221 file = open(buffer, O_RDONLY);
222 if(file == -1)
223 {
224 LOGE("Open gpio[%d] direct fail.", gpio);
225 return -1;
226 }
227
228 memset(value, 0x0, value_size);
229 result = read(file,value,value_size);
230 if(result <= 0)
231 {
232 LOGE("Get gpio[%d] direct fail.", gpio);
233 close(file);
234 return -1;
235 }
236 close(file);
237
238 return 0;
239}
240
241int gpio_direct_set(int gpio, char *value)
242{
243 char buffer[50]= {0};
244 int file =-1;
245 int result =-1;
246
247 memset(buffer,0,50);
248 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
249 file = open(buffer, O_WRONLY);
250 if(file == -1)
251 {
252 LOGE("Open gpio[%d] direct fail.", gpio);
253 return -1;
254 }
255
256 result = write(file,value,strlen(value));
257 if(result != strlen(value))
258 {
259 LOGE("Set gpio[%d] direct fail.", gpio);
260 close(file);
261 return -1;
262 }
263 close(file);
264
265 return 0;
266}
267
268int gpio_value_get(int gpio)
269{
270 char buffer[50];
271 char path[10];
272 int file =-1;
273 int result =-1;
274 int value;
275
276 memset(path,0,50);
277 memset(buffer,0,10);
278 sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
279 file = open(path,O_RDONLY);
280 if(file == -1)
281 {
282 LOGE("Open gpio[%d] fail.", gpio);
283 return -1;
284 }
285 result = read(file,buffer,5);
286 if(result <= 0)
287 {
288 LOGE("Get gpio[%d] value fail", gpio);
289 close(file);
290 return -1;
291 }
292 close(file);
293 value = atoi(buffer);
294 return value;
295}
296
297int gpio_value_set(int gpio, int value)
298{
299 char buffer[50]= {0};
300 int file =-1;
301 int result =-1;
302
303 memset(buffer,0,50);
304 sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
305 file = open(buffer,O_WRONLY);
306 if(file == -1)
307 {
308 LOGE("Open gpio[%d] value fail.", gpio);
309 return -1;
310 }
311 if(value == 0) {
312 result = write(file,"0",1);
313 } else {
314 result = write(file,"1",1);
315 }
316 if(result != 1)
317 {
318 LOGE("Set gpio[%d] value fail err =%d.", gpio, errno);
319 close(file);
320 return -1;
321 }
322 close(file);
323
324 return 0;
325}
326
327