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