blob: a121b7a7ede58bc886516db3d2ea0bcf15d2a556 [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/*----------------------------------------------------------------------------*/
113static const char *physNamesOdroidC1 [64] =
114{
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,
141} ;
142
143/*----------------------------------------------------------------------------*/
144static const char *physNamesOdroidC2_Rev2 [64] =
145{
146 NULL,
147
148 " 3.3V", "5V ",
149 " SDA.1", "5V ",
150 " SCL.1", "GND(0V) ",
151 "GPIO.249", "TxD1 ",
152 " GND(0V)", "RxD1 ",
153 "GPIO.247", "GPIO.238",
154 "GPIO.239", "GND(0V) ",
155 "GPIO.237", "GPIO.236",
156 " 3.3V", "GPIO.233",
157 "GPIO.235", "GND(0V) ",
158 "GPIO.232", "GPIO.231",
159 "GPIO.230", "GPIO.229",
160 " GND(0V)", "GPIO.225",
161 " SDA.2", "SCL.2 ",
162 "GPIO.228", "GND(0V) ",
163 "GPIO.219", "GPIO.224",
164 "GPIO.234", "GND(0V) ",
165 "GPIO.214", "GPIO.218",
166 " AIN.1", "1V8 ",
167 " GND(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 *physNamesOdroidC2_Rev1 [64] =
176{
177 NULL,
178
179 " 3.3V", "5V ",
180 " SDA.1", "5V ",
181 " SCL.1", "GND(0V) ",
182 "GPIO.214", "--------",
183 " GND(0V)", "--------",
184 "GPIO.219", "GPIO.218",
185 "GPIO.247", "GND(0V) ",
186 "--------", "GPIO.235",
187 " 3.3V", "GPIO.233",
188 "GPIO.238", "GND(0V) ",
189 "GPIO.237", "GPIO.234",
190 "GPIO.236", "GPIO.248",
191 " GND(0V)", "GPIO.249",
192 " SDA.2", "SCL.2 ",
193 "GPIO.232", "GND(0V) ",
194 "GPIO.231", "GPIO.230",
195 "GPIO.239", "GND(0V) ",
196 "GPIO.228", "GPIO.229",
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,
203} ;
204
205/*----------------------------------------------------------------------------*/
206static const char *physNamesOdroidXU3 [64] =
207{
208 NULL,
209
210 " 3.3V", "5V ",
211 "I2C1.SDA", "5V ",
212 "I2C1.SCL", "GND(0V) ",
213 "GPIO. 18", "UART0.TX",
214 " GND(0V)", "UART0.RX",
215 "GPIO.174", "GPIO.173",
216 "GPIO. 21", "GND(0V) ",
217 "GPIO. 22", "GPIO. 19",
218 " 3.3V", "GPIO. 23",
219 " MOSI", "GND(0V) ",
220 " MISO", "GPIO. 24",
221 " SCLK", "CE0 ",
222 " GND(0V)", "GPIO. 25",
223 "I2C5.SDA", "I2C5.SCL",
224 "GPIO. 28", "GND(0V) ",
225 "GPIO. 30", "GPIO. 29",
226 "GPIO. 31", "GND(0V) ",
227 "POWER ON", "GPIO. 33",
228 " AIN.0", "1V8 ",
229 " GND(0V)", "AIN.3 ",
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,
234} ;
235
236/*----------------------------------------------------------------------------*/
237static const char *physNamesOdroidN1 [64] =
238{
239 NULL,
240
241 " 3.0V", "5V ",
242 "I2C4_SDA", "5V ",
243 "I2C4_SCL", "GND(0V) ",
244 "GPIO1A.0", "UART0_TX",
245 " GND(0V)", "UART0_RX",
246 "GPIO1A.1", "GPIO1A.2",
247 "GPIO1A.3", "GND(0V) ",
248 "GPIO1A.4", "GPIO1B.5",
249 " 3.0V", "GPIO1C.2",
250 "SPI1_TXD", "GND(0V) ",
251 "SPI1_RXD", "GPIO1D.0",
252 "SPI1_CLK", "SPI1_CSN",
253 " GND(0V)", "GPIO1C.6",
254 "I2C8_SDA", "I2C8_SCL",
255 "SPDIF_TX", "GND(0V) ",
256 " PWM1", "GPIO4D.4",
257 "GPIO4D.0", "GND(0V) ",
258 "GPIO4D.5", "GPIO4D.6",
259 "ADC.AIN1", "1V8 ",
260 " GND(0V)", "ADC.AIN0",
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,
265} ;
266
267/*----------------------------------------------------------------------------*/
268static const char *physNamesOdroidN2 [64] =
269{
270 NULL,
271
272 " 3.3V", "5V ",
273 " SDA.2", "5V ",
274 " SCL.2", "GND(0V) ",
275 "GPIO.473", "TxD1 ",
276 " GND(0V)", "RxD1 ",
277 "GPIO.479", "GPIO.492",
278 "GPIO.480", "GND(0V) ",
279 "GPIO.483", "GPIO.476",
280 " 3.3V", "GPIO.477",
281 " MOSI", "GND(0V) ",
282 " MISO", "GPIO.478",
283 " SCLK", "CE0 ",
284 " GND(0V)", "GPIO.464",
285 " SDA.3", "SCL.3 ",
286 "GPIO.490", "GND(0V) ",
287 "GPIO.491", "GPIO.472",
288 "GPIO.481", "GND(0V) ",
289 "GPIO.482", "GPIO.495",
290 " AIN.3", "1V8 ",
291 " GND(0V)", "AIN.2 ",
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/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900299static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900300 int pin ;
301
302 // GPIO, wPi pin number
303 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
304 printf (" | | ") ;
305 else if (physPinToGpio (physPin) != -1)
306 printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]);
307 else
308 printf (" | | %3d", physToWpi [physPin]);
309
310 // GPIO pin name
311 printf (" | %s", physNames [physPin]) ;
312
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900313 // GPIO pin mode, value
314 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
315 printf(" | | ");
316 if (isAll == TRUE)
317 printf(" | | ");
318 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900319 if (wpMode == MODE_GPIO)
320 pin = physPinToGpio (physPin);
321 else if (wpMode == MODE_PHYS)
322 pin = physPin ;
323 else
324 pin = physToWpi [physPin];
325
326 printf (" | %4s", alts [getAlt (pin)]) ;
327 printf (" | %d", digitalRead (pin)) ;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900328
329 // GPIO pin drive strength, pu/pd
330 if (isAll == TRUE) {
331 switch (model) {
332 case MODEL_ODROID_N1:
333 printf (" | | ");
334 break;
335 case MODEL_ODROID_C1:
336 case MODEL_ODROID_C2:
337 printf (" | | %5s", pupd[getPUPD(pin)]);
338 break;
339 case MODEL_ODROID_XU3:
340 case MODEL_ODROID_N2:
341 printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]);
342 break;
343 default:
344 break;
345 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900346 }
347 }
348
349 // Physical pin number
350 printf (" | %2d", physPin) ;
351 ++physPin ;
352 printf (" || %-2d", physPin) ;
353
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900354 // GPIO pin mode, value
355 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
356 printf(" |");
357 if (isAll == TRUE)
358 printf(" | |");
359 printf (" | ");
360 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900361 if (wpMode == MODE_GPIO)
362 pin = physPinToGpio (physPin);
363 else if (wpMode == MODE_PHYS)
364 pin = physPin ;
365 else
366 pin = physToWpi [physPin];
367
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900368
369 // GPIO pin drive strength, pu/pd
370 if (isAll == TRUE) {
371 switch (model) {
372 case MODEL_ODROID_N1:
373 printf (" | | ");
374 break;
375 case MODEL_ODROID_C1:
376 case MODEL_ODROID_C2:
377 printf (" | %-5s | ", pupd[getPUPD(pin)]);
378 break;
379 case MODEL_ODROID_XU3:
380 case MODEL_ODROID_N2:
381 printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin));
382 break;
383 default:
384 break;
385 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900386 }
387 printf (" | %d", digitalRead (pin));
388 printf (" | %-4s", alts [getAlt (pin)]);
389 }
390
391 // GPIO pin name
392 printf (" | %-6s", physNames [physPin]);
393
394 // GPIO, wPi pin number
395 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
396 printf (" | | ") ;
397 else if (physPinToGpio (physPin) != -1)
398 printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin));
399 else
400 printf (" | %-3d | ", physToWpi [physPin]);
401
402 printf (" |\n") ;
403}
404
405/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900406static void printHeader(const char *headerName, int isAll) {
407 const char *headerLeft = " +------+-----+----------+------+---+";
408 const char *headerRight = "+---+------+----------+-----+------+\n";
409 const char *headerLeftAll = " +------+-----+----------+------+---+----+";
410 const char *headerRightAll = "+----+---+------+----------+-----+------+\n";
joshua-yang4b08e7f2019-02-21 12:05:24 +0900411
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900412 (isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll);
413 printf("%s", headerName);
414 (isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll);
415}
416
417/*----------------------------------------------------------------------------*/
418static void printBody(int model, int rev, const char *physNames[], int isAll) {
419 (isAll == FALSE)
420 ? printf(
421 " | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |\n"
422 " +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n")
423 : printf(
424 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n"
425 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n");
426 for (int pin = 1; pin <= 40; pin += 2)
427 readallPhys(model, rev, pin, physNames, isAll);
428 (isAll == FALSE)
429 ? printf(
430 " +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n"
431 " | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |\n")
432 : printf(
433 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"
434 " | 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 +0900435}
436
437/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100438/*
439 * doReadall:
440 * Read all the GPIO pins
441 * We also want to use this to read the state of pins on an externally
442 * connected device, so we need to do some fiddling with the internal
443 * wiringPi node structures - since the gpio command can only use
444 * one external device at a time, we'll use that to our advantage...
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100445 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900446/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900447void doReadall(int argc, char *argv[]) {
448 int model, rev, mem, maker, overVolted, isAll;
449 char *headerName, *physNames;
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100450
joshua-yang4b08e7f2019-02-21 12:05:24 +0900451 // External readall
452 if (wiringPiNodes != NULL) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900453 doReadallExternal();
454 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900455 }
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100456
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900457 if (argc <= 2) {
458 isAll = FALSE;
459 } else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) {
460 isAll = TRUE;
461 } else {
462 printf("Oops - unknown readall option:\n");
463 for (int i = 3; i < argc + 1; i++)
464 printf("\targv[%d]: %s\n", i, argv[i - 1]);
465
466 return;
467 }
468
469 piBoardId (&model, &rev, &mem, &maker, &overVolted);
Gordon Henderson6fba4032014-06-24 19:23:31 +0100470
joshua-yang4b08e7f2019-02-21 12:05:24 +0900471 switch (model) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900472 case MODEL_ODROID_C1:
473 headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model ODROID-C1 ----";
474 physNames = (char *) physNamesOdroidC1;
475 break;
476 case MODEL_ODROID_C2:
477 headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model ODROID-C2 ----";
478 if (rev == 1)
479 physNames = (char *) physNamesOdroidC2_Rev1;
480 else
481 physNames = (char *) physNamesOdroidC2_Rev2;
482 break;
483 case MODEL_ODROID_XU3:
484 headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---";
485 physNames = (char *) physNamesOdroidXU3;
486 break;
487 case MODEL_ODROID_N1:
488 headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model ODROID-N1 ----";
489 physNames = (char *) physNamesOdroidN1;
490 break;
491 case MODEL_ODROID_N2:
492 headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model ODROID-N2 ----";
493 physNames = (char *) physNamesOdroidN2;
494 break;
495 default:
496 printf("Oops - unknown model: %d\n", model);
497 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900498 }
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900499
500 printHeader((const char *) headerName, isAll);
501 printBody(model, rev, (const char **) physNames, isAll);
502 printHeader((const char *) headerName, isAll);
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100503}
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000504
joshua-yang4b08e7f2019-02-21 12:05:24 +0900505/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000506/*
507 * doAllReadall:
508 * Force reading of all pins regardless of Pi model
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000509 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900510/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900511void doAllReadall(void) {
512 char *fakeArgv[3] = { "", "", "--all" };
513
514 doReadall(3, fakeArgv);
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000515}
joshua-yang4b08e7f2019-02-21 12:05:24 +0900516
517/*----------------------------------------------------------------------------*/
518/*----------------------------------------------------------------------------*/