blob: be2619ca8bac075db3ccfd923c4ad0155d4ddb05 [file] [log] [blame]
Gordon Henderson02a3bd82013-06-27 21:57:09 +01001/*
2 * readall.c:
3 * The readall functions - getting a bit big, so split them out.
Gordon Hendersone687f3f2017-01-24 12:13:39 +00004 * Copyright (c) 2012-2017 Gordon Henderson
Gordon Henderson02a3bd82013-06-27 21:57:09 +01005 ***********************************************************************
6 * This file is part of wiringPi:
7 * https://projects.drogon.net/raspberry-pi/wiringpi/
8 *
9 * wiringPi is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * wiringPi is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
21 ***********************************************************************
22 */
Gordon Henderson02a3bd82013-06-27 21:57:09 +010023#include <stdio.h>
24#include <stdlib.h>
25#include <stdint.h>
26#include <ctype.h>
27#include <string.h>
28#include <unistd.h>
29#include <errno.h>
30#include <fcntl.h>
31#include <sys/types.h>
32#include <sys/stat.h>
33
34#include <wiringPi.h>
joshua-yang4b08e7f2019-02-21 12:05:24 +090035/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +010036
37extern int wpMode ;
38
joshua-yang4b08e7f2019-02-21 12:05:24 +090039/*----------------------------------------------------------------------------*/
Gordon Henderson6fba4032014-06-24 19:23:31 +010040#ifndef TRUE
joshua-yang4b08e7f2019-02-21 12:05:24 +090041# define TRUE (1==1)
42# define FALSE (1==2)
Gordon Henderson6fba4032014-06-24 19:23:31 +010043#endif
44
joshua-yang4b08e7f2019-02-21 12:05:24 +090045/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +010046/*
47 * doReadallExternal:
48 * A relatively crude way to read the pins on an external device.
49 * We don't know the input/output mode of pins, but we can tell
50 * if it's an analog pin or a digital one...
Gordon Henderson02a3bd82013-06-27 21:57:09 +010051 */
joshua-yang4b08e7f2019-02-21 12:05:24 +090052/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +010053static void doReadallExternal (void)
54{
joshua-yang4b08e7f2019-02-21 12:05:24 +090055 int pin ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010056
joshua-yang4b08e7f2019-02-21 12:05:24 +090057 printf ("+------+---------+--------+\n") ;
58 printf ("| Pin | Digital | Analog |\n") ;
59 printf ("+------+---------+--------+\n") ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010060
joshua-yang4b08e7f2019-02-21 12:05:24 +090061 for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
62 printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010063
joshua-yang4b08e7f2019-02-21 12:05:24 +090064 printf ("+------+---------+--------+\n") ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010065}
66
joshua-yang4b08e7f2019-02-21 12:05:24 +090067/*----------------------------------------------------------------------------*/
68static const char *alts [] =
69{
70 "IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7"
71} ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010072
joshua-yang4b08e7f2019-02-21 12:05:24 +090073static const char *pupd [] =
74{
75 "DSBLD", "P/U", "P/D"
76} ;
77
78/*----------------------------------------------------------------------------*/
79static const int physToWpi [64] =
80{
81 -1, // 0
82 -1, -1, // 1, 2
83 8, -1,
84 9, -1,
85 7, 15,
86 -1, 16,
87 0, 1,
88 2, -1,
89 3, 4,
90 -1, 5,
91 12, -1,
92 13, 6,
93 14, 10,
94 -1, 11, // 25, 26
95 30, 31, // Actually I2C, but not used
96 21, -1,
97 22, 26,
98 23, -1,
99 24, 27,
100 25, 28,
101 -1, 29,
102 -1, -1,
103 -1, -1,
104 -1, -1,
105 -1, -1,
106 -1, -1,
107 17, 18,
108 19, 20,
109 -1, -1, -1, -1, -1, -1, -1, -1, -1
110} ;
111
112/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900113static const char *physNamesOdroidC1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900114{
115 NULL,
116
117 " 3.3V", "5V ",
118 " SDA.1", "5V ",
119 " SCL.1", "GND(0V) ",
120 "GPIO. 83", "TxD1 ",
121 " GND(0V)", "RxD1 ",
122 "GPIO. 88", "GPIO. 87",
123 "GPIO.116", "GND(0V) ",
124 "GPIO.115", "GPIO.104",
125 " 3.3V", "GPIO.102",
126 " MOSI", "GND(0V) ",
127 " MISO", "GPIO.103",
128 " SCLK", "CE0 ",
129 " GND(0V)", "GPIO.118",
130 " SDA.2", "SCL.2 ",
131 "GPIO.101", "GND(0V) ",
132 "GPIO.100", "GPIO. 99",
133 "GPIO.108", "GND(0V) ",
134 "GPIO.97 ", "GPIO. 98",
135 " AIN.1", "1V8 ",
136 " GND(0V)", "AIN.0 ",
137
138 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
139 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
140 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900141};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900142
143/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900144static const char *physNamesOdroidC1 [64] =
145{
146 NULL,
147
148 " 3.3V", "5V ",
149 " SDA.1", "5V ",
150 " SCL.1", "0V ",
151 " IO. 83", "TxD1 ",
152 " 0V", "RxD1 ",
153 " IO. 88", "IO. 87 ",
154 " IO.116", "0V ",
155 " IO.115", "IO.104 ",
156 " 3.3V", "IO.102 ",
157 " MOSI", "0V ",
158 " MISO", "IO.103 ",
159 " SCLK", "CE0 ",
160 " 0V", "IO.118 ",
161 " SDA.2", "SCL.2 ",
162 " IO.101", "0V ",
163 " IO.100", "IO. 99 ",
164 " IO.108", "0V ",
165 " IO.97 ", "IO. 98 ",
166 " AIN.1", "1V8 ",
167 " 0V", "AIN.0 ",
168
169 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
170 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
171 NULL,NULL,NULL,
172};
173
174/*----------------------------------------------------------------------------*/
175static const char *physNamesOdroidC2All_Rev2 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900176{
177 NULL,
178
179 " 3.3V", "5V ",
180 " SDA.1", "5V ",
181 " SCL.1", "GND(0V) ",
182 "GPIO.249", "TxD1 ",
183 " GND(0V)", "RxD1 ",
184 "GPIO.247", "GPIO.238",
185 "GPIO.239", "GND(0V) ",
186 "GPIO.237", "GPIO.236",
187 " 3.3V", "GPIO.233",
188 "GPIO.235", "GND(0V) ",
189 "GPIO.232", "GPIO.231",
190 "GPIO.230", "GPIO.229",
191 " GND(0V)", "GPIO.225",
192 " SDA.2", "SCL.2 ",
193 "GPIO.228", "GND(0V) ",
194 "GPIO.219", "GPIO.224",
195 "GPIO.234", "GND(0V) ",
196 "GPIO.214", "GPIO.218",
197 " AIN.1", "1V8 ",
198 " GND(0V)", "AIN.0 ",
199
200 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
201 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
202 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900203};
204
205/*----------------------------------------------------------------------------*/
206static const char *physNamesOdroidC2_Rev2 [64] =
207{
208 NULL,
209
210 " 3.3V", "5V ",
211 " SDA.1", "5V ",
212 " SCL.1", "0V ",
213 " IO.249", "TxD1 ",
214 " 0V", "RxD1 ",
215 " IO.247", "IO.238 ",
216 " IO.239", "0V ",
217 " IO.237", "IO.236 ",
218 " 3.3V", "IO.233 ",
219 " IO.235", "0V ",
220 " IO.232", "IO.231 ",
221 " IO.230", "IO.229 ",
222 " 0V", "IO.225 ",
223 " SDA.2", "SCL.2 ",
224 " IO.228", "0V ",
225 " IO.219", "IO.224 ",
226 " IO.234", "0V ",
227 " IO.214", "IO.218 ",
228 " AIN.1", "1V8 ",
229 " 0V", "AIN.0 ",
230
231 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
232 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
233 NULL,NULL,NULL,
joshua-yang4b08e7f2019-02-21 12:05:24 +0900234} ;
235
236/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900237static const char *physNamesOdroidC2All_Rev1 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900238{
239 NULL,
240
241 " 3.3V", "5V ",
242 " SDA.1", "5V ",
243 " SCL.1", "GND(0V) ",
244 "GPIO.214", "--------",
245 " GND(0V)", "--------",
246 "GPIO.219", "GPIO.218",
247 "GPIO.247", "GND(0V) ",
248 "--------", "GPIO.235",
249 " 3.3V", "GPIO.233",
250 "GPIO.238", "GND(0V) ",
251 "GPIO.237", "GPIO.234",
252 "GPIO.236", "GPIO.248",
253 " GND(0V)", "GPIO.249",
254 " SDA.2", "SCL.2 ",
255 "GPIO.232", "GND(0V) ",
256 "GPIO.231", "GPIO.230",
257 "GPIO.239", "GND(0V) ",
258 "GPIO.228", "GPIO.229",
259 " AIN.1", "1V8 ",
260 " GND(0V)", "AIN.0 ",
261
262 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
263 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
264 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900265};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900266
267/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900268static const char *physNamesOdroidC2_Rev1 [64] =
269{
270 NULL,
271
272 " 3.3V", "5V ",
273 " SDA.1", "5V ",
274 " SCL.1", "0V ",
275 " IO.214", "-------",
276 " 0V", "-------",
277 " IO.219", "IO.218 ",
278 " IO.247", "0V ",
279 "-------", "IO.235 ",
280 " 3.3V", "IO.233 ",
281 " IO.238", "0V ",
282 " IO.237", "IO.234 ",
283 " IO.236", "IO.248 ",
284 " 0V", "IO.249 ",
285 " SDA.2", "SCL.2 ",
286 " IO.232", "0V ",
287 " IO.231", "IO.230 ",
288 " IO.239", "0V ",
289 " IO.228", "IO.229 ",
290 " AIN.1", "1V8 ",
291 " 0V", "AIN.0 ",
292
293 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
294 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
295 NULL,NULL,NULL,
296};
297
298/*----------------------------------------------------------------------------*/
299static const char *physNamesOdroidXU3All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900300{
301 NULL,
302
303 " 3.3V", "5V ",
304 "I2C1.SDA", "5V ",
305 "I2C1.SCL", "GND(0V) ",
306 "GPIO. 18", "UART0.TX",
307 " GND(0V)", "UART0.RX",
308 "GPIO.174", "GPIO.173",
309 "GPIO. 21", "GND(0V) ",
310 "GPIO. 22", "GPIO. 19",
311 " 3.3V", "GPIO. 23",
312 " MOSI", "GND(0V) ",
313 " MISO", "GPIO. 24",
314 " SCLK", "CE0 ",
315 " GND(0V)", "GPIO. 25",
316 "I2C5.SDA", "I2C5.SCL",
317 "GPIO. 28", "GND(0V) ",
318 "GPIO. 30", "GPIO. 29",
319 "GPIO. 31", "GND(0V) ",
320 "POWER ON", "GPIO. 33",
321 " AIN.0", "1V8 ",
322 " GND(0V)", "AIN.3 ",
323
324 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
325 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
326 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900327};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900328
329/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900330static const char *physNamesOdroidXU3 [64] =
331{
332 NULL,
333
334 " 3.3V", "5V ",
335 "I2C1.DA", "5V ",
336 "I2C1.CL", "0V ",
337 " IO. 18", "UART.TX",
338 " 0V", "UART.RX",
339 " IO.174", "IO.173 ",
340 " IO. 21", "0V ",
341 " IO. 22", "IO. 19 ",
342 " 3.3V", "IO. 23 ",
343 " MOSI", "0V ",
344 " MISO", "IO. 24 ",
345 " SCLK", "CE0 ",
346 " 0V", "IO. 25 ",
347 "I2C5.DA", "I2C5.CL",
348 " IO. 28", "0V ",
349 " IO. 30", "IO. 29 ",
350 " IO. 31", "0V ",
351 " PWR ON", "IO. 33 ",
352 " AIN.0", "1V8 ",
353 " 0V", "AIN.3 ",
354
355 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
356 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
357 NULL,NULL,NULL,
358};
359
360/*----------------------------------------------------------------------------*/
361static const char *physNamesOdroidN1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900362{
363 NULL,
364
365 " 3.0V", "5V ",
366 "I2C4_SDA", "5V ",
367 "I2C4_SCL", "GND(0V) ",
368 "GPIO1A.0", "UART0_TX",
369 " GND(0V)", "UART0_RX",
370 "GPIO1A.1", "GPIO1A.2",
371 "GPIO1A.3", "GND(0V) ",
372 "GPIO1A.4", "GPIO1B.5",
373 " 3.0V", "GPIO1C.2",
374 "SPI1_TXD", "GND(0V) ",
375 "SPI1_RXD", "GPIO1D.0",
376 "SPI1_CLK", "SPI1_CSN",
377 " GND(0V)", "GPIO1C.6",
378 "I2C8_SDA", "I2C8_SCL",
379 "SPDIF_TX", "GND(0V) ",
380 " PWM1", "GPIO4D.4",
381 "GPIO4D.0", "GND(0V) ",
382 "GPIO4D.5", "GPIO4D.6",
383 "ADC.AIN1", "1V8 ",
384 " GND(0V)", "ADC.AIN0",
385
386 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
387 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
388 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900389};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900390
391/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900392static const char *physNamesOdroidN1 [64] =
393{
394 NULL,
395
396 " 3.0V", "5V ",
397 "I2C4.DA", "5V ",
398 "I2C4.CL", "0V ",
399 " IO1A.0", "UART.TX",
400 " 0V", "UART.RX",
401 " IO1A.1", "IO1A.2 ",
402 " IO1A.3", "0V ",
403 " IO1A.4", "IO1B.5 ",
404 " 3.0V", "IO1C.2 ",
405 "SPI.TXD", "0V ",
406 "SPI.RXD", "IO1D.0 ",
407 "SPI.CLK", "SPI.CSN",
408 " 0V", "IO1C.6 ",
409 "I2C8.DA", "I2C8.CL",
410 "SPDIF.T", "0V ",
411 " PWM1", "IO4D.4 ",
412 " IO4D.0", "0V ",
413 " IO4D.5", "IO4D.6 ",
414 " AIN1", "1V8 ",
415 " 0V", "AIN0 ",
416
417 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
418 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
419 NULL,NULL,NULL,
420};
421
422/*----------------------------------------------------------------------------*/
423static const char *physNamesOdroidN2All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900424{
425 NULL,
426
427 " 3.3V", "5V ",
428 " SDA.2", "5V ",
429 " SCL.2", "GND(0V) ",
430 "GPIO.473", "TxD1 ",
431 " GND(0V)", "RxD1 ",
432 "GPIO.479", "GPIO.492",
433 "GPIO.480", "GND(0V) ",
434 "GPIO.483", "GPIO.476",
435 " 3.3V", "GPIO.477",
436 " MOSI", "GND(0V) ",
437 " MISO", "GPIO.478",
438 " SCLK", "CE0 ",
439 " GND(0V)", "GPIO.464",
440 " SDA.3", "SCL.3 ",
441 "GPIO.490", "GND(0V) ",
442 "GPIO.491", "GPIO.472",
443 "GPIO.481", "GND(0V) ",
444 "GPIO.482", "GPIO.495",
445 " AIN.3", "1V8 ",
446 " GND(0V)", "AIN.2 ",
447
448 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
449 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
450 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900451};
452
453/*----------------------------------------------------------------------------*/
454static const char *physNamesOdroidN2 [64] =
455{
456 NULL,
457
458 " 3.3V", "5V ",
459 " SDA.2", "5V ",
460 " SCL.2", "0V ",
461 " IO.473", "TxD1 ",
462 " 0V", "RxD1 ",
463 " IO.479", "IO.492 ",
464 " IO.480", "0V ",
465 " IO.483", "IO.476 ",
466 " 3.3V", "IO.477 ",
467 " MOSI", "0V ",
468 " MISO", "IO.478 ",
469 " SCLK", "CE0 ",
470 " 0V", "IO.464 ",
471 " SDA.3", "SCL.3 ",
472 " IO.490", "0V ",
473 " IO.491", "IO.472 ",
474 " IO.481", "0V ",
475 " IO.482", "IO.495 ",
476 " AIN.3", "1V8 ",
477 " 0V", "AIN.2 ",
478
479 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
480 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
481 NULL,NULL,NULL,
482};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900483
484/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900485static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900486 int pin ;
487
488 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900489 if (isAll == TRUE) {
490 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
491 printf(" | | ");
492 else if (physPinToGpio (physPin) != -1) {
493 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
494 } else
495 printf(" | | %3d", physToWpi [physPin]);
496 } else {
497 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
498 printf(" | | ");
499 else if (physPinToGpio (physPin) != -1) {
500 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
501 } else
502 printf(" | | %3d", physToWpi [physPin]);
503 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900504
505 // GPIO pin name
506 printf (" | %s", physNames [physPin]) ;
507
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900508 // GPIO pin mode, value
509 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
510 printf(" | | ");
511 if (isAll == TRUE)
512 printf(" | | ");
513 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900514 if (wpMode == MODE_GPIO)
515 pin = physPinToGpio (physPin);
516 else if (wpMode == MODE_PHYS)
517 pin = physPin ;
518 else
519 pin = physToWpi [physPin];
520
521 printf (" | %4s", alts [getAlt (pin)]) ;
522 printf (" | %d", digitalRead (pin)) ;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900523
524 // GPIO pin drive strength, pu/pd
525 if (isAll == TRUE) {
526 switch (model) {
527 case MODEL_ODROID_N1:
528 printf (" | | ");
529 break;
530 case MODEL_ODROID_C1:
531 case MODEL_ODROID_C2:
532 printf (" | | %5s", pupd[getPUPD(pin)]);
533 break;
534 case MODEL_ODROID_XU3:
535 case MODEL_ODROID_N2:
536 printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]);
537 break;
538 default:
539 break;
540 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900541 }
542 }
543
544 // Physical pin number
545 printf (" | %2d", physPin) ;
546 ++physPin ;
547 printf (" || %-2d", physPin) ;
548
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900549 // GPIO pin mode, value
550 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
551 printf(" |");
552 if (isAll == TRUE)
553 printf(" | |");
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900554 printf(" | ");
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900555 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900556 if (wpMode == MODE_GPIO)
557 pin = physPinToGpio (physPin);
558 else if (wpMode == MODE_PHYS)
559 pin = physPin ;
560 else
561 pin = physToWpi [physPin];
562
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900563
564 // GPIO pin drive strength, pu/pd
565 if (isAll == TRUE) {
566 switch (model) {
567 case MODEL_ODROID_N1:
568 printf (" | | ");
569 break;
570 case MODEL_ODROID_C1:
571 case MODEL_ODROID_C2:
572 printf (" | %-5s | ", pupd[getPUPD(pin)]);
573 break;
574 case MODEL_ODROID_XU3:
575 case MODEL_ODROID_N2:
576 printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin));
577 break;
578 default:
579 break;
580 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900581 }
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900582 printf(" | %d", digitalRead (pin));
583 printf(" | %-4s", alts [getAlt (pin)]);
joshua-yang4b08e7f2019-02-21 12:05:24 +0900584 }
585
586 // GPIO pin name
587 printf (" | %-6s", physNames [physPin]);
588
589 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900590 if (isAll == TRUE) {
591 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
592 printf(" | | ");
593 else if (physPinToGpio (physPin) != -1)
594 printf(" | %-3d | %-3d ", physToWpi [physPin], physPinToGpio (physPin));
595 else
596 printf(" | %-3d | ", physToWpi [physPin]);
597 } else {
598 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
599 printf(" | | ");
600 else if (physPinToGpio (physPin) != -1)
601 printf(" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin));
602 else
603 printf(" | %-3d | ", physToWpi [physPin]);
604 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900605
606 printf (" |\n") ;
607}
608
609/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900610static void printHeader(const char *headerName, int isAll) {
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900611 const char *headerLeft = " +-----+-----+---------+------+---+";
612 const char *headerRight = "+---+------+---------+-----+-----+\n";
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900613 const char *headerLeftAll = " +------+-----+----------+------+---+----+";
614 const char *headerRightAll = "+----+---+------+----------+-----+------+\n";
joshua-yang4b08e7f2019-02-21 12:05:24 +0900615
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900616 (isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll);
617 printf("%s", headerName);
618 (isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll);
619}
620
621/*----------------------------------------------------------------------------*/
622static void printBody(int model, int rev, const char *physNames[], int isAll) {
623 (isAll == FALSE)
624 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900625 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n"
626 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900627 : printf(
628 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n"
629 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n");
630 for (int pin = 1; pin <= 40; pin += 2)
631 readallPhys(model, rev, pin, physNames, isAll);
632 (isAll == FALSE)
633 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900634 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n"
635 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900636 : printf(
637 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"
638 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n");
joshua-yang4b08e7f2019-02-21 12:05:24 +0900639}
640
641/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100642/*
643 * doReadall:
644 * Read all the GPIO pins
645 * We also want to use this to read the state of pins on an externally
646 * connected device, so we need to do some fiddling with the internal
647 * wiringPi node structures - since the gpio command can only use
648 * one external device at a time, we'll use that to our advantage...
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100649 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900650/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900651void doReadall(int argc, char *argv[]) {
652 int model, rev, mem, maker, overVolted, isAll;
653 char *headerName, *physNames;
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100654
joshua-yang4b08e7f2019-02-21 12:05:24 +0900655 // External readall
656 if (wiringPiNodes != NULL) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900657 doReadallExternal();
658 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900659 }
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100660
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900661 if (argc <= 2) {
662 isAll = FALSE;
663 } else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) {
664 isAll = TRUE;
665 } else {
666 printf("Oops - unknown readall option:\n");
667 for (int i = 3; i < argc + 1; i++)
668 printf("\targv[%d]: %s\n", i, argv[i - 1]);
669
670 return;
671 }
672
673 piBoardId (&model, &rev, &mem, &maker, &overVolted);
Gordon Henderson6fba4032014-06-24 19:23:31 +0100674
joshua-yang4b08e7f2019-02-21 12:05:24 +0900675 switch (model) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900676 case MODEL_ODROID_C1:
677 headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model ODROID-C1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900678 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC1 : physNamesOdroidC1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900679 break;
680 case MODEL_ODROID_C2:
681 headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model ODROID-C2 ----";
682 if (rev == 1)
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900683 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev1 : physNamesOdroidC2All_Rev1);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900684 else
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900685 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev2 : physNamesOdroidC2All_Rev2);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900686 break;
687 case MODEL_ODROID_XU3:
688 headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900689 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidXU3 : physNamesOdroidXU3All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900690 break;
691 case MODEL_ODROID_N1:
692 headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model ODROID-N1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900693 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN1 : physNamesOdroidN1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900694 break;
695 case MODEL_ODROID_N2:
696 headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model ODROID-N2 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900697 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN2 : physNamesOdroidN2All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900698 break;
699 default:
700 printf("Oops - unknown model: %d\n", model);
701 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900702 }
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900703
704 printHeader((const char *) headerName, isAll);
705 printBody(model, rev, (const char **) physNames, isAll);
706 printHeader((const char *) headerName, isAll);
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100707}
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000708
joshua-yang4b08e7f2019-02-21 12:05:24 +0900709/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000710/*
711 * doAllReadall:
712 * Force reading of all pins regardless of Pi model
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000713 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900714/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900715void doAllReadall(void) {
716 char *fakeArgv[3] = { "", "", "--all" };
717
718 doReadall(3, fakeArgv);
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000719}
joshua-yang4b08e7f2019-02-21 12:05:24 +0900720
721/*----------------------------------------------------------------------------*/
722/*----------------------------------------------------------------------------*/