/* * readall.c: * The readall functions - getting a bit big, so split them out. * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * 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 #include extern int wpMode ; /* * 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... ********************************************************************************* */ #define MAX_ALTS 11 static const char unknown_alt[] = " - "; static const char *alts [MAX_ALTS+1] = { "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3", "ALT6", "ALT7", "ALT8", "ALT9" } ; static const char* GetAltString(int alt) { if (alt>=0 && alt<=MAX_ALTS) { return alts[alt]; } return unknown_alt; } 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", GetAltString(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", GetAltString(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 ", GetAltString(getAlt (pin))) ; printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; printf ("| ") ; printf ("| %3d ", pin + 27) ; printf ("| %-4s ", GetAltString(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 ********************************************************************************* */ const char piModelNamesShort[PI_MODELS_MAX][11] = { "---Pi A---", // 0 "---Pi B---", // 1 "---Pi A+--", // 2 "---Pi B+--", // 3 "---Pi 2---", // 4 "---Alpha--", // 5 "----CM----", // 6 "", // 07 "---Pi 3B--", // 8 "-Pi Zero--", // 9 "---CM3----", // 10 "", // 11 "-Pi ZeroW-", // 12 "---Pi 3B+-", // 13 "---Pi 3A+-", // 14 "", // 15 "---CM3+---", // 16 "---Pi 4B--", // 17 "Pi Zero 2W", // 18 "--Pi 400--", // 19 "---CM4----", // 20 "---CM4S---", // 21 "", // 22 "---Pi 5---", // 23 "---CM5----", // 24 "--Pi 500--", // 25 "---CM5L---", // 24 } ; static void plus2header (int model) { if (model