Commit | Line | Data |
---|---|---|
35647167 FT |
1 | #include <unistd.h> |
2 | #include <stdlib.h> | |
3 | #include <stdio.h> | |
4 | #include <string.h> | |
5 | #include <fcntl.h> | |
6 | #include <errno.h> | |
7 | #include <err.h> | |
8 | ||
9 | static void setport(int p, int v) | |
10 | { | |
11 | char path[256], line[256]; | |
12 | FILE *fp; | |
13 | int rv; | |
14 | ||
15 | sprintf(path, "/sys/class/gpio/gpio%i/direction", p); | |
16 | if((fp = fopen(path, "r")) == NULL) | |
17 | err(1, "%s", path); | |
18 | rv = !!fgets(line, sizeof(line), fp); | |
19 | fclose(fp); | |
20 | if(!rv || strcmp(line, "out\n")) { | |
21 | if((fp = fopen(path, "w")) == NULL) | |
22 | err(1, "%s", path); | |
23 | fprintf(fp, "out\n"); fflush(fp); | |
24 | if(ferror(fp)) | |
25 | errx(1, "gpio%i: could not set to output", p); | |
26 | fclose(fp); | |
27 | } | |
28 | sprintf(path, "/sys/class/gpio/gpio%i/value", p); | |
29 | if((fp = fopen(path, "w")) == NULL) | |
30 | err(1, "%s", path); | |
31 | fprintf(fp, "%i\n", v); fflush(fp); | |
32 | if(ferror(fp)) | |
33 | errx(1, "gpio%i: could not set value", p); | |
34 | fclose(fp); | |
35 | } | |
36 | ||
37 | int main(int argc, char **argv) | |
38 | { | |
39 | int i, port, val; | |
40 | char *p, *e; | |
41 | ||
42 | for(i = 1; i < argc; i++) { | |
43 | if((p = strchr(argv[i], '=')) == NULL) { | |
44 | fprintf(stderr, "gpio: %s: not of the form PORT=VAL\n", argv[i]); | |
45 | exit(1); | |
46 | } | |
47 | port = strtol(argv[i], &e, 10); | |
48 | if(e != p) { | |
49 | fprintf(stderr, "gpio: %s: not of the form PORT=VAL\n", argv[i]); | |
50 | exit(1); | |
51 | } | |
52 | val = strtol(p + 1, &e, 10); | |
53 | if(*e) { | |
54 | fprintf(stderr, "gpio: %s: not of the form PORT=VAL\n", argv[i]); | |
55 | exit(1); | |
56 | } | |
57 | setport(port, val); | |
58 | } | |
59 | return(0); | |
60 | } |