add function write_file() (#2181)
* add function write_file() * handle EAGIN & EWOULDBLOCK * don't handle errnopull/2213/head
parent
861ef4a397
commit
6476207009
4 changed files with 24 additions and 61 deletions
@ -1,75 +1,29 @@ |
||||
#include "gpio.h" |
||||
#include "util.h" |
||||
#include <fcntl.h> |
||||
#include <unistd.h> |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
|
||||
// We assume that all pins have already been exported on boot,
|
||||
// and that we have permission to write to them.
|
||||
|
||||
int gpio_init(int pin_nr, bool output){ |
||||
int ret = 0; |
||||
int fd = -1, tmp; |
||||
|
||||
char pin_dir_path[50]; |
||||
int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path), |
||||
"/sys/class/gpio/gpio%d/direction", pin_nr); |
||||
if(pin_dir_path_len <= 0){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
|
||||
fd = open(pin_dir_path, O_WRONLY); |
||||
if(fd == -1){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
if(output){ |
||||
tmp = write(fd, "out", 3); |
||||
if(tmp != 3){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
} else { |
||||
tmp = write(fd, "in", 2); |
||||
if(tmp != 2){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
} |
||||
|
||||
cleanup: |
||||
if(fd >= 0){ |
||||
close(fd); |
||||
return -1; |
||||
} |
||||
return ret; |
||||
const char *value = output ? "out" : "in"; |
||||
return write_file(pin_dir_path, (void*)value, strlen(value)); |
||||
} |
||||
|
||||
int gpio_set(int pin_nr, bool high){ |
||||
int ret = 0; |
||||
int fd = -1, tmp; |
||||
|
||||
char pin_val_path[50]; |
||||
int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path), |
||||
"/sys/class/gpio/gpio%d/value", pin_nr); |
||||
if(pin_val_path_len <= 0){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
|
||||
fd = open(pin_val_path, O_WRONLY); |
||||
if(fd == -1){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
tmp = write(fd, high ? "1" : "0", 1); |
||||
if(tmp != 1){ |
||||
ret = -1; |
||||
goto cleanup; |
||||
} |
||||
|
||||
cleanup: |
||||
if(fd >= 0){ |
||||
close(fd); |
||||
return -1; |
||||
} |
||||
return ret; |
||||
return write_file(pin_val_path, (void*)(high ? "1" : "0"), 1); |
||||
} |
||||
|
Loading…
Reference in new issue