]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tools/platforms/mica/uisp/src/SASA.C
Merge devel code into the trunk.
[tinyos-2.x.git] / tools / platforms / mica / uisp / src / SASA.C
diff --git a/tools/platforms/mica/uisp/src/SASA.C b/tools/platforms/mica/uisp/src/SASA.C
new file mode 100644 (file)
index 0000000..dc54fab
--- /dev/null
@@ -0,0 +1,211 @@
+// $Id$
+
+/*
+ * $Id$
+ *
+ ****************************************************************************
+ *
+ * uisp - The Micro In-System Programmer for Atmel AVR microcontrollers.
+ * Copyright (C) 1999, 2000, 2001, 2002, 2003  Sergey Larin
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Portions Copyright (c) 2002-2003 Intel Corporation
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached INTEL-LICENSE     
+ * file. If you do not find these files, copies can be found by writing to
+ * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
+ * 94704.  Attention:  Intel License Inquiry.
+
+ ****************************************************************************
+ */
+
+/*
+       SASA.C
+
+       Stargate AVR SSP Access (SASA)
+       
+       Phil Buonadonna (c) 2003
+*/
+
+//#define DEBUG
+//#define DEBUG1
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+
+
+#include <unistd.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+
+#include "timeradd.h"
+#include "Global.h"
+#include "Error.h"
+#include "SASA.h"
+#include "Avr.h"
+
+
+/* Default value for minimum SCK high/low time in microseconds.  */
+#ifndef SCK_DELAY
+#define SCK_DELAY 5
+#endif
+
+/* Minimum RESET# high time in microseconds.
+   Should be enough to charge a capacitor between RESET# and GND
+   (it is recommended to use a voltage detector with open collector
+   output, and only something like 100 nF for noise immunity).
+   Default value may be changed with -dt_reset=N microseconds.  */
+#ifndef RESET_HIGH_TIME
+#define RESET_HIGH_TIME 1000
+#endif
+
+/* Delay from RESET# low to sending program enable command
+   (the datasheet says it must be at least 20 ms).  Also wait time
+   for crystal oscillator to start after possible power down mode.  */
+#ifndef RESET_LOW_TIME
+#define RESET_LOW_TIME 30000
+#endif
+
+const char TSASA::dev_name[] = "/dev/ssp";
+
+void
+TSASA::SckDelay()
+{
+  Delay_usec(5);
+}
+
+#ifndef MIN_SLEEP_USEC
+#define MIN_SLEEP_USEC 20000
+#endif
+
+void
+TSASA::Delay_usec(long t)
+{
+  struct timeval t1, t2;
+  if (t <= 0)
+    return;  /* very short delay for slow machines */
+  gettimeofday(&t1, NULL);
+  if (t > MIN_SLEEP_USEC)
+    usleep(t - MIN_SLEEP_USEC);
+  /* loop for the remaining time */
+  t2.tv_sec = t / 1000000UL;
+  t2.tv_usec = t % 1000000UL;
+  timeradd(&t1, &t2, &t1);
+  do {
+    gettimeofday(&t2, NULL);
+  } while (timercmp(&t2, &t1, <));
+}
+
+void 
+TSASA::PulseSck()
+{
+
+  PulseReset();
+
+}
+
+void
+TSASA::PulseReset()
+{
+  close(dev_fd);
+
+  Delay_usec(1000);
+
+  dev_fd = open(dev_name, O_RDWR, 0);
+  if (dev_fd == -1) {
+    perror(dev_name);
+    throw Error_Device("Failed to reopen ppdev.");
+  }
+
+}
+
+void
+TSASA::Init()
+{
+  return;
+}
+
+unsigned char
+TSASA::SendRecv(unsigned char b)
+{
+  unsigned char received;
+
+  write(dev_fd,&b,1);
+  read(dev_fd,&received,1);
+
+  return received;
+}
+
+int
+TSASA::Send (unsigned char* queue, int queueSize, int rec_queueSize)
+{
+  unsigned char *p = queue, ch;
+  int i = queueSize;
+  
+  if (rec_queueSize==-1){rec_queueSize = queueSize;}
+#ifdef DEBUG
+  printf ("send(recv): ");
+#endif
+  while (i--){
+#ifdef DEBUG
+    printf ("%02X(", (unsigned int)*p);
+#endif    
+    ch = SendRecv(*p);
+#ifdef DEBUG    
+    printf ("%02X) ", (unsigned int)ch);
+#endif    
+    *p++ = ch;
+  }
+#ifdef DEBUG  
+  printf ("\n");
+#endif  
+  return queueSize;
+}
+
+
+TSASA::TSASA(): 
+  dev_fd(-1)
+{
+
+  /* Drop privileges (if installed setuid root - NOT RECOMMENDED).  */
+  setgid(getgid());
+  setuid(getuid());
+
+  dev_fd = open(dev_name, O_RDWR, 0);
+  if (dev_fd == -1) {
+    perror(dev_name);
+    throw Error_Device("Failed to open the SSP. Is the driver installed?");
+  }
+
+}
+
+TSASA::~TSASA()
+{
+
+  if (dev_fd != -1) {
+    close(dev_fd);
+    dev_fd = -1;
+  } 
+}
+
+
+/* eof */