e164b9fa1a14bb62b86cf83d01b25c5bcf583246
[libsigrok.git] / src / hardware / openbench-logic-sniffer / protocol.h
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_OPENBENCH_LOGIC_SNIFFER_PROTOCOL_H
21 #define LIBSIGROK_HARDWARE_OPENBENCH_LOGIC_SNIFFER_PROTOCOL_H
22
23 #include <stdint.h>
24 #include <string.h>
25 #include <glib.h>
26 #include <libsigrok/libsigrok.h>
27 #include "libsigrok-internal.h"
28
29 #define LOG_PREFIX "openbench-logic-sniffer"
30
31 #define NUM_TRIGGER_STAGES         4
32 #define CLOCK_RATE                 SR_MHZ(100)
33 #define MIN_NUM_SAMPLES            4
34 #define DEFAULT_SAMPLERATE         SR_KHZ(200)
35
36 /* Command opcodes */
37 #define CMD_RESET                     0x00
38 #define CMD_ARM_BASIC_TRIGGER         0x01
39 #define CMD_ID                        0x02
40 #define CMD_METADATA                  0x04
41 #define CMD_FINISH_NOW                0x05 /* extension of Demon Core */
42 #define CMD_QUERY_INPUT_DATA          0x06 /* extension of Demon Core */
43 #define CMD_QUERY_CAPTURE_STATE       0x07 /* extension of Demon Core */
44 #define CMD_RETURN_CAPTURE_DATA       0x08 /* extension of Demon Core */
45 #define CMD_ARM_ADVANCED_TRIGGER      0x0F /* extension of Demon Core */
46 #define CMD_XON                       0x11
47 #define CMD_XOFF                      0x13
48 #define CMD_SET_DIVIDER               0x80
49 #define CMD_CAPTURE_SIZE              0x81
50 #define CMD_SET_FLAGS                 0x82
51 #define CMD_CAPTURE_DELAYCOUNT        0x83 /* extension of Pepino */
52 #define CMD_CAPTURE_READCOUNT         0x84 /* extension of Pepino */
53 #define CMD_SET_ADVANCED_TRIG_SEL     0x9E /* extension of Demon Core */
54 #define CMD_SET_ADVANCED_TRIG_WRITE   0x9F /* extension of Demon Core */
55 #define CMD_SET_BASIC_TRIGGER_MASK0   0xC0 /* 4 stages: 0xC0, 0xC4, 0xC8, 0xCC */
56 #define CMD_SET_BASIC_TRIGGER_VALUE0  0xC1 /* 4 stages: 0xC1, 0xC5, 0xC9, 0xCD */
57 #define CMD_SET_BASIC_TRIGGER_CONFIG0 0xC2 /* 4 stages: 0xC2, 0xC6, 0xCA, 0xCE */
58
59 /* Metadata tokens */
60 #define METADATA_TOKEN_END                    0x0
61 #define METADATA_TOKEN_DEVICE_NAME            0x1
62 #define METADATA_TOKEN_FPGA_VERSION           0x2
63 #define METADATA_TOKEN_ANCILLARY_VERSION      0x3
64 #define METADATA_TOKEN_NUM_PROBES_LONG        0x20
65 #define METADATA_TOKEN_SAMPLE_MEMORY_BYTES    0x21
66 #define METADATA_TOKEN_DYNAMIC_MEMORY_BYTES   0x22
67 #define METADATA_TOKEN_MAX_SAMPLE_RATE_HZ     0x23
68 #define METADATA_TOKEN_PROTOCOL_VERSION_LONG  0x24
69 #define METADATA_TOKEN_CAPABILITIES           0x25 /* not implemented in Demon Core v3.07 */
70 #define METADATA_TOKEN_NUM_PROBES_SHORT       0x40
71 #define METADATA_TOKEN_PROTOCOL_VERSION_SHORT 0x41
72
73 /* Device config flags */
74 #define DEVICE_FLAG_IS_DEMON_CORE (1 << 0)
75
76 /* Basic Trigger Config */
77 #define TRIGGER_START              (1 << 3)
78
79 /* Bit mask used for "set flags" command (0x82) */
80 /* Take care about bit positions in diagrams, they are inverted. */
81 #define CAPTURE_FLAG_RLEMODE1            (1 << 15)
82 #define CAPTURE_FLAG_RLEMODE0            (1 << 14)
83 #define CAPTURE_FLAG_RESERVED1           (1 << 13)
84 #define CAPTURE_FLAG_RESERVED0           (1 << 12)
85 #define CAPTURE_FLAG_INTERNAL_TEST_MODE  (1 << 11)
86 #define CAPTURE_FLAG_EXTERNAL_TEST_MODE  (1 << 10)
87 #define CAPTURE_FLAG_SWAP_CHANNELS       (1 << 9)
88 #define CAPTURE_FLAG_RLE                 (1 << 8)
89 #define CAPTURE_FLAG_INVERT_EXT_CLOCK    (1 << 7)
90 #define CAPTURE_FLAG_CLOCK_EXTERNAL      (1 << 6)
91 #define CAPTURE_FLAG_DISABLE_CHANGROUP_4 (1 << 5)
92 #define CAPTURE_FLAG_DISABLE_CHANGROUP_3 (1 << 4)
93 #define CAPTURE_FLAG_DISABLE_CHANGROUP_2 (1 << 3)
94 #define CAPTURE_FLAG_DISABLE_CHANGROUP_1 (1 << 2)
95 #define CAPTURE_FLAG_NOISE_FILTER        (1 << 1)
96 #define CAPTURE_FLAG_DEMUX               (1 << 0)
97
98 /* Capture context magic numbers */
99 #define OLS_NO_TRIGGER (-1)
100
101 struct dev_context {
102         /* constant device properties: */
103         int max_channels;
104         uint32_t max_samples;
105         uint32_t max_samplerate;
106         uint32_t protocol_version;
107         uint16_t device_flags;
108
109         /* acquisition-related properties: */
110         uint64_t cur_samplerate;
111         uint32_t cur_samplerate_divider;
112         uint64_t limit_samples;
113         uint64_t capture_ratio;
114         int trigger_at_smpl;
115         uint32_t channel_mask;
116         uint32_t trigger_mask[NUM_TRIGGER_STAGES];
117         uint32_t trigger_value[NUM_TRIGGER_STAGES];
118         int num_stages;
119         uint16_t capture_flags;
120
121         unsigned int num_transfers;
122         unsigned int num_samples;
123         int num_bytes;
124         int cnt_bytes;
125         int cnt_samples;
126         int cnt_samples_rle;
127
128         unsigned int rle_count;
129         unsigned char sample[4];
130         unsigned char tmp_sample[4];
131         unsigned char *raw_sample_buf;
132 };
133
134 SR_PRIV extern const char *ols_channel_names[];
135
136 SR_PRIV int send_shortcommand(struct sr_serial_dev_inst *serial,
137                 uint8_t command);
138 SR_PRIV int send_longcommand(struct sr_serial_dev_inst *serial,
139                 uint8_t command, uint8_t *data);
140 SR_PRIV int ols_send_reset(struct sr_serial_dev_inst *serial);
141 SR_PRIV void ols_channel_mask(const struct sr_dev_inst *sdi);
142 SR_PRIV int ols_convert_trigger(const struct sr_dev_inst *sdi);
143 SR_PRIV struct dev_context *ols_dev_new(void);
144 SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial);
145 SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi,
146                 uint64_t samplerate);
147 SR_PRIV void abort_acquisition(const struct sr_dev_inst *sdi);
148 SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data);
149
150 #endif