]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tools/platforms/msp430/cppbsl/src/Serial.cc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tools / platforms / msp430 / cppbsl / src / Serial.cc
index 0db3890c18644ca53860942b1ab75958f8957015..1f06989c01ec30202886e585184e72401ba512eb 100644 (file)
  */
 #include <stdio.h>
 #include <iostream>
+#include "../config.h"
+#ifdef HAVE_LINUX_VERSION_H
+#include <linux/version.h>
+#else
+#define LINUX_VERSION_CODE 1
+#define KERNEL_VERSION 3
+#endif
 
 #include "Serial.h"
 
@@ -45,7 +52,7 @@ int serial_connect(int* err, const char* dev, int* readFD, int* writeFD, termios
     int r = 0;
     *readFD = -1;
     *writeFD = -1;
-    for(int i = 0; i < 3; i++) {
+    for(int i = 0; i < 2; i++) {
         *readFD = open(dev, O_RDONLY | O_NOCTTY | O_NONBLOCK);
         *err = errno;
         if(*readFD != -1) {
@@ -83,6 +90,7 @@ int serial_connect(int* err, const char* dev, int* readFD, int* writeFD, termios
         return -1;
     }
     /* prepare attributes */
+#if defined(HAVE_LINUX_VERSION_H) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
     r = tcgetattr(*writeFD, &my_tios);
     if(r == -1) {
         *err = errno;
@@ -127,7 +135,30 @@ int serial_connect(int* err, const char* dev, int* readFD, int* writeFD, termios
         close(*writeFD);
         return -1;        
     }
-
+#else
+    r = tcgetattr(*writeFD, &my_tios);
+    if(r == -1) {
+        *err = errno;
+        close(*readFD);
+        close(*writeFD);
+        return -1;
+    }
+    *pt = my_tios;
+    cfmakeraw(&my_tios);
+    my_tios.c_iflag |= IGNBRK | INPCK;
+    my_tios.c_cflag |= (CS8 | CLOCAL | CREAD | PARENB);
+    cfsetispeed(&my_tios, B9600);
+    cfsetospeed(&my_tios, B9600);
+    r = tcsetattr(*readFD, TCSANOW, &my_tios);
+    if(r == -1) {
+        *err = errno;
+        r = tcsetattr(*writeFD, TCSANOW, pt);
+        close(*readFD);
+        close(*writeFD);
+        return -1;        
+    }
+#endif
+    
     // clear buffers
     r = tcflush(*writeFD, TCIOFLUSH);
     if(r == -1) {
@@ -146,11 +177,14 @@ int serial_connect(int* err, const char* dev, int* readFD, int* writeFD, termios
     return r;
 };
 
+int BaseSerial::setPins(int *err) {
+    setRST(err);
+    return setTEST(err);
+}
+
 int BaseSerial::resetPins(int *err) {
-    int r = 0;
-    r = setRST(err);
-    r = clrTEST(err);
-    return r;
+    setRST(err);
+    return clrTEST(err);
 }
 
 int BaseSerial::disconnect(int *err) {
@@ -185,13 +219,13 @@ int BaseSerial::reset(int *err) {
     if(r == -1) return -1;
     r = setTEST(err);
     if(r == -1) return -1;
-    serial_delay(2500);
+    serial_delay(switchdelay);
     r = clrRST(err);
     if(r == -1) return -1;
-    serial_delay(10);
+    serial_delay(switchdelay);
     r = setRST(err);
     if(r == -1) return -1;
-    serial_delay(2500);
+    serial_delay(switchdelay);
     cout << "Reset device ..." << endl;
     return clearBuffers(err);
 };
@@ -202,27 +236,22 @@ int BaseSerial::invokeBsl(int *err) {
     if(r == -1) return -1;
     r = setTEST(err);
     if(r == -1) return -1;
-    serial_delay(2500);
+    serial_delay(switchdelay);
     r = clrRST(err);
     if(r == -1) return -1;
     r = setTEST(err);
     if(r == -1) return -1;
-    serial_delay(10);
     r = clrTEST(err);
     if(r == -1) return -1;
-    serial_delay(10);
     r = setTEST(err);
     if(r == -1) return -1;
-    serial_delay(10);
     r = clrTEST(err);
     if(r == -1) return -1;
-    serial_delay(10);
     r = setRST(err);
     if(r == -1) return -1;
-    serial_delay(10);
     r = setTEST(err);
     if(r == -1) return -1;
-    serial_delay(2500);
+    serial_delay(switchdelay);
     cout << "Invoking BSL..." << endl;
     return clearBuffers(err);
 }
@@ -243,8 +272,8 @@ int BaseSerial::readFD(int *err, char *buffer, int count, int maxCount) {
                 return -1;
             }
             FD_CLR(serialReadFD, &rfds);
-            if(retries++ >= 3) {
-                cerr << "FATAL: BaseSerial::readFD no data available after 3s" << endl;
+            if(retries++ >= 2) {
+                cerr << "FATAL: BaseSerial::readFD no data available after 1s" << endl;
                 return -1;
             }
         }
@@ -270,7 +299,7 @@ int BaseSerial::txrx(int *err, frame_t *txframe, frame_t *rxframe) {
              << endl;
         return -1;
     }
-    for(unsigned i = 0; i < 3; i++) {
+    for(unsigned i = 0; i < 2; i++) {
         r = write(serialWriteFD,&sync, 1);
         if(r == -1) {
             *err = errno;
@@ -346,8 +375,10 @@ int BaseSerial::txrx(int *err, frame_t *txframe, frame_t *rxframe) {
 }
 
 int BaseSerial::highSpeed(int *err) {
+    int r;
+#if defined(HAVE_LINUX_VERSION_H) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
     struct serial_struct serinfo;
-    int r = ioctl(serialWriteFD, TIOCGSERIAL, &serinfo);
+    r = ioctl(serialWriteFD, TIOCGSERIAL, &serinfo);
     if(r == -1) {
         *err = errno;
         return -1;
@@ -357,6 +388,19 @@ int BaseSerial::highSpeed(int *err) {
     serinfo.flags &= ~ASYNC_SPD_MASK;
     serinfo.flags |= ASYNC_SPD_CUST;
     r = ioctl(serialWriteFD, TIOCSSERIAL, &serinfo);
+#else
+    struct termios my_tios;
+    r = tcgetattr(serialWriteFD, &my_tios);
+    cfsetispeed(&my_tios, B38400); 
+    cfsetospeed(&my_tios, B38400);
+    r = tcsetattr(serialReadFD, TCSANOW, &my_tios);
+    if(r == -1) {
+        *err = errno;
+    }
+    else {
+        r = tcsetattr(serialWriteFD, TCSANOW, &my_tios);
+    }
+#endif    
     if(r == -1) {
         *err = errno;
         return -1;
@@ -368,7 +412,7 @@ int TelosBSerial::reset(int *err) {
     int r;
     r = telosI2CWriteCmd(err, 0, 0);
     if(r == -1) return r;
-    serial_delay(10000);
+    serial_delay(switchdelay);
     r = telosI2CWriteCmd(err, 0, 3);
     if(r == -1) return r;
     r = telosI2CWriteCmd(err, 0, 2);
@@ -377,7 +421,7 @@ int TelosBSerial::reset(int *err) {
     if(r == -1) return r;
     r = telosI2CWriteCmd(err, 0, 0);
     if(r == -1) return r;
-    serial_delay(2500);
+    serial_delay(switchdelay);
     cout << "Reset device ..." << endl;
     return clearBuffers(err);
 }
@@ -386,7 +430,7 @@ int TelosBSerial::invokeBsl(int *err) {
     int r;
     r = telosI2CWriteCmd(err, 0, 0);
     if(r == -1) return r;
-    serial_delay(10000);
+    serial_delay(switchdelay);
     r = telosI2CWriteCmd(err, 0, 1);
     if(r == -1) return r;
     r = telosI2CWriteCmd(err, 0, 3);
@@ -401,7 +445,7 @@ int TelosBSerial::invokeBsl(int *err) {
     if(r == -1) return r;
     r = telosI2CWriteCmd(err, 0, 0);
     if(r == -1) return r;
-    serial_delay(2500);
+    serial_delay(switchdelay);
     cout << "Invoking BSL..." << endl;
     return clearBuffers(err);
 }
@@ -471,12 +515,15 @@ int TelosBSerial::telosI2CWriteCmd(int *err, uint8_t addr, uint8_t cmdbyte) {
     if(r == -1) return r;
     r = telosI2CWriteByte(err,  cmdbyte );
     if(r == -1) return r;
-    return telosI2CStop(err);
+    r = telosI2CStop(err);
+    if(r == -1) return r;
+    return clearBuffers(err);
+}
+
+int TelosBSerial::setPins(int *err) {
+    return 0;
 }
 
 int TelosBSerial::resetPins(int *err) {
-    int r = 0;
-    r = setRTS(err);
-    r = clrDTR(err);
-    return r;
+    return 0;
 }