CAINIAO CNIoT-CORE: use ALSA UCM instead of asound.state

This commit is contained in:
retro98boy 2025-06-16 21:15:22 +08:00 committed by Igor
parent 99d23b8190
commit fc8fef06b2
5 changed files with 139 additions and 629 deletions

View File

@ -10,9 +10,7 @@ FULL_DESKTOP="yes"
SERIALCON="ttyAML0"
BOOT_LOGO="desktop"
BOOT_FDT_FILE="amlogic/meson-g12b-a311d-cainiao-cniot-core.dtb"
# playback via HDMI: aplay -D plughw:CNIoTCORE,0 /usr/share/sounds/alsa/Front_Center.wav
# playback via internal speaker: aplay -D plughw:CNIoTCORE,1 /usr/share/sounds/alsa/Front_Center.wav
ASOUND_STATE="asound.state.cainiao-cniot-core"
PACKAGE_LIST_BOARD="alsa-ucm-conf" # Contain ALSA UCM top-level configuration file
BOOTBRANCH_BOARD="tag:v2025.04"
BOOTPATCHDIR="v2025.04" # This has a patch that adds support for CAINIAO CNIoT-CORE.
@ -88,3 +86,22 @@ function post_uboot_custom_postprocess__repack_vendor_fip_with_mainline_uboot()
exit 1
fi
}
function post_family_tweaks_bsp__cainiao-cniot-core() {
display_alert "${BOARD}" "Installing ALSA UCM configuration files" "info"
# Use ALSA UCM via GUI: Install a desktop environment such as GNOME, PipeWire, and WirePlumber.
# Use ALSA UCM via CLI: alsactl init && alsaucm set _verb "HiFi" set _enadev "HDMI" set _enadev "Speaker"
# playback via HDMI: aplay -D plughw:cainiaocniotcor,0 /usr/share/sounds/alsa/Front_Center.wav
# playback via internal speaker: aplay -D plughw:cainiaocniotcor,1 /usr/share/sounds/alsa/Front_Center.wav
install -Dm644 "${SRC}/packages/bsp/cainiao-cniot-core/cainiao-cniot-core-HiFi.conf" "${destination}/usr/share/alsa/ucm2/Amlogic/axg-sound-card/cainiao-cniot-core-HiFi.conf"
install -Dm644 "${SRC}/packages/bsp/cainiao-cniot-core/cainiao-cniot-core.conf" "${destination}/usr/share/alsa/ucm2/Amlogic/axg-sound-card/cainiao-cniot-core.conf"
if [ ! -d "${destination}/usr/share/alsa/ucm2/conf.d/axg-sound-card" ]; then
mkdir -p "${destination}/usr/share/alsa/ucm2/conf.d/axg-sound-card"
fi
ln -sfv /usr/share/alsa/ucm2/Amlogic/axg-sound-card/cainiao-cniot-core.conf \
"${destination}/usr/share/alsa/ucm2/conf.d/axg-sound-card/cainiao-cniot-core.conf"
}

View File

