浏览代码

tidied and tested DRC Serial (renamed it it drcSerial too)
Tweaked the mcp3422 code
altered the build script to let me build static

Gordon Henderson 11 年之前
父节点
当前提交
5e16e15a59
共有 7 个文件被更改,包括 120 次插入265 次删除
  1. 18 6
      build
  2. 4 3
      gpio/Makefile
  3. 84 0
      gpio/extensions.c
  4. 3 1
      wiringPi/Makefile
  5. 0 203
      wiringPi/drc.c
  6. 0 34
      wiringPi/drc.h
  7. 11 18
      wiringPi/mcp3422.c

+ 18 - 6
build

@@ -51,18 +51,30 @@ fi
   echo "WiringPi Library"
   cd wiringPi
   sudo make uninstall
-  make
-  check_make_ok
-  sudo make install
+  if [ x$1 = "xstatic" ]; then
+    make static
+    check_make_ok
+    sudo make install-static
+  else
+    make
+    check_make_ok
+    sudo make install
+  fi
   check_make_ok
 
   echo
   echo "WiringPi Devices Library"
   cd ../devLib
   sudo make uninstall
-  make
-  check_make_ok
-  sudo make install
+  if [ x$1 = "xstatic" ]; then
+    make static
+    check_make_ok
+    sudo make install-static
+  else
+    make
+    check_make_ok
+    sudo make install
+  fi
   check_make_ok
 
   echo

+ 4 - 3
gpio/Makefile

@@ -1,9 +1,10 @@
 #
 # Makefile:
-#	wiringPi - Wiring Compatable library for the Raspberry Pi
+#	The gpio command:
+#	  A swiss-army knige of GPIO shenanigans.
 #	https://projects.drogon.net/wiring-pi
 #
-#	Copyright (c) 2012 Gordon Henderson
+#	Copyright (c) 2012-2013 Gordon Henderson
 #################################################################################
 # This file is part of wiringPi:
 #	Wiring Compatable library for the Raspberry Pi
@@ -28,7 +29,7 @@ PREFIX=/local
 #DEBUG	= -g -O0
 DEBUG	= -O2
 CC	= gcc
-INCLUDE	= -I$(DESTDIR)$(PREFIX)/usr/local/include
+INCLUDE	= -I$(DESTDIR)$(PREFIX)/include
 CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
 
 LDFLAGS	= -L$(DESTDIR)$(PREFIX)/lib

+ 84 - 0
gpio/extensions.c

@@ -50,6 +50,7 @@
 #include <mcp4802.h>
 #include <mcp3422.h>
 #include <sn3218.h>
+#include <drcSerial.h>
 
 #include "extensions.h"
 
@@ -99,6 +100,43 @@ static char *extractInt (char *progName, char *p, int *num)
 }
 
 
