Explorar el Código

Quite a few changes here.
Added in generic 'blink' programs in the examples in C, RTB and Shell.
Updated wiringPi with a little big-file on the millis() function and
added in a new micros() function too.
Updated the examples with standard LGPL headers.
Added a new isr-osc.c test program - just for ISR timing purposes.

Gordon Henderson hace 11 años
padre
commit
e8f6258004

+ 13 - 10
examples/Makefile

@@ -35,27 +35,26 @@ LDLIBS    = -lwiringPi -lpthread -lm
 # Should not alter anything below this line
 ###############################################################################
 
-SRC	=	test1.c test2.c speed.c lcd.c wfi.c isr.c	\
-		piface.c gertboard.c nes.c			\
-		pwm.c tone.c servo.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)
 
 BINS	=	$(SRC:.c=)
 
-# Note:
-#	Please don't waste your time by emailling me or doing a
-#	pull request with changes to make all these targets. It
-#	is intentional that I do it this way as it now takes too
-#	long to compile them all and most people will not run
-#	them anyway... -GH-
-
 all:	
 	@cat README.TXT
 	@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)
@@ -80,6 +79,10 @@ 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)

+ 5 - 1
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:
 

+ 50 - 0
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+// 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 ;
+}

+ 30 - 0
examples/blink.rtb

@@ -0,0 +1,30 @@
+// blink.rtb:
+//    Blink program in Return to Basic
+//
+// Copyright (c) 2012-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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+//
+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 

+ 37 - 0
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. <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 <http://www.gnu.org/licenses/>.
+#######################################################################
+
+# 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

+ 24 - 0
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
 
 #include <stdio.h>
 #include <unistd.h>

+ 18 - 1
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <stdio.h>

+ 23 - 0
examples/header.h

@@ -0,0 +1,23 @@
+/*
+ * file.c:
+ *
+ * Copyright (c) 2012-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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+

+ 118 - 0
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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <wiringPi.h>
+
+
+// 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 ;
+}

+ 23 - 0
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
 
 #include <stdio.h>
 #include <errno.h>

+ 19 - 2
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <stdio.h>

+ 21 - 3
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <wiringPi.h>

+ 24 - 0
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
 
 #include <stdio.h>
 #include <errno.h>

+ 19 - 2
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <stdio.h>

+ 18 - 0
examples/serialTest.c

@@ -3,6 +3,24 @@
  *	Very simple program to test the serial port. Expects
  *	the port to be looped back to itself
  *
+ * Copyright (c) 2012-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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <stdio.h>

+ 24 - 0
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
 
 #include <stdio.h>
 #include <errno.h>

+ 19 - 1
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <wiringPi.h>

+ 21 - 1
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <wiringPi.h>

+ 20 - 3
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
  */
 
 #include <wiringPi.h>

+ 28 - 6
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. <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 <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
 
 #include <stdio.h>
 #include <errno.h>
@@ -6,15 +30,13 @@
 #include <wiringPi.h>
 #include <softTone.h>
 
-#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) ;
     }
   }

+ 2 - 2
gpio/Makefile

@@ -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:

+ 15 - 5
gpio/gpio.1

@@ -38,7 +38,7 @@ group value
 range
 .PP
 .B gpio
-.B load \ i2c/spi
+.B load \ i2c/spi ...
 .PP
 .B gpio
 .B gbr
@@ -168,9 +168,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 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
@@ -275,4 +284,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.

+ 32 - 45
gpio/gpio.c

@@ -42,7 +42,7 @@ extern int wiringPiDebug ;
 #  define	FALSE	(1==2)
 #endif
 
-#define	VERSION	"1.8"
+#define	VERSION	"1.10"
 
 static int wpMode ;
 
@@ -129,7 +129,7 @@ static int moduleLoaded (char *modName)
 
 static void _doLoadUsage (char *argv [])
 {
-  fprintf (stderr, "Usage: %s load <spi/i2c> [bufferSize in KB for spi]\n", argv [0]) ;
+  fprintf (stderr, "Usage: %s load <spi/i2c> [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ;
   exit (1) ;
 }
 
@@ -138,12 +138,12 @@ static void doLoad (int argc, char *argv [])
   char *module1, *module2 ;
   char cmd [80] ;
   char *file1, *file2 ;
-  char spiBuf [32] ;
+  char args1 [32], args2 [32] ;
 
   if (argc < 3)
     _doLoadUsage (argv) ;
 
-  spiBuf [0] = 0 ;
+  args1 [0] = args2 [0] = 0 ;
 
   /**/ if (strcasecmp (argv [2], "spi") == 0)
   {
@@ -152,10 +152,9 @@ static void doLoad (int argc, char *argv [])
     file1  = "/dev/spidev0.0" ;
     file2  = "/dev/spidev0.1" ;
     if (argc == 4)
-      sprintf (spiBuf, " bufsize=%d", atoi (argv [3]) * 1024) ;
+      sprintf (args1, " bufsize=%d", atoi (argv [3]) * 1024) ;
     else if (argc > 4)
       _doLoadUsage (argv) ;
-    
   }
   else if (strcasecmp (argv [2], "i2c") == 0)
   {
@@ -163,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%s", module1, spiBuf) ;
+    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) ;
   }
 
