X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=hardware%2Frigol-ds%2Fprotocol.h;h=0117628ca04e72e6451d4b5680c670889db19497;hp=cce22b28044f61bf7c1d463457d49761db083fb3;hb=43cd4637285833706f8a404ca027bcf0ee75b9ae;hpb=3086efdd73885820da142ce8c36053bbc3cf0e5f diff --git a/hardware/rigol-ds/protocol.h b/hardware/rigol-ds/protocol.h index cce22b28..0117628c 100644 --- a/hardware/rigol-ds/protocol.h +++ b/hardware/rigol-ds/protocol.h @@ -22,55 +22,134 @@ #define LIBSIGROK_HARDWARE_RIGOL_DS_PROTOCOL_H #include +#include #include "libsigrok.h" #include "libsigrok-internal.h" -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "rigol-ds: " -#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) -#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) -#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) -#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) -#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) -#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) +#define LOG_PREFIX "rigol-ds" -#define ANALOG_WAVEFORM_SIZE 600 -#define DIGITAL_WAVEFORM_SIZE 1210 +/* Size of acquisition buffers */ +#define ACQ_BUFFER_SIZE 32768 + +#define MAX_ANALOG_CHANNELS 4 +#define MAX_DIGITAL_CHANNELS 16 + +enum protocol_version { + PROTOCOL_V1, /* VS5000 */ + PROTOCOL_V2, /* DS1000 */ + PROTOCOL_V3, /* DS2000, DSO1000 */ +}; + +enum data_format { + /* Used by DS1000 versions up to 2.02, and VS5000 series */ + FORMAT_RAW, + /* Used by DS1000 versions from 2.04 onwards and all later series */ + FORMAT_IEEE488_2, +}; + +enum data_source { + DATA_SOURCE_LIVE, + DATA_SOURCE_MEMORY, + DATA_SOURCE_SEGMENTED, +}; + +struct rigol_ds_vendor { + const char *name; + const char *full_name; +}; + +struct rigol_ds_series { + const struct rigol_ds_vendor *vendor; + const char *name; + enum protocol_version protocol; + enum data_format format; + uint64_t max_timebase[2]; + uint64_t min_vdiv[2]; + int num_horizontal_divs; + int live_samples; + int buffer_samples; +}; + +struct rigol_ds_model { + const struct rigol_ds_series *series; + const char *name; + uint64_t min_timebase[2]; + unsigned int analog_channels; + bool has_digital; +}; + +enum wait_events { + WAIT_NONE, /* Don't wait */ + WAIT_TRIGGER, /* Wait for trigger (only live capture) */ + WAIT_BLOCK, /* Wait for block data (only when reading sample mem) */ + WAIT_STOP, /* Wait for scope stopping (only single shots) */ +}; /** Private, per-device-instance driver context. */ struct dev_context { - /* Device features */ - gboolean has_digital; + /* Device model */ + const struct rigol_ds_model *model; + enum data_format format; - /* Probe groups */ - struct sr_probe_group analog_groups[2]; - struct sr_probe_group digital_group; + /* Device properties */ + const uint64_t (*timebases)[2]; + uint64_t num_timebases; + const uint64_t (*vdivs)[2]; + uint64_t num_vdivs; + + /* Channel groups */ + struct sr_channel_group analog_groups[MAX_ANALOG_CHANNELS]; + struct sr_channel_group digital_group; /* Acquisition settings */ - GSList *enabled_analog_probes; - GSList *enabled_digital_probes; + GSList *enabled_analog_channels; + GSList *enabled_digital_channels; uint64_t limit_frames; void *cb_data; + enum data_source data_source; + uint64_t analog_frame_size; + uint64_t digital_frame_size; /* Device settings */ - gboolean analog_channels[2]; - gboolean digital_channels[16]; + gboolean analog_channels[MAX_ANALOG_CHANNELS]; + gboolean digital_channels[MAX_DIGITAL_CHANNELS]; + gboolean la_enabled; float timebase; - float vdiv[2]; - float vert_offset[2]; + float vdiv[MAX_ANALOG_CHANNELS]; + int vert_reference[MAX_ANALOG_CHANNELS]; + float vert_offset[MAX_ANALOG_CHANNELS]; char *trigger_source; float horiz_triggerpos; char *trigger_slope; - char *coupling[2]; + char *coupling[MAX_ANALOG_CHANNELS]; /* Operational state */ + + /* Number of frames received in total. */ uint64_t num_frames; - uint64_t num_frame_bytes; - struct sr_probe *channel_frame; + /* GSList entry for the current channel. */ + GSList *channel_entry; + /* Number of bytes received for current channel. */ + uint64_t num_channel_bytes; + /* Number of bytes of block header read */ + uint64_t num_header_bytes; + /* Number of bytes in current data block, if 0 block header expected */ + uint64_t num_block_bytes; + /* Number of data block bytes already read */ + uint64_t num_block_read; + /* What to wait for in *_receive */ + enum wait_events wait_event; + /* Trigger/block copying/stop waiting status */ + int wait_status; + /* Acq buffers used for reading from the scope and sending data to app */ + unsigned char *buffer; + float *data; }; +SR_PRIV int rigol_ds_config_set(const struct sr_dev_inst *sdi, const char *format, ...); +SR_PRIV int rigol_ds_capture_start(const struct sr_dev_inst *sdi); +SR_PRIV int rigol_ds_channel_start(const struct sr_dev_inst *sdi); SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data); -SR_PRIV int rigol_ds_send(const struct sr_dev_inst *sdi, const char *format, ...); SR_PRIV int rigol_ds_get_dev_cfg(const struct sr_dev_inst *sdi); #endif