X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fopenbench-logic-sniffer%2Fols.c;h=ad5e7f29ed86f9220202d471b5e7a0cfb509d97a;hb=5d9ed643e9dddbdb43e8917cff197346bdc930e7;hp=02afff33a7df027fc3f733681ceafd979669f17f;hpb=40dda2c3a509e9e031078427e32249e2ebc33ec5;p=libsigrok.git diff --git a/hardware/openbench-logic-sniffer/ols.c b/hardware/openbench-logic-sniffer/ols.c index 02afff33..ad5e7f29 100644 --- a/hardware/openbench-logic-sniffer/ols.c +++ b/hardware/openbench-logic-sniffer/ols.c @@ -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,12 +227,14 @@ 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); + sdi->driver = odi; ctx = ols_dev_new(); sdi->priv = ctx; @@ -289,7 +291,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 +329,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 */ @@ -349,15 +361,26 @@ static struct sr_dev_inst *get_metadata(int fd) } static int hw_init(void) +{ + + /* Nothing to do. */ + + return SR_OK; +} + +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(); @@ -446,12 +469,20 @@ static int hw_init(void) /* not an OLS -- some other board that uses the sump protocol */ sdi = sr_dev_inst_new(final_devcnt, SR_ST_INACTIVE, "Sump", "Logic Analyzer", "v1.0"); + sdi->driver = odi; 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; @@ -475,17 +506,13 @@ 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) +static int hw_dev_open(struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; struct context *ctx; - if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) - return SR_ERR; - ctx = sdi->priv; ctx->serial->fd = serial_open(ctx->serial->port, O_RDWR); @@ -497,19 +524,12 @@ static int hw_dev_open(int dev_index) return SR_OK; } -static int hw_dev_close(int dev_index) +static int hw_dev_close(struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; struct context *ctx; - if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) { - sr_err("ols: %s: sdi was NULL", __func__); - return SR_ERR_BUG; - } - ctx = sdi->priv; - /* TODO */ if (ctx->serial->fd != -1) { serial_close(ctx->serial->fd); ctx->serial->fd = -1; @@ -527,7 +547,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__); @@ -547,63 +567,61 @@ 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; } -static const void *hw_dev_info_get(int dev_index, int dev_info_id) +static int hw_info_get(int info_id, const void **data, + const struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; struct context *ctx; - const void *info; - if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) - return NULL; - ctx = sdi->priv; - - info = NULL; - switch (dev_info_id) { + switch (info_id) { case SR_DI_INST: - info = sdi; + *data = sdi; + break; + case SR_DI_HWCAPS: + *data = hwcaps; break; case SR_DI_NUM_PROBES: - info = GINT_TO_POINTER(NUM_PROBES); + *data = GINT_TO_POINTER(1); break; case SR_DI_PROBE_NAMES: - info = probe_names; + *data = probe_names; break; case SR_DI_SAMPLERATES: - info = &samplerates; + *data = &samplerates; break; case SR_DI_TRIGGER_TYPES: - info = (char *)TRIGGER_TYPES; + *data = (char *)TRIGGER_TYPES; break; case SR_DI_CUR_SAMPLERATE: - info = &ctx->cur_samplerate; + if (sdi) { + ctx = sdi->priv; + *data = &ctx->cur_samplerate; + } else + return SR_ERR; break; + default: + return SR_ERR_ARG; } - return info; + return SR_OK; } 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; } -static const int *hw_hwcap_get_all(void) -{ - return hwcaps; -} - -static int set_samplerate(struct sr_dev_inst *sdi, uint64_t samplerate) +static int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate) { struct context *ctx; @@ -635,15 +653,13 @@ static int set_samplerate(struct sr_dev_inst *sdi, uint64_t samplerate) return SR_OK; } -static int hw_dev_config_set(int dev_index, int hwcap, const void *value) +static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, + const void *value) { - struct sr_dev_inst *sdi; struct context *ctx; int ret; const uint64_t *tmp_u64; - if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) - return SR_ERR; ctx = sdi->priv; if (sdi->status != SR_ST_ACTIVE) @@ -700,7 +716,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) { @@ -868,12 +884,12 @@ static int receive_data(int fd, int revents, void *cb_data) return TRUE; } -static int hw_dev_acquisition_start(int dev_index, void *cb_data) +static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, + void *cb_data) { struct sr_datafeed_packet *packet; struct sr_datafeed_header *header; struct sr_datafeed_meta_logic meta; - struct sr_dev_inst *sdi; struct context *ctx; uint32_t trigger_config[4]; uint32_t data; @@ -882,9 +898,6 @@ 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))) - return SR_ERR; - ctx = sdi->priv; if (sdi->status != SR_ST_ACTIVE) @@ -1028,12 +1041,13 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) } /* TODO: This stops acquisition on ALL devices, ignoring dev_index. */ -static int hw_dev_acquisition_stop(int dev_index, void *cb_data) +static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, + void *cb_data) { struct sr_datafeed_packet packet; /* Avoid compiler warnings. */ - (void)dev_index; + (void)sdi; packet.type = SR_DF_END; sr_session_send(cb_data, &packet); @@ -1047,12 +1061,13 @@ SR_PRIV struct sr_dev_driver ols_driver_info = { .api_version = 1, .init = hw_init, .cleanup = hw_cleanup, + .scan = hw_scan, .dev_open = hw_dev_open, .dev_close = hw_dev_close, - .dev_info_get = hw_dev_info_get, + .info_get = hw_info_get, .dev_status_get = hw_dev_status_get, - .hwcap_get_all = hw_hwcap_get_all, .dev_config_set = hw_dev_config_set, .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop, + .instances = NULL, };