X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fasix-sigma%2Fasix-sigma.c;h=59a1ec4289c3e183494582b75a7a03a492ab36d3;hb=063e7aef6d41d4c44591ff93672079998bf9622f;hp=6d9bea2d7b656d01f23b75068cb8752bc2983e2a;hpb=34f06b903e3529a73feb7a6e74fae934a999f821;p=libsigrok.git diff --git a/hardware/asix-sigma/asix-sigma.c b/hardware/asix-sigma/asix-sigma.c index 6d9bea2d..59a1ec42 100644 --- a/hardware/asix-sigma/asix-sigma.c +++ b/hardware/asix-sigma/asix-sigma.c @@ -37,11 +37,11 @@ #define USB_VENDOR_NAME "ASIX" #define USB_MODEL_NAME "SIGMA" #define USB_MODEL_VERSION "" -#define TRIGGER_TYPES "rf10" +#define TRIGGER_TYPE "rf10" #define NUM_PROBES 16 SR_PRIV struct sr_dev_driver asix_sigma_driver_info; -static struct sr_dev_driver *adi = &asix_sigma_driver_info; +static struct sr_dev_driver *di = &asix_sigma_driver_info; static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data); static const uint64_t supported_samplerates[] = { @@ -64,22 +64,8 @@ static const uint64_t supported_samplerates[] = { * (the cable has two additional GND pins, and a TI and TO pin) */ static const char *probe_names[NUM_PROBES + 1] = { - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", + "1", "2", "3", "4", "5", "6", "7", "8", + "9", "10", "11", "12", "13", "14", "15", "16", NULL, }; @@ -91,11 +77,11 @@ static const struct sr_samplerates samplerates = { }; static const int hwcaps[] = { - SR_HWCAP_LOGIC_ANALYZER, - SR_HWCAP_SAMPLERATE, - SR_HWCAP_CAPTURE_RATIO, + SR_CONF_LOGIC_ANALYZER, + SR_CONF_SAMPLERATE, + SR_CONF_CAPTURE_RATIO, - SR_HWCAP_LIMIT_MSEC, + SR_CONF_LIMIT_MSEC, 0, }; @@ -411,7 +397,7 @@ static int clear_instances(void) struct drv_context *drvc; struct dev_context *devc; - drvc = adi->priv; + drvc = di->priv; /* Properly close all devices. */ for (l = drvc->instances; l; l = l->next) { @@ -434,15 +420,7 @@ static int clear_instances(void) static int hw_init(struct sr_context *sr_ctx) { - struct drv_context *drvc; - - if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) { - sr_err("Driver context malloc failed."); - return SR_ERR_MALLOC; - } - adi->priv = drvc; - - return SR_OK; + return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN); } static GSList *hw_scan(GSList *options) @@ -459,8 +437,10 @@ static GSList *hw_scan(GSList *options) (void)options; - drvc = adi->priv; + drvc = di->priv; + devices = NULL; + clear_instances(); if (!(devc = g_try_malloc(sizeof(struct dev_context)))) { @@ -507,7 +487,7 @@ static GSList *hw_scan(GSList *options) sr_err("%s: sdi was NULL", __func__); goto free; } - sdi->driver = adi; + sdi->driver = di; for (i = 0; probe_names[i]; i++) { if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, @@ -535,7 +515,7 @@ static GSList *hw_dev_list(void) { struct drv_context *drvc; - drvc = adi->priv; + drvc = di->priv; return drvc->instances; } @@ -661,6 +641,8 @@ static int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate) int i, ret; struct dev_context *devc = sdi->priv; + ret = SR_OK; + for (i = 0; supported_samplerates[i]; i++) { if (supported_samplerates[i] == samplerate) break; @@ -682,7 +664,7 @@ static int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate) } devc->cur_samplerate = samplerate; - devc->period_ps = 1000000000000 / samplerate; + devc->period_ps = 1000000000000ULL / samplerate; devc->samples_per_event = 16 / devc->num_probes; devc->state.state = SIGMA_IDLE; @@ -790,7 +772,7 @@ static int hw_dev_close(struct sr_dev_inst *sdi) static int hw_cleanup(void) { - if (!adi->priv) + if (!di->priv) return SR_OK; clear_instances(); @@ -798,28 +780,12 @@ static int hw_cleanup(void) return SR_OK; } -static int hw_info_get(int info_id, const void **data, - const struct sr_dev_inst *sdi) +static int config_get(int id, const void **data, const struct sr_dev_inst *sdi) { struct dev_context *devc; - switch (info_id) { - case SR_DI_HWCAPS: - *data = hwcaps; - break; - case SR_DI_NUM_PROBES: - *data = GINT_TO_POINTER(NUM_PROBES); - break; - case SR_DI_PROBE_NAMES: - *data = probe_names; - break; - case SR_DI_SAMPLERATES: - *data = &samplerates; - break; - case SR_DI_TRIGGER_TYPES: - *data = (char *)TRIGGER_TYPES; - break; - case SR_DI_CUR_SAMPLERATE: + switch (id) { + case SR_CONF_SAMPLERATE: if (sdi) { devc = sdi->priv; *data = &devc->cur_samplerate; @@ -833,23 +799,22 @@ static int hw_info_get(int info_id, const void **data, return SR_OK; } -static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, - const void *value) +static int config_set(int id, const void *value, const struct sr_dev_inst *sdi) { struct dev_context *devc; int ret; devc = sdi->priv; - if (hwcap == SR_HWCAP_SAMPLERATE) { + if (id == SR_CONF_SAMPLERATE) { ret = set_samplerate(sdi, *(const uint64_t *)value); - } else if (hwcap == SR_HWCAP_LIMIT_MSEC) { + } else if (id == SR_CONF_LIMIT_MSEC) { devc->limit_msec = *(const uint64_t *)value; if (devc->limit_msec > 0) ret = SR_OK; else ret = SR_ERR; - } else if (hwcap == SR_HWCAP_CAPTURE_RATIO) { + } else if (id == SR_CONF_CAPTURE_RATIO) { devc->capture_ratio = *(const uint64_t *)value; if (devc->capture_ratio < 0 || devc->capture_ratio > 100) ret = SR_ERR; @@ -862,6 +827,28 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, return ret; } +static int config_list(int key, const void **data, const struct sr_dev_inst *sdi) +{ + + (void)sdi; + + switch (key) { + case SR_CONF_DEVICE_OPTIONS: + *data = hwcaps; + break; + case SR_CONF_SAMPLERATE: + *data = &samplerates; + break; + case SR_CONF_TRIGGER_TYPE: + *data = (char *)TRIGGER_TYPE; + break; + default: + return SR_ERR_ARG; + } + + return SR_OK; +} + /* Software trigger to determine exact trigger position. */ static int get_trigger_offset(uint16_t *samples, uint16_t last_sample, struct sigma_trigger *t) @@ -1066,7 +1053,9 @@ static int receive_data(int fd, int revents, void *cb_data) else hw_dev_acquisition_stop(sdi, sdi); - } else if (devc->state.state == SIGMA_DOWNLOAD) { + } + + if (devc->state.state == SIGMA_DOWNLOAD) { if (devc->state.chunks_downloaded >= numchunks) { /* End of samples. */ packet.type = SR_DF_END; @@ -1286,10 +1275,9 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, struct dev_context *devc; 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; + uint8_t triggerselect = 0; struct triggerinout triggerinout_conf; struct triggerlut lut; @@ -1397,13 +1385,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, gettimeofday(&header->starttime, NULL); sr_session_send(devc->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 = devc->cur_samplerate; - meta.num_probes = devc->num_probes; - sr_session_send(devc->session_dev_id, packet); - /* Add capture source. */ sr_source_add(0, G_IO_IN, 10, receive_data, (void *)sdi); @@ -1461,10 +1442,11 @@ SR_PRIV struct sr_dev_driver asix_sigma_driver_info = { .scan = hw_scan, .dev_list = hw_dev_list, .dev_clear = clear_instances, + .config_get = config_get, + .config_set = config_set, + .config_list = config_list, .dev_open = hw_dev_open, .dev_close = hw_dev_close, - .info_get = hw_info_get, - .dev_config_set = hw_dev_config_set, .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop, .priv = NULL,