X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fopenbench-logic-sniffer%2Fols.c;h=f2706d11220e17006f4556f2887dffebd1445184;hb=ed229aaa8ff66116967f75112be953940d4a3149;hp=9579222b60453d61b869859437ac212aa3b89c7d;hpb=c09f0b578c0e9c03590cb814f66004bb3f6815ff;p=libsigrok.git diff --git a/hardware/openbench-logic-sniffer/ols.c b/hardware/openbench-logic-sniffer/ols.c index 9579222b..f2706d11 100644 --- a/hardware/openbench-logic-sniffer/ols.c +++ b/hardware/openbench-logic-sniffer/ols.c @@ -38,15 +38,15 @@ #include #endif #include -#include "sigrok.h" -#include "sigrok-internal.h" +#include "libsigrok.h" +#include "libsigrok-internal.h" #include "ols.h" #ifdef _WIN32 #define O_NONBLOCK FIONBIO #endif -static int hwcaps[] = { +static const int hwcaps[] = { SR_HWCAP_LOGIC_ANALYZER, SR_HWCAP_SAMPLERATE, SR_HWCAP_CAPTURE_RATIO, @@ -93,14 +93,14 @@ static const char *probe_names[NUM_PROBES + 1] = { }; /* default supported samplerates, can be overridden by device metadata */ -static struct sr_samplerates samplerates = { +static const struct sr_samplerates samplerates = { SR_HZ(10), SR_MHZ(200), SR_HZ(1), NULL, }; -/* List of struct sr_serial_dev_inst */ +/* List of struct sr_dev_inst. */ static GSList *dev_insts = NULL; static int send_shortcommand(int fd, uint8_t command) @@ -131,10 +131,10 @@ static int send_longcommand(int fd, uint8_t command, uint32_t data) return SR_OK; } -static int configure_probes(struct context *ctx, GSList *probes) +static int configure_probes(struct context *ctx, const GSList *probes) { - struct sr_probe *probe; - GSList *l; + const struct sr_probe *probe; + const GSList *l; int probe_bit, stage, i; char *tc; @@ -146,7 +146,7 @@ static int configure_probes(struct context *ctx, GSList *probes) ctx->num_stages = 0; for (l = probes; l; l = l->next) { - probe = (struct sr_probe *)l->data; + probe = (const struct sr_probe *)l->data; if (!probe->enabled) continue; @@ -398,7 +398,7 @@ static int hw_init(const char *devinfo) 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); + serial_set_params(fd, 115200, 8, SERIAL_PARITY_NONE, 1, 2); ret = SR_OK; for (i = 0; i < 5; i++) { if ((ret = send_shortcommand(fd, @@ -445,6 +445,7 @@ static int hw_init(const char *devinfo) /* got metadata */ sdi = get_metadata(fds[i].fd); sdi->index = final_devcnt; + ctx = sdi->priv; } else { /* not an OLS -- some other board that uses the sump protocol */ sdi = sr_dev_inst_new(final_devcnt, SR_ST_INACTIVE, @@ -507,7 +508,7 @@ static int hw_dev_close(int dev_index) if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) { sr_err("ols: %s: sdi was NULL", __func__); - return SR_ERR; /* TODO: SR_ERR_ARG? */ + return SR_ERR_BUG; } ctx = sdi->priv; @@ -556,11 +557,11 @@ static int hw_cleanup(void) return ret; } -static void *hw_dev_info_get(int dev_index, int dev_info_id) +static const void *hw_dev_info_get(int dev_index, int dev_info_id) { struct sr_dev_inst *sdi; struct context *ctx; - void *info; + const void *info; if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) return NULL; @@ -601,7 +602,7 @@ static int hw_dev_status_get(int dev_index) return sdi->status; } -static int *hw_hwcap_get_all(void) +static const int *hw_hwcap_get_all(void) { return hwcaps; } @@ -638,12 +639,12 @@ 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, void *value) +static int hw_dev_config_set(int dev_index, int hwcap, const void *value) { struct sr_dev_inst *sdi; struct context *ctx; int ret; - uint64_t *tmp_u64; + const uint64_t *tmp_u64; if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) return SR_ERR; @@ -654,10 +655,10 @@ static int hw_dev_config_set(int dev_index, int hwcap, void *value) switch (hwcap) { case SR_HWCAP_SAMPLERATE: - ret = set_samplerate(sdi, *(uint64_t *)value); + ret = set_samplerate(sdi, *(const uint64_t *)value); break; case SR_HWCAP_PROBECONFIG: - ret = configure_probes(ctx, (GSList *)value); + ret = configure_probes(ctx, (const GSList *)value); break; case SR_HWCAP_LIMIT_SAMPLES: tmp_u64 = value; @@ -670,7 +671,7 @@ static int hw_dev_config_set(int dev_index, int hwcap, void *value) ret = SR_OK; break; case SR_HWCAP_CAPTURE_RATIO: - ctx->capture_ratio = *(uint64_t *)value; + ctx->capture_ratio = *(const uint64_t *)value; if (ctx->capture_ratio < 0 || ctx->capture_ratio > 100) { ctx->capture_ratio = 0; ret = SR_ERR; @@ -691,7 +692,7 @@ static int hw_dev_config_set(int dev_index, int hwcap, void *value) return ret; } -static int receive_data(int fd, int revents, void *session_data) +static int receive_data(int fd, int revents, void *cb_data) { struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; @@ -705,10 +706,11 @@ static int receive_data(int fd, int revents, void *session_data) ctx = NULL; for (l = dev_insts; l; l = l->next) { sdi = l->data; + ctx = sdi->priv; if (ctx->serial->fd == fd) { - ctx = sdi->priv; break; } + ctx = NULL; } if (!ctx) /* Shouldn't happen. */ @@ -722,7 +724,7 @@ static int receive_data(int fd, int revents, void *session_data) * finished. We'll double that to 30ms to be sure... */ sr_source_remove(fd); - sr_source_add(fd, G_IO_IN, 30, receive_data, session_data); + sr_source_add(fd, G_IO_IN, 30, receive_data, cb_data); ctx->raw_sample_buf = g_try_malloc(ctx->limit_samples * 4); if (!ctx->raw_sample_buf) { sr_err("ols: %s: ctx->raw_sample_buf malloc failed", @@ -834,12 +836,12 @@ static int receive_data(int fd, int revents, void *session_data) logic.unitsize = 4; logic.data = ctx->raw_sample_buf + (ctx->limit_samples - ctx->num_samples) * 4; - sr_session_bus(session_data, &packet); + sr_session_send(cb_data, &packet); } /* send the trigger */ packet.type = SR_DF_TRIGGER; - sr_session_bus(session_data, &packet); + sr_session_send(cb_data, &packet); /* send post-trigger samples */ packet.type = SR_DF_LOGIC; @@ -848,7 +850,7 @@ static int receive_data(int fd, int revents, void *session_data) logic.unitsize = 4; logic.data = ctx->raw_sample_buf + ctx->trigger_at * 4 + (ctx->limit_samples - ctx->num_samples) * 4; - sr_session_bus(session_data, &packet); + sr_session_send(cb_data, &packet); } else { /* no trigger was used */ packet.type = SR_DF_LOGIC; @@ -857,23 +859,24 @@ static int receive_data(int fd, int revents, void *session_data) logic.unitsize = 4; logic.data = ctx->raw_sample_buf + (ctx->limit_samples - ctx->num_samples) * 4; - sr_session_bus(session_data, &packet); + sr_session_send(cb_data, &packet); } g_free(ctx->raw_sample_buf); serial_flush(fd); serial_close(fd); packet.type = SR_DF_END; - sr_session_bus(session_data, &packet); + sr_session_send(cb_data, &packet); } return TRUE; } -static int hw_dev_acquisition_start(int dev_index, gpointer session_data) +static int hw_dev_acquisition_start(int dev_index, 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]; @@ -995,7 +998,7 @@ static int hw_dev_acquisition_start(int dev_index, gpointer session_data) return SR_ERR; sr_source_add(ctx->serial->fd, G_IO_IN, -1, receive_data, - session_data); + cb_data); if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) { sr_err("ols: %s: packet malloc failed", __func__); @@ -1013,9 +1016,14 @@ static int hw_dev_acquisition_start(int dev_index, gpointer session_data) packet->payload = (unsigned char *)header; header->feed_version = 1; gettimeofday(&header->starttime, NULL); - header->samplerate = ctx->cur_samplerate; - header->num_logic_probes = NUM_PROBES; - sr_session_bus(session_data, packet); + sr_session_send(cb_data, packet); + + /* Send metadata about the SR_DF_LOGIC packets to come. */ + packet->type = SR_DF_META_LOGIC; + packet->payload = &meta; + meta.samplerate = ctx->cur_samplerate; + meta.num_probes = NUM_PROBES; + sr_session_send(cb_data, packet); g_free(header); g_free(packet); @@ -1023,7 +1031,8 @@ static int hw_dev_acquisition_start(int dev_index, gpointer session_data) return SR_OK; } -static int hw_dev_acquisition_stop(int dev_index, gpointer session_dev_id) +/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */ +static int hw_dev_acquisition_stop(int dev_index, void *cb_data) { struct sr_datafeed_packet packet; @@ -1031,7 +1040,7 @@ static int hw_dev_acquisition_stop(int dev_index, gpointer session_dev_id) (void)dev_index; packet.type = SR_DF_END; - sr_session_bus(session_dev_id, &packet); + sr_session_send(cb_data, &packet); return SR_OK; }