ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_ssie.h
Go to the documentation of this file.
1
86
87#pragma once
88
89#ifdef __cplusplus
90extern "C" {
91#endif
92
93#include <stdint.h>
94
95#include "ra8_err.h"
96
107
141
160
179
204
214
236
264
270typedef struct {
271 uint32_t ssisr;
272 uint32_t ssifsr;
273 uint8_t rx_count;
274 uint8_t tx_count;
275 bool rx_full;
276 bool tx_empty;
277 bool idle;
278 bool error;
279 uint8_t events;
281
286typedef struct {
289 uint32_t* tx_buffer;
290 uint32_t* rx_buffer;
291 uint16_t tx_samples;
292 uint16_t rx_samples;
294
305typedef void (*ra8_ssie_event_fn_t)(void* ctx, uint8_t channel, uint8_t events, uint32_t ssisr);
306
307/* =============================================================================
308 * Lifecycle
309 * =============================================================================
310 */
311
349[[nodiscard]] ra8_err_t ra8_ssie_init(uint8_t channel, const ra8_ssie_cfg_t* cfg);
350
367[[nodiscard]] ra8_err_t ra8_ssie_deinit(uint8_t channel);
368
369/* =============================================================================
370 * Run control
371 * =============================================================================
372 */
373
402[[nodiscard]] ra8_err_t ra8_ssie_start(uint8_t channel, ra8_ssie_dir_t dir);
403
426[[nodiscard]] ra8_err_t ra8_ssie_stop(uint8_t channel);
427
451[[nodiscard]] ra8_err_t ra8_ssie_start_recovery(uint8_t channel);
452
475[[nodiscard]] ra8_err_t ra8_ssie_mute(uint8_t channel, bool enable);
476
497[[nodiscard]] ra8_err_t
498ra8_ssie_set_thresholds(uint8_t channel, uint8_t tx_threshold, uint8_t rx_threshold);
499
528[[nodiscard]] ra8_err_t
529ra8_ssie_set_fifo_threshold(uint8_t channel, uint8_t tx_threshold, uint8_t rx_threshold);
530
560[[nodiscard]] ra8_err_t
561ra8_ssie_attach_dma_pair(uint8_t channel, uint8_t tx_dma_channel, uint8_t rx_dma_channel);
562
592[[nodiscard]] ra8_err_t
593ra8_ssie_send_iso(uint8_t channel, const uint32_t* buffer, uint16_t samples);
594
622[[nodiscard]] ra8_err_t
623ra8_ssie_recv_iso(uint8_t channel, uint32_t* buffer, uint16_t max_samples, uint16_t* out_got);
624
625/* =============================================================================
626 * Data path
627 * =============================================================================
628 */
629
656[[nodiscard]] ra8_err_t ra8_ssie_write_sample(uint8_t channel, uint32_t sample);
657
679[[nodiscard]] ra8_err_t ra8_ssie_read_sample(uint8_t channel, uint32_t* out);
680
707[[nodiscard]] ra8_err_t ra8_ssie_write_buffer(uint8_t channel,
708 const uint32_t* buffer,
709 uint16_t samples,
710 uint16_t* out_written);
711
734[[nodiscard]] ra8_err_t
735ra8_ssie_read_buffer(uint8_t channel, uint32_t* buffer, uint16_t samples, uint16_t* out_read);
736
737/* =============================================================================
738 * DMA
739 * =============================================================================
740 */
741
774[[nodiscard]] ra8_err_t ra8_ssie_attach_dma(uint8_t channel, const ra8_ssie_dma_cfg_t* dma);
775
793[[nodiscard]] ra8_err_t ra8_ssie_detach_dma(uint8_t channel);
794
795/* =============================================================================
796 * Status
797 * =============================================================================
798 */
799
820[[nodiscard]] ra8_err_t ra8_ssie_get_status(uint8_t channel, ra8_ssie_status_t* out);
821
847[[nodiscard]] ra8_err_t ra8_ssie_clear_status(uint8_t channel, uint32_t mask);
848
849/* =============================================================================
850 * Interrupt path
851 * =============================================================================
852 */
853
872[[nodiscard]] ra8_err_t ra8_ssie_attach_handler(ra8_ssie_event_fn_t fn, void* ctx);
873
894void ra8_ssie_dispatch(uint8_t channel);
895
922[[nodiscard]] ra8_err_t ra8_ssie_set_irq_enable(uint8_t channel, uint32_t mask, bool enable);
923
924/* =============================================================================
925 * Power transition
926 * =============================================================================
927 */
928
944[[nodiscard]] ra8_err_t ra8_ssie_enter_stop(uint8_t channel);
945
961[[nodiscard]] ra8_err_t ra8_ssie_exit_stop(uint8_t channel);
962
963#ifdef __cplusplus
964}
965#endif
Error Code Definitions for ra8-firmware.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
void(* ra8_ssie_event_fn_t)(void *ctx, uint8_t channel, uint8_t events, uint32_t ssisr)
SSIE event callback fired by ra8_ssie_dispatch.
Definition ra8_ssie.h:305
ra8_err_t ra8_ssie_clear_status(uint8_t channel, uint32_t mask)
Clear sticky error flags in SSISR.
Definition ra8_ssie.c:884
ra8_err_t ra8_ssie_write_buffer(uint8_t channel, const uint32_t *buffer, uint16_t samples, uint16_t *out_written)
Drain a host buffer into the TX FIFO until either runs out.
Definition ra8_ssie.c:794
ra8_err_t ra8_ssie_init(uint8_t channel, const ra8_ssie_cfg_t *cfg)
Initialise an SSIE channel for I2S / TDM / monaural transfer.
Definition ra8_ssie.c:610
void ra8_ssie_dispatch(uint8_t channel)
ISR helper: fire the registered event handler.
Definition ra8_ssie.c:923
ra8_err_t ra8_ssie_start_recovery(uint8_t channel)
Force the channel back into a known idle state.
Definition ra8_ssie.c:719
ra8_err_t ra8_ssie_detach_dma(uint8_t channel)
Tear down DMAC channels attached to the SSIE FIFOs.
ra8_ssie_format_t
Audio frame format (drives SSIOFR.OMOD[1:0] and SSICR.FRM).
Definition ra8_ssie.h:127
@ k_ra8_ssie_format_tdm
Backwards alias kept for unit tests that index OMOD directly.
Definition ra8_ssie.h:139
@ k_ra8_ssie_format_i2s
I2S, 2 channels per frame.
Definition ra8_ssie.h:128
@ k_ra8_ssie_format_tdm_4
TDM 4-slot.
Definition ra8_ssie.h:132
@ k_ra8_ssie_format_monaural
Monaural single-channel.
Definition ra8_ssie.h:131
@ k_ra8_ssie_format_tdm_8
TDM 8-slot.
Definition ra8_ssie.h:134
@ k_ra8_ssie_format_tdm_6
TDM 6-slot.
Definition ra8_ssie.h:133
@ k_ra8_ssie_format_left_just
Left-justified, 2 channels.
Definition ra8_ssie.h:129
@ k_ra8_ssie_format_right_just
Right-justified, 2 channels.
Definition ra8_ssie.h:130
ra8_err_t ra8_ssie_set_thresholds(uint8_t channel, uint8_t tx_threshold, uint8_t rx_threshold)
Update the FIFO trigger watermarks at runtime.
Definition ra8_ssie.c:757
ra8_err_t ra8_ssie_read_sample(uint8_t channel, uint32_t *out)
Pop one 32-bit sample from the receive FIFO.
Definition ra8_ssie.c:782
ra8_err_t ra8_ssie_attach_dma(uint8_t channel, const ra8_ssie_dma_cfg_t *dma)
Attach DMAC channels to the SSIE TX and/or RX FIFOs.
ra8_err_t ra8_ssie_attach_handler(ra8_ssie_event_fn_t fn, void *ctx)
Attach a shared event callback for both SSIE channels.
Definition ra8_ssie.c:915
ra8_ssie_system_word_t
System word length (drives SSICR.SWL[2:0]).
Definition ra8_ssie.h:169
@ k_ra8_ssie_swl_48
48-bit system word.
Definition ra8_ssie.h:174
@ k_ra8_ssie_swl_32
32-bit system word.
Definition ra8_ssie.h:173
@ k_ra8_ssie_swl_256
256-bit system word.
Definition ra8_ssie.h:177
@ k_ra8_ssie_swl_24
24-bit system word.
Definition ra8_ssie.h:172
@ k_ra8_ssie_swl_64
64-bit system word.
Definition ra8_ssie.h:175
@ k_ra8_ssie_swl_16
16-bit system word.
Definition ra8_ssie.h:171
@ k_ra8_ssie_swl_8
8-bit system word.
Definition ra8_ssie.h:170
@ k_ra8_ssie_swl_128
128-bit system word.
Definition ra8_ssie.h:176
ra8_err_t ra8_ssie_send_iso(uint8_t channel, const uint32_t *buffer, uint16_t samples)
Block-mode isochronous send.
ra8_err_t ra8_ssie_set_fifo_threshold(uint8_t channel, uint8_t tx_threshold, uint8_t rx_threshold)
Programme SSITDMR / SSIRDMR FIFO thresholds in one call.
Definition ra8_ssie.c:941
ra8_err_t ra8_ssie_set_irq_enable(uint8_t channel, uint32_t mask, bool enable)
Update the IRQ enable mask without rewriting SSICR fully.
Definition ra8_ssie.c:897
ra8_err_t ra8_ssie_write_sample(uint8_t channel, uint32_t sample)
Push one 32-bit sample into the transmit FIFO.
Definition ra8_ssie.c:771
ra8_ssie_bclk_div_t
Bit-clock divider (drives SSICR.CKDV[3:0]).
Definition ra8_ssie.h:189
@ k_ra8_ssie_bclk_div_32
AUDIO_MCK / 32.
Definition ra8_ssie.h:195
@ k_ra8_ssie_bclk_div_4
AUDIO_MCK / 4.
Definition ra8_ssie.h:192
@ k_ra8_ssie_bclk_div_24
AUDIO_MCK / 24.
Definition ra8_ssie.h:200
@ k_ra8_ssie_bclk_div_8
AUDIO_MCK / 8.
Definition ra8_ssie.h:193
@ k_ra8_ssie_bclk_div_6
AUDIO_MCK / 6.
Definition ra8_ssie.h:198
@ k_ra8_ssie_bclk_div_1
AUDIO_MCK / 1.
Definition ra8_ssie.h:190
@ k_ra8_ssie_bclk_div_48
AUDIO_MCK / 48.
Definition ra8_ssie.h:201
@ k_ra8_ssie_bclk_div_16
AUDIO_MCK / 16.
Definition ra8_ssie.h:194
@ k_ra8_ssie_bclk_div_64
AUDIO_MCK / 64.
Definition ra8_ssie.h:196
@ k_ra8_ssie_bclk_div_96
AUDIO_MCK / 96.
Definition ra8_ssie.h:202
@ k_ra8_ssie_bclk_div_128
AUDIO_MCK / 128.
Definition ra8_ssie.h:197
@ k_ra8_ssie_bclk_div_12
AUDIO_MCK / 12.
Definition ra8_ssie.h:199
@ k_ra8_ssie_bclk_div_2
AUDIO_MCK / 2.
Definition ra8_ssie.h:191
ra8_ssie_dir_t
Communication direction selector for ra8_ssie_start.
Definition ra8_ssie.h:209
@ k_ra8_ssie_dir_tx
Transmission only (TEN).
Definition ra8_ssie.h:211
@ k_ra8_ssie_dir_rx
Reception only (REN).
Definition ra8_ssie.h:210
@ k_ra8_ssie_dir_tx_rx
Full duplex (TEN | REN).
Definition ra8_ssie.h:212
ra8_err_t ra8_ssie_attach_dma_pair(uint8_t channel, uint8_t tx_dma_channel, uint8_t rx_dma_channel)
Pair an SSIE channel's TX + RX FIFOs to DMAC channels.
ra8_err_t ra8_ssie_deinit(uint8_t channel)
Tear down an SSIE channel and gate its clock.
Definition ra8_ssie.c:638
ra8_err_t ra8_ssie_stop(uint8_t channel)
Disable transmission and reception.
Definition ra8_ssie.c:697
ra8_err_t ra8_ssie_mute(uint8_t channel, bool enable)
Enable or disable mute on the next frame boundary.
Definition ra8_ssie.c:740
ra8_ssie_data_word_t
Data word length (drives SSICR.DWL[2:0]).
Definition ra8_ssie.h:151
@ k_ra8_ssie_dwl_32
32-bit data word.
Definition ra8_ssie.h:158
@ k_ra8_ssie_dwl_16
16-bit data word.
Definition ra8_ssie.h:153
@ k_ra8_ssie_dwl_20
20-bit data word.
Definition ra8_ssie.h:155
@ k_ra8_ssie_dwl_18
18-bit data word.
Definition ra8_ssie.h:154
@ k_ra8_ssie_dwl_8
8-bit data word.
Definition ra8_ssie.h:152
@ k_ra8_ssie_dwl_24
24-bit data word.
Definition ra8_ssie.h:157
@ k_ra8_ssie_dwl_22
22-bit data word.
Definition ra8_ssie.h:156
ra8_err_t ra8_ssie_exit_stop(uint8_t channel)
Re-ungate the channel's MSTP bit.
Definition ra8_ssie.c:957
ra8_err_t ra8_ssie_recv_iso(uint8_t channel, uint32_t *buffer, uint16_t max_samples, uint16_t *out_got)
Block-mode isochronous receive.
ra8_err_t ra8_ssie_start(uint8_t channel, ra8_ssie_dir_t dir)
Enable transmission, reception, or full duplex.
Definition ra8_ssie.c:656
ra8_err_t ra8_ssie_enter_stop(uint8_t channel)
Gate the channel's MSTP bit (preserve register state).
Definition ra8_ssie.c:949
ra8_err_t ra8_ssie_read_buffer(uint8_t channel, uint32_t *buffer, uint16_t samples, uint16_t *out_read)
Empty the RX FIFO into a host buffer until either runs out.
Definition ra8_ssie.c:829
ra8_err_t ra8_ssie_get_status(uint8_t channel, ra8_ssie_status_t *out)
Snapshot SSISR + SSIFSR into a status struct.
Definition ra8_ssie.c:860
ra8_ssie_role_t
Controller / peripheral selection (drives SSICR.MST).
Definition ra8_ssie.h:103
@ k_ra8_ssie_role_controller
Bit clock + LR clock are outputs.
Definition ra8_ssie.h:105
@ k_ra8_ssie_role_peripheral
Bit clock + LR clock are inputs.
Definition ra8_ssie.h:104
ra8_ssie_event_t
Decoded SSIE callback event bit-flags.
Definition ra8_ssie.h:225
@ k_ra8_ssie_evt_error
Aggregate error mask.
Definition ra8_ssie.h:234
@ k_ra8_ssie_evt_tx_empty
TDE asserted (TIE on).
Definition ra8_ssie.h:228
@ k_ra8_ssie_evt_none
No bits set.
Definition ra8_ssie.h:226
@ k_ra8_ssie_evt_idle
IIRQ asserted.
Definition ra8_ssie.h:227
@ k_ra8_ssie_evt_tx_over
TOIRQ.
Definition ra8_ssie.h:231
@ k_ra8_ssie_evt_rx_under
RUIRQ.
Definition ra8_ssie.h:232
@ k_ra8_ssie_evt_rx_over
ROIRQ.
Definition ra8_ssie.h:233
@ k_ra8_ssie_evt_rx_full
RDF asserted (RIE on).
Definition ra8_ssie.h:229
@ k_ra8_ssie_evt_tx_under
TUIRQ.
Definition ra8_ssie.h:230
Configuration descriptor for ra8_ssie_init.
Definition ra8_ssie.h:246
uint8_t rx_threshold
SSISCR.RDFS[4:0] watermark.
Definition ra8_ssie.h:262
ra8_ssie_role_t role
Controller or peripheral.
Definition ra8_ssie.h:247
uint8_t tx_threshold
SSISCR.TDES[4:0] watermark.
Definition ra8_ssie.h:261
bool long_frame
true: SSICR.DEL = 0 (long).
Definition ra8_ssie.h:253
ra8_ssie_data_word_t data_word
Significant bits per channel.
Definition ra8_ssie.h:249
bool bckp_rising
true: SSICR.BCKP = 1.
Definition ra8_ssie.h:254
bool byte_swap
SSIFCR.BSW.
Definition ra8_ssie.h:257
ra8_ssie_system_word_t system_word
Total bits per channel.
Definition ra8_ssie.h:250
bool spdp_high
true: SSICR.SPDP = 1.
Definition ra8_ssie.h:256
bool bck_idle_stop
SSIOFR.BCKASTP (controller only).
Definition ra8_ssie.h:259
bool lr_continue
SSIOFR.LRCONT (controller only).
Definition ra8_ssie.h:258
bool lrckp_low
true: SSICR.LRCKP = 1.
Definition ra8_ssie.h:255
bool enable_aucke
SSIFCR.AUCKE (controller only).
Definition ra8_ssie.h:260
ra8_ssie_format_t format
I2S / TDM / monaural.
Definition ra8_ssie.h:248
ra8_ssie_bclk_div_t bclk_div
CKDV divider (controller only).
Definition ra8_ssie.h:251
bool use_gpt_clk
true: GTIOC2A; false: AUDIO_CLK.
Definition ra8_ssie.h:252
DMA pump descriptor for ra8_ssie_attach_dma.
Definition ra8_ssie.h:286
uint8_t rx_dma_channel
DMAC channel to feed RX (>=8 = unused).
Definition ra8_ssie.h:288
uint16_t rx_samples
RX sample count (must be > 0 if rx).
Definition ra8_ssie.h:292
uint32_t * tx_buffer
Source buffer for TX (32-bit samples).
Definition ra8_ssie.h:289
uint32_t * rx_buffer
Destination buffer for RX.
Definition ra8_ssie.h:290
uint16_t tx_samples
TX sample count (must be > 0 if tx).
Definition ra8_ssie.h:291
uint8_t tx_dma_channel
DMAC channel to drain TX (>=8 = unused).
Definition ra8_ssie.h:287
Snapshot of FIFO levels + error flags returned by ra8_ssie_get_status.
Definition ra8_ssie.h:270
uint32_t ssisr
Raw SSISR value.
Definition ra8_ssie.h:271
bool rx_full
RDF flag: RX above SSISCR.RDFS.
Definition ra8_ssie.h:275
uint8_t rx_count
RDC[5:0] – entries currently in RX.
Definition ra8_ssie.h:273
uint32_t ssifsr
Raw SSIFSR value.
Definition ra8_ssie.h:272
bool idle
IIRQ: SSIE in idle state.
Definition ra8_ssie.h:277
bool error
Any of ROIRQ/RUIRQ/TOIRQ/TUIRQ set.
Definition ra8_ssie.h:278
uint8_t tx_count
TDC[5:0] – entries currently in TX.
Definition ra8_ssie.h:274
bool tx_empty
TDE flag: TX below SSISCR.TDES.
Definition ra8_ssie.h:276
uint8_t events
Decoded ra8_ssie_event_t bitmap.
Definition ra8_ssie.h:279