blob: 1279f013785462832aff3a2384a0d6625dc78c15 [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/*----------------------------------------------------------------------------*/
joshua-yang4b08e7f2019-02-21 12:05:24 +090046static const char *alts [] =
47{
48 "IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7"
49} ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010050
joshua-yang4b08e7f2019-02-21 12:05:24 +090051static const char *pupd [] =
52{
53 "DSBLD", "P/U", "P/D"
54} ;
55
56/*----------------------------------------------------------------------------*/
57static const int physToWpi [64] =
58{
59 -1, // 0
60 -1, -1, // 1, 2
61 8, -1,
62 9, -1,
63 7, 15,
64 -1, 16,
65 0, 1,
66 2, -1,
67 3, 4,
68 -1, 5,
69 12, -1,
70 13, 6,
71 14, 10,
72 -1, 11, // 25, 26
73 30, 31, // Actually I2C, but not used
74 21, -1,
75 22, 26,
76 23, -1,
77 24, 27,
78 25, 28,
79 -1, 29,
80 -1, -1,
81 -1, -1,
82 -1, -1,
83 -1, -1,
84 -1, -1,
85 17, 18,
86 19, 20,
87 -1, -1, -1, -1, -1, -1, -1, -1, -1
88} ;
89
90/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +090091static const char *physNamesOdroidC1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +090092{
93 NULL,
94
95 " 3.3V", "5V ",
96 " SDA.1", "5V ",
97 " SCL.1", "GND(0V) ",
98 "GPIO. 83", "TxD1 ",
99 " GND(0V)", "RxD1 ",
100 "GPIO. 88", "GPIO. 87",
101 "GPIO.116", "GND(0V) ",
102 "GPIO.115", "GPIO.104",
103 " 3.3V", "GPIO.102",
104 " MOSI", "GND(0V) ",
105 " MISO", "GPIO.103",
106 " SCLK", "CE0 ",
107 " GND(0V)", "GPIO.118",
108 " SDA.2", "SCL.2 ",
109 "GPIO.101", "GND(0V) ",
110 "GPIO.100", "GPIO. 99",
111 "GPIO.108", "GND(0V) ",
112 "GPIO.97 ", "GPIO. 98",
113 " AIN.1", "1V8 ",
114 " GND(0V)", "AIN.0 ",
115
116 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
117 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
118 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900119};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900120
121/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900122static const char *physNamesOdroidC1 [64] =
123{
124 NULL,
125
126 " 3.3V", "5V ",
127 " SDA.1", "5V ",
128 " SCL.1", "0V ",
129 " IO. 83", "TxD1 ",
130 " 0V", "RxD1 ",
131 " IO. 88", "IO. 87 ",
132 " IO.116", "0V ",
133 " IO.115", "IO.104 ",
134 " 3.3V", "IO.102 ",
135 " MOSI", "0V ",
136 " MISO", "IO.103 ",
137 " SCLK", "CE0 ",
138 " 0V", "IO.118 ",
139 " SDA.2", "SCL.2 ",
140 " IO.101", "0V ",
141 " IO.100", "IO. 99 ",
142 " IO.108", "0V ",
143 " IO.97 ", "IO. 98 ",
144 " AIN.1", "1V8 ",
145 " 0V", "AIN.0 ",
146
147 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
148 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
149 NULL,NULL,NULL,
150};
151
152/*----------------------------------------------------------------------------*/
153static const char *physNamesOdroidC2All_Rev2 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900154{
155 NULL,
156
157 " 3.3V", "5V ",
158 " SDA.1", "5V ",
159 " SCL.1", "GND(0V) ",
160 "GPIO.249", "TxD1 ",
161 " GND(0V)", "RxD1 ",
162 "GPIO.247", "GPIO.238",
163 "GPIO.239", "GND(0V) ",
164 "GPIO.237", "GPIO.236",
165 " 3.3V", "GPIO.233",
166 "GPIO.235", "GND(0V) ",
167 "GPIO.232", "GPIO.231",
168 "GPIO.230", "GPIO.229",
169 " GND(0V)", "GPIO.225",
170 " SDA.2", "SCL.2 ",
171 "GPIO.228", "GND(0V) ",
172 "GPIO.219", "GPIO.224",
173 "GPIO.234", "GND(0V) ",
174 "GPIO.214", "GPIO.218",
175 " AIN.1", "1V8 ",
176 " GND(0V)", "AIN.0 ",
177
178 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
179 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
180 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900181};
182
183/*----------------------------------------------------------------------------*/
184static const char *physNamesOdroidC2_Rev2 [64] =
185{
186 NULL,
187
188 " 3.3V", "5V ",
189 " SDA.1", "5V ",
190 " SCL.1", "0V ",
191 " IO.249", "TxD1 ",
192 " 0V", "RxD1 ",
193 " IO.247", "IO.238 ",
194 " IO.239", "0V ",
195 " IO.237", "IO.236 ",
196 " 3.3V", "IO.233 ",
197 " IO.235", "0V ",
198 " IO.232", "IO.231 ",
199 " IO.230", "IO.229 ",
200 " 0V", "IO.225 ",
201 " SDA.2", "SCL.2 ",
202 " IO.228", "0V ",
203 " IO.219", "IO.224 ",
204 " IO.234", "0V ",
205 " IO.214", "IO.218 ",
206 " AIN.1", "1V8 ",
207 " 0V", "AIN.0 ",
208
209 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
210 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
211 NULL,NULL,NULL,
joshua-yang4b08e7f2019-02-21 12:05:24 +0900212} ;
213
214/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900215static const char *physNamesOdroidC2All_Rev1 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900216{
217 NULL,
218
219 " 3.3V", "5V ",
220 " SDA.1", "5V ",
221 " SCL.1", "GND(0V) ",
222 "GPIO.214", "--------",
223 " GND(0V)", "--------",
224 "GPIO.219", "GPIO.218",
225 "GPIO.247", "GND(0V) ",
226 "--------", "GPIO.235",
227 " 3.3V", "GPIO.233",
228 "GPIO.238", "GND(0V) ",
229 "GPIO.237", "GPIO.234",
230 "GPIO.236", "GPIO.248",
231 " GND(0V)", "GPIO.249",
232 " SDA.2", "SCL.2 ",
233 "GPIO.232", "GND(0V) ",
234 "GPIO.231", "GPIO.230",
235 "GPIO.239", "GND(0V) ",
236 "GPIO.228", "GPIO.229",
237 " AIN.1", "1V8 ",
238 " GND(0V)", "AIN.0 ",
239
240 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
241 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
242 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900243};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900244
245/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900246static const char *physNamesOdroidC2_Rev1 [64] =
247{
248 NULL,
249
250 " 3.3V", "5V ",
251 " SDA.1", "5V ",
252 " SCL.1", "0V ",
253 " IO.214", "-------",
254 " 0V", "-------",
255 " IO.219", "IO.218 ",
256 " IO.247", "0V ",
257 "-------", "IO.235 ",
258 " 3.3V", "IO.233 ",
259 " IO.238", "0V ",
260 " IO.237", "IO.234 ",
261 " IO.236", "IO.248 ",
262 " 0V", "IO.249 ",
263 " SDA.2", "SCL.2 ",
264 " IO.232", "0V ",
265 " IO.231", "IO.230 ",
266 " IO.239", "0V ",
267 " IO.228", "IO.229 ",
268 " AIN.1", "1V8 ",
269 " 0V", "AIN.0 ",
270
271 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
272 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
273 NULL,NULL,NULL,
274};
275
276/*----------------------------------------------------------------------------*/
277static const char *physNamesOdroidXU3All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900278{
279 NULL,
280
281 " 3.3V", "5V ",
282 "I2C1.SDA", "5V ",
283 "I2C1.SCL", "GND(0V) ",
284 "GPIO. 18", "UART0.TX",
285 " GND(0V)", "UART0.RX",
286 "GPIO.174", "GPIO.173",
287 "GPIO. 21", "GND(0V) ",
288 "GPIO. 22", "GPIO. 19",
289 " 3.3V", "GPIO. 23",
290 " MOSI", "GND(0V) ",
291 " MISO", "GPIO. 24",
292 " SCLK", "CE0 ",
293 " GND(0V)", "GPIO. 25",
294 "I2C5.SDA", "I2C5.SCL",
295 "GPIO. 28", "GND(0V) ",
296 "GPIO. 30", "GPIO. 29",
297 "GPIO. 31", "GND(0V) ",
298 "POWER ON", "GPIO. 33",
299 " AIN.0", "1V8 ",
300 " GND(0V)", "AIN.3 ",
301
302 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
303 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
304 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900305};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900306
307/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900308static const char *physNamesOdroidXU3 [64] =
309{
310 NULL,
311
312 " 3.3V", "5V ",
313 "I2C1.DA", "5V ",
314 "I2C1.CL", "0V ",
315 " IO. 18", "UART.TX",
316 " 0V", "UART.RX",
317 " IO.174", "IO.173 ",
318 " IO. 21", "0V ",
319 " IO. 22", "IO. 19 ",
320 " 3.3V", "IO. 23 ",
321 " MOSI", "0V ",
322 " MISO", "IO. 24 ",
323 " SCLK", "CE0 ",
324 " 0V", "IO. 25 ",
325 "I2C5.DA", "I2C5.CL",
326 " IO. 28", "0V ",
327 " IO. 30", "IO. 29 ",
328 " IO. 31", "0V ",
329 " PWR ON", "IO. 33 ",
330 " AIN.0", "1V8 ",
331 " 0V", "AIN.3 ",
332
333 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
334 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
335 NULL,NULL,NULL,
336};
337
338/*----------------------------------------------------------------------------*/
339static const char *physNamesOdroidN1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900340{
341 NULL,
342
343 " 3.0V", "5V ",
344 "I2C4_SDA", "5V ",
345 "I2C4_SCL", "GND(0V) ",
346 "GPIO1A.0", "UART0_TX",
347 " GND(0V)", "UART0_RX",
348 "GPIO1A.1", "GPIO1A.2",
349 "GPIO1A.3", "GND(0V) ",
350 "GPIO1A.4", "GPIO1B.5",
351 " 3.0V", "GPIO1C.2",
352 "SPI1_TXD", "GND(0V) ",
353 "SPI1_RXD", "GPIO1D.0",
354 "SPI1_CLK", "SPI1_CSN",
355 " GND(0V)", "GPIO1C.6",
356 "I2C8_SDA", "I2C8_SCL",
357 "SPDIF_TX", "GND(0V) ",
358 " PWM1", "GPIO4D.4",
359 "GPIO4D.0", "GND(0V) ",
360 "GPIO4D.5", "GPIO4D.6",
361 "ADC.AIN1", "1V8 ",
362 " GND(0V)", "ADC.AIN0",
363
364 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
365 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
366 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900367};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900368
369/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900370static const char *physNamesOdroidN1 [64] =
371{
372 NULL,
373
374 " 3.0V", "5V ",
375 "I2C4.DA", "5V ",
376 "I2C4.CL", "0V ",
377 " IO1A.0", "UART.TX",
378 " 0V", "UART.RX",
379 " IO1A.1", "IO1A.2 ",
380 " IO1A.3", "0V ",
381 " IO1A.4", "IO1B.5 ",
382 " 3.0V", "IO1C.2 ",
383 "SPI.TXD", "0V ",
384 "SPI.RXD", "IO1D.0 ",
385 "SPI.CLK", "SPI.CSN",
386 " 0V", "IO1C.6 ",
387 "I2C8.DA", "I2C8.CL",
388 "SPDIF.T", "0V ",
389 " PWM1", "IO4D.4 ",
390 " IO4D.0", "0V ",
391 " IO4D.5", "IO4D.6 ",
392 " AIN1", "1V8 ",
393 " 0V", "AIN0 ",
394
395 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
396 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
397 NULL,NULL,NULL,
398};
399
400/*----------------------------------------------------------------------------*/
401static const char *physNamesOdroidN2All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900402{
403 NULL,
404
405 " 3.3V", "5V ",
406 " SDA.2", "5V ",
407 " SCL.2", "GND(0V) ",
408 "GPIO.473", "TxD1 ",
409 " GND(0V)", "RxD1 ",
410 "GPIO.479", "GPIO.492",
411 "GPIO.480", "GND(0V) ",
412 "GPIO.483", "GPIO.476",
413 " 3.3V", "GPIO.477",
414 " MOSI", "GND(0V) ",
415 " MISO", "GPIO.478",
416 " SCLK", "CE0 ",
417 " GND(0V)", "GPIO.464",
418 " SDA.3", "SCL.3 ",
419 "GPIO.490", "GND(0V) ",
420 "GPIO.491", "GPIO.472",
421 "GPIO.481", "GND(0V) ",
422 "GPIO.482", "GPIO.495",
423 " AIN.3", "1V8 ",
424 " GND(0V)", "AIN.2 ",
425
426 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
427 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
428 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900429};
430
431/*----------------------------------------------------------------------------*/
432static const char *physNamesOdroidN2 [64] =
433{
434 NULL,
435
436 " 3.3V", "5V ",
437 " SDA.2", "5V ",
438 " SCL.2", "0V ",
439 " IO.473", "TxD1 ",
440 " 0V", "RxD1 ",
441 " IO.479", "IO.492 ",
442 " IO.480", "0V ",
443 " IO.483", "IO.476 ",
444 " 3.3V", "IO.477 ",
445 " MOSI", "0V ",
446 " MISO", "IO.478 ",
447 " SCLK", "CE0 ",
448 " 0V", "IO.464 ",
449 " SDA.3", "SCL.3 ",
450 " IO.490", "0V ",
451 " IO.491", "IO.472 ",
452 " IO.481", "0V ",
453 " IO.482", "IO.495 ",
454 " AIN.3", "1V8 ",
455 " 0V", "AIN.2 ",
456
457 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
458 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
459 NULL,NULL,NULL,
460};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900461
462/*----------------------------------------------------------------------------*/
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900463static const char *physNamesOdroidC4All [64] =
464{
465 NULL,
466
467 " 3.3V", "5V ",
468 " SDA.2", "5V ",
469 " SCL.2", "GND(0V) ",
470 "GPIO.481", "TxD1 ",
471 " GND(0V)", "RxD1 ",
472 "GPIO.479", "GPIO.492",
473 "GPIO.480", "GND(0V) ",
474 "GPIO.483", "GPIO.476",
475 " 3.3V", "GPIO.477",
476 " MOSI", "GND(0V) ",
477 " MISO", "GPIO.478",
478 " SLCK", "SS ",
479 " GND(0V)", "GPIO. 23",
480 " SDA.3", "SCL.3 ",
481 "GPIO.490", "GND(0V) ",
482 "GPIO.491", "GPIO. 24",
483 "GPIO.482", "GND(0V) ",
484 "GPIO.495", "GPIO. 22",
485 " AIN.2", "1V8 ",
486 " GND(0V)", "AIN.0 ",
487
488 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
489 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
490 NULL,NULL,NULL,
491};
492
493/*----------------------------------------------------------------------------*/
494static const char *physNamesOdroidC4 [64] =
495{
496 NULL,
497
498 " 3.3V", "5V ",
499 " SDA.2", "5V ",
500 " SCL.2", "0V ",
501 " IO.481", "TxD1 ",
502 " 0V", "RxD1 ",
503 " IO.479", "IO.492 ",
504 " IO.480", "0V ",
505 " IO.483", "IO.476 ",
506 " 3.3V", "IO.477 ",
507 " MOSI", "0V ",
508 " MISO", "IO.478 ",
509 " SLCK", "SS ",
510 " 0V", "IO. 23 ",
511 " SDA.3", "SCL.3 ",
512 " IO.490", "0V ",
513 " IO.491", "IO. 24 ",
514 " IO.482", "0V ",
515 " IO.495", "IO. 22 ",
516 " AIN.2", "1V8 ",
517 " 0V", "AIN.0 ",
518
519 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
520 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
521 NULL,NULL,NULL,
522};
523
524/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900525static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900526 int pin ;
527
528 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900529 if (isAll == TRUE) {
530 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
531 printf(" | | ");
532 else if (physPinToGpio (physPin) != -1) {
533 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
534 } else
535 printf(" | | %3d", physToWpi [physPin]);
536 } else {
537 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
538 printf(" | | ");
539 else if (physPinToGpio (physPin) != -1) {
540 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
541 } else
542 printf(" | | %3d", physToWpi [physPin]);
543 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900544
545 // GPIO pin name
546 printf (" | %s", physNames [physPin]) ;
547
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900548 // GPIO pin mode, value
549 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
550 printf(" | | ");
551 if (isAll == TRUE)
552 printf(" | | ");
553 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900554 if (wpMode == MODE_GPIO)
555 pin = physPinToGpio (physPin);
556 else if (wpMode == MODE_PHYS)
557 pin = physPin ;
558 else
559 pin = physToWpi [physPin];
560
561 printf (" | %4s", alts [getAlt (pin)]) ;
562 printf (" | %d", digitalRead (pin)) ;
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:
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900576 case MODEL_ODROID_C4:
Deokgyu Yanga0bd5eb2020-03-20 11:16:06 +0900577 printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900578 break;
579 default:
580 break;
581 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900582 }
583 }
584
585 // Physical pin number
586 printf (" | %2d", physPin) ;
587 ++physPin ;
588 printf (" || %-2d", physPin) ;
589
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900590 // GPIO pin mode, value
591 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
592 printf(" |");
593 if (isAll == TRUE)
594 printf(" | |");
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900595 printf(" | ");
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900596 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900597 if (wpMode == MODE_GPIO)
598 pin = physPinToGpio (physPin);
599 else if (wpMode == MODE_PHYS)
600 pin = physPin ;
601 else
602 pin = physToWpi [physPin];
603
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900604
605 // GPIO pin drive strength, pu/pd
606 if (isAll == TRUE) {
607 switch (model) {
608 case MODEL_ODROID_N1:
609 printf (" | | ");
610 break;
611 case MODEL_ODROID_C1:
612 case MODEL_ODROID_C2:
613 printf (" | %-5s | ", pupd[getPUPD(pin)]);
614 break;
615 case MODEL_ODROID_XU3:
616 case MODEL_ODROID_N2:
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900617 case MODEL_ODROID_C4:
Deokgyu Yanga0bd5eb2020-03-20 11:16:06 +0900618 printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getDrive(pin));
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900619 break;
620 default:
621 break;
622 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900623 }
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900624 printf(" | %d", digitalRead (pin));
625 printf(" | %-4s", alts [getAlt (pin)]);
joshua-yang4b08e7f2019-02-21 12:05:24 +0900626 }
627
628 // GPIO pin name
629 printf (" | %-6s", physNames [physPin]);
630
631 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900632 if (isAll == TRUE) {
633 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
634 printf(" | | ");
635 else if (physPinToGpio (physPin) != -1)
636 printf(" | %-3d | %-3d ", physToWpi [physPin], physPinToGpio (physPin));
637 else
638 printf(" | %-3d | ", physToWpi [physPin]);
639 } else {
640 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
641 printf(" | | ");
642 else if (physPinToGpio (physPin) != -1)
643 printf(" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin));
644 else
645 printf(" | %-3d | ", physToWpi [physPin]);
646 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900647
648 printf (" |\n") ;
649}
650
651/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900652static void printHeader(const char *headerName, int isAll) {
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900653 const char *headerLeft = " +-----+-----+---------+------+---+";
654 const char *headerRight = "+---+------+---------+-----+-----+\n";
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900655 const char *headerLeftAll = " +------+-----+----------+------+---+----+";
656 const char *headerRightAll = "+----+---+------+----------+-----+------+\n";
joshua-yang4b08e7f2019-02-21 12:05:24 +0900657
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900658 (isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll);
659 printf("%s", headerName);
660 (isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll);
661}
662
663/*----------------------------------------------------------------------------*/
664static void printBody(int model, int rev, const char *physNames[], int isAll) {
665 (isAll == FALSE)
666 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900667 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n"
668 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900669 : printf(
670 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n"
671 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n");
672 for (int pin = 1; pin <= 40; pin += 2)
673 readallPhys(model, rev, pin, physNames, isAll);
674 (isAll == FALSE)
675 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900676 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n"
677 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900678 : printf(
679 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"
680 " | 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 +0900681}
682
683/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100684/*
685 * doReadall:
686 * Read all the GPIO pins
687 * We also want to use this to read the state of pins on an externally
688 * connected device, so we need to do some fiddling with the internal
689 * wiringPi node structures - since the gpio command can only use
690 * one external device at a time, we'll use that to our advantage...
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100691 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900692/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900693void doReadall(int argc, char *argv[]) {
694 int model, rev, mem, maker, overVolted, isAll;
695 char *headerName, *physNames;
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100696
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900697 if (argc <= 2) {
698 isAll = FALSE;
699 } else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) {
700 isAll = TRUE;
701 } else {
702 printf("Oops - unknown readall option:\n");
703 for (int i = 3; i < argc + 1; i++)
704 printf("\targv[%d]: %s\n", i, argv[i - 1]);
705
706 return;
707 }
708
709 piBoardId (&model, &rev, &mem, &maker, &overVolted);
Gordon Henderson6fba4032014-06-24 19:23:31 +0100710
joshua-yang4b08e7f2019-02-21 12:05:24 +0900711 switch (model) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900712 case MODEL_ODROID_C1:
713 headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model ODROID-C1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900714 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC1 : physNamesOdroidC1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900715 break;
716 case MODEL_ODROID_C2:
717 headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model ODROID-C2 ----";
718 if (rev == 1)
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900719 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev1 : physNamesOdroidC2All_Rev1);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900720 else
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900721 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev2 : physNamesOdroidC2All_Rev2);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900722 break;
723 case MODEL_ODROID_XU3:
724 headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900725 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidXU3 : physNamesOdroidXU3All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900726 break;
727 case MODEL_ODROID_N1:
728 headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model ODROID-N1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900729 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN1 : physNamesOdroidN1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900730 break;
731 case MODEL_ODROID_N2:
732 headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model ODROID-N2 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900733 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN2 : physNamesOdroidN2All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900734 break;
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900735 case MODEL_ODROID_C4:
736 headerName = (isAll == FALSE) ? "--- C4 ---" : "---- Model ODROID-C4 ----";
737 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC4 : physNamesOdroidC4All);
738 break;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900739 default:
740 printf("Oops - unknown model: %d\n", model);
741 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900742 }
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900743
744 printHeader((const char *) headerName, isAll);
745 printBody(model, rev, (const char **) physNames, isAll);
746 printHeader((const char *) headerName, isAll);
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100747}
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000748
joshua-yang4b08e7f2019-02-21 12:05:24 +0900749/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000750/*
751 * doAllReadall:
752 * Force reading of all pins regardless of Pi model
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000753 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900754/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900755void doAllReadall(void) {
756 char *fakeArgv[3] = { "", "", "--all" };
757
758 doReadall(3, fakeArgv);
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000759}
joshua-yang4b08e7f2019-02-21 12:05:24 +0900760
761/*----------------------------------------------------------------------------*/
762/*----------------------------------------------------------------------------*/