X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=hardware%2Fhantek-dso%2Fdso.h;h=edccb725cf3830bc873833e6e4856e3468392a59;hp=6e35a985859e53cfd7b272621431dd76f580356d;hb=43cd4637285833706f8a404ca027bcf0ee75b9ae;hpb=3b533202c8b32fbe785906e9930959aae077aeff diff --git a/hardware/hantek-dso/dso.h b/hardware/hantek-dso/dso.h index 6e35a985..edccb725 100644 --- a/hardware/hantek-dso/dso.h +++ b/hardware/hantek-dso/dso.h @@ -1,5 +1,5 @@ /* - * This file is part of the sigrok project. + * This file is part of the libsigrok project. * * Copyright (C) 2012 Bert Vermeulen * With protocol information from the hantekdso project, @@ -19,46 +19,44 @@ * along with this program. If not, see . */ -#ifndef LIBSIGROK_HARDWARE_HANTEK_DSO_H -#define LIBSIGROK_HARDWARE_HANTEK_DSO_H +#ifndef LIBSIGROK_HARDWARE_HANTEK_DSO_DSO_H +#define LIBSIGROK_HARDWARE_HANTEK_DSO_DSO_H -#define USB_INTERFACE 0 -#define USB_CONFIGURATION 1 -#define DSO_EP_IN 0x86 -#define DSO_EP_OUT 0x02 +#define LOG_PREFIX "hantek-dso" -/* FX2 renumeration delay in ms */ -#define MAX_RENUM_DELAY 3000 +#define USB_INTERFACE 0 +#define USB_CONFIGURATION 1 +#define DSO_EP_IN 0x86 +#define DSO_EP_OUT 0x02 -#define MAX_CAPTURE_EMPTY 3 +/* FX2 renumeration delay in ms */ +#define MAX_RENUM_DELAY_MS 3000 -#define DEFAULT_VOLTAGE VOLTAGE_2V -#define DEFAULT_FRAMESIZE FRAMESIZE_SMALL -#define DEFAULT_TIMEBASE TIME_1ms -#define DEFAULT_TRIGGER_SOURCE TRIGGER_CH1 -#define DEFAULT_COUPLING COUPLING_AC -#define DEFAULT_SELECTED_CHANNEL SELECT_CH1CH2 -/* Halfway between min and max = 0V */ -#define DEFAULT_HORIZ_TRIGGERPOS 0x1400 +#define MAX_CAPTURE_EMPTY 3 -#define DEFAULT_VERT_OFFSET 0.5 -#define DEFAULT_VERT_TRIGGERPOS 0.0 +#define DEFAULT_VOLTAGE VDIV_500MV +#define DEFAULT_FRAMESIZE FRAMESIZE_SMALL +#define DEFAULT_TIMEBASE TIME_100us +#define DEFAULT_TRIGGER_SOURCE "CH1" +#define DEFAULT_COUPLING COUPLING_DC +#define DEFAULT_HORIZ_TRIGGERPOS 0.5 +#define DEFAULT_VERT_OFFSET 0.5 +#define DEFAULT_VERT_TRIGGERPOS 0.5 -#define MAX_VERT_TRIGGER 0xfe +#define MAX_VERT_TRIGGER 0xfe /* Hantek DSO-specific protocol values */ -#define EEPROM_CHANNEL_OFFSETS 0x08 - -#define FRAMESIZE_SMALL 10240 -#define FRAMESIZE_LARGE 32768 +#define EEPROM_CHANNEL_OFFSETS 0x08 +/* All models have this for their "fast" mode. */ +#define FRAMESIZE_SMALL 10240 enum control_requests { CTRL_READ_EEPROM = 0xa2, CTRL_GETSPEED = 0xb2, CTRL_BEGINCOMMAND = 0xb3, CTRL_SETOFFSET = 0xb4, - CTRL_SETRELAYS = 0xb5 + CTRL_SETRELAYS = 0xb5, }; enum dso_commands { @@ -70,28 +68,20 @@ enum dso_commands { CMD_GET_CHANNELDATA, CMD_GET_CAPTURESTATE, CMD_SET_VOLTAGE, - cmdSetLogicalData, - cmdGetLogicalData -}; - -enum voltages { - VOLTAGE_5V = 0, - VOLTAGE_2V, - VOLTAGE_1V, - VOLTAGE_500mV, - VOLTAGE_200mV, - VOLTAGE_100mV, - VOLTAGE_50mV, - VOLTAGE_20mV, - VOLTAGE_10mV + /* unused */ + CMD_SET_LOGICALDATA, + CMD_GET_LOGICALDATA, }; +/* Must match the coupling table. */ enum couplings { COUPLING_AC = 0, COUPLING_DC, - COUPLING_OFF + /* TODO not used, how to enable? */ + COUPLING_GND, }; +/* Must match the timebases table. */ enum time_bases { TIME_10us = 0, TIME_20us, @@ -107,26 +97,31 @@ enum time_bases { TIME_40ms, TIME_100ms, TIME_200ms, - TIME_400ms + TIME_400ms, +}; + +/* Must match the vdivs table. */ +enum { + VDIV_10MV, + VDIV_20MV, + VDIV_50MV, + VDIV_100MV, + VDIV_200MV, + VDIV_500MV, + VDIV_1V, + VDIV_2V, + VDIV_5V, }; enum trigger_slopes { SLOPE_POSITIVE = 0, - SLOPE_NEGATIVE + SLOPE_NEGATIVE, }; enum trigger_sources { TRIGGER_CH2 = 0, TRIGGER_CH1, - TRIGGER_ALT, TRIGGER_EXT, - TRIGGER_EXT10 -}; - -enum selected_channels { - SELECT_CH1 = 0, - SELECT_CH2, - SELECT_CH1CH2 }; enum capturestates { @@ -135,20 +130,21 @@ enum capturestates { CAPTURE_READY_8BIT = 2, CAPTURE_READY_9BIT = 7, CAPTURE_TIMEOUT = 127, - CAPTURE_UNKNOWN = 255 + CAPTURE_UNKNOWN = 255, }; enum triggermodes { TRIGGERMODE_AUTO, TRIGGERMODE_NORMAL, - TRIGGERMODE_SINGLE + TRIGGERMODE_SINGLE, }; enum states { IDLE, NEW_CAPTURE, CAPTURE, - FETCH_DATA + FETCH_DATA, + STOPPING, }; struct dso_profile { @@ -160,26 +156,27 @@ struct dso_profile { uint16_t fw_pid; char *vendor; char *model; - char *model_version; - int num_probes; + const uint64_t *buffersizes; char *firmware; }; -struct context { - struct dso_profile *profile; - struct sr_usb_dev_inst *usb; +struct dev_context { + const struct dso_profile *profile; void *cb_data; + uint64_t limit_frames; + uint64_t num_frames; + GSList *enabled_channels; /* We can't keep track of an FX2-based device after upgrading * the firmware (it re-enumerates into a different device address * after the upgrade) this is like a global lock. No device will open * until a proper delay after the last device was upgraded. */ - GTimeVal fw_updated; + int64_t fw_updated; int epin_maxpacketsize; int capture_empty_count; - int current_transfer; int dev_state; + /* Oscilloscope settings. */ int timebase; gboolean ch1_enabled; gboolean ch2_enabled; @@ -192,24 +189,31 @@ struct context { float voffset_ch2; float voffset_trigger; uint16_t channel_levels[2][9][2]; - int selected_channel; - int framesize; + unsigned int framesize; gboolean filter_ch1; gboolean filter_ch2; gboolean filter_trigger; int triggerslope; - int triggersource; - int triggerposition; + char *triggersource; + float triggerposition; int triggermode; + + /* Frame transfer */ + unsigned int samp_received; + unsigned int samp_buffered; + unsigned int trigger_offset; + unsigned char *framebuf; }; -SR_PRIV int dso_open(int dev_index); +SR_PRIV int dso_open(struct sr_dev_inst *sdi); SR_PRIV void dso_close(struct sr_dev_inst *sdi); -SR_PRIV int dso_enable_trigger(struct context *ctx); -SR_PRIV int dso_force_trigger(struct context *ctx); -SR_PRIV int dso_init(struct context *ctx); -SR_PRIV uint8_t dso_get_capturestate(struct context *ctx); -SR_PRIV uint8_t dso_capture_start(struct context *ctx); -SR_PRIV int dso_get_channeldata(struct context *ctx, libusb_transfer_cb_fn cb); +SR_PRIV int dso_enable_trigger(const struct sr_dev_inst *sdi); +SR_PRIV int dso_force_trigger(const struct sr_dev_inst *sdi); +SR_PRIV int dso_init(const struct sr_dev_inst *sdi); +SR_PRIV int dso_get_capturestate(const struct sr_dev_inst *sdi, + uint8_t *capturestate, uint32_t *trigger_offset); +SR_PRIV int dso_capture_start(const struct sr_dev_inst *sdi); +SR_PRIV int dso_get_channeldata(const struct sr_dev_inst *sdi, + libusb_transfer_cb_fn cb); #endif