]> sigrok.org Git - libsigrok.git/blobdiff - hardware/openbench-logic-sniffer/ols.c
ols: use new scan API
[libsigrok.git] / hardware / openbench-logic-sniffer / ols.c
index bcbba5dfa151db6437e67a021ffb9badf8161ff7..60131805169b86e9bd71df394f5aa9f2a584f228 100644 (file)
@@ -100,8 +100,8 @@ static const struct sr_samplerates samplerates = {
        NULL,
 };
 
-/* List of struct sr_dev_inst. */
-static GSList *dev_insts = NULL;
+SR_PRIV struct sr_dev_driver ols_driver_info;
+static struct sr_dev_driver *odi = &ols_driver_info;
 
 static int send_shortcommand(int fd, uint8_t command)
 {
@@ -227,10 +227,11 @@ static struct sr_dev_inst *get_metadata(int fd)
 {
        struct sr_dev_inst *sdi;
        struct context *ctx;
-       uint32_t tmp_int;
+       struct sr_probe *probe;
+       uint32_t tmp_int, ui;
        uint8_t key, type, token;
        GString *tmp_str, *devname, *version;
-       gchar tmp_c;
+       guchar tmp_c;
 
        sdi = sr_dev_inst_new(0, SR_ST_INACTIVE, NULL, NULL, NULL);
        ctx = ols_dev_new();
@@ -289,7 +290,12 @@ static struct sr_dev_inst *get_metadata(int fd)
                        switch (token) {
                        case 0x00:
                                /* Number of usable probes */
-                               ctx->num_probes = tmp_int;
+                               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);
+                               }
                                break;
                        case 0x01:
                                /* Amount of sample memory available (bytes) */
@@ -322,7 +328,12 @@ static struct sr_dev_inst *get_metadata(int fd)
                        switch (token) {
                        case 0x00:
                                /* Number of usable probes */
-                               ctx->num_probes = tmp_c;
+                               for (ui = 0; ui < tmp_c; ui++) {
+                                       if (!(probe = sr_probe_new(ui, SR_PROBE_LOGIC, TRUE,
+                                                       probe_names[ui])))
+                                               return 0;
+                                       sdi->probes = g_slist_append(sdi->probes, probe);
+                               }
                                break;
                        case 0x01:
                                /* protocol version */
@@ -356,16 +367,19 @@ static int hw_init(void)
        return SR_OK;
 }
 
-static int hw_scan(void)
+static GSList *hw_scan(GSList *options)
 {
        struct sr_dev_inst *sdi;
        struct context *ctx;
-       GSList *ports, *l;
+       struct sr_probe *probe;
+       GSList *devices, *ports, *l;
        GPollFD *fds, probefd;
-       int devcnt, final_devcnt, num_ports, fd, ret, i;
+       int devcnt, final_devcnt, num_ports, fd, ret, i, j;
        char buf[8], **dev_names, **serial_params;
 
+       (void)options;
        final_devcnt = 0;
+       devices = NULL;
 
        /* Scan all serial ports. */
        ports = list_serial_ports();
@@ -455,11 +469,18 @@ static int hw_scan(void)
                        sdi = sr_dev_inst_new(final_devcnt, SR_ST_INACTIVE,
                                        "Sump", "Logic Analyzer", "v1.0");
                        ctx = ols_dev_new();
-                       ctx->num_probes = 32;
+                       for (j = 0; j < 32; j++) {
+                               if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
+                                               probe_names[j])))
+                                       return 0;
+                               sdi->probes = g_slist_append(sdi->probes, probe);
+                       }
                        sdi->priv = ctx;
                }
                ctx->serial = sr_serial_dev_inst_new(dev_names[i], -1);
-               dev_insts = g_slist_append(dev_insts, sdi);
+               odi->instances = g_slist_append(odi->instances, sdi);
+               devices = g_slist_append(devices, sdi);
+
                final_devcnt++;
                serial_close(fds[i].fd);
                fds[i].fd = 0;
@@ -483,7 +504,7 @@ hw_init_free_fds:
 hw_init_free_ports:
        g_slist_free(ports);
 
-       return final_devcnt;
+       return devices;
 }
 
 static int hw_dev_open(int dev_index)
@@ -491,7 +512,7 @@ static int hw_dev_open(int dev_index)
        struct sr_dev_inst *sdi;
        struct context *ctx;
 
-       if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
+       if (!(sdi = sr_dev_inst_get(odi->instances, dev_index)))
                return SR_ERR;
 
        ctx = sdi->priv;
@@ -510,7 +531,7 @@ static int hw_dev_close(int dev_index)
        struct sr_dev_inst *sdi;
        struct context *ctx;
 
-       if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) {
+       if (!(sdi = sr_dev_inst_get(odi->instances, dev_index))) {
                sr_err("ols: %s: sdi was NULL", __func__);
                return SR_ERR_BUG;
        }
@@ -535,7 +556,7 @@ static int hw_cleanup(void)
        int ret = SR_OK;
 
        /* Properly close and free all devices. */
-       for (l = dev_insts; l; l = l->next) {
+       for (l = odi->instances; l; l = l->next) {
                if (!(sdi = l->data)) {
                        /* Log error, but continue cleaning up the rest. */
                        sr_err("ols: %s: sdi was NULL, continuing", __func__);
@@ -555,8 +576,8 @@ static int hw_cleanup(void)
                sr_serial_dev_inst_free(ctx->serial);
                sr_dev_inst_free(sdi);
        }
-       g_slist_free(dev_insts);
-       dev_insts = NULL;
+       g_slist_free(odi->instances);
+       odi->instances = NULL;
 
        return ret;
 }
@@ -600,7 +621,7 @@ static int hw_dev_status_get(int dev_index)
 {
        struct sr_dev_inst *sdi;
 
-       if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
+       if (!(sdi = sr_dev_inst_get(odi->instances, dev_index)))
                return SR_ST_NOT_FOUND;
 
        return sdi->status;
@@ -650,7 +671,7 @@ static int hw_dev_config_set(int dev_index, int hwcap, const void *value)
        int ret;
        const uint64_t *tmp_u64;
 
-       if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
+       if (!(sdi = sr_dev_inst_get(odi->instances, dev_index)))
                return SR_ERR;
        ctx = sdi->priv;
 
@@ -708,7 +729,7 @@ static int receive_data(int fd, int revents, void *cb_data)
 
        /* Find this device's ctx struct by its fd. */
        ctx = NULL;
-       for (l = dev_insts; l; l = l->next) {
+       for (l = odi->instances; l; l = l->next) {
                sdi = l->data;
                ctx = sdi->priv;
                if (ctx->serial->fd == fd) {
@@ -890,7 +911,7 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data)
        int num_channels;
        int i;
 
-       if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
+       if (!(sdi = sr_dev_inst_get(odi->instances, dev_index)))
                return SR_ERR;
 
        ctx = sdi->priv;
@@ -1064,4 +1085,5 @@ SR_PRIV struct sr_dev_driver ols_driver_info = {
        .dev_config_set = hw_dev_config_set,
        .dev_acquisition_start = hw_dev_acquisition_start,
        .dev_acquisition_stop = hw_dev_acquisition_stop,
+       .instances = NULL,
 };