X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhantek-4032l%2Fprotocol.h;h=b5017ed23000ff8905161c7a595761f3ace07b5d;hb=2da5c95f3dc6ad0c9067e23c46ae643958fca015;hp=732b9f9bef27de428a27db20f77679534709ca00;hpb=6a25fa42388fa3ddf7f519c7d1f6b641b9d6cf6f;p=libsigrok.git diff --git a/src/hardware/hantek-4032l/protocol.h b/src/hardware/hantek-4032l/protocol.h index 732b9f9b..b5017ed2 100644 --- a/src/hardware/hantek-4032l/protocol.h +++ b/src/hardware/hantek-4032l/protocol.h @@ -1,7 +1,9 @@ /* * This file is part of the libsigrok project. * - * Copyright (C) 2016 Andreas Zschunke + * Copyright (C) 2016 Andreas Zschunke + * Copyright (C) 2017 Andrej Valek + * Copyright (C) 2017 Uwe Hermann * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,23 +24,111 @@ #include #include +#include #include #include "libsigrok-internal.h" #define LOG_PREFIX "hantek-4032l" -/** Private, per-device-instance driver context. */ -struct dev_context { - /* Model-specific information */ +#define H4032L_USB_VENDOR 0x04b5 +#define H4032L_USB_PRODUCT 0x4032 + +#define H4032L_CMD_PKT_MAGIC 0x017f +#define H4032L_STATUS_PACKET_MAGIC 0x2B1A037F +#define H4032L_START_PACKET_MAGIC 0x2B1A027F +#define H4032L_END_PACKET_MAGIC 0x4D3C037F + +enum h4032l_trigger_edge_type { + H4032L_TRIGGER_EDGE_TYPE_RISE = 0, + H4032L_TRIGGER_EDGE_TYPE_FALL, + H4032L_TRIGGER_EDGE_TYPE_TOGGLE, + H4032L_TRIGGER_EDGE_TYPE_DISABLED +}; + +enum h4032l_trigger_data_range_type { + H4032L_TRIGGER_DATA_RANGE_TYPE_MAX = 0, + H4032L_TRIGGER_DATA_RANGE_TYPE_MIN_OR_MAX, + H4032L_TRIGGER_DATA_RANGE_TYPE_OUT_OF_RANGE, + H4032L_TRIGGER_DATA_RANGE_TYPE_WITHIN_RANGE +}; + +enum h4032l_trigger_time_range_type { + H4032L_TRIGGER_TIME_RANGE_TYPE_MAX = 0, + H4032L_TRIGGER_TIME_RANGE_TYPE_MIN_OR_MAX, + H4032L_TRIGGER_TIME_RANGE_TYPE_OUT_OF_RANGE, + H4032L_TRIGGER_TIME_RANGE_TYPE_WITHIN_RANGE +}; - /* Acquisition settings */ +enum h4032l_trigger_data_selection { + H4032L_TRIGGER_DATA_SELECTION_NEXT = 0, + H4032L_TRIGGER_DATA_SELECTION_CURRENT, + H4032L_TRIGGER_DATA_SELECTION_PREV +}; - /* Operational state */ +enum h4032l_status { + H4032L_STATUS_IDLE, + H4032L_STATUS_CMD_CONFIGURE, + H4032L_STATUS_CMD_STATUS, + H4032L_STATUS_RESPONSE_STATUS, + H4032L_STATUS_RESPONSE_STATUS_RETRY, + H4032L_STATUS_RESPONSE_STATUS_CONTINUE, + H4032L_STATUS_CMD_GET, + H4032L_STATUS_FIRST_TRANSFER, + H4032L_STATUS_TRANSFER, +}; - /* Temporary state across callbacks */ +struct __attribute__((__packed__)) h4032l_trigger { + struct { + uint32_t edge_signal:5; + uint32_t edge_type:2; + uint32_t :1; + uint32_t data_range_type:2; + uint32_t time_range_type:2; + uint32_t data_range_enabled:1; + uint32_t time_range_enabled:1; + uint32_t :2; + uint32_t data_sel:2; + uint32_t combined_enabled:1; + } flags; + uint32_t data_range_min; + uint32_t data_range_max; + uint32_t time_range_min; + uint32_t time_range_max; + uint32_t data_range_mask; + uint32_t combine_mask; + uint32_t combine_data; +}; +struct __attribute__((__packed__)) h4032l_cmd_pkt { + uint16_t magic; /* 0x017f */ + uint8_t sample_rate; + struct { + uint8_t enable_trigger1:1; + uint8_t enable_trigger2:1; + uint8_t trigger_and_logic:1; + } trig_flags; + uint16_t pwm_a; + uint16_t pwm_b; + uint16_t reserved; + uint32_t sample_size; /* Sample depth in bits per channel, 2k-64M, must be multiple of 512. */ + uint32_t pre_trigger_size; /* Pretrigger buffer depth in bits, must be < sample_size. */ + struct h4032l_trigger trigger[2]; + uint16_t cmd; +}; + +struct dev_context { + enum h4032l_status status; + uint32_t remaining_samples; + struct h4032l_cmd_pkt cmd_pkt; + struct libusb_transfer *usb_transfer; + uint8_t buffer[512]; + uint64_t capture_ratio; }; -SR_PRIV int hantek_4032l_receive_data(int fd, int revents, void *cb_data); +SR_PRIV int h4032l_receive_data(int fd, int revents, void *cb_data); +SR_PRIV uint16_t h4032l_voltage2pwm(double voltage); +SR_PRIV void LIBUSB_CALL h4032l_usb_callback(struct libusb_transfer *transfer); +SR_PRIV int h4032l_start(const struct sr_dev_inst *sdi); +SR_PRIV int h4032l_dev_open(struct sr_dev_inst *sdi); #endif