From 234e34450b768375cf5936cb150ee541eace7fc2 Mon Sep 17 00:00:00 2001 From: Philip Howard Date: Sun, 24 Mar 2013 20:04:07 +0000 Subject: [PATCH] Synced to git.drogon.net --- INSTALL | 48 +++ People | 12 + README.TXT | 26 ++ build | 63 +++- examples/Makefile | 36 ++- examples/README.TXT | 6 +- examples/blink.c | 50 +++ examples/blink.rtb | 30 ++ examples/blink.sh | 37 +++ examples/delayTest.c | 24 ++ examples/gertboard.c | 19 +- examples/header.h | 23 ++ examples/isr-osc.c | 118 +++++++ examples/isr.c | 99 ++++++ examples/nes.c | 23 ++ examples/okLed.c | 22 +- examples/piface.c | 24 +- examples/pwm.c | 24 ++ examples/serialRead.c | 21 +- examples/serialTest.c | 75 +++++ examples/servo.c | 24 ++ examples/speed.c | 20 +- examples/test1.c | 22 +- examples/test2.c | 23 +- examples/tone.c | 34 +- examples/wfi.c | 31 +- gpio/Makefile | 6 +- gpio/gpio | Bin 0 -> 21304 bytes gpio/gpio.1 | 43 ++- gpio/gpio.c | 132 +++++--- wiringPi/Makefile | 37 ++- wiringPi/lcd.c | 12 + wiringPi/lcd.h | 13 +- wiringPi/libwiringPi.so.1.0 | Bin 0 -> 43311 bytes wiringPi/q2w.c | 89 ++++++ wiringPi/softServo.c | 9 + wiringPi/softTone.c | 4 +- wiringPi/wiringPi.c | 762 ++++++++++++++++++++++++++++---------------- wiringPi/wiringPi.h | 48 ++- wiringPi/wiringPiI2C.c | 122 +++++++ wiringPi/wiringPiI2C.h | 41 +++ 41 files changed, 1828 insertions(+), 424 deletions(-) create mode 100644 INSTALL create mode 100644 README.TXT create mode 100644 examples/blink.c create mode 100644 examples/blink.rtb create mode 100644 examples/blink.sh create mode 100644 examples/header.h create mode 100644 examples/isr-osc.c create mode 100644 examples/isr.c create mode 100644 examples/serialTest.c create mode 100755 gpio/gpio create mode 100755 wiringPi/libwiringPi.so.1.0 create mode 100644 wiringPi/q2w.c create mode 100644 wiringPi/wiringPiI2C.c create mode 100644 wiringPi/wiringPiI2C.h diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..8a6d38e --- /dev/null +++ b/INSTALL @@ -0,0 +1,48 @@ + +How to install wiringPi +======================= + +The easiest way is to use the supplied 'build' script: + + ./build + +that should do a complete install or upgrade of wiringPi for you. + +That will install a dynamic library. + +Some distributions do not have /usr/local/lib in the default LD_LIBRARY_PATH. To +fix this, you need to edit /etc/ld.so.conf and add in a single line: + + /usr/local/lib + +then run the ldconfig command. + + sudo ldconfig + +If you want to install a static library, you may need to do this manually: + + cd wiringPi + make static + sudo make install-static + + +To un-install wiringPi: + + ./build uninstall + + +I2C: + +If your system has the correct i2c-dev libraries and headers installed, +then the I2C helpers will be compiled into wiringPi. If you want to +use the I2C helpers and don't have them installed, then under Raspbian, +issue the command: + + sudo apt-get install libi2c-dev + +Consult the documentation for your system if you are not running Raspbian. + +Gordon Henderson + +projects@drogon.net +https://projects.drogon.net/ diff --git a/People b/People index e0c262c..8be8b6d 100644 --- a/People +++ b/People @@ -13,3 +13,15 @@ Chris McSweeny inside the dealyMicrosecondsHard() function. And spotting a couple of schoolboy errors in the (experimental) softServo code, prompting me to completely re-write it. + +Armin (Via projects website) + Some pointers about the i2c-dev.h files. + +Arno Wagner + Suggestions for the mmap calls in wiringPiSetup() + +CHARLES Thibaut: + A small issue in softTone + +Xian Stannard + Fixing some typos in the man page! diff --git a/README.TXT b/README.TXT new file mode 100644 index 0000000..0fce86a --- /dev/null +++ b/README.TXT @@ -0,0 +1,26 @@ + +wiringPi README +=============== + +Please note that the official way to get wiringPi is via git from +git.drogon.net and not GitHub. + +ie. + + git clone git://git.drogon.net/wiringPi + +The version of wiringPi held on GitHub by "Gadgetoid" is used to build the +wiringPython, Ruby, Perl, etc. wrappers for these other languages. This +version may lag the official Drogon release. Pull requests may not be +accepted to Github.... + +Please see + + https://projects.drogon.net/raspberry-pi/wiringpi/ + +for the official documentation, etc. and the best way to submit bug reports, etc. +is by sending an email to projects@drogon.net + +Thanks! + + -Gordon diff --git a/build b/build index 740b512..cbb1a4f 100755 --- a/build +++ b/build @@ -1,5 +1,18 @@ #!/bin/bash +check-make-ok() +{ + if [ $? != 0 ]; then + echo "" + echo "Make Failed..." + echo "Please check the messages and fix any problems. If you're still stuck," + echo "then please email all the output and as many details as you can to" + echo " projects@drogon.net" + echo "" + exit 1 + fi +} + if [ x$1 = "xclean" ]; then echo Cleaning echo @@ -9,8 +22,10 @@ if [ x$1 = "xclean" ]; then make clean cd ../examples make clean - cd .. -elif [ x$1 = "xuninstall" ]; then + exit +fi + +if [ x$1 = "xuninstall" ]; then echo Uninstalling echo echo "WiringPi library" @@ -21,24 +36,50 @@ elif [ x$1 = "xuninstall" ]; then cd ../gpio sudo make uninstall cd .. -else - echo wiringPi Build script - please wait... + exit +fi + + + echo "wiringPi Build script" + echo "=====================" + echo + +# Check for I2C being installed... +# ... and if-so, then automatically make the I2C helpers + + if [ -f /usr/include/linux/i2c-dev.h ]; then + grep -q i2c_smbus_read_byte /usr/include/linux/i2c-dev.h + if [ $? = 0 ]; then + target=i2c + echo "Building wiringPi with the I2C helper libraries." + else + target=all + echo "The wiringPi I2C helper libraries will not be built." + fi + fi + echo echo "WiringPi library" cd wiringPi - make + sudo make uninstall + make $target + check-make-ok sudo make install + check-make-ok + echo echo "GPIO Utility" cd ../gpio make + check-make-ok sudo make install - echo - echo "Examples" - cd ../examples - make - cd .. -fi + check-make-ok + +# echo +# echo "Examples" +# cd ../examples +# make +# cd .. echo echo All Done. diff --git a/examples/Makefile b/examples/Makefile index 738d36c..defd510 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -30,15 +30,15 @@ INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi +LDLIBS = -lwiringPi -lpthread -lm # Should not alter anything below this line ############################################################################### -SRC = test1.c test2.c speed.c lcd.c wfi.c \ - piface.c gertboard.c nes.c \ - pwm.c tone.c servo.c \ - delayTest.c serialRead.c okLed.c +SRC = blink.c test1.c test2.c speed.c lcd.c wfi.c isr.c isr-osc.c \ + piface.c gertboard.c nes.c \ + pwm.c tone.c servo.c \ + delayTest.c serialRead.c serialTest.c okLed.c OBJ = $(SRC:.c=.o) @@ -49,6 +49,12 @@ all: @echo " $(BINS)" | fmt @echo "" +really-all: $(BINS) + +blink: blink.o + @echo [link] + @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) + test1: test1.o @echo [link] @$(CC) -o $@ test1.o $(LDFLAGS) $(LDLIBS) @@ -69,21 +75,29 @@ wfi: wfi.o @echo [link] @$(CC) -o $@ wfi.o $(LDFLAGS) $(LDLIBS) +isr: isr.o + @echo [link] + @$(CC) -o $@ isr.o $(LDFLAGS) $(LDLIBS) + +isr-osc: isr-osc.o + @echo [link] + @$(CC) -o $@ isr-osc.o $(LDFLAGS) $(LDLIBS) + piface: piface.o @echo [link] - @$(CC) -o $@ piface.o $(LDFLAGS) $(LDLIBS) -lpthread + @$(CC) -o $@ piface.o $(LDFLAGS) $(LDLIBS) gertboard: gertboard.o @echo [link] - @$(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS) -lm + @$(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS) nes: nes.o @echo [link] - @$(CC) -o $@ nes.o $(LDFLAGS) $(LDLIBS) -lm + @$(CC) -o $@ nes.o $(LDFLAGS) $(LDLIBS) pwm: pwm.o @echo [link] - @$(CC) -o $@ pwm.o $(LDFLAGS) $(LDLIBS) -lm -lpthread + @$(CC) -o $@ pwm.o $(LDFLAGS) $(LDLIBS) delayTest: delayTest.o @echo [link] @@ -93,6 +107,10 @@ serialRead: serialRead.o @echo [link] @$(CC) -o $@ serialRead.o $(LDFLAGS) $(LDLIBS) +serialTest: serialTest.o + @echo [link] + @$(CC) -o $@ serialTest.o $(LDFLAGS) $(LDLIBS) + okLed: okLed.o @echo [link] @$(CC) -o $@ okLed.o $(LDFLAGS) $(LDLIBS) diff --git a/examples/README.TXT b/examples/README.TXT index 2bf6f1e..33263b1 100644 --- a/examples/README.TXT +++ b/examples/README.TXT @@ -10,5 +10,9 @@ To compile an individual example, just type make exampleName -Where exampleName is one of: +To really compile everything: + + make really-all + +The individual tests are: diff --git a/examples/blink.c b/examples/blink.c new file mode 100644 index 0000000..bb9f856 --- /dev/null +++ b/examples/blink.c @@ -0,0 +1,50 @@ +/* + * blink.c: + * Standard "blink" program in wiringPi. Blinks an LED connected + * to the first GPIO pin. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + +#include +#include + +// LED Pin - wiringPi pin 0 is BCM_GPIO 17. + +#define LED 0 + +int main (void) +{ + printf ("Raspberry Pi blink\n") ; + + if (wiringPiSetup () == -1) + return 1 ; + + pinMode (LED, OUTPUT) ; + + for (;;) + { + digitalWrite (LED, 1) ; // On + delay (500) ; // mS + digitalWrite (LED, 0) ; // Off + delay (500) ; + } + return 0 ; +} diff --git a/examples/blink.rtb b/examples/blink.rtb new file mode 100644 index 0000000..eb7d26c --- /dev/null +++ b/examples/blink.rtb @@ -0,0 +1,30 @@ +// blink.rtb: +// Blink program in Return to Basic +// +// Copyright (c) 2012-2013 Gordon Henderson. +//********************************************************************** +// This file is part of wiringPi: +// https://projects.drogon.net/raspberry-pi/wiringpi/ +// +// 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 . + *********************************************************************** +// +PinMode (0, 1) // Output +CYCLE + DigitalWrite (0, 1) // Pin 0 ON + WAIT (0.5) // 0.5 seconds + DigitalWrite (0, 0) + WAIT (0.5) +REPEAT +END diff --git a/examples/blink.sh b/examples/blink.sh new file mode 100644 index 0000000..2aa378a --- /dev/null +++ b/examples/blink.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# blink.sh: +# Standard "blink" program in wiringPi. Blinks an LED connected +# to the first GPIO pin. +# +# Copyright (c) 2012-2013 Gordon Henderson. +####################################################################### +# This file is part of wiringPi: +# https://projects.drogon.net/raspberry-pi/wiringpi/ +# +# 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 . +####################################################################### + +# LED Pin - wiringPi pin 0 is BCM_GPIO 17. + +LED=0 + +gpio mode $PIN out + +while true; do + gpio write $PIN 1 + sleep 0.5 + gpio write $PIN 0 + sleep 0.5 +done diff --git a/examples/delayTest.c b/examples/delayTest.c index d05f3ff..4c8b6ca 100644 --- a/examples/delayTest.c +++ b/examples/delayTest.c @@ -1,3 +1,27 @@ +/* + * delayTest.c: + * Just a little test program I'm using to experiment with + * various timings and latency, etc. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ #include #include diff --git a/examples/gertboard.c b/examples/gertboard.c index 8f26dd4..f02e27d 100644 --- a/examples/gertboard.c +++ b/examples/gertboard.c @@ -1,4 +1,3 @@ - /* * gertboard.c: * Simple test for the SPI bus on the Gertboard @@ -10,6 +9,24 @@ * copy this value to D/A port 1 and use a 'scope on both D/A ports * to check all's well. * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include diff --git a/examples/header.h b/examples/header.h new file mode 100644 index 0000000..82f723d --- /dev/null +++ b/examples/header.h @@ -0,0 +1,23 @@ +/* + * file.c: + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + diff --git a/examples/isr-osc.c b/examples/isr-osc.c new file mode 100644 index 0000000..a872ee3 --- /dev/null +++ b/examples/isr-osc.c @@ -0,0 +1,118 @@ +/* + * isr-osc.c: + * Wait for Interrupt test program - ISR method - interrupt oscillator + * + * How to test: + * + * IMPORTANT: To run this test we connect 2 GPIO pins together, but + * before we do that YOU must make sure that they are both setup + * the right way. If they are set to outputs and one is high and one low, + * then you connect the wire, you'll create a short and that won't be good. + * + * Before making the connection, type: + * gpio mode 0 output + * gpio write 0 0 + * gpio mode 1 input + * then you can connect them together. + * + * Run the program, then: + * gpio write 0 1 + * gpio write 0 0 + * + * at which point it will trigger an interrupt and the program will + * then do the up/down toggling for itself and run at full speed, and + * it will report the number of interrupts recieved every second. + * + * Copyright (c) 2013 Gordon Henderson. projects@drogon.net + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + +#include +#include +#include +#include +#include + + +// What GPIO input are we using? +// This is a wiringPi pin number + +#define OUT_PIN 0 +#define IN_PIN 1 + +// globalCounter: +// Global variable to count interrupts +// Should be declared volatile to make sure the compiler doesn't cache it. + +static volatile int globalCounter = 0 ; + +/* + * myInterrupt: + ********************************************************************************* + */ + +void myInterrupt (void) +{ + digitalWrite (OUT_PIN, 1) ; + ++globalCounter ; + digitalWrite (OUT_PIN, 0) ; +} + + +/* + ********************************************************************************* + * main + ********************************************************************************* + */ + +int main (void) +{ + int myCounter = 0 ; + int lastCounter = 0 ; + + if (wiringPiSetup () < 0) + { + fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ; + return 1 ; + } + + pinMode (OUT_PIN, OUTPUT) ; + pinMode (IN_PIN, INPUT) ; + + if (wiringPiISR (IN_PIN, INT_EDGE_FALLING, &myInterrupt) < 0) + { + fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ; + return 1 ; + } + + for (;;) + { + printf ("Waiting ... ") ; fflush (stdout) ; + + while (myCounter == globalCounter) + delay (1000) ; + + printf (" Done. counter: %6d: %6d\n", + globalCounter, myCounter - lastCounter) ; + lastCounter = myCounter ; + myCounter = globalCounter ; + } + + return 0 ; +} diff --git a/examples/isr.c b/examples/isr.c new file mode 100644 index 0000000..2bef54a --- /dev/null +++ b/examples/isr.c @@ -0,0 +1,99 @@ +/* + * isr.c: + * Wait for Interrupt test program - ISR method + * + * How to test: + * Use the SoC's pull-up and pull down resistors that are avalable + * on input pins. So compile & run this program (via sudo), then + * in another terminal: + * gpio mode 0 up + * gpio mode 0 down + * at which point it should trigger an interrupt. Toggle the pin + * up/down to generate more interrupts to test. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + +#include +#include +#include +#include +#include + + +// What GPIO input are we using? +// This is a wiringPi pin number + +#define BUTTON_PIN 0 + +// globalCounter: +// Global variable to count interrupts +// Should be declared volatile to make sure the compiler doesn't cache it. + +static volatile int globalCounter = 0 ; + + +/* + * myInterrupt: + ********************************************************************************* + */ + +void myInterrupt (void) +{ + ++globalCounter ; +} + + +/* + ********************************************************************************* + * main + ********************************************************************************* + */ + +int main (void) +{ + int myCounter = 0 ; + + if (wiringPiSetup () < 0) + { + fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ; + return 1 ; + } + + if (wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, &myInterrupt) < 0) + { + fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ; + return 1 ; + } + + + for (;;) + { + printf ("Waiting ... ") ; fflush (stdout) ; + + while (myCounter == globalCounter) + delay (100) ; + + printf (" Done. counter: %5d\n", globalCounter) ; + myCounter = globalCounter ; + } + + return 0 ; +} diff --git a/examples/nes.c b/examples/nes.c index 1a485bd..31908e8 100644 --- a/examples/nes.c +++ b/examples/nes.c @@ -1,3 +1,26 @@ +/* + * nes.c: + * Test program for an old NES controller connected to the Pi. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ #include #include diff --git a/examples/okLed.c b/examples/okLed.c index 3bf21e2..9b3a170 100644 --- a/examples/okLed.c +++ b/examples/okLed.c @@ -1,7 +1,6 @@ /* - * okLed: + * okLed.c: * Make the OK LED on the Pi Pulsate... - * Copyright (c) 2012 gordon Henderson, but please Share and Enjoy! * * Originally posted to the Raspberry Pi forums: * http://www.raspberrypi.org/phpBB3/viewtopic.php?p=162581#p162581 @@ -10,6 +9,24 @@ * e.g. by putting it in /etc/rc.local and running it in the * background & * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include @@ -17,6 +34,7 @@ #include #include #include +#include #include #include diff --git a/examples/piface.c b/examples/piface.c index 3305bf9..0f00960 100644 --- a/examples/piface.c +++ b/examples/piface.c @@ -1,9 +1,27 @@ - /* - * piface.c: - * Simple test for the PiFace + * piFace.c: + * Simple test for the PiFace interface board. * * Read the buttons and output the same to the LEDs + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include diff --git a/examples/pwm.c b/examples/pwm.c index 09b4ae0..c1fc331 100644 --- a/examples/pwm.c +++ b/examples/pwm.c @@ -1,3 +1,27 @@ +/* + * pwm.c: + * Test of the software PWM driver. Needs 12 LEDs connected + * to the Pi. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ #include #include diff --git a/examples/serialRead.c b/examples/serialRead.c index 34b9bad..9ee11ac 100644 --- a/examples/serialRead.c +++ b/examples/serialRead.c @@ -1,8 +1,25 @@ - /* - * serialRead.c: + * serial.c: * Example program to read bytes from the Serial line * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include diff --git a/examples/serialTest.c b/examples/serialTest.c new file mode 100644 index 0000000..0d6da5f --- /dev/null +++ b/examples/serialTest.c @@ -0,0 +1,75 @@ +/* + * serialTest.c: + * Very simple program to test the serial port. Expects + * the port to be looped back to itself + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + +#include +#include +#include + +#include +#include + +int main () +{ + int fd ; + int count ; + unsigned int nextTime ; + + if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) + { + fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; + return 1 ; + } + + if (wiringPiSetup () == -1) + { + fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; + return 1 ; + } + + nextTime = millis () + 300 ; + + for (count = 0 ; count < 256 ; ) + { + if (millis () > nextTime) + { + printf ("\nOut: %3d: ", count) ; + fflush (stdout) ; + serialPutchar (fd, count) ; + nextTime += 300 ; + ++count ; + } + + delay (3) ; + + while (serialDataAvail (fd)) + { + printf (" -> %3d", serialGetchar (fd)) ; + fflush (stdout) ; + } + } + + printf ("\n") ; + return 0 ; +} diff --git a/examples/servo.c b/examples/servo.c index 0237832..aa1ab05 100644 --- a/examples/servo.c +++ b/examples/servo.c @@ -1,3 +1,27 @@ +/* + * servo.c: + * Test of the softServo code. + * Do not use this code - use the servoBlaster kernel module instead + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ #include #include diff --git a/examples/speed.c b/examples/speed.c index 2f5d990..863317e 100644 --- a/examples/speed.c +++ b/examples/speed.c @@ -1,8 +1,26 @@ - /* * speed.c: * Simple program to measure the speed of the various GPIO * access mechanisms. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include diff --git a/examples/test1.c b/examples/test1.c index 7eb0abd..4c75711 100644 --- a/examples/test1.c +++ b/examples/test1.c @@ -1,7 +1,27 @@ - /* * test1.c: * Simple test program to test the wiringPi functions + * This is a sequencer to make a patter appear on 8 LEDs + * connected to the GPIO pins. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include diff --git a/examples/test2.c b/examples/test2.c index e34013c..580591e 100644 --- a/examples/test2.c +++ b/examples/test2.c @@ -1,8 +1,25 @@ - /* * test2.c: - * Simple test program to test the wiringPi functions - * PWM test + * This tests the hardware PWM channel. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** */ #include diff --git a/examples/tone.c b/examples/tone.c index 8b1fcd7..0e8a47d 100644 --- a/examples/tone.c +++ b/examples/tone.c @@ -1,3 +1,27 @@ +/* + * tone.c: + * Test of the softTone module in wiringPi + * Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ #include #include @@ -6,15 +30,13 @@ #include #include -#define RANGE 100 -#define NUM_LEDS 12 +#define PIN 3 int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ; int main () { - int i, j ; - char buf [80] ; + int i ; if (wiringPiSetup () == -1) { @@ -22,14 +44,14 @@ int main () return 1 ; } - softToneCreate (3) ; + softToneCreate (PIN) ; for (;;) { for (i = 0 ; i < 8 ; ++i) { printf ("%3d\n", i) ; - softToneWrite (3, scale [i]) ; + softToneWrite (PIN, scale [i]) ; delay (500) ; } } diff --git a/examples/wfi.c b/examples/wfi.c index 9efcc2c..6bb6892 100644 --- a/examples/wfi.c +++ b/examples/wfi.c @@ -2,7 +2,17 @@ * wfi.c: * Wait for Interrupt test program * - * Copyright (c) 2012 Gordon Henderson. + * This program demonstrates the use of the waitForInterrupt() + * function in wiringPi. It listens to a button input on + * BCM_GPIO pin 17 (wiringPi pin 0) + * + * The biggest issue with this method is that it really only works + * well in Sys mode. + * + * Jan 2013: This way of doing things is sort of deprecated now, see + * the wiringPiISR() function instead and the isr.c test program here. + * + * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ @@ -33,9 +43,8 @@ #define COUNT_KEY 0 // What BCM_GPIO input are we using? -// GPIO 0 is one of the I2C pins with an on-board pull-up -#define BUTTON_PIN 0 +#define BUTTON_PIN 17 // Debounce time in mS @@ -63,13 +72,11 @@ PI_THREAD (waitForIt) int debounceTime = 0 ; (void)piHiPri (10) ; // Set this thread to be high priority - digitalWrite (18, 1) ; for (;;) { if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it { - // Bouncing? if (millis () < debounceTime) @@ -80,7 +87,6 @@ PI_THREAD (waitForIt) // We have a valid one - digitalWrite (17, state) ; state ^= 1 ; piLock (COUNT_KEY) ; @@ -89,7 +95,7 @@ PI_THREAD (waitForIt) // Wait for key to be released - while (digitalRead (0) == LOW) + while (digitalRead (BUTTON_PIN) == LOW) delay (1) ; debounceTime = millis () + DEBOUNCE_TIME ; @@ -108,11 +114,9 @@ void setup (void) { // Use the gpio program to initialise the hardware -// (This is the crude, but effective bit) +// (This is the crude, but effective) - system ("gpio edge 0 falling") ; - system ("gpio export 17 out") ; - system ("gpio export 18 out") ; + system ("gpio edge 17 falling") ; // Setup wiringPi @@ -120,9 +124,8 @@ void setup (void) // Fire off our interrupt handler - piThreadCreate (waitForIt) ; + piThreadCreate (waitForIt) ; - digitalWrite (17, 0) ; } @@ -147,7 +150,7 @@ int main (void) piLock (COUNT_KEY) ; myCounter = globalCounter ; piUnlock (COUNT_KEY) ; - delay (5000) ; + delay (500) ; } printf (" Done. myCounter: %5d\n", myCounter) ; diff --git a/gpio/Makefile b/gpio/Makefile index 5693c44..a043962 100644 --- a/gpio/Makefile +++ b/gpio/Makefile @@ -30,7 +30,7 @@ INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib -LIBS = -lwiringPi +LIBS = -lwiringPi -lpthread -lm # May not need to alter anything below this line ############################################################################### @@ -70,8 +70,8 @@ install: .PHONEY: uninstall uninstall: @echo "[UnInstall]" - rm -f /usr/local/bin/gpio - rm -f /usr/local/man/man1/gpio.1 + @rm -f /usr/local/bin/gpio + @rm -f /usr/local/man/man1/gpio.1 .PHONEY: depend depend: diff --git a/gpio/gpio b/gpio/gpio new file mode 100755 index 0000000000000000000000000000000000000000..54df96acc4db421f20e155f5ca8ab5a32637ea97 GIT binary patch literal 21304 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 literal 0 HcmV?d00001 diff --git a/gpio/gpio.1 b/gpio/gpio.1 index c39e5dc..ec65519 100644 --- a/gpio/gpio.1 +++ b/gpio/gpio.1 @@ -9,7 +9,7 @@ gpio \- Command-line access to Raspberry Pi and PiFace GPIO .PP .B gpio .B [ \-g ] -.B read/write/wb/pwm/mode ... +.B read/write/wb/pwm/clock/mode ... .PP .B gpio .B [ \-p ] @@ -38,7 +38,7 @@ group value range .PP .B gpio -.B load \ i2c/spi +.B load \ i2c/spi ... .PP .B gpio .B gbr @@ -57,6 +57,9 @@ converters on the Gertboard. It's designed for simple testing and diagnostic purposes, but can be used in shell scripts for general if somewhat slow control of the GPIO pins. +It can also control the IO's on the PiFace IO board and load the SPI and I2C +kernel modules if required. + Additionally, it can be used to set the exports in the \fI/sys/class/gpio\fR system directory to allow subsequent programs to use the \fR/sys/class/gpio\fR interface without needing to be run as root. @@ -70,6 +73,8 @@ Output the current version including the board revision of the Raspberry Pi. .TP .B \-g Use the BCM_GPIO pins numbers rather than wiringPi pin numbers. +\fINOTE:\fR The BCM_GPIO pin numbers are always used with the +export and edge commands. .TP .B \-p @@ -99,7 +104,13 @@ mode. .TP .B pwm -Write a PWM value (0-1023) to the given pin. +Write a PWM value (0-1023) to the given pin. The pin needs to be put +into PWM mode first. + +.TP +.B clock +Set the output frequency on the given pin. The pin needs to be put into +clock mode first. .TP .B mode @@ -163,9 +174,18 @@ Change the PWM mode to balanced (the default) or mark:space ratio (traditional) Change the PWM range register. The default is 1024. .TP -.B load i2c/spi -This loads the i2c or the spi drivers into the system and changes the permissions on -the associated /dev/ entries so that the current user has access to them. +.B load i2c [baudrate] +This loads the i2c or drivers into the kernel and changes the permissions +on the associated /dev/ entries so that the current user has access to +them. Optionally it will set the I2C baudrate to that supplied (or as +close as the Pi can manage) The default speed is 100Kb/sec. + +.TP +.B load spi [buffer size in KB] +This loads the spi drivers into the kernel and changes the permissions +on the associated /dev/ entries so that the current user has access to +them. Optionally it will set the SPI buffer size to that supplied. The +default is 4KB. .TP .B gbr @@ -183,7 +203,7 @@ SPI digital to analogue converter. The board jumpers need to be in-place to do this operation. -.SH "WiringPi vs. GPIO Pin numbering" +.SH "WiringPi vs. BCM_GPIO Pin numbering" .PP .TS @@ -213,6 +233,12 @@ _ 20 - 31 .TE +Note that "r1" and "r2" above refers to the board revision. Normally +wiringPi detects the correct board revision with use for it's own +numbering scheme, but if you are using a Revision 2 board with some +of the pins which change numbers between revisions you will need +to alter your software. + .SH FILES .TP 2.2i @@ -264,4 +290,5 @@ 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. +Raspberry Pi is a trademark of the Raspberry Pi Foundation. See +http://raspberrypi.org/ for full details. diff --git a/gpio/gpio.c b/gpio/gpio.c index 52fcb6f..e71e432 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -35,18 +35,20 @@ #include #include +extern int wiringPiDebug ; + #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif -#define VERSION "1.5" +#define VERSION "1.12" static int wpMode ; char *usage = "Usage: gpio -v\n" " gpio -h\n" - " gpio [-g] ...\n" + " gpio [-g] ...\n" " gpio [-p] ...\n" " gpio readall\n" " gpio unexportall/exports ...\n" @@ -127,7 +129,7 @@ static int moduleLoaded (char *modName) static void _doLoadUsage (char *argv []) { - fprintf (stderr, "Usage: %s load \n", argv [0]) ; + fprintf (stderr, "Usage: %s load [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ; exit (1) ; } @@ -136,16 +138,23 @@ static void doLoad (int argc, char *argv []) char *module1, *module2 ; char cmd [80] ; char *file1, *file2 ; + char args1 [32], args2 [32] ; - if (argc != 3) + if (argc < 3) _doLoadUsage (argv) ; + args1 [0] = args2 [0] = 0 ; + /**/ if (strcasecmp (argv [2], "spi") == 0) { module1 = "spidev" ; module2 = "spi_bcm2708" ; file1 = "/dev/spidev0.0" ; file2 = "/dev/spidev0.1" ; + if (argc == 4) + sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ; + else if (argc > 4) + _doLoadUsage (argv) ; } else if (strcasecmp (argv [2], "i2c") == 0) { @@ -153,19 +162,23 @@ static void doLoad (int argc, char *argv []) module2 = "i2c_bcm2708" ; file1 = "/dev/i2c-0" ; file2 = "/dev/i2c-1" ; + if (argc == 4) + sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ; + else if (argc > 4) + _doLoadUsage (argv) ; } else _doLoadUsage (argv) ; if (!moduleLoaded (module1)) { - sprintf (cmd, "modprobe %s", module1) ; + sprintf (cmd, "modprobe %s%s", module1, args1) ; system (cmd) ; } if (!moduleLoaded (module2)) { - sprintf (cmd, "modprobe %s", module2) ; + sprintf (cmd, "modprobe %s%s", module2, args2) ; system (cmd) ; } @@ -190,55 +203,39 @@ static void doLoad (int argc, char *argv []) 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", + "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 char *alts [] = +{ + "IN ", "OUT ", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" } ; 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") ; + printf ("| wiringPi | GPIO | Name | Mode | Value |\n") ; + printf ("+----------+------+--------+------+-------+\n") ; - printf ("+----------+------+--------+-------+\n") ; - - if (piBoardRev () == 1) - return ; + for (pin = 0 ; pin < 64 ; ++pin) + { + if (wpiPinToGpio (pin) == -1) + continue ; - for (pin = 17 ; pin <= 20 ; ++pin) - printf ("| %6d | %3d | %s | %s |\n", + printf ("| %6d | %3d | %s | %s | %s |\n", pin, wpiPinToGpio (pin), pinNames [pin], + alts [getAlt (pin)], digitalRead (pin) == HIGH ? "High" : "Low ") ; + } - printf ("+----------+------+--------+-------+\n") ; + printf ("+----------+------+--------+------+-------+\n") ; } @@ -544,15 +541,16 @@ void doMode (int argc, char *argv []) mode = argv [3] ; - /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; - else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; - else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; - else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; + /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; + else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; + else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; + else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; + else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; + else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; + else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; else { - fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/up/down/tri\n", argv [1], mode) ; + fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; exit (1) ; } } @@ -758,6 +756,33 @@ void doRead (int argc, char *argv []) /* + * doClock: + * Output a clock on a pin + ********************************************************************************* + */ + +void doClock (int argc, char *argv []) +{ + int pin, freq ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s clock \n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + if ((wpMode == WPI_MODE_PINS) && ((pin < 0) || (pin >= NUM_PINS))) + return ; + + freq = atoi (argv [3]) ; + + gpioClockSet (pin, freq) ; +} + + +/* * doPwm: * Output a PWM value on a pin ********************************************************************************* @@ -848,6 +873,12 @@ int main (int argc, char *argv []) { int i ; + if (getenv ("WIRINGPI_DEBUG") != NULL) + { + printf ("gpio: wiringPi debug mode enabled\n") ; + wiringPiDebug = TRUE ; + } + if (argc == 1) { fprintf (stderr, "%s\n", usage) ; @@ -977,6 +1008,7 @@ int main (int argc, char *argv []) else if (strcasecmp (argv [1], "write") == 0) doWrite (argc, argv) ; else if (strcasecmp (argv [1], "wb") == 0) doWriteByte (argc, argv) ; else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; + else if (strcasecmp (argv [1], "clock") == 0) doClock (argc, argv) ; else if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; else { diff --git a/wiringPi/Makefile b/wiringPi/Makefile index e18a654..c6a4555 100644 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -1,4 +1,4 @@ -# +# ; # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # @@ -45,13 +45,19 @@ LIBS = SRC = wiringPi.c wiringPiFace.c wiringSerial.c wiringShift.c \ gertboard.c \ piNes.c \ - lcd.c piHiPri.c piThread.c wiringPiSPI.c \ + lcd.c piHiPri.c piThread.c \ + wiringPiSPI.c \ softPwm.c softServo.c softTone.c +SRC_I2C = wiringPiI2C.c + OBJ = $(SRC:.c=.o) -all: $(STATIC) $(DYNAMIC) -#all: $(DYNAMIC) +OBJ_I2C = $(SRC_I2C:.c=.o) + +all: $(DYNAMIC) + +static: $(STATIC) $(STATIC): $(OBJ) @echo "[Link (Static)]" @@ -63,13 +69,17 @@ $(DYNAMIC): $(OBJ) @echo "[Link (Dynamic)]" @$(CC) -shared -Wl,-soname,libwiringPi.so.1 -o libwiringPi.so.1.0 -lpthread $(OBJ) +i2c: $(OBJ) $(OBJ_I2C) + @echo "[Link (Dynamic + I2C)]" + @$(CC) -shared -Wl,-soname,libwiringPi.so.1 -o libwiringPi.so.1.0 -lpthread $(OBJ) $(OBJ_I2C) + .c.o: @echo [Compile] $< @$(CC) -c $(CFLAGS) $< -o $@ .PHONEY: clean clean: - rm -f $(OBJ) *~ core tags Makefile.bak libwiringPi.* + rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* .PHONEY: tags tags: $(SRC) @@ -77,7 +87,7 @@ tags: $(SRC) @ctags $(SRC) .PHONEY: install -install: $(TARGET) +install: $(DYNAMIC) @echo "[Install]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib @install -m 0755 -d $(DESTDIR)$(PREFIX)/include @@ -91,12 +101,17 @@ install: $(TARGET) @install -m 0644 softTone.h $(DESTDIR)$(PREFIX)/include @install -m 0644 lcd.h $(DESTDIR)$(PREFIX)/include @install -m 0644 wiringPiSPI.h $(DESTDIR)$(PREFIX)/include - @install -m 0755 libwiringPi.a $(DESTDIR)$(PREFIX)/lib + @install -m 0644 wiringPiI2C.h $(DESTDIR)$(PREFIX)/include @install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib @ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so @ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so.1 @ldconfig +.PHONEY: install-static +install-static: $(STATIC) + @echo "[Install Static]" + @install -m 0755 libwiringPi.a $(DESTDIR)$(PREFIX)/lib + .PHONEY: uninstall uninstall: @echo "[UnInstall]" @@ -110,13 +125,14 @@ uninstall: @rm -f $(DESTDIR)$(PREFIX)/include/softTone.h @rm -f $(DESTDIR)$(PREFIX)/include/lcd.h @rm -f $(DESTDIR)$(PREFIX)/include/wiringPiSPI.h + @rm -f $(DESTDIR)$(PREFIX)/include/wiringPiI2C.h @rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPi.* @ldconfig .PHONEY: depend depend: - makedepend -Y $(SRC) + makedepend -Y $(SRC) $(SRC_I2C) # DO NOT DELETE @@ -129,5 +145,8 @@ piNes.o: wiringPi.h piNes.h lcd.o: wiringPi.h lcd.h piHiPri.o: wiringPi.h piThread.o: wiringPi.h -softPwm.o: wiringPi.h softPwm.h wiringPiSPI.o: wiringPiSPI.h +softPwm.o: wiringPi.h softPwm.h +softServo.o: wiringPi.h softServo.h +softTone.o: wiringPi.h softTone.h +wiringPiI2C.o: wiringPi.h wiringPiI2C.h diff --git a/wiringPi/lcd.c b/wiringPi/lcd.c index aa58cab..f123db2 100644 --- a/wiringPi/lcd.c +++ b/wiringPi/lcd.c @@ -175,6 +175,18 @@ void lcdClear (int fd) /* + * lcdSendCommand: + * Send any arbitary command to the display + ********************************************************************************* + */ + +void lcdSendCommand (int fd, uint8_t command) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + putCommand (lcd, command) ; +} + +/* * lcdPosition: * Update the position of the cursor on the display ********************************************************************************* diff --git a/wiringPi/lcd.h b/wiringPi/lcd.h index ecd1d25..beebb75 100644 --- a/wiringPi/lcd.h +++ b/wiringPi/lcd.h @@ -30,12 +30,13 @@ extern "C" { #endif -extern void lcdHome (int fd) ; -extern void lcdClear (int fd) ; -extern void lcdPosition (int fd, int x, int y) ; -extern void lcdPutchar (int fd, uint8_t data) ; -extern void lcdPuts (int fd, char *string) ; -extern void lcdPrintf (int fd, char *message, ...) ; +extern void lcdHome (int fd) ; +extern void lcdClear (int fd) ; +extern void lcdSendCommand (int fd, uint8_t command) ; +extern void lcdPosition (int fd, int x, int y) ; +extern void lcdPutchar (int fd, uint8_t data) ; +extern void lcdPuts (int fd, char *string) ; +extern void lcdPrintf (int fd, char *message, ...) ; extern int lcdInit (int rows, int cols, int bits, int rs, int strb, int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) ; diff --git a/wiringPi/libwiringPi.so.1.0 b/wiringPi/libwiringPi.so.1.0 new file mode 100755 index 0000000000000000000000000000000000000000..7c87ee9e0b6a1975bca211971d0a94605bef164a GIT binary patch literal 43311 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 literal 0 HcmV?d00001 diff --git a/wiringPi/q2w.c b/wiringPi/q2w.c new file mode 100644 index 0000000..31486da --- /dev/null +++ b/wiringPi/q2w.c @@ -0,0 +1,89 @@ +/* + * q2w.c: + *********************************************************************** + */ + +#include +#include +#include +#include +#include + +#include +#include + +// MCP23S17 Registers + +#define IOCON 0x0A + +#define IODIRA 0x00 +#define IPOLA 0x02 +#define GPINTENA 0x04 +#define DEFVALA 0x06 +#define INTCONA 0x08 +#define GPPUA 0x0C +#define INTFA 0x0E +#define INTCAPA 0x10 +#define GPIOA 0x12 +#define OLATA 0x14 + +#define IODIRB 0x01 +#define IPOLB 0x03 +#define GPINTENB 0x05 +#define DEFVALB 0x07 +#define INTCONB 0x09 +#define GPPUB 0x0D +#define INTFB 0x0F +#define INTCAPB 0x11 +#define GPIOB 0x13 +#define OLATB 0x15 + +// Bits in the IOCON register + +#define IOCON_BANK_MODE 0x80 +#define IOCON_MIRROR 0x40 +#define IOCON_SEQOP 0x20 +#define IOCON_DISSLW 0x10 +#define IOCON_HAEN 0x08 +#define IOCON_ODR 0x04 +#define IOCON_INTPOL 0x02 +#define IOCON_UNUSED 0x01 + +// Default initialisation mode + +#define IOCON_INIT (IOCON_SEQOP) + + + +/* + ********************************************************************************* + * The works + ********************************************************************************* + */ + +int main (int argc, char *argv []) +{ + int q2w ; + +// if (wiringPiSetup () == -1) +// { fprintf (stderr, "q2w: Unable to initialise wiringPi: %s\n", strerror (errno)) ; return 1 ; } + + if ((q2w = wiringPiI2CSetup (0x20)) == -1) + { fprintf (stderr, "q2w: Unable to initialise I2C: %s\n", strerror (errno)) ; return 1 ; } + +// Very simple direct control of the MCP23017: + + wiringPiI2CWriteReg8 (q2w, IOCON, IOCON_INIT) ; + wiringPiI2CWriteReg8 (q2w, IODIRA, 0x00) ; // Port A -> Outputs + wiringPiI2CWriteReg8 (q2w, IODIRB, 0x00) ; // Port B -> Outputs + + for (;;) + { + wiringPiI2CWriteReg8 (q2w, GPIOA, 0x00) ; // All Off + delay (500) ; + wiringPiI2CWriteReg8 (q2w, GPIOA, 0xFF) ; // All On + delay (500) ; + } + + return 0 ; +} diff --git a/wiringPi/softServo.c b/wiringPi/softServo.c index a6ff1fb..9de9f4f 100644 --- a/wiringPi/softServo.c +++ b/wiringPi/softServo.c @@ -54,6 +54,15 @@ // the multipexing, but it does need to be at least 10mS, and preferably 16 // from what I've been able to determine. +// WARNING: +// This code is really experimental. It was written in response to some people +// asking for a servo driver, however while it works, there is too much +// jitter to successfully drive a small servo - I have tried it with a micro +// servo and it worked, but the servo ran hot due to the jitter in the signal +// being sent to it. +// +// If you want servo control for the Pi, then use the servoblaster kernel +// module. #define MAX_SERVOS 8 diff --git a/wiringPi/softTone.c b/wiringPi/softTone.c index d14c2a2..8463627 100644 --- a/wiringPi/softTone.c +++ b/wiringPi/softTone.c @@ -59,7 +59,9 @@ static PI_THREAD (softToneThread) for (;;) { frewq = frewqs [pin] ; - if (frewq != 0) + if (frewq == 0) + delay (1) ; + else { halfPeriod = 500000 / frewq ; diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index df4d969..a68ae33 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -51,9 +51,6 @@ // Added in the 2 UART pins // Change maxPins to numPins to more accurately reflect purpose -// Pad drive current fiddling - -#undef DEBUG_PADS #include #include @@ -65,24 +62,27 @@ #include #include #include +#include #include #include -#include #include +#include +#include #include "wiringPi.h" // Function stubs void (*pinMode) (int pin, int mode) ; +int (*getAlt) (int pin) ; void (*pullUpDnControl) (int pin, int pud) ; void (*digitalWrite) (int pin, int value) ; void (*digitalWriteByte) (int value) ; void (*pwmWrite) (int pin, int value) ; +void (*gpioClockSet) (int pin, int value) ; void (*setPadDrive) (int group, int value) ; int (*digitalRead) (int pin) ; int (*waitForInterrupt) (int pin, int mS) ; -void (*delayMicroseconds) (unsigned int howLong) ; void (*pwmSetMode) (int mode) ; void (*pwmSetRange) (unsigned int range) ; void (*pwmSetClock) (int divisor) ; @@ -98,6 +98,24 @@ void (*pwmSetClock) (int divisor) ; #define BCM_PASSWORD 0x5A000000 +// The BCM2835 has 54 GPIO pins. +// BCM2835 data sheet, Page 90 onwards. +// There are 6 control registers, each control the functions of a block +// of 10 pins. +// Each control register has 10 sets of 3 bits per GPIO pin - the ALT values +// +// 000 = GPIO Pin X is an input +// 001 = GPIO Pin X is an output +// 100 = GPIO Pin X takes alternate function 0 +// 101 = GPIO Pin X takes alternate function 1 +// 110 = GPIO Pin X takes alternate function 2 +// 111 = GPIO Pin X takes alternate function 3 +// 011 = GPIO Pin X takes alternate function 4 +// 010 = GPIO Pin X takes alternate function 5 +// +// So the 3 bits for port X are: +// X / 10 + ((X % 10) * 3) + // Port function select bits #define FSEL_INPT 0b000 @@ -111,20 +129,21 @@ void (*pwmSetClock) (int divisor) ; #define FSEL_ALT5 0b010 // Access from ARM Running Linux -// Take from Gert/Doms code. Some of this is not in the manual +// Taken from Gert/Doms code. Some of this is not in the manual // that I can find )-: -#define BCM2708_PERI_BASE 0x20000000 -#define GPIO_PADS (BCM2708_PERI_BASE + 0x100000) -#define CLOCK_BASE (BCM2708_PERI_BASE + 0x101000) -#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) -#define GPIO_TIMER (BCM2708_PERI_BASE + 0x00B000) -#define GPIO_PWM (BCM2708_PERI_BASE + 0x20C000) +#define BCM2708_PERI_BASE 0x20000000 +#define GPIO_PADS (BCM2708_PERI_BASE + 0x00100000) +#define CLOCK_BASE (BCM2708_PERI_BASE + 0x00101000) +#define GPIO_BASE (BCM2708_PERI_BASE + 0x00200000) +#define GPIO_TIMER (BCM2708_PERI_BASE + 0x0000B000) +#define GPIO_PWM (BCM2708_PERI_BASE + 0x0020C000) #define PAGE_SIZE (4*1024) #define BLOCK_SIZE (4*1024) // PWM +// Word offsets into the PWM control region #define PWM_CONTROL 0 #define PWM_STATUS 1 @@ -133,17 +152,11 @@ void (*pwmSetClock) (int divisor) ; #define PWM1_RANGE 8 #define PWM1_DATA 9 +// Clock regsiter offsets + #define PWMCLK_CNTL 40 #define PWMCLK_DIV 41 -#define PWM1_MS_MODE 0x8000 // Run in MS mode -#define PWM1_USEFIFO 0x2000 // Data from FIFO -#define PWM1_REVPOLAR 0x1000 // Reverse polarity -#define PWM1_OFFSTATE 0x0800 // Ouput Off state -#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty -#define PWM1_SERIAL 0x0200 // Run in serial mode -#define PWM1_ENABLE 0x0100 // Channel Enable - #define PWM0_MS_MODE 0x0080 // Run in MS mode #define PWM0_USEFIFO 0x0020 // Data from FIFO #define PWM0_REVPOLAR 0x0010 // Reverse polarity @@ -152,7 +165,16 @@ void (*pwmSetClock) (int divisor) ; #define PWM0_SERIAL 0x0002 // Run in serial mode #define PWM0_ENABLE 0x0001 // Channel Enable +#define PWM1_MS_MODE 0x8000 // Run in MS mode +#define PWM1_USEFIFO 0x2000 // Data from FIFO +#define PWM1_REVPOLAR 0x1000 // Reverse polarity +#define PWM1_OFFSTATE 0x0800 // Ouput Off state +#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty +#define PWM1_SERIAL 0x0200 // Run in serial mode +#define PWM1_ENABLE 0x0100 // Channel Enable + // Timer +// Word offsets #define TIMER_LOAD (0x400 >> 2) #define TIMER_VALUE (0x404 >> 2) @@ -173,33 +195,28 @@ static volatile uint32_t *pads ; static volatile uint32_t *timer ; static volatile uint32_t *timerIrqRaw ; -// Debugging +// Time for easy calculations -static int wiringPiDebug = FALSE ; +static uint64_t epochMilli, epochMicro ; -// The BCM2835 has 54 GPIO pins. -// BCM2835 data sheet, Page 90 onwards. -// There are 6 control registers, each control the functions of a block -// of 10 pins. -// Each control register has 10 sets of 3 bits per GPIO pin: -// -// 000 = GPIO Pin X is an input -// 001 = GPIO Pin X is an output -// 100 = GPIO Pin X takes alternate function 0 -// 101 = GPIO Pin X takes alternate function 1 -// 110 = GPIO Pin X takes alternate function 2 -// 111 = GPIO Pin X takes alternate function 3 -// 011 = GPIO Pin X takes alternate function 4 -// 010 = GPIO Pin X takes alternate function 5 -// -// So the 3 bits for port X are: -// X / 10 + ((X % 10) * 3) +// Misc + +static int wiringPiMode = WPI_MODE_UNINITIALISED ; + +// Debugging + +int wiringPiDebug = FALSE ; // sysFds: // Map a file descriptor from the /sys/class/gpio/gpioX/value static int sysFds [64] ; +// ISR Data + +static void (*isrFunctions [64])(void) ; + + // Doing it the Arduino way with lookup tables... // Yes, it's probably more innefficient than all the bit-twidling, but it // does tend to make it all a bit clearer. At least to me! @@ -329,11 +346,14 @@ static uint8_t gpioToFEN [] = #endif -// gpioToPUDCLK -// (Word) offset to the Pull Up Down Clock regsiter +// GPPUD: +// GPIO Pin pull up/down register #define GPPUD 37 +// gpioToPUDCLK +// (Word) offset to the Pull Up Down Clock regsiter + static uint8_t gpioToPUDCLK [] = { 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, @@ -356,6 +376,9 @@ static uint8_t gpioToPwmALT [] = 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 } ; +// gpioToPwmPort +// The port value to put a GPIO pin into PWM mode + static uint8_t gpioToPwmPort [] = { 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 @@ -369,10 +392,55 @@ static uint8_t gpioToPwmPort [] = } ; +// gpioToGpClkALT: +// ALT value to put a GPIO pin into GP Clock mode. +// On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 +// for clocks 0 and 1 respectivey, however I'll include the full +// list for completeness - maybe one day... -// Time for easy calculations +#define GPIO_CLOCK_SOURCE 1 + +// gpioToGpClkALT0: + +static uint8_t gpioToGpClkALT0 [] = +{ + 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 + 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 + 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 + 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 +} ; + +// gpioToClk: +// (word) Offsets to the clock Control and Divisor register + +static uint8_t gpioToClkCon [] = +{ + -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 + -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 + 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 + -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 +} ; + +static uint8_t gpioToClkDiv [] = +{ + -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 + -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 + 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 + -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 +} ; -static unsigned long long epoch ; /* * Functions @@ -407,9 +475,11 @@ int wpiPinToGpio (int wpiPin) * 0001 - Not used * 0002 - Rev 1 * 0003 - Rev 1 - * 0004 - Rev 2 - * 0005 - Rev 2 (but error) + * 0004 - Rev 2 (Early reports? + * 0005 - Rev 2 (but error?) * 0006 - Rev 2 + * 0008 - Rev 2 - Model A + * 000e - Rev 2 + 512MB * 000f - Rev 2 + 512MB * * A small thorn is the olde style overvolting - that will add in @@ -418,6 +488,15 @@ int wpiPinToGpio (int wpiPin) ********************************************************************************* */ +static void piBoardRevOops (char *why) +{ + fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ; + fprintf (stderr, " -> %s\n", why) ; + fprintf (stderr, " -> You may want to check:\n") ; + fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; + exit (EXIT_FAILURE) ; +} + int piBoardRev (void) { FILE *cpuFd ; @@ -425,13 +504,11 @@ int piBoardRev (void) char *c, lastChar ; static int boardRev = -1 ; -// No point checking twice... - - if (boardRev != -1) + if (boardRev != -1) // No point checking twice return boardRev ; if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - return -1 ; + piBoardRevOops ("Unable to open /proc/cpuinfo") ; while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) @@ -439,25 +516,21 @@ int piBoardRev (void) fclose (cpuFd) ; - 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 ; - } + if (strncmp (line, "Revision", 8) != 0) + piBoardRevOops ("No \"Revision\" line") ; + + for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) + *c = 0 ; + if (wiringPiDebug) + printf ("piboardRev: Revision string: %s\n", line) ; + 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 ; - } + piBoardRevOops ("No numeric revision string") ; // If you have overvolted the Pi, then it appears that the revision // has 100000 added to it! @@ -466,26 +539,18 @@ int piBoardRev (void) if (strlen (c) != 4) printf ("piboardRev: This Pi has/is overvolted!\n") ; - lastChar = c [strlen (c) - 2] ; + lastChar = line [strlen (line) - 1] ; + + if (wiringPiDebug) + printf ("piboardRev: lastChar is: '%c' (%d, 0x%02X)\n", lastChar, lastChar, lastChar) ; /**/ if ((lastChar == '2') || (lastChar == '3')) boardRev = 1 ; else boardRev = 2 ; -#ifdef DO_WE_CARE_ABOUT_THIS_NOW - else - { - fprintf (stderr, "WARNING: wiringPi: Unable to determine board revision from \"%d\"\n", r) ; - fprintf (stderr, " -> You may want to check:\n") ; - fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; - fprintf (stderr, " -> Assuming a Rev 1 board\n") ; - boardRev = 1 ; - } -#endif - if (wiringPiDebug) - printf ("piboardRev: Revision string: %s, board revision: %d\n", c, boardRev) ; + printf ("piBoardRev: Returning revision: %d\n", boardRev) ; return boardRev ; } @@ -493,15 +558,14 @@ int piBoardRev (void) /* - * pinMode: - * Sets the mode of a pin to be input, output or PWM output + * getAlt: + * Returns the ALT bits for a given port. Only really of-use + * for the gpio readall command (I think) ********************************************************************************* */ -void pinModeGpio (int pin, int mode) +int getAltGpio (int pin) { -// register int barrier ; - int fSel, shift, alt ; pin &= 63 ; @@ -509,73 +573,19 @@ void pinModeGpio (int pin, int mode) fSel = gpioToGPFSEL [pin] ; shift = gpioToShift [pin] ; - /**/ if (mode == INPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input - else if (mode == OUTPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ; - else if (mode == PWM_OUTPUT) - { - if ((alt = gpioToPwmALT [pin]) == 0) // Not a PWM pin - return ; - -// Set pin to PWM mode - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - - delayMicroseconds (110) ; // See comments in pwmSetClockWPi - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - -// Page 107 of the BCM Peripherals manual talks about the GPIO clocks, -// but I'm assuming (hoping!) that this applies to other clocks too. - - *(pwm + PWM_CONTROL) = 0 ; // Stop PWM - - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock - delayMicroseconds (110) ; // See comments in pwmSetClockWPi - - while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY - delayMicroseconds (1) ; - - *(clk + PWMCLK_DIV) = BCM_PASSWORD | (32 << 12) ; // set pwm div to 32 (19.2/32 = 600KHz) - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // enable clk - - delayMicroseconds (110) ; // See comments in pwmSetClockWPi - -// Default range register of 1024 - - *(pwm + PWM0_RANGE) = 1024 ; delayMicroseconds (10) ; - *(pwm + PWM1_RANGE) = 1024 ; delayMicroseconds (10) ; - *(pwm + PWM0_DATA) = 0 ; delayMicroseconds (10) ; - *(pwm + PWM1_DATA) = 0 ; delayMicroseconds (10) ; - -// Enable PWMs in balanced mode (default) - - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; - - delay (100) ; - } - - -// When we change mode of any pin, we remove the pull up/downs -// Or we used to... Hm. Commented out now because for some wieird reason, -// it seems to block subsequent attempts to set the pull up/downs and I've -// not quite gotten to the bottom of why this happens -// The down-side is that the pull up/downs are rememberd in the SoC between -// power cycles, so it's going to be a good idea to explicitly set them in -// any new code. -// -// pullUpDnControl (pin, PUD_OFF) ; + alt = (*(gpio + fSel) >> shift) & 7 ; + return alt ; } -void pinModeWPi (int pin, int mode) +int getAltWPi (int pin) { - pinModeGpio (pinToGpio [pin & 63], mode) ; + return getAltGpio (pinToGpio [pin & 63]) ; } -void pinModeSys (int pin, int mode) +int getAltSys (int pin) { - return ; + return 0 ; } @@ -620,7 +630,7 @@ void pwmSetRangeSys (unsigned int range) void pwmSetClockWPi (int divisor) { - unsigned int pwm_control ; + uint32_t pwm_control ; divisor &= 4095 ; if (wiringPiDebug) @@ -741,11 +751,11 @@ void digitalWriteByteGpio (int value) else pinSet |= (1 << pinToGpio [pin]) ; - *(gpio + gpioToGPCLR [0]) = pinClr ; - *(gpio + gpioToGPSET [0]) = pinSet ; - mask <<= 1 ; } + + *(gpio + gpioToGPCLR [0]) = pinClr ; + *(gpio + gpioToGPSET [0]) = pinSet ; } void digitalWriteByteSys (int value) @@ -789,6 +799,44 @@ void pwmWriteSys (int pin, int value) /* + * gpioClockSet: + * Set the freuency on a GPIO clock pin + ********************************************************************************* + */ + +void gpioClockSetGpio (int pin, int freq) +{ + int divi, divr, divf ; + + pin &= 63 ; + + divi = 19200000 / freq ; + divr = 19200000 % freq ; + divf = (int)((double)divr * 4096.0 / 19200000.0) ; + + if (divi > 4095) + divi = 4095 ; + + *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock + while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait + ; + + *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers + *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock +} + +void gpioClockSetWPi (int pin, int freq) +{ + gpioClockSetGpio (pinToGpio [pin & 63], freq) ; +} + +void gpioClockSetSys (int pin, int freq) +{ + return ; +} + + +/* * setPadDrive: * Set the PAD driver value ********************************************************************************* @@ -804,10 +852,11 @@ void setPadDriveWPi (int group, int value) wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; *(pads + group + 11) = wrVal ; -#ifdef DEBUG_PADS - printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; - printf ("Read : %08X\n", *(pads + group + 11)) ; -#endif + if (wiringPiDebug) + { + printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; + printf ("Read : %08X\n", *(pads + group + 11)) ; + } } void setPadDriveGpio (int group, int value) @@ -895,6 +944,65 @@ void pullUpDnControlSys (int pin, int pud) /* + * pinMode: + * Sets the mode of a pin to be input, output or PWM output + ********************************************************************************* + */ + +void pinModeGpio (int pin, int mode) +{ +// register int barrier ; + + int fSel, shift, alt ; + + pin &= 63 ; + + fSel = gpioToGPFSEL [pin] ; + shift = gpioToShift [pin] ; + + /**/ if (mode == INPUT) + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input + else if (mode == OUTPUT) + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ; + else if (mode == PWM_OUTPUT) + { + if ((alt = gpioToPwmALT [pin]) == 0) // Not a PWM pin + return ; + +// Set pin to PWM mode + + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; + delayMicroseconds (110) ; // See comments in pwmSetClockWPi + + pwmSetModeWPi (PWM_MODE_BAL) ; // Pi default mode + pwmSetRangeWPi (1024) ; // Default range of 1024 + pwmSetClockWPi (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM + } + else if (mode == GPIO_CLOCK) + { + if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin + return ; + +// Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz + + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; + delayMicroseconds (110) ; + gpioClockSetGpio (pin, 100000) ; + } +} + +void pinModeWPi (int pin, int mode) +{ + pinModeGpio (pinToGpio [pin & 63], mode) ; +} + +void pinModeSys (int pin, int mode) +{ + return ; +} + + +/* * waitForInterrupt: * Wait for Interrupt on a GPIO pin. * This is actually done via the /sys/class/gpio interface regardless of @@ -906,22 +1014,12 @@ void pullUpDnControlSys (int pin, int pud) int waitForInterruptSys (int pin, int mS) { int fd, x ; - char buf [8] ; + uint8_t c ; struct pollfd polls ; if ((fd = sysFds [pin & 63]) == -1) return -2 ; -// Do a dummy read - - x = read (fd, buf, 6) ; - if (x < 0) - return x ; - -// And seek - - lseek (fd, 0, SEEK_SET) ; - // Setup poll structure polls.fd = fd ; @@ -929,7 +1027,14 @@ int waitForInterruptSys (int pin, int mS) // Wait for it ... - return poll (&polls, 1, mS) ; + x = poll (&polls, 1, mS) ; + +// Do a dummy read to clear the interrupt +// A one character read appars to be enough. + + (void)read (fd, &c, 1) ; + + return x ; } int waitForInterruptWPi (int pin, int mS) @@ -944,6 +1049,123 @@ int waitForInterruptGpio (int pin, int mS) /* + * interruptHandler: + * This is a thread and gets started to wait for the interrupt we're + * hoping to catch. It will call the user-function when the interrupt + * fires. + ********************************************************************************* + */ + +static void *interruptHandler (void *arg) +{ + int myPin = *(int *)arg ; + + (void)piHiPri (55) ; // Only effective if we run as root + + for (;;) + if (waitForInterruptSys (myPin, -1) > 0) + isrFunctions [myPin] () ; + + return NULL ; +} + + +/* + * wiringPiISR: + * Take the details and create an interrupt handler that will do a call- + * back to the user supplied function. + ********************************************************************************* + */ + +int wiringPiISR (int pin, int mode, void (*function)(void)) +{ + pthread_t threadId ; + char fName [64] ; + char *modeS ; + char pinS [8] ; + pid_t pid ; + int count, i ; + uint8_t c ; + + pin &= 63 ; + + if (wiringPiMode == WPI_MODE_UNINITIALISED) + { + fprintf (stderr, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; + exit (EXIT_FAILURE) ; + } + else if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + +// Now export the pin and set the right edge +// We're going to use the gpio program to do this, so it assumes +// a full installation of wiringPi. It's a bit 'clunky', but it +// is a way that will work when we're running in "Sys" mode, as +// a non-root user. (without sudo) + + if (mode != INT_EDGE_SETUP) + { + /**/ if (mode == INT_EDGE_FALLING) + modeS = "falling" ; + else if (mode == INT_EDGE_RISING) + modeS = "rising" ; + else + modeS = "both" ; + + sprintf (pinS, "%d", pin) ; + + if ((pid = fork ()) < 0) // Fail + return pid ; + + if (pid == 0) // Child, exec + { + execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; + return -1 ; // Failure ... + } + else // Parent, wait + wait (NULL) ; + } + +// Now pre-open the /sys/class node - it may already be open if +// we are in Sys mode, but this will do no harm. + + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; + if ((sysFds [pin] = open (fName, O_RDWR)) < 0) + return -1 ; + +// Clear any initial pending interrupt + + ioctl (sysFds [pin], FIONREAD, &count) ; + for (i = 0 ; i < count ; ++i) + read (sysFds [pin], &c, 1) ; + + isrFunctions [pin] = function ; + + pthread_create (&threadId, NULL, interruptHandler, &pin) ; + + delay (1) ; + + return 0 ; +} + + +/* + * initialiseEpoch: + * Initialise our start-of-time variable to be the current unix + * time in milliseconds. + ********************************************************************************* + */ + +static void initialiseEpoch (void) +{ + struct timeval tv ; + + gettimeofday (&tv, NULL) ; + epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; + epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ; +} + +/* * delay: * Wait for some number of milli seconds ********************************************************************************* @@ -978,28 +1200,8 @@ void delay (unsigned int howLong) ********************************************************************************* */ -void delayMicrosecondsSys (unsigned int howLong) -{ - struct timespec sleeper, dummy ; - - sleeper.tv_sec = 0 ; - sleeper.tv_nsec = (long)(howLong * 1000) ; - - nanosleep (&sleeper, &dummy) ; -} - void delayMicrosecondsHard (unsigned int howLong) { -#ifdef HARD_TIMER - volatile unsigned int dummy ; - - *(timer + TIMER_LOAD) = howLong ; - *(timer + TIMER_IRQ_CLR) = 0 ; - - dummy = *timerIrqRaw ; - while (dummy == 0) - dummy = *timerIrqRaw ; -#else struct timeval tNow, tLong, tEnd ; gettimeofday (&tNow, NULL) ; @@ -1009,10 +1211,9 @@ void delayMicrosecondsHard (unsigned int howLong) while (timercmp (&tNow, &tEnd, <)) gettimeofday (&tNow, NULL) ; -#endif } -void delayMicrosecondsWPi (unsigned int howLong) +void delayMicroseconds (unsigned int howLong) { struct timespec sleeper ; @@ -1038,13 +1239,30 @@ void delayMicrosecondsWPi (unsigned int howLong) unsigned int millis (void) { struct timeval tv ; - unsigned long long t1 ; + uint64_t now ; gettimeofday (&tv, NULL) ; + now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; + + return (uint32_t)(now - epochMilli) ; +} - t1 = (tv.tv_sec * 1000000 + tv.tv_usec) / 1000 ; - return (uint32_t)(t1 - epoch) ; +/* + * micros: + * Return a number of microseconds as an unsigned int. + ********************************************************************************* + */ + +unsigned int micros (void) +{ + struct timeval tv ; + uint64_t now ; + + gettimeofday (&tv, NULL) ; + now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ; + + return (uint32_t)(now - epochMicro) ; } @@ -1061,30 +1279,37 @@ int wiringPiSetup (void) { int fd ; int boardRev ; - uint8_t *gpioMem, *pwmMem, *clkMem, *padsMem, *timerMem ; - struct timeval tv ; + + if (geteuid () != 0) + { + fprintf (stderr, "wiringPi:\n Must be root to call wiringPiSetup().\n (Did you forget sudo?)\n") ; + exit (EXIT_FAILURE) ; + } if (getenv ("WIRINGPI_DEBUG") != NULL) + { + printf ("wiringPi: Debug mode enabled\n") ; wiringPiDebug = TRUE ; + } if (wiringPiDebug) printf ("wiringPi: wiringPiSetup called\n") ; pinMode = pinModeWPi ; + getAlt = getAltWPi ; pullUpDnControl = pullUpDnControlWPi ; digitalWrite = digitalWriteWPi ; digitalWriteByte = digitalWriteByteGpio ; // Same code + gpioClockSet = gpioClockSetWPi ; pwmWrite = pwmWriteWPi ; setPadDrive = setPadDriveWPi ; digitalRead = digitalReadWPi ; waitForInterrupt = waitForInterruptWPi ; - delayMicroseconds = delayMicrosecondsWPi ; pwmSetMode = pwmSetModeWPi ; pwmSetRange = pwmSetRangeWPi ; pwmSetClock = pwmSetClockWPi ; - if ((boardRev = piBoardRev ()) < 0) - return -1 ; + boardRev = piBoardRev () ; if (boardRev == 1) pinToGpio = pinToGpioR1 ; @@ -1095,111 +1320,82 @@ int wiringPiSetup (void) if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0) { - fprintf (stderr, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; + if (wiringPiDebug) + { + int serr = errno ; + fprintf (stderr, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; + errno = serr ; + } return -1 ; } // GPIO: -// Allocate 2 pages - 1 ... - - if ((gpioMem = malloc (BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) + gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ; + if ((int32_t)gpio == -1) { - fprintf (stderr, "wiringPiSetup: malloc failed: %s\n", strerror (errno)) ; - return -1 ; - } - -// ... presumably to make sure we can round it up to a whole page size - - if (((uint32_t)gpioMem % PAGE_SIZE) != 0) - gpioMem += PAGE_SIZE - ((uint32_t)gpioMem % PAGE_SIZE) ; - - gpio = (uint32_t *)mmap((caddr_t)gpioMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_BASE) ; - - if ((int32_t)gpio < 0) - { - fprintf (stderr, "wiringPiSetup: mmap failed: %s\n", strerror (errno)) ; + if (wiringPiDebug) + { + int serr = errno ; + fprintf (stderr, "wiringPiSetup: mmap failed: %s\n", strerror (errno)) ; + errno = serr ; + } return -1 ; } // PWM - if ((pwmMem = malloc (BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) + pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ; + if ((int32_t)pwm == -1) { - fprintf (stderr, "wiringPiSetup: pwmMem malloc failed: %s\n", strerror (errno)) ; - return -1 ; - } - - if (((uint32_t)pwmMem % PAGE_SIZE) != 0) - pwmMem += PAGE_SIZE - ((uint32_t)pwmMem % PAGE_SIZE) ; - - pwm = (uint32_t *)mmap(pwmMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_PWM) ; - - if ((int32_t)pwm < 0) - { - fprintf (stderr, "wiringPiSetup: mmap failed (pwm): %s\n", strerror (errno)) ; + if (wiringPiDebug) + { + int serr = errno ; + fprintf (stderr, "wiringPiSetup: mmap failed (pwm): %s\n", strerror (errno)) ; + errno = serr ; + } return -1 ; } // Clock control (needed for PWM) - if ((clkMem = malloc (BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) - { - fprintf (stderr, "wiringPiSetup: clkMem malloc failed: %s\n", strerror (errno)) ; - return -1 ; - } - - if (((uint32_t)clkMem % PAGE_SIZE) != 0) - clkMem += PAGE_SIZE - ((uint32_t)clkMem % PAGE_SIZE) ; - - clk = (uint32_t *)mmap(clkMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, CLOCK_BASE) ; - - if ((int32_t)clk < 0) + clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CLOCK_BASE) ; + if ((int32_t)clk == -1) { - fprintf (stderr, "wiringPiSetup: mmap failed (clk): %s\n", strerror (errno)) ; + if (wiringPiDebug) + { + int serr = errno ; + fprintf (stderr, "wiringPiSetup: mmap failed (clk): %s\n", strerror (errno)) ; + errno = serr ; + } return -1 ; } // The drive pads - if ((padsMem = malloc (BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) + pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; + if ((int32_t)pads == -1) { - fprintf (stderr, "wiringPiSetup: padsMem malloc failed: %s\n", strerror (errno)) ; + if (wiringPiDebug) + { + int serr = errno ; + fprintf (stderr, "wiringPiSetup: mmap failed (pads): %s\n", strerror (errno)) ; + errno = serr ; + } return -1 ; } - if (((uint32_t)padsMem % PAGE_SIZE) != 0) - padsMem += PAGE_SIZE - ((uint32_t)padsMem % PAGE_SIZE) ; - - pads = (uint32_t *)mmap(padsMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_PADS) ; - - if ((int32_t)pads < 0) - { - fprintf (stderr, "wiringPiSetup: mmap failed (pads): %s\n", strerror (errno)) ; - return -1 ; - } - -#ifdef DEBUG_PADS - printf ("Checking pads @ 0x%08X\n", (unsigned int)pads) ; - printf (" -> %08X %08X %08X\n", *(pads + 11), *(pads + 12), *(pads + 13)) ; -#endif - // The system timer - if ((timerMem = malloc (BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) + timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ; + if ((int32_t)timer == -1) { - fprintf (stderr, "wiringPiSetup: timerMem malloc failed: %s\n", strerror (errno)) ; - return -1 ; - } - - if (((uint32_t)timerMem % PAGE_SIZE) != 0) - timerMem += PAGE_SIZE - ((uint32_t)timerMem % PAGE_SIZE) ; - - timer = (uint32_t *)mmap(timerMem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, GPIO_TIMER) ; - - if ((int32_t)timer < 0) - { - fprintf (stderr, "wiringPiSetup: mmap failed (timer): %s\n", strerror (errno)) ; + if (wiringPiDebug) + { + int serr = errno ; + fprintf (stderr, "wiringPiSetup: mmap failed (timer): %s\n", strerror (errno)) ; + errno = serr ; + } return -1 ; } @@ -1211,10 +1407,9 @@ int wiringPiSetup (void) *(timer + TIMER_PRE_DIV) = 0x00000F9 ; timerIrqRaw = timer + TIMER_IRQ_RAW ; -// Initialise our epoch for millis() + initialiseEpoch () ; - gettimeofday (&tv, NULL) ; - epoch = (tv.tv_sec * 1000000 + tv.tv_usec) / 1000 ; + wiringPiMode = WPI_MODE_PINS ; return 0 ; } @@ -1233,25 +1428,34 @@ int wiringPiSetupGpio (void) { int x ; - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupGpio called\n") ; + if (geteuid () != 0) + { + fprintf (stderr, "Must be root to call wiringPiSetupGpio(). (Did you forget sudo?)\n") ; + exit (EXIT_FAILURE) ; + } if ((x = wiringPiSetup ()) < 0) return x ; + if (wiringPiDebug) + printf ("wiringPi: wiringPiSetupGpio called\n") ; + pinMode = pinModeGpio ; + getAlt = getAltGpio ; pullUpDnControl = pullUpDnControlGpio ; digitalWrite = digitalWriteGpio ; digitalWriteByte = digitalWriteByteGpio ; + gpioClockSet = gpioClockSetGpio ; pwmWrite = pwmWriteGpio ; setPadDrive = setPadDriveGpio ; digitalRead = digitalReadGpio ; waitForInterrupt = waitForInterruptGpio ; - delayMicroseconds = delayMicrosecondsWPi ; // Same pwmSetMode = pwmSetModeWPi ; pwmSetRange = pwmSetRangeWPi ; pwmSetClock = pwmSetClockWPi ; + wiringPiMode = WPI_MODE_GPIO ; + return 0 ; } @@ -1269,34 +1473,35 @@ int wiringPiSetupSys (void) { int boardRev ; int pin ; - struct timeval tv ; char fName [128] ; + if (getenv ("WIRINGPI_DEBUG") != NULL) + wiringPiDebug = TRUE ; + if (wiringPiDebug) printf ("wiringPi: wiringPiSetupSys called\n") ; pinMode = pinModeSys ; + getAlt = getAltSys ; pullUpDnControl = pullUpDnControlSys ; digitalWrite = digitalWriteSys ; digitalWriteByte = digitalWriteByteSys ; + gpioClockSet = gpioClockSetSys ; pwmWrite = pwmWriteSys ; setPadDrive = setPadDriveSys ; digitalRead = digitalReadSys ; waitForInterrupt = waitForInterruptSys ; - delayMicroseconds = delayMicrosecondsSys ; pwmSetMode = pwmSetModeSys ; pwmSetRange = pwmSetRangeSys ; pwmSetClock = pwmSetClockSys ; - if ((boardRev = piBoardRev ()) < 0) - return -1 ; + boardRev = piBoardRev () ; if (boardRev == 1) pinToGpio = pinToGpioR1 ; else pinToGpio = pinToGpioR2 ; - // Open and scan the directory, looking for exported GPIOs, and pre-open // the 'value' interface to speed things up for later @@ -1306,10 +1511,9 @@ int wiringPiSetupSys (void) sysFds [pin] = open (fName, O_RDWR) ; } -// Initialise the epoch for mills() ... + initialiseEpoch () ; - gettimeofday (&tv, NULL) ; - epoch = (tv.tv_sec * 1000000 + tv.tv_usec) / 1000 ; + wiringPiMode = WPI_MODE_GPIO_SYS ; return 0 ; } diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 6a7278e..18c6da5 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -23,32 +23,50 @@ // Handy defines +// Deprecated #define NUM_PINS 17 #define WPI_MODE_PINS 0 #define WPI_MODE_GPIO 1 #define WPI_MODE_GPIO_SYS 2 #define WPI_MODE_PIFACE 3 +#define WPI_MODE_UNINITIALISED -1 -#define INPUT 0 -#define OUTPUT 1 -#define PWM_OUTPUT 2 +// Pin modes -#define LOW 0 -#define HIGH 1 +#define INPUT 0 +#define OUTPUT 1 +#define PWM_OUTPUT 2 +#define GPIO_CLOCK 3 -#define PUD_OFF 0 -#define PUD_DOWN 1 -#define PUD_UP 2 +#define LOW 0 +#define HIGH 1 + +// Pull up/down/none + +#define PUD_OFF 0 +#define PUD_DOWN 1 +#define PUD_UP 2 // PWM -#define PWM_MODE_MS 0 -#define PWM_MODE_BAL 1 +#define PWM_MODE_MS 0 +#define PWM_MODE_BAL 1 + +// Interrupt levels + +#define INT_EDGE_SETUP 0 +#define INT_EDGE_FALLING 1 +#define INT_EDGE_RISING 2 +#define INT_EDGE_BOTH 3 + +// Threads + +#define PI_THREAD(X) void *X (void *dummy) // Function prototypes -// c++ wrappers thanks to a commend by Nick Lott +// c++ wrappers thanks to a comment by Nick Lott // (and others on the Raspberry Pi forums) #ifdef __cplusplus @@ -68,13 +86,14 @@ extern int wpiPinToGpio (int wpiPin) ; extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only extern void (*pinMode) (int pin, int mode) ; +extern int (*getAlt) (int pin) ; extern void (*pullUpDnControl) (int pin, int pud) ; extern void (*digitalWrite) (int pin, int value) ; extern void (*digitalWriteByte) (int value) ; +extern void (*gpioClockSet) (int pin, int freq) ; extern void (*pwmWrite) (int pin, int value) ; extern void (*setPadDrive) (int group, int value) ; extern int (*digitalRead) (int pin) ; -extern void (*delayMicroseconds) (unsigned int howLong) ; extern void (*pwmSetMode) (int mode) ; extern void (*pwmSetRange) (unsigned int range) ; extern void (*pwmSetClock) (int divisor) ; @@ -82,11 +101,10 @@ extern void (*pwmSetClock) (int divisor) ; // Interrupts extern int (*waitForInterrupt) (int pin, int mS) ; +extern int wiringPiISR (int pin, int mode, void (*function)(void)) ; // Threads -#define PI_THREAD(X) void *X (void *dummy) - extern int piThreadCreate (void *(*fn)(void *)) ; extern void piLock (int key) ; extern void piUnlock (int key) ; @@ -99,7 +117,9 @@ extern int piHiPri (int pri) ; // Extras from arduino land extern void delay (unsigned int howLong) ; +extern void delayMicroseconds (unsigned int howLong) ; extern unsigned int millis (void) ; +extern unsigned int micros (void) ; #ifdef __cplusplus } diff --git a/wiringPi/wiringPiI2C.c b/wiringPi/wiringPiI2C.c new file mode 100644 index 0000000..93fe1d3 --- /dev/null +++ b/wiringPi/wiringPiI2C.c @@ -0,0 +1,122 @@ +/* + * wiringPiI2C.c: + * Simplified I2C access routines + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + +#include +#include +#include +#include +#include + +#include "wiringPi.h" +#include "wiringPiI2C.h" + + +/* + * wiringPiI2CRead: + * Simple device read + ********************************************************************************* + */ + +int wiringPiI2CRead (int fd) +{ + return i2c_smbus_read_byte (fd) ; +} + + +/* + * wiringPiI2CReadReg8: wiringPiI2CReadReg16: + * Read an 8 or 16-bit value from a regsiter on the device + ********************************************************************************* + */ + +int wiringPiI2CReadReg8 (int fd, int reg) +{ + return i2c_smbus_read_byte_data (fd, reg) ; +} + +int wiringPiI2CReadReg16 (int fd, int reg) +{ + return i2c_smbus_read_word_data (fd, reg) ; +} + + +/* + * wiringPiI2CWrite: + * Simple device write + ********************************************************************************* + */ + +int wiringPiI2CWrite (int fd, int data) +{ + return i2c_smbus_write_byte (fd, data) ; +} + + +/* + * wiringPiI2CWriteReg8: wiringPiI2CWriteReg16: + * Write an 8 or 16-bit value to the given register + ********************************************************************************* + */ + +int wiringPiI2CWriteReg8 (int fd, int reg, int data) +{ + return i2c_smbus_write_byte_data (fd, reg, data) ; +} + +int wiringPiI2CWriteReg16 (int fd, int reg, int data) +{ + return i2c_smbus_write_word_data (fd, reg, data) ; +} + + +/* + * wiringPiI2CSetup: + * Open the I2C device, and regsiter the target device + ********************************************************************************* + */ + +int wiringPiI2CSetup (int devId) +{ + int rev, fd ; + char *device ; + + if ((rev = piBoardRev ()) < 0) + { + fprintf (stderr, "wiringPiI2CSetup: Unable to determine Pi board revision\n") ; + exit (1) ; + } + + if (rev == 1) + device = "/dev/i2c-0" ; + else + device = "/dev/i2c-1" ; + + if ((fd = open (device, O_RDWR)) < 0) + return -1 ; + + if (ioctl (fd, I2C_SLAVE, devId) < 0) + return -1 ; + + return fd ; +} diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h new file mode 100644 index 0000000..6710ff4 --- /dev/null +++ b/wiringPi/wiringPiI2C.h @@ -0,0 +1,41 @@ +/* + * wiringPiI2C.h: + * Simplified I2C access routines + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * 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 . + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int wiringPiI2CRead (int fd) ; +extern int wiringPiI2CReadReg8 (int fd, int reg) ; +extern int wiringPiI2CReadReg16 (int fd, int reg) ; + +extern int wiringPiI2CWrite (int fd, int data) ; +extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; +extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; + +int wiringPiI2CSetup (int devId) ; + +#ifdef __cplusplus +} +#endif