X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhantek-4032l%2Fapi.c;h=33c55c692270a31afbd9881a61b09675b2e48798;hb=3dc976fe9fcc21a1b82087fe6b969cf997346bdc;hp=9576fabccb068ad9fcc6ac3d5b6951e2769fabe7;hpb=5089a14345442bb87d0970efc0bc10235a530d60;p=libsigrok.git diff --git a/src/hardware/hantek-4032l/api.c b/src/hardware/hantek-4032l/api.c index 9576fabc..33c55c69 100644 --- a/src/hardware/hantek-4032l/api.c +++ b/src/hardware/hantek-4032l/api.c @@ -35,8 +35,8 @@ static const uint32_t drvopts[] = { static const uint32_t devopts[] = { SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET, - SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET, + SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_TRIGGER_MATCH | SR_CONF_LIST, SR_CONF_CONN | SR_CONF_GET, SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_SET | SR_CONF_LIST, @@ -164,8 +164,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) struct sr_usb_dev_inst *usb = NULL; for (l = conn_devices; l; l = l->next) { usb = l->data; - if (usb->bus == libusb_get_bus_number(devlist[i]) - && usb->address == libusb_get_device_address(devlist[i])) + if (usb->bus == libusb_get_bus_number(devlist[i]) && + usb->address == libusb_get_device_address(devlist[i])) break; } if (!l) @@ -180,7 +180,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) des.idProduct != H4032L_USB_PRODUCT) continue; - usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)); + if (usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)) < 0) + continue; sdi = g_malloc0(sizeof(struct sr_dev_inst)); sdi->driver = &hantek_4032l_driver_info; @@ -212,14 +213,11 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) devc->cmd_pkt.pwm_a = h4032l_voltage2pwm(2.5); devc->cmd_pkt.pwm_b = h4032l_voltage2pwm(2.5); devc->cmd_pkt.sample_size = 16384; - devc->cmd_pkt.pre_trigger_size = 1024; devc->status = H4032L_STATUS_IDLE; devc->capture_ratio = 5; - devc->usb_transfer = libusb_alloc_transfer(0); - sdi->priv = devc; devices = g_slist_append(devices, sdi); @@ -266,6 +264,10 @@ static int dev_open(struct sr_dev_inst *sdi) return SR_ERR; } + /* Get FPGA version. */ + if ((ret = h4032l_get_fpga_version(sdi)) != SR_OK) + return ret; + return SR_OK; } @@ -333,39 +335,46 @@ static int config_set(uint32_t key, GVariant *data, i++; if (i == ARRAY_SIZE(samplerates_hw) || sample_rate == 0) { - sr_err("invalid sample rate"); + sr_err("Invalid sample rate."); return SR_ERR_SAMPLERATE; } cmd_pkt->sample_rate = i; - - return SR_OK; + break; + } + case SR_CONF_CAPTURE_RATIO: { + uint64_t capture_ratio = g_variant_get_uint64(data); + if (capture_ratio > 99) { + sr_err("Invalid capture ratio."); + return SR_ERR; + } + devc->capture_ratio = capture_ratio; + break; } - case SR_CONF_CAPTURE_RATIO: - devc->capture_ratio = g_variant_get_uint64(data); - return SR_OK; case SR_CONF_LIMIT_SAMPLES: { uint64_t number_samples = g_variant_get_uint64(data); number_samples += 511; number_samples &= 0xfffffe00; - if (number_samples < 2048 - || number_samples > 64 * 1024 * 1024) { - sr_err("invalid sample range 2k...64M: %ld", - number_samples); + if (number_samples < H4043L_NUM_SAMPLES_MIN || + number_samples > H4032L_NUM_SAMPLES_MAX) { + sr_err("Invalid sample range 2k...64M: %" + PRIu64 ".", number_samples); return SR_ERR; } cmd_pkt->sample_size = number_samples; - return SR_OK; + break; } case SR_CONF_VOLTAGE_THRESHOLD: { double d1, d2; g_variant_get(data, "(dd)", &d1, &d2); devc->cmd_pkt.pwm_a = h4032l_voltage2pwm(d1); devc->cmd_pkt.pwm_b = h4032l_voltage2pwm(d2); - return SR_OK; + break; } + default: + return SR_ERR_NA; } - return SR_ERR_NA; + return SR_OK; } static int config_list(uint32_t key, GVariant **data, @@ -384,6 +393,9 @@ static int config_list(uint32_t key, GVariant **data, case SR_CONF_VOLTAGE_THRESHOLD: *data = std_gvar_tuple_double(2.5, 2.5); break; + case SR_CONF_LIMIT_SAMPLES: + *data = std_gvar_tuple_u64(H4043L_NUM_SAMPLES_MIN, H4032L_NUM_SAMPLES_MAX); + break; default: return SR_ERR_NA; } @@ -399,8 +411,14 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) struct sr_trigger *trigger = sr_session_trigger_get(sdi->session); struct h4032l_cmd_pkt *cmd_pkt = &devc->cmd_pkt; + /* Initialize variables. */ + devc->acq_aborted = FALSE; + devc->submitted_transfers = 0; + devc->sent_samples = 0; + /* Calculate packet ratio. */ cmd_pkt->pre_trigger_size = (cmd_pkt->sample_size * devc->capture_ratio) / 100; + devc->trigger_pos = cmd_pkt->pre_trigger_size; cmd_pkt->trig_flags.enable_trigger1 = 0; cmd_pkt->trig_flags.enable_trigger2 = 0; @@ -410,7 +428,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) GSList *stages = trigger->stages; struct sr_trigger_stage *stage1 = stages->data; if (stages->next) { - sr_err("only one trigger stage supported for now"); + sr_err("Only one trigger stage supported for now."); return SR_ERR; } cmd_pkt->trig_flags.enable_trigger1 = 1; @@ -440,7 +458,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) break; case SR_TRIGGER_RISING: if (cmd_pkt->trigger[0].flags.edge_type != H4032L_TRIGGER_EDGE_TYPE_DISABLED) { - sr_err("only one trigger signal with fall/rising/edge allowed"); + sr_err("Only one trigger signal with fall/rising/edge allowed."); return SR_ERR; } cmd_pkt->trigger[0].flags.edge_type = H4032L_TRIGGER_EDGE_TYPE_RISE; @@ -448,7 +466,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) break; case SR_TRIGGER_FALLING: if (cmd_pkt->trigger[0].flags.edge_type != H4032L_TRIGGER_EDGE_TYPE_DISABLED) { - sr_err("only one trigger signal with fall/rising/edge allowed"); + sr_err("Only one trigger signal with fall/rising/edge allowed."); return SR_ERR; } cmd_pkt->trigger[0].flags.edge_type = H4032L_TRIGGER_EDGE_TYPE_FALL; @@ -456,14 +474,14 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) break; case SR_TRIGGER_EDGE: if (cmd_pkt->trigger[0].flags.edge_type != H4032L_TRIGGER_EDGE_TYPE_DISABLED) { - sr_err("only one trigger signal with fall/rising/edge allowed"); + sr_err("Only one trigger signal with fall/rising/edge allowed."); return SR_ERR; } cmd_pkt->trigger[0].flags.edge_type = H4032L_TRIGGER_EDGE_TYPE_TOGGLE; cmd_pkt->trigger[0].flags.edge_signal = match->channel->index; break; default: - sr_err("unknown trigger value"); + sr_err("Unknown trigger value."); return SR_ERR; } @@ -491,7 +509,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) } } - usb_source_add(sdi->session, drvc->sr_ctx, 10000, + usb_source_add(sdi->session, drvc->sr_ctx, 1000, h4032l_receive_data, sdi->driver->context); /* Start capturing. */ @@ -500,11 +518,8 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) static int dev_acquisition_stop(struct sr_dev_inst *sdi) { - (void)sdi; - - /* TODO: stop acquisition. */ - - return SR_OK; + /* Stop capturing. */ + return h4032l_stop(sdi); } SR_PRIV struct sr_dev_driver hantek_4032l_driver_info = {