-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgpio_control.c
More file actions
146 lines (124 loc) · 3.5 KB
/
gpio_control.c
File metadata and controls
146 lines (124 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "gpio_control.h"
bool setPinValue(int pin_fd, bool value){
int valueInt = value? 1 : 0;
int len = snprintf(NULL, 0, "%d", valueInt);
char* valueStr = malloc(len + 1);
snprintf(valueStr, len + 1, "%d", valueInt);
printf("Setting pin to %s\r\n", valueStr);
int bWritten = write(pin_fd, valueStr, len);
if (bWritten != len) {
printf("Failed to write pin value\r\n");
return false;
}
return true;
}
bool readPinValue(int pin_fd){
//seek to beginning of file
int offset = lseek(pin_fd, 0, SEEK_SET);
if(offset == -1){
printf("Failed to read pin value\r\n");
return false;
}
char buffer[2];
//read the IO
int bytesRead = read(pin_fd, &buffer, 1);
if(bytesRead == -1){
printf("Failed to read pin value file\r\n");
return false;
}
else {
//printf("Pin value was: %c\r\n", buffer[0]);
return buffer[0] == '1';
}
}
int configurePin(int pinNo, bool direction) {
//TODO: check if already exported
//export GPIO pin
int fd = open("/sys/class/gpio/export", O_WRONLY);
if(fd == -1){
printf("Failed to access gpio export file\r\n");
return -1;
}
int len = snprintf( NULL, 0, "%d", pinNo); //determine length of resulting string
char* pinStr = malloc(len + 1); // allocate len + 1 (for null termination)
snprintf(pinStr, len + 1, "%d", pinNo); //int to string
printf("Pin number is %d, %s\r\n", pinNo, pinStr);
int bWritten = write(fd, pinStr, len); //write pin to export
close(fd);
if(bWritten != len){
printf("Failed to export GPIO pin; assuming already exported.\r\n");
}
//open direction file
len = snprintf(NULL, 0, "/sys/class/gpio/gpio%s/direction", pinStr);
char* filePath = malloc(len + 1);
snprintf(filePath, len + 1, "/sys/class/gpio/gpio%s/direction", pinStr);
fd = open(filePath, O_WRONLY);
free(filePath);
if(fd == -1){
printf("Failed to access gpio pin direction file\r\n");
free(pinStr);
return -1;
}
if(direction){
//set pin to be an output pin
bWritten = write(fd, "out", 3);
close(fd);
if(bWritten != 3){
printf("Failed to set pin direction.\r\n");
free(pinStr);
return -1;
}
//open pin for writing
len = snprintf(NULL, 0, "/sys/class/gpio/gpio%s/value", pinStr);
filePath = malloc(len + 1);
snprintf(filePath, len + 1, "/sys/class/gpio/gpio%s/value", pinStr);
fd = open(filePath, O_WRONLY);
free(pinStr);
free(filePath);
if(fd == -1){
printf("Failed to access pin\r\n");
return -1;
}
return fd;
}
else {
//set pin to be an input pin
bWritten = write(fd, "in", 2);
close(fd);
if(bWritten != 2){
printf("Failed to set pin direction.\r\n");
free(pinStr);
return -1;
}
//open pin for reading
len = snprintf(NULL, 0, "/sys/class/gpio/gpio%s/value", pinStr);
filePath = malloc(len + 1);
snprintf(filePath, len + 1, "/sys/class/gpio/gpio%s/value", pinStr);
fd = open(filePath, O_RDONLY);
free(pinStr);
free(filePath);
if(fd == -1){
printf("Failed to access pin\r\n");
return -1;
}
return fd;
}
}
int releasePin(int pinNo){
//clean up and unexport the pin
int fd = open("/sys/class/gpio/unexport", O_WRONLY);
if(fd == -1){
printf("Failed to access gpio unexport\r\n");
return -1;
}
int len = snprintf( NULL, 0, "%d", pinNo); //determine length of resulting string
char* pinStr = malloc(len + 1); // allocate len + 1 (for null termination)
snprintf(pinStr, len + 1, "%d", pinNo); //int to string
int bWritten = write(fd, pinStr, len); //write pin to unexport
if(bWritten != len){
printf("Failed to unexport GPIO pin.\r\n");
return -1;
}
close(fd);
return 0;
}