1 /* 2 * This file is part of the libsigrok project. 3 * 4 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com> 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #ifndef LIBSIGROK_HARDWARE_PIPISTRELLO_OLS_PROTOCOL_H 21 #define LIBSIGROK_HARDWARE_PIPISTRELLO_OLS_PROTOCOL_H 22 23 #include <stdint.h> 24 #include <string.h> 25 #include <glib.h> 26 #include <ftdi.h> 27 #include <libsigrok/libsigrok.h> 28 #include "libsigrok-internal.h" 29 30 #define LOG_PREFIX "pipistrello-ols" 31 32 #define USB_VENDOR_ID 0x0403 33 #define USB_DEVICE_ID 0x6010 34 #define USB_IPRODUCT "Pipistrello LX45" 35 36 #define FTDI_BUF_SIZE (16 * 1024) 37 38 #define NUM_CHANNELS 32 39 #define NUM_TRIGGER_STAGES 4 40 #define CLOCK_RATE SR_MHZ(100) 41 #define MIN_NUM_SAMPLES 4 42 #define DEFAULT_SAMPLERATE SR_MHZ(100) 43 44 /* Command opcodes */ 45 #define CMD_RESET 0x00 46 #define CMD_RUN 0x01 47 #define CMD_TESTMODE 0x03 48 #define CMD_ID 0x02 49 #define CMD_METADATA 0x04 50 #define CMD_SET_DIVIDER 0x80 51 #define CMD_SET_FLAGS 0x82 52 #define CMD_CAPTURE_DELAYCOUNT 0x83 53 #define CMD_CAPTURE_READCOUNT 0x84 54 #define CMD_SET_TRIGGER_MASK 0xc0 55 #define CMD_SET_TRIGGER_VALUE 0xc1 56 #define CMD_SET_TRIGGER_CONFIG 0xc2 57 #define CMD_SET_TRIGGER_EDGE 0xc3 58 59 /* Trigger config */ 60 #define TRIGGER_START (1 << 3) 61 62 /* Bitmasks for CMD_FLAGS */ 63 /* 12-13 unused, 14-15 RLE mode (we hardcode mode 0). */ 64 #define FLAG_INTERNAL_TEST_MODE (1 << 11) 65 #define FLAG_EXTERNAL_TEST_MODE (1 << 10) 66 #define FLAG_SWAP_CHANNELS (1 << 9) 67 #define FLAG_RLE (1 << 8) 68 #define FLAG_SLOPE_FALLING (1 << 7) 69 #define FLAG_CLOCK_EXTERNAL (1 << 6) 70 #define FLAG_CHANNELGROUP_4 (1 << 5) 71 #define FLAG_CHANNELGROUP_3 (1 << 4) 72 #define FLAG_CHANNELGROUP_2 (1 << 3) 73 #define FLAG_CHANNELGROUP_1 (1 << 2) 74 #define FLAG_FILTER (1 << 1) 75 #define FLAG_DEMUX (1 << 0) 76 77 struct dev_context { 78 struct ftdi_context *ftdic; 79 uint8_t *ftdi_buf; 80 81 int max_channels; 82 uint32_t max_samplebytes; 83 uint32_t max_samplerate; 84 uint32_t protocol_version; 85 86 uint64_t cur_samplerate; 87 uint32_t cur_samplerate_divider; 88 uint32_t max_samples; 89 uint64_t limit_samples; 90 uint64_t capture_ratio; 91 int trigger_at; 92 uint32_t channel_mask; 93 uint32_t trigger_mask[NUM_TRIGGER_STAGES]; 94 uint32_t trigger_value[NUM_TRIGGER_STAGES]; 95 uint32_t trigger_edge[NUM_TRIGGER_STAGES]; 96 int num_stages; 97 uint16_t flag_reg; 98 99 unsigned int num_transfers; 100 unsigned int num_samples; 101 int num_bytes; 102 int cnt_bytes; 103 unsigned int cnt_samples; 104 int cnt_samples_rle; 105 106 unsigned int rle_count; 107 unsigned char sample[4]; 108 unsigned char tmp_sample[4]; 109 unsigned char tmp_sample2[4]; 110 unsigned char *raw_sample_buf; 111 }; 112 113 SR_PRIV extern const char *p_ols_channel_names[]; 114 SR_PRIV int write_shortcommand(struct dev_context *devc, uint8_t command); 115 SR_PRIV int write_longcommand(struct dev_context *devc, uint8_t command, uint8_t *data); 116 SR_PRIV int p_ols_open(struct dev_context *devc); 117 SR_PRIV int p_ols_close(struct dev_context *devc); 118 SR_PRIV void pols_channel_mask(const struct sr_dev_inst *sdi); 119 SR_PRIV int pols_convert_trigger(const struct sr_dev_inst *sdi); 120 SR_PRIV struct sr_dev_inst *p_ols_get_metadata(uint8_t *buf, int bytes_read, struct dev_context *devc); 121 SR_PRIV int p_ols_set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate); 122 SR_PRIV int p_ols_receive_data(int fd, int revents, void *cb_data); 123 124 #endif 125