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().
This commit is contained in:
parent
0f84cda05d
commit
a54dd31e38
|
@ -145,7 +145,7 @@ static GSList *hw_scan(GSList *options)
|
||||||
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (serial_open(serial, O_RDWR|O_NONBLOCK) != SR_OK)
|
if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
serial_flush(serial);
|
serial_flush(serial);
|
||||||
|
@ -218,7 +218,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi)
|
||||||
return SR_ERR_BUG;
|
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;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -163,7 +163,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi)
|
||||||
return SR_ERR_BUG;
|
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;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -55,8 +55,8 @@ static HANDLE hdl;
|
||||||
* Open the specified serial port.
|
* Open the specified serial port.
|
||||||
*
|
*
|
||||||
* @param serial Previously initialized serial port structure.
|
* @param serial Previously initialized serial port structure.
|
||||||
* @param flags Flags to use when opening the serial port.
|
* @param flags Flags to use when opening the serial port. Possible flags
|
||||||
* TODO: Abstract 'flags', currently they're OS-specific!
|
* include SERIAL_RDWR, SERIAL_RDONLY, SERIAL_NONBLOCK.
|
||||||
*
|
*
|
||||||
* If the serial structure contains a serialcomm string, it will be
|
* If the serial structure contains a serialcomm string, it will be
|
||||||
* passed to serial_set_paramstr() after the port is opened.
|
* 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)
|
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) {
|
if (!serial) {
|
||||||
sr_dbg("Invalid serial port.");
|
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);
|
sr_spew("Opening serial port '%s' (flags %d).", serial->port, flags);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
hdl = CreateFile(serial->port, GENERIC_READ | GENERIC_WRITE, 0, 0,
|
/* Map 'flags' to the OS-specific settings. */
|
||||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
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) {
|
if (hdl == INVALID_HANDLE_VALUE) {
|
||||||
sr_err("Error opening serial port '%s'.", serial->port);
|
sr_err("Error opening serial port '%s'.", serial->port);
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
}
|
}
|
||||||
#else
|
#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,
|
sr_err("Error opening serial port '%s': %s.", serial->port,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return SR_ERR;
|
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
|
#endif
|
||||||
|
|
||||||
if (serial->serialcomm)
|
if (serial->serialcomm)
|
||||||
|
|
|
@ -109,7 +109,7 @@ static GSList *fluke_scan(const char *conn, const char *serialcomm)
|
||||||
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (serial_open(serial, O_RDWR|O_NONBLOCK) != SR_OK)
|
if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
drvc = di->priv;
|
drvc = di->priv;
|
||||||
|
@ -230,7 +230,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi)
|
||||||
return SR_ERR_BUG;
|
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;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -560,7 +560,7 @@ static int hw_dev_open(int dev_index)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ctx = sdi->priv;
|
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)
|
if (sdi->serial->fd == -1)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -42,10 +42,6 @@
|
||||||
#include "libsigrok-internal.h"
|
#include "libsigrok-internal.h"
|
||||||
#include "ols.h"
|
#include "ols.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define O_NONBLOCK FIONBIO
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SERIALCOMM "115200/8n1"
|
#define SERIALCOMM "115200/8n1"
|
||||||
|
|
||||||
static const int hwcaps[] = {
|
static const int hwcaps[] = {
|
||||||
|
@ -425,7 +421,7 @@ static GSList *hw_scan(GSList *options)
|
||||||
* have a match.
|
* have a match.
|
||||||
*/
|
*/
|
||||||
sr_info("ols: probing %s .", conn);
|
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;
|
return NULL;
|
||||||
|
|
||||||
ret = SR_OK;
|
ret = SR_OK;
|
||||||
|
@ -503,7 +499,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi)
|
||||||
|
|
||||||
devc = sdi->priv;
|
devc = sdi->priv;
|
||||||
|
|
||||||
if (serial_open(devc->serial, O_RDWR) != SR_OK)
|
if (serial_open(devc->serial, SERIAL_RDWR) != SR_OK)
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -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)))
|
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (serial_open(serial, O_RDONLY|O_NONBLOCK) != SR_OK)
|
if (serial_open(serial, SERIAL_RDONLY | SERIAL_NONBLOCK) != SR_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sr_info("Probing port '%s' readonly.", conn);
|
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;
|
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;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -106,7 +106,7 @@ static GSList *lcd14_scan(const char *conn, const char *serialcomm)
|
||||||
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (serial_open(serial, O_RDONLY | O_NONBLOCK) != SR_OK)
|
if (serial_open(serial, SERIAL_RDONLY | SERIAL_NONBLOCK) != SR_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sr_info("Probing port %s readonly.", conn);
|
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;
|
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;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -140,7 +140,7 @@ static GSList *hw_scan(GSList *options)
|
||||||
if (!(devc->serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
if (!(devc->serial = sr_serial_dev_inst_new(conn, serialcomm)))
|
||||||
return NULL;
|
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;
|
return NULL;
|
||||||
|
|
||||||
sdi->priv = devc;
|
sdi->priv = devc;
|
||||||
|
@ -172,7 +172,7 @@ static int hw_dev_open(struct sr_dev_inst *sdi)
|
||||||
|
|
||||||
devc = sdi->priv;
|
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;
|
return SR_ERR;
|
||||||
|
|
||||||
sdi->status = SR_ST_ACTIVE;
|
sdi->status = SR_ST_ACTIVE;
|
||||||
|
|
|
@ -125,6 +125,12 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
|
||||||
|
|
||||||
/*--- hardware/common/serial.c ----------------------------------------------*/
|
/*--- hardware/common/serial.c ----------------------------------------------*/
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SERIAL_RDWR = 1,
|
||||||
|
SERIAL_RDONLY = 2,
|
||||||
|
SERIAL_NONBLOCK = 4,
|
||||||
|
};
|
||||||
|
|
||||||
typedef gboolean (*packet_valid_t)(const uint8_t *buf);
|
typedef gboolean (*packet_valid_t)(const uint8_t *buf);
|
||||||
|
|
||||||
SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags);
|
SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags);
|
||||||
|
|
Loading…
Reference in New Issue