+ conn = serialcomm = NULL;
+ for (l = options; l; l = l->next) {
+ src = l->data;
+ switch (src->key) {
+ case SR_CONF_CONN:
+ conn = g_variant_get_string(src->data, NULL);
+ break;
+ case SR_CONF_SERIALCOMM:
+ serialcomm = g_variant_get_string(src->data, NULL);
+ break;
+ }
+ }
+ if (!conn)
+ return NULL;
+ if (!serialcomm)
+ serialcomm = SERIALCOMM;
+
+ serial = sr_serial_dev_inst_new(conn, serialcomm);
+
+ if (serial_open(serial, SERIAL_RDWR) != SR_OK)
+ return NULL;
+
+ serial_flush(serial);
+
+ if (serial_write_blocking(serial, CMD_VERSION,
+ strlen(CMD_VERSION), serial_timeout(serial,
+ strlen(CMD_VERSION))) < (int)strlen(CMD_VERSION)) {
+ sr_dbg("Unable to write while probing for hardware.");
+ serial_close(serial);
+ return NULL;
+ }
+
+ memset(buf, 0, sizeof(buf));
+ bufptr = buf;
+ len = sizeof(buf);
+ ret = serial_readline(serial, &bufptr, &len, 3000);
+
+ if (ret < 0 || len < 9 || strncmp((const char *)&buf, "version ", 8)) {
+ sr_dbg("Unable to probe version number.");
+ serial_close(serial);
+ return NULL;
+ }
+
+ version = g_ascii_strtod(buf + 8, NULL);
+ if (version < 1.10) {
+ sr_info("Firmware >= 1.10 required (got %1.2f).", version);
+ serial_close(serial);
+ return NULL;
+ }
+
+ sdi = g_malloc0(sizeof(struct sr_dev_inst));
+ sdi->status = SR_ST_ACTIVE;
+ sdi->vendor = g_strdup("Arachnid Labs");
+ sdi->model = g_strdup("Re:load Pro");
+ sdi->version = g_strdup(buf + 8);
+ sdi->driver = &arachnid_labs_re_load_pro_driver_info;
+ sdi->inst_type = SR_INST_SERIAL;
+ sdi->conn = serial;
+
+ cg = g_malloc0(sizeof(struct sr_channel_group));
+ cg->name = g_strdup("1");
+ sdi->channel_groups = g_slist_append(sdi->channel_groups, cg);
+
+ ch = sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "V");
+ cg->channels = g_slist_append(cg->channels, ch);
+
+ ch = sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "I");
+ cg->channels = g_slist_append(cg->channels, ch);
+
+ devc = g_malloc0(sizeof(struct dev_context));
+ sdi->priv = devc;
+ drvc->instances = g_slist_append(drvc->instances, sdi);
+ devices = g_slist_append(devices, sdi);
+
+ serial_close(serial);
+ if (!devices)
+ sr_serial_dev_inst_free(serial);
+