- struct sigrok_device_instance *sdi;
- GSList *ports, *l;
- GPollFD *fds;
- int devcnt, final_devcnt, num_ports, fd, ret, i;
- char buf[8], **device_names, **serial_params;
-
- if (deviceinfo)
- ports = g_slist_append(NULL, strdup(deviceinfo));
- else
- /* No specific device given, so scan all serial ports. */
- ports = list_serial_ports();
-
- num_ports = g_slist_length(ports);
- fds = calloc(1, num_ports * sizeof(GPollFD));
- device_names = malloc(num_ports * sizeof(char *));
- serial_params = malloc(num_ports * sizeof(char *));
- devcnt = 0;
- for (l = ports; l; l = l->next) {
- /* The discovery procedure is like this: first send the Reset
- * command (0x00) 5 times, since the device could be anywhere
- * in a 5-byte command. Then send the ID command (0x02).
- * If the device responds with 4 bytes ("OLS1" or "SLA1"), we
- * have a match.
- *
- * Since it may take the device a while to respond at 115Kb/s,
- * we do all the sending first, then wait for all of them to
- * respond with g_poll().
- */
- g_message("ols: probing %s...", (char *)l->data);
- fd = serial_open(l->data, O_RDWR | O_NONBLOCK);
- if (fd != -1) {
- serial_params[devcnt] = serial_backup_params(fd);
- serial_set_params(fd, 115200, 8, 0, 1, 2);
- ret = SIGROK_OK;
- for (i = 0; i < 5; i++) {
- if ((ret = send_shortcommand(fd,
- CMD_RESET)) != SIGROK_OK) {
- /* Serial port is not writable. */
- break;
+ struct dev_context *devc;
+
+ if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
+ sr_err("ols: %s: devc malloc failed", __func__);
+ return NULL;
+ }
+
+ devc->trigger_at = -1;
+ devc->probe_mask = 0xffffffff;
+ devc->cur_samplerate = SR_KHZ(200);
+ devc->serial = NULL;
+
+ return devc;
+}
+
+static struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial)
+{
+ struct sr_dev_inst *sdi;
+ struct dev_context *devc;
+ struct sr_probe *probe;
+ uint32_t tmp_int, ui;
+ uint8_t key, type, token;
+ GString *tmp_str, *devname, *version;
+ guchar tmp_c;
+
+ sdi = sr_dev_inst_new(0, SR_ST_INACTIVE, NULL, NULL, NULL);
+ sdi->driver = odi;
+ devc = ols_dev_new();
+ sdi->priv = devc;
+
+ devname = g_string_new("");
+ version = g_string_new("");
+
+ key = 0xff;
+ while (key) {
+ if (serial_read(serial, &key, 1) != 1 || key == 0x00)
+ break;
+ type = key >> 5;
+ token = key & 0x1f;
+ switch (type) {
+ case 0:
+ /* NULL-terminated string */
+ tmp_str = g_string_new("");
+ while (serial_read(serial, &tmp_c, 1) == 1 && tmp_c != '\0')
+ g_string_append_c(tmp_str, tmp_c);
+ sr_dbg("ols: got metadata key 0x%.2x value '%s'",
+ key, tmp_str->str);
+ switch (token) {
+ case 0x01:
+ /* Device name */
+ devname = g_string_append(devname, tmp_str->str);
+ break;
+ case 0x02:
+ /* FPGA firmware version */
+ if (version->len)
+ g_string_append(version, ", ");
+ g_string_append(version, "FPGA version ");
+ g_string_append(version, tmp_str->str);
+ break;
+ case 0x03:
+ /* Ancillary version */
+ if (version->len)
+ g_string_append(version, ", ");
+ g_string_append(version, "Ancillary version ");
+ g_string_append(version, tmp_str->str);
+ break;
+ default:
+ sr_info("ols: unknown token 0x%.2x: '%s'",
+ token, tmp_str->str);
+ break;
+ }
+ g_string_free(tmp_str, TRUE);
+ break;
+ case 1:
+ /* 32-bit unsigned integer */
+ if (serial_read(serial, &tmp_int, 4) != 4)
+ break;
+ tmp_int = reverse32(tmp_int);
+ sr_dbg("ols: got metadata key 0x%.2x value 0x%.8x",
+ key, tmp_int);
+ switch (token) {
+ case 0x00:
+ /* Number of usable probes */
+ for (ui = 0; ui < tmp_int; ui++) {
+ if (!(probe = sr_probe_new(ui, SR_PROBE_LOGIC, TRUE,
+ probe_names[ui])))
+ return 0;
+ sdi->probes = g_slist_append(sdi->probes, probe);