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*/ |