From: Gerhard Sittig Date: Sun, 14 Aug 2022 18:47:43 +0000 (+0200) Subject: ols: move device context creation from protocol.c to api.c X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=838f01227382bfd8e5b9c817e7fefff93d2c7b28;hp=90ed86aa1737fd30bac4cbbeaae91d87b4c22682 ols: move device context creation from protocol.c to api.c The get_metadata() routine was unfortunately named, and surprisingly did more than its name suggested. Rename the routine to contain the ols_ prefix. Run communication to the device in protocol.c, but keep sdi and devc creation in api.c where they are expected during maintenance. This "unhides" where stuff is happening, and eliminates redundancy between the models which support meta data to announce their features, and other "compatibles" which are covered by generic fallback data. --- diff --git a/src/hardware/openbench-logic-sniffer/api.c b/src/hardware/openbench-logic-sniffer/api.c index 81a29fb6..35f6be7e 100644 --- a/src/hardware/openbench-logic-sniffer/api.c +++ b/src/hardware/openbench-logic-sniffer/api.c @@ -102,6 +102,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) unsigned int i; const char *conn, *serialcomm; char buf[4] = { 0, 0, 0, 0 }; + struct dev_context *devc; conn = serialcomm = NULL; for (l = options; l; l = l->next) { @@ -167,36 +168,44 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) buf[0], buf[1], buf[2], buf[3]); } - /* Definitely using the OLS protocol, check if it supports + /* + * Create common data structures (sdi, devc) here in the common + * code path. These further get filled in either from metadata + * which is gathered from the device, or from open coded generic + * fallback data which is kept in the driver source code. + */ + sdi = g_malloc0(sizeof(*sdi)); + sdi->status = SR_ST_INACTIVE; + sdi->inst_type = SR_INST_SERIAL; + sdi->conn = serial; + sdi->connection_id = g_strdup(serial->port); + devc = g_malloc0(sizeof(*devc)); + sdi->priv = devc; + devc->trigger_at_smpl = OLS_NO_TRIGGER; + + /* + * Definitely using the OLS protocol, check if it supports * the metadata command. */ send_shortcommand(serial, CMD_METADATA); - g_usleep(RESPONSE_DELAY_US); - if (serial_has_receive_data(serial) != 0) { /* Got metadata. */ - sdi = get_metadata(serial); + (void)ols_get_metadata(sdi); } else { /* Not an OLS -- some other board that uses the sump protocol. */ sr_info("Device does not support metadata."); - sdi = g_malloc0(sizeof(struct sr_dev_inst)); - sdi->status = SR_ST_INACTIVE; sdi->vendor = g_strdup("Sump"); sdi->model = g_strdup("Logic Analyzer"); sdi->version = g_strdup("v1.0"); for (i = 0; i < ARRAY_SIZE(ols_channel_names); i++) sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE, ols_channel_names[i]); - sdi->priv = ols_dev_new(); } /* Configure samplerate and divider. */ if (ols_set_samplerate(sdi, DEFAULT_SAMPLERATE) != SR_OK) sr_dbg("Failed to set default samplerate (%" PRIu64 ").", DEFAULT_SAMPLERATE); - sdi->inst_type = SR_INST_SERIAL; - sdi->conn = serial; - sdi->connection_id = g_strdup(serial->port); serial_close(serial); diff --git a/src/hardware/openbench-logic-sniffer/protocol.c b/src/hardware/openbench-logic-sniffer/protocol.c index c747753a..2bcf9f41 100644 --- a/src/hardware/openbench-logic-sniffer/protocol.c +++ b/src/hardware/openbench-logic-sniffer/protocol.c @@ -139,16 +139,6 @@ static int convert_trigger(const struct sr_dev_inst *sdi, return SR_OK; } -SR_PRIV struct dev_context *ols_dev_new(void) -{ - struct dev_context *devc; - - devc = g_malloc0(sizeof(struct dev_context)); - devc->trigger_at_smpl = OLS_NO_TRIGGER; - - return devc; -} - static void ols_channel_new(struct sr_dev_inst *sdi, int num_chan) { struct dev_context *devc = sdi->priv; @@ -186,9 +176,9 @@ static void ols_metadata_quirks(struct sr_dev_inst *sdi) devc->device_flags |= DEVICE_FLAG_IS_DEMON_CORE; } -SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial) +SR_PRIV int ols_get_metadata(struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; + struct sr_serial_dev_inst *serial; struct dev_context *devc; uint32_t tmp_int; uint8_t key, type; @@ -196,10 +186,8 @@ SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial) GString *tmp_str, *devname, *version; guchar tmp_c; - sdi = g_malloc0(sizeof(struct sr_dev_inst)); - sdi->status = SR_ST_INACTIVE; - devc = ols_dev_new(); - sdi->priv = devc; + serial = sdi->conn; + devc = sdi->priv; devname = g_string_new(""); version = g_string_new(""); @@ -324,7 +312,7 @@ SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial) /* Optionally amend received metadata, model specific quirks. */ ols_metadata_quirks(sdi); - return sdi; + return SR_OK; } SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi, diff --git a/src/hardware/openbench-logic-sniffer/protocol.h b/src/hardware/openbench-logic-sniffer/protocol.h index 01a38213..2506c4a9 100644 --- a/src/hardware/openbench-logic-sniffer/protocol.h +++ b/src/hardware/openbench-logic-sniffer/protocol.h @@ -135,8 +135,7 @@ SR_PRIV int send_longcommand(struct sr_serial_dev_inst *serial, uint8_t command, SR_PRIV int ols_send_reset(struct sr_serial_dev_inst *serial); SR_PRIV int ols_prepare_acquisition(const struct sr_dev_inst *sdi); SR_PRIV uint32_t ols_channel_mask(const struct sr_dev_inst *sdi); -SR_PRIV struct dev_context *ols_dev_new(void); -SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial); +SR_PRIV int ols_get_metadata(struct sr_dev_inst *sdi); SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate); SR_PRIV void abort_acquisition(const struct sr_dev_inst *sdi);