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