*/
#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"
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) {
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;
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) {
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) {
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);
};
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);
}
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;
}
}
<< 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;
}
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;
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;
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);
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);
}
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);
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);
}
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;
}