Skip to content

Commit

Permalink
Minor update
Browse files Browse the repository at this point in the history
- Try using gpiochip4 then 0 if that fails to support RPi5
- Remove old GPIO code
  • Loading branch information
TMRh20 committed Feb 13, 2024
1 parent 6a78ecf commit edab1cd
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 161 deletions.
168 changes: 9 additions & 159 deletions utility/SPIDEV/gpio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,7 @@
#include <sys/stat.h>
#include <getopt.h>

const char* dev_name = "/dev/gpiochip0";

#define NEWGPIO


//std::map<int, GPIOfdCache_t> GPIO::cache;


char* dev_name = "/dev/gpiochip4";

GPIO::GPIO()
{
Expand All @@ -42,86 +35,23 @@ GPIO::~GPIO()
int fd;

void GPIO::Gopen(int port, int DDR)
{


{
fd = open(dev_name, O_RDONLY);
if (fd >= 0){
close(fd);
}else{
throw GPIOException("Can't open device");
}

#if !defined NEWGPIO


FILE* f;
f = fopen("/sys/class/gpio/export", "w");
if (f == NULL) {
throw GPIOException("can't export GPIO pin .check access rights");
}
fprintf(f, "%d\n", port);
fclose(f);

int counter = 0;
char file[128];
sprintf(file, "/sys/class/gpio/gpio%d/direction", port);

while ((f = fopen(file, "w")) == NULL) { //Wait 10 seconds for the file to be accessible if not open on first attempt
sleep(1);
counter++;
if (counter > 10) {
throw GPIOException("can't access /sys/class/gpio/gpio%d/direction GPIO pin. check access rights");
/*perror("Could not open /sys/class/gpio/gpio%d/direction");
exit(0); */
}
}
int l = (DDR == 0) ? fprintf(f, "in\n") : fprintf(f, "out\n");
if (!(l == 3 || l == 4)) {
fclose(f);
throw GPIOException("can't set direction on GPIO pin. check access rights");
}
/*
if (DDR == 0)
fprintf(f, "in\n");
else
printf(f, "out\n");
*/
fclose(f);

// Caches the GPIO descriptor;
sprintf(file, "/sys/class/gpio/gpio%d/value", port);
int flags = (DDR == 0) ? O_RDONLY : O_WRONLY;
int fd = ::open(file, flags);
if (fd < 0) {
throw GPIOException("Can't open the GPIO");
}
else {
cache[port] = fd; // cache the fd;
lseek(fd, SEEK_SET, 0);
dev_name = "/dev/gpiochip0";
fd = open(dev_name, O_RDONLY);
if (fd >= 0){
close(fd);
}else{
throw GPIOException("can't open /dev/gpiochip");
}
#endif

}
}

void GPIO::Gclose(int port)
{
close(fd);
#if !defined NEWGPIO
std::map<int, GPIOfdCache_t>::iterator i;
i = cache.find(port);
if (i != cache.end()) {
close(i->second); // close the cached fd
cache.erase(i); // Delete cache entry
}
// Do unexport
FILE* f;
f = fopen("/sys/class/gpio/unexport", "w");
if (f != NULL) {
fprintf(f, "%d\n", port);
fclose(f);
}
#endif
}

int GPIO::Gread(int port)
Expand Down Expand Up @@ -151,45 +81,6 @@ int GPIO::Gread(int port)
}
return -1;

#if !defined NEWGPIO
std::map<int, GPIOfdCache_t>::iterator i;
int fd;
i = cache.find(port);
if (i == cache.end()) { // Fallback to open the gpio
GPIO::open(port, GPIO::DIRECTION_IN);
i = cache.find(port);
if (i == cache.end()) {
throw GPIOException("can't access to GPIO");
}
else {
fd = i->second;
}
}
else {
fd = i->second;
}

char c;
if (lseek(fd, 0, SEEK_SET) == 0 && ::read(fd, &c, 1) == 1) {
return (c == '0') ? 0 : 1;
}
else {
throw GPIOException("can't access to GPIO");
}

/*
FILE *f;
char file[128];
sprintf(file, "/sys/class/gpio/gpio%d/value", port);
f = fopen(file, "r");
int i;
fscanf(f, "%d", &i);
fclose(f);
return i;
*/
#endif
}

void GPIO::Gwrite(int port, int value)
Expand Down Expand Up @@ -219,46 +110,5 @@ void GPIO::Gwrite(int port, int value)
return;
}
close(rq.fd);

#if !defined NEWGPIO
std::map<int, GPIOfdCache_t>::iterator i;
int fd;
i = cache.find(port);
if (i == cache.end()) { // Fallback to open the gpio
GPIO::open(port, GPIO::DIRECTION_OUT);
i = cache.find(port);
if (i == cache.end()) {
throw GPIOException("can't access to GPIO");
}
else {
fd = i->second;
}
}
else {
fd = i->second;
}

if (lseek(fd, 0, SEEK_SET) != 0) {
throw GPIOException("can't access to GPIO");
}
int l = (value == 0) ? ::write(fd, "0\n", 2) : ::write(fd, "1\n", 2);
if (l != 2) {
throw GPIOException("can't access to GPIO");
}

/*
FILE *f;
char file[128];
sprintf(file, "/sys/class/gpio/gpio%d/value", port);
f = fopen(file, "w");
if (value == 0)
fprintf(f, "0\n");
else
fprintf(f, "1\n");

fclose(f);
*/
#endif
}
3 changes: 1 addition & 2 deletions utility/SPIDEV/gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ class GPIO
virtual ~GPIO();

private:
/* fd cache */
//static std::map<int, GPIOfdCache_t> cache;

};

#endif // RF24_UTILITY_SPIDEV_GPIO_H_

0 comments on commit edab1cd

Please sign in to comment.