+/*
+ * extractStr:
+ *	Check & return a string at the given location (prefixed by a :)
+ *********************************************************************************
+ */
+
+static char *extractStr (char *progName, char *p, char **str)
+{
+  char *q, *r ;
+
+  if (*p != ':')
+  {
+    fprintf (stderr, "%s: colon expected\n", progName) ;
+    return NULL ;
+  }
+
+  ++p ;
+
+  if (!isprint (*p))
+  {
+    fprintf (stderr, "%s: character expected\n", progName) ;
+    return NULL ;
+  }
+
+  q = p ;
+  while ((*q != 0) && (*q != ':'))
+    ++q ;
+
+  *str = r = calloc (q - p + 2, 1) ;	// Zeros it
+
+  while (p != q)
+    *r++ = *p++ ;
+    
+  return p ;
+}
+
+
 
 /*
  * doExtensionMcp23008:
@@ -524,6 +562,51 @@ static int doExtensionMcp3422 (char *progName, int pinBase, char *params)
   return TRUE ;
 }
 
+/*
+ * doExtensionDrcS:
+ *	Interface to a DRC Serial system
+ *	drcs:base:pins:serialPort:baud
+ *********************************************************************************
+ */
+
+static int doExtensionDrcS (char *progName, int pinBase, char *params)
+{
+  char *port ;
+  int pins, baud ;
+
+  if ((params = extractInt (progName, params, &pins)) == NULL)
+    return FALSE ;
+
+  if ((pins < 1) || (pins > 100))
+  {
+    fprintf (stderr, "%s: pins (%d) out of range (2-100)\n", progName, pins) ;
+    return FALSE ;
+  }
+  
+  if ((params = extractStr (progName, params, &port)) == NULL)
+    return FALSE ;
+
+  if (strlen (port) == 0)
+  {
+    fprintf (stderr, "%s: serial port device name required\n", progName) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &baud)) == NULL)
+    return FALSE ;
+
+  if ((baud < 1) || (baud > 4000000))
+  {
+    fprintf (stderr, "%s: baud rate (%d) out of range\n", progName, baud) ;
+    return FALSE ;
+  }
+
+  drcSetupSerial (pinBase, pins, port, baud) ;
+
+  return TRUE ;
+}
+
+
 
 /*
  * Function list
@@ -547,6 +630,7 @@ struct extensionFunctionStruct extensionFunctions [] =
   { "max31855",		&doExtensionMax31855	},
   { "max5322",		&doExtensionMax5322	},
   { "sn3218",		&doExtensionSn3218	},
+  { "drcs",		&doExtensionDrcS	},
   { NULL,		NULL		 	},
 } ;
 

+ 3 - 1
wiringPi/Makefile

@@ -55,7 +55,7 @@ SRC	=	wiringPi.c						\
 		mcp3002.c mcp3004.c mcp4802.c mcp3422.c			\
 		max31855.c max5322.c					\
 		sn3218.c						\
-		drc.c
+		drcSerial.c
 
 OBJ	=	$(SRC:.c=.o)
 
@@ -99,6 +99,7 @@ install-headers:
 	@install -m 0644 softTone.h		$(DESTDIR)$(PREFIX)/include
 	@install -m 0644 wiringPiSPI.h		$(DESTDIR)$(PREFIX)/include
 	@install -m 0644 wiringPiI2C.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 drcSerial.h		$(DESTDIR)$(PREFIX)/include
 	@install -m 0644 mcp23008.h		$(DESTDIR)$(PREFIX)/include
 	@install -m 0644 mcp23016.h		$(DESTDIR)$(PREFIX)/include
 	@install -m 0644 mcp23017.h		$(DESTDIR)$(PREFIX)/include
@@ -139,6 +140,7 @@ uninstall:
 	@rm -f $(DESTDIR)$(PREFIX)/include/softTone.h
 	@rm -f $(DESTDIR)$(PREFIX)/include/wiringPiSPI.h
 	@rm -f $(DESTDIR)$(PREFIX)/include/wiringPiI2C.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/drcSerial.h
 	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23008.h
 	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23016.h
 	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23017.h

+ 0 - 203
wiringPi/drc.c

@@ -1,203 +0,0 @@
-/*
- * drc.c:
- *	Extend wiringPi with the DRC control protocll to Arduino
- *	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 <http://www.gnu.org/licenses/>.
- ***********************************************************************
- */
-
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-
-#include "wiringPi.h"
-#include "wiringSerial.h"
-
-#include "drc.h"
-
-#ifndef	TRUE
-#  define	TRUE	(1==1)
-#  define	FALSE	(1==2)
-#endif
-
-
-/*
- * myPinMode:
- *	Change the pin mode on the remote DRC device
- *********************************************************************************
- */
-
-static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
-{
-  /**/ if (mode == OUTPUT)
-    serialPutchar (node->fd, 'o') ;       // Input
-  else if (mode == PWM_OUTPUT)
-    serialPutchar (node->fd, 'p') ;       // PWM
-  else
-    serialPutchar (node->fd, 'i') ;       // Default to input
-
-  serialPutchar (node->fd, pin - node->pinBase) ;
-}
-
-
-/*
- * myPullUpDnControl:
- *	ATmegas only have pull-up's on of off. No pull-downs.
- *********************************************************************************
- */
-
-static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
-{
-
-// Force pin into input mode
-
-  serialPutchar (node->fd, 'i' ) ;
-  serialPutchar (node->fd, pin) ;
-
-  /**/ if (mode == PUD_UP)
-  {
-    serialPutchar (node->fd, '1') ;
-    serialPutchar (node->fd, pin - node->pinBase) ;
-  }
-  else if (mode == PUD_OFF)
-  {
-    serialPutchar (node->fd, '0') ;
-    serialPutchar (node->fd, pin - node->pinBase) ;
-  }
-}
-
-
-/*
- * myDigitalWrite:
- *********************************************************************************
- */
-
-static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
-{
-  serialPutchar (node->fd, value == 0 ? '0' : '1') ;
-  serialPutchar (node->fd, pin - node->pinBase) ;
-}
-
-
-/*
- * myPwmWrite:
- *********************************************************************************
- */
-
-static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value)
-{
-  serialPutchar (node->fd, 'v') ;
-  serialPutchar (node->fd, pin - node->pinBase) ;
-  serialPutchar (node->fd, value & 0xFF) ;
-}
-
-
-/*
- * myAnalogRead:
- *********************************************************************************
- */
-
-static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
-{
-  int vHi, vLo ;
-
-  serialPutchar (node->fd, 'a') ;
-  serialPutchar (node->fd, pin - node->pinBase) ;
-  vHi = serialGetchar (node->fd) ;
-  vLo = serialGetchar (node->fd) ;
-
-  return (vHi << 8) | vLo ;
-}
-
-
-/*
- * myDigitalRead:
- *********************************************************************************
- */
-
-static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
-{
-  serialPutchar (node->fd, 'r') ; // Send read command
-  serialPutchar (node->fd, pin - node->pinBase) ;
-  return (serialGetchar (node->fd) == '0') ? 0 : 1 ;
-}
-
-
-/*
- * drcSetup:
- *	Create a new instance of an DRC GPIO interface.
- *	Could be a variable nunber of pins here - we might not know in advance
- *	if it's an ATmega with 14 pins, or something with less or more!
- *********************************************************************************
- */
-
-int drcSetup (const int pinBase, const int numPins, const char *device)
-{
-  int fd ;
-  int ok, tries ;
-  time_t then ;
-  struct wiringPiNodeStruct *node ;
-
-  if ((fd = serialOpen (device, 115200)) < 0)
-    return wiringPiFailure (WPI_ALMOST, "Unable to open DRC device (%s): %s", device, strerror (errno)) ;
-
-  delay (10) ;	// May need longer if it's an Uno that reboots on the open...
-
-// Flush any pending input
-
-  while (serialDataAvail (fd))
-    (void)serialGetchar (fd) ;
-
-  ok = FALSE ;
-  for (tries = 1 ; tries < 5 ; ++tries)
-  {
-    serialPutchar (fd, '@') ;
-    then = time (NULL) + 2 ;
-    while (time (NULL) < then)
-      if (serialDataAvail (fd))
-      {
-        if (serialGetchar (fd) == '@')
-        {
-          ok = TRUE ;
-          break ;
-        }
-      }
-    if (ok)
-      break ;
-  }
-
-  if (!ok)
-  {
-    serialClose (fd) ;
-    return wiringPiFailure (WPI_FATAL, "Unable to communidate with DRC device") ;
-  }
-
-  node = wiringPiNewNode (pinBase, numPins) ;
-
-  node->fd              = fd ;
-  node->pinMode         = myPinMode ;
-  node->pullUpDnControl = myPullUpDnControl ;
-  node->analogRead      = myAnalogRead ;
-  node->digitalRead     = myDigitalRead ;
-  node->digitalWrite    = myDigitalWrite ;
-  node->pwmWrite        = myPwmWrite ;
-
-  return 0 ;
-}

