diff --git a/selfdrive/common/framebuffer.cc b/selfdrive/common/framebuffer.cc index 30604deb2e..30ef7ae8ea 100644 --- a/selfdrive/common/framebuffer.cc +++ b/selfdrive/common/framebuffer.cc @@ -1,3 +1,4 @@ +#include "util.h" #include #include #include @@ -37,13 +38,9 @@ extern "C" void framebuffer_swap(FramebufferState *s) { } extern "C" bool set_brightness(int brightness) { - FILE *f = fopen("/sys/class/leds/lcd-backlight/brightness", "wb"); - if (f != NULL) { - fprintf(f, "%d", brightness); - fclose(f); - return true; - } - return false; + char bright[64]; + snprintf(bright, sizeof(bright), "%d", brightness); + return 0 == write_file("/sys/class/leds/lcd-backlight/brightness", bright, strlen(bright)); } extern "C" void framebuffer_set_power(FramebufferState *s, int mode) { diff --git a/selfdrive/common/gpio.cc b/selfdrive/common/gpio.cc index fd68bcd523..8a72388d46 100644 --- a/selfdrive/common/gpio.cc +++ b/selfdrive/common/gpio.cc @@ -1,75 +1,29 @@ #include "gpio.h" +#include "util.h" #include #include -#include +#include // 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); } diff --git a/selfdrive/common/util.c b/selfdrive/common/util.c index ec38824b72..33930f9ec1 100644 --- a/selfdrive/common/util.c +++ b/selfdrive/common/util.c @@ -3,7 +3,8 @@ #include #include #include - +#include +#include #ifdef __linux__ #include #include @@ -41,6 +42,16 @@ void* read_file(const char* path, size_t* out_len) { return buf; } +int write_file(const char* path, const void* data, size_t size) { + int fd = open(path, O_WRONLY); + if (fd == -1) { + return -1; + } + ssize_t n = write(fd, data, size); + close(fd); + return n == size ? 0 : -1; +} + void set_thread_name(const char* name) { #ifdef __linux__ // pthread_setname_np is dumb (fails instead of truncates) diff --git a/selfdrive/common/util.h b/selfdrive/common/util.h index a9052146c7..18d9619ce0 100644 --- a/selfdrive/common/util.h +++ b/selfdrive/common/util.h @@ -41,6 +41,7 @@ extern "C" { // Returns NULL on failure, otherwise the NULL-terminated file contents. // The result must be freed by the caller. void* read_file(const char* path, size_t* out_len); +int write_file(const char* path, const void* data, size_t size); void set_thread_name(const char* name);