blob: db9c7647795035103b3323c7b04266f56f5646c8 [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{
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/*----------------------------------------------------------------------------*/
Deokgyu Yange94695f2020-11-13 12:56:17 +0900113static const int physToWpiHC4 [64] =
114{
115 -1, // 0
116 -1, 0, // 1, 2
117 1, 2,
118 -1,
119} ;
120
121/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900122static const char *physNamesOdroidC1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900123{
124 NULL,
125
126 " 3.3V", "5V ",
127 " SDA.1", "5V ",
128 " SCL.1", "GND(0V) ",
129 "GPIO. 83", "TxD1 ",
130 " GND(0V)", "RxD1 ",
131 "GPIO. 88", "GPIO. 87",
132 "GPIO.116", "GND(0V) ",
133 "GPIO.115", "GPIO.104",
134 " 3.3V", "GPIO.102",
135 " MOSI", "GND(0V) ",
136 " MISO", "GPIO.103",
137 " SCLK", "CE0 ",
138 " GND(0V)", "GPIO.118",
139 " SDA.2", "SCL.2 ",
140 "GPIO.101", "GND(0V) ",
141 "GPIO.100", "GPIO. 99",
142 "GPIO.108", "GND(0V) ",
143 "GPIO.97 ", "GPIO. 98",
144 " AIN.1", "1V8 ",
145 " GND(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,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900150};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900151
152/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900153static const char *physNamesOdroidC1 [64] =
154{
155 NULL,
156
157 " 3.3V", "5V ",
158 " SDA.1", "5V ",
159 " SCL.1", "0V ",
160 " IO. 83", "TxD1 ",
161 " 0V", "RxD1 ",
162 " IO. 88", "IO. 87 ",
163 " IO.116", "0V ",
164 " IO.115", "IO.104 ",
165 " 3.3V", "IO.102 ",
166 " MOSI", "0V ",
167 " MISO", "IO.103 ",
168 " SCLK", "CE0 ",
169 " 0V", "IO.118 ",
170 " SDA.2", "SCL.2 ",
171 " IO.101", "0V ",
172 " IO.100", "IO. 99 ",
173 " IO.108", "0V ",
174 " IO.97 ", "IO. 98 ",
175 " AIN.1", "1V8 ",
176 " 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,
181};
182
183/*----------------------------------------------------------------------------*/
184static const char *physNamesOdroidC2All_Rev2 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900185{
186 NULL,
187
188 " 3.3V", "5V ",
189 " SDA.1", "5V ",
190 " SCL.1", "GND(0V) ",
191 "GPIO.249", "TxD1 ",
192 " GND(0V)", "RxD1 ",
193 "GPIO.247", "GPIO.238",
194 "GPIO.239", "GND(0V) ",
195 "GPIO.237", "GPIO.236",
196 " 3.3V", "GPIO.233",
197 "GPIO.235", "GND(0V) ",
198 "GPIO.232", "GPIO.231",
199 "GPIO.230", "GPIO.229",
200 " GND(0V)", "GPIO.225",
201 " SDA.2", "SCL.2 ",
202 "GPIO.228", "GND(0V) ",
203 "GPIO.219", "GPIO.224",
204 "GPIO.234", "GND(0V) ",
205 "GPIO.214", "GPIO.218",
206 " AIN.1", "1V8 ",
207 " GND(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,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900212};
213
214/*----------------------------------------------------------------------------*/
215static const char *physNamesOdroidC2_Rev2 [64] =
216{
217 NULL,
218
219 " 3.3V", "5V ",
220 " SDA.1", "5V ",
221 " SCL.1", "0V ",
222 " IO.249", "TxD1 ",
223 " 0V", "RxD1 ",
224 " IO.247", "IO.238 ",
225 " IO.239", "0V ",
226 " IO.237", "IO.236 ",
227 " 3.3V", "IO.233 ",
228 " IO.235", "0V ",
229 " IO.232", "IO.231 ",
230 " IO.230", "IO.229 ",
231 " 0V", "IO.225 ",
232 " SDA.2", "SCL.2 ",
233 " IO.228", "0V ",
234 " IO.219", "IO.224 ",
235 " IO.234", "0V ",
236 " IO.214", "IO.218 ",
237 " AIN.1", "1V8 ",
238 " 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,
joshua-yang4b08e7f2019-02-21 12:05:24 +0900243} ;
244
245/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900246static const char *physNamesOdroidC2All_Rev1 [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900247{
248 NULL,
249
250 " 3.3V", "5V ",
251 " SDA.1", "5V ",
252 " SCL.1", "GND(0V) ",
253 "GPIO.214", "--------",
254 " GND(0V)", "--------",
255 "GPIO.219", "GPIO.218",
256 "GPIO.247", "GND(0V) ",
257 "--------", "GPIO.235",
258 " 3.3V", "GPIO.233",
259 "GPIO.238", "GND(0V) ",
260 "GPIO.237", "GPIO.234",
261 "GPIO.236", "GPIO.248",
262 " GND(0V)", "GPIO.249",
263 " SDA.2", "SCL.2 ",
264 "GPIO.232", "GND(0V) ",
265 "GPIO.231", "GPIO.230",
266 "GPIO.239", "GND(0V) ",
267 "GPIO.228", "GPIO.229",
268 " AIN.1", "1V8 ",
269 " GND(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,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900274};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900275
276/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900277static const char *physNamesOdroidC2_Rev1 [64] =
278{
279 NULL,
280
281 " 3.3V", "5V ",
282 " SDA.1", "5V ",
283 " SCL.1", "0V ",
284 " IO.214", "-------",
285 " 0V", "-------",
286 " IO.219", "IO.218 ",
287 " IO.247", "0V ",
288 "-------", "IO.235 ",
289 " 3.3V", "IO.233 ",
290 " IO.238", "0V ",
291 " IO.237", "IO.234 ",
292 " IO.236", "IO.248 ",
293 " 0V", "IO.249 ",
294 " SDA.2", "SCL.2 ",
295 " IO.232", "0V ",
296 " IO.231", "IO.230 ",
297 " IO.239", "0V ",
298 " IO.228", "IO.229 ",
299 " AIN.1", "1V8 ",
300 " 0V", "AIN.0 ",
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,
305};
306
307/*----------------------------------------------------------------------------*/
308static const char *physNamesOdroidXU3All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900309{
310 NULL,
311
312 " 3.3V", "5V ",
313 "I2C1.SDA", "5V ",
314 "I2C1.SCL", "GND(0V) ",
315 "GPIO. 18", "UART0.TX",
316 " GND(0V)", "UART0.RX",
317 "GPIO.174", "GPIO.173",
318 "GPIO. 21", "GND(0V) ",
319 "GPIO. 22", "GPIO. 19",
320 " 3.3V", "GPIO. 23",
321 " MOSI", "GND(0V) ",
322 " MISO", "GPIO. 24",
323 " SCLK", "CE0 ",
324 " GND(0V)", "GPIO. 25",
325 "I2C5.SDA", "I2C5.SCL",
326 "GPIO. 28", "GND(0V) ",
327 "GPIO. 30", "GPIO. 29",
328 "GPIO. 31", "GND(0V) ",
329 "POWER ON", "GPIO. 33",
330 " AIN.0", "1V8 ",
331 " GND(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,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900336};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900337
338/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900339static const char *physNamesOdroidXU3 [64] =
340{
341 NULL,
342
343 " 3.3V", "5V ",
344 "I2C1.DA", "5V ",
345 "I2C1.CL", "0V ",
346 " IO. 18", "UART.TX",
347 " 0V", "UART.RX",
348 " IO.174", "IO.173 ",
349 " IO. 21", "0V ",
350 " IO. 22", "IO. 19 ",
351 " 3.3V", "IO. 23 ",
352 " MOSI", "0V ",
353 " MISO", "IO. 24 ",
354 " SCLK", "CE0 ",
355 " 0V", "IO. 25 ",
356 "I2C5.DA", "I2C5.CL",
357 " IO. 28", "0V ",
358 " IO. 30", "IO. 29 ",
359 " IO. 31", "0V ",
360 " PWR ON", "IO. 33 ",
361 " AIN.0", "1V8 ",
362 " 0V", "AIN.3 ",
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,
367};
368
369/*----------------------------------------------------------------------------*/
370static const char *physNamesOdroidN1All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900371{
372 NULL,
373
374 " 3.0V", "5V ",
375 "I2C4_SDA", "5V ",
376 "I2C4_SCL", "GND(0V) ",
377 "GPIO1A.0", "UART0_TX",
378 " GND(0V)", "UART0_RX",
379 "GPIO1A.1", "GPIO1A.2",
380 "GPIO1A.3", "GND(0V) ",
381 "GPIO1A.4", "GPIO1B.5",
382 " 3.0V", "GPIO1C.2",
383 "SPI1_TXD", "GND(0V) ",
384 "SPI1_RXD", "GPIO1D.0",
385 "SPI1_CLK", "SPI1_CSN",
386 " GND(0V)", "GPIO1C.6",
387 "I2C8_SDA", "I2C8_SCL",
388 "SPDIF_TX", "GND(0V) ",
389 " PWM1", "GPIO4D.4",
390 "GPIO4D.0", "GND(0V) ",
391 "GPIO4D.5", "GPIO4D.6",
392 "ADC.AIN1", "1V8 ",
393 " GND(0V)", "ADC.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,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900398};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900399
400/*----------------------------------------------------------------------------*/
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900401static const char *physNamesOdroidN1 [64] =
402{
403 NULL,
404
405 " 3.0V", "5V ",
406 "I2C4.DA", "5V ",
407 "I2C4.CL", "0V ",
408 " IO1A.0", "UART.TX",
409 " 0V", "UART.RX",
410 " IO1A.1", "IO1A.2 ",
411 " IO1A.3", "0V ",
412 " IO1A.4", "IO1B.5 ",
413 " 3.0V", "IO1C.2 ",
414 "SPI.TXD", "0V ",
415 "SPI.RXD", "IO1D.0 ",
416 "SPI.CLK", "SPI.CSN",
417 " 0V", "IO1C.6 ",
418 "I2C8.DA", "I2C8.CL",
419 "SPDIF.T", "0V ",
420 " PWM1", "IO4D.4 ",
421 " IO4D.0", "0V ",
422 " IO4D.5", "IO4D.6 ",
423 " AIN1", "1V8 ",
424 " 0V", "AIN0 ",
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,
429};
430
431/*----------------------------------------------------------------------------*/
432static const char *physNamesOdroidN2All [64] =
joshua-yang4b08e7f2019-02-21 12:05:24 +0900433{
434 NULL,
435
436 " 3.3V", "5V ",
437 " SDA.2", "5V ",
438 " SCL.2", "GND(0V) ",
439 "GPIO.473", "TxD1 ",
440 " GND(0V)", "RxD1 ",
441 "GPIO.479", "GPIO.492",
442 "GPIO.480", "GND(0V) ",
443 "GPIO.483", "GPIO.476",
444 " 3.3V", "GPIO.477",
445 " MOSI", "GND(0V) ",
446 " MISO", "GPIO.478",
447 " SCLK", "CE0 ",
448 " GND(0V)", "GPIO.464",
449 " SDA.3", "SCL.3 ",
450 "GPIO.490", "GND(0V) ",
451 "GPIO.491", "GPIO.472",
452 "GPIO.481", "GND(0V) ",
453 "GPIO.482", "GPIO.495",
454 " AIN.3", "1V8 ",
455 " GND(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,
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900460};
461
462/*----------------------------------------------------------------------------*/
463static const char *physNamesOdroidN2 [64] =
464{
465 NULL,
466
467 " 3.3V", "5V ",
468 " SDA.2", "5V ",
469 " SCL.2", "0V ",
470 " IO.473", "TxD1 ",
471 " 0V", "RxD1 ",
472 " IO.479", "IO.492 ",
473 " IO.480", "0V ",
474 " IO.483", "IO.476 ",
475 " 3.3V", "IO.477 ",
476 " MOSI", "0V ",
477 " MISO", "IO.478 ",
478 " SCLK", "CE0 ",
479 " 0V", "IO.464 ",
480 " SDA.3", "SCL.3 ",
481 " IO.490", "0V ",
482 " IO.491", "IO.472 ",
483 " IO.481", "0V ",
484 " IO.482", "IO.495 ",
485 " AIN.3", "1V8 ",
486 " 0V", "AIN.2 ",
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};
joshua-yang4b08e7f2019-02-21 12:05:24 +0900492
493/*----------------------------------------------------------------------------*/
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900494static const char *physNamesOdroidC4All [64] =
495{
496 NULL,
497
498 " 3.3V", "5V ",
499 " SDA.2", "5V ",
500 " SCL.2", "GND(0V) ",
501 "GPIO.481", "TxD1 ",
502 " GND(0V)", "RxD1 ",
503 "GPIO.479", "GPIO.492",
504 "GPIO.480", "GND(0V) ",
505 "GPIO.483", "GPIO.476",
506 " 3.3V", "GPIO.477",
507 " MOSI", "GND(0V) ",
508 " MISO", "GPIO.478",
509 " SLCK", "SS ",
510 " GND(0V)", "GPIO. 23",
511 " SDA.3", "SCL.3 ",
512 "GPIO.490", "GND(0V) ",
513 "GPIO.491", "GPIO. 24",
514 "GPIO.482", "GND(0V) ",
515 "GPIO.495", "GPIO. 22",
516 " AIN.2", "1V8 ",
517 " GND(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/*----------------------------------------------------------------------------*/
525static const char *physNamesOdroidC4 [64] =
526{
527 NULL,
528
529 " 3.3V", "5V ",
530 " SDA.2", "5V ",
531 " SCL.2", "0V ",
532 " IO.481", "TxD1 ",
533 " 0V", "RxD1 ",
534 " IO.479", "IO.492 ",
535 " IO.480", "0V ",
536 " IO.483", "IO.476 ",
537 " 3.3V", "IO.477 ",
538 " MOSI", "0V ",
539 " MISO", "IO.478 ",
540 " SLCK", "SS ",
541 " 0V", "IO. 23 ",
542 " SDA.3", "SCL.3 ",
543 " IO.490", "0V ",
544 " IO.491", "IO. 24 ",
545 " IO.482", "0V ",
546 " IO.495", "IO. 22 ",
547 " AIN.2", "1V8 ",
548 " 0V", "AIN.0 ",
549
550 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
551 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
552 NULL,NULL,NULL,
553};
554
555/*----------------------------------------------------------------------------*/
Deokgyu Yange94695f2020-11-13 12:56:17 +0900556static const char *physNamesOdroidHC4All [64] =
557{
558 NULL,
559
560 " 3.3V",
561 " SDA.2",
562 " SCL.2",
563 "GPIO.481",
564 " 0V",
565
566 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
567 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
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,
572};
573
574/*----------------------------------------------------------------------------*/
575static const char *physNamesOdroidHC4 [64] =
576{
577 NULL,
578
579 " 3.3V",
580 " SDA.2",
581 " SCL.2",
582 " IO.481",
583 " 0V",
584
585 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
586 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
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,
591};
592
593/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900594static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900595 int pin ;
596
597 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900598 if (isAll == TRUE) {
599 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
600 printf(" | | ");
601 else if (physPinToGpio (physPin) != -1) {
602 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
603 } else
604 printf(" | | %3d", physToWpi [physPin]);
605 } else {
606 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
607 printf(" | | ");
608 else if (physPinToGpio (physPin) != -1) {
609 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpi[physPin]);
610 } else
611 printf(" | | %3d", physToWpi [physPin]);
612 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900613
614 // GPIO pin name
615 printf (" | %s", physNames [physPin]) ;
616
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900617 // GPIO pin mode, value
618 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
619 printf(" | | ");
620 if (isAll == TRUE)
621 printf(" | | ");
622 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900623 if (wpMode == MODE_GPIO)
624 pin = physPinToGpio (physPin);
625 else if (wpMode == MODE_PHYS)
626 pin = physPin ;
627 else
628 pin = physToWpi [physPin];
629
630 printf (" | %4s", alts [getAlt (pin)]) ;
631 printf (" | %d", digitalRead (pin)) ;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900632
633 // GPIO pin drive strength, pu/pd
634 if (isAll == TRUE) {
635 switch (model) {
636 case MODEL_ODROID_N1:
637 printf (" | | ");
638 break;
639 case MODEL_ODROID_C1:
640 case MODEL_ODROID_C2:
641 printf (" | | %5s", pupd[getPUPD(pin)]);
642 break;
643 case MODEL_ODROID_XU3:
644 case MODEL_ODROID_N2:
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900645 case MODEL_ODROID_C4:
Deokgyu Yanga0bd5eb2020-03-20 11:16:06 +0900646 printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900647 break;
648 default:
649 break;
650 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900651 }
652 }
653
654 // Physical pin number
655 printf (" | %2d", physPin) ;
656 ++physPin ;
657 printf (" || %-2d", physPin) ;
658
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900659 // GPIO pin mode, value
660 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
661 printf(" |");
662 if (isAll == TRUE)
663 printf(" | |");
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900664 printf(" | ");
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900665 } else {
joshua-yang4b08e7f2019-02-21 12:05:24 +0900666 if (wpMode == MODE_GPIO)
667 pin = physPinToGpio (physPin);
668 else if (wpMode == MODE_PHYS)
669 pin = physPin ;
670 else
671 pin = physToWpi [physPin];
672
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900673
674 // GPIO pin drive strength, pu/pd
675 if (isAll == TRUE) {
676 switch (model) {
677 case MODEL_ODROID_N1:
678 printf (" | | ");
679 break;
680 case MODEL_ODROID_C1:
681 case MODEL_ODROID_C2:
682 printf (" | %-5s | ", pupd[getPUPD(pin)]);
683 break;
684 case MODEL_ODROID_XU3:
685 case MODEL_ODROID_N2:
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900686 case MODEL_ODROID_C4:
Deokgyu Yanga0bd5eb2020-03-20 11:16:06 +0900687 printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getDrive(pin));
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900688 break;
689 default:
690 break;
691 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900692 }
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900693 printf(" | %d", digitalRead (pin));
694 printf(" | %-4s", alts [getAlt (pin)]);
joshua-yang4b08e7f2019-02-21 12:05:24 +0900695 }
696
697 // GPIO pin name
698 printf (" | %-6s", physNames [physPin]);
699
700 // GPIO, wPi pin number
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900701 if (isAll == TRUE) {
702 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
703 printf(" | | ");
704 else if (physPinToGpio (physPin) != -1)
705 printf(" | %-3d | %-3d ", physToWpi [physPin], physPinToGpio (physPin));
706 else
707 printf(" | %-3d | ", physToWpi [physPin]);
708 } else {
709 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
710 printf(" | | ");
711 else if (physPinToGpio (physPin) != -1)
712 printf(" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin));
713 else
714 printf(" | %-3d | ", physToWpi [physPin]);
715 }
joshua-yang4b08e7f2019-02-21 12:05:24 +0900716
717 printf (" |\n") ;
718}
719
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900720static void printHeader(const char *headerName, int isAll) {
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900721 const char *headerLeft = " +-----+-----+---------+------+---+";
722 const char *headerRight = "+---+------+---------+-----+-----+\n";
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900723 const char *headerLeftAll = " +------+-----+----------+------+---+----+";
724 const char *headerRightAll = "+----+---+------+----------+-----+------+\n";
joshua-yang4b08e7f2019-02-21 12:05:24 +0900725
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900726 (isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll);
727 printf("%s", headerName);
728 (isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll);
729}
730
731/*----------------------------------------------------------------------------*/
732static void printBody(int model, int rev, const char *physNames[], int isAll) {
733 (isAll == FALSE)
734 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900735 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n"
736 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900737 : printf(
738 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n"
739 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n");
740 for (int pin = 1; pin <= 40; pin += 2)
741 readallPhys(model, rev, pin, physNames, isAll);
742 (isAll == FALSE)
743 ? printf(
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900744 " +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n"
745 " | I/O | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | I/O |\n")
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900746 : printf(
747 " +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"
748 " | 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 +0900749}
750
751/*----------------------------------------------------------------------------*/
Deokgyu Yange94695f2020-11-13 12:56:17 +0900752static void readallPhysHC4(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
753 int pin ;
754
755 // GPIO, wPi pin number
756 if (isAll == TRUE) {
757 if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1))
758 printf(" | | ");
759 else if (physPinToGpio (physPin) != -1) {
760 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]);
761 } else
762 printf(" | | %3d", physToWpiHC4 [physPin]);
763 } else {
764 if ((physPinToGpio (physPin) == -1) && (physToWpiHC4 [physPin] == -1))
765 printf(" | | ");
766 else if (physPinToGpio (physPin) != -1) {
767 printf(" | %3d | %3d", physPinToGpio(physPin), physToWpiHC4[physPin]);
768 } else
769 printf(" | | %3d", physToWpiHC4 [physPin]);
770 }
771
772 // GPIO pin name
773 printf (" | %s", physNames [physPin]) ;
774
775 // GPIO pin mode, value
776 if ((physToWpiHC4 [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
777 printf(" | | ");
778 if (isAll == TRUE)
779 printf(" | | ");
780 } else {
781 if (wpMode == MODE_GPIO)
782 pin = physPinToGpio (physPin);
783 else if (wpMode == MODE_PHYS)
784 pin = physPin ;
785 else
786 pin = physToWpiHC4 [physPin];
787
788 printf (" | %4s", alts [getAlt (pin)]) ;
789 printf (" | %d", digitalRead (pin)) ;
790
791 // GPIO pin drive strength, pu/pd
792 if (isAll == TRUE) {
793 switch (model) {
794 case MODEL_ODROID_HC4:
795 printf (" | %2d | %5s", getDrive(pin), pupd[getPUPD(pin)]);
796 break;
797 default:
798 break;
799 }
800 }
801 }
802
803 // Physical pin number
804 printf(" | %2d |\n", physPin);
805}
806
807/*----------------------------------------------------------------------------*/
808static void printHeaderHC4(const char *headerName, int isAll) {
809 const char *header = " +-----+-----+---------+------+---+-----+";
810 const char *headerAll = " +------+-----+----------+------+---+----+-------+-----+";
811
812 (isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll);
813 (isAll == FALSE)
814 ? printf(" | %s |\n", headerName)
815 : printf(" | %s |\n", headerName);
816 (isAll == FALSE) ? printf("%s\n", header) : printf("%s\n", headerAll);
817}
818
819/*----------------------------------------------------------------------------*/
820static void printBodyHC4(int model, int rev, const char *physNames[], int isAll) {
821 (isAll == FALSE)
822 ? printf(
823 " | I/O | wPi | Name | Mode | V | Phy |\n"
824 " +-----+-----+---------+------+---+-----+\n")
825 : printf(
826 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Phy |\n"
827 " +------+-----+----------+------+---+----+-------+-----+\n");
828 for (int pin = 1; pin <= 5; pin ++)
829 readallPhysHC4(model, rev, pin, physNames, isAll);
830 (isAll == FALSE)
831 ? printf(
832 " +-----+-----+---------+------+---+-----+\n"
833 " | I/O | wPi | Name | Mode | V | Phy |\n")
834 : printf(
835 " +------+-----+----------+------+---+----+-------+-----+\n"
836 " | GPIO | wPi | Name | Mode | V | DS | PU/PD | Phy |\n");
837}
838
839/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100840/*
841 * doReadall:
842 * Read all the GPIO pins
843 * We also want to use this to read the state of pins on an externally
844 * connected device, so we need to do some fiddling with the internal
845 * wiringPi node structures - since the gpio command can only use
846 * one external device at a time, we'll use that to our advantage...
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100847 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900848/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900849void doReadall(int argc, char *argv[]) {
850 int model, rev, mem, maker, overVolted, isAll;
851 char *headerName, *physNames;
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100852
Deokgyu Yang2c7e86b2020-04-28 10:56:11 +0900853 // External readall
854 if (wiringPiNodes != NULL) {
855 doReadallExternal();
856 return;
857 }
858
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900859 if (argc <= 2) {
860 isAll = FALSE;
861 } else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) {
862 isAll = TRUE;
863 } else {
864 printf("Oops - unknown readall option:\n");
865 for (int i = 3; i < argc + 1; i++)
866 printf("\targv[%d]: %s\n", i, argv[i - 1]);
867
868 return;
869 }
870
871 piBoardId (&model, &rev, &mem, &maker, &overVolted);
Gordon Henderson6fba4032014-06-24 19:23:31 +0100872
joshua-yang4b08e7f2019-02-21 12:05:24 +0900873 switch (model) {
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900874 case MODEL_ODROID_C1:
875 headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model ODROID-C1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900876 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC1 : physNamesOdroidC1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900877 break;
878 case MODEL_ODROID_C2:
879 headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model ODROID-C2 ----";
880 if (rev == 1)
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900881 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev1 : physNamesOdroidC2All_Rev1);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900882 else
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900883 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC2_Rev2 : physNamesOdroidC2All_Rev2);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900884 break;
885 case MODEL_ODROID_XU3:
886 headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900887 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidXU3 : physNamesOdroidXU3All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900888 break;
889 case MODEL_ODROID_N1:
890 headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model ODROID-N1 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900891 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN1 : physNamesOdroidN1All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900892 break;
893 case MODEL_ODROID_N2:
894 headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model ODROID-N2 ----";
Yang Deokgyu01a38bd2019-09-20 14:43:44 +0900895 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidN2 : physNamesOdroidN2All);
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900896 break;
Yang Deokgyuffeba7f2019-07-01 17:22:01 +0900897 case MODEL_ODROID_C4:
898 headerName = (isAll == FALSE) ? "--- C4 ---" : "---- Model ODROID-C4 ----";
899 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidC4 : physNamesOdroidC4All);
900 break;
Deokgyu Yange94695f2020-11-13 12:56:17 +0900901 case MODEL_ODROID_HC4:
902 headerName = (isAll == FALSE) ? " HC4 " : " Model ODROID-HC4 ";
903 physNames = (char *) ((isAll == FALSE) ? physNamesOdroidHC4 : physNamesOdroidHC4All);
904 break;
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900905 default:
906 printf("Oops - unknown model: %d\n", model);
907 return;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900908 }
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900909
Deokgyu Yange94695f2020-11-13 12:56:17 +0900910 switch (model) {
911 case MODEL_ODROID_HC4:
912 printHeaderHC4((const char *) headerName, isAll);
913 printBodyHC4(model, rev, (const char **) physNames, isAll);
914 printHeaderHC4((const char *) headerName, isAll);
915 break;
916 default:
917 printHeader((const char *) headerName, isAll);
918 printBody(model, rev, (const char **) physNames, isAll);
919 printHeader((const char *) headerName, isAll);
920 break;
921 }
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100922}
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000923
joshua-yang4b08e7f2019-02-21 12:05:24 +0900924/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000925/*
926 * doAllReadall:
927 * Force reading of all pins regardless of Pi model
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000928 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900929/*----------------------------------------------------------------------------*/
Yang Deokgyu5106f2a2019-09-20 12:27:57 +0900930void doAllReadall(void) {
931 char *fakeArgv[3] = { "", "", "--all" };
932
933 doReadall(3, fakeArgv);
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000934}
joshua-yang4b08e7f2019-02-21 12:05:24 +0900935
936/*----------------------------------------------------------------------------*/
937/*----------------------------------------------------------------------------*/