diff --git a/config/boards/cainiao-cniot-core.csc b/config/boards/cainiao-cniot-core.csc index 1518c1c8b..5ed44e3ac 100644 --- a/config/boards/cainiao-cniot-core.csc +++ b/config/boards/cainiao-cniot-core.csc @@ -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" +} diff --git a/config/sources/families/meson-g12b.conf b/config/sources/families/meson-g12b.conf index 22f56683a..ac9e3b471 100644 --- a/config/sources/families/meson-g12b.conf +++ b/config/sources/families/meson-g12b.conf @@ -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 diff --git a/packages/blobs/asound.state/asound.state.cainiao-cniot-core b/packages/blobs/asound.state/asound.state.cainiao-cniot-core deleted file mode 100644 index 4714671c1..000000000 --- a/packages/blobs/asound.state/asound.state.cainiao-cniot-core +++ /dev/null @@ -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' - } - } -} diff --git a/packages/bsp/cainiao-cniot-core/cainiao-cniot-core-HiFi.conf b/packages/bsp/cainiao-cniot-core/cainiao-cniot-core-HiFi.conf new file mode 100644 index 000000000..afa41df4f --- /dev/null +++ b/packages/bsp/cainiao-cniot-core/cainiao-cniot-core-HiFi.conf @@ -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" + ] +} diff --git a/packages/bsp/cainiao-cniot-core/cainiao-cniot-core.conf b/packages/bsp/cainiao-cniot-core/cainiao-cniot-core.conf new file mode 100644 index 000000000..71556525a --- /dev/null +++ b/packages/bsp/cainiao-cniot-core/cainiao-cniot-core.conf @@ -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'" +]