/*
- * This file is part of the sigrok project.
+ * This file is part of the libsigrok project.
*
* Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
* Copyright (C) 2010-2012 Uwe Hermann <uwe@hermann-uwe.de>
#ifdef _WIN32
#include <windows.h>
#else
-#include <glob.h>
#include <termios.h>
#include <sys/ioctl.h>
#endif
#include "libsigrok.h"
#include "libsigrok-internal.h"
-/* Message logging helpers with driver-specific prefix string. */
-#define DRIVER_LOG_DOMAIN "serial: "
-#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
-#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+/* Message logging helpers with subsystem-specific prefix string. */
+#define LOG_PREFIX "serial: "
+#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args)
+#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args)
+#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args)
+#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args)
+#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args)
+#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args)
// FIXME: Must be moved, or rather passed as function argument.
#ifdef _WIN32
if (dtr != -1) {
sr_spew("Setting DTR %s.", dtr ? "high" : "low");
- if (rts)
+ if (dtr)
dcb.fDtrControl = DTR_CONTROL_ENABLE;
else
dcb.fDtrControl = DTR_CONTROL_DISABLE;
return SR_ERR;
}
- term.c_iflag &= ~(IXON | IXOFF);
+ term.c_iflag &= ~(IXON | IXOFF | IXANY);
term.c_cflag &= ~CRTSCTS;
switch (flowcontrol) {
case 0:
break;
case 2:
sr_spew("Configuring XON/XOFF flow control.");
- term.c_iflag |= IXON | IXOFF;
+ term.c_iflag |= (IXON | IXOFF | IXANY);
break;
default:
sr_err("Unsupported flow control setting %d.", flowcontrol);
}
term.c_iflag &= ~IGNPAR;
- term.c_cflag &= ~(PARODD | PARENB);
+ term.c_cflag &= ~(PARENB | PARODD);
switch (parity) {
case SERIAL_PARITY_NONE:
sr_spew("Configuring no parity.");
return SR_ERR;
}
- /* Do not translate carriage return to newline on input. */
- term.c_iflag &= ~(ICRNL);
+ /* Turn off all serial port cooking. */
+ term.c_iflag &= ~(ISTRIP | INLCR | ICRNL);
+ term.c_oflag &= ~(ONLCR | OCRNL | ONOCR);
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+ term.c_oflag &= ~OFILL;
+#endif
/* Disable canonical mode, and don't echo input characters. */
term.c_lflag &= ~(ICANON | ECHO);
if (g_get_monotonic_time() - start > timeout_ms)
/* Timeout */
break;
- g_usleep(2000);
+ if (len < 1)
+ g_usleep(2000);
}
if (*buflen)
sr_dbg("Received %d: '%s'.", *buflen, *buf);
sr_dbg("Detection timed out after %dms.", time);
break;
}
- g_usleep(byte_delay_us);
+ if (len < 1)
+ g_usleep(byte_delay_us);
}
*buflen = ibuf;