]> sigrok.org Git - libsigrok.git/commitdiff
ols: move device context creation from protocol.c to api.c
authorGerhard Sittig <redacted>
Sun, 14 Aug 2022 18:47:43 +0000 (20:47 +0200)
committerGerhard Sittig <redacted>
Wed, 24 Aug 2022 18:05:25 +0000 (20:05 +0200)
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.

src/hardware/openbench-logic-sniffer/api.c
src/hardware/openbench-logic-sniffer/protocol.c
src/hardware/openbench-logic-sniffer/protocol.h

index 81a29fb68238f88b9081597d9f542833a9b18510..35f6be7e24582f7e65b834e752201c6570afbb16 100644 (file)
@@ -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);
 
index c747753abde3a0c01794a5636c728c688df4700e..2bcf9f411335a795a2e47155a9bfe70a16ad39cd 100644 (file)
@@ -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,
index 01a3821366a593e684e046ed804bd7700e9ebf8c..2506c4a95d4bbab2f9aafd832acbebde1d5b1a43 100644 (file)
@@ -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);