static const struct hantek_6xxx_profile dev_profiles[] = {
{
+ /* Windows: "Hantek6022BE DRIVER 1": 04b4:6022 */
0x04b4, 0x6022, 0x1d50, 0x608e, 0x0001,
"Hantek", "6022BE", "fx2lafw-hantek-6022be.fw",
ARRAY_AND_SIZE(dc_coupling), FALSE,
},
+ {
+ /* Windows: "Hantek6022BE DRIVER 2": 04b5:6022 */
+ 0x04b5, 0x6022, 0x1d50, 0x608e, 0x0001,
+ "Hantek", "6022BE", "fx2lafw-hantek-6022be.fw",
+ ARRAY_AND_SIZE(dc_coupling), FALSE,
+ },
{
0x8102, 0x8102, 0x1d50, 0x608e, 0x0002,
"Sainsmart", "DDS120", "fx2lafw-sainsmart-dds120.fw",
ARRAY_AND_SIZE(acdc_coupling), TRUE,
},
{
+ /* Windows: "Hantek6022BL DRIVER 1": 04b4:602a */
0x04b4, 0x602a, 0x1d50, 0x608e, 0x0003,
"Hantek", "6022BL", "fx2lafw-hantek-6022bl.fw",
ARRAY_AND_SIZE(dc_coupling), FALSE,
},
+ {
+ /* Windows: "Hantek6022BL DRIVER 2": 04b5:602a */
+ 0x04b5, 0x602a, 0x1d50, 0x608e, 0x0003,
+ "Hantek", "6022BL", "fx2lafw-hantek-6022bl.fw",
+ ARRAY_AND_SIZE(dc_coupling), FALSE,
+ },
+ {
+ 0xd4a2, 0x5660, 0x1d50, 0x608e, 0x0004,
+ "YiXingDianZi", "MDSO", "fx2lafw-yixingdianzi-mdso.fw",
+ ARRAY_AND_SIZE(dc_coupling), FALSE,
+ },
ALL_ZERO
};
devc->coupling_tab_size = prof->coupling_tab_size;
devc->has_coupling = prof->has_coupling;
- devc->sample_buf = NULL;
- devc->sample_buf_write = 0;
- devc->sample_buf_size = 0;
-
devc->profile = prof;
devc->dev_state = IDLE;
devc->samplerate = DEFAULT_SAMPLERATE;
libusb_get_device_descriptor(devlist[i], &des);
- 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;
prof = NULL;
for (j = 0; dev_profiles[j].orig_vid; j++) {
devices = g_slist_append(devices, sdi);
devc = sdi->priv;
if (ezusb_upload_firmware(drvc->sr_ctx, devlist[i],
- USB_CONFIGURATION, prof->firmware) == SR_OK)
+ USB_CONFIGURATION, prof->firmware) == SR_OK) {
/* Remember when the firmware on this device was updated. */
devc->fw_updated = g_get_monotonic_time();
- else
- sr_err("Firmware upload failed.");
+ } else {
+ sr_err("Firmware upload failed, name %s.", prof->firmware);
+ }
/* Dummy USB address of 0xff will get overwritten later. */
sdi->conn = sr_usb_dev_inst_new(
libusb_get_bus_number(devlist[i]), 0xff, NULL);
g_free(analog.data);
}
-static void send_data(struct sr_dev_inst *sdi, struct libusb_transfer *buf[], uint64_t samples)
-{
- int i = 0;
- uint64_t send = 0;
- uint32_t chunk;
-
- while (send < samples) {
- chunk = MIN(samples - send, (uint64_t)(buf[i]->actual_length / NUM_CHANNELS));
- send += chunk;
- send_chunk(sdi, buf[i]->buffer, chunk);
-
- /*
- * Everything in this transfer was either copied to the buffer
- * or sent to the session bus.
- */
- g_free(buf[i]->buffer);
- libusb_free_transfer(buf[i]);
- i++;
- }
-}
-
/*
* Called by libusb (as triggered by handle_event()) when a transfer comes in.
* Only channel data comes in asynchronously, and all transfers for this are
if (devc->dev_state != CAPTURE)
return;
- if (!devc->sample_buf) {
- devc->sample_buf_size = 10;
- devc->sample_buf = g_try_malloc(devc->sample_buf_size * sizeof(transfer));
- devc->sample_buf_write = 0;
- }
-
- if (devc->sample_buf_write >= devc->sample_buf_size) {
- devc->sample_buf_size += 10;
- devc->sample_buf = g_try_realloc(devc->sample_buf,
- devc->sample_buf_size * sizeof(transfer));
- if (!devc->sample_buf) {
- sr_err("Sample buffer malloc failed.");
- devc->dev_state = STOPPING;
- return;
- }
- }
-
- devc->sample_buf[devc->sample_buf_write++] = transfer;
- devc->samp_received += transfer->actual_length / NUM_CHANNELS;
-
sr_spew("receive_transfer(): calculated samplerate == %" PRIu64 "ks/s",
(uint64_t)(transfer->actual_length * 1000 /
(g_get_monotonic_time() - devc->read_start_ts + 1) /
/* Nothing to send to the bus. */
return;
+ unsigned samples_received = transfer->actual_length / NUM_CHANNELS;
+ send_chunk(sdi, transfer->buffer, samples_received);
+ devc->samp_received += samples_received;
+
+ g_free(transfer->buffer);
+ libusb_free_transfer(transfer);
+
if (devc->limit_samples && devc->samp_received >= devc->limit_samples) {
sr_info("Requested number of samples reached, stopping. %"
PRIu64 " <= %" PRIu64, devc->limit_samples,
devc->samp_received);
- send_data(sdi, devc->sample_buf, devc->limit_samples);
sr_dev_acquisition_stop(sdi);
} else if (devc->limit_msec && (g_get_monotonic_time() -
devc->aq_started) / 1000 >= devc->limit_msec) {
sr_info("Requested time limit reached, stopping. %d <= %d",
(uint32_t)devc->limit_msec,
(uint32_t)(g_get_monotonic_time() - devc->aq_started) / 1000);
- send_data(sdi, devc->sample_buf, devc->samp_received);
- g_free(devc->sample_buf);
- devc->sample_buf = NULL;
sr_dev_acquisition_stop(sdi);
} else {
read_channel(sdi, data_amount(sdi));
amount = MIN(amount, MAX_PACKET_SIZE);
ret = hantek_6xxx_get_channeldata(sdi, receive_transfer, amount);
devc->read_start_ts = g_get_monotonic_time();
- devc->read_data_amount = amount;
return ret;
}
devc = sdi->priv;
devc->dev_state = STOPPING;
- g_free(devc->sample_buf);
- devc->sample_buf = NULL;
-
return SR_OK;
}