Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
360 | f9daq | 1 | /** |
2 | * $Id: fpga_osc.h 881 2013-12-16 05:37:34Z rp_jmenart $ |
||
3 | * |
||
4 | * @brief Red Pitaya Oscilloscope FPGA controller. |
||
5 | * |
||
6 | * @Author Jure Menart <juremenart@gmail.com> |
||
7 | * |
||
8 | * (c) Red Pitaya http://www.redpitaya.com |
||
9 | * |
||
10 | * This part of code is written in C programming language. |
||
11 | * Please visit http://en.wikipedia.org/wiki/C_(programming_language) |
||
12 | * for more details on the language used herein. |
||
13 | */ |
||
14 | |||
15 | #ifndef __FPGA_OSC_H |
||
16 | #define __FPGA_OSC_H |
||
17 | |||
18 | #include <stdint.h> |
||
19 | |||
20 | /** @defgroup fpga_osc_h fpga_osc_h |
||
21 | * @{ |
||
22 | */ |
||
23 | |||
24 | /** Base OSC FPGA address */ |
||
25 | #define OSC_FPGA_BASE_ADDR 0x40100000 |
||
26 | /** Base OSC FPGA core size */ |
||
27 | #define OSC_FPGA_BASE_SIZE 0x30000 |
||
28 | /** OSC FPGA input signal buffer length */ |
||
29 | #define OSC_FPGA_SIG_LEN (16*1024) |
||
30 | /** OSC FPGA ARM bit in configuration register */ |
||
31 | #define OSC_FPGA_CONF_ARM_BIT 1 |
||
32 | /** OSC FPGA reset bit in configuration register */ |
||
33 | #define OSC_FPGA_CONF_RST_BIT 2 |
||
34 | |||
35 | /** OSC FPGA trigger source register mask */ |
||
36 | #define OSC_FPGA_TRIG_SRC_MASK 0x00000007 |
||
37 | /** OSC FPGA Channel A threshold register mask */ |
||
38 | #define OSC_FPGA_CHA_THR_MASK 0x00003fff |
||
39 | /** OSC FPGA Channel B threshold register mask */ |
||
40 | #define OSC_FPGA_CHB_THR_MASK 0x00003fff |
||
41 | /** OSC FPGA trigger delay register register mask */ |
||
42 | #define OSC_FPGA_TRIG_DLY_MASK 0xffffffff |
||
43 | /** OSC FPGA data decimation mask */ |
||
44 | #define OSC_FPGA_DATA_DEC_MASK 0x0001ffff |
||
45 | |||
46 | /** OSC FPGA Channel A input signal buffer offset */ |
||
47 | #define OSC_FPGA_CHA_OFFSET 0x10000 |
||
48 | /** OSC FPGA Channel B input signal buffer offset */ |
||
49 | #define OSC_FPGA_CHB_OFFSET 0x20000 |
||
50 | |||
51 | /** @brief OSC FPGA registry structure. |
||
52 | * |
||
53 | * This structure is direct image of physical FPGA memory. When accessing it all |
||
54 | * reads/writes are performed directly from/to FPGA OSC core. |
||
55 | */ |
||
56 | typedef struct osc_fpga_reg_mem_s { |
||
57 | /** @brief Offset 0x00 - configuration register |
||
58 | * |
||
59 | * Configuration register (offset 0x00): |
||
60 | * bit [0] - arm_trigger |
||
61 | * bit [1] - rst_wr_state_machine |
||
62 | * bits [31:2] - reserved |
||
63 | */ |
||
64 | uint32_t conf; |
||
65 | |||
66 | /** @brief Offset 0x04 - trigger source register |
||
67 | * |
||
68 | * Trigger source register (offset 0x04): |
||
69 | * bits [ 2 : 0] - trigger source: |
||
70 | * 1 - trig immediately |
||
71 | * 2 - ChA positive edge |
||
72 | * 3 - ChA negative edge |
||
73 | * 4 - ChB positive edge |
||
74 | * 5 - ChB negative edge |
||
75 | * 6 - External trigger 0 |
||
76 | * 7 - External trigger 1 |
||
77 | * bits [31 : 3] -reserved |
||
78 | */ |
||
79 | uint32_t trig_source; |
||
80 | |||
81 | /** @brief Offset 0x08 - Channel A threshold register |
||
82 | * |
||
83 | * Channel A threshold register (offset 0x08): |
||
84 | * bits [13: 0] - ChA threshold |
||
85 | * bits [31:14] - reserved |
||
86 | */ |
||
87 | uint32_t cha_thr; |
||
88 | |||
89 | /** @brief Offset 0x0C - Channel B threshold register |
||
90 | * |
||
91 | * Channel B threshold register (offset 0x0C): |
||
92 | * bits [13: 0] - ChB threshold |
||
93 | * bits [31:14] - reserved |
||
94 | */ |
||
95 | uint32_t chb_thr; |
||
96 | |||
97 | /** @brief Offset 0x10 - After trigger delay register |
||
98 | * |
||
99 | * After trigger delay register (offset 0x10) |
||
100 | * bits [31: 0] - trigger delay |
||
101 | * 32 bit number - how many decimated samples should be stored into a buffer. |
||
102 | * (max 16k samples) |
||
103 | */ |
||
104 | uint32_t trigger_delay; |
||
105 | |||
106 | /** @brief Offset 0x14 - Data decimation register |
||
107 | * |
||
108 | * Data decimation register (offset 0x14): |
||
109 | * bits [16: 0] - decimation factor, legal values: |
||
110 | * 1, 8, 64, 1024, 8192 65536 |
||
111 | * If other values are written data is undefined |
||
112 | * bits [31:17] - reserved |
||
113 | */ |
||
114 | uint32_t data_dec; |
||
115 | |||
116 | /** @brief Offset 0x18 - Current write pointer register |
||
117 | * |
||
118 | * Current write pointer register (offset 0x18), read only: |
||
119 | * bits [13: 0] - current write pointer |
||
120 | * bits [31:14] - reserved |
||
121 | */ |
||
122 | uint32_t wr_ptr_cur; |
||
123 | /** @brief Offset 0x1C - Trigger write pointer register |
||
124 | * |
||
125 | * Trigger write pointer register (offset 0x1C), read only: |
||
126 | * bits [13: 0] - trigger pointer (pointer where trigger was detected) |
||
127 | * bits [31:14] - reserved |
||
128 | */ |
||
129 | uint32_t wr_ptr_trigger; |
||
130 | |||
131 | /** @brief ChA & ChB hysteresis - both of the format: |
||
132 | * bits [13: 0] - hysteresis threshold |
||
133 | * bits [31:14] - reserved |
||
134 | */ |
||
135 | uint32_t cha_hystersis; |
||
136 | uint32_t chb_hystersis; |
||
137 | |||
138 | /** @brief |
||
139 | * bits [0] - enable signal average at decimation |
||
140 | * bits [31:1] - reserved |
||
141 | */ |
||
142 | uint32_t other; |
||
143 | |||
144 | uint32_t reseved; |
||
145 | |||
146 | /** @brief ChA Equalization filter |
||
147 | * bits [17:0] - AA coefficient (pole) |
||
148 | * bits [31:18] - reserved |
||
149 | */ |
||
150 | uint32_t cha_filt_aa; |
||
151 | |||
152 | /** @brief ChA Equalization filter |
||
153 | * bits [24:0] - BB coefficient (zero) |
||
154 | * bits [31:25] - reserved |
||
155 | */ |
||
156 | uint32_t cha_filt_bb; |
||
157 | |||
158 | /** @brief ChA Equalization filter |
||
159 | * bits [24:0] - KK coefficient (gain) |
||
160 | * bits [31:25] - reserved |
||
161 | */ |
||
162 | uint32_t cha_filt_kk; |
||
163 | |||
164 | /** @brief ChA Equalization filter |
||
165 | * bits [24:0] - PP coefficient (pole) |
||
166 | * bits [31:25] - reserved |
||
167 | */ |
||
168 | uint32_t cha_filt_pp; |
||
169 | |||
170 | |||
171 | |||
172 | |||
173 | /** @brief ChB Equalization filter |
||
174 | * bits [17:0] - AA coefficient (pole) |
||
175 | * bits [31:18] - reserved |
||
176 | */ |
||
177 | uint32_t chb_filt_aa; |
||
178 | |||
179 | /** @brief ChB Equalization filter |
||
180 | * bits [24:0] - BB coefficient (zero) |
||
181 | * bits [31:25] - reserved |
||
182 | */ |
||
183 | uint32_t chb_filt_bb; |
||
184 | |||
185 | /** @brief ChB Equalization filter |
||
186 | * bits [24:0] - KK coefficient (gain) |
||
187 | * bits [31:25] - reserved |
||
188 | */ |
||
189 | uint32_t chb_filt_kk; |
||
190 | |||
191 | /** @brief ChB Equalization filter |
||
192 | * bits [24:0] - PP coefficient (pole) |
||
193 | * bits [31:25] - reserved |
||
194 | */ |
||
195 | uint32_t chb_filt_pp; |
||
196 | |||
197 | /* ChA & ChB data - 14 LSB bits valid starts from 0x10000 and |
||
198 | * 0x20000 and are each 16k samples long */ |
||
199 | } osc_fpga_reg_mem_t; |
||
200 | |||
201 | /** @} */ |
||
202 | |||
203 | // TODO: Move to a shared folder and share with scope & spectrum. |
||
204 | /** Equalization & shaping filter coefficients */ |
||
205 | typedef struct { |
||
206 | uint32_t aa; |
||
207 | uint32_t bb; |
||
208 | uint32_t pp; |
||
209 | uint32_t kk; |
||
210 | } ecu_shape_filter_t; |
||
211 | |||
212 | int osc_fpga_init(void); |
||
213 | int osc_fpga_exit(void); |
||
214 | |||
215 | void get_equ_shape_filter(ecu_shape_filter_t *filt, uint32_t equal, |
||
216 | uint32_t shaping, uint32_t gain); |
||
217 | int osc_fpga_update_params(int trig_imm, int trig_source, int trig_edge, |
||
218 | float trig_delay, float trig_level, int time_range, |
||
219 | int equal, int shaping, int gain1, int gain2); |
||
220 | int osc_fpga_reset(void); |
||
221 | int osc_fpga_arm_trigger(void); |
||
222 | int osc_fpga_set_trigger(uint32_t trig_source); |
||
223 | int osc_fpga_set_trigger_delay(uint32_t trig_delay); |
||
224 | |||
225 | /* Returns 0 if no trigger, 1 if trigger */ |
||
226 | int osc_fpga_triggered(void); |
||
227 | |||
228 | /* Returns pointer to the ChA and ChB signals (of length OSC_FPGA_SIG_LEN) */ |
||
229 | int osc_fpga_get_sig_ptr(int **cha_signal, int **chb_signal); |
||
230 | |||
231 | /* Returns signal pointers from the FPGA */ |
||
232 | int osc_fpga_get_wr_ptr(int *wr_ptr_curr, int *wr_ptr_trig); |
||
233 | |||
234 | /* Returnes signal content */ |
||
235 | /* various constants */ |
||
236 | extern const float c_osc_fpga_smpl_freq; |
||
237 | extern const float c_osc_fpga_smpl_period; |
||
238 | |||
239 | /* helper conversion functions */ |
||
240 | /* Convert correct value for FPGA trigger source from trig_immediately, |
||
241 | * trig_source and trig_edge from application params. |
||
242 | */ |
||
243 | int osc_fpga_cnv_trig_source(int trig_imm, int trig_source, int trig_edge); |
||
244 | /* Converts time_range parameter (0-5) to decimation factor */ |
||
245 | int osc_fpga_cnv_time_range_to_dec(int time_range); |
||
246 | /* Converts time in [s] to ADC samples (depends on decimation) */ |
||
247 | int osc_fpga_cnv_time_to_smpls(float time, int dec_factor); |
||
248 | /* Converts voltage in [V] to ADC counts */ |
||
249 | int osc_fpga_cnv_v_to_cnt(float voltage); |
||
250 | /* Converts ADC ounts to [V] */ |
||
251 | float osc_fpga_cnv_cnt_to_v(int cnts); |
||
252 | |||
253 | /* Debug - dump to stderr current parameter settings (leave out data) */ |
||
254 | void osc_fpga_dump_regs(void); |
||
255 | |||
256 | /* debugging - will be removed */ |
||
257 | extern osc_fpga_reg_mem_t *g_osc_fpga_reg_mem; |
||
258 | extern int g_osc_fpga_mem_fd; |
||
259 | int __osc_fpga_cleanup_mem(void); |
||
260 | |||
261 | #endif /* __FPGA_OSC_H*/ |