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) {
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);
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;
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;
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("");
/* 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,
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);