|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
RA8 PDM-IF audio-source backend implementation. More...
#include "ra8_audio_source_pdm.h"#include <stdint.h>#include <string.h>#include "ra8_audio_internal.h"#include "ra8_time.h"Go to the source code of this file.
Enumerations | |
| enum | ra8_audio_pdm_alignment_t : uintptr_t { k_pdm_source_alignment_mask = 3U } |
Functions | |
| static ra8_err_t | internal_pdm_fill (uint8_t channel, int32_t *samples, uint32_t count, uint32_t attempts) |
| Fill a sample span from the PDM FIFO. | |
| static ra8_err_t | internal_pdm_get_info (void *ctx, ra8_audio_source_info_t *out_info) |
| Report the initialized PDM source geometry. | |
| static void | internal_pdm_stream_data (void *ctx, const int32_t *samples, uint32_t count) |
| Assemble FIFO chunks into the caller's fixed-size audio frame. | |
| static ra8_err_t | internal_pdm_capture (void *ctx, const ra8_audio_buffer_t *buffer, ra8_audio_frame_t *out_frame) |
| Capture one fixed-size PDM frame by polling. | |
| static ra8_err_t | internal_pdm_stop (void *ctx) |
| Stop and deinitialize the PDM source. | |
| static ra8_err_t | internal_pdm_stream_start (void *ctx, const ra8_audio_buffer_t *buffer, ra8_audio_frame_callback_t callback, void *callback_ctx) |
| Bind persistent scratch and enable PDM FIFO interrupts. | |
| static ra8_err_t | internal_pdm_validate_cfg (const ra8_audio_source_pdm_cfg_t *cfg, uint32_t *out_frame_bytes) |
| Validate PDM source geometry and compute its frame size. | |
| static ra8_err_t | internal_pdm_prepare_hardware (const ra8_audio_source_pdm_cfg_t *cfg) |
| Initialize, settle, and prime one PDM hardware channel. | |
| ra8_err_t | ra8_audio_source_pdm_init (ra8_audio_source_t *source, ra8_audio_source_pdm_state_t *state, const ra8_audio_source_pdm_cfg_t *cfg) |
| Configure, start, settle, and bind one PDM audio source. | |
Variables | |
| static const ra8_audio_source_iface_t | s_pdm_source_iface |
RA8 PDM-IF audio-source backend implementation.
Adapts bounded PDM polling and interrupt streams to the generic audio facade while retaining all buffers and mutable state with callers.
Definition in file ra8_audio_source_pdm.c.
| enum ra8_audio_pdm_alignment_t : uintptr_t |
| Enumerator | |
|---|---|
| k_pdm_source_alignment_mask | PCM-S32LE buffer alignment mask. |
Definition at line 24 of file ra8_audio_source_pdm.c.
|
static |
Capture one fixed-size PDM frame by polling.
Fills the caller buffer and publishes the configured PCM geometry and timestamp.
| [in,out] | ctx | Initialized PDM source state. |
| [in] | buffer | Caller-owned aligned output buffer. |
| [out] | out_frame | Descriptor for the captured frame. |
| k_ra8_ok | One complete frame was captured. |
| k_ra8_err_not_initialized | The source is not initialized. |
| k_ra8_err_invalid_size | The output buffer is too small. |
| k_ra8_err_invalid_arg | The output buffer is misaligned. |
Definition at line 162 of file ra8_audio_source_pdm.c.
References ra8_audio_buffer_t::capacity, ra8_audio_source_pdm_state_t::channel, ra8_audio_source_info_t::channels, ra8_audio_buffer_t::data, ra8_audio_source_info_t::format, ra8_audio_source_info_t::frame_bytes, ra8_audio_source_pdm_state_t::info, ra8_audio_source_pdm_state_t::initialized, internal_pdm_fill(), k_pdm_source_alignment_mask, k_ra8_err_invalid_arg, k_ra8_err_invalid_size, k_ra8_err_not_initialized, k_ra8_ok, ra8_audio_source_pdm_state_t::poll_attempts, ra8_time_ms(), ra8_audio_source_info_t::sample_rate_hz, ra8_audio_source_info_t::samples_per_frame, and ra8_audio_source_info_t::valid_bits.
|
static |
Fill a sample span from the PDM FIFO.
Performs a bounded number of HAL reads until the requested count is collected.
| [in] | channel | PDM hardware channel. |
| [out] | samples | Caller-owned destination sample span. |
| [in] | count | Number of samples required. |
| [in] | attempts | Maximum FIFO-read attempts. |
| k_ra8_ok | The requested sample count was collected. |
| k_ra8_err_hw_timeout | The attempt budget expired first. |
Definition at line 46 of file ra8_audio_source_pdm.c.
References k_ra8_err_hw_timeout, k_ra8_ok, and ra8_pdm_read().
Referenced by internal_pdm_capture(), and internal_pdm_prepare_hardware().
|
static |
Report the initialized PDM source geometry.
Copies cached configuration metadata without accessing PDM hardware.
| [in] | ctx | PDM source state supplied during initialization. |
| [out] | out_info | Destination for audio source metadata. |
| k_ra8_ok | Metadata was copied successfully. |
| k_ra8_err_not_initialized | The source state is absent or inactive. |
Definition at line 78 of file ra8_audio_source_pdm.c.
References ra8_audio_source_pdm_state_t::info, ra8_audio_source_pdm_state_t::initialized, k_ra8_err_not_initialized, k_ra8_ok, and RA8_INTERNAL.
|
static |
Initialize, settle, and prime one PDM hardware channel.
Initializes the HAL, applies channel configuration, starts capture, enables FIFO reads, and discards the requested settling samples.
| [in] | cfg | Validated source configuration. |
| k_ra8_ok | The PDM channel is running and ready for capture. |
| other | Propagated HAL or bounded-read error. |
Definition at line 354 of file ra8_audio_source_pdm.c.
References ra8_audio_source_pdm_cfg_t::channel, ra8_audio_source_pdm_cfg_t::discard_samples, internal_pdm_fill(), k_ra8_ok, ra8_audio_source_pdm_cfg_t::pdm, ra8_audio_source_pdm_cfg_t::poll_attempts, ra8_delay_ms(), RA8_INTERNAL, ra8_pdm_configure(), ra8_pdm_deinit(), ra8_pdm_init(), ra8_pdm_read_enable(), ra8_pdm_start(), ra8_pdm_stop(), and ra8_audio_source_pdm_cfg_t::settle_ms.
Referenced by ra8_audio_source_pdm_init().
|
static |
Stop and deinitialize the PDM source.
Stops acquisition before releasing the shared PDM peripheral state.
| [in,out] | ctx | Initialized PDM source state. |
| k_ra8_ok | Hardware stopped and deinitialized successfully. |
| k_ra8_err_not_initialized | The source is absent or inactive. |
Definition at line 212 of file ra8_audio_source_pdm.c.
References ra8_audio_source_pdm_state_t::channel, ra8_audio_source_pdm_state_t::initialized, k_ra8_err_not_initialized, k_ra8_ok, RA8_INTERNAL, ra8_pdm_deinit(), and ra8_pdm_stop().
|
static |
Assemble FIFO chunks into the caller's fixed-size audio frame.
Copies each interrupt span into persistent caller-owned assembly storage and publishes frames whenever the configured count is met.
| [in,out] | ctx | PDM source state. |
| [in] | samples | Borrowed signed samples from the HAL. |
| [in] | count | Sample count in samples. |
Definition at line 105 of file ra8_audio_source_pdm.c.
References ra8_audio_source_info_t::channels, ra8_audio_source_info_t::format, ra8_audio_source_info_t::frame_bytes, ra8_audio_source_pdm_state_t::info, memcpy(), RA8_INTERNAL, ra8_time_ms(), ra8_audio_source_info_t::sample_rate_hz, ra8_audio_source_info_t::samples_per_frame, ra8_audio_source_pdm_state_t::stream_callback, ra8_audio_source_pdm_state_t::stream_ctx, ra8_audio_source_pdm_state_t::stream_data, ra8_audio_source_pdm_state_t::stream_filled, ra8_audio_source_pdm_state_t::stream_timestamp_ms, ra8_audio_source_pdm_state_t::streaming, and ra8_audio_source_info_t::valid_bits.
Referenced by internal_pdm_stream_start().
|
static |
Bind persistent scratch and enable PDM FIFO interrupts.
Records the callback context and delegates bounded FIFO delivery to the HAL.
| [in,out] | ctx | Initialized PDM source state. |
| [in] | buffer | Caller-owned aligned frame assembly buffer. |
| [in] | callback | Function invoked for each complete audio frame. |
| [in,out] | callback_ctx | Opaque context passed to callback. |
| k_ra8_ok | Interrupt streaming started. |
| k_ra8_err_not_initialized | The source is absent or inactive. |
| k_ra8_err_exists | Streaming is already active. |
| k_ra8_err_invalid_arg | The assembly buffer is misaligned. |
Definition at line 251 of file ra8_audio_source_pdm.c.
References ra8_audio_source_pdm_state_t::channel, ra8_audio_buffer_t::data, ra8_audio_source_pdm_state_t::initialized, internal_pdm_stream_data(), ra8_audio_source_pdm_state_t::irq_priority, k_pdm_source_alignment_mask, k_ra8_err_exists, k_ra8_err_invalid_arg, k_ra8_err_not_initialized, k_ra8_ok, RA8_INTERNAL, ra8_pdm_stream_enable(), ra8_audio_source_pdm_state_t::stream_callback, ra8_audio_source_pdm_state_t::stream_ctx, ra8_audio_source_pdm_state_t::stream_data, ra8_audio_source_pdm_state_t::stream_filled, ra8_audio_source_pdm_state_t::stream_timestamp_ms, and ra8_audio_source_pdm_state_t::streaming.
|
static |
Validate PDM source geometry and compute its frame size.
Checks every bounded configuration field and rejects a frame-size multiplication that cannot fit the public 32-bit byte count.
| [in] | cfg | Candidate source configuration. |
| [out] | out_frame_bytes | Computed PCM frame size on success. |
| k_ra8_ok | Configuration geometry is valid. |
| k_ra8_err_invalid_arg | One bounded configuration field is invalid. |
| k_ra8_err_invalid_size | The frame byte count exceeds 32 bits. |
Definition at line 310 of file ra8_audio_source_pdm.c.
References ra8_audio_source_pdm_cfg_t::channel, k_ra8_err_invalid_arg, k_ra8_err_invalid_size, k_ra8_ok, k_ra8_pdm_ch_count, ra8_audio_source_pdm_cfg_t::poll_attempts, RA8_INTERNAL, ra8_audio_source_pdm_cfg_t::sample_rate_hz, ra8_audio_source_pdm_cfg_t::samples_per_frame, and ra8_audio_source_pdm_cfg_t::valid_bits.
Referenced by ra8_audio_source_pdm_init().
|
nodiscard |
Configure, start, settle, and bind one PDM audio source.
| [out] | source | Generic source handle. |
| [out] | state | Caller-owned backend state. |
| [in] | cfg | PDM filter and fixed-frame policy. |
| k_ra8_ok | Source is running and bound. |
| k_ra8_err_null_ptr | An argument was nullptr. |
| k_ra8_err_invalid_arg | Configuration is invalid. |
| other | Propagated PDM HAL error. |
Definition at line 384 of file ra8_audio_source_pdm.c.
References ra8_audio_source_pdm_cfg_t::channel, internal_pdm_prepare_hardware(), internal_pdm_validate_cfg(), ra8_audio_source_pdm_cfg_t::irq_priority, k_ra8_audio_format_pcm_s32le, k_ra8_err_null_ptr, k_ra8_ok, ra8_audio_source_pdm_cfg_t::poll_attempts, s_pdm_source_iface, ra8_audio_source_pdm_cfg_t::sample_rate_hz, ra8_audio_source_pdm_cfg_t::samples_per_frame, and ra8_audio_source_pdm_cfg_t::valid_bits.
Referenced by c6_cam_audio_start(), and pdm_demo_pdm_or_halt().
|
static |
Definition at line 286 of file ra8_audio_source_pdm.c.
Referenced by ra8_audio_source_pdm_init().