add function write_file() (#2181)
* add function write_file()
* handle EAGIN & EWOULDBLOCK
* don't handle errno
old-commit-hash: 6476207009
commatwo_master
parent
e9642080ac
commit
ef8b6d20fb
4 changed files with 24 additions and 61 deletions
@ -1,75 +1,29 @@ |
|||||||
#include "gpio.h" |
#include "gpio.h" |
||||||
|
#include "util.h" |
||||||
#include <fcntl.h> |
#include <fcntl.h> |
||||||
#include <unistd.h> |
#include <unistd.h> |
||||||
#include <stdio.h> |
#include <string.h> |
||||||
|
|
||||||
// We assume that all pins have already been exported on boot,
|
// We assume that all pins have already been exported on boot,
|
||||||
// and that we have permission to write to them.
|
// and that we have permission to write to them.
|
||||||
|
|
||||||
int gpio_init(int pin_nr, bool output){ |
int gpio_init(int pin_nr, bool output){ |
||||||
int ret = 0; |
|
||||||
int fd = -1, tmp; |
|
||||||
|
|
||||||
char pin_dir_path[50]; |
char pin_dir_path[50]; |
||||||
int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path), |
int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path), |
||||||
"/sys/class/gpio/gpio%d/direction", pin_nr); |
"/sys/class/gpio/gpio%d/direction", pin_nr); |
||||||
if(pin_dir_path_len <= 0){ |
if(pin_dir_path_len <= 0){ |
||||||
ret = -1; |
return -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 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 gpio_set(int pin_nr, bool high){ |
||||||
int ret = 0; |
|
||||||
int fd = -1, tmp; |
|
||||||
|
|
||||||
char pin_val_path[50]; |
char pin_val_path[50]; |
||||||
int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path), |
int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path), |
||||||
"/sys/class/gpio/gpio%d/value", pin_nr); |
"/sys/class/gpio/gpio%d/value", pin_nr); |
||||||
if(pin_val_path_len <= 0){ |
if(pin_val_path_len <= 0){ |
||||||
ret = -1; |
return -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 ret; |
return write_file(pin_val_path, (void*)(high ? "1" : "0"), 1); |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue