23 #include <sys/types.h>
38 #include <arpa/inet.h>
42 #include "sigrok-internal.h"
46 #define O_NONBLOCK FIONBIO
49 static int hwcaps[] = {
59 static const char *probe_names[
NUM_PROBES + 1] = {
104 static GSList *dev_insts = NULL;
106 static int send_shortcommand(
int fd, uint8_t command)
110 sr_dbg(
"ols: sending cmd 0x%.2x", command);
118 static int send_longcommand(
int fd, uint8_t command, uint32_t data)
122 sr_dbg(
"ols: sending cmd 0x%.2x data 0x%.8x", command, data);
124 buf[1] = (data & 0xff000000) >> 24;
125 buf[2] = (data & 0xff0000) >> 16;
126 buf[3] = (data & 0xff00) >> 8;
127 buf[4] = data & 0xff;
134 static int configure_probes(
struct context *ctx, GSList *probes)
138 int probe_bit, stage, i;
148 for (l = probes; l; l = l->next) {
157 probe_bit = 1 << (probe->
index - 1);
165 for (tc = probe->
trigger; tc && *tc; tc++) {
184 static uint32_t reverse16(uint32_t in)
188 out = (in & 0xff) << 8;
189 out |= (in & 0xff00) >> 8;
190 out |= (in & 0xff0000) << 8;
191 out |= (in & 0xff000000) >> 8;
196 static uint32_t reverse32(uint32_t in)
200 out = (in & 0xff) << 24;
201 out |= (in & 0xff00) << 8;
202 out |= (in & 0xff0000) >> 8;
203 out |= (in & 0xff000000) >> 24;
208 static struct context *ols_dev_new(
void)
213 if (!(ctx = g_try_malloc0(
sizeof(
struct context)))) {
214 sr_err(
"ols: %s: ctx malloc failed", __func__);
231 uint8_t key, type, token;
232 GString *tmp_str, *devname, *version;
239 devname = g_string_new(
"");
240 version = g_string_new(
"");
251 tmp_str = g_string_new(
"");
252 while (
serial_read(fd, &tmp_c, 1) == 1 && tmp_c !=
'\0')
253 g_string_append_c(tmp_str, tmp_c);
254 sr_dbg(
"ols: got metadata key 0x%.2x value '%s'",
259 devname = g_string_append(devname, tmp_str->str);
264 g_string_append(version,
", ");
265 g_string_append(version,
"FPGA version ");
266 g_string_append(version, tmp_str->str);
271 g_string_append(version,
", ");
272 g_string_append(version,
"Ancillary version ");
273 g_string_append(version, tmp_str->str);
276 sr_info(
"ols: unknown token 0x%.2x: '%s'",
277 token, tmp_str->str);
280 g_string_free(tmp_str, TRUE);
286 tmp_int = reverse32(tmp_int);
287 sr_dbg(
"ols: got metadata key 0x%.2x value 0x%.8x",
311 sr_info(
"ols: unknown token 0x%.2x: 0x%.8x",
320 sr_dbg(
"ols: got metadata key 0x%.2x value 0x%.2x",
332 sr_info(
"ols: unknown token 0x%.2x: 0x%.2x",
343 sdi->
model = devname->str;
345 g_string_free(devname, FALSE);
346 g_string_free(version, FALSE);
351 static int hw_init(
const char *devinfo)
356 GPollFD *fds, probefd;
357 int devcnt, final_devcnt, num_ports, fd, ret, i;
358 char buf[8], **dev_names, **serial_params;
363 ports = g_slist_append(NULL, g_strdup(devinfo));
368 num_ports = g_slist_length(ports);
370 if (!(fds = g_try_malloc0(num_ports *
sizeof(GPollFD)))) {
371 sr_err(
"ols: %s: fds malloc failed", __func__);
372 goto hw_init_free_ports;
375 if (!(dev_names = g_try_malloc(num_ports *
sizeof(
char *)))) {
376 sr_err(
"ols: %s: dev_names malloc failed", __func__);
377 goto hw_init_free_fds;
380 if (!(serial_params = g_try_malloc(num_ports *
sizeof(
char *)))) {
381 sr_err(
"ols: %s: serial_params malloc failed", __func__);
382 goto hw_init_free_dev_names;
386 for (l = ports; l; l = l->next) {
397 sr_info(
"ols: probing %s...", (
char *)l->data);
403 for (i = 0; i < 5; i++) {
404 if ((ret = send_shortcommand(fd,
412 serial_params[devcnt]);
416 send_shortcommand(fd,
CMD_ID);
418 fds[devcnt].events = G_IO_IN;
419 dev_names[devcnt] = g_strdup(l->data);
428 g_poll(fds, devcnt, 1);
430 for (i = 0; i < devcnt; i++) {
431 if (fds[i].revents != G_IO_IN)
435 if (strncmp(buf,
"1SLO", 4) && strncmp(buf,
"1ALS", 4))
442 probefd.fd = fds[i].fd;
443 probefd.events = G_IO_IN;
444 if (g_poll(&probefd, 1, 10) > 0) {
446 sdi = get_metadata(fds[i].fd);
447 sdi->
index = final_devcnt;
452 "Sump",
"Logic Analyzer",
"v1.0");
458 dev_insts = g_slist_append(dev_insts, sdi);
465 for (i = 0; i < devcnt; i++) {
466 if (fds[i].fd != 0) {
470 g_free(serial_params[i]);
471 g_free(dev_names[i]);
474 g_free(serial_params);
475 hw_init_free_dev_names:
496 if (ctx->
serial->fd == -1)
504 static int hw_dev_close(
int dev_index)
510 sr_err(
"ols: %s: sdi was NULL", __func__);
517 if (ctx->
serial->fd != -1) {
526 static int hw_cleanup(
void)
534 for (l = dev_insts; l; l = l->next) {
535 if (!(sdi = l->data)) {
537 sr_err(
"ols: %s: sdi was NULL, continuing", __func__);
541 if (!(ctx = sdi->
priv)) {
543 sr_err(
"ols: %s: sdi->priv was NULL, continuing",
549 if (ctx->
serial->fd != -1)
554 g_slist_free(dev_insts);
560 static void *hw_dev_info_get(
int dev_index,
int dev_info_id)
571 switch (dev_info_id) {
595 static int hw_dev_status_get(
int dev_index)
605 static int *hw_hwcap_get_all(
void)
610 static int set_samplerate(
struct sr_dev_inst *sdi, uint64_t samplerate)
618 }
else if (samplerate < samplerates.low || samplerate > samplerates.
high)
636 sr_err(
"ols: can't match samplerate %" PRIu64
", using %"
642 static int hw_dev_config_set(
int dev_index,
int hwcap,
void *value)
658 ret = set_samplerate(sdi, *(uint64_t *)value);
661 ret = configure_probes(ctx, (GSList *)value);
668 sr_err(
"ols: sample limit exceeds hw max");
682 if (GPOINTER_TO_INT(value)) {
695 static int receive_data(
int fd,
int revents,
void *cb_data)
707 for (l = dev_insts; l; l = l->next) {
710 if (ctx->
serial->fd == fd) {
730 sr_err(
"ols: %s: ctx->raw_sample_buf malloc failed",
739 for (i = 0x20; i > 0x02; i /= 2) {
744 if (revents == G_IO_IN) {
753 sr_dbg(
"ols: received byte 0x%.2x", byte);
756 sr_dbg(
"ols: received sample 0x%.*x",
782 if (num_channels < 4) {
794 for (i = 0; i < 4; i++) {
795 if (((ctx->
flag_reg >> 2) & (1 << i)) == 0) {
817 memset(ctx->
sample, 0, 4);
834 packet.payload = &logic;
848 packet.payload = &logic;
857 packet.payload = &logic;
875 static int hw_dev_acquisition_start(
int dev_index,
void *cb_data)
881 uint32_t trigger_config[4];
883 uint16_t readcount, delaycount;
884 uint8_t changrp_mask;
903 for (i = 0; i < 4; i++) {
905 changrp_mask |= (1 << i);
916 memset(trigger_config, 0, 16);
929 trigger_config[0]) !=
SR_OK)
939 trigger_config[1]) !=
SR_OK)
949 trigger_config[2]) !=
SR_OK)
959 trigger_config[3]) !=
SR_OK)
969 0x00000008) !=
SR_OK)
971 delaycount = readcount;
974 sr_info(
"ols: setting samplerate to %" PRIu64
" Hz (divider %u, "
982 data = ((readcount - 1) & 0xffff) << 16;
983 data |= (delaycount - 1) & 0xffff;
988 ctx->
flag_reg |= ~(changrp_mask << 2) & 0x3c;
1003 sr_err(
"ols: %s: packet malloc failed", __func__);
1008 sr_err(
"ols: %s: header malloc failed", __func__);
1015 packet->
payload = (
unsigned char *)header;
1029 static int hw_dev_acquisition_stop(
int dev_index,
void *cb_data)
1044 .longname =
"Openbench Logic Sniffer",
1047 .cleanup = hw_cleanup,
1048 .dev_open = hw_dev_open,
1049 .dev_close = hw_dev_close,
1050 .dev_info_get = hw_dev_info_get,
1051 .dev_status_get = hw_dev_status_get,
1052 .hwcap_get_all = hw_hwcap_get_all,
1053 .dev_config_set = hw_dev_config_set,
1054 .dev_acquisition_start = hw_dev_acquisition_start,
1055 .dev_acquisition_stop = hw_dev_acquisition_stop,