X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fikalogic-scanalogic2%2Fprotocol.h;h=add5dda89553dfcff8b36e40693f4789a5fd8841;hb=625763e2c2b69f79b950ad0b0cd8b779500f5d95;hp=8f8faf548817cb61a95da2f2c8f58feaf8fd45b2;hpb=16e76baec9b1df806e46d4da61269375924ab950;p=libsigrok.git diff --git a/hardware/ikalogic-scanalogic2/protocol.h b/hardware/ikalogic-scanalogic2/protocol.h index 8f8faf54..add5dda8 100644 --- a/hardware/ikalogic-scanalogic2/protocol.h +++ b/hardware/ikalogic-scanalogic2/protocol.h @@ -20,32 +20,220 @@ #ifndef LIBSIGROK_HARDWARE_IKALOGIC_SCANALOGIC2_PROTOCOL_H #define LIBSIGROK_HARDWARE_IKALOGIC_SCANALOGIC2_PROTOCOL_H +#include +#include #include #include #include "libsigrok.h" #include "libsigrok-internal.h" -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "ikalogic-scanalogic2: " -#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 "ikalogic-scanalogic2" + +#define VENDOR_NAME "IKALOGIC" +#define MODEL_NAME "Scanalogic-2" + +#define USB_VID_PID "20a0.4123" +#define USB_INTERFACE 0 +#define USB_TIMEOUT 5000 + +#define USB_REQUEST_TYPE_IN (LIBUSB_REQUEST_TYPE_CLASS | \ + LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_IN) + +#define USB_REQUEST_TYPE_OUT (LIBUSB_REQUEST_TYPE_CLASS | \ + LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT) + +#define USB_HID_GET_REPORT 0x01 +#define USB_HID_SET_REPORT 0x09 +#define USB_HID_REPORT_TYPE_FEATURE 0x300 + +#define NUM_SAMPLERATES 11 +#define NUM_PROBES 4 + +#define TRIGGER_TYPES "rfc" + +/* + * Number of sample bytes and samples the device can acquire. Note that the + * vendor software can acquire 32736 sample bytes only but the device is capable + * to acquire up to 32766 sample bytes. + */ +#define MAX_DEV_SAMPLE_BYTES 32766 +#define MAX_DEV_SAMPLES (MAX_INT_SAMPLE_BYTES * 8) + +/* Number of sample bytes and samples the driver can acquire. */ +#define MAX_SAMPLE_BYTES (MAX_DEV_SAMPLE_BYTES - 1) +#define MAX_SAMPLES (MAX_SAMPLE_BYTES * 8) + +/* Maximum time that the trigger can be delayed in milliseconds. */ +#define MAX_AFTER_TRIGGER_DELAY 65000 + +#define PACKET_LENGTH 128 + +/* Number of sample bytes per packet where a sample byte contains 8 samples. */ +#define PACKET_NUM_SAMPLE_BYTES 124 + +/* Number of samples per packet. */ +#define PACKET_NUM_SAMPLES (PACKET_NUM_SAMPLE_BYTES * 8) + +#define DEFAULT_SAMPLERATE SR_KHZ(1.25) + +/* + * Time interval between the last status of available data received and the + * moment when the next status request will be sent in microseconds. + */ +#define WAIT_DATA_READY_INTERVAL 1500000 + +#define CMD_SAMPLE 0x01 +#define CMD_RESET 0x02 +#define CMD_IDLE 0x07 +#define CMD_INFO 0x0a + +#define TRIGGER_CHANNEL_ALL 0x00 +#define TRIGGER_CHANNEL_0 0x01 +#define TRIGGER_CHANNEL_1 0x02 +#define TRIGGER_CHANNEL_2 0x03 + +#define TRIGGER_TYPE_NEGEDGE 0x00 +#define TRIGGER_TYPE_POSEDGE 0x01 +#define TRIGGER_TYPE_ANYEDGE 0x02 +#define TRIGGER_TYPE_NONE 0x03 + +#define STATUS_DATA_READY 0x60 +#define STATUS_WAITING_FOR_TRIGGER 0x61 +#define STATUS_SAMPLING 0x62 +#define STATUS_DEVICE_READY 0x63 + +struct device_info { + /* Serial number of the device. */ + uint32_t serial; + + /* Major version of the firmware. */ + uint8_t fw_ver_major; + + /* Minor version of the firmware. */ + uint8_t fw_ver_minor; +}; + +enum { + STATE_IDLE = 0, + STATE_SAMPLE, + STATE_WAIT_DATA_READY, + STATE_RECEIVE_DATA, + STATE_RESET_AND_IDLE, + STATE_WAIT_DEVICE_READY +}; /** Private, per-device-instance driver context. */ struct dev_context { - /* Model-specific information */ + /* Current selected samplerate. */ + uint64_t samplerate; + + /* Device specific identifier for the current samplerate. */ + uint8_t samplerate_id; + + /* Current sampling limit. */ + uint64_t limit_samples; + + /* Calculated number of pre-trigger samples. */ + uint64_t pre_trigger_samples; + + /* Number of pre- and post-trigger sample bytes to acquire. */ + uint16_t pre_trigger_bytes; + uint16_t post_trigger_bytes; + + /* Device specific settings for the trigger. */ + uint8_t trigger_channel; + uint8_t trigger_type; + + unsigned int capture_ratio; + + /* Time that the trigger will be delayed in milliseconds. */ + uint16_t after_trigger_delay; + + void *cb_data; + + /* Array to provide an index based access to all probes. */ + const struct sr_probe *probes[NUM_PROBES]; + + struct libusb_transfer *xfer_in, *xfer_out; + + /* + * Buffer to store setup and payload data for incoming and outgoing + * transfers. + */ + uint8_t xfer_buf_in[LIBUSB_CONTROL_SETUP_SIZE + PACKET_LENGTH]; + uint8_t xfer_buf_out[LIBUSB_CONTROL_SETUP_SIZE + PACKET_LENGTH]; + + /* Pointers to the payload of incoming and outgoing transfers. */ + uint8_t *xfer_data_in, *xfer_data_out; + + /* Current state of the state machine */ + unsigned int state; + + /* Next state of the state machine. */ + unsigned int next_state; + + /* + * Locking variable to ensure that no status about available data will + * be requested until the last status was received. + */ + gboolean wait_data_ready_locked; + + /* + * Time when the last response about the status of available data was + * received. + */ + int64_t wait_data_ready_time; + + /* + * Indicates that stopping of the acquisition is currently in progress. + */ + gboolean stopping_in_progress; + + /* + * Buffer which contains the samples received from the device for each + * channel except the last one. The samples of the last channel will be + * processed directly after they will be received. + */ + uint8_t sample_buffer[NUM_PROBES - 1][MAX_DEV_SAMPLE_BYTES]; + + /* Expected number of sample packets for each channel. */ + uint16_t num_sample_packets; + + /* Number of samples already processed. */ + uint64_t samples_processed; + + /* Sample packet number that is currently processed. */ + uint16_t sample_packet; - /* Acquisition settings */ + /* Channel number that is currently processed. */ + uint8_t channel; - /* Operational state */ + /* Number of enabled probes. */ + unsigned int num_enabled_probes; - /* Temporary state across callbacks */ + /* Array to provide a sequential access to all enabled probe indices. */ + uint8_t probe_map[NUM_PROBES]; + /* Indicates whether a transfer failed. */ + gboolean transfer_error; }; SR_PRIV int ikalogic_scanalogic2_receive_data(int fd, int revents, void *cb_data); +SR_PRIV void sl2_receive_transfer_in(struct libusb_transfer *transfer); +SR_PRIV void sl2_receive_transfer_out(struct libusb_transfer *transfer); +SR_PRIV int sl2_set_samplerate(const struct sr_dev_inst *sdi, + uint64_t samplerate); +SR_PRIV int sl2_set_limit_samples(const struct sr_dev_inst *sdi, + uint64_t limit_samples); +SR_PRIV void sl2_configure_trigger(const struct sr_dev_inst *sdi); +SR_PRIV int sl2_set_capture_ratio(const struct sr_dev_inst *sdi, + uint64_t capture_ratio); +SR_PRIV int sl2_set_after_trigger_delay(const struct sr_dev_inst *sdi, + uint64_t after_trigger_delay); +SR_PRIV void sl2_calculate_trigger_samples(const struct sr_dev_inst *sdi); +SR_PRIV int sl2_get_device_info(struct sr_usb_dev_inst usb, + struct device_info *dev_info); +SR_PRIV int sl2_transfer_in(libusb_device_handle *dev_handle, uint8_t *data); +SR_PRIV int sl2_transfer_out(libusb_device_handle *dev_handle, uint8_t *data); #endif