XCORE SDK
XCORE Software Development Kit
rtos_i2s.h
1 // Copyright 2020-2021 XMOS LIMITED.
2 // This Software is subject to the terms of the XMOS Public Licence: Version 1.
3 
4 #ifndef RTOS_I2S_H_
5 #define RTOS_I2S_H_
6 
14 #include <xcore/clock.h>
15 #include <xcore/port.h>
16 #include "i2s.h"
17 
18 #include "rtos_osal.h"
19 #include "rtos_driver_rpc.h"
20 
25 #define RTOS_I2S_APP_SEND_FILTER_CALLBACK_ATTR __attribute__((fptrgroup("rtos_i2s_send_filter_cb_fptr_grp")))
26 
31 #define RTOS_I2S_APP_RECEIVE_FILTER_CALLBACK_ATTR __attribute__((fptrgroup("rtos_i2s_receive_filter_cb_fptr_grp")))
32 
36 typedef struct rtos_i2s_struct rtos_i2s_t;
37 
63 typedef size_t (*rtos_i2s_send_filter_cb_t)(rtos_i2s_t *ctx, void *app_data, int32_t *i2s_frame, size_t i2s_frame_size, int32_t *send_buf, size_t samples_available);
64 
91 typedef size_t (*rtos_i2s_receive_filter_cb_t)(rtos_i2s_t *ctx, void *app_data, int32_t *i2s_frame, size_t i2s_frame_size, int32_t *receive_buf, size_t sample_spaces_free);
92 
99  rtos_driver_rpc_t *rpc_config;
100 
101  __attribute__((fptrgroup("rtos_i2s_rx_fptr_grp")))
102  size_t (*rx)(rtos_i2s_t *, int32_t *, size_t, unsigned);
103 
104  __attribute__((fptrgroup("rtos_i2s_tx_fptr_grp")))
105  size_t (*tx)(rtos_i2s_t *, int32_t *, size_t, unsigned);
106 
107  unsigned mclk_bclk_ratio;
108  i2s_mode_t mode;
109  port_t p_dout[I2S_MAX_DATALINES];
110  size_t num_out;
111  port_t p_din[I2S_MAX_DATALINES];
112  size_t num_in;
113  port_t p_bclk;
114  port_t p_lrclk;
115  port_t p_mclk;
116  xclock_t bclk;
117 
118  void *send_filter_app_data;
120 
121  void *receive_filter_app_data;
123 
124  rtos_osal_mutex_t mutex;
125  streaming_channel_t c_i2s_isr;
126 
127  rtos_osal_thread_t hil_thread;
128  rtos_osal_semaphore_t send_sem;
129  rtos_osal_semaphore_t recv_sem;
130  int send_blocked;
131  int recv_blocked;
132  struct {
133  int32_t *buf;
134  size_t buf_size;
135  size_t write_index;
136  size_t read_index;
137  volatile size_t total_written;
138  volatile size_t total_read;
139  volatile size_t required_free_count;
140  } send_buffer;
141  struct {
142  int32_t *buf;
143  size_t buf_size;
144  size_t write_index;
145  size_t read_index;
146  volatile size_t total_written;
147  volatile size_t total_read;
148  volatile size_t required_available_count;
149  } recv_buffer;
150  uint8_t isr_cmd;
151 };
152 
153 #include "rtos_i2s_rpc.h"
154 
166  const unsigned audio_clock_frequency,
167  const unsigned sample_rate)
168 {
169  return audio_clock_frequency / (sample_rate * (8 * sizeof(int32_t)) * I2S_CHANS_PER_FRAME);
170 }
171 
172 inline void rtos_i2s_send_filter_cb_set(
173  rtos_i2s_t *ctx,
174  rtos_i2s_send_filter_cb_t send_filter_cb,
175  void *send_filter_app_data)
176 {
177  ctx->send_filter_app_data = send_filter_app_data;
178  ctx->send_filter_cb = send_filter_cb;
179 }
180 
181 inline void rtos_i2s_receive_filter_cb_set(
182  rtos_i2s_t *ctx,
183  rtos_i2s_receive_filter_cb_t receive_filter_cb,
184  void *receive_filter_app_data)
185 {
186  ctx->receive_filter_app_data = receive_filter_app_data;
187  ctx->receive_filter_cb = receive_filter_cb;
188 }
189 
216 void rtos_i2s_start(
217  rtos_i2s_t *i2s_ctx,
218  unsigned mclk_bclk_ratio,
219  i2s_mode_t mode,
220  size_t recv_buffer_size,
221  size_t send_buffer_size,
222  unsigned interrupt_core_id);
223 
248 inline size_t rtos_i2s_rx(
249  rtos_i2s_t *ctx,
250  int32_t *i2s_sample_buf,
251  size_t frame_count,
252  unsigned timeout)
253 {
254  return ctx->rx(ctx, i2s_sample_buf, frame_count, timeout);
255 }
256 
275 inline size_t rtos_i2s_tx(
276  rtos_i2s_t *ctx,
277  int32_t *i2s_sample_buf,
278  size_t frame_count,
279  unsigned timeout)
280 {
281  return ctx->tx(ctx, i2s_sample_buf, frame_count, timeout);
282 }
283 
314  rtos_i2s_t *i2s_ctx,
315  uint32_t io_core_mask,
316  port_t p_dout[],
317  size_t num_out,
318  port_t p_din[],
319  size_t num_in,
320  port_t p_bclk,
321  port_t p_lrclk,
322  port_t p_mclk,
323  xclock_t bclk);
324 
346  rtos_i2s_t *i2s_ctx,
347  uint32_t io_core_mask,
348  port_t p_dout[],
349  size_t num_out,
350  port_t p_din[],
351  size_t num_in,
352  port_t p_bclk,
353  port_t p_lrclk,
354  xclock_t bclk);
355 
386  rtos_i2s_t *i2s_ctx,
387  uint32_t io_core_mask,
388  port_t p_dout[],
389  size_t num_out,
390  port_t p_din[],
391  size_t num_in,
392  port_t p_bclk,
393  port_t p_lrclk,
394  xclock_t bclk);
395 
400 #endif /* RTOS_I2S_H_ */
enum i2s_mode i2s_mode_t
size_t rtos_i2s_tx(rtos_i2s_t *ctx, int32_t *i2s_sample_buf, size_t frame_count, unsigned timeout)
Definition: rtos_i2s.h:275
size_t rtos_i2s_rx(rtos_i2s_t *ctx, int32_t *i2s_sample_buf, size_t frame_count, unsigned timeout)
Definition: rtos_i2s.h:248
#define RTOS_I2S_APP_SEND_FILTER_CALLBACK_ATTR
Definition: rtos_i2s.h:25
int rtos_i2s_mclk_bclk_ratio(const unsigned audio_clock_frequency, const unsigned sample_rate)
Definition: rtos_i2s.h:165
size_t(* rtos_i2s_send_filter_cb_t)(rtos_i2s_t *ctx, void *app_data, int32_t *i2s_frame, size_t i2s_frame_size, int32_t *send_buf, size_t samples_available)
Definition: rtos_i2s.h:63
size_t(* rtos_i2s_receive_filter_cb_t)(rtos_i2s_t *ctx, void *app_data, int32_t *i2s_frame, size_t i2s_frame_size, int32_t *receive_buf, size_t sample_spaces_free)
Definition: rtos_i2s.h:91
#define RTOS_I2S_APP_RECEIVE_FILTER_CALLBACK_ATTR
Definition: rtos_i2s.h:31
void rtos_i2s_start(rtos_i2s_t *i2s_ctx, unsigned mclk_bclk_ratio, i2s_mode_t mode, size_t recv_buffer_size, size_t send_buffer_size, unsigned interrupt_core_id)
Definition: rtos_i2s.c:322
void rtos_i2s_master_init(rtos_i2s_t *i2s_ctx, uint32_t io_core_mask, port_t p_dout[], size_t num_out, port_t p_din[], size_t num_in, port_t p_bclk, port_t p_lrclk, port_t p_mclk, xclock_t bclk)
Definition: rtos_i2s.c:417
void rtos_i2s_master_ext_clock_init(rtos_i2s_t *i2s_ctx, uint32_t io_core_mask, port_t p_dout[], size_t num_out, port_t p_din[], size_t num_in, port_t p_bclk, port_t p_lrclk, xclock_t bclk)
Definition: rtos_i2s.c:445
void rtos_i2s_slave_init(rtos_i2s_t *i2s_ctx, uint32_t io_core_mask, port_t p_dout[], size_t num_out, port_t p_din[], size_t num_in, port_t p_bclk, port_t p_lrclk, xclock_t bclk)
Definition: rtos_i2s.c:470
Definition: rtos_driver_rpc.h:23
Definition: rtos_i2s.h:98