@@ -200,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 ", "ALT0", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "XXXX"
 } ;
 
 static void doReadall (void)
 {
   int pin ;
 
-  printf ("+----------+------+--------+-------+\n") ;
-  printf ("| wiringPi | GPIO | Name   | Value |\n") ;
-  printf ("+----------+------+--------+-------+\n") ;
+  printf ("+----------+------+--------+------+------+\n") ;
+  printf ("| wiringPi | GPIO | Name   | Mode | Value |\n") ;
+  printf ("+----------+------+--------+------+------+\n") ;
 
-  for (pin = 0 ; pin < NUM_PINS ; ++pin)
-    printf ("| %6d   | %3d  | %s | %s  |\n",
-	pin, wpiPinToGpio (pin),
-	pinNames [pin], 
-	digitalRead (pin) == HIGH ? "High" : "Low ") ;
-
-  printf ("+----------+------+--------+-------+\n") ;
-
-  if (piBoardRev () == 1)
-    return ;
+  for (pin = 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") ;
 }
 
 

+ 12 - 0
wiringPi/lcd.c

@@ -174,6 +174,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

+ 7 - 6
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) ;

+ 101 - 68
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 <stdio.h>
 #include <stdint.h>
@@ -68,15 +65,16 @@
 #include <pthread.h>
 #include <sys/time.h>
 #include <sys/mman.h>
-#include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <sys/ioctl.h>
 
 #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) ;
@@ -84,7 +82,6 @@ void (*pwmWrite)          (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) ;
@@ -177,7 +174,7 @@ static volatile uint32_t *timerIrqRaw ;
 
 // Time for easy calculations
 
-static unsigned long long epoch ;
+static uint64_t epochMilli, epochMicro ;
 
 // Misc
 
@@ -586,6 +583,38 @@ void pinModeSys (int pin, int mode)
 }
 
 
+/*
+ * getAlt:
+ *	Returns the ALT bits for a given port. Only really of-use
+ *	for the gpio readall command (I think)
+ *********************************************************************************
+ */
+
+int getAltGpio (int pin)
+{
+  int fSel, shift, alt ;
+
+  pin &= 63 ;
+
+  fSel    = gpioToGPFSEL [pin] ;
+  shift   = gpioToShift  [pin] ;
+
+  alt = (*(gpio + fSel) >> shift) & 7 ;
+
+  return alt ;
+}
+
+int getAltWPi (int pin)
+{
+  return getAltGpio (pinToGpio [pin & 63]) ;
+}
+
+int getAltSys (int pin)
+{
+  return 0 ;
+}
+
+
 /*
  * pwmControl:
  *	Allow the user to control some of the PWM functions
@@ -627,7 +656,7 @@ void pwmSetRangeSys (unsigned int range)
 
 void pwmSetClockWPi (int divisor)
 {
-  unsigned int pwm_control ;
+  uint32_t pwm_control ;
   divisor &= 4095 ;
 
   if (wiringPiDebug)
@@ -811,10 +840,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)
@@ -913,22 +943,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 ;
@@ -936,7 +956,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)
@@ -986,6 +1013,8 @@ int wiringPiISR (int pin, int mode, void (*function)(void))
   char *modeS ;
   char  pinS [8] ;
   pid_t pid ;
+  int   count, i ;
+  uint8_t c ;
 
   pin &= 63 ;
 
@@ -1027,12 +1056,18 @@ int wiringPiISR (int pin, int mode, void (*function)(void))
   }
 
 // Now pre-open the /sys/class node - it may already be open if
-//	we had set it up earlier, but this will do no harm.
+//	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) ;
@@ -1043,6 +1078,22 @@ int wiringPiISR (int pin, int mode, void (*function)(void))
 }
 
 
+/*
+ * 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
@@ -1078,28 +1129,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) ;
@@ -1109,10 +1140,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 ;
 
@@ -1138,13 +1168,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) ;
 
-  t1 = (tv.tv_sec * 1000000 + tv.tv_usec) / 1000 ;
+  return (uint32_t)(now - epochMilli) ;
+}
+
+
+/*
+ * micros:
+ *	Return a number of microseconds as an unsigned int.
+ *********************************************************************************
+ */
 
