Gordons Projects

--> Projects Top-Level GIT

Fixed a bug in the gpio readall command on model B's (caused by a side-effect
[wiringPi] / gpio / readall.c
1 /*
2  * readall.c:
3  *      The readall functions - getting a bit big, so split them out.
4  *      Copyright (c) 2012-2013 Gordon Henderson
5  ***********************************************************************
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  */
23
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <stdint.h>
28 #include <ctype.h>
29 #include <string.h>
30 #include <unistd.h>
31 #include <errno.h>
32 #include <fcntl.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35
36 #include <wiringPi.h>
37
38 extern int wpMode ;
39
40 #ifndef TRUE
41 #  define       TRUE    (1==1)
42 #  define       FALSE   (1==2)
43 #endif
44
45 /*
46  * doReadallExternal:
47  *      A relatively crude way to read the pins on an external device.
48  *      We don't know the input/output mode of pins, but we can tell
49  *      if it's an analog pin or a digital one...
50  *********************************************************************************
51  */
52
53 static 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
68 /*
69  * doReadall:
70  *      Read all the GPIO pins
71  *      We also want to use this to read the state of pins on an externally
72  *      connected device, so we need to do some fiddling with the internal
73  *      wiringPi node structures - since the gpio command can only use
74  *      one external device at a time, we'll use that to our advantage...
75  *********************************************************************************
76  */
77
78 static char *alts [] =
79 {
80   "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"
81 } ;
82
83 static int physToWpi [64] = 
84 {
85   -1,           // 0
86   -1, -1,       // 1, 2
87    8, -1,
88    9, -1,
89    7, 15,
90   -1, 16,
91    0,  1,
92    2, -1,
93    3,  4,
94   -1,  5,
95   12, -1,
96   13,  6,
97   14, 10,
98   -1, 11,       // 25, 26
99   30, 31,       // Actually I2C, but not used
100   21, -1,
101   22, 26,
102   23, -1,
103   24, 27,
104   25, 28,
105   -1, 29,
106   -1, -1,
107   -1, -1,
108   -1, -1,
109   -1, -1,
110   -1, -1,
111   17, 18,
112   19, 20,
113   -1, -1, -1, -1, -1, -1, -1, -1, -1
114 } ;
115
116 static char *physNames [64] = 
117 {
118   NULL,
119
120   "   3.3v", "5v     ",
121   "  SDA.1", "5V     ",
122   "  SCL.1", "0v     ",
123   "GPIO. 7", "TxD    ",
124   "     0v", "RxD    ",
125   "GPIO. 0", "GPIO. 1",
126   "GPIO. 2", "0v     ",
127   "GPIO. 3", "GPIO. 4",
128   "   3.3v", "GPIO. 5",
129   "   MOSI", "0v     ",
130   "   MISO", "GPIO. 6",
131   "   SCLK", "CE0    ",
132   "     0v", "CE1    ",
133   "  SDA.0", "SCL.0  ",
134   "GPIO.21", "0v     ",
135   "GPIO.22", "GPIO.26",
136   "GPIO.23", "0v     ",
137   "GPIO.24", "GPIO.27",
138   "GPIO.25", "GPIO.28",
139   "     0v", "GPIO.29",
140        NULL, NULL,
141        NULL, NULL,
142        NULL, NULL,
143        NULL, NULL,
144        NULL, NULL,
145   "GPIO.17", "GPIO.18",
146   "GPIO.19", "GPIO.20",
147    NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
148 } ;
149
150
151 /*
152  * readallPhys:
153  *      Given a physical pin output the data on it and the next pin:
154  *| BCM | wPi |   Name  | Mode | Val| Physical |Val | Mode | Name    | wPi | BCM |
155  *********************************************************************************
156  */
157
158 static void readallPhys (int physPin)
159 {
160   int pin ;
161
162   if (physPinToGpio (physPin) == -1)
163     printf (" |     |    ") ;
164   else
165     printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ;
166
167   printf (" | %s", physNames [physPin]) ;
168
169   if (physToWpi [physPin] == -1)
170     printf (" |      |  ") ;
171   else
172   {
173     /**/ if (wpMode == WPI_MODE_GPIO)
174       pin = physPinToGpio (physPin) ;
175     else if (wpMode == WPI_MODE_PHYS)
176       pin = physPin ;
177     else
178       pin = physToWpi [physPin] ;
179
180     printf (" | %4s", alts [getAlt (pin)]) ;
181     printf (" | %d", digitalRead (pin)) ;
182   }
183
184 // Pin numbers:
185
186   printf (" | %2d", physPin) ;
187   ++physPin ;
188   printf (" || %-2d", physPin) ;
189
190 // Same, reversed
191
192   if (physToWpi [physPin] == -1)
193     printf (" |   |     ") ;
194   else
195   {
196     /**/ if (wpMode == WPI_MODE_GPIO)
197       pin = physPinToGpio (physPin) ;
198     else if (wpMode == WPI_MODE_PHYS)
199       pin = physPin ;
200     else
201       pin = physToWpi [physPin] ;
202
203     printf (" | %d", digitalRead (pin)) ;
204     printf (" | %-4s", alts [getAlt (pin)]) ;
205   }
206
207   printf (" | %-5s", physNames [physPin]) ;
208
209   if (physToWpi     [physPin] == -1)
210     printf (" |     |    ") ;
211   else
212     printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ;
213
214   printf (" |\n") ;
215 }
216
217
218 void cmReadall (void)
219 {
220   int pin ;
221
222   printf ("+-----+------+-------+      +-----+------+-------+\n") ;
223   printf ("| Pin | Mode | Value |      | Pin | Mode | Value |\n") ;
224   printf ("+-----+------+-------+      +-----+------+-------+\n") ;
225
226   for (pin = 0 ; pin < 28 ; ++pin)
227   {
228     printf ("| %3d ", pin) ;
229     printf ("| %-4s ", alts [getAlt (pin)]) ;
230     printf ("| %s  ", digitalRead (pin) == HIGH ? "High" : "Low ") ;
231     printf ("|      ") ;
232     printf ("| %3d ", pin + 28) ;
233     printf ("| %-4s ", alts [getAlt (pin + 28)]) ;
234     printf ("| %s  ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ;
235     printf ("|\n") ;
236   }
237
238   printf ("+-----+------+-------+      +-----+------+-------+\n") ;
239 }
240
241
242 /*
243  * abReadall:
244  *      Read all the pins on the model A or B.
245  *********************************************************************************
246  */
247
248 void abReadall (int model, int rev)
249 {
250   int pin ;
251   char *type ;
252
253   if (model == PI_MODEL_A)
254     type = " A" ;
255   else
256     if (rev == PI_VERSION_2)
257       type = "B2" ;
258     else
259       type = "B1" ;
260
261   printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ;
262   printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
263   printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
264   for (pin = 1 ; pin <= 26 ; pin += 2)
265     readallPhys (pin) ;
266
267   if (rev == PI_VERSION_2) // B version 2
268   {
269     printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
270     for (pin = 51 ; pin <= 54 ; pin += 2)
271       readallPhys (pin) ;
272   }
273
274   printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
275   printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
276   printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ;
277 }
278
279
280 /*
281  * bPlusReadall:
282  *      Read all the pins on the model B+
283  *********************************************************************************
284  */
285
286 void bPlusReadall (void)
287 {
288   int pin ;
289
290   printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
291   printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
292   printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
293   for (pin = 1 ; pin <= 40 ; pin += 2)
294     readallPhys (pin) ;
295   printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
296   printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
297   printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
298 }
299
300
301 void doReadall (void)
302 {
303   int model, rev, mem, maker, overVolted ;
304
305   if (wiringPiNodes != NULL)    // External readall
306   {
307     doReadallExternal () ;
308     return ;
309   }
310
311   piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
312
313   /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B))
314     abReadall (model, rev) ;
315   else if (model == PI_MODEL_BP)
316     bPlusReadall () ;
317   else if (model == PI_MODEL_CM)
318     cmReadall () ;
319   else
320     printf ("Oops - unable to determine board type... model: %d\n", model) ;
321 }