123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include "common/gpio.h"
- #include <string>
- #ifdef __APPLE__
- int gpio_init(int pin_nr, bool output) {
- return 0;
- }
- int gpio_set(int pin_nr, bool high) {
- return 0;
- }
- int gpiochip_get_ro_value_fd(const char* consumer_label, int gpiochiop_id, int pin_nr) {
- return 0;
- }
- #else
- #include <fcntl.h>
- #include <unistd.h>
- #include <cstring>
- #include <linux/gpio.h>
- #include <sys/ioctl.h>
- #include "common/util.h"
- #include "common/swaglog.h"
- int gpio_init(int pin_nr, bool output) {
- 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) {
- return -1;
- }
- const char *value = output ? "out" : "in";
- return util::write_file(pin_dir_path, (void*)value, strlen(value));
- }
- int gpio_set(int pin_nr, bool high) {
- 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) {
- return -1;
- }
- return util::write_file(pin_val_path, (void*)(high ? "1" : "0"), 1);
- }
- int gpiochip_get_ro_value_fd(const char* consumer_label, int gpiochiop_id, int pin_nr) {
- // Assumed that all interrupt pins are unexported and rights are given to
- // read from gpiochip0.
- std::string gpiochip_path = "/dev/gpiochip" + std::to_string(gpiochiop_id);
- int fd = open(gpiochip_path.c_str(), O_RDONLY);
- if (fd < 0) {
- LOGE("Error opening gpiochip0 fd");
- return -1;
- }
- // Setup event
- struct gpioevent_request rq;
- rq.lineoffset = pin_nr;
- rq.handleflags = GPIOHANDLE_REQUEST_INPUT;
- /* Requesting both edges as the data ready pulse from the lsm6ds sensor is
- very short(75us) and is mostly detected as falling edge instead of rising.
- So if it is detected as rising the following falling edge is skipped. */
- rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES;
- strncpy(rq.consumer_label, consumer_label, std::size(rq.consumer_label) - 1);
- int ret = util::safe_ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &rq);
- if (ret == -1) {
- LOGE("Unable to get line event from ioctl : %s", strerror(errno));
- close(fd);
- return -1;
- }
- close(fd);
- return rq.fd;
- }
- #endif
|