blob: e039f7875f613deac57e5f1375e93003e564c4a6 [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/*----------------------------------------------------------------------------*/
Deokgyu Yang2c7e86b2020-04-28 10:56:11 +090046/*
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...
51 */
52/*----------------------------------------------------------------------------*/
53static void doReadallExternal (void)
54{
55 int pin ;
56
57 printf ("+------+---------+--------+\n") ;
58 printf ("| Pin | Digital | Analog |\n") ;
59 printf ("+------+---------+--------+\n") ;
60
61 for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
62 printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ;
63
64 printf ("+------+---------+--------+\n") ;
65}
66
67/*----------------------------------------------------------------------------*/
joshua-yang4b08e7f2019-02-21 12:05:24 +090068static const char *alts [] =
69{
Steve Jeong47402612024-03-07 08:12:33 +000070 "IN", "OUT",
71 "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7",
72 "ALT8", "ALT9", "ALTa", "ALTb", "ALTc", "ALTd", "ALTe",
joshua-yang4b08e7f2019-02-21 12:05:24 +090073} ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010074
joshua-yang4b08e7f2019-02-21 12:05:24 +090075static const char *pupd [] =
76{
77 "DSBLD", "P/U", "P/D"
78} ;
79
80/*----------------------------------------------------------------------------*/
81static const int physToWpi [64] =
82{
83 -1, // 0
84 -1, -1, // 1, 2
85 8, -1,
86 9, -1,
87 7, 15,
88 -1, 16,
89 0, 1,
90 2, -1,
91 3, 4,
92 -1, 5,
93 12, -1,
94 13, 6,
95 14, 10,
96 -1, 11, // 25, 26
97 30, 31, // Actually I2C, but not used
98 21, -1,
99 22, 26,
100 23, -1,
101 24, 27,
102 25, 28,
103 -1, 29,
104 -1, -1,
105 -1, -1,
106 -1, -1,
107 -1, -1,
108 -1, -1,
109 17, 18,
110 19, 20,
111 -1, -1, -1, -1, -1, -1, -1, -1, -1
112} ;
113
114/*----------------------------------------------------------------------------*/
Deokgyu Yange94695f2020-11-13 12:56:17 +0900115static const int physToWpiHC4 [64] =
116{
117 -1, // 0
118 -1, 0, // 1, 2
119 1, 2,
120 -1,
121} ;
122
123/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900124static const char *physNamesOdroidC1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900125{
126 NULL,
127
128 " 3.3V", "5V ",
129 " SDA.1", "5V ",
130 " SCL.1", "GND(0V) ",
131 "GPIO. 83", "TxD1 ",
132 " GND(0V)", "RxD1 ",
133 "GPIO. 88", "GPIO. 87",
134 "GPIO.116", "GND(0V) ",
135 "GPIO.115", "GPIO.104",
136 " 3.3V", "GPIO.102",
137 " MOSI", "GND(0V) ",
138 " MISO", "GPIO.103",
139 " SCLK", "CE0 ",
140 " GND(0V)", "GPIO.118",
141 " SDA.2", "SCL.2 ",
142 "GPIO.101", "GND(0V) ",
143 "GPIO.100", "GPIO. 99",
144 "GPIO.108", "GND(0V) ",
145 "GPIO.97 ", "GPIO. 98",
146 " AIN.1", "1V8 ",
147 " GND(0V)", "AIN.0 ",
148
149 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
150 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
151 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900152};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900153
154/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900155static const char *physNamesOdroidC1 [64] =
156{
157 NULL,
158
159 " 3.3V", "5V ",
160 " SDA.1", "5V ",
161 " SCL.1", "0V ",
162 " IO. 83", "TxD1 ",
163 " 0V", "RxD1 ",
164 " IO. 88", "IO. 87 ",
165 " IO.116", "0V ",
166 " IO.115", "IO.104 ",
167 " 3.3V", "IO.102 ",
168 " MOSI", "0V ",
169 " MISO", "IO.103 ",
170 " SCLK", "CE0 ",
171 " 0V", "IO.118 ",
172 " SDA.2", "SCL.2 ",
173 " IO.101", "0V ",
174 " IO.100", "IO. 99 ",
175 " IO.108", "0V ",
176 " IO.97 ", "IO. 98 ",
177 " AIN.1", "1V8 ",
178 " 0V", "AIN.0 ",
179
180 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
181 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
182 NULL,NULL,NULL,
183};
184
185/*----------------------------------------------------------------------------*/
186static const char *physNamesOdroidC2All_Rev2 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900187{
188 NULL,
189
190 " 3.3V", "5V ",
191 " SDA.1", "5V ",
192 " SCL.1", "GND(0V) ",
193 "GPIO.249", "TxD1 ",
194 " GND(0V)", "RxD1 ",
195 "GPIO.247", "GPIO.238",
196 "GPIO.239", "GND(0V) ",
197 "GPIO.237", "GPIO.236",
198 " 3.3V", "GPIO.233",
199 "GPIO.235", "GND(0V) ",
200 "GPIO.232", "GPIO.231",
201 "GPIO.230", "GPIO.229",
202 " GND(0V)", "GPIO.225",
203 " SDA.2", "SCL.2 ",
204 "GPIO.228", "GND(0V) ",
205 "GPIO.219", "GPIO.224",
206 "GPIO.234", "GND(0V) ",
207 "GPIO.214", "GPIO.218",
208 " AIN.1", "1V8 ",
209 " GND(0V)", "AIN.0 ",
210
211 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
212 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
213 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900214};
215
216/*----------------------------------------------------------------------------*/
217static const char *physNamesOdroidC2_Rev2 [64] =
218{
219 NULL,
220
221 " 3.3V", "5V ",
222 " SDA.1", "5V ",
223 " SCL.1", "0V ",
224 " IO.249", "TxD1 ",
225 " 0V", "RxD1 ",
226 " IO.247", "IO.238 ",
227 " IO.239", "0V ",
228 " IO.237", "IO.236 ",
229 " 3.3V", "IO.233 ",
230 " IO.235", "0V ",
231 " IO.232", "IO.231 ",
232 " IO.230", "IO.229 ",
233 " 0V", "IO.225 ",
234 " SDA.2", "SCL.2 ",
235 " IO.228", "0V ",
236 " IO.219", "IO.224 ",
237 " IO.234", "0V ",
238 " IO.214", "IO.218 ",
239 " AIN.1", "1V8 ",
240 " 0V", "AIN.0 ",
241
242 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
243 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
244 NULL,NULL,NULL,
joshua-yang4b08e7f2019-02-21 12:05:24 +0900245} ;
246
247/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900248static const char *physNamesOdroidC2All_Rev1 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900249{
250 NULL,
251
252 " 3.3V", "5V ",
253 " SDA.1", "5V ",
254 " SCL.1", "GND(0V) ",
255 "GPIO.214", "--------",
256 " GND(0V)", "--------",
257 "GPIO.219", "GPIO.218",
258 "GPIO.247", "GND(0V) ",
259 "--------", "GPIO.235",
260 " 3.3V", "GPIO.233",
261 "GPIO.238", "GND(0V) ",
262 "GPIO.237", "GPIO.234",
263 "GPIO.236", "GPIO.248",
264 " GND(0V)", "GPIO.249",
265 " SDA.2", "SCL.2 ",
266 "GPIO.232", "GND(0V) ",
267 "GPIO.231", "GPIO.230",
268 "GPIO.239", "GND(0V) ",
269 "GPIO.228", "GPIO.229",
270 " AIN.1", "1V8 ",
271 " GND(0V)", "AIN.0 ",
272
273 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
274 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
275 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900276};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900277
278/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900279static const char *physNamesOdroidC2_Rev1 [64] =
280{
281 NULL,
282
283 " 3.3V", "5V ",
284 " SDA.1", "5V ",
285 " SCL.1", "0V ",
286 " IO.214", "-------",
287 " 0V", "-------",
288 " IO.219", "IO.218 ",
289 " IO.247", "0V ",
290 "-------", "IO.235 ",
291 " 3.3V", "IO.233 ",
292 " IO.238", "0V ",
293 " IO.237", "IO.234 ",
294 " IO.236", "IO.248 ",
295 " 0V", "IO.249 ",
296 " SDA.2", "SCL.2 ",
297 " IO.232", "0V ",
298 " IO.231", "IO.230 ",
299 " IO.239", "0V ",
300 " IO.228", "IO.229 ",
301 " AIN.1", "1V8 ",
302 " 0V", "AIN.0 ",
303
304 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
305 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
306 NULL,NULL,NULL,
307};
308
309/*----------------------------------------------------------------------------*/
310static const char *physNamesOdroidXU3All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900311{
312 NULL,
313
314 " 3.3V", "5V ",
315 "I2C1.SDA", "5V ",
316 "I2C1.SCL", "GND(0V) ",
317 "GPIO. 18", "UART0.TX",
318 " GND(0V)", "UART0.RX",
319 "GPIO.174", "GPIO.173",
320 "GPIO. 21", "GND(0V) ",
321 "GPIO. 22", "GPIO. 19",
322 " 3.3V", "GPIO. 23",
323 " MOSI", "GND(0V) ",
324 " MISO", "GPIO. 24",
325 " SCLK", "CE0 ",
326 " GND(0V)", "GPIO. 25",
327 "I2C5.SDA", "I2C5.SCL",
328 "GPIO. 28", "GND(0V) ",
329 "GPIO. 30", "GPIO. 29",
330 "GPIO. 31", "GND(0V) ",
331 "POWER ON", "GPIO. 33",
332 " AIN.0", "1V8 ",
333 " GND(0V)", "AIN.3 ",
334
335 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
336 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
337 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900338};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900339
340/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900341static const char *physNamesOdroidXU3 [64] =
342{
343 NULL,
344
345 " 3.3V", "5V ",
346 "I2C1.DA", "5V ",
347 "I2C1.CL", "0V ",
348 " IO. 18", "UART.TX",
349 " 0V", "UART.RX",
350 " IO.174", "IO.173 ",
351 " IO. 21", "0V ",
352 " IO. 22", "IO. 19 ",
353 " 3.3V", "IO. 23 ",
354 " MOSI", "0V ",
355 " MISO", "IO. 24 ",
356 " SCLK", "CE0 ",
357 " 0V", "IO. 25 ",
358 "I2C5.DA", "I2C5.CL",
359 " IO. 28", "0V ",
360 " IO. 30", "IO. 29 ",
361 " IO. 31", "0V ",
362 " PWR ON", "IO. 33 ",
363 " AIN.0", "1V8 ",
364 " 0V", "AIN.3 ",
365
366 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
367 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
368 NULL,NULL,NULL,
369};
370
371/*----------------------------------------------------------------------------*/
372static const char *physNamesOdroidN1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900373{
374 NULL,
375
376 " 3.0V", "5V ",
377 "I2C4_SDA", "5V ",
378 "I2C4_SCL", "GND(0V) ",
379 "GPIO1A.0", "UART0_TX",
380 " GND(0V)", "UART0_RX",
381 "GPIO1A.1", "GPIO1A.2",
382 "GPIO1A.3", "GND(0V) ",
383 "GPIO1A.4", "GPIO1B.5",
384 " 3.0V", "GPIO1C.2",
385 "SPI1_TXD", "GND(0V) ",
386 "SPI1_RXD", "GPIO1D.0",
387 "SPI1_CLK", "SPI1_CSN",
388 " GND(0V)", "GPIO1C.6",
389 "I2C8_SDA", "I2C8_SCL",
390 "SPDIF_TX", "GND(0V) ",
391 " PWM1", "GPIO4D.4",
392 "GPIO4D.0", "GND(0V) ",
393 "GPIO4D.5", "GPIO4D.6",
394 "ADC.AIN1", "1V8 ",
395 " GND(0V)", "ADC.AIN0",
396
397 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
398 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
399 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900400};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900401
402/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900403static const char *physNamesOdroidN1 [64] =
404{
405 NULL,
406
407 " 3.0V", "5V ",
408 "I2C4.DA", "5V ",
409 "I2C4.CL", "0V ",
410 " IO1A.0", "UART.TX",
411 " 0V", "UART.RX",
412 " IO1A.1", "IO1A.2 ",
413 " IO1A.3", "0V ",
414 " IO1A.4", "IO1B.5 ",
415 " 3.0V", "IO1C.2 ",
416 "SPI.TXD", "0V ",
417 "SPI.RXD", "IO1D.0 ",
418 "SPI.CLK", "SPI.CSN",
419 " 0V", "IO1C.6 ",
420 "I2C8.DA", "I2C8.CL",
421 "SPDIF.T", "0V ",
422 " PWM1", "IO4D.4 ",
423 " IO4D.0", "0V ",
424 " IO4D.5", "IO4D.6 ",
425 " AIN1", "1V8 ",
426 " 0V", "AIN0 ",
427
428 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
429 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
430 NULL,NULL,NULL,
431};
432
433/*----------------------------------------------------------------------------*/
434static const char *physNamesOdroidN2All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900435{
436 NULL,
437
438 " 3.3V", "5V ",
439 " SDA.2", "5V ",
440 " SCL.2", "GND(0V) ",
441 "GPIO.473", "TxD1 ",
442 " GND(0V)", "RxD1 ",
443 "GPIO.479", "GPIO.492",
444 "GPIO.480", "GND(0V) ",
445 "GPIO.483", "GPIO.476",
446 " 3.3V", "GPIO.477",
447 " MOSI", "GND(0V) ",
448 " MISO", "GPIO.478",
449 " SCLK", "CE0 ",
450 " GND(0V)", "GPIO.464",
451 " SDA.3", "SCL.3 ",
452 "GPIO.490", "GND(0V) ",
453 "GPIO.491", "GPIO.472",
454 "GPIO.481", "GND(0V) ",
455 "GPIO.482", "GPIO.495",
456 " AIN.3", "1V8 ",
457 " GND(0V)", "AIN.2 ",
458
459 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
460 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
461 NULL,NULL,NULL,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900462};
463
464/*----------------------------------------------------------------------------*/
465static const char *physNamesOdroidN2 [64] =
466{
467 NULL,
468
469 " 3.3V", "5V ",
470 " SDA.2", "5V ",
471 " SCL.2", "0V ",
472 " IO.473", "TxD1 ",
473 " 0V", "RxD1 ",
474 " IO.479", "IO.492 ",
475 " IO.480", "0V ",
476 " IO.483", "IO.476 ",
477 " 3.3V", "IO.477 ",
478 " MOSI", "0V ",
479 " MISO", "IO.478 ",
480 " SCLK", "CE0 ",
481 " 0V", "IO.464 ",
482 " SDA.3", "SCL.3 ",
483 " IO.490", "0V ",
484 " IO.491", "IO.472 ",
485 " IO.481", "0V ",
486 " IO.482", "IO.495 ",
487 " AIN.3", "1V8 ",
488 " 0V", "AIN.2 ",
489
490 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
491 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
492 NULL,NULL,NULL,
493};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900494
495/*----------------------------------------------------------------------------*/
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900496static const char *physNamesOdroidC4All [64] =
497{
498 NULL,
499
500 " 3.3V", "5V ",
501 " SDA.2", "5V ",
502 " SCL.2", "GND(0V) ",
503 "GPIO.481", "TxD1 ",
504 " GND(0V)", "RxD1 ",
505 "GPIO.479", "GPIO.492",
506 "GPIO.480", "GND(0V) ",
507 "GPIO.483", "GPIO.476",
508 " 3.3V", "GPIO.477",
509 " MOSI", "GND(0V) ",
510 " MISO", "GPIO.478",
511 " SLCK", "SS ",
512 " GND(0V)", "GPIO. 23",
513 " SDA.3", "SCL.3 ",
514 "GPIO.490", "GND(0V) ",
515 "GPIO.491", "GPIO. 24",
516 "GPIO.482", "GND(0V) ",
517 "GPIO.495", "GPIO. 22",
518 " AIN.2", "1V8 ",
519 " GND(0V)", "AIN.0 ",
520
521 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
522 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
523 NULL,NULL,NULL,
524};
525
526/*----------------------------------------------------------------------------*/
527static const char *physNamesOdroidC4 [64] =
528{
529 NULL,
530
531 " 3.3V", "5V ",
532 " SDA.2", "5V ",
533 " SCL.2", "0V ",
534 " IO.481", "TxD1 ",
535 " 0V", "RxD1 ",
536 " IO.479", "IO.492 ",
537 " IO.480", "0V ",
538 " IO.483", "IO.476 ",
539 " 3.3V", "IO.477 ",
540 " MOSI", "0V ",
541 " MISO", "IO.478 ",
542 " SLCK", "SS ",
543 " 0V", "IO. 23 ",
544 " SDA.3", "SCL.3 ",
545 " IO.490", "0V ",
546 " IO.491", "IO. 24 ",
547 " IO.482", "0V ",
548 " IO.495", "IO. 22 ",
549 " AIN.2", "1V8 ",
550 " 0V", "AIN.0 ",
551
552 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
553 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
554 NULL,NULL,NULL,
555};
556
557/*----------------------------------------------------------------------------*/
Deokgyu Yange94695f2020-11-13 12:56:17 +0900558static const char *physNamesOdroidHC4All [64] =
559{
560 NULL,
561
562 " 3.3V",
563 " SDA.2",
564 " SCL.2",
565 "GPIO.481",
566 " 0V",
567
568 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
569 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
570 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
571 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
572 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
573 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
574};
575
576/*----------------------------------------------------------------------------*/
577static const char *physNamesOdroidHC4 [64] =
578{
579 NULL,
580
581 " 3.3V",
582 " SDA.2",
583 " SCL.2",
584 " IO.481",
585 " 0V",
586
587 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
588 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
589 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
590 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
591 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
592 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
593};
594
595/*----------------------------------------------------------------------------*/
Steve Jeongf78d9822022-01-20 03:02:38 +0000596static const char *physNamesOdroidM1All [64] =
597{
598 NULL,
599
600 " 3.3V", "5V ",
601 "I2C0_SDA", "5V ",
602 "I2C0_SCL", "GND(0V) ",
603 "GPIO0_B6", "UART1_TX",
604 " GND(0V)", "UART1_RX",
605 "GPIO0_C0", "GPIO3_D0",
606 "GPIO0_C1", "GND(0V) ",
607 "GPIO3_B2", "GPIO3_C6",
608 " 3.3V", "GPIO3_C7",
609 "SPI_MOSI", "GND(0V) ",
610 "SPI_MISO", "GPIO3_D1",
611 " SPI_CLK", "SPI_CS0 ",
612 " GND(0V)", "GPIO3_D2",
613 "I2C1_SDA", "I2C1_SCL",
614 "GPIO4_C1", "GND(0V) ",
615 "GPIO4_B6", "GPIO3_D3",
616 "GPIO0_B5", "GND(0V) ",
617 "GPIO3_D5", "GPIO3_D4",
618 "ADC.AIN1", "1V8 ",
619 " GND(0V)", "ADC.AIN0",
620
621 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
622 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
623 NULL,NULL,NULL,
624};
625
626/*----------------------------------------------------------------------------*/
627static const char *physNamesOdroidM1 [64] =
628{
629 NULL,
630
631 " 3.3V", "5V ",
632 " SDA0", "5V ",
633 " SCL0", "0V ",
634 " IO0_B6", "UART.TX",
635 " 0V", "UART.RX",
636 " IO0_C0", "IO3_D0 ",
637 " IO0_C1", "0V ",
638 " IO3_B2", "IO3_C6 ",
639 " 3.3V", "IO3_C7 ",
640 "SPI.TXD", "0V ",
641 "SPI.RXD", "IO3_D1 ",
642 "SPI.CLK", "SPI.CS0",
643 " 0V", "IO3_D2 ",
644 " SDA1", "SCL1 ",
645 " IO4_C1", "0V ",
646 " IO4_B6", "IO3_D3 ",
647 " IO0_B5", "0V ",
648 " IO3_D5", "IO3_D4 ",
649 " AIN1", "1V8 ",
650 " 0V", "AIN0 ",
651
652 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
653 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
654 NULL,NULL,NULL,
655};
656
657/*----------------------------------------------------------------------------*/
Steve Jeong329b9d72023-08-11 07:15:13 +0000658static const char *physNamesOdroidM1SAll [64] =
659{
660 NULL,
661
662 " 3.3V", "5V ",
663 "I2C0_SDA", "5V ",
664 "I2C0_SCL", "GND(0V) ",
665 "GPIO0_B6", "UART1_TX",
666 " GND(0V)", "UART1_RX",
667 "GPIO0_C0", "GPIO2_A7",
668 "GPIO0_C1", "GND(0V) ",
669 "GPIO0_C2", "GPIO2_B5",
670 " 3.3V", "GPIO2_B6",
671 "SPI_MOSI", "GND(0V) ",
672 "SPI_MISO", "GPIO2_B0",
673 " SPI_CLK", "SPI_CS0 ",
674 " GND(0V)", "GPIO2_B1",
675 "I2C1_SDA", "I2C1_SCL",
676 "GPIO2_C0", "GND(0V) ",
677 "GPIO2_B7", "GPIO2_B2",
678 "GPIO0_B5", "GND(0V) ",
679 "GPIO2_A5", "GPIO2_A6",
680 "ADC.AIN1", "1V8 ",
681 " GND(0V)", "ADC.AIN0",
682
683 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
684 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
685 NULL,NULL,NULL,
686};
687
688/*----------------------------------------------------------------------------*/
689static const char *physNamesOdroidM1S [64] =
690{
691 NULL,
692
693 " 3.3V", "5V ",
694 " SDA0", "5V ",
695 " SCL0", "0V ",
696 " IO0_B6", "UART.TX",
697 " 0V", "UART.RX",
698 " IO0_C0", "IO2_A7 ",
699 " IO0_C1", "0V ",
700 " IO0_C2", "IO2_B5 ",
701 " 3.3V", "IO2_B6 ",
702 "SPI.TXD", "0V ",
703 "SPI.RXD", "IO2_B0 ",
704 "SPI.CLK", "SPI.CS0",
705 " 0V", "IO2_B1 ",
706 " SDA1", "SCL1 ",
707 " IO2_C0", "0V ",
708 " IO2_B7", "IO2_B2 ",
709 " IO0_B5", "0V ",
710 " IO2_A5", "IO2_A6 ",
711 " AIN1", "1V8 ",
712 " 0V", "AIN0 ",
713
714 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
715 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
716 NULL,NULL,NULL,
717};
718
Steve Jeong47402612024-03-07 08:12:33 +0000719/*----------------------------------------------------------------------------*/
720static const char *physNamesOdroidM2All [64] =
721{
722 NULL,
723
724 " 3.3V", "5V ",
725 "I2C0_SDA", "5V ",
726 "I2C0_SCL", "GND(0V) ",
727 "GPIO0_D0", "UART1_TX",
728 " GND(0V)", "UART1_RX",
729 "GPIO3_D4", "GPIO3_B2",
730 "GPIO3_D5", "GND(0V) ",
731 "GPIO4_B3", "GPIO1_B2",
732 " 3.3V", "GPIO1_B3",
733 "SPI_MOSI", "GND(0V) ",
734 "SPI_MISO", "GPIO0_D4",
735 " SPI_CLK", "SPI_CS0 ",
736 " GND(0V)", "GPIO1_B4",
737 "I2C1_SDA", "I2C1_SCL",
738 "GPIO1_B7", "GND(0V) ",
739 "GPIO1_B6", "GPIO4_B4",
740 "GPIO3_D0", "GND(0V) ",
741 "GPIO3_C7", "GPIO4_B5",
742 "ADC.AIN4", "1V8 ",
743 " GND(0V)", "ADC.AIN5",
744
745 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
746 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
747 NULL,NULL,NULL,
748};
749
750/*----------------------------------------------------------------------------*/
751static const char *physNamesOdroidM2 [64] =
752{
753 NULL,
754
755 " 3.3V", "5V ",
756 " SDA0", "5V ",
757 " SCL0", "0V ",
758 " IO0_D0", "UART.TX",
759 " 0V", "UART.RX",
760 " IO3_D4", "IO3_B2 ",
761 " IO3_D5", "0V ",
762 " IO4_B3", "IO1_B2 ",
763 " 3.3V", "IO1_B3 ",
764 "SPI.TXD", "0V ",
765 "SPI.RXD", "IO0_D4 ",
766 "SPI.CLK", "SPI.CS0",
767 " 0V", "IO1_B4 ",
768 " SDA1", "SCL1 ",
769 " IO1_B7", "0V ",
770 " IO1_B6", "IO4_B4 ",
771 " IO3_D0", "0V ",
772 " IO3_C7", "IO4_B5 ",
773 " AIN4", "1V8 ",
774 " 0V", "AIN5 ",
775
776 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
777 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
778 NULL,NULL,NULL,
779};
Steve Jeong329b9d72023-08-11 07:15:13 +0000780
781/*----------------------------------------------------------------------------*/
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900782static const char *physNamesOdroidC5All [64] =
783{
784 NULL,
785
786 " 3.3V", "5V ",
787 " SDA.0", "5V ",
788 " SCL.0", "GND(0V) ",
YoungSoo Shin5d169c72025-05-14 12:57:05 +0900789 " GPIOD_4", "TxD.0 ",
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900790 " GND(0V)", "RxD.0 ",
YoungSoo Shin02877a92025-04-30 14:31:03 +0900791 " GPIOX_5", "GPIOX_6 ",
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900792 "GPIOX_15", "GND(0V) ",
793 " GPIOX_4", "GPIODV_1",
794 " 3.3V", "GPIODV_2",
795 " MOSI", "GND(0V) ",
YoungSoo Shin02877a92025-04-30 14:31:03 +0900796 " MISO", "GPIOX_14",
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900797 " SLCK", "SS ",
798 " GND(0V)", "GPIOX_7 ",
799 " SDA.1", "SCL.1 ",
800 " GPIOH_4", "GND(0V) ",
801 " GPIOH_5", "GPIOX_2 ",
802 " GPIOX_0", "GND(0V) ",
803 " GPIOX_1", "GPIOX_3 ",
804 " AIN.1", "1V8 ",
805 " GND(0V)", "AIN.0 ",
806
807 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
808 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
809 NULL,NULL,NULL,
810};
811
812/*----------------------------------------------------------------------------*/
813static const char *physNamesOdroidC5 [64] =
814{
815 NULL,
816
817 " 3.3V", "5V ",
818 " SDA.0", "5V ",
819 " SCL.0", "0V ",
820 " IO_D4", "TxD1 ",
821 " 0V", "RxD1 ",
YoungSoo Shin02877a92025-04-30 14:31:03 +0900822 " IO_X5", "IOX_6 ",
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900823 " IO_X15", "0V ",
824 " IO_X4", "IO_DV1 ",
825 " 3.3V", "IO_DV2 ",
826 " MOSI", "0V ",
YoungSoo Shin02877a92025-04-30 14:31:03 +0900827 " MISO", "IO_X14 ",
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900828 " SLCK", "SS ",
829 " 0V", "IOX_7 ",
830 " SDA.1", "SCL.1 ",
831 " IO_H4", "0V ",
832 " IO_H5", "IOX_2 ",
833 " IO_X0", "0V ",
834 " IO_X1", "IOX_3 ",
835 " AIN.1", "1V8 ",
836 " 0V", "AIN.0 ",
837
838 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
839 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
840 NULL,NULL,NULL,
841};
842
843/*----------------------------------------------------------------------------*/
844
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900845static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900846 int pin ;
847
848 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900849 if (isAll == TRUE) {
850 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
851 printf(" | | ");
852 else if (physPinToGpio (physPin) != -1) {
853 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
854 } else
855 printf(" | | %3d", physToWpi [physPin]);
856 } else {
857 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
858 printf(" | | ");
859 else if (physPinToGpio (physPin) != -1) {
860 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
861 } else
862 printf(" | | %3d", physToWpi [physPin]);
863 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900864
865 // GPIO pin name
866 printf (" | %s", physNames [physPin]) ;
867
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900868 // GPIO pin mode, value
869 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
870 printf(" | | ");
871 if (isAll == TRUE)
872 printf(" | | ");
873 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900874 if (wpMode == MODE_GPIO)
875 pin = physPinToGpio (physPin);
876 else if (wpMode == MODE_PHYS)
877 pin = physPin ;
878 else
879 pin = physToWpi [physPin];
880
881 printf (" | %4s", alts [getAlt (pin)]) ;
882 printf (" | %d", digitalRead (pin)) ;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900883
884 // GPIO pin drive strength, pu/pd
885 if (isAll == TRUE) {
886 switch (model) {
887 case MODEL_ODROID_N1:
888 printf (" | | ");
889 break;
890 case MODEL_ODROID_C1:
891 case MODEL_ODROID_C2:
892 printf (" | | %5s", pupd[getPUPD(pin)]);
893 break;
894 case MODEL_ODROID_XU3:
895 case MODEL_ODROID_N2:
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900896 case MODEL_ODROID_C4:
Steve Jeongf78d9822022-01-20 03:02:38 +0000897 case MODEL_ODROID_M1:
Steve Jeong329b9d72023-08-11 07:15:13 +0000898 case MODEL_ODROID_M1S:
Steve Jeong47402612024-03-07 08:12:33 +0000899 case MODEL_ODROID_M2:
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900900 case MODEL_ODROID_C5:
Deokgyu Yanga0bd5eb2020-03-20 11:16:06 +0900901 printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900902 break;
903 default:
904 break;
905 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900906 }
907 }
908
909 // Physical pin number
910 printf (" | %2d", physPin) ;
911 ++physPin ;
912 printf (" || %-2d", physPin) ;
913
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900914 // GPIO pin mode, value
915 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
916 printf(" |");
917 if (isAll == TRUE)
918 printf(" | |");
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900919 printf(" | ");
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900920 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900921 if (wpMode == MODE_GPIO)
922 pin = physPinToGpio (physPin);
923 else if (wpMode == MODE_PHYS)
924 pin = physPin ;
925 else
926 pin = physToWpi [physPin];
927
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900928
929 // GPIO pin drive strength, pu/pd
930 if (isAll == TRUE) {
931 switch (model) {
932 case MODEL_ODROID_N1:
933 printf (" | | ");
934 break;
935 case MODEL_ODROID_C1:
936 case MODEL_ODROID_C2:
937 printf (" | %-5s | ", pupd[getPUPD(pin)]);
938 break;
939 case MODEL_ODROID_XU3:
940 case MODEL_ODROID_N2:
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900941 case MODEL_ODROID_C4:
Steve Jeongf78d9822022-01-20 03:02:38 +0000942 case MODEL_ODROID_M1:
Steve Jeong329b9d72023-08-11 07:15:13 +0000943 case MODEL_ODROID_M1S:
Steve Jeong47402612024-03-07 08:12:33 +0000944 case MODEL_ODROID_M2:
YoungSoo Shinb99cbc52024-10-11 12:17:15 +0900945 case MODEL_ODROID_C5:
Deokgyu Yanga0bd5eb2020-03-20 11:16:06 +0900946 printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getDrive(pin));
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900947 break;
948 default:
949 break;
950 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900951 }
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900952 printf(" | %d", digitalRead (pin));
953 printf(" | %-4s", alts [getAlt (pin)]);
joshua-yang4b08e7f2019-02-21 12:05:24 +0900954 }
955
956 // GPIO pin name
957 printf (" | %-6s", physNames [physPin]);
958
959 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900960 if (isAll == TRUE) {
961 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
962 printf(" | | ");
963 else if (physPinToGpio (physPin) != -1)
964 printf(" | %-3d | %-3d ", physToWpi [physPin], physPinToGpio (physPin));
965 else
966 printf(" | %-3d | ", physToWpi [physPin]);
967 } else {
968 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
969 printf(" | | ");
970 else if (physPinToGpio (physPin) != -1)
971 printf(" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin));
972 else
973 printf(" | %-3d | ", physToWpi [physPin]);
974 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900975
976 printf (" |\n") ;
977}
978
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900979static void printHeader(const char *headerName, int isAll) {
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900980 const char *headerLeft = " +-----+-----+---------+------+---+";
981 const char *headerRight = "+---+------+---------+-----+-----+\n";
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900982 const char *headerLeftAll = " +------+-----+----------+------+---+----+";
983 const char *headerRightAll = "+----+---+------+----------+-----+------+\n";
joshua-yang4b08e7f2019-02-21 12:05:24 +0900984
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900985 (isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll);
986 printf("%s", headerName);
987 (isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll);
988}
989
990/*----------------------------------------------------------------------------*/
991static void printBody(int model, int rev, const char *physNames[], int isAll) {
992 (isAll == FALSE)
993 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900994 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n"
995 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900996 : printf(
997 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n"
998 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n");
999 for (int pin = 1; pin <= 40; pin += 2)
1000 readallPhys(model, rev, pin, physNames, isAll);
1001 (isAll == FALSE)
1002 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001003 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n"
1004 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001005 : printf(
1006 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"
1007 " | 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 +09001008}
1009
1010/*----------------------------------------------------------------------------*/
Deokgyu Yange94695f2020-11-13 12:56:17 +09001011static void readallPhysHC4(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
1012 int pin ;
1013
1014 // GPIO, wPi pin number
1015 if (isAll == TRUE) {
1016 if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1))
1017 printf(" | | ");
1018 else if (physPinToGpio (physPin) != -1) {
1019 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]);
1020 } else
1021 printf(" | | %3d", physToWpiHC4 [physPin]);
1022 } else {
1023 if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1))
1024 printf(" | | ");
1025 else if (physPinToGpio (physPin) != -1) {
1026 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]);
1027 } else
1028 printf(" | | %3d", physToWpiHC4 [physPin]);
1029 }
1030
1031 // GPIO pin name
1032 printf (" | %s", physNames [physPin]) ;
1033
1034 // GPIO pin mode, value
1035 if ((physToWpiHC4 [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
1036 printf(" | | ");
1037 if (isAll == TRUE)
1038 printf(" | | ");
1039 } else {
1040 if (wpMode == MODE_GPIO)
1041 pin = physPinToGpio (physPin);
1042 else if (wpMode == MODE_PHYS)
1043 pin = physPin ;
1044 else
1045 pin = physToWpiHC4 [physPin];
1046
1047 printf (" | %4s", alts [getAlt (pin)]) ;
1048 printf (" | %d", digitalRead (pin)) ;
1049
1050 // GPIO pin drive strength, pu/pd
1051 if (isAll == TRUE) {
1052 switch (model) {
1053 case MODEL_ODROID_HC4:
1054 printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]);
1055 break;
1056 default:
1057 break;
1058 }
1059 }
1060 }
1061
1062 // Physical pin number
1063 printf(" | %2d |\n", physPin);
1064}
1065
1066/*----------------------------------------------------------------------------*/
1067static void printHeaderHC4(const char *headerName, int isAll) {
1068 const char *header = " +-----+-----+---------+------+---+-----+";
1069 const char *headerAll = " +------+-----+----------+------+---+----+-------+-----+";
1070
1071 (isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll);
1072 (isAll == FALSE)
1073 ? printf(" | %s |\n", headerName)
1074 : printf(" | %s |\n", headerName);
1075 (isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll);
1076}
1077
1078/*----------------------------------------------------------------------------*/
1079static void printBodyHC4(int model, int rev, const char *physNames[], int isAll) {
1080 (isAll == FALSE)
1081 ? printf(
1082 " | I/O | wPi | Name | Mode | V | Phy |\n"
1083 " +-----+-----+---------+------+---+-----+\n")
1084 : printf(
1085 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Phy |\n"
1086 " +------+-----+----------+------+---+----+-------+-----+\n");
1087 for (int pin = 1; pin <= 5; pin ++)
1088 readallPhysHC4(model, rev, pin, physNames, isAll);
1089 (isAll == FALSE)
1090 ? printf(
1091 " +-----+-----+---------+------+---+-----+\n"
1092 " | I/O | wPi | Name | Mode | V | Phy |\n")
1093 : printf(
1094 " +------+-----+----------+------+---+----+-------+-----+\n"
1095 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Phy |\n");
1096}
1097
1098/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +01001099/*
1100 * doReadall:
1101 * Read all the GPIO pins
1102 * We also want to use this to read the state of pins on an externally
1103 * connected device, so we need to do some fiddling with the internal
1104 * wiringPi node structures - since the gpio command can only use
1105 * one external device at a time, we'll use that to our advantage...
Gordon Henderson02a3bd82013-06-27 21:57:09 +01001106 */
joshua-yang4b08e7f2019-02-21 12:05:24 +09001107/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001108void doReadall(int argc, char *argv[]) {
1109 int model, rev, mem, maker, overVolted, isAll;
1110 char *headerName, *physNames;
Gordon Henderson02a3bd82013-06-27 21:57:09 +01001111
Deokgyu Yang2c7e86b2020-04-28 10:56:11 +09001112 // External readall
1113 if (wiringPiNodes != NULL) {
1114 doReadallExternal();
1115 return;
1116 }
1117
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001118 if (argc <= 2) {
1119 isAll = FALSE;
1120 } else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) {
1121 isAll = TRUE;
1122 } else {
1123 printf("Oops - unknown readall option:\n");
1124 for (int i = 3; i < argc + 1; i++)
1125 printf("\targv[%d]: %s\n", i, argv[i - 1]);
1126
1127 return;
1128 }
1129
1130 piBoardId (&model, &rev, &mem, &maker, &overVolted);
Gordon Henderson6fba4032014-06-24 19:23:31 +01001131
joshua-yang4b08e7f2019-02-21 12:05:24 +09001132 switch (model) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001133 case MODEL_ODROID_C1:
1134 headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model ODROID-C1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001135 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC1 : physNamesOdroidC1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001136 break;
1137 case MODEL_ODROID_C2:
1138 headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model ODROID-C2 ----";
1139 if (rev == 1)
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001140 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev1 : physNamesOdroidC2All_Rev1);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001141 else
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001142 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev2 : physNamesOdroidC2All_Rev2);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001143 break;
1144 case MODEL_ODROID_XU3:
1145 headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001146 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidXU3 : physNamesOdroidXU3All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001147 break;
1148 case MODEL_ODROID_N1:
1149 headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model ODROID-N1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001150 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN1 : physNamesOdroidN1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001151 break;
1152 case MODEL_ODROID_N2:
1153 headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model ODROID-N2 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +09001154 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN2 : physNamesOdroidN2All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001155 break;
Yang Deokgyuffeba7f2019-07-01 17:22:01 +09001156 case MODEL_ODROID_C4:
1157 headerName = (isAll == FALSE) ? "--- C4 ---" : "---- Model ODROID-C4 ----";
1158 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC4 : physNamesOdroidC4All);
1159 break;
Deokgyu Yange94695f2020-11-13 12:56:17 +09001160 case MODEL_ODROID_HC4:
1161 headerName = (isAll == FALSE) ? " HC4 " : " Model ODROID-HC4 ";
1162 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidHC4 : physNamesOdroidHC4All);
1163 break;
Steve Jeongf78d9822022-01-20 03:02:38 +00001164 case MODEL_ODROID_M1:
1165 headerName = (isAll == FALSE) ? "--- M1 ---" : "---- Model ODROID-M1 ----";
1166 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidM1 : physNamesOdroidM1All);
1167 break;
Steve Jeong329b9d72023-08-11 07:15:13 +00001168 case MODEL_ODROID_M1S:
1169 headerName = (isAll == FALSE) ? " M1S " : " Model ODROID-M1S ";
1170 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidM1S : physNamesOdroidM1SAll);
1171 break;
Steve Jeong47402612024-03-07 08:12:33 +00001172 case MODEL_ODROID_M2:
1173 headerName = (isAll == FALSE) ? "--- M2 ---" : "---- Model ODROID-M2 ----";
1174 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidM2 : physNamesOdroidM2All);
1175 break;
YoungSoo Shinb99cbc52024-10-11 12:17:15 +09001176 case MODEL_ODROID_C5:
1177 headerName = (isAll == FALSE) ? "--- C5 ---" : "---- Model ODROID-C5 ----";
1178 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC5 : physNamesOdroidC5All);
1179 break;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001180 default:
1181 printf("Oops - unknown model: %d\n", model);
1182 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +09001183 }
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001184
Deokgyu Yange94695f2020-11-13 12:56:17 +09001185 switch (model) {
1186 case MODEL_ODROID_HC4:
1187 printHeaderHC4((const char *) headerName, isAll);
1188 printBodyHC4(model, rev, (const char **) physNames, isAll);
1189 printHeaderHC4((const char *) headerName, isAll);
1190 break;
1191 default:
1192 printHeader((const char *) headerName, isAll);
1193 printBody(model, rev, (const char **) physNames, isAll);
1194 printHeader((const char *) headerName, isAll);
1195 break;
1196 }
Gordon Henderson02a3bd82013-06-27 21:57:09 +01001197}
Gordon Hendersonb0a60c32016-02-29 06:57:38 +00001198
joshua-yang4b08e7f2019-02-21 12:05:24 +09001199/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +00001200/*
1201 * doAllReadall:
1202 * Force reading of all pins regardless of Pi model
Gordon Hendersonb0a60c32016-02-29 06:57:38 +00001203 */
joshua-yang4b08e7f2019-02-21 12:05:24 +09001204/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +09001205void doAllReadall(void) {
1206 char *fakeArgv[3] = { "", "", "--all" };
1207
1208 doReadall(3, fakeArgv);
Gordon Hendersonb0a60c32016-02-29 06:57:38 +00001209}
joshua-yang4b08e7f2019-02-21 12:05:24 +09001210
1211/*----------------------------------------------------------------------------*/
1212/*----------------------------------------------------------------------------*/