summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jakob@kaivo.net>2018-11-10 14:03:13 -0500
committerJakob Kaivo <jakob@kaivo.net>2018-11-10 14:03:13 -0500
commit0a30f3c2324995ec9da685930e0d34b9e1ccae8b (patch)
treee563853a59dddd9394c257bcef2a26922e9e6917
parentb3931d57b8f1a46d3e5d0d50109e80f16427a338 (diff)
complete gpio_init(), room for improvement
-rw-r--r--freeonebook.c190
1 files changed, 102 insertions, 88 deletions
diff --git a/freeonebook.c b/freeonebook.c
index e9be2e2..584013f 100644
--- a/freeonebook.c
+++ b/freeonebook.c
@@ -1,12 +1,14 @@
#include <stdint.h>
#include <stdio.h>
+#include <string.h>
#include <fcntl.h>
#include <unistd.h>
-#define GPIO_EXPORT "/sys/class/gpio/export"
+#define GPIO_BASEDIR "/sys/class/gpio"
+#define GPIO_EXPORT GPIO_BASEDIR "/export"
-#define ENABLE_LEFT_PATH "/sys/class/gpio/gpio5/value"
-#define ENABLE_RIGHT_PATH "/sys/class/gpio/gpio4/value"
+#define ENABLE_LEFT_PATH GPIO_BASEDIR "/gpio5/value"
+#define ENABLE_RIGHT_PATH GPIO_BASEDIR "/gpio4/value"
#define ENABLE_VALUE "1"
@@ -24,101 +26,111 @@ void enable_displays(void)
close(right);
}
+void gpio_write(int port, const char *field, const char *value)
+{
+ char path[256];
+ sprintf(path, "%s/gpio%d/%s", GPIO_BASEDIR, field);
+ int fd = open(path, O_WRONLY);
+ write(fd, value, strlen(value));
+ close(fd);
+}
+
void gpio_init(void)
{
struct {
uint8_t port;
enum { in, out } direction;
+ uint8_t value;
} ports[] = {
- { 100, in }, /* 4a58 */
+ { 100, in },
{ 91, in },
{ 96, in },
{ 89, in },
{ 95, in },
{ 92, in },
- { 108, out }, /* 4aec */
- { 94, out },
- { 101, out }, /* 95, 92 */
+ { 108, out, 0 },
+ { 94, out, 0 },
+ { 101, out, 0 }, /* 95, 92 */
{ 5, out },
{ 4, out },
{ 93, in },
- { 98, out },
- { 90, out },
+ { 98, out, 1 },
+ { 90, out, 1 }, /* 108, 94, 101 */
{ 88, in },
- { 0, out },
- { 1, out },
- { 2, out },
- { 3, out },
- { 6, out },
- { 28, out },
- { 29, out },
- { 30, out },
- { 33, out },
- { 37, out },
- { 38, out },
- { 47, out },
- { 48, out },
- { 49, out },
- { 50, out },
- { 51, out },
- { 52, out },
- { 53, out },
- { 54, out },
- { 55, out },
- { 56, out },
- { 57, out },
- { 58, out },
- { 59, out },
- { 60, out },
- { 61, out },
- { 62, out },
- { 63, out },
- { 64, out },
- { 65, out },
- { 66, out },
- { 67, out },
- { 68, out },
- { 69, out },
- { 70, out },
- { 71, out },
- { 72, out },
- { 73, out },
- { 74, out },
- { 75, out }, /* not enabled */
- { 78, out },
- { 79, out },
- { 86, out },
- { 87, out },
- { 97, out },
- { 99, out },
- { 104, out },
- { 105, out },
- { 106, out },
- { 107, out },
- { 109, out },
- { 110, out },
- { 111, out },
- { 112, out },
- { 113, out },
- { 114, out },
- { 115, out },
- { 116, out },
- { 117, out },
- { 118, out },
- { 119, out },
- { 120, out },
- { 121, out },
- { 122, out },
- { 135, out },
- { 137, out },
- { 138, out },
- { 140, out },
- { 144, out },
- { 145, out },
- { 146, out },
- { 147, out },
- { 148, out },
- { 149, out },
+ { 0, out, 0 },
+ { 1, out, 0 },
+ { 2, out, 0 },
+ { 3, out, 0 },
+ { 6, out, 0 },
+ { 28, out, 0 },
+ { 29, out, 0 },
+ { 30, out, 0 },
+ { 33, out, 0 },
+ { 37, out, 0 },
+ { 38, out, 0 },
+ { 47, out, 0 },
+ { 48, out, 0 },
+ { 49, out, 0 },
+ { 50, out, 0 },
+ { 51, out, 0 },
+ { 52, out, 0 },
+ { 53, out, 0 },
+ { 54, out, 0 },
+ { 55, out, 0 },
+ { 56, out, 0 },
+ { 57, out, 0 },
+ { 58, out, 0 },
+ { 59, out, 0 },
+ { 60, out, 0 },
+ { 61, out, 0 },
+ { 62, out, 0 },
+ { 63, out, 0 },
+ { 64, out, 0 },
+ { 65, out, 0 },
+ { 66, out, 0 },
+ { 67, out, 0 },
+ { 68, out, 0 },
+ { 69, out, 0 },
+ { 70, out, 0 },
+ { 71, out, 0 },
+ { 72, out, 0 },
+ { 73, out, 0 },
+ { 74, out, 0 },
+ { 75, out, 0 }, /* not enabled */
+ { 78, out, 0 },
+ { 79, out, 0 },
+ { 86, out, 0 },
+ { 87, out, 0 },
+ { 97, out, 0 },
+ { 99, out, 0 },
+ { 104, out, 0 },
+ { 105, out, 0 },
+ { 106, out, 0 },
+ { 107, out, 0 },
+ { 109, out, 0 },
+ { 110, out, 0 },
+ { 111, out, 0 },
+ { 112, out, 0 },
+ { 113, out, 0 },
+ { 114, out, 0 },
+ { 115, out, 0 },
+ { 116, out, 0 },
+ { 117, out, 0 },
+ { 118, out, 0 },
+ { 119, out, 0 },
+ { 120, out, 0 },
+ { 121, out, 0 },
+ { 122, out, 0 },
+ { 135, out, 0 },
+ { 137, out, 0 },
+ { 138, out, 0 },
+ { 140, out, 0 },
+ { 144, out, 0 },
+ { 145, out, 0 },
+ { 146, out, 0 },
+ { 147, out, 0 },
+ { 148, out, 0 },
+ { 149, out, 0 },
};
int gpio_export = open(GPIO_EXPORT, O_WRONLY);
for (int i = 0; i < sizeof(ports) / sizeof(ports[0]); i++) {
@@ -128,11 +140,13 @@ void gpio_init(void)
close(gpio_export);
for (int i = 0; i < sizeof(ports) / sizeof(ports[0]); i++) {
- char path[256];
- sprintf(path, "/sys/class/gpio/gpio%hhd/direction", ports[i].port);
- int dir = open(path, O_WRONLY);
- dprintf(dir, "%s", ports[i].direction == in ? "in" : "out");
- close(dir);
+ gpio_write(ports[i].port, "direction", ports[i].direction == in ? "in" : "out");
+ }
+
+ for (int i = 0; i < sizeof(ports) / sizeof(ports[0]); i++) {
+ if (ports[i].direction == out) {
+ gpio_write(ports[i].port, "value", ports[i].value == 1 ? "1" : "0");
+ }
}
}