@ -21,11 +21,8 @@ function uboot_custom_postprocess() {
elif [[ $BOARD == odroidn2* ]]; then
# FIP trees 'odroid-n2-plus' and 'odroid-n2' are identical.
uboot_g12_postprocess "$SRC"/cache/sources/amlogic-boot-fip/odroid-n2 g12b
elif [[ $BOARD == khadas-vim3 ]]; then
# do nothing. VIM3 has its own post_uboot_custom_postprocess hook, directly in the board file.
:
elif [[ $BOARD == cainiao-cniot-core ]]; then
# do nothing. CAINIAO CNIoT-CORE has its own post_uboot_custom_postprocess hook, directly in the board file.
elif [[ $BOARD == khadas-vim3 ]] || [[ $BOARD == cainiao-cniot-core ]]; then
# do nothing. These boards have their own post_uboot_custom_postprocess hook, directly in the board file.
:
elif [[ $BOARD == radxa-zero2 ]]; then
uboot_g12_postprocess "$SRC"/cache/sources/amlogic-boot-fip/radxa-zero2 g12b

View File

@ -1,621 +0,0 @@
state.CNIoTCORE {
control.1 {
iface MIXER
name 'TOACODEC Lane Select'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 3'
}
}
control.2 {
iface MIXER
name 'ACODEC Playback Channel Mode'
value Stereo
comment {
access 'read write'
type ENUMERATED
count 1
item.0 Stereo
item.1 Mono
}
}
control.3 {
iface MIXER
name 'ACODEC Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.4 {
iface MIXER
name 'ACODEC Playback Volume'
value.0 255
value.1 255
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
dbmin -9999999
dbmax 0
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'ACODEC Ramp Rate'
value Fast
comment {
access 'read write'
type ENUMERATED
count 1
item.0 Fast
item.1 Slow
}
}
control.6 {
iface MIXER
name 'ACODEC Volume Ramp Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.7 {
iface MIXER
name 'ACODEC Mute Ramp Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.8 {
iface MIXER
name 'ACODEC Unmute Ramp Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.9 {
iface MIXER
name 'TDMOUT_C Lane 0 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.10 {
iface MIXER
name 'TDMOUT_C Lane 1 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.11 {
iface MIXER
name 'TDMOUT_C Lane 2 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.12 {
iface MIXER
name 'TDMOUT_C Lane 3 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.13 {
iface MIXER
name 'TDMOUT_C Gain Enable Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.14 {
iface MIXER
name 'TDMOUT_B Lane 0 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.15 {
iface MIXER
name 'TDMOUT_B Lane 1 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.16 {
iface MIXER
name 'TDMOUT_B Lane 2 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.17 {
iface MIXER
name 'TDMOUT_B Lane 3 Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 255'
}
}
control.18 {
iface MIXER
name 'TDMOUT_B Gain Enable Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.19 {
iface PCM
device 7
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access 'read volatile'
type INTEGER
count 8
range '0 - 36'
}
}
control.20 {
iface PCM
device 7
name 'IEC958 Playback Mask'
value ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.21 {
iface PCM
device 7
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.22 {
iface PCM
device 7
name ELD
value '100008006d10000100000000000000003669c2ac4d414732373451205144204532097f070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
control.23 {
iface MIXER
name 'FRDDR_A SRC 1 EN Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.24 {
iface MIXER
name 'FRDDR_A SRC 2 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.25 {
iface MIXER
name 'FRDDR_A SRC 3 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.26 {
iface MIXER
name 'FRDDR_A SINK 1 SEL'
value 'OUT 1'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.27 {
iface MIXER
name 'FRDDR_A SINK 2 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.28 {
iface MIXER
name 'FRDDR_A SINK 3 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.29 {
iface MIXER
name 'FRDDR_B SRC 1 EN Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.30 {
iface MIXER
name 'FRDDR_B SRC 2 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.31 {
iface MIXER
name 'FRDDR_B SRC 3 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.32 {
iface MIXER
name 'FRDDR_B SINK 1 SEL'
value 'OUT 2'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.33 {
iface MIXER
name 'FRDDR_B SINK 2 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.34 {
iface MIXER
name 'FRDDR_B SINK 3 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.35 {
iface MIXER
name 'FRDDR_C SRC 1 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.36 {
iface MIXER
name 'FRDDR_C SRC 2 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.37 {
iface MIXER
name 'FRDDR_C SRC 3 EN Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.38 {
iface MIXER
name 'FRDDR_C SINK 1 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.39 {
iface MIXER
name 'FRDDR_C SINK 2 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.40 {
iface MIXER
name 'FRDDR_C SINK 3 SEL'
value 'OUT 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'OUT 0'
item.1 'OUT 1'
item.2 'OUT 2'
item.3 'OUT 3'
item.4 'OUT 4'
item.5 'OUT 5'
item.6 'OUT 6'
item.7 'OUT 7'
}
}
control.41 {
iface MIXER
name 'TOHDMITX I2S SRC'
value 'I2S B'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'I2S A'
item.1 'I2S B'
item.2 'I2S C'
}
}
control.42 {
iface MIXER
name 'TOHDMITX Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.43 {
iface MIXER
name 'TOHDMITX SPDIF SRC'
value 'SPDIF A'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'SPDIF A'
item.1 'SPDIF B'
}
}
control.44 {
iface MIXER
name 'TOACODEC SRC'
value 'I2S C'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'I2S A'
item.1 'I2S B'
item.2 'I2S C'
}
}
control.45 {
iface MIXER
name 'TOACODEC OUT EN Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.46 {
iface MIXER
name 'ACODEC Right DAC Sel'
value Right
comment {
access 'read write'
type ENUMERATED
count 1
item.0 Right
item.1 Left
}
}
control.47 {
iface MIXER
name 'ACODEC Left DAC Sel'
value Left
comment {
access 'read write'
type ENUMERATED
count 1
item.0 Left
item.1 Right
}
}
control.48 {
iface MIXER
name 'TDMOUT_C SRC SEL'
value 'IN 1'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'IN 0'
item.1 'IN 1'
item.2 'IN 2'
}
}
control.49 {
iface MIXER
name 'TDMOUT_B SRC SEL'
value 'IN 0'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 'IN 0'
item.1 'IN 1'
item.2 'IN 2'
}
}
}

View File

