X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=hardware%2Fasix-sigma%2Fasix-sigma.c;h=097a56489437cde00c3b164c9bf4adbb60527cdd;hb=61136ea6035778f2894a1e32b78f94a0640a5a91;hp=5fc45c347a04c012c42ac087292f052efdd7c11f;hpb=e210c6c09003cbd4cfada74c42466ad407c73ad8;p=libsigrok.git diff --git a/hardware/asix-sigma/asix-sigma.c b/hardware/asix-sigma/asix-sigma.c index 5fc45c34..097a5648 100644 --- a/hardware/asix-sigma/asix-sigma.c +++ b/hardware/asix-sigma/asix-sigma.c @@ -1,7 +1,7 @@ /* * This file is part of the sigrok project. * - * Copyright (C) 2010 Håvard Espeland , + * Copyright (C) 2010-2012 Håvard Espeland , * Copyright (C) 2010 Martin Stensgård * Copyright (C) 2010 Carl Henrik Lunde * @@ -20,15 +20,15 @@ */ /* - * ASIX SIGMA Logic Analyzer Driver + * ASIX SIGMA/SIGMA2 logic analyzer driver */ #include #include #include #include -#include "sigrok.h" -#include "sigrok-internal.h" +#include "libsigrok.h" +#include "libsigrok-internal.h" #include "asix-sigma.h" #define USB_VENDOR 0xa600 @@ -42,7 +42,7 @@ static GSList *dev_insts = NULL; -static uint64_t supported_samplerates[] = { +static const uint64_t supported_samplerates[] = { SR_KHZ(200), SR_KHZ(250), SR_KHZ(500), @@ -81,14 +81,14 @@ static const char *probe_names[NUM_PROBES + 1] = { NULL, }; -static struct sr_samplerates samplerates = { +static const struct sr_samplerates samplerates = { 0, 0, 0, supported_samplerates, }; -static int hwcaps[] = { +static const int hwcaps[] = { SR_HWCAP_LOGIC_ANALYZER, SR_HWCAP_SAMPLERATE, SR_HWCAP_CAPTURE_RATIO, @@ -405,7 +405,15 @@ static int bin2bitbang(const char *filename, return SR_OK; } -static int hw_init(const char *devinfo) +static int hw_init(void) +{ + + /* Nothing to do. */ + + return SR_OK; +} + +static int hw_scan(void) { struct sr_dev_inst *sdi; struct context *ctx; @@ -413,9 +421,6 @@ static int hw_init(const char *devinfo) char serial_txt[10]; uint32_t serial; - /* Avoid compiler warnings. */ - (void)devinfo; - if (!(ctx = g_try_malloc(sizeof(struct context)))) { sr_err("sigma: %s: ctx malloc failed", __func__); return SR_ERR_MALLOC; @@ -426,17 +431,17 @@ static int hw_init(const char *devinfo) /* Look for SIGMAs. */ if (ftdi_usb_find_all(&ctx->ftdic, &devlist, - USB_VENDOR, USB_PRODUCT) < 0) + USB_VENDOR, USB_PRODUCT) <= 0) goto free; /* Make sure it's a version 1 or 2 SIGMA. */ ftdi_usb_get_strings(&ctx->ftdic, devlist->dev, NULL, 0, NULL, 0, - serial_txt, sizeof(serial_txt)); + serial_txt, sizeof(serial_txt)); sscanf(serial_txt, "%x", &serial); - if (serial < 0xa6010000 || serial > 0xa602ffff ) { + if (serial < 0xa6010000 || serial > 0xa602ffff) { sr_err("sigma: Only SIGMA and SIGMA2 are supported " - "in this version of Sigrok."); + "in this version of sigrok."); goto free; } @@ -633,11 +638,11 @@ static int set_samplerate(struct sr_dev_inst *sdi, uint64_t samplerate) * The Sigma supports complex triggers using boolean expressions, but this * has not been implemented yet. */ -static int configure_probes(struct sr_dev_inst *sdi, GSList *probes) +static int configure_probes(struct sr_dev_inst *sdi, const GSList *probes) { struct context *ctx = sdi->priv; - struct sr_probe *probe; - GSList *l; + const struct sr_probe *probe; + const GSList *l; int trigger_set = 0; int probebit; @@ -753,11 +758,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 = NULL; + const void *info = NULL; if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) { sr_err("sigma: %s: sdi was NULL", __func__); @@ -801,12 +806,12 @@ static int hw_dev_status_get(int dev_index) return SR_ST_NOT_FOUND; } -static int *hw_hwcap_get_all(void) +static const int *hw_hwcap_get_all(void) { return hwcaps; } -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; @@ -818,17 +823,17 @@ static int hw_dev_config_set(int dev_index, int hwcap, void *value) ctx = sdi->priv; if (hwcap == SR_HWCAP_SAMPLERATE) { - ret = set_samplerate(sdi, *(uint64_t *)value); + ret = set_samplerate(sdi, *(const uint64_t *)value); } else if (hwcap == SR_HWCAP_PROBECONFIG) { ret = configure_probes(sdi, value); } else if (hwcap == SR_HWCAP_LIMIT_MSEC) { - ctx->limit_msec = *(uint64_t *)value; + ctx->limit_msec = *(const uint64_t *)value; if (ctx->limit_msec > 0) ret = SR_OK; else ret = SR_ERR; } else if (hwcap == 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) ret = SR_ERR; else @@ -1265,6 +1270,7 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) struct context *ctx; struct sr_datafeed_packet *packet; struct sr_datafeed_header *header; + struct sr_datafeed_meta_logic meta; struct clockselect_50 clockselect; int frac, triggerpin, ret; uint8_t triggerselect; @@ -1348,7 +1354,7 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) /* Setup maximum post trigger time. */ sigma_set_register(WRITE_POST_TRIGGER, - (ctx->capture_ratio * 255) / 100, ctx); + (ctx->capture_ratio * 255) / 100, ctx); /* Start acqusition. */ gettimeofday(&ctx->start_tv, 0); @@ -1366,17 +1372,23 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) return SR_ERR_MALLOC; } - /* Add capture source. */ - sr_source_add(0, G_IO_IN, 10, receive_data, sdi); - /* Send header packet to the session bus. */ packet->type = SR_DF_HEADER; packet->payload = header; header->feed_version = 1; gettimeofday(&header->starttime, NULL); - header->samplerate = ctx->cur_samplerate; - header->num_logic_probes = ctx->num_probes; sr_session_send(ctx->session_dev_id, 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 = ctx->num_probes; + sr_session_send(ctx->session_dev_id, packet); + + /* Add capture source. */ + sr_source_add(0, G_IO_IN, 10, receive_data, sdi); + g_free(header); g_free(packet); @@ -1429,10 +1441,11 @@ static int hw_dev_acquisition_stop(int dev_index, void *cb_data) SR_PRIV struct sr_dev_driver asix_sigma_driver_info = { .name = "asix-sigma", - .longname = "ASIX SIGMA", + .longname = "ASIX SIGMA/SIGMA2", .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,