+ 0 - 34
wiringPi/drc.h

@@ -1,34 +0,0 @@
-/*
- * drc.h:
- *	Extend wiringPi with the DRC control protocll to Arduino
- *	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 <http://www.gnu.org/licenses/>.
- ***********************************************************************
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int drcSetup (const int pinBase, const int numPins, const char *device) ;
-
-
-#ifdef __cplusplus
-}
-#endif

+ 11 - 18
wiringPi/mcp3422.c

@@ -25,6 +25,7 @@
 
 
 #include <stdio.h>
+#include <unistd.h>
 #include <stdint.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
@@ -44,7 +45,8 @@
 
 int myAnalogRead (struct wiringPiNodeStruct *node, int chan)
 {
-  unsigned char config, b0, b1, b2, b3 ;
+  unsigned char config ;
+  unsigned char buffer [4] ;
   int value = 0 ;
 
 // One-shot mode, trigger plus the other configs.
@@ -57,35 +59,26 @@ int myAnalogRead (struct wiringPiNodeStruct *node, int chan)
   {
     case MCP3422_SR_3_75:			// 18 bits
       delay (270) ;
-      b0 = wiringPiI2CRead (node->fd) ;
-      b1 = wiringPiI2CRead (node->fd) ;
-      b2 = wiringPiI2CRead (node->fd) ;
-      b3 = wiringPiI2CRead (node->fd) ;
-      value = ((b0 & 3) << 16) | (b1 << 8) | b2 ;
+      read (node->fd, buffer, 4) ;
+      value = ((buffer [0] & 3) << 16) | (buffer [1] << 8) | buffer [0] ;
       break ;
 
     case MCP3422_SR_15:				// 16 bits
       delay ( 70) ;
-      b0 = wiringPiI2CRead (node->fd) ;
-      b1 = wiringPiI2CRead (node->fd) ;
-      b2 = wiringPiI2CRead (node->fd) ;
-      value = (b0 << 8) | b1 ;
+      read (node->fd, buffer, 3) ;
+      value = (buffer [0] << 8) | buffer [1] ;
       break ;
 
     case MCP3422_SR_60:				// 14 bits
       delay ( 17) ;
-      b0 = wiringPiI2CRead (node->fd) ;
-      b1 = wiringPiI2CRead (node->fd) ;
-      b2 = wiringPiI2CRead (node->fd) ;
-      value = ((b0 & 0x3F) << 8) | b1 ;
+      read (node->fd, buffer, 3) ;
+      value = ((buffer [0] & 0x3F) << 8) | buffer [1] ;
       break ;
 
     case MCP3422_SR_240:			// 12 bits
       delay (  5) ;
-      b0 = wiringPiI2CRead (node->fd) ;
-      b1 = wiringPiI2CRead (node->fd) ;
-      b2 = wiringPiI2CRead (node->fd) ;
-      value = ((b0 & 0x0F) << 8) | b1 ;
+      read (node->fd, buffer, 3) ;
+      value = ((buffer [0] & 0x0F) << 8) | buffer [0] ;
       break ;
   }