/* * readall.c: * The readall functions - getting a bit big, so split them out. * Copyright (c) 2012-2017 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/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") ; } /*----------------------------------------------------------------------------*/ static const char *alts [] = { "IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7", "ALT8", "ALT9", "ALTa", "ALTb", "ALTc", "ALTd", "ALTe", } ; static const char *pupd [] = { "DSBLD", "P/U", "P/D" } ; /*----------------------------------------------------------------------------*/ static const 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 const int physToWpiHC4 [64] = { -1, // 0 -1, 0, // 1, 2 1, 2, -1, } ; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC1All [64] = { NULL, " 3.3V", "5V ", " SDA.1", "5V ", " SCL.1", "GND(0V) ", "GPIO. 83", "TxD1 ", " GND(0V)", "RxD1 ", "GPIO. 88", "GPIO. 87", "GPIO.116", "GND(0V) ", "GPIO.115", "GPIO.104", " 3.3V", "GPIO.102", " MOSI", "GND(0V) ", " MISO", "GPIO.103", " SCLK", "CE0 ", " GND(0V)", "GPIO.118", " SDA.2", "SCL.2 ", "GPIO.101", "GND(0V) ", "GPIO.100", "GPIO. 99", "GPIO.108", "GND(0V) ", "GPIO.97 ", "GPIO. 98", " AIN.1", "1V8 ", " GND(0V)", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC1 [64] = { NULL, " 3.3V", "5V ", " SDA.1", "5V ", " SCL.1", "0V ", " IO. 83", "TxD1 ", " 0V", "RxD1 ", " IO. 88", "IO. 87 ", " IO.116", "0V ", " IO.115", "IO.104 ", " 3.3V", "IO.102 ", " MOSI", "0V ", " MISO", "IO.103 ", " SCLK", "CE0 ", " 0V", "IO.118 ", " SDA.2", "SCL.2 ", " IO.101", "0V ", " IO.100", "IO. 99 ", " IO.108", "0V ", " IO.97 ", "IO. 98 ", " AIN.1", "1V8 ", " 0V", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC2All_Rev2 [64] = { NULL, " 3.3V", "5V ", " SDA.1", "5V ", " SCL.1", "GND(0V) ", "GPIO.249", "TxD1 ", " GND(0V)", "RxD1 ", "GPIO.247", "GPIO.238", "GPIO.239", "GND(0V) ", "GPIO.237", "GPIO.236", " 3.3V", "GPIO.233", "GPIO.235", "GND(0V) ", "GPIO.232", "GPIO.231", "GPIO.230", "GPIO.229", " GND(0V)", "GPIO.225", " SDA.2", "SCL.2 ", "GPIO.228", "GND(0V) ", "GPIO.219", "GPIO.224", "GPIO.234", "GND(0V) ", "GPIO.214", "GPIO.218", " AIN.1", "1V8 ", " GND(0V)", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC2_Rev2 [64] = { NULL, " 3.3V", "5V ", " SDA.1", "5V ", " SCL.1", "0V ", " IO.249", "TxD1 ", " 0V", "RxD1 ", " IO.247", "IO.238 ", " IO.239", "0V ", " IO.237", "IO.236 ", " 3.3V", "IO.233 ", " IO.235", "0V ", " IO.232", "IO.231 ", " IO.230", "IO.229 ", " 0V", "IO.225 ", " SDA.2", "SCL.2 ", " IO.228", "0V ", " IO.219", "IO.224 ", " IO.234", "0V ", " IO.214", "IO.218 ", " AIN.1", "1V8 ", " 0V", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, } ; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC2All_Rev1 [64] = { NULL, " 3.3V", "5V ", " SDA.1", "5V ", " SCL.1", "GND(0V) ", "GPIO.214", "--------", " GND(0V)", "--------", "GPIO.219", "GPIO.218", "GPIO.247", "GND(0V) ", "--------", "GPIO.235", " 3.3V", "GPIO.233", "GPIO.238", "GND(0V) ", "GPIO.237", "GPIO.234", "GPIO.236", "GPIO.248", " GND(0V)", "GPIO.249", " SDA.2", "SCL.2 ", "GPIO.232", "GND(0V) ", "GPIO.231", "GPIO.230", "GPIO.239", "GND(0V) ", "GPIO.228", "GPIO.229", " AIN.1", "1V8 ", " GND(0V)", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC2_Rev1 [64] = { NULL, " 3.3V", "5V ", " SDA.1", "5V ", " SCL.1", "0V ", " IO.214", "-------", " 0V", "-------", " IO.219", "IO.218 ", " IO.247", "0V ", "-------", "IO.235 ", " 3.3V", "IO.233 ", " IO.238", "0V ", " IO.237", "IO.234 ", " IO.236", "IO.248 ", " 0V", "IO.249 ", " SDA.2", "SCL.2 ", " IO.232", "0V ", " IO.231", "IO.230 ", " IO.239", "0V ", " IO.228", "IO.229 ", " AIN.1", "1V8 ", " 0V", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidXU3All [64] = { NULL, " 3.3V", "5V ", "I2C1.SDA", "5V ", "I2C1.SCL", "GND(0V) ", "GPIO. 18", "UART0.TX", " GND(0V)", "UART0.RX", "GPIO.174", "GPIO.173", "GPIO. 21", "GND(0V) ", "GPIO. 22", "GPIO. 19", " 3.3V", "GPIO. 23", " MOSI", "GND(0V) ", " MISO", "GPIO. 24", " SCLK", "CE0 ", " GND(0V)", "GPIO. 25", "I2C5.SDA", "I2C5.SCL", "GPIO. 28", "GND(0V) ", "GPIO. 30", "GPIO. 29", "GPIO. 31", "GND(0V) ", "POWER ON", "GPIO. 33", " AIN.0", "1V8 ", " GND(0V)", "AIN.3 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidXU3 [64] = { NULL, " 3.3V", "5V ", "I2C1.DA", "5V ", "I2C1.CL", "0V ", " IO. 18", "UART.TX", " 0V", "UART.RX", " IO.174", "IO.173 ", " IO. 21", "0V ", " IO. 22", "IO. 19 ", " 3.3V", "IO. 23 ", " MOSI", "0V ", " MISO", "IO. 24 ", " SCLK", "CE0 ", " 0V", "IO. 25 ", "I2C5.DA", "I2C5.CL", " IO. 28", "0V ", " IO. 30", "IO. 29 ", " IO. 31", "0V ", " PWR ON", "IO. 33 ", " AIN.0", "1V8 ", " 0V", "AIN.3 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidN1All [64] = { NULL, " 3.0V", "5V ", "I2C4_SDA", "5V ", "I2C4_SCL", "GND(0V) ", "GPIO1A.0", "UART0_TX", " GND(0V)", "UART0_RX", "GPIO1A.1", "GPIO1A.2", "GPIO1A.3", "GND(0V) ", "GPIO1A.4", "GPIO1B.5", " 3.0V", "GPIO1C.2", "SPI1_TXD", "GND(0V) ", "SPI1_RXD", "GPIO1D.0", "SPI1_CLK", "SPI1_CSN", " GND(0V)", "GPIO1C.6", "I2C8_SDA", "I2C8_SCL", "SPDIF_TX", "GND(0V) ", " PWM1", "GPIO4D.4", "GPIO4D.0", "GND(0V) ", "GPIO4D.5", "GPIO4D.6", "ADC.AIN1", "1V8 ", " GND(0V)", "ADC.AIN0", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidN1 [64] = { NULL, " 3.0V", "5V ", "I2C4.DA", "5V ", "I2C4.CL", "0V ", " IO1A.0", "UART.TX", " 0V", "UART.RX", " IO1A.1", "IO1A.2 ", " IO1A.3", "0V ", " IO1A.4", "IO1B.5 ", " 3.0V", "IO1C.2 ", "SPI.TXD", "0V ", "SPI.RXD", "IO1D.0 ", "SPI.CLK", "SPI.CSN", " 0V", "IO1C.6 ", "I2C8.DA", "I2C8.CL", "SPDIF.T", "0V ", " PWM1", "IO4D.4 ", " IO4D.0", "0V ", " IO4D.5", "IO4D.6 ", " AIN1", "1V8 ", " 0V", "AIN0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidN2All [64] = { NULL, " 3.3V", "5V ", " SDA.2", "5V ", " SCL.2", "GND(0V) ", "GPIO.473", "TxD1 ", " GND(0V)", "RxD1 ", "GPIO.479", "GPIO.492", "GPIO.480", "GND(0V) ", "GPIO.483", "GPIO.476", " 3.3V", "GPIO.477", " MOSI", "GND(0V) ", " MISO", "GPIO.478", " SCLK", "CE0 ", " GND(0V)", "GPIO.464", " SDA.3", "SCL.3 ", "GPIO.490", "GND(0V) ", "GPIO.491", "GPIO.472", "GPIO.481", "GND(0V) ", "GPIO.482", "GPIO.495", " AIN.3", "1V8 ", " GND(0V)", "AIN.2 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidN2 [64] = { NULL, " 3.3V", "5V ", " SDA.2", "5V ", " SCL.2", "0V ", " IO.473", "TxD1 ", " 0V", "RxD1 ", " IO.479", "IO.492 ", " IO.480", "0V ", " IO.483", "IO.476 ", " 3.3V", "IO.477 ", " MOSI", "0V ", " MISO", "IO.478 ", " SCLK", "CE0 ", " 0V", "IO.464 ", " SDA.3", "SCL.3 ", " IO.490", "0V ", " IO.491", "IO.472 ", " IO.481", "0V ", " IO.482", "IO.495 ", " AIN.3", "1V8 ", " 0V", "AIN.2 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC4All [64] = { NULL, " 3.3V", "5V ", " SDA.2", "5V ", " SCL.2", "GND(0V) ", "GPIO.481", "TxD1 ", " GND(0V)", "RxD1 ", "GPIO.479", "GPIO.492", "GPIO.480", "GND(0V) ", "GPIO.483", "GPIO.476", " 3.3V", "GPIO.477", " MOSI", "GND(0V) ", " MISO", "GPIO.478", " SLCK", "SS ", " GND(0V)", "GPIO. 23", " SDA.3", "SCL.3 ", "GPIO.490", "GND(0V) ", "GPIO.491", "GPIO. 24", "GPIO.482", "GND(0V) ", "GPIO.495", "GPIO. 22", " AIN.2", "1V8 ", " GND(0V)", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC4 [64] = { NULL, " 3.3V", "5V ", " SDA.2", "5V ", " SCL.2", "0V ", " IO.481", "TxD1 ", " 0V", "RxD1 ", " IO.479", "IO.492 ", " IO.480", "0V ", " IO.483", "IO.476 ", " 3.3V", "IO.477 ", " MOSI", "0V ", " MISO", "IO.478 ", " SLCK", "SS ", " 0V", "IO. 23 ", " SDA.3", "SCL.3 ", " IO.490", "0V ", " IO.491", "IO. 24 ", " IO.482", "0V ", " IO.495", "IO. 22 ", " AIN.2", "1V8 ", " 0V", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidHC4All [64] = { NULL, " 3.3V", " SDA.2", " SCL.2", "GPIO.481", " 0V", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidHC4 [64] = { NULL, " 3.3V", " SDA.2", " SCL.2", " IO.481", " 0V", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidM1All [64] = { NULL, " 3.3V", "5V ", "I2C0_SDA", "5V ", "I2C0_SCL", "GND(0V) ", "GPIO0_B6", "UART1_TX", " GND(0V)", "UART1_RX", "GPIO0_C0", "GPIO3_D0", "GPIO0_C1", "GND(0V) ", "GPIO3_B2", "GPIO3_C6", " 3.3V", "GPIO3_C7", "SPI_MOSI", "GND(0V) ", "SPI_MISO", "GPIO3_D1", " SPI_CLK", "SPI_CS0 ", " GND(0V)", "GPIO3_D2", "I2C1_SDA", "I2C1_SCL", "GPIO4_C1", "GND(0V) ", "GPIO4_B6", "GPIO3_D3", "GPIO0_B5", "GND(0V) ", "GPIO3_D5", "GPIO3_D4", "ADC.AIN1", "1V8 ", " GND(0V)", "ADC.AIN0", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidM1 [64] = { NULL, " 3.3V", "5V ", " SDA0", "5V ", " SCL0", "0V ", " IO0_B6", "UART.TX", " 0V", "UART.RX", " IO0_C0", "IO3_D0 ", " IO0_C1", "0V ", " IO3_B2", "IO3_C6 ", " 3.3V", "IO3_C7 ", "SPI.TXD", "0V ", "SPI.RXD", "IO3_D1 ", "SPI.CLK", "SPI.CS0", " 0V", "IO3_D2 ", " SDA1", "SCL1 ", " IO4_C1", "0V ", " IO4_B6", "IO3_D3 ", " IO0_B5", "0V ", " IO3_D5", "IO3_D4 ", " AIN1", "1V8 ", " 0V", "AIN0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidM1SAll [64] = { NULL, " 3.3V", "5V ", "I2C0_SDA", "5V ", "I2C0_SCL", "GND(0V) ", "GPIO0_B6", "UART1_TX", " GND(0V)", "UART1_RX", "GPIO0_C0", "GPIO2_A7", "GPIO0_C1", "GND(0V) ", "GPIO0_C2", "GPIO2_B5", " 3.3V", "GPIO2_B6", "SPI_MOSI", "GND(0V) ", "SPI_MISO", "GPIO2_B0", " SPI_CLK", "SPI_CS0 ", " GND(0V)", "GPIO2_B1", "I2C1_SDA", "I2C1_SCL", "GPIO2_C0", "GND(0V) ", "GPIO2_B7", "GPIO2_B2", "GPIO0_B5", "GND(0V) ", "GPIO2_A5", "GPIO2_A6", "ADC.AIN1", "1V8 ", " GND(0V)", "ADC.AIN0", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidM1S [64] = { NULL, " 3.3V", "5V ", " SDA0", "5V ", " SCL0", "0V ", " IO0_B6", "UART.TX", " 0V", "UART.RX", " IO0_C0", "IO2_A7 ", " IO0_C1", "0V ", " IO0_C2", "IO2_B5 ", " 3.3V", "IO2_B6 ", "SPI.TXD", "0V ", "SPI.RXD", "IO2_B0 ", "SPI.CLK", "SPI.CS0", " 0V", "IO2_B1 ", " SDA1", "SCL1 ", " IO2_C0", "0V ", " IO2_B7", "IO2_B2 ", " IO0_B5", "0V ", " IO2_A5", "IO2_A6 ", " AIN1", "1V8 ", " 0V", "AIN0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidM2All [64] = { NULL, " 3.3V", "5V ", "I2C0_SDA", "5V ", "I2C0_SCL", "GND(0V) ", "GPIO0_D0", "UART1_TX", " GND(0V)", "UART1_RX", "GPIO3_D4", "GPIO3_B2", "GPIO3_D5", "GND(0V) ", "GPIO4_B3", "GPIO1_B2", " 3.3V", "GPIO1_B3", "SPI_MOSI", "GND(0V) ", "SPI_MISO", "GPIO0_D4", " SPI_CLK", "SPI_CS0 ", " GND(0V)", "GPIO1_B4", "I2C1_SDA", "I2C1_SCL", "GPIO1_B7", "GND(0V) ", "GPIO1_B6", "GPIO4_B4", "GPIO3_D0", "GND(0V) ", "GPIO3_C7", "GPIO4_B5", "ADC.AIN4", "1V8 ", " GND(0V)", "ADC.AIN5", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidM2 [64] = { NULL, " 3.3V", "5V ", " SDA0", "5V ", " SCL0", "0V ", " IO0_D0", "UART.TX", " 0V", "UART.RX", " IO3_D4", "IO3_B2 ", " IO3_D5", "0V ", " IO4_B3", "IO1_B2 ", " 3.3V", "IO1_B3 ", "SPI.TXD", "0V ", "SPI.RXD", "IO0_D4 ", "SPI.CLK", "SPI.CS0", " 0V", "IO1_B4 ", " SDA1", "SCL1 ", " IO1_B7", "0V ", " IO1_B6", "IO4_B4 ", " IO3_D0", "0V ", " IO3_C7", "IO4_B5 ", " AIN4", "1V8 ", " 0V", "AIN5 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC5All [64] = { NULL, " 3.3V", "5V ", " SDA.0", "5V ", " SCL.0", "GND(0V) ", " GPIOD_4", "TxD.1 ", " GND(0V)", "RxD.1 ", " GPIOX_5", "GPIOX_6 ", "GPIOX_15", "GND(0V) ", " GPIOX_4", "GPIODV_1", " 3.3V", "GPIODV_2", " MOSI", "GND(0V) ", " MISO", "GPIOX_14", " SLCK", "SS ", " GND(0V)", "GPIOX_7 ", " SDA.1", "SCL.1 ", " GPIOH_4", "GND(0V) ", " GPIOH_5", "GPIOX_2 ", " GPIOX_0", "GND(0V) ", " GPIOX_1", "GPIOX_3 ", " AIN.1", "1V8 ", " GND(0V)", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static const char *physNamesOdroidC5 [64] = { NULL, " 3.3V", "5V ", " SDA.0", "5V ", " SCL.0", "0V ", " IO_D4", "TxD1 ", " 0V", "RxD1 ", " IO_X5", "IOX_6 ", " IO_X15", "0V ", " IO_X4", "IO_DV1 ", " 3.3V", "IO_DV2 ", " MOSI", "0V ", " MISO", "IO_X14 ", " SLCK", "SS ", " 0V", "IOX_7 ", " SDA.1", "SCL.1 ", " IO_H4", "0V ", " IO_H5", "IOX_2 ", " IO_X0", "0V ", " IO_X1", "IOX_3 ", " AIN.1", "1V8 ", " 0V", "AIN.0 ", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL, }; /*----------------------------------------------------------------------------*/ static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) { int pin ; // GPIO, wPi pin number if (isAll == TRUE) { if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) printf(" | | "); else if (physPinToGpio (physPin) != -1) { printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]); } else printf(" | | %3d", physToWpi [physPin]); } else { if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) printf(" | | "); else if (physPinToGpio (physPin) != -1) { printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]); } else printf(" | | %3d", physToWpi [physPin]); } // GPIO pin name printf (" | %s", physNames [physPin]) ; // GPIO pin mode, value if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) { printf(" | | "); if (isAll == TRUE) printf(" | | "); } else { if (wpMode == MODE_GPIO) pin = physPinToGpio (physPin); else if (wpMode == MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin]; printf (" | %4s", alts [getAlt (pin)]) ; printf (" | %d", digitalRead (pin)) ; // GPIO pin drive strength, pu/pd if (isAll == TRUE) { switch (model) { case MODEL_ODROID_N1: printf (" | | "); break; case MODEL_ODROID_C1: case MODEL_ODROID_C2: printf (" | | %5s", pupd[getPUPD(pin)]); break; case MODEL_ODROID_XU3: case MODEL_ODROID_N2: case MODEL_ODROID_C4: case MODEL_ODROID_M1: case MODEL_ODROID_M1S: case MODEL_ODROID_M2: case MODEL_ODROID_C5: printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]); break; default: break; } } } // Physical pin number printf (" | %2d", physPin) ; ++physPin ; printf (" || %-2d", physPin) ; // GPIO pin mode, value if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) { printf(" |"); if (isAll == TRUE) printf(" | |"); printf(" | "); } else { if (wpMode == MODE_GPIO) pin = physPinToGpio (physPin); else if (wpMode == MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin]; // GPIO pin drive strength, pu/pd if (isAll == TRUE) { switch (model) { case MODEL_ODROID_N1: printf (" | | "); break; case MODEL_ODROID_C1: case MODEL_ODROID_C2: printf (" | %-5s | ", pupd[getPUPD(pin)]); break; case MODEL_ODROID_XU3: case MODEL_ODROID_N2: case MODEL_ODROID_C4: case MODEL_ODROID_M1: case MODEL_ODROID_M1S: case MODEL_ODROID_M2: case MODEL_ODROID_C5: printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getDrive(pin)); break; default: break; } } printf(" | %d", digitalRead (pin)); printf(" | %-4s", alts [getAlt (pin)]); } // GPIO pin name printf (" | %-6s", physNames [physPin]); // GPIO, wPi pin number if (isAll == TRUE) { if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) printf(" | | "); else if (physPinToGpio (physPin) != -1) printf(" | %-3d | %-3d ", physToWpi [physPin], physPinToGpio (physPin)); else printf(" | %-3d | ", physToWpi [physPin]); } else { if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) printf(" | | "); else if (physPinToGpio (physPin) != -1) printf(" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)); else printf(" | %-3d | ", physToWpi [physPin]); } printf (" |\n") ; } static void printHeader(const char *headerName, int isAll) { const char *headerLeft = " +-----+-----+---------+------+---+"; const char *headerRight = "+---+------+---------+-----+-----+\n"; const char *headerLeftAll = " +------+-----+----------+------+---+----+"; const char *headerRightAll = "+----+---+------+----------+-----+------+\n"; (isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll); printf("%s", headerName); (isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll); } /*----------------------------------------------------------------------------*/ static void printBody(int model, int rev, const char *physNames[], int isAll) { (isAll == FALSE) ? printf( " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n" " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") : printf( " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n" " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"); for (int pin = 1; pin <= 40; pin += 2) readallPhys(model, rev, pin, physNames, isAll); (isAll == FALSE) ? printf( " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n" " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n") : printf( " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n" " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n"); } /*----------------------------------------------------------------------------*/ static void readallPhysHC4(int model, int UNU rev, int physPin, const char *physNames[], int isAll) { int pin ; // GPIO, wPi pin number if (isAll == TRUE) { if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1)) printf(" | | "); else if (physPinToGpio (physPin) != -1) { printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]); } else printf(" | | %3d", physToWpiHC4 [physPin]); } else { if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1)) printf(" | | "); else if (physPinToGpio (physPin) != -1) { printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]); } else printf(" | | %3d", physToWpiHC4 [physPin]); } // GPIO pin name printf (" | %s", physNames [physPin]) ; // GPIO pin mode, value if ((physToWpiHC4 [physPin] == -1) || (physPinToGpio (physPin) == -1)) { printf(" | | "); if (isAll == TRUE) printf(" | | "); } else { if (wpMode == MODE_GPIO) pin = physPinToGpio (physPin); else if (wpMode == MODE_PHYS) pin = physPin ; else pin = physToWpiHC4 [physPin]; printf (" | %4s", alts [getAlt (pin)]) ; printf (" | %d", digitalRead (pin)) ; // GPIO pin drive strength, pu/pd if (isAll == TRUE) { switch (model) { case MODEL_ODROID_HC4: printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]); break; default: break; } } } // Physical pin number printf(" | %2d |\n", physPin); } /*----------------------------------------------------------------------------*/ static void printHeaderHC4(const char *headerName, int isAll) { const char *header = " +-----+-----+---------+------+---+-----+"; const char *headerAll = " +------+-----+----------+------+---+----+-------+-----+"; (isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll); (isAll == FALSE) ? printf(" | %s |\n", headerName) : printf(" | %s |\n", headerName); (isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll); } /*----------------------------------------------------------------------------*/ static void printBodyHC4(int model, int rev, const char *physNames[], int isAll) { (isAll == FALSE) ? printf( " | I/O | wPi | Name | Mode | V | Phy |\n" " +-----+-----+---------+------+---+-----+\n") : printf( " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Phy |\n" " +------+-----+----------+------+---+----+-------+-----+\n"); for (int pin = 1; pin <= 5; pin ++) readallPhysHC4(model, rev, pin, physNames, isAll); (isAll == FALSE) ? printf( " +-----+-----+---------+------+---+-----+\n" " | I/O | wPi | Name | Mode | V | Phy |\n") : printf( " +------+-----+----------+------+---+----+-------+-----+\n" " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Phy |\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... */ /*----------------------------------------------------------------------------*/ void doReadall(int argc, char *argv[]) { int model, rev, mem, maker, overVolted, isAll; char *headerName, *physNames; // External readall if (wiringPiNodes != NULL) { doReadallExternal(); return; } if (argc <= 2) { isAll = FALSE; } else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) { isAll = TRUE; } else { printf("Oops - unknown readall option:\n"); for (int i = 3; i < argc + 1; i++) printf("\targv[%d]: %s\n", i, argv[i - 1]); return; } piBoardId (&model, &rev, &mem, &maker, &overVolted); switch (model) { case MODEL_ODROID_C1: headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model ODROID-C1 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC1 : physNamesOdroidC1All); break; case MODEL_ODROID_C2: headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model ODROID-C2 ----"; if (rev == 1) physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev1 : physNamesOdroidC2All_Rev1); else physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev2 : physNamesOdroidC2All_Rev2); break; case MODEL_ODROID_XU3: headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidXU3 : physNamesOdroidXU3All); break; case MODEL_ODROID_N1: headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model ODROID-N1 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN1 : physNamesOdroidN1All); break; case MODEL_ODROID_N2: headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model ODROID-N2 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN2 : physNamesOdroidN2All); break; case MODEL_ODROID_C4: headerName = (isAll == FALSE) ? "--- C4 ---" : "---- Model ODROID-C4 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC4 : physNamesOdroidC4All); break; case MODEL_ODROID_HC4: headerName = (isAll == FALSE) ? " HC4 " : " Model ODROID-HC4 "; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidHC4 : physNamesOdroidHC4All); break; case MODEL_ODROID_M1: headerName = (isAll == FALSE) ? "--- M1 ---" : "---- Model ODROID-M1 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidM1 : physNamesOdroidM1All); break; case MODEL_ODROID_M1S: headerName = (isAll == FALSE) ? " M1S " : " Model ODROID-M1S "; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidM1S : physNamesOdroidM1SAll); break; case MODEL_ODROID_M2: headerName = (isAll == FALSE) ? "--- M2 ---" : "---- Model ODROID-M2 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidM2 : physNamesOdroidM2All); break; case MODEL_ODROID_C5: headerName = (isAll == FALSE) ? "--- C5 ---" : "---- Model ODROID-C5 ----"; physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC5 : physNamesOdroidC5All); break; default: printf("Oops - unknown model: %d\n", model); return; } switch (model) { case MODEL_ODROID_HC4: printHeaderHC4((const char *) headerName, isAll); printBodyHC4(model, rev, (const char **) physNames, isAll); printHeaderHC4((const char *) headerName, isAll); break; default: printHeader((const char *) headerName, isAll); printBody(model, rev, (const char **) physNames, isAll); printHeader((const char *) headerName, isAll); break; } } /*----------------------------------------------------------------------------*/ /* * doAllReadall: * Force reading of all pins regardless of Pi model */ /*----------------------------------------------------------------------------*/ void doAllReadall(void) { char *fakeArgv[3] = { "", "", "--all" }; doReadall(3, fakeArgv); } /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/