blob: 344c0114910909a4a35d769ebeda1285de205a3c [file] [log] [blame]
b.liu5fa9e772023-11-23 18:00:55 +08001#include "mbtk_type.h"
b.liu4e243dc2023-11-27 11:20:00 +08002#include "lynq-gpio.h"
r.xiaof6ec4822024-04-03 02:46:00 -07003#include "unistd.h"
4#include "fcntl.h"
5#include "mbtk_log.h"
6
7static int gpio_export(int gpio)
8{
9 int index=0;
10 int file=-1;
11 int result =-1;
12 char pin_index_buffer[5]= {0};
13
14 char buffer[50];
15 memset(buffer,0,50);
16 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
17 if(access(buffer , F_OK) == 0)
18 {
19 LOGD("%d has export.", gpio);
20 return 0;
21 }
22
23 file = open("/sys/class/gpio/export",O_WRONLY);
24 if(file == -1)
25 {
26 LOGE("Open gpio export file fail.");
27 return -1;
28 }
29
30 memset(pin_index_buffer,0,5);
31 sprintf(pin_index_buffer,"%d", gpio);
32 result = write(file,pin_index_buffer,strlen(pin_index_buffer));
33 if(result < 0)
34 {
35 LOGE("Gpio[%d] export fail.", gpio);
36 close(file);
37 return -1;
38 }
39 close(file);
40
41 return 0;
42}
43
44static int gpio_unexport(int gpio)
45{
46 int index=0;
47 int file=-1;
48 int result =-1;
49 char pin_index_buffer[5]= {0};
50 char buffer[50];
51 memset(buffer,0,50);
52 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
53 if(access(buffer , F_OK) == -1)
54 {
55 LOGD("%d not export.", gpio);
56 return 0;
57 }
58
59 file = open("/sys/class/gpio/unexport",O_WRONLY);
60 if(file == -1)
61 {
62 LOGE("Open gpio unexport file fail.");
63 return -1;
64 }
65
66 memset(pin_index_buffer,0,5);
67 sprintf(pin_index_buffer,"%d", gpio);
68 result=write(file,pin_index_buffer,strlen(pin_index_buffer));
69 if(result < 0)
70 {
71 close(file);
72 LOGE("Gpio[%d] unexport fail.", gpio);
73 return -1;
74 }
75 close(file);
76
77 return 0;
78}
79
80static int gpio_direct_get(int gpio, char *value, int value_size)
81{
82 char buffer[50]= {0};
83 int file =-1;
84 int result =-1;
85
86 memset(buffer,0,50);
87 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
88 file = open(buffer, O_RDONLY);
89 if(file == -1)
90 {
91 LOGE("Open gpio[%d] direct fail.", gpio);
92 return -1;
93 }
94
95 memset(value, 0x0, value_size);
96 result = read(file,value,value_size);
97 if(result <= 0)
98 {
99 LOGE("Get gpio[%d] direct fail.", gpio);
100 close(file);
101 return -1;
102 }
103 close(file);
104
105 return 0;
106}
107
108
109static int gpio_direct_set(int gpio, char *value)
110{
111 char buffer[50]= {0};
112 int file =-1;
113 int result =-1;
114
115 memset(buffer,0,50);
116 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
117 file = open(buffer, O_WRONLY);
118 if(file == -1)
119 {
120 LOGE("Open gpio[%d] direct fail.", gpio);
121 return -1;
122 }
123
124 result = write(file,value,strlen(value));
125 if(result != strlen(value))
126 {
127 LOGE("Set gpio[%d] direct fail.", gpio);
128 close(file);
129 return -1;
130 }
131 close(file);
132
133 return 0;
134}
135
136static int gpio_value_get(int gpio)
137{
138 char buffer[50];
139 char path[10];
140 int file =-1;
141 int result =-1;
142 int value;
143
144 memset(path,0,50);
145 memset(buffer,0,10);
146 sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
147 file = open(path,O_RDONLY);
148 if(file == -1)
149 {
150 LOGE("Open gpio[%d] fail.", gpio);
151 return -1;
152 }
153 result = read(file,buffer,5);
154 if(result <= 0)
155 {
156 LOGE("Get gpio[%d] value fail", gpio);
157 close(file);
158 return -1;
159 }
160 close(file);
161 value = atoi(buffer);
162 return value;
163}
164
165static int gpio_value_set(int gpio, int value)
166{
167 char buffer[50]= {0};
168 int file =-1;
169 int result =-1;
170
171 memset(buffer,0,50);
172 sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
173 file = open(buffer,O_WRONLY);
174 if(file == -1)
175 {
176 LOGE("Open gpio[%d] value fail.", gpio);
177 return -1;
178 }
179 if(value == 0) {
180 result = write(file,"0",1);
181 } else {
182 result = write(file,"1",1);
183 }
184 if(result != 1)
185 {
186 LOGE("Set gpio[%d] value fail.", gpio);
187 close(file);
188 return -1;
189 }
190 close(file);
191
192 return 0;
193}
194
b.liu5fa9e772023-11-23 18:00:55 +0800195
196int lynq_gpio_init(int gpio, int direction, int value, int pullsel)
197{
r.xiaof6ec4822024-04-03 02:46:00 -0700198 //UNUSED(gpio);
199 //UNUSED(direction);
200 //UNUSED(value);
b.liu5fa9e772023-11-23 18:00:55 +0800201 UNUSED(pullsel);
202
r.xiaod5764fb2024-04-07 00:30:29 -0700203 if (direction != 1 || direction != 0)
204 {
205 LOGE("[lynq_gpio_init] direction fail.");
206 return -1;
207 }
208
209 if (value != 1 || value != 0)
210 {
211 LOGE("[lynq_gpio_init] value fail.");
212 return -1;
213 }
214
r.xiaof6ec4822024-04-03 02:46:00 -0700215 if(gpio_export(gpio))
216 {
r.xiaod5764fb2024-04-07 00:30:29 -0700217 LOGE("[lynq_gpio_init]gpio_export fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700218 return -1;
219 }
220
221 if(gpio_direct_set(gpio, direction == 0 ? "in" : "out"))
222 {
r.xiaod5764fb2024-04-07 00:30:29 -0700223 LOGE("[lynq_gpio_init]gpio_direct_set fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700224 return -1;
225 }
226
227 if(gpio_value_set(gpio, value))
228 {
r.xiaod5764fb2024-04-07 00:30:29 -0700229 LOGE("[lynq_gpio_init]gpio_value_set fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700230 return -1;
231 }
232
233
b.liu5fa9e772023-11-23 18:00:55 +0800234 return 0;
235}
236
237int lynq_gpio_deinit(int gpio)
238{
239 UNUSED(gpio);
240
r.xiaof6ec4822024-04-03 02:46:00 -0700241 if(gpio_unexport(gpio))
242 {
r.xiaod5764fb2024-04-07 00:30:29 -0700243 LOGE("[lynq_gpio_deinit]gpio_unexport fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700244 return -1;
245 }
246
b.liu5fa9e772023-11-23 18:00:55 +0800247 return 0;
248}
249
250int lynq_gpio_direction_set(int gpio, int direction)
251{
r.xiaof6ec4822024-04-03 02:46:00 -0700252 //UNUSED(gpio);
253 //UNUSED(direction);
254
255 if(gpio_direct_set(gpio, direction == 0 ? "in" : "out"))
256 {
r.xiaod5764fb2024-04-07 00:30:29 -0700257 LOGE("[lynq_gpio_direction_set]gpio_direct_set fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700258 return -1;
259 }
b.liu5fa9e772023-11-23 18:00:55 +0800260
261 return 0;
262}
263
264
265int lynq_gpio_value_set(int gpio, int value)
266{
r.xiaof6ec4822024-04-03 02:46:00 -0700267 //UNUSED(gpio);
268 //UNUSED(value);
269
270 if(gpio_value_set(gpio, value))
271 {
r.xiaod5764fb2024-04-07 00:30:29 -0700272 LOGE("[lynq_gpio_value_set]gpio_value_set fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700273 return -1;
274 }
b.liu5fa9e772023-11-23 18:00:55 +0800275
276 return 0;
277}
278
279int lynq_gpio_value_get(int gpio)
280{
r.xiaof6ec4822024-04-03 02:46:00 -0700281 //UNUSED(gpio);
282 int ret = -1;
b.liu5fa9e772023-11-23 18:00:55 +0800283
r.xiaof6ec4822024-04-03 02:46:00 -0700284 ret = gpio_value_get(gpio);
285 if (ret == -1)
286 {
r.xiaod5764fb2024-04-07 00:30:29 -0700287 LOGE("[lynq_gpio_value_get]gpio_value_get fail.");
r.xiaof6ec4822024-04-03 02:46:00 -0700288 return -1;
289 }
290
291 return ret;
b.liu5fa9e772023-11-23 18:00:55 +0800292}
293
294int lynq_gpio_pullsel_set(int gpio, int pullsel)
295{
r.xiaod5764fb2024-04-07 00:30:29 -0700296 //UNUSED(gpio);
297 //UNUSED(pullsel);
298 int ret = -1;
299 int value_t;
b.liu5fa9e772023-11-23 18:00:55 +0800300
r.xiaod5764fb2024-04-07 00:30:29 -0700301 if (pullsel == 1)
302 value_t = 0;
303 else if (pullsel == 2)
304 value_t = 1;
305 else
306 {
307 LOGE("[lynq_gpio_pullsel_set] value_t fail.");
308 return -1;
309 }
310
311 ret = gpio_value_set(gpio, value_t);
312 if(ret == -1)
313 {
314 LOGE("[lynq_gpio_pullsel_set]gpio_value_set() fail.");
315 return -1;
316 }
317
318 return ret;
b.liu5fa9e772023-11-23 18:00:55 +0800319}
320
321
322int lynq_gpio_pullsel_get(int gpio)
323{
r.xiaod5764fb2024-04-07 00:30:29 -0700324 //UNUSED(gpio);
325 int ret = -1;
b.liu5fa9e772023-11-23 18:00:55 +0800326
r.xiaod5764fb2024-04-07 00:30:29 -0700327 ret = gpio_value_get(gpio);
328 if (ret == -1)
329 {
330 LOGE("[lynq_gpio_pullsel_get]gpio_value_get() fail.");
331 return -1;
332 }
333
334 return ret + 1;
b.liu5fa9e772023-11-23 18:00:55 +0800335}
336
337
338