blob: a332a39b257ddf8d7b45d1c36dee08610e162dfe [file] [log] [blame]
Gordon Henderson02a3bd82013-06-27 21:57:09 +01001/*
2 * readall.c:
3 * The readall functions - getting a bit big, so split them out.
Gordon Hendersone687f3f2017-01-24 12:13:39 +00004 * Copyright (c) 2012-2017 Gordon Henderson
Gordon Henderson02a3bd82013-06-27 21:57:09 +01005 ***********************************************************************
6 * This file is part of wiringPi:
7 * https://projects.drogon.net/raspberry-pi/wiringpi/
8 *
9 * wiringPi is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * wiringPi is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
21 ***********************************************************************
22 */
Gordon Henderson02a3bd82013-06-27 21:57:09 +010023#include <stdio.h>
24#include <stdlib.h>
25#include <stdint.h>
26#include <ctype.h>
27#include <string.h>
28#include <unistd.h>
29#include <errno.h>
30#include <fcntl.h>
31#include <sys/types.h>
32#include <sys/stat.h>
33
34#include <wiringPi.h>
joshua-yang4b08e7f2019-02-21 12:05:24 +090035/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +010036
37extern int wpMode ;
38
joshua-yang4b08e7f2019-02-21 12:05:24 +090039/*----------------------------------------------------------------------------*/
Gordon Henderson6fba4032014-06-24 19:23:31 +010040#ifndef TRUE
joshua-yang4b08e7f2019-02-21 12:05:24 +090041# define TRUE (1==1)
42# define FALSE (1==2)
Gordon Henderson6fba4032014-06-24 19:23:31 +010043#endif
44
joshua-yang4b08e7f2019-02-21 12:05:24 +090045/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +010046/*
47 * doReadallExternal:
48 * A relatively crude way to read the pins on an external device.
49 * We don't know the input/output mode of pins, but we can tell
50 * if it's an analog pin or a digital one...
Gordon Henderson02a3bd82013-06-27 21:57:09 +010051 */
joshua-yang4b08e7f2019-02-21 12:05:24 +090052/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +010053static void doReadallExternal (void)
54{
joshua-yang4b08e7f2019-02-21 12:05:24 +090055 int pin ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010056
joshua-yang4b08e7f2019-02-21 12:05:24 +090057 printf ("+------+---------+--------+\n") ;
58 printf ("| Pin | Digital | Analog |\n") ;
59 printf ("+------+---------+--------+\n") ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010060
joshua-yang4b08e7f2019-02-21 12:05:24 +090061 for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
62 printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010063
joshua-yang4b08e7f2019-02-21 12:05:24 +090064 printf ("+------+---------+--------+\n") ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010065}
66
joshua-yang4b08e7f2019-02-21 12:05:24 +090067/*----------------------------------------------------------------------------*/
68static const char *alts [] =
69{
70 "IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7"
71} ;
Gordon Henderson02a3bd82013-06-27 21:57:09 +010072
joshua-yang4b08e7f2019-02-21 12:05:24 +090073static const char *pupd [] =
74{
75 "DSBLD", "P/U", "P/D"
76} ;
77
78/*----------------------------------------------------------------------------*/
79static const int physToWpi [64] =
80{
81 -1, // 0
82 -1, -1, // 1, 2
83 8, -1,
84 9, -1,
85 7, 15,
86 -1, 16,
87 0, 1,
88 2, -1,
89 3, 4,
90 -1, 5,
91 12, -1,
92 13, 6,
93 14, 10,
94 -1, 11, // 25, 26
95 30, 31, // Actually I2C, but not used
96 21, -1,
97 22, 26,
98 23, -1,
99 24, 27,
100 25, 28,
101 -1, 29,
102 -1, -1,
103 -1, -1,
104 -1, -1,
105 -1, -1,
106 -1, -1,
107 17, 18,
108 19, 20,
109 -1, -1, -1, -1, -1, -1, -1, -1, -1
110} ;
111
112/*----------------------------------------------------------------------------*/
113static const char *physNamesOdroidC1 [64] =
114{
115 NULL,
116
117 " 3.3V", "5V ",
118 " SDA.1", "5V ",
119 " SCL.1", "GND(0V) ",
120 "GPIO. 83", "TxD1 ",
121 " GND(0V)", "RxD1 ",
122 "GPIO. 88", "GPIO. 87",
123 "GPIO.116", "GND(0V) ",
124 "GPIO.115", "GPIO.104",
125 " 3.3V", "GPIO.102",
126 " MOSI", "GND(0V) ",
127 " MISO", "GPIO.103",
128 " SCLK", "CE0 ",
129 " GND(0V)", "GPIO.118",
130 " SDA.2", "SCL.2 ",
131 "GPIO.101", "GND(0V) ",
132 "GPIO.100", "GPIO. 99",
133 "GPIO.108", "GND(0V) ",
134 "GPIO.97 ", "GPIO. 98",
135 " AIN.1", "1V8 ",
136 " GND(0V)", "AIN.0 ",
137
138 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
139 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
140 NULL,NULL,NULL,
141} ;
142
143/*----------------------------------------------------------------------------*/
144static const char *physNamesOdroidC2_Rev2 [64] =
145{
146 NULL,
147
148 " 3.3V", "5V ",
149 " SDA.1", "5V ",
150 " SCL.1", "GND(0V) ",
151 "GPIO.249", "TxD1 ",
152 " GND(0V)", "RxD1 ",
153 "GPIO.247", "GPIO.238",
154 "GPIO.239", "GND(0V) ",
155 "GPIO.237", "GPIO.236",
156 " 3.3V", "GPIO.233",
157 "GPIO.235", "GND(0V) ",
158 "GPIO.232", "GPIO.231",
159 "GPIO.230", "GPIO.229",
160 " GND(0V)", "GPIO.225",
161 " SDA.2", "SCL.2 ",
162 "GPIO.228", "GND(0V) ",
163 "GPIO.219", "GPIO.224",
164 "GPIO.234", "GND(0V) ",
165 "GPIO.214", "GPIO.218",
166 " AIN.1", "1V8 ",
167 " GND(0V)", "AIN.0 ",
168
169 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
170 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
171 NULL,NULL,NULL,
172} ;
173
174/*----------------------------------------------------------------------------*/
175static const char *physNamesOdroidC2_Rev1 [64] =
176{
177 NULL,
178
179 " 3.3V", "5V ",
180 " SDA.1", "5V ",
181 " SCL.1", "GND(0V) ",
182 "GPIO.214", "--------",
183 " GND(0V)", "--------",
184 "GPIO.219", "GPIO.218",
185 "GPIO.247", "GND(0V) ",
186 "--------", "GPIO.235",
187 " 3.3V", "GPIO.233",
188 "GPIO.238", "GND(0V) ",
189 "GPIO.237", "GPIO.234",
190 "GPIO.236", "GPIO.248",
191 " GND(0V)", "GPIO.249",
192 " SDA.2", "SCL.2 ",
193 "GPIO.232", "GND(0V) ",
194 "GPIO.231", "GPIO.230",
195 "GPIO.239", "GND(0V) ",
196 "GPIO.228", "GPIO.229",
197 " AIN.1", "1V8 ",
198 " GND(0V)", "AIN.0 ",
199
200 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
201 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
202 NULL,NULL,NULL,
203} ;
204
205/*----------------------------------------------------------------------------*/
206static const char *physNamesOdroidXU3 [64] =
207{
208 NULL,
209
210 " 3.3V", "5V ",
211 "I2C1.SDA", "5V ",
212 "I2C1.SCL", "GND(0V) ",
213 "GPIO. 18", "UART0.TX",
214 " GND(0V)", "UART0.RX",
215 "GPIO.174", "GPIO.173",
216 "GPIO. 21", "GND(0V) ",
217 "GPIO. 22", "GPIO. 19",
218 " 3.3V", "GPIO. 23",
219 " MOSI", "GND(0V) ",
220 " MISO", "GPIO. 24",
221 " SCLK", "CE0 ",
222 " GND(0V)", "GPIO. 25",
223 "I2C5.SDA", "I2C5.SCL",
224 "GPIO. 28", "GND(0V) ",
225 "GPIO. 30", "GPIO. 29",
226 "GPIO. 31", "GND(0V) ",
227 "POWER ON", "GPIO. 33",
228 " AIN.0", "1V8 ",
229 " GND(0V)", "AIN.3 ",
230
231 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
232 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
233 NULL,NULL,NULL,
234} ;
235
236/*----------------------------------------------------------------------------*/
237static const char *physNamesOdroidN1 [64] =
238{
239 NULL,
240
241 " 3.0V", "5V ",
242 "I2C4_SDA", "5V ",
243 "I2C4_SCL", "GND(0V) ",
244 "GPIO1A.0", "UART0_TX",
245 " GND(0V)", "UART0_RX",
246 "GPIO1A.1", "GPIO1A.2",
247 "GPIO1A.3", "GND(0V) ",
248 "GPIO1A.4", "GPIO1B.5",
249 " 3.0V", "GPIO1C.2",
250 "SPI1_TXD", "GND(0V) ",
251 "SPI1_RXD", "GPIO1D.0",
252 "SPI1_CLK", "SPI1_CSN",
253 " GND(0V)", "GPIO1C.6",
254 "I2C8_SDA", "I2C8_SCL",
255 "SPDIF_TX", "GND(0V) ",
256 " PWM1", "GPIO4D.4",
257 "GPIO4D.0", "GND(0V) ",
258 "GPIO4D.5", "GPIO4D.6",
259 "ADC.AIN1", "1V8 ",
260 " GND(0V)", "ADC.AIN0",
261
262 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
263 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
264 NULL,NULL,NULL,
265} ;
266
267/*----------------------------------------------------------------------------*/
268static const char *physNamesOdroidN2 [64] =
269{
270 NULL,
271
272 " 3.3V", "5V ",
273 " SDA.2", "5V ",
274 " SCL.2", "GND(0V) ",
275 "GPIO.473", "TxD1 ",
276 " GND(0V)", "RxD1 ",
277 "GPIO.479", "GPIO.492",
278 "GPIO.480", "GND(0V) ",
279 "GPIO.483", "GPIO.476",
280 " 3.3V", "GPIO.477",
281 " MOSI", "GND(0V) ",
282 " MISO", "GPIO.478",
283 " SCLK", "CE0 ",
284 " GND(0V)", "GPIO.464",
285 " SDA.3", "SCL.3 ",
286 "GPIO.490", "GND(0V) ",
287 "GPIO.491", "GPIO.472",
288 "GPIO.481", "GND(0V) ",
289 "GPIO.482", "GPIO.495",
290 " AIN.3", "1V8 ",
291 " GND(0V)", "AIN.2 ",
292
293 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
294 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
295 NULL,NULL,NULL,
296} ;
297
298/*----------------------------------------------------------------------------*/
Luke Go2ee8a0d2019-07-08 15:37:07 +0900299static void readallPhysOdroid (int model, int UNU rev, int physPin, const char *physNames[])
joshua-yang4b08e7f2019-02-21 12:05:24 +0900300{
301 int pin ;
302
303 // GPIO, wPi pin number
304 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
305 printf (" | | ") ;
306 else if (physPinToGpio (physPin) != -1)
307 printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]);
308 else
309 printf (" | | %3d", physToWpi [physPin]);
310
311 // GPIO pin name
312 printf (" | %s", physNames [physPin]) ;
313
314 // GPIO pin mode, value, drive strength, pupd
315 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
316 printf (" | | | | ") ;
317 else {
318 if (wpMode == MODE_GPIO)
319 pin = physPinToGpio (physPin);
320 else if (wpMode == MODE_PHYS)
321 pin = physPin ;
322 else
323 pin = physToWpi [physPin];
324
325 printf (" | %4s", alts [getAlt (pin)]) ;
326 printf (" | %d", digitalRead (pin)) ;
327 switch (model) {
328 case MODEL_ODROID_N1:
329 printf (" | | ");
330 break;
331 case MODEL_ODROID_C1:
332 case MODEL_ODROID_C2:
333 printf (" | | %5s", pupd[getPUPD(pin)]);
334 break;
335 case MODEL_ODROID_XU3:
336 case MODEL_ODROID_N2:
337 printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]);
338 break;
339 default:
340 break;
341 }
342 }
343
344 // Physical pin number
345 printf (" | %2d", physPin) ;
346 ++physPin ;
347 printf (" || %-2d", physPin) ;
348
349 // GPIO pin mode, value, drive strength, pupd
350 if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
351 printf (" | | | | ") ;
352 else {
353 if (wpMode == MODE_GPIO)
354 pin = physPinToGpio (physPin);
355 else if (wpMode == MODE_PHYS)
356 pin = physPin ;
357 else
358 pin = physToWpi [physPin];
359
360 switch (model) {
361 case MODEL_ODROID_N1:
362 printf (" | | ");
363 break;
364 case MODEL_ODROID_C1:
365 case MODEL_ODROID_C2:
366 printf (" | %-5s | ", pupd[getPUPD(pin)]);
367 break;
368 case MODEL_ODROID_XU3:
369 case MODEL_ODROID_N2:
370 printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin));
371 break;
372 default:
373 break;
374 }
375 printf (" | %d", digitalRead (pin));
376 printf (" | %-4s", alts [getAlt (pin)]);
377 }
378
379 // GPIO pin name
380 printf (" | %-6s", physNames [physPin]);
381
382 // GPIO, wPi pin number
383 if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
384 printf (" | | ") ;
385 else if (physPinToGpio (physPin) != -1)
386 printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin));
387 else
388 printf (" | %-3d | ", physToWpi [physPin]);
389
390 printf (" |\n") ;
391}
392
393/*----------------------------------------------------------------------------*/
394void ReadallOdroid (int model, int rev, const char *physNames[])
395{
396 int pin ;
397
398 printf (" | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n") ;
399 printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ;
400 for (pin = 1 ; pin <= 40 ; pin += 2)
401 readallPhysOdroid (model, rev, pin, physNames) ;
402 printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ;
403}
404
405/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100406/*
407 * doReadall:
408 * Read all the GPIO pins
409 * We also want to use this to read the state of pins on an externally
410 * connected device, so we need to do some fiddling with the internal
411 * wiringPi node structures - since the gpio command can only use
412 * one external device at a time, we'll use that to our advantage...
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100413 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900414/*----------------------------------------------------------------------------*/
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100415void doReadall (void)
416{
joshua-yang4b08e7f2019-02-21 12:05:24 +0900417 int model, rev, mem, maker, overVolted;
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900418 char *physNames;
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100419
joshua-yang4b08e7f2019-02-21 12:05:24 +0900420 // External readall
421 if (wiringPiNodes != NULL) {
422 doReadallExternal ();
423 return ;
424 }
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100425
joshua-yang4b08e7f2019-02-21 12:05:24 +0900426 piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
Gordon Henderson6fba4032014-06-24 19:23:31 +0100427
joshua-yang4b08e7f2019-02-21 12:05:24 +0900428 switch (model) {
429 case MODEL_ODROID_C1:
430 printf (" +------+-----+----------+------+---+----+---- Model ODROID-C1 ----+----+---+------+----------+-----+------+\n") ;
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900431 physNames = (char *) physNamesOdroidC1;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900432 break;
433 case MODEL_ODROID_C2:
434 printf (" +------+-----+----------+------+---+----+---- Model ODROID-C2 ----+----+---+------+----------+-----+------+\n") ;
435 if (rev == 1)
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900436 physNames = (char *) physNamesOdroidC2_Rev1;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900437 else
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900438 physNames = (char *) physNamesOdroidC2_Rev2;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900439 break;
440 case MODEL_ODROID_XU3:
441 printf (" +------+-----+----------+------+---+----+--- Model ODROID-XU3/4 ---+----+---+------+----------+-----+------+\n") ;
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900442 physNames = (char *) physNamesOdroidXU3;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900443 break;
444 case MODEL_ODROID_N1:
445 printf (" +------+-----+----------+------+---+----+---- Model ODROID-N1 ----+----+---+------+----------+-----+------+\n") ;
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900446 physNames = (char *) physNamesOdroidN1;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900447 break;
448 case MODEL_ODROID_N2:
449 printf (" +------+-----+----------+------+---+----+---- Model ODROID-N2 ----+----+---+------+----------+-----+------+\n") ;
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900450 physNames = (char *) physNamesOdroidN2;
joshua-yang4b08e7f2019-02-21 12:05:24 +0900451 break;
452 default:
453 printf ("Oops - unable to determine board type... model: %d\n", model) ;
454 return;
455 }
Joshua Yang6e7a6e62019-07-09 15:57:26 +0900456 ReadallOdroid(model, rev, (const char **) physNames);
Gordon Henderson02a3bd82013-06-27 21:57:09 +0100457}
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000458
joshua-yang4b08e7f2019-02-21 12:05:24 +0900459/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000460/*
461 * doAllReadall:
462 * Force reading of all pins regardless of Pi model
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000463 */
joshua-yang4b08e7f2019-02-21 12:05:24 +0900464/*----------------------------------------------------------------------------*/
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000465void doAllReadall (void)
466{
joshua-yang4b08e7f2019-02-21 12:05:24 +0900467 doReadall();
Gordon Hendersonb0a60c32016-02-29 06:57:38 +0000468}
joshua-yang4b08e7f2019-02-21 12:05:24 +0900469
470/*----------------------------------------------------------------------------*/
471/*----------------------------------------------------------------------------*/