This commit is contained in:
mstroh76
2024-01-27 16:33:04 +01:00
parent 6f9b9ecf5c
commit 19874871de
2 changed files with 99 additions and 34 deletions

View File

@@ -88,6 +88,15 @@ char *usage = "Usage: gpio -v\n"
" gpio gbw <channel> <value>" ; // No trailing newline needed here.
int GPIOToSysFS_ExitonFail (const int pin) {
int pinFS = GPIOToSysFS(pin);
if (pinFS<0) {
fprintf (stderr, "%s: invalid sysfs pin of bcm pin %d\n", argv [0], pin) ;
exit (1) ;
}
return pinFS;
}
#ifdef NOT_FOR_NOW
/*
* decodePin:
@@ -391,16 +400,19 @@ static void doI2Cdetect (UNU int argc, char *argv [])
static void doExports (UNU int argc, UNU char *argv [])
{
int fd ;
int i, l, first ;
int pin, l, first ;
char fName [128] ;
char buf [16] ;
for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective
for (first = 0, pin = 0 ; pin < 64 ; ++pin) // Crude, but effective
{
// Try to read the direction
sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ;
int pinFS = GPIOToSysFS(pin);
if (pinFS<0) {
continue;
}
sprintf (fName, "/sys/class/gpio/gpio%d/direction", pinFS) ;
if ((fd = open (fName, O_RDONLY)) == -1)
continue ;
@@ -410,7 +422,11 @@ static void doExports (UNU int argc, UNU char *argv [])
printf ("GPIO Pins exported:\n") ;
}
printf ("%4d: ", i) ;
if(pinFS==pin) {
printf ("%4d: ", pin) ;
} else {
printf ("%4d (%4d): ", pin, pinFS) ;
}
if ((l = read (fd, buf, 16)) == 0)
sprintf (buf, "%s", "?") ;
@@ -425,7 +441,7 @@ static void doExports (UNU int argc, UNU char *argv [])
// Try to Read the value
sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ;
sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ;
if ((fd = open (fName, O_RDONLY)) == -1)
{
printf ("No Value file (huh?)\n") ;
@@ -443,7 +459,7 @@ static void doExports (UNU int argc, UNU char *argv [])
// Read any edge trigger file
sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ;
if ((fd = open (fName, O_RDONLY)) == -1)
{
printf ("\n") ;
@@ -485,7 +501,7 @@ void doExport (int argc, char *argv [])
}
pin = atoi (argv [2]) ;
int pinFS = GPIOToSysFS_ExitonFail(pin);
mode = argv [3] ;
if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL)
@@ -494,10 +510,9 @@ void doExport (int argc, char *argv [])
exit (1) ;
}
fprintf (fd, "%d\n", pin) ;
fprintf (fd, "%d\n", pinFS) ;
fclose (fd) ;
sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/direction", pinFS) ;
if ((fd = fopen (fName, "w")) == NULL)
{
fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
@@ -522,10 +537,10 @@ void doExport (int argc, char *argv [])
// Change ownership so the current user can actually use it
sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ;
changeOwner (argv [0], fName) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ;
changeOwner (argv [0], fName) ;
}
@@ -599,6 +614,7 @@ void doEdge (int argc, char *argv [])
}
pin = atoi (argv [2]) ;
int pinFS = GPIOToSysFS_ExitonFail(pin);
mode = argv [3] ;
// Export the pin and set direction to input
@@ -609,10 +625,10 @@ void doEdge (int argc, char *argv [])
exit (1) ;
}
fprintf (fd, "%d\n", pin) ;
fprintf (fd, "%d\n", pinFS) ;
fclose (fd) ;
sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/direction", pinFS) ;
if ((fd = fopen (fName, "w")) == NULL)
{
fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
@@ -622,7 +638,7 @@ void doEdge (int argc, char *argv [])
fprintf (fd, "in\n") ;
fclose (fd) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ;
if ((fd = fopen (fName, "w")) == NULL)
{
fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
@@ -641,10 +657,10 @@ void doEdge (int argc, char *argv [])
// Change ownership of the value and edge files, so the current user can actually use it!
sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/value", pinFS) ;
changeOwner (argv [0], fName) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
sprintf (fName, "/sys/class/gpio/gpio%d/edge", pinFS) ;
changeOwner (argv [0], fName) ;
fclose (fd) ;
@@ -670,6 +686,7 @@ void doUnexport (int argc, char *argv [])
}
pin = atoi (argv [2]) ;
int pinFS = GPIOToSysFS_ExitonFail(pin);
if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
{
@@ -677,7 +694,7 @@ void doUnexport (int argc, char *argv [])
exit (1) ;
}
fprintf (fd, "%d\n", pin) ;
fprintf (fd, "%d\n", pinFS) ;
fclose (fd) ;
}
@@ -697,13 +714,16 @@ void doUnexportall (char *progName)
for (pin = 0 ; pin < 63 ; ++pin)
{
if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
{
fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
exit (1) ;
int pinFS = GPIOToSysFS(pin);
if (pinFS>=0) {
if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
{
fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
exit (1) ;
}
fprintf (fd, "%d\n", pinFS) ;
fclose (fd) ;
}
fprintf (fd, "%d\n", pin) ;
fclose (fd) ;
}
}