X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fserial_libsp.c;h=7cf5a4602efbea26aef1a58886ca1667625bed8c;hb=dedaeacad0ef889506b79a8bed634140da28aa72;hp=69a9cc1ef7fbea2a6d8620d9a6a1ee516f9850b0;hpb=8c3df6e5cd3d23bf01807e6296f7b7a9f8475902;p=libsigrok.git diff --git a/src/serial_libsp.c b/src/serial_libsp.c index 69a9cc1e..7cf5a460 100644 --- a/src/serial_libsp.c +++ b/src/serial_libsp.c @@ -31,9 +31,7 @@ #include /* for HANDLE */ #endif -/** @cond PRIVATE */ #define LOG_PREFIX "serial-libsp" -/** @endcond */ /** * @file @@ -41,6 +39,8 @@ * Serial port handling, wraps the external libserialport dependency. */ +#ifdef HAVE_LIBSERIALPORT + /** * @defgroup grp_serial_libsp Serial port handling, libserialport group * @@ -49,13 +49,20 @@ * @{ */ -SR_PRIV int sr_ser_libsp_open(struct sr_serial_dev_inst *serial, int flags) +static int sr_ser_libsp_open(struct sr_serial_dev_inst *serial, int flags) { int ret; char *error; int sp_flags; - sp_get_port_by_name(serial->port, &serial->sp_data); + ret = sp_get_port_by_name(serial->port, &serial->sp_data); + if (ret != SP_OK) { + error = sp_last_error_message(); + sr_err("Error getting port from name %s: (%d) %s.", + serial->port, sp_last_error_code(), error); + sp_free_error_message(error); + return SR_ERR; + } sp_flags = 0; if (flags & SERIAL_RDWR) @@ -80,7 +87,7 @@ SR_PRIV int sr_ser_libsp_open(struct sr_serial_dev_inst *serial, int flags) return SR_OK; } -SR_PRIV int sr_ser_libsp_close(struct sr_serial_dev_inst *serial) +static int sr_ser_libsp_close(struct sr_serial_dev_inst *serial) { int ret; char *error; @@ -110,7 +117,7 @@ SR_PRIV int sr_ser_libsp_close(struct sr_serial_dev_inst *serial) return SR_OK; } -SR_PRIV int sr_ser_libsp_flush(struct sr_serial_dev_inst *serial) +static int sr_ser_libsp_flush(struct sr_serial_dev_inst *serial) { int ret; char *error; @@ -137,7 +144,7 @@ SR_PRIV int sr_ser_libsp_flush(struct sr_serial_dev_inst *serial) return SR_OK; } -SR_PRIV int sr_ser_libsp_drain(struct sr_serial_dev_inst *serial) +static int sr_ser_libsp_drain(struct sr_serial_dev_inst *serial) { int ret; char *error; @@ -160,7 +167,7 @@ SR_PRIV int sr_ser_libsp_drain(struct sr_serial_dev_inst *serial) return SR_OK; } -SR_PRIV int sr_ser_libsp_write(struct sr_serial_dev_inst *serial, +static int sr_ser_libsp_write(struct sr_serial_dev_inst *serial, const void *buf, size_t count, int nonblocking, unsigned int timeout_ms) { @@ -191,7 +198,7 @@ SR_PRIV int sr_ser_libsp_write(struct sr_serial_dev_inst *serial, return ret; } -SR_PRIV int sr_ser_libsp_read(struct sr_serial_dev_inst *serial, +static int sr_ser_libsp_read(struct sr_serial_dev_inst *serial, void *buf, size_t count, int nonblocking, unsigned int timeout_ms) { @@ -222,7 +229,7 @@ SR_PRIV int sr_ser_libsp_read(struct sr_serial_dev_inst *serial, return ret; } -SR_PRIV int sr_ser_libsp_set_params(struct sr_serial_dev_inst *serial, +static int sr_ser_libsp_set_params(struct sr_serial_dev_inst *serial, int baudrate, int bits, int parity, int stopbits, int flowcontrol, int rts, int dtr) { @@ -280,13 +287,35 @@ SR_PRIV int sr_ser_libsp_set_params(struct sr_serial_dev_inst *serial, return SR_OK; } -/** @cond PRIVATE */ +static int sr_ser_libsp_set_handshake(struct sr_serial_dev_inst *serial, + int rts, int dtr) +{ + int ret; + + if (!serial->sp_data) { + sr_dbg("Cannot configure unopened serial port %s.", serial->port); + return SR_ERR; + } + + if (rts >= 0) { + ret = sp_set_rts(serial->sp_data, rts ? SP_RTS_ON : SP_RTS_OFF); + if (ret != SP_OK) + return SR_ERR; + } + if (dtr >= 0) { + ret = sp_set_dtr(serial->sp_data, dtr ? SP_DTR_ON : SP_DTR_OFF); + if (ret != SP_OK) + return SR_ERR; + } + + return SR_OK; +} + #ifdef G_OS_WIN32 typedef HANDLE event_handle; #else typedef int event_handle; #endif -/** @endcond */ static int sr_ser_libsp_source_add_int(struct sr_serial_dev_inst *serial, int events, @@ -354,7 +383,7 @@ static int sr_ser_libsp_source_add_int(struct sr_serial_dev_inst *serial, return SR_OK; } -SR_PRIV int sr_ser_libsp_source_add(struct sr_session *session, +static int sr_ser_libsp_source_add(struct sr_session *session, struct sr_serial_dev_inst *serial, int events, int timeout, sr_receive_data_callback cb, void *cb_data) { @@ -373,7 +402,7 @@ SR_PRIV int sr_ser_libsp_source_add(struct sr_session *session, timeout, cb, cb_data); } -SR_PRIV int sr_ser_libsp_source_remove(struct sr_session *session, +static int sr_ser_libsp_source_remove(struct sr_session *session, struct sr_serial_dev_inst *serial) { void *key; @@ -382,7 +411,7 @@ SR_PRIV int sr_ser_libsp_source_remove(struct sr_session *session, return sr_session_source_remove_internal(session, key); } -SR_PRIV GSList *sr_ser_libsp_list(GSList *list, sr_ser_list_append_t append) +static GSList *sr_ser_libsp_list(GSList *list, sr_ser_list_append_t append) { struct sp_port **ports; size_t i; @@ -403,7 +432,7 @@ SR_PRIV GSList *sr_ser_libsp_list(GSList *list, sr_ser_list_append_t append) return list; } -SR_PRIV GSList *sr_ser_libsp_find_usb(GSList *list, sr_ser_find_append_t append, +static GSList *sr_ser_libsp_find_usb(GSList *list, sr_ser_find_append_t append, uint16_t vendor_id, uint16_t product_id) { struct sp_port **ports; @@ -429,7 +458,7 @@ SR_PRIV GSList *sr_ser_libsp_find_usb(GSList *list, sr_ser_find_append_t append, return list; } -SR_PRIV int sr_ser_libsp_get_frame_format(struct sr_serial_dev_inst *serial, +static int sr_ser_libsp_get_frame_format(struct sr_serial_dev_inst *serial, int *baud, int *bits) { struct sp_port_config *config; @@ -474,7 +503,7 @@ SR_PRIV int sr_ser_libsp_get_frame_format(struct sr_serial_dev_inst *serial, return ret; } -SR_PRIV size_t sr_ser_libsp_get_rx_avail(struct sr_serial_dev_inst *serial) +static size_t sr_ser_libsp_get_rx_avail(struct sr_serial_dev_inst *serial) { int rc; @@ -487,3 +516,27 @@ SR_PRIV size_t sr_ser_libsp_get_rx_avail(struct sr_serial_dev_inst *serial) return rc; } + +static struct ser_lib_functions serlib_sp = { + .open = sr_ser_libsp_open, + .close = sr_ser_libsp_close, + .flush = sr_ser_libsp_flush, + .drain = sr_ser_libsp_drain, + .write = sr_ser_libsp_write, + .read = sr_ser_libsp_read, + .set_params = sr_ser_libsp_set_params, + .set_handshake = sr_ser_libsp_set_handshake, + .setup_source_add = sr_ser_libsp_source_add, + .setup_source_remove = sr_ser_libsp_source_remove, + .list = sr_ser_libsp_list, + .find_usb = sr_ser_libsp_find_usb, + .get_frame_format = sr_ser_libsp_get_frame_format, + .get_rx_avail = sr_ser_libsp_get_rx_avail, +}; +SR_PRIV struct ser_lib_functions *ser_lib_funcs_libsp = &serlib_sp; + +#else + +SR_PRIV struct ser_lib_functions *ser_lib_funcs_libsp = NULL; + +#endif