From: Uwe Hermann Date: Sun, 2 Dec 2012 11:45:54 +0000 (+0100) Subject: serial: Use OS-independent flags for serial port opening. X-Git-Tag: dsupstream~522 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=a54dd31e380ca4b469a20e41a0023d1dd9ec3c99;p=libsigrok.git serial: Use OS-independent flags for serial port opening. Add SERIAL_RDWR, SERIAL_RDONLY, and SERIAL_NONBLOCK (for now), which are mapped to the respective OS-specific mechanism in serial_open(). --- diff --git a/hardware/agilent-dmm/api.c b/hardware/agilent-dmm/api.c index c7783bca..fcd51d54 100644 --- a/hardware/agilent-dmm/api.c +++ b/hardware/agilent-dmm/api.c @@ -145,7 +145,7 @@ static GSList *hw_scan(GSList *options) if (!(serial = sr_serial_dev_inst_new(conn, serialcomm))) return NULL; - if (serial_open(serial, O_RDWR|O_NONBLOCK) != SR_OK) + if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return NULL; serial_flush(serial); @@ -218,7 +218,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) return SR_ERR_BUG; } - if (serial_open(devc->serial, O_RDWR|O_NONBLOCK) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/hardware/colead-slm/api.c b/hardware/colead-slm/api.c index def7cf04..45e19ba6 100644 --- a/hardware/colead-slm/api.c +++ b/hardware/colead-slm/api.c @@ -163,7 +163,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) return SR_ERR_BUG; } - if (serial_open(devc->serial, O_RDWR) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDWR) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/hardware/common/serial.c b/hardware/common/serial.c index 8ab2d401..b9ef46d4 100644 --- a/hardware/common/serial.c +++ b/hardware/common/serial.c @@ -55,8 +55,8 @@ static HANDLE hdl; * Open the specified serial port. * * @param serial Previously initialized serial port structure. - * @param flags Flags to use when opening the serial port. - * TODO: Abstract 'flags', currently they're OS-specific! + * @param flags Flags to use when opening the serial port. Possible flags + * include SERIAL_RDWR, SERIAL_RDONLY, SERIAL_NONBLOCK. * * If the serial structure contains a serialcomm string, it will be * passed to serial_set_paramstr() after the port is opened. @@ -65,6 +65,10 @@ static HANDLE hdl; */ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) { + int flags_local = 0; +#ifdef _WIN32 + DWORD desired_access = 0, flags_and_attributes = 0; +#endif if (!serial) { sr_dbg("Invalid serial port."); @@ -74,19 +78,36 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) sr_spew("Opening serial port '%s' (flags %d).", serial->port, flags); #ifdef _WIN32 - hdl = CreateFile(serial->port, GENERIC_READ | GENERIC_WRITE, 0, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + /* Map 'flags' to the OS-specific settings. */ + desired_access |= GENERIC_READ; + flags_and_attributes = FILE_ATTRIBUTE_NORMAL; + if (flags & SERIAL_RDWR) + desired_access |= GENERIC_WRITE; + if (flags & SERIAL_NONBLOCK) + flags_and_attributes |= FILE_FLAG_OVERLAPPED; + + hdl = CreateFile(serial->port, desired_access, 0, 0, + OPEN_EXISTING, flags_and_attributes, 0); if (hdl == INVALID_HANDLE_VALUE) { sr_err("Error opening serial port '%s'.", serial->port); return SR_ERR; } #else - if ((serial->fd = open(serial->port, flags)) < 0) { + /* Map 'flags' to the OS-specific settings. */ + if (flags & SERIAL_RDWR) + flags_local |= O_RDWR; + if (flags & SERIAL_RDONLY) + flags_local |= O_RDONLY; + if (flags & SERIAL_NONBLOCK) + flags_local |= O_NONBLOCK; + + if ((serial->fd = open(serial->port, flags_local)) < 0) { sr_err("Error opening serial port '%s': %s.", serial->port, strerror(errno)); return SR_ERR; - } else - sr_spew("Opened serial port '%s' (fd %d).", serial->port, serial->fd); + } + + sr_spew("Opened serial port '%s' (fd %d).", serial->port, serial->fd); #endif if (serial->serialcomm) diff --git a/hardware/fluke-dmm/api.c b/hardware/fluke-dmm/api.c index 2d476419..d6391fa0 100644 --- a/hardware/fluke-dmm/api.c +++ b/hardware/fluke-dmm/api.c @@ -109,7 +109,7 @@ static GSList *fluke_scan(const char *conn, const char *serialcomm) if (!(serial = sr_serial_dev_inst_new(conn, serialcomm))) return NULL; - if (serial_open(serial, O_RDWR|O_NONBLOCK) != SR_OK) + if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return NULL; drvc = di->priv; @@ -230,7 +230,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) return SR_ERR_BUG; } - if (serial_open(devc->serial, O_RDWR|O_NONBLOCK) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/hardware/link-mso19/link-mso19.c b/hardware/link-mso19/link-mso19.c index d1e2fb00..521c8440 100644 --- a/hardware/link-mso19/link-mso19.c +++ b/hardware/link-mso19/link-mso19.c @@ -560,7 +560,7 @@ static int hw_dev_open(int dev_index) return ret; ctx = sdi->priv; - sdi->serial->fd = serial_open(sdi->serial->port, O_RDWR); + sdi->serial->fd = serial_open(sdi->serial->port, SERIAL_RDWR); if (sdi->serial->fd == -1) return ret; diff --git a/hardware/openbench-logic-sniffer/ols.c b/hardware/openbench-logic-sniffer/ols.c index 995fdccf..a8d9dbea 100644 --- a/hardware/openbench-logic-sniffer/ols.c +++ b/hardware/openbench-logic-sniffer/ols.c @@ -42,10 +42,6 @@ #include "libsigrok-internal.h" #include "ols.h" -#ifdef _WIN32 -#define O_NONBLOCK FIONBIO -#endif - #define SERIALCOMM "115200/8n1" static const int hwcaps[] = { @@ -425,7 +421,7 @@ static GSList *hw_scan(GSList *options) * have a match. */ sr_info("ols: probing %s .", conn); - if (serial_open(serial, O_RDWR | O_NONBLOCK) != SR_OK) + if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return NULL; ret = SR_OK; @@ -503,7 +499,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) devc = sdi->priv; - if (serial_open(devc->serial, O_RDWR) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDWR) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/hardware/radioshack-dmm/api.c b/hardware/radioshack-dmm/api.c index c51c6f08..47620e3c 100644 --- a/hardware/radioshack-dmm/api.c +++ b/hardware/radioshack-dmm/api.c @@ -112,7 +112,7 @@ static GSList *rs_22_812_scan(const char *conn, const char *serialcomm) if (!(serial = sr_serial_dev_inst_new(conn, serialcomm))) return NULL; - if (serial_open(serial, O_RDONLY|O_NONBLOCK) != SR_OK) + if (serial_open(serial, SERIAL_RDONLY | SERIAL_NONBLOCK) != SR_OK) return NULL; sr_info("Probing port '%s' readonly.", conn); @@ -217,7 +217,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) return SR_ERR_BUG; } - if (serial_open(devc->serial, O_RDONLY) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDONLY) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/hardware/tekpower-dmm/api.c b/hardware/tekpower-dmm/api.c index 97c705a0..dd53f4dd 100644 --- a/hardware/tekpower-dmm/api.c +++ b/hardware/tekpower-dmm/api.c @@ -106,7 +106,7 @@ static GSList *lcd14_scan(const char *conn, const char *serialcomm) if (!(serial = sr_serial_dev_inst_new(conn, serialcomm))) return NULL; - if (serial_open(serial, O_RDONLY | O_NONBLOCK) != SR_OK) + if (serial_open(serial, SERIAL_RDONLY | SERIAL_NONBLOCK) != SR_OK) return NULL; sr_info("Probing port %s readonly.", conn); @@ -217,7 +217,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) return SR_ERR_BUG; } - if (serial_open(devc->serial, O_RDONLY) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDONLY) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/hardware/tondaj-sl-814/api.c b/hardware/tondaj-sl-814/api.c index c1d8abf8..beb8c337 100644 --- a/hardware/tondaj-sl-814/api.c +++ b/hardware/tondaj-sl-814/api.c @@ -140,7 +140,7 @@ static GSList *hw_scan(GSList *options) if (!(devc->serial = sr_serial_dev_inst_new(conn, serialcomm))) return NULL; - if (serial_open(devc->serial, O_RDWR|O_NONBLOCK) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return NULL; sdi->priv = devc; @@ -172,7 +172,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi) devc = sdi->priv; - if (serial_open(devc->serial, O_RDWR|O_NONBLOCK) != SR_OK) + if (serial_open(devc->serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) return SR_ERR; sdi->status = SR_ST_ACTIVE; diff --git a/libsigrok-internal.h b/libsigrok-internal.h index 5991bc71..af13e432 100644 --- a/libsigrok-internal.h +++ b/libsigrok-internal.h @@ -125,6 +125,12 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, /*--- hardware/common/serial.c ----------------------------------------------*/ +enum { + SERIAL_RDWR = 1, + SERIAL_RDONLY = 2, + SERIAL_NONBLOCK = 4, +}; + typedef gboolean (*packet_valid_t)(const uint8_t *buf); SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags);