/* * readall.c: * The readall functions - getting a bit big, so split them out. * Copyright (c) 2012-2018 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #include extern int wpMode ; #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif /* * doReadallExternal: * A relatively crude way to read the pins on an external device. * We don't know the input/output mode of pins, but we can tell * if it's an analog pin or a digital one... ********************************************************************************* */ static void doReadallExternal (void) { int pin ; printf ("+------+---------+--------+\n") ; printf ("| Pin | Digital | Analog |\n") ; printf ("+------+---------+--------+\n") ; for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; printf ("+------+---------+--------+\n") ; } /* * doReadall: * Read all the GPIO pins * We also want to use this to read the state of pins on an externally * connected device, so we need to do some fiddling with the internal * wiringPi node structures - since the gpio command can only use * one external device at a time, we'll use that to our advantage... ********************************************************************************* */ static char *alts [] = { "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" } ; static int physToWpi [64] = { -1, // 0 -1, -1, // 1, 2 8, -1, 9, -1, 7, 15, -1, 16, 0, 1, 2, -1, 3, 4, -1, 5, 12, -1, 13, 6, 14, 10, -1, 11, // 25, 26 30, 31, // Actually I2C, but not used 21, -1, 22, 26, 23, -1, 24, 27, 25, 28, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1 } ; static char *physNames [64] = { NULL, " 3.3v", "5v ", " SDA.1", "5v ", " SCL.1", "0v ", "GPIO. 7", "TxD ", " 0v", "RxD ", "GPIO. 0", "GPIO. 1", "GPIO. 2", "0v ", "GPIO. 3", "GPIO. 4", " 3.3v", "GPIO. 5", " MOSI", "0v ", " MISO", "GPIO. 6", " SCLK", "CE0 ", " 0v", "CE1 ", " SDA.0", "SCL.0 ", "GPIO.21", "0v ", "GPIO.22", "GPIO.26", "GPIO.23", "0v ", "GPIO.24", "GPIO.27", "GPIO.25", "GPIO.28", " 0v", "GPIO.29", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "GPIO.17", "GPIO.18", "GPIO.19", "GPIO.20", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, } ; /* * readallPhys: * Given a physical pin output the data on it and the next pin: *| BCM | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi | BCM | ********************************************************************************* */ static void readallPhys (int physPin) { int pin ; if (physPinToGpio (physPin) == -1) printf (" | | ") ; else printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ; printf (" | %s", physNames [physPin]) ; if (physToWpi [physPin] == -1) printf (" | | ") ; else { /**/ if (wpMode == WPI_MODE_GPIO) pin = physPinToGpio (physPin) ; else if (wpMode == WPI_MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin] ; printf (" | %4s", alts [getAlt (pin)]) ; printf (" | %d", digitalRead (pin)) ; } // Pin numbers: printf (" | %2d", physPin) ; ++physPin ; printf (" || %-2d", physPin) ; // Same, reversed if (physToWpi [physPin] == -1) printf (" | | ") ; else { /**/ if (wpMode == WPI_MODE_GPIO) pin = physPinToGpio (physPin) ; else if (wpMode == WPI_MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin] ; printf (" | %d", digitalRead (pin)) ; printf (" | %-4s", alts [getAlt (pin)]) ; } printf (" | %-5s", physNames [physPin]) ; if (physToWpi [physPin] == -1) printf (" | | ") ; else printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ; printf (" |\n") ; } /* * allReadall: * Read all the pins regardless of the model. Primarily of use for * the compute module, but handy for other fiddling... ********************************************************************************* */ static void allReadall (void) { int pin ; printf ("+-----+------+-------+ +-----+------+-------+\n") ; printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ; printf ("+-----+------+-------+ +-----+------+-------+\n") ; for (pin = 0 ; pin < 27 ; ++pin) { printf ("| %3d ", pin) ; printf ("| %-4s ", alts [getAlt (pin)]) ; printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; printf ("| ") ; printf ("| %3d ", pin + 27) ; printf ("| %-4s ", alts [getAlt (pin + 27)]) ; printf ("| %s ", digitalRead (pin + 27) == HIGH ? "High" : "Low ") ; printf ("|\n") ; } printf ("+-----+------+-------+ +-----+------+-------+\n") ; } /* * abReadall: * Read all the pins on the model A or B. ********************************************************************************* */ void abReadall (int model, int rev) { int pin ; char *type ; if (model == PI_MODEL_A) type = " A" ; else if (rev == PI_VERSION_2) type = "B2" ; else type = "B1" ; printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; for (pin = 1 ; pin <= 26 ; pin += 2) readallPhys (pin) ; if (rev == PI_VERSION_2) // B version 2 { printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; for (pin = 51 ; pin <= 54 ; pin += 2) readallPhys (pin) ; } printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; } /* * piPlusReadall: * Read all the pins on the model A+ or the B+ or actually, all 40-pin Pi's ********************************************************************************* */ static void plus2header (int model) { /**/ if (model == PI_MODEL_AP) printf (" +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_BP) printf (" +-----+-----+---------+------+---+---Pi B+--+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_ZERO) printf (" +-----+-----+---------+------+---+-Pi Zero--+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_ZERO_W) printf (" +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_ZERO_2W) printf (" +-----+-----+---------+------+---+Pi Zero 2W+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_2) printf (" +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_3B) printf (" +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_3BP) printf (" +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_3AP) printf (" +-----+-----+---------+------+---+---Pi 3A+-+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_4B) printf (" +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+\n") ; else if (model == PI_MODEL_400) printf (" +-----+-----+---------+------+---+---Pi 400-+---+------+---------+-----+-----+\n") ; else printf (" +-----+-----+---------+------+---+---Pi ?---+---+------+---------+-----+-----+\n") ; } static void piPlusReadall (int model) { int pin ; plus2header (model) ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; for (pin = 1 ; pin <= 40 ; pin += 2) readallPhys (pin) ; printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; plus2header (model) ; } /* * doReadall: * Generic read all pins called from main program. Works out the Pi type * and calls the appropriate function. ********************************************************************************* */ void doReadall (void) { int model, rev, mem, maker, overVolted ; if (wiringPiNodes != NULL) // External readall { doReadallExternal () ; return ; } piBoardId (&model, &rev, &mem, &maker, &overVolted) ; /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) abReadall (model, rev) ; else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || (model == PI_MODEL_2) || (model == PI_MODEL_3AP) || (model == PI_MODEL_3B) || (model == PI_MODEL_3BP) || (model == PI_MODEL_4B) || (model == PI_MODEL_400) || (model == PI_MODEL_CM4) || (model == PI_MODEL_ZERO) || (model == PI_MODEL_ZERO_W) || (model == PI_MODEL_ZERO_2W)) piPlusReadall (model) ; else if ((model == PI_MODEL_CM) || (model == PI_MODEL_CM3) || (model == PI_MODEL_CM3P) ) allReadall () ; else printf ("Oops - unable to determine board type... model: %d\n", model) ; } /* * doAllReadall: * Force reading of all pins regardless of Pi model ********************************************************************************* */ void doAllReadall (void) { allReadall () ; } /* * doQmode: * Query mode on a pin ********************************************************************************* */ void doQmode (int argc, char *argv []) { int pin ; if (argc != 3) { fprintf (stderr, "Usage: %s qmode pin\n", argv [0]) ; exit (EXIT_FAILURE) ; } pin = atoi (argv [2]) ; printf ("%s\n", alts [getAlt (pin)]) ; }