25 #if (defined(__linux__) && !defined(__MINGW32__)) && !defined(ARDUINO) 32 #include <sys/types.h> 39 #define MAX_GPIO_COUNT 256 51 int gpio_export(
int pin)
54 ssize_t bytes_written;
58 snprintf(path,
sizeof(path),
"/sys/class/gpio/gpio%d", pin);
60 if (access(path, F_OK) == 0)
65 fd = open(
"/sys/class/gpio/export", O_WRONLY);
68 fprintf(stderr,
"Failed to allocate gpio pin resources[%d]: %s!\n", pin, strerror (errno));
72 bytes_written = snprintf(buffer,
sizeof(buffer),
"%d", pin);
73 if (write(fd, buffer, bytes_written) < 0)
75 fprintf(stderr,
"Failed to allocate gpio pin resources[%d]: %s!\n", pin, strerror (errno));
83 int gpio_unexport(
int pin)
86 ssize_t bytes_written;
89 fd = open(
"/sys/class/gpio/unexport", O_WRONLY);
92 fprintf(stderr,
"Failed to free gpio pin resources!\n");
96 bytes_written = snprintf(buffer,
sizeof(buffer),
"%d", pin);
97 if (write(fd, buffer, bytes_written) < 0)
99 fprintf(stderr,
"Failed to free gpio pin resources!\n");
105 int gpio_direction(
int pin,
int dir)
107 static const char s_directions_str[] =
"in\0out";
112 snprintf(path,
sizeof(path),
"/sys/class/gpio/gpio%d/direction", pin);
113 fd = open(path, O_WRONLY);
116 fprintf(stderr,
"Failed to set gpio pin direction1[%d]: %s!\n", pin, strerror(errno));
120 if (-1 == write(fd, &s_directions_str[IN == dir ? 0 : 3], IN == dir ? 2 : 3))
122 fprintf(stderr,
"Failed to set gpio pin direction2[%d]: %s!\n", pin, strerror(errno));
130 int gpio_read(
int pin)
136 snprintf(path,
sizeof(path),
"/sys/class/gpio/gpio%d/value", pin);
137 fd = open(path, O_RDONLY);
140 fprintf(stderr,
"Failed to read gpio pin value!\n");
144 if (-1 == read(fd, value_str, 3))
146 fprintf(stderr,
"Failed to read gpio pin value!\n");
152 return(atoi(value_str));
155 int gpio_write(
int pin,
int value)
157 static const char s_values_str[] =
"01";
162 snprintf(path,
sizeof(path),
"/sys/class/gpio/gpio%d/value", pin);
163 fd = open(path, O_WRONLY);
166 fprintf(stderr,
"Failed to set gpio pin value[%d]: %s!\n", pin, strerror(errno));
170 if (1 != write(fd, &s_values_str[LOW == value ? 0 : 1], 1))
172 fprintf(stderr,
"Failed to set gpio pin value[%d]: %s!\n", pin, strerror (errno));
180 #if !defined(SDL_EMULATION) 182 static uint8_t s_exported_pin[MAX_GPIO_COUNT] = {0};
183 static uint8_t s_pin_mode[MAX_GPIO_COUNT] = {0};
185 void pinMode(
int pin,
int mode)
187 if (!s_exported_pin[pin])
189 if ( gpio_export(pin)<0 )
193 s_exported_pin[pin] = 1;
197 gpio_direction(pin, OUT);
202 gpio_direction(pin, IN);
207 void digitalWrite(
int pin,
int level)
209 if (!s_exported_pin[pin])
211 if ( gpio_export(pin)<0 )
215 s_exported_pin[pin] = 1;
217 if (!s_pin_mode[pin])
219 pinMode(pin, OUTPUT);
221 gpio_write( pin, level );