-  return (uint32_t)(t1 - epoch) ;
+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) ;
 }
 
 
@@ -1161,8 +1208,6 @@ int wiringPiSetup (void)
 {
   int      fd ;
   int      boardRev ;
-  //uint8_t *gpioMem, *pwmMem, *clkMem, *padsMem, *timerMem ;
-  struct timeval tv ;
 
   if (geteuid () != 0)
   {
@@ -1180,6 +1225,7 @@ int wiringPiSetup (void)
     printf ("wiringPi: wiringPiSetup called\n") ;
 
             pinMode =           pinModeWPi ;
+             getAlt =            getAltWPi ;
     pullUpDnControl =   pullUpDnControlWPi ;
        digitalWrite =      digitalWriteWPi ;
    digitalWriteByte = digitalWriteByteGpio ;	// Same code
@@ -1187,7 +1233,6 @@ int wiringPiSetup (void)
         setPadDrive =       setPadDriveWPi ;
         digitalRead =       digitalReadWPi ;
    waitForInterrupt =  waitForInterruptWPi ;
-  delayMicroseconds = delayMicrosecondsWPi ;
          pwmSetMode =        pwmSetModeWPi ;
         pwmSetRange =       pwmSetRangeWPi ;
         pwmSetClock =       pwmSetClockWPi ;
@@ -1268,11 +1313,6 @@ int wiringPiSetup (void)
     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
 
   timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ;
@@ -1295,10 +1335,7 @@ int wiringPiSetup (void)
   *(timer + TIMER_PRE_DIV) = 0x00000F9 ;
   timerIrqRaw = timer + TIMER_IRQ_RAW ;
 
-// Initialise our epoch for millis()
-
-  gettimeofday (&tv, NULL) ;
-  epoch = (tv.tv_sec * 1000000 + tv.tv_usec) / 1000 ;
+  initialiseEpoch () ;
 
   wiringPiMode = WPI_MODE_PINS ;
 
@@ -1332,6 +1369,7 @@ int wiringPiSetupGpio (void)
     printf ("wiringPi: wiringPiSetupGpio called\n") ;
 
             pinMode =           pinModeGpio ;
+             getAlt =            getAltGpio ;
     pullUpDnControl =   pullUpDnControlGpio ;
        digitalWrite =      digitalWriteGpio ;
    digitalWriteByte =  digitalWriteByteGpio ;
@@ -1339,7 +1377,6 @@ int wiringPiSetupGpio (void)
         setPadDrive =       setPadDriveGpio ;
         digitalRead =       digitalReadGpio ;
    waitForInterrupt =  waitForInterruptGpio ;
-  delayMicroseconds = delayMicrosecondsWPi ;	// Same
          pwmSetMode =        pwmSetModeWPi ;
         pwmSetRange =       pwmSetRangeWPi ;
         pwmSetClock =       pwmSetClockWPi ;
@@ -1363,7 +1400,6 @@ int wiringPiSetupSys (void)
 {
   int boardRev ;
   int pin ;
-  struct timeval tv ;
   char fName [128] ;
 
   if (getenv ("WIRINGPI_DEBUG") != NULL)
@@ -1373,6 +1409,7 @@ int wiringPiSetupSys (void)
     printf ("wiringPi: wiringPiSetupSys called\n") ;
 
             pinMode =           pinModeSys ;
+             getAlt =            getAltSys ;
     pullUpDnControl =   pullUpDnControlSys ;
        digitalWrite =      digitalWriteSys ;
    digitalWriteByte =  digitalWriteByteSys ;
@@ -1380,7 +1417,6 @@ int wiringPiSetupSys (void)
         setPadDrive =       setPadDriveSys ;
         digitalRead =       digitalReadSys ;
    waitForInterrupt =  waitForInterruptSys ;
-  delayMicroseconds = delayMicrosecondsSys ;
          pwmSetMode =        pwmSetModeSys ;
         pwmSetRange =       pwmSetRangeSys ;
         pwmSetClock =       pwmSetClockSys ;
@@ -1401,10 +1437,7 @@ int wiringPiSetupSys (void)
     sysFds [pin] = open (fName, O_RDWR) ;
   }
 
-// Initialise the epoch for mills() ...
-
-  gettimeofday (&tv, NULL) ;
-  epoch = (tv.tv_sec * 1000000 + tv.tv_usec) / 1000 ;
+  initialiseEpoch () ;
 
   wiringPiMode = WPI_MODE_GPIO_SYS ;
 

+ 3 - 1
wiringPi/wiringPi.h

@@ -81,13 +81,13 @@ 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 (*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) ;
@@ -111,7 +111,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
 }