@ -0,0 +1,61 @@
SectionVerb {
Value {
TQ "HiFi"
}
# Note that if some audio paths are not pre-configured here,
# allowing audio streams to be input to the device without returning errors,
# it will cause PipeWire to fail in parsing ALSA UCM.
EnableSequence [
# FRDDR_A -> TDMOUT_A -> TOHDMITX -> HDMI
cset "name='FRDDR_A SINK 1 SEL' 'OUT 0'"
cset "name='FRDDR_A SRC 1 EN Switch' on"
cset "name='TDMOUT_A SRC SEL' 'IN 0'"
cset "name='TOHDMITX Switch' off" # Disable output
cset "name='TOHDMITX I2S SRC' 'I2S A'"
# FRDDR_B -> TDMOUT_B -> TOACODEC -> ACODEC -> Internal Speaker
cset "name='FRDDR_B SINK 1 SEL' 'OUT 1'"
cset "name='FRDDR_B SRC 1 EN Switch' on"
cset "name='TDMOUT_B SRC SEL' 'IN 1'"
cset "name='TOACODEC Lane Select' 0"
cset "name='TOACODEC OUT EN Switch' off" # Disable output
cset "name='TOACODEC SRC' 'I2S B'"
cset "name='ACODEC Playback Volume' 255"
]
}
SectionDevice."HDMI" {
Comment "HDMI"
Value {
PlaybackPriority 200
PlaybackPCM "hw:${CardId},0" # plughw won't work
}
EnableSequence [
cset "name='TOHDMITX Switch' on"
]
DisableSequence [
cset "name='TOHDMITX Switch' off"
]
}
SectionDevice."Speaker" {
Comment "Internal Speaker"
Value {
PlaybackPriority 100
PlaybackPCM "hw:${CardId},1" # plughw won't work
PlaybackMixerElem "ACODEC"
}
EnableSequence [
cset "name='TOACODEC OUT EN Switch' on"
]
DisableSequence [
cset "name='TOACODEC OUT EN Switch' off"
]
}

View File

@ -0,0 +1,56 @@
Syntax 4
Comment "CAINIAO CNIoT-CORE Sound"
SectionUseCase."HiFi" {
File "/Amlogic/axg-sound-card/cainiao-cniot-core-HiFi.conf"
Comment "Play HiFi quality music"
}
BootSequence [
# Reset to default
cset "name='ACODEC Playback Volume' 0"
cset "name='ACODEC Left DAC Sel' 'Left'"
cset "name='ACODEC Mute Ramp Switch' off"
cset "name='ACODEC Playback Channel Mode' 'Stereo'"
cset "name='ACODEC Ramp Rate' 'Fast'"
cset "name='ACODEC Right DAC Sel' 'Right'"
cset "name='ACODEC Unmute Ramp Switch' off"
cset "name='ACODEC Volume Ramp Switch' off"
cset "name='FRDDR_A SINK 1 SEL' 'OUT 0'"
cset "name='FRDDR_A SINK 2 SEL' 'OUT 0'"
cset "name='FRDDR_A SINK 3 SEL' 'OUT 0'"
cset "name='FRDDR_A SRC 1 EN Switch' off"
cset "name='FRDDR_A SRC 2 EN Switch' off"
cset "name='FRDDR_A SRC 3 EN Switch' off"
cset "name='FRDDR_B SINK 1 SEL' 'OUT 0'"
cset "name='FRDDR_B SINK 2 SEL' 'OUT 0'"
cset "name='FRDDR_B SINK 3 SEL' 'OUT 0'"
cset "name='FRDDR_B SRC 1 EN Switch' off"
cset "name='FRDDR_B SRC 2 EN Switch' off"
cset "name='FRDDR_B SRC 3 EN Switch' off"
cset "name='FRDDR_C SINK 1 SEL' 'OUT 0'"
cset "name='FRDDR_C SINK 2 SEL' 'OUT 0'"
cset "name='FRDDR_C SINK 3 SEL' 'OUT 0'"
cset "name='FRDDR_C SRC 1 EN Switch' off"
cset "name='FRDDR_C SRC 2 EN Switch' off"
cset "name='FRDDR_C SRC 3 EN Switch' off"
cset "name='TDMOUT_A Gain Enable Switch' off"
cset "name='TDMOUT_A Lane 0 Volume' 0"
cset "name='TDMOUT_A Lane 1 Volume' 0"
cset "name='TDMOUT_A Lane 2 Volume' 0"
cset "name='TDMOUT_A Lane 3 Volume' 0"
cset "name='TDMOUT_A SRC SEL' 'IN 0'"
cset "name='TDMOUT_B Gain Enable Switch' off"
cset "name='TDMOUT_B Lane 0 Volume' 0"
cset "name='TDMOUT_B Lane 1 Volume' 0"
cset "name='TDMOUT_B Lane 2 Volume' 0"
cset "name='TDMOUT_B Lane 3 Volume' 0"
cset "name='TDMOUT_B SRC SEL' 'IN 0'"
cset "name='TOACODEC Lane Select' 0"
cset "name='TOACODEC OUT EN Switch' off"
cset "name='TOACODEC SRC' 'I2S A'"
cset "name='TOHDMITX Switch' off"
cset "name='TOHDMITX I2S SRC' 'I2S A'"
cset "name='TOHDMITX SPDIF SRC' 'SPDIF A'"
]