blob: 0116f600163a6e644e749db3c9df88ff50bc1dff [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