Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions Kconfig.sof
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,7 @@ rsource "Kconfig.xtos"

rsource "src/Kconfig"

if ZEPHYR_SOF_MODULE
rsource "Kconfig.zephyr-log"
endif
rsource "Kconfig.zephyr-log"

menu "Debug"

Expand Down
42 changes: 40 additions & 2 deletions app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,52 @@ if(DEFINED EXTRA_CONF_FILE AND
endif()
endif()

list(APPEND EXTRA_ZEPHYR_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/..")

find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
project(sample_sof)

target_sources(app PRIVATE
src/main.c
)

zephyr_library_include_directories(app PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../src/arch/xtensa/include

target_sources_ifdef(CONFIG_USB_DEVICE_STACK_NEXT app PRIVATE
src/usbd_init.c
)

target_include_directories(app PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}/../src/include
${CMAKE_CURRENT_SOURCE_DIR}/../zephyr/include
${CMAKE_CURRENT_SOURCE_DIR}/../src/platform/${PLATFORM}/include
${PROJECT_BINARY_DIR}/include/generated
)

target_link_libraries(app PRIVATE SOF -Wl,--start-group modules_sof sof_kernel -Wl,--end-group)
if(TARGET uuid_reg_h)
add_dependencies(app uuid_reg_h modules_sof sof_kernel)
endif()

if(CONFIG_XTENSA)
target_include_directories(app PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../src/arch/xtensa/include
)
endif()

function(sof_append_relative_path_definitions target)
get_target_property(sources ${target} SOURCES)
foreach(src ${sources})
get_filename_component(ABS_PATH ${src} ABSOLUTE)
file(RELATIVE_PATH rel ${PROJECT_SOURCE_DIR} ${ABS_PATH})
set_property(
SOURCE ${src}
APPEND
PROPERTY COMPILE_DEFINITIONS
RELATIVE_FILE="${rel}")
endforeach()
endfunction()

sof_append_relative_path_definitions(app)


1 change: 1 addition & 0 deletions app/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ choice COMPILER_CODEGEN_VLIW
endchoice

source "Kconfig.zephyr"
source "samples/subsys/usb/common/Kconfig.sample_usbd"

if SOC_FAMILY_INTEL_ADSP
rsource "boards/intel_adsp/Kconfig.defconfig"
Expand Down
64 changes: 64 additions & 0 deletions app/boards/nrf54l15dk_nrf54l15_cpuapp.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Target Platform & SOF Core
CONFIG_PLATFORM_NORDIC=y
CONFIG_PLATFORM_NRF54L15=y
CONFIG_SOF_FULL_ZEPHYR_APPLICATION=y
CONFIG_ZEPHYR_NATIVE_DRIVERS=y
CONFIG_IPC_MAJOR_4=y
CONFIG_COMP_BASEFW_IPC4=n
CONFIG_STATIC_PIPELINE=y
CONFIG_SCHED_CPU_MASK=n
CONFIG_SYS_HEAP_BIG_ONLY=y
CONFIG_BUILD_OUTPUT_HEX=y
CONFIG_BUILD_OUTPUT_BIN=y

# Audio Processing Modules & ARM SIMD Optimizations
CONFIG_COMP_VOLUME=y
CONFIG_VOLUME_ARM_SIMD=y
CONFIG_COMP_IIR=y
CONFIG_EQ_IIR_ARM_SIMD=y
CONFIG_FILTER_ARM_SIMD=y
CONFIG_COMP_FIR=y
CONFIG_COMP_DRC=y
CONFIG_DRC_ARM_SIMD=y
CONFIG_COMP_CROSSOVER=y
CONFIG_COMP_DCBLOCK=y
CONFIG_DCBLOCK_ARM_SIMD=y
CONFIG_COMP_MULTIBAND_DRC=y
CONFIG_COMP_TONE=y
CONFIG_COMP_LEVEL_MULTIPLIER=y
CONFIG_COMP_SEL=y
CONFIG_COMP_MUX=y
CONFIG_FORMAT_CONVERT_ARM_SIMD=y
CONFIG_COMP_USB_AUDIO=y
CONFIG_COMP_BT_AUDIO=n
CONFIG_COMP_I2S_AUDIO=y

# I2S Hardware Audio Interface (I2S20 Slave)
CONFIG_I2S=y
CONFIG_I2S_NRFX=y

# Bluetooth Stack Disabled for Direct I2S Cable Loopback
CONFIG_BT=n

# Hardware FPU & ARM DSP
CONFIG_FPU=y

# System Resources & Memory (Lean footprint for 256KB RAM)
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
CONFIG_ISR_STACK_SIZE=2048
CONFIG_HW_STACK_PROTECTION=n
CONFIG_HEAP_MEM_POOL_SIZE=8192
CONFIG_TICKLESS_KERNEL=n
CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000

# Logging & UART Console
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_MODE_DEFERRED=y
CONFIG_LOG_BUFFER_SIZE=4096
CONFIG_LOG_BACKEND_UART=y
CONFIG_PRINTK=y
CONFIG_LOG_PRINTK=y
CONFIG_EARLY_CONSOLE=y

38 changes: 38 additions & 0 deletions app/boards/nrf54l15dk_nrf54l15_cpuapp.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright (c) 2026 Sound Open Firmware (SOF) Project
* SPDX-License-Identifier: Apache-2.0
*/

/ {
aliases {
i2s-node0 = &i2s20;
};
};

&pinctrl {
i2s20_default: i2s20_default {
group1 {
psels = <NRF_PSEL(I2S_SCK_S, 1, 11)>,
<NRF_PSEL(I2S_LRCK_S, 1, 12)>,
<NRF_PSEL(I2S_SDIN, 1, 9)>,
<NRF_PSEL(I2S_SDOUT, 1, 8)>;
};
};

i2s20_sleep: i2s20_sleep {
group1 {
psels = <NRF_PSEL(I2S_SCK_S, 1, 11)>,
<NRF_PSEL(I2S_LRCK_S, 1, 12)>,
<NRF_PSEL(I2S_SDIN, 1, 9)>,
<NRF_PSEL(I2S_SDOUT, 1, 8)>;
low-power-enable;
};
};
};

&i2s20 {
status = "okay";
pinctrl-0 = <&i2s20_default>;
pinctrl-1 = <&i2s20_sleep>;
pinctrl-names = "default", "sleep";
};
81 changes: 81 additions & 0 deletions app/boards/nrf54lm20dk_nrf54lm20b_cpuapp.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Target Platform & SOF Core
CONFIG_PLATFORM_NORDIC=y
CONFIG_PLATFORM_NRF54LM20=y
CONFIG_SOF_FULL_ZEPHYR_APPLICATION=y
CONFIG_ZEPHYR_NATIVE_DRIVERS=y
CONFIG_IPC_MAJOR_4=y
CONFIG_COMP_BASEFW_IPC4=n
CONFIG_STATIC_PIPELINE=y
CONFIG_SCHED_CPU_MASK=n
CONFIG_SYS_HEAP_BIG_ONLY=y
CONFIG_BUILD_OUTPUT_HEX=y
CONFIG_BUILD_OUTPUT_BIN=y

# Audio Processing Modules & ARM SIMD Optimizations
CONFIG_COMP_VOLUME=y
CONFIG_VOLUME_ARM_SIMD=y
CONFIG_COMP_IIR=y
CONFIG_EQ_IIR_ARM_SIMD=y
CONFIG_FILTER_ARM_SIMD=y
CONFIG_COMP_FIR=y
CONFIG_COMP_DRC=y
CONFIG_DRC_ARM_SIMD=y
CONFIG_COMP_CROSSOVER=y
CONFIG_COMP_DCBLOCK=y
CONFIG_DCBLOCK_ARM_SIMD=y
CONFIG_COMP_MULTIBAND_DRC=y
CONFIG_COMP_TONE=y
CONFIG_COMP_LEVEL_MULTIPLIER=y
CONFIG_COMP_SEL=y
CONFIG_COMP_MUX=y
CONFIG_FORMAT_CONVERT_ARM_SIMD=y
CONFIG_COMP_USB_AUDIO=y
CONFIG_COMP_BT_AUDIO=n
CONFIG_COMP_I2S_AUDIO=y

# I2S Hardware Audio Interface (TDM Master)
CONFIG_I2S=y
CONFIG_I2S_NRF_TDM=y
CONFIG_I2S_NRF_TDM_TX_BLOCK_COUNT=32
CONFIG_I2S_NRF_TDM_RX_BLOCK_COUNT=32

# Asynchronous deferred logging for audio real-time performance
CONFIG_LOG_MODE_DEFERRED=y
CONFIG_LOG_BUFFER_SIZE=8192

# USB Device & UAC2 Audio Class
CONFIG_USB_DEVICE_STACK_NEXT=y
CONFIG_CDC_ACM_SERIAL_INITIALIZE_AT_BOOT=n
CONFIG_USBD_AUDIO2_CLASS=y
CONFIG_UDC_DWC2_PTI=y
CONFIG_SAMPLE_USBD_VID=0x1915
CONFIG_SAMPLE_USBD_PID=0x5420
CONFIG_SAMPLE_USBD_PRODUCT="Nordic nRF54LM20 SOF UAC2"

# Bluetooth Stack Disabled for Direct I2S Cable Loopback
CONFIG_BT=n

# Hardware FPU & ARM DSP
CONFIG_FPU=y

# MPU Null-Pointer Detection override (0x0-0x400 unmapped on LM20)
CONFIG_NULL_POINTER_EXCEPTION_DETECTION_NONE=y

# System Resources & Memory (512KB RAM)
CONFIG_MAIN_STACK_SIZE=8192
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
CONFIG_ISR_STACK_SIZE=4096
CONFIG_HW_STACK_PROTECTION=n
CONFIG_HEAP_MEM_POOL_SIZE=16384
CONFIG_TICKLESS_KERNEL=n
CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000


# Logging & UART Console
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_LOG_BACKEND_UART=y
CONFIG_PRINTK=y
CONFIG_LOG_PRINTK=y
CONFIG_EARLY_CONSOLE=y
136 changes: 136 additions & 0 deletions app/boards/nrf54lm20dk_nrf54lm20b_cpuapp.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/*
* Copyright (c) 2026 Sound Open Firmware (SOF) Project
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/dt-bindings/usb/audio.h>

/ {
uac2_card: usb_audio2 {
compatible = "zephyr,uac2";
status = "okay";
full-speed;
high-speed;
audio-function = <AUDIO_FUNCTION_IO_BOX>;

uac_aclk: aclk {
compatible = "zephyr,uac2-clock-source";
clock-type = "internal-programmable";
frequency-control = "host-programmable";
sampling-frequencies = <48000>;
sof-synchronized;
};

/* ===== Playback from Host (ISO OUT) ===== */
i2s_out_terminal: i2s_out_terminal {
compatible = "zephyr,uac2-input-terminal";
clock-source = <&uac_aclk>;
terminal-type = <USB_TERMINAL_STREAMING>;
front-left;
front-right;
};

i2s_fu: i2s_fu {
compatible = "zephyr,uac2-feature-unit";
data-source = <&i2s_out_terminal>;
mute-control = "host-programmable";
volume-control = "host-programmable";
};

pb_eq_fu: pb_eq_fu {
compatible = "zephyr,uac2-feature-unit";
data-source = <&i2s_fu>;
mute-control = "host-programmable";
};

pb_drc_fu: pb_drc_fu {
compatible = "zephyr,uac2-feature-unit";
data-source = <&pb_eq_fu>;
mute-control = "host-programmable";
};

i2s_speaker: i2s_speaker {
compatible = "zephyr,uac2-output-terminal";
data-source = <&pb_drc_fu>;
clock-source = <&uac_aclk>;
terminal-type = <OUTPUT_TERMINAL_SPEAKER>;
assoc-terminal = <&i2s_mic>;
};

/* ===== Capture to Host (ISO IN) ===== */
i2s_mic: i2s_mic {
compatible = "zephyr,uac2-input-terminal";
clock-source = <&uac_aclk>;
terminal-type = <INPUT_TERMINAL_MICROPHONE>;
front-left;
front-right;
};

cap_eq_fu: cap_eq_fu {
compatible = "zephyr,uac2-feature-unit";
data-source = <&i2s_mic>;
mute-control = "host-programmable";
};

i2s_in_fu: i2s_in_fu {
compatible = "zephyr,uac2-feature-unit";
data-source = <&cap_eq_fu>;
mute-control = "host-programmable";
volume-control = "host-programmable";
};

i2s_in_terminal: i2s_in_terminal {
compatible = "zephyr,uac2-output-terminal";
data-source = <&i2s_in_fu>;
clock-source = <&uac_aclk>;
terminal-type = <USB_TERMINAL_STREAMING>;
};

/* Audio Streaming Interfaces */
as_i2s_out: as_i2s_out {
compatible = "zephyr,uac2-audio-streaming";
linked-terminal = <&i2s_out_terminal>;
subslot-size = <2>;
bit-resolution = <16>;
};

as_i2s_in: as_i2s_in {
compatible = "zephyr,uac2-audio-streaming";
linked-terminal = <&i2s_in_terminal>;
subslot-size = <2>;
bit-resolution = <16>;
};
};

aliases {
i2s-node0 = &tdm;
};
};

&pinctrl {
tdm_default: tdm_default {
group1 {
psels = <NRF_PSEL(TDM_SCK_M, 1, 23)>,
<NRF_PSEL(TDM_FSYNC_M, 1, 24)>,
<NRF_PSEL(TDM_SDOUT, 1, 30)>,
<NRF_PSEL(TDM_SDIN, 1, 31)>;
};
};

tdm_sleep: tdm_sleep {
group1 {
psels = <NRF_PSEL(TDM_SCK_M, 1, 23)>,
<NRF_PSEL(TDM_FSYNC_M, 1, 24)>,
<NRF_PSEL(TDM_SDOUT, 1, 30)>,
<NRF_PSEL(TDM_SDIN, 1, 31)>;
low-power-enable;
};
};
};

&tdm {
status = "okay";
pinctrl-0 = <&tdm_default>;
pinctrl-1 = <&tdm_sleep>;
pinctrl-names = "default", "sleep";
};
Loading
Loading