esp-sdr-zephyr
Raw I/Q receive and transmit on the ESP32-S3/C6 Wi-Fi radio, for Zephyr
Loading...
Searching...
No Matches
esp_sdr_ring.h
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: GPL-3.0-or-later
3 */
4
13
14#ifndef ESP_SDR_ESP_SDR_RING_H_
15#define ESP_SDR_ESP_SDR_RING_H_
16
17#include <stdbool.h>
18#include <stddef.h>
19#include <stdint.h>
20
21#include <esp_sdr/esp_sdr.h>
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
31
33#define ESP_SDR_RING_RATE_HZ 16000000U
34
36#define ESP_SDR_RING_DECIM_MIN 64U
37#define ESP_SDR_RING_DECIM_MAX 1024U
38
40#define ESP_SDR_RING_FULL_SCALE 16384
41
50#define ESP_SDR_RING_DECIM_BOX4 4U
51#define ESP_SDR_RING_BOX4_FULL_SCALE 8192
52
65#define ESP_SDR_RING_DECIM_RAW 1U
66#define ESP_SDR_RING_RAW_FULL_SCALE 32768
67#define ESP_SDR_RING_RAW_HISTORY 64U
68
75typedef void (*esp_sdr_ring_sink_t)(void *user, const int16_t *i, const int16_t *q, size_t n,
76 uint64_t index);
77
83 unsigned int decim;
90 void *user;
106 uint32_t unit_pairs;
119};
120
122#define ESP_SDR_RING_UNIT_DEFAULT 12288U
124#define ESP_SDR_RING_UNIT_MIN 1024U
125
140
143 uint64_t pairs, samples;
144 uint64_t elapsed_us;
146 uint32_t units, abandoned, lost_pairs;
148 uint32_t late_max;
150 uint32_t slice_max, cycles_x100;
154 uint32_t stalls;
156 uint32_t irq_windows;
158 uint32_t irq_lines;
159 enum esp_sdr_ring_status status;
160 uint32_t detail;
161};
162
182int esp_sdr_ring_run(const struct esp_sdr_ring_cfg *cfg, struct esp_sdr_ring_stats *stats);
183
195
197void esp_sdr_ring_wmac_release(bool was_enabled);
198
200 uint32_t pairs, samples;
201 /*
202 * Filter cycles per input pair x 100: all, and unpack, stage 1, stage 2, sink. Raw mode:
203 * unpack, the sink, nothing, the history kept for the sink.
204 */
205 uint32_t cycles_x100, stage_x100[4];
206};
207
214int esp_sdr_ring_bench(const struct esp_sdr_ring_cfg *cfg, unsigned int units,
215 struct esp_sdr_ring_bench_result *res);
216
226
229
239bool esp_sdr_ring_now(uint64_t *pair);
240
254
256typedef void (*esp_sdr_ring_gen_t)(void *user, uint32_t *dst, uint64_t index, uint32_t n);
257
262uint32_t *esp_sdr_ring_burst_buf(size_t *words);
263
279int esp_sdr_ring_burst_arm(uint64_t end_pair, uint64_t limit_pair, esp_sdr_ring_gen_t gen,
280 void *user, uint32_t from, uint32_t words);
281
286bool esp_sdr_ring_burst_fire(uint64_t at_pair);
287
290
293
296 uint32_t fired, cancelled, timeouts, skipped;
298 uint32_t late, late_tx;
300 uint32_t arm_late;
302 int32_t fire_last_pairs, fire_min_pairs, fire_max_pairs;
304 int32_t stop_last_pairs, ready_last_pairs, seen_last_pairs, rx_back_last_pairs;
306 uint32_t dac_last_cyc;
308 int32_t ready_max_pairs, seen_max_pairs;
309 uint32_t window_max_cyc;
311 uint32_t gen_left_max;
312};
313
314void esp_sdr_ring_burst_get_stats(struct esp_sdr_ring_burst_stats *stats);
315
317
319
320#ifdef __cplusplus
321}
322#endif
323
324#endif /* ESP_SDR_ESP_SDR_RING_H_ */
ESP-SDR: raw I/Q receive and transmit on the ESP32-S3 Wi-Fi radio.
bool esp_sdr_ring_burst_fire(uint64_t at_pair)
Play the armed burst with its first sample at at_pair (at once if that has passed).
bool esp_sdr_ring_burst_busy(void)
uint32_t * esp_sdr_ring_burst_buf(size_t *words)
The burst bank, the CPUs' to write while no burst is armed and outside its waveform's [from,...
void esp_sdr_ring_burst_cancel(void)
Drop the armed burst; the capture goes on or restarts.
void(* esp_sdr_ring_gen_t)(void *user, uint32_t *dst, uint64_t index, uint32_t n)
Definition esp_sdr_ring.h:256
int esp_sdr_ring_burst_arm(uint64_t end_pair, uint64_t limit_pair, esp_sdr_ring_gen_t gen, void *user, uint32_t from, uint32_t words)
Arm a burst (from another CPU than the run's).
int esp_sdr_ring_run(const struct esp_sdr_ring_cfg *cfg, struct esp_sdr_ring_stats *stats)
Stream until esp_sdr_ring_stop() or a ring failure.
void(* esp_sdr_ring_sink_t)(void *user, const int16_t *i, const int16_t *q, size_t n, uint64_t index)
Definition esp_sdr_ring.h:75
esp_sdr_ring_status
Definition esp_sdr_ring.h:127
void esp_sdr_ring_stop(void)
Ask a running esp_sdr_ring_run() to return; safe from any thread or ISR.
int esp_sdr_ring_bench(const struct esp_sdr_ring_cfg *cfg, unsigned int units, struct esp_sdr_ring_bench_result *res)
Time the filter on synthetic data in bank 0, the engine idle.
void esp_sdr_ring_wmac_release(bool was_enabled)
Undo esp_sdr_ring_wmac_hold() on the same CPU.
bool esp_sdr_ring_wmac_hold(void)
Hold off the Wi-Fi MAC interrupt on the calling CPU.
bool esp_sdr_ring_now(uint64_t *pair)
The running ring's position, from any CPU.
bool esp_sdr_ring_active(void)
@ ESP_SDR_RING_LENGTH
Definition esp_sdr_ring.h:138
@ ESP_SDR_RING_START
Definition esp_sdr_ring.h:134
@ ESP_SDR_RING_AGE
Definition esp_sdr_ring.h:132
@ ESP_SDR_RING_END
Definition esp_sdr_ring.h:136
@ ESP_SDR_RING_LATE
Definition esp_sdr_ring.h:130
Definition esp_sdr_ring.h:199
Definition esp_sdr_ring.h:295
uint32_t gen_left_max
Definition esp_sdr_ring.h:311
int32_t fire_last_pairs
Definition esp_sdr_ring.h:302
uint32_t arm_late
Definition esp_sdr_ring.h:300
uint32_t late
Definition esp_sdr_ring.h:298
int32_t stop_last_pairs
Definition esp_sdr_ring.h:304
int32_t ready_max_pairs
Definition esp_sdr_ring.h:308
uint32_t dac_last_cyc
Definition esp_sdr_ring.h:306
Definition esp_sdr_ring.h:78
unsigned int decim
Definition esp_sdr_ring.h:83
bool spare_bank
Definition esp_sdr_ring.h:112
bool shift_fs4
Definition esp_sdr_ring.h:88
uint32_t unit_pairs
Definition esp_sdr_ring.h:106
bool spare_bank_app
Definition esp_sdr_ring.h:118
bool subsample
Definition esp_sdr_ring.h:98
Definition esp_sdr_ring.h:141
uint64_t pairs
Definition esp_sdr_ring.h:143
uint32_t gain_refreshed
Definition esp_sdr_ring.h:152
uint32_t irq_lines
Definition esp_sdr_ring.h:158
uint32_t units
Definition esp_sdr_ring.h:146
uint32_t late_max
Definition esp_sdr_ring.h:148
uint32_t slice_max
Definition esp_sdr_ring.h:150
uint32_t irq_windows
Definition esp_sdr_ring.h:156
uint32_t stalls
Definition esp_sdr_ring.h:154