diff --git a/utility/SPIDEV/RF24_arch_config.h b/utility/SPIDEV/RF24_arch_config.h index fa457fde..be7585b9 100644 --- a/utility/SPIDEV/RF24_arch_config.h +++ b/utility/SPIDEV/RF24_arch_config.h @@ -61,8 +61,8 @@ typedef uint16_t rf24_gpio_pin_t; #define HIGH GPIO::OUTPUT_HIGH #define INPUT GPIO::DIRECTION_IN #define OUTPUT GPIO::DIRECTION_OUT -#define digitalWrite(pin, value) GPIO::write(pin, value) -#define pinMode(pin, direction) GPIO::open(pin, direction) +#define digitalWrite(pin, value) GPIO::Gwrite(pin, value) +#define pinMode(pin, direction) GPIO::Gopen(pin, direction) #define delay(milisec) __msleep(milisec) #define delayMicroseconds(usec) __usleep(usec) #define millis() __millis() diff --git a/utility/SPIDEV/gpio.cpp b/utility/SPIDEV/gpio.cpp index a8986009..10ed514a 100644 --- a/utility/SPIDEV/gpio.cpp +++ b/utility/SPIDEV/gpio.cpp @@ -9,15 +9,27 @@ * * Patched for filedescriptor catching and error control by L Diaz 2018 */ - +#include #include "gpio.h" #include +#include #include #include +#include +#include +#include #include #include +#include + +const char* dev_name = "/dev/gpiochip0"; + +#define NEWGPIO + + +//std::map GPIO::cache; + -std::map GPIO::cache; GPIO::GPIO() { @@ -27,8 +39,20 @@ GPIO::~GPIO() { } -void GPIO::open(int port, int DDR) +int fd; + +void GPIO::Gopen(int port, int DDR) { + + + fd = open(dev_name, O_RDONLY); + if (fd >= 0){ + + } + close(fd); + #if !defined NEWGPIO + + FILE* f; f = fopen("/sys/class/gpio/export", "w"); if (f == NULL) { @@ -74,10 +98,14 @@ void GPIO::open(int port, int DDR) cache[port] = fd; // cache the fd; lseek(fd, SEEK_SET, 0); } + #endif + } -void GPIO::close(int port) +void GPIO::Gclose(int port) { + close(fd); + #if !defined NEWGPIO std::map::iterator i; i = cache.find(port); if (i != cache.end()) { @@ -91,10 +119,29 @@ void GPIO::close(int port) fprintf(f, "%d\n", port); fclose(f); } + #endif } -int GPIO::read(int port) +int GPIO::Gread(int port) { + + struct gpiohandle_request rq; + struct gpiohandle_data data; + int fd, ret; + fd = open(dev_name, O_RDONLY); + if (fd >= 0){ + rq.lineoffsets[0] = port; + rq.flags = GPIOHANDLE_REQUEST_INPUT; + rq.lines = 1; + ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &rq); + close(fd); + ret = ioctl(rq.fd, GPIOHANDLE_GET_LINE_VALUES_IOCTL, &data); + close(rq.fd); + return ret; + } + return -1; + + #if !defined NEWGPIO std::map::iterator i; int fd; i = cache.find(port); @@ -132,10 +179,26 @@ int GPIO::read(int port) fclose(f); return i; */ + #endif } -void GPIO::write(int port, int value) +void GPIO::Gwrite(int port, int value) { + + struct gpiohandle_request rq; + struct gpiohandle_data data; + int fd, ret; + fd = open(dev_name, O_RDONLY); + rq.lineoffsets[0] = port; + rq.flags = GPIOHANDLE_REQUEST_OUTPUT; + rq.lines = 1; + ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &rq); + close(fd); + data.values[0] = value; + ret = ioctl(rq.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data); + close(rq.fd); + + #if !defined NEWGPIO std::map::iterator i; int fd; i = cache.find(port); @@ -175,4 +238,5 @@ void GPIO::write(int port, int value) fclose(f); */ + #endif } diff --git a/utility/SPIDEV/gpio.h b/utility/SPIDEV/gpio.h index c802ce6a..aa7cd629 100644 --- a/utility/SPIDEV/gpio.h +++ b/utility/SPIDEV/gpio.h @@ -17,6 +17,7 @@ #include #include + /** Specific excpetion for SPI errors */ class GPIOException : public std::runtime_error { @@ -41,19 +42,19 @@ class GPIO GPIO(); - static void open(int port, int DDR); + static void Gopen(int port, int DDR); - static void close(int port); + static void Gclose(int port); - static int read(int port); + static int Gread(int port); - static void write(int port, int value); + static void Gwrite(int port, int value); virtual ~GPIO(); - + private: /* fd cache */ - static std::map cache; + //static std::map cache; }; #endif // RF24_UTILITY_SPIDEV_GPIO_H_