From: Gordon Henderson Date: Sun, 21 Oct 2012 14:25:16 +0000 (+0100) Subject: More changes to help reflect usage on Rev 2 / 512MB Raspberry Pi's. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=wiringPi.git;a=commitdiff_plain;h=183c5a6b5c16f15b1da7812744f58d19a5446bf6 More changes to help reflect usage on Rev 2 / 512MB Raspberry Pi's. Also Makefile tweaks to help improve things somewhat - decided to read the Makefile manual after some 15 years to updated my make grey cells somewhat. New command in the gpio command - readall --- diff --git a/People b/People new file mode 100644 index 0000000..2c5fa92 --- /dev/null +++ b/People @@ -0,0 +1,10 @@ + +Just a quick note to some people who've provided help, suggestions, +bug-fixes, etc. along the way... + +Nick Lott: (And others) + Hints about making it work with C++ + +Philipp Stefan Neininger: + Minor bug in the Makefile to do with cross compiling + diff --git a/build b/build index 9df047f..740b512 100755 --- a/build +++ b/build @@ -10,15 +10,31 @@ if [ x$1 = "xclean" ]; then cd ../examples make clean cd .. +elif [ x$1 = "xuninstall" ]; then + echo Uninstalling + echo + echo "WiringPi library" + cd wiringPi + sudo make uninstall + echo + echo "GPIO Utility" + cd ../gpio + sudo make uninstall + cd .. else echo wiringPi Build script - please wait... echo + echo "WiringPi library" cd wiringPi make sudo make install + echo + echo "GPIO Utility" cd ../gpio make sudo make install + echo + echo "Examples" cd ../examples make cd .. diff --git a/gpio/Makefile b/gpio/Makefile index cd56e5e..5693c44 100644 --- a/gpio/Makefile +++ b/gpio/Makefile @@ -24,7 +24,7 @@ #DEBUG = -g -O0 -DEBUG = -O3 +DEBUG = -O2 CC = gcc INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe @@ -32,45 +32,49 @@ CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib LIBS = -lwiringPi -# Should not alter anything below this line +# May not need to alter anything below this line ############################################################################### SRC = gpio.c -OBJ = gpio.o +OBJ = $(SRC:.c=.o) all: gpio -gpio: gpio.o /usr/local/lib/libwiringPi.a /usr/local/lib/libwiringPi.so.1.0 - @echo [LD] +gpio: gpio.o + @echo [Link] @$(CC) -o $@ gpio.o $(LDFLAGS) $(LIBS) .c.o: - @echo [CC] $< + @echo [Compile] $< @$(CC) -c $(CFLAGS) $< -o $@ +.PHONEY: clean clean: - rm -f $(OBJ) gpio *~ core tags + rm -f $(OBJ) gpio *~ core tags *.bak +.PHONEY: tags tags: $(SRC) @echo [ctags] @ctags $(SRC) -depend: - makedepend -Y $(SRC) - +.PHONEY: install install: - @echo -n "Installing... " + @echo "[Install]" @cp gpio /usr/local/bin @chown root.root /usr/local/bin/gpio @chmod 4755 /usr/local/bin/gpio @mkdir -p /usr/local/man/man1 @cp gpio.1 /usr/local/man/man1 - @echo "Done." - +.PHONEY: uninstall uninstall: + @echo "[UnInstall]" rm -f /usr/local/bin/gpio rm -f /usr/local/man/man1/gpio.1 +.PHONEY: depend +depend: + makedepend -Y $(SRC) + # DO NOT DELETE diff --git a/gpio/gpio.1 b/gpio/gpio.1 index ba0183f..be38791 100644 --- a/gpio/gpio.1 +++ b/gpio/gpio.1 @@ -1,4 +1,4 @@ -.TH "GPIO" "14 June 2012" "Command-Line access to Raspberry Pi and PiFace GPIO" +.TH "GPIO" "21st October 2012" "Command-Line access to Raspberry Pi and PiFace GPIO" .SH NAME gpio \- Command-line access to Raspberry Pi and PiFace GPIO @@ -17,6 +17,9 @@ gpio \- Command-line access to Raspberry Pi and PiFace GPIO .B ... .PP .B gpio +.B readall +.PP +.B gpio .B unexportall/exports .PP .B gpio @@ -62,7 +65,7 @@ interface without needing to be run as root. .TP .B \-v -Output the current version +Output the current version including the board revision of the Raspberry Pi. .TP .B \-g @@ -73,20 +76,26 @@ Use the BCM_GPIO pins numbers rather than wiringPi pin numbers. Use the PiFace interface board and its corresponding pin numbers. .TP -.B read +.B read Read the digital value of the given pin and print 0 or 1 to represent the respective logic levels. .TP -.B write +.B write Write the given value (0 or 1) to the pin. .TP -.B pwm +.B readall +Output a table of all GPIO pins values. The values represent the actual values read +if the pin is in input mode, or the last value written if the pin is in output +mode. + +.TP +.B pwm Write a PWM value (0-1023) to the given pin. .TP -.B mode +.B mode Set a pin into \fIinput\fR, \fIoutput\fR or \fIpwm\fR mode. Can also use the literals \fIup\fR, \fIdown\fR or \fItri\fR to set the internal pull-up, pull-down or tristate (off) controls. @@ -238,10 +247,14 @@ Gordon Henderson .SH "REPORTING BUGS" -Report bugs to +Please report bugs to .SH COPYRIGHT Copyright (c) 2012 Gordon Henderson This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +.SH TRADEMARKS AND ACKNOWLEDGEMENTS + +Raspberry Pi is a trademark of the Raspberry Pi Foundation. diff --git a/gpio/gpio.c b/gpio/gpio.c index b3534c8..f019c1f 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -40,7 +40,7 @@ # define FALSE (1==2) #endif -#define VERSION "1.3" +#define VERSION "1.4" static int wpMode ; @@ -48,7 +48,9 @@ char *usage = "Usage: gpio -v\n" " gpio -h\n" " gpio [-g] ...\n" " gpio [-p] ...\n" - " gpio export/edge/unexport/unexportall/exports ...\n" + " gpio readall\n" + " gpio unexportall/exports ...\n" + " gpio export/edge/unexport ...\n" " gpio drive \n" " gpio pwm-bal/pwm-ms \n" " gpio pwmr \n" @@ -172,6 +174,65 @@ static void doLoad (int argc, char *argv []) } +/* + * doReadall: + * Read all the GPIO pins + ********************************************************************************* + */ + +static char *pinNames [] = +{ + "GPIO 0", + "GPIO 1", + "GPIO 2", + "GPIO 3", + "GPIO 4", + "GPIO 5", + "GPIO 6", + "GPIO 7", + "SDA ", + "SCL ", + "CE0 ", + "CE1 ", + "MOSI ", + "MISO ", + "SCLK ", + "TxD ", + "RxD ", + "GPIO 8", + "GPIO 9", + "GPIO10", + "GPIO11", +} ; + +static void doReadall (void) +{ + int pin ; + + printf ("+----------+------+--------+-------+\n") ; + printf ("| wiringPi | GPIO | Name | Value |\n") ; + printf ("+----------+------+--------+-------+\n") ; + + for (pin = 0 ; pin < NUM_PINS ; ++pin) + printf ("| %6d | %3d | %s | %s |\n", + pin, wpiPinToGpio (pin), + pinNames [pin], + digitalRead (pin) == HIGH ? "High" : "Low ") ; + + printf ("+----------+------+--------+-------+\n") ; + + if (piBoardRev () == 1) + return ; + + for (pin = 17 ; pin <= 20 ; ++pin) + printf ("| %6d | %3d | %s | %s |\n", + pin, wpiPinToGpio (pin), + pinNames [pin], + digitalRead (pin) == HIGH ? "High" : "Low ") ; + + printf ("+----------+------+--------+-------+\n") ; +} + /* * doExports: @@ -875,10 +936,11 @@ int main (int argc, char *argv []) // Check for wiring commands - /**/ if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; - else if (strcasecmp (argv [1], "write") == 0) doWrite (argc, argv) ; - else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; - else if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; + /**/ if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; + else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; + else if (strcasecmp (argv [1], "write") == 0) doWrite (argc, argv) ; + else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; + else if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; else { fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; diff --git a/gpio/test.sh b/gpio/test.sh index 7127528..a7c2bb2 100755 --- a/gpio/test.sh +++ b/gpio/test.sh @@ -1,4 +1,25 @@ #!/bin/bash +# +# test.sh: +# Simple test: Assumes LEDs on Pins 0-7 and lights them +# in-turn. +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see . +################################################################################# # Simple test - assumes LEDs on Pins 0-7. diff --git a/wiringPi/Makefile b/wiringPi/Makefile index 2d7967f..c0a39f9 100644 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -43,40 +43,37 @@ SRC = wiringPi.c wiringPiFace.c wiringSerial.c wiringShift.c \ piNes.c \ lcd.c piHiPri.c piThread.c softPwm.c wiringPiSPI.c -OBJ = wiringPi.o wiringPiFace.o wiringSerial.o wiringShift.o \ - gertboard.o \ - piNes.o \ - lcd.o piHiPri.o piThread.o softPwm.o wiringPiSPI.o +OBJ = $(SRC:.c=.o) -all: $(STATIC) $(DYNAMIC) +#all: $(STATIC) $(DYNAMIC) +all: $(DYNAMIC) $(STATIC): $(OBJ) - @echo [STATIC] + @echo [Link (Static)] @ar rcs $(STATIC) $(OBJ) @ranlib $(STATIC) - -# @size $(STATIC) + @size $(STATIC) $(DYNAMIC): $(OBJ) - @echo [DYNAMIC] - @gcc -shared -Wl,-soname,libwiringPi.so.1 -o libwiringPi.so.1.0 -lpthread $(OBJ) + @echo [Link] + @$(CC) -shared -Wl,-soname,libwiringPi.so.1 -o libwiringPi.so.1.0 -lpthread $(OBJ) .c.o: - @echo [CC] $< + @echo [Compile] $< @$(CC) -c $(CFLAGS) $< -o $@ +.PHONEY: clean clean: rm -f $(OBJ) *~ core tags Makefile.bak libwiringPi.* +.PHONEY: tags tags: $(SRC) @echo [ctags] @ctags $(SRC) -depend: - makedepend -Y $(SRC) - +.PHONEY: install install: $(TARGET) - @echo [install] + @echo "[Install]" @install -m 0755 -d /usr/local/lib @install -m 0755 -d /usr/local/include @install -m 0644 wiringPi.h /usr/local/include @@ -87,14 +84,15 @@ install: $(TARGET) @install -m 0644 softPwm.h /usr/local/include @install -m 0644 lcd.h /usr/local/include @install -m 0644 wiringPiSPI.h /usr/local/include - @install -m 0644 libwiringPi.a /usr/local/lib +# @install -m 0644 libwiringPi.a /usr/local/lib @install -m 0755 libwiringPi.so.1.0 /usr/local/lib @ln -sf /usr/local/lib/libwiringPi.so.1.0 /usr/local/lib/libwiringPi.so @ln -sf /usr/local/lib/libwiringPi.so.1.0 /usr/local/lib/libwiringPi.so.1 @ldconfig +.PHONEY: uninstall uninstall: - @echo [uninstall] + @echo "[UnInstall]" @rm -f /usr/local/include/wiringPi.h @rm -f /usr/local/include/wiringSerial.h @rm -f /usr/local/include/wiringShift.h @@ -107,6 +105,10 @@ uninstall: @ldconfig +.PHONEY: depend +depend: + makedepend -Y $(SRC) + # DO NOT DELETE wiringPi.o: wiringPi.h diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index ad62082..9fe3ab1 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -397,15 +397,31 @@ int wpiPinToGpio (int wpiPin) * piBoardRev: * Return a number representing the hardware revision of the board. * Revision is currently 1 or 2. -1 is returned on error. + * + * Much confusion here )-: + * Seems there ar esome boards with 0000 in them (mistake in manufacture) + * and some board with 0005 in them (another mistake in manufacture). + * So the distinction between boards that I can see is: + * 0000 - Error + * 0001 - Not used + * 0002 - Rev 1 + * 0003 - Rev 1 + * 0004 - Rev 2 + * 0005 - Rev 2 + * 0006 - Rev 2 + * 000f - Rev 2 + 512MB + * + * A small thorn is the olde style overvolting - that will add in + * 1000000 + * ********************************************************************************* */ int piBoardRev (void) { FILE *cpuFd ; - char line [80] ; - char *c ; - int r = -1 ; + char line [120] ; + char *c, lastChar ; static int boardRev = -1 ; // No point checking twice... @@ -416,21 +432,28 @@ int piBoardRev (void) if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) return -1 ; - while (fgets (line, 80, cpuFd) != NULL) + while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) - for (c = line ; *c ; ++c) - { - if (!isdigit (*c)) - continue ; - r = atoi (c) ; - break ; - } + break ; fclose (cpuFd) ; - if (r == -1) + if (line == NULL) { fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ; + fprintf (stderr, " (No \"Revision\" line)\n") ; + errno = 0 ; + return -1 ; + } + + for (c = line ; *c ; ++c) + if (isdigit (*c)) + break ; + + if (!isdigit (*c)) + { + fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ; + fprintf (stderr, " (No numeric revision string in: \"%s\"\n", line) ; errno = 0 ; return -1 ; } @@ -439,15 +462,17 @@ int piBoardRev (void) // has 100000 added to it! if (wiringPiDebug) - if (r > 1000) + if (strlen (c) != 4) printf ("piboardRev: This Pi has/is overvolted!\n") ; - r %= 100 ; + lastChar = c [strlen (c) - 2] ; - /**/ if ((r == 2) || (r == 3)) + /**/ if ((lastChar == '2') || (lastChar == '3')) boardRev = 1 ; - else if ((r == 4) || (r == 5) || (r == 6)) + else boardRev = 2 ; + +#ifdef DO_WE_CARE_ABOUT_THIS_NOW else { fprintf (stderr, "WARNING: wiringPi: Unable to determine board revision from \"%d\"\n", r) ; @@ -456,9 +481,10 @@ int piBoardRev (void) fprintf (stderr, " -> Assuming a Rev 1 board\n") ; boardRev = 1 ; } +#endif if (wiringPiDebug) - printf ("piboardRev: Revision: %d, board revision: %d\n", r, boardRev) ; + printf ("piboardRev: Revision string: %s, board revision: %d\n", c, boardRev) ; return boardRev ; }