chiark / gitweb /
Updates for the Raspnerry Pi Compute Module - changes to the gpio program
[wiringPi.git] / 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 *pinNames [] =
79 {
80   "GPIO 0", "GPIO 1", "GPIO 2", "GPIO 3", "GPIO 4", "GPIO 5", "GPIO 6", "GPIO 7",
81   "SDA   ", "SCL   ",
82   "CE0   ", "CE1   ", "MOSI  ", "MISO  ", "SCLK  ",
83   "TxD   ", "RxD   ",
84   "GPIO 8", "GPIO 9", "GPIO10", "GPIO11",
85 } ;
86
87 static char *alts [] =
88 {
89   "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"
90 } ;
91
92 static int wpiToPhys [64] =
93 {
94   11, 12, 13, 15, 16, 18, 22,  7,       //  0...7
95    3,  5,                               //  8...9
96   24, 26, 19, 21, 23,                   // 10..14
97    8, 10,                               // 15..16
98   53, 54, 55, 56,                       // 17..20
99              0,0,0,0,0,0,0,0,0,0,0,     // 20..31
100    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,     // 32..47
101    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,     // 47..63
102 } ;
103
104 // The other mappings needed are in wiringPi.c
105
106 static int physToWpi [64] = 
107 {
108   -1,           // 0
109   -1, -1,       // 1, 2
110    8, -1,
111    9, -1,
112    7, 15,
113   -1, 16,
114    0,  1,
115    2, -1,
116    3,  4,
117   -1,  5,
118   12, -1,
119   13,  6,
120   14, 10,
121   -1, 11,       // 25, 26
122
123                                               -1, -1, -1, -1, -1,       // ... 31
124   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,       // ... 47
125   -1, -1, -1, -1, -1,                                                   // ... 52
126   28, 29, 30, 31,                                                       // ... 53, 54, 55, 56 - P5
127   -1, -1, -1, -1, -1, -1, -1,                                           // ... 63
128 } ;
129
130 static char *physNames [64] = 
131 {
132   NULL,
133
134   "3.3v",  "5v",
135   "SDA",   "5V",
136   "SCL",   "0v",
137   "GPIO7", "TxD",
138   "0v",    "RxD",
139   "GPIO0", "GPIO1",
140   "GPIO2", "0v",
141   "GPIO3", "GPIO4",
142   "3.3v",  "GPIO5",
143   "MOSI",  "0v",
144   "MISO",  "GPIO6",
145   "SCLK",  "CE0",
146   "0v",    "CE1",
147
148                                                          NULL,NULL,NULL,NULL,NULL,      // ... 31
149   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,      // ... 47
150   NULL,NULL,NULL,NULL,NULL,                                                             // ... 52
151   "GPIO8", "GPIO9", "GPIO10", "GPIO11",                                                 // ... 53, 54, 55, 56 - P5
152   NULL,NULL,NULL,NULL,NULL,NULL,                                                        // ... 63
153 } ;
154
155 static void readallPhys (int physPin)
156 {
157   int pin ;
158
159   /**/ if (wpMode == WPI_MODE_GPIO)
160   {
161     if (physPinToGpio (physPin) == -1)
162       printf (" |    ") ;
163     else
164       printf (" | %3d", physPinToGpio (physPin)) ;
165   }
166   else if (wpMode != WPI_MODE_PHYS)
167   {
168     if (physToWpi     [physPin] == -1)
169       printf (" |    ") ;
170     else
171       printf (" | %3d", physToWpi     [physPin]) ;
172   }
173
174   printf (" | %5s", physNames [physPin]) ;
175
176   if (physToWpi [physPin] == -1)
177     printf (" |      |   ") ;
178   else
179   {
180     /**/ if (wpMode == WPI_MODE_GPIO)
181       pin = physPinToGpio (physPin) ;
182     else if (wpMode == WPI_MODE_PHYS)
183       pin = physPin ;
184     else
185       pin = physToWpi [physPin] ;
186
187     printf (" | %4s", alts [getAlt (pin)]) ;
188     printf (" | %s", (digitalRead (pin) == LOW) ? "Lo" : "Hi") ;
189   }
190
191 // Pin numbers:
192
193   printf (" | %2d", physPin) ;
194   ++physPin ;
195   printf (" || %-2d", physPin) ;
196
197 // Same, reversed
198
199   if (physToWpi [physPin] == -1)
200     printf (" |    |     ") ;
201   else
202   {
203     /**/ if (wpMode == WPI_MODE_GPIO)
204       pin = physPinToGpio (physPin) ;
205     else if (wpMode == WPI_MODE_PHYS)
206       pin = physPin ;
207     else
208       pin = physToWpi [physPin] ;
209
210     printf (" | %s", (digitalRead (pin) == LOW) ? "Lo" : "Hi") ;
211     printf (" | %-4s", alts [getAlt (pin)]) ;
212   }
213
214   printf (" | %-5s", physNames [physPin]) ;
215
216   /**/ if (wpMode == WPI_MODE_GPIO)
217   {
218     if (physPinToGpio (physPin) == -1)
219       printf (" |    ") ;
220     else
221       printf (" | %-3d", physPinToGpio (physPin)) ;
222   }
223   else if (wpMode != WPI_MODE_PHYS)
224   {
225     if (physToWpi     [physPin] == -1)
226       printf (" |    ") ;
227     else
228       printf (" | %-3d", physToWpi     [physPin]) ;
229   }
230
231   printf (" |\n") ;
232 }
233
234
235 int cmReadall (void)
236 {
237   int model, rev, mem ;
238   int pin ;
239   char *maker ;
240
241   piBoardId (&model, &rev, &mem, &maker) ;
242   if (model != PI_MODEL_CM)
243     return FALSE ;
244
245   printf ("+-----+------+-------+      +-----+------+-------+\n") ;
246   printf ("| Pin | Mode | Value |      | Pin | Mode | Value |\n") ;
247   printf ("+-----+------+-------+      +-----+------+-------+\n") ;
248
249   for (pin = 0 ; pin < 28 ; ++pin)
250   {
251     printf ("| %3d ", pin) ;
252     printf ("| %-4s ", alts [getAlt (pin)]) ;
253     printf ("| %s  ", digitalRead (pin) == HIGH ? "High" : "Low ") ;
254     printf ("|      ") ;
255     printf ("| %3d ", pin + 28) ;
256     printf ("| %-4s ", alts [getAlt (pin + 28)]) ;
257     printf ("| %s  ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ;
258     printf ("|\n") ;
259   }
260
261   printf ("+-----+------+-------+      +-----+------+-------+\n") ;
262
263   return TRUE ;
264 }
265
266
267 void doReadall (void)
268 {
269   int pin ;
270
271   if (wiringPiNodes != NULL)    // External readall
272   {
273     doReadallExternal () ;
274     return ;
275   }
276
277   if (cmReadall ())
278     return ;
279
280   /**/ if (wpMode == WPI_MODE_GPIO)
281   {
282     printf (" +-----+-------+------+----+-Rev%d-----+----+------+-------+-----+\n", piBoardRev ()) ;
283     printf (" | BCM |  Name | Mode | Val| Physical |Val | Mode | Name  | BCM |\n") ;
284     printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
285     for (pin = 1 ; pin <= 26 ; pin += 2)
286       readallPhys (pin) ;
287     printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
288   }
289   else if (wpMode == WPI_MODE_PHYS)
290   {
291     printf (" +-------+------+----+-Rev%d-----+----+------+-------+\n", piBoardRev ()) ;
292     printf (" |  Name | Mode | Val| Physical |Val | Mode | Name  |\n") ;
293     printf (" +-------+------+----+----++----+----+------+-------+\n") ;
294     for (pin = 1 ; pin <= 26 ; pin += 2)
295       readallPhys (pin) ;
296     printf (" +-------+------+----+----++----+----+------+-------+\n") ;
297   }
298   else  // wiringPi
299   {
300     printf (" +-----+-------+------+----+-Rev%d-----+----+------+-------+-----+\n", piBoardRev ()) ;
301     printf (" | wPi |  Name | Mode | Val| Physical |Val | Mode | Name  | wPi |\n") ;
302     printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
303     for (pin = 1 ; pin <= 26 ; pin += 2)
304       readallPhys (pin) ;
305     printf (" +-----+-------+------+----+----++----+----+------+-------+-----+\n") ;
306   }
307 }
308
309
310 void doReadallOld (void)
311 {
312   int pin ;
313
314   if (wiringPiNodes != NULL)    // External readall
315   {
316     doReadallExternal () ;
317     return ;
318   }
319
320   if (cmReadall ())
321     return ;
322
323   printf ("+----------+-Rev%d-+------+--------+------+-------+\n", piBoardRev ()) ;
324   printf ("| wiringPi | GPIO | Phys | Name   | Mode | Value |\n") ;
325   printf ("+----------+------+------+--------+------+-------+\n") ;
326
327   for (pin = 0 ; pin < 64 ; ++pin)      // Crude, but effective
328   {
329     if (wpiPinToGpio (pin) == -1)
330       continue ;
331
332     printf ("| %6d   | %3d  | %3d  | %s | %-4s | %-4s  |\n",
333         pin, wpiPinToGpio (pin), wpiToPhys [pin],
334         pinNames [pin], 
335         alts [getAlt (pin)], 
336         digitalRead (pin) == HIGH ? "High" : "Low ") ;
337   }
338
339   printf ("+----------+------+------+--------+------+-------+\n") ;
340 }