+ 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;
+ default:
+ sr_err("Unknown option %d, skipping.", src->key);
+ break;
+ }
+ }
+
+ if (!conn)
+ return NULL;
+ if (!serialcomm)
+ serialcomm = "9600/8n1";
+
+ serial = sr_serial_dev_inst_new(conn, serialcomm);
+ if (serial_open(serial, SERIAL_RDWR) != SR_OK)
+ return NULL;
+
+ serial_flush(serial);
+
+ /* Get the device model. */
+ len = 0;
+ for (i = 0; models[i].id; i++) {
+ if (strlen(models[i].id) > len)
+ len = strlen(models[i].id);
+ }
+ memset(&reply, 0, sizeof(reply));
+ sr_dbg("Want max %d bytes.", len);
+ if ((korad_kdxxxxp_send_cmd(serial, "*IDN?") < 0))
+ return NULL;
+
+ /* i is used here for debug purposes only. */
+ if ((i = korad_kdxxxxp_read_chars(serial, len, reply)) < 0)
+ return NULL;
+ sr_dbg("Received: %d, %s", i, reply);
+ model_id = -1;
+ for (i = 0; models[i].id; i++) {
+ if (!strcmp(models[i].id, reply))
+ model_id = i;
+ }
+ if (model_id < 0) {
+ sr_err("Unknown model ID '%s' detected, aborting.", reply);
+ return NULL;
+ }
+ sr_dbg("Found: %s %s", models[model_id].vendor, models[model_id].name);
+
+ /* Init device instance, etc. */
+ sdi = g_malloc0(sizeof(struct sr_dev_inst));
+ sdi->status = SR_ST_INACTIVE;
+ sdi->vendor = g_strdup(models[model_id].vendor);
+ sdi->model = g_strdup(models[model_id].name);
+ sdi->inst_type = SR_INST_SERIAL;
+ sdi->conn = serial;
+ sdi->driver = di;
+
+ sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "CH1");
+
+ devc = g_malloc0(sizeof(struct dev_context));
+ devc->model = &models[model_id];
+ devc->reply[5] = 0;
+ devc->req_sent_at = 0;
+ sdi->priv = devc;
+
+ /* Get current status of device. */
+ if (korad_kdxxxxp_get_all_values(serial, devc) < 0)
+ goto exit_err;
+ 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);