mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
Compare commits
13 Commits
v25.8.0-tr
...
coderabbit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9852b3afcf | ||
|
|
3844ef919f | ||
|
|
fc8fef06b2 | ||
|
|
99d23b8190 | ||
|
|
923dc8d7e8 | ||
|
|
8062795c00 | ||
|
|
057681b37d | ||
|
|
4d953d0b83 | ||
|
|
6eb849b60e | ||
|
|
a1168c2635 | ||
|
|
989f25533a | ||
|
|
ae9c66bc0d | ||
|
|
a4551ec75d |
9
.github/CODEOWNERS
vendored
9
.github/CODEOWNERS
vendored
@@ -87,6 +87,7 @@ config/boards/mkspi.csc @redrathnure
|
||||
config/boards/nanopct6-lts.conf @SuperKali @Tonymac32
|
||||
config/boards/nanopct6.conf @SuperKali @Tonymac32
|
||||
config/boards/nanopi-m6.conf @efectn
|
||||
config/boards/nanopi-r3s-lts.conf @pyavitz
|
||||
config/boards/nanopi-r5s.csc @utlark
|
||||
config/boards/nanopi-r6c.csc @ColorfulRhino
|
||||
config/boards/nanopi-r6s.conf @efectn
|
||||
@@ -191,7 +192,7 @@ config/kernel/linux-odroidxu4-*.config @joekhoobyar
|
||||
config/kernel/linux-phytium-embedded-*.config @chainsx
|
||||
config/kernel/linux-rk35xx-*.config @CodeChenL @ColorfulRhino @HeyMeco @JackHuang021 @SeeleVolleri @SuperKali @Tonymac32 @ZazaBR @alexl83 @amazingfate @andyshrk @catalinii @chainsx @efectn @fridtjof @ginkage @hoochiwetech @hqnicolas @krachlatte @lanefu @linhz0hz @mahdichi @mattx433 @monkaBlyat @prahal @rpardini @schwar3kat @sputnik2019 @vamzii
|
||||
config/kernel/linux-rockchip-*.config @paolosabatino
|
||||
config/kernel/linux-rockchip64-*.config @150balbes @ColorfulRhino @HeyMeco @JohnTheCoolingFan @SuperKali @TRSx80 @TheSnowfield @Tonymac32 @ZazaBR @ahoneybun @alexl83 @amazingfate @andyshrk @brentr @catalinii @clee @efectn @fridtjof @hqnicolas @igorpecovnik @joekhoobyar @krachlatte @lanefu @linhz0hz @mlegenovic @paolosabatino @prahal @redrathnure @rpardini @schwar3kat @sicXnull @tdleiyao @torte71 @utlark @vamzii
|
||||
config/kernel/linux-rockchip64-*.config @150balbes @ColorfulRhino @HeyMeco @JohnTheCoolingFan @SuperKali @TRSx80 @TheSnowfield @Tonymac32 @ZazaBR @ahoneybun @alexl83 @amazingfate @andyshrk @brentr @catalinii @clee @efectn @fridtjof @hqnicolas @igorpecovnik @joekhoobyar @krachlatte @lanefu @linhz0hz @mlegenovic @paolosabatino @prahal @pyavitz @redrathnure @rpardini @schwar3kat @sicXnull @tdleiyao @torte71 @utlark @vamzii
|
||||
config/kernel/linux-sm8250-*.config @FantasyGmm @amazingfate
|
||||
config/kernel/linux-sm8550-*.config @FantasyGmm
|
||||
config/kernel/linux-spacemit-*.config @pyavitz
|
||||
@@ -229,7 +230,7 @@ patch/kernel/archive/meson64-*/ @NicoD-SBC @SteeManMI @Tonymac32 @adeepn @clee
|
||||
patch/kernel/archive/mvebu-*/ @Heisath
|
||||
patch/kernel/archive/odroidxu4-*/ @joekhoobyar
|
||||
patch/kernel/archive/rockchip-*/ @paolosabatino
|
||||
patch/kernel/archive/rockchip64-*/ @150balbes @ColorfulRhino @HeyMeco @JohnTheCoolingFan @SuperKali @TRSx80 @TheSnowfield @Tonymac32 @ZazaBR @ahoneybun @alexl83 @amazingfate @andyshrk @brentr @catalinii @clee @efectn @fridtjof @hqnicolas @igorpecovnik @joekhoobyar @krachlatte @lanefu @linhz0hz @mlegenovic @paolosabatino @prahal @redrathnure @rpardini @schwar3kat @sicXnull @tdleiyao @torte71 @utlark @vamzii
|
||||
patch/kernel/archive/rockchip64-*/ @150balbes @ColorfulRhino @HeyMeco @JohnTheCoolingFan @SuperKali @TRSx80 @TheSnowfield @Tonymac32 @ZazaBR @ahoneybun @alexl83 @amazingfate @andyshrk @brentr @catalinii @clee @efectn @fridtjof @hqnicolas @igorpecovnik @joekhoobyar @krachlatte @lanefu @linhz0hz @mlegenovic @paolosabatino @prahal @pyavitz @redrathnure @rpardini @schwar3kat @sicXnull @tdleiyao @torte71 @utlark @vamzii
|
||||
patch/kernel/archive/sm8250-*/ @FantasyGmm @amazingfate
|
||||
patch/kernel/archive/sm8550-*/ @FantasyGmm
|
||||
patch/kernel/archive/spacemit-*/ @pyavitz
|
||||
@@ -281,7 +282,7 @@ patch/u-boot/v2025-sunxi/ @The-going
|
||||
patch/u-boot/v2025.01-rc3-coolpi-cm5/ @andyshrk
|
||||
patch/u-boot/v2025.01/ @ColorfulRhino @efectn @jeanrhum @joekhoobyar @paolosabatino @pyavitz @rpardini @torte71
|
||||
patch/u-boot/v2025.01/board_h96-tvbox-3566/ @hqnicolas
|
||||
patch/u-boot/v2025.04/ @IsMrX @NicoD-SBC @SuperKali @TheSnowfield @Tonymac32 @ZazaBR @amazingfate @andyshrk @catalinii @igorpecovnik @mlegenovic @rpardini @vamzii
|
||||
patch/u-boot/v2025.04/ @IsMrX @NicoD-SBC @SuperKali @TheSnowfield @Tonymac32 @ZazaBR @amazingfate @andyshrk @catalinii @igorpecovnik @mlegenovic @pyavitz @rpardini @vamzii
|
||||
sources/families/bcm2711.conf @PanderMusubi @teknoid
|
||||
sources/families/genio.conf @HeyMeco
|
||||
sources/families/imx8m.conf @schmiedelm
|
||||
@@ -298,7 +299,7 @@ sources/families/meson8b.conf @hzyitc @juanlufont
|
||||
sources/families/mvebu.conf @Heisath
|
||||
sources/families/odroidxu4.conf @joekhoobyar
|
||||
sources/families/phytium-embedded.conf @chainsx
|
||||
sources/families/rk35xx.conf @CodeChenL @ZazaBR @amazingfate @andyshrk @catalinii @hoochiwetech @hqnicolas @krachlatte @mattx433 @sputnik2019 @tdleiyao @vamzii
|
||||
sources/families/rk35xx.conf @CodeChenL @ZazaBR @amazingfate @andyshrk @catalinii @hoochiwetech @hqnicolas @krachlatte @mattx433 @pyavitz @sputnik2019 @tdleiyao @vamzii
|
||||
sources/families/rockchip-rk3588.conf @ColorfulRhino @HeyMeco @JackHuang021 @SeeleVolleri @SuperKali @Tonymac32 @alexl83 @amazingfate @andyshrk @chainsx @efectn @fridtjof @ginkage @lanefu @linhz0hz @mahdichi @monkaBlyat @prahal @rpardini @schwar3kat
|
||||
sources/families/rockchip.conf @paolosabatino
|
||||
sources/families/rockchip64.conf @150balbes @JohnTheCoolingFan @TRSx80 @TheSnowfield @Tonymac32 @ahoneybun @andyshrk @brentr @clee @hqnicolas @igorpecovnik @joekhoobyar @mlegenovic @paolosabatino @prahal @redrathnure @rpardini @sicXnull @torte71 @utlark
|
||||
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@4140eb99d2cced9bfd78375c2088371853262f79 # v46.0.3
|
||||
uses: tj-actions/changed-files@d52d20fa3f981cb852b861fd8f55308b5fe29637 # v46.0.3
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
2
.github/workflows/pr-lint-scripts.yml
vendored
2
.github/workflows/pr-lint-scripts.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@4140eb99d2cced9bfd78375c2088371853262f79 # v46.0.3
|
||||
uses: tj-actions/changed-files@d52d20fa3f981cb852b861fd8f55308b5fe29637 # v46.0.3
|
||||
|
||||
- name: List all changed files
|
||||
run: |
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Rockchip RK3588 octa core whatever fixme
|
||||
# Rockchip RK3588 octa core 4/8/16GB RAM SoC SPI NVMe 2x USB2 2x USB3 HDMI HDMI-in
|
||||
BOARD_NAME="Orange Pi 5 Ultra"
|
||||
BOARDFAMILY="rockchip-rk3588"
|
||||
BOARD_MAINTAINER=""
|
||||
|
||||
@@ -871,9 +871,12 @@ CONFIG_I2C_MUX_PINCTRL=m
|
||||
CONFIG_I2C_BCM2708=m
|
||||
CONFIG_I2C_BCM2835=m
|
||||
CONFIG_I2C_BRCMSTB=m
|
||||
CONFIG_I2C_DESIGNWARE_CORE=m
|
||||
CONFIG_I2C_GPIO=m
|
||||
CONFIG_I2C_ROBOTFUZZ_OSIF=m
|
||||
CONFIG_I2C_TINY_USB=m
|
||||
CONFIG_I2C_SLAVE=y
|
||||
CONFIG_I2C_DESIGNWARE_SLAVE=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM2835=m
|
||||
CONFIG_SPI_BCM2835AUX=m
|
||||
|
||||
@@ -856,10 +856,13 @@ CONFIG_I2C_MUX_PINCTRL=m
|
||||
CONFIG_I2C_BCM2708=m
|
||||
CONFIG_I2C_BCM2835=m
|
||||
CONFIG_I2C_BRCMSTB=m
|
||||
CONFIG_I2C_DESIGNWARE_CORE=m
|
||||
CONFIG_I2C_GPIO=m
|
||||
CONFIG_I2C_CP2615=m
|
||||
CONFIG_I2C_ROBOTFUZZ_OSIF=m
|
||||
CONFIG_I2C_TINY_USB=m
|
||||
CONFIG_I2C_SLAVE=y
|
||||
CONFIG_I2C_DESIGNWARE_SLAVE=y
|
||||
CONFIG_I2C_VIRTIO=m
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM2835=m
|
||||
|
||||
@@ -814,10 +814,13 @@ CONFIG_I2C_CHARDEV=m
|
||||
CONFIG_I2C_MUX_GPMUX=m
|
||||
CONFIG_I2C_MUX_PCA954x=m
|
||||
CONFIG_I2C_MUX_PINCTRL=m
|
||||
CONFIG_I2C_DESIGNWARE_CORE=m
|
||||
CONFIG_I2C_GPIO=m
|
||||
CONFIG_I2C_CP2615=m
|
||||
CONFIG_I2C_ROBOTFUZZ_OSIF=m
|
||||
CONFIG_I2C_TINY_USB=m
|
||||
CONFIG_I2C_SLAVE=y
|
||||
CONFIG_I2C_DESIGNWARE_SLAVE=y
|
||||
CONFIG_I2C_VIRTIO=m
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_DESIGNWARE=m
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
61
packages/bsp/cainiao-cniot-core/cainiao-cniot-core-HiFi.conf
Normal file
61
packages/bsp/cainiao-cniot-core/cainiao-cniot-core-HiFi.conf
Normal 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"
|
||||
]
|
||||
}
|
||||
56
packages/bsp/cainiao-cniot-core/cainiao-cniot-core.conf
Normal file
56
packages/bsp/cainiao-cniot-core/cainiao-cniot-core.conf
Normal 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'"
|
||||
]
|
||||
@@ -43,7 +43,7 @@ index 111111111111..222222222222 100644
|
||||
+ */
|
||||
{
|
||||
.limits = {
|
||||
.max_hdmi_phy_freq = 1650000,
|
||||
.max_hdmi_phy_freq = 1650000000,
|
||||
},
|
||||
.attrs = (const struct soc_device_attribute []) {
|
||||
{ .soc_id = "GXL (S805*)", },
|
||||
|
||||
@@ -205,21 +205,21 @@
|
||||
|
||||
sound {
|
||||
compatible = "amlogic,axg-sound-card";
|
||||
model = "CNIoT-CORE";
|
||||
audio-widgets = "Line", "Lineout";
|
||||
audio-aux-devs = <&tdmout_b>, <&tdmout_c>, <&ht6872>;
|
||||
audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
model = "cainiao-cniot-core";
|
||||
audio-widgets = "Speaker", "Internal Speaker";
|
||||
audio-aux-devs = <&tdmout_a>, <&tdmout_b>, <&ht6872>;
|
||||
audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0",
|
||||
"TDMOUT_A IN 1", "FRDDR_B OUT 0",
|
||||
"TDMOUT_A IN 2", "FRDDR_C OUT 0",
|
||||
"TDM_A Playback", "TDMOUT_A OUT",
|
||||
"TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
"TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
"TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
"TDM_B Playback", "TDMOUT_B OUT",
|
||||
"TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||
"TDMOUT_C IN 1", "FRDDR_B OUT 2",
|
||||
"TDMOUT_C IN 2", "FRDDR_C OUT 2",
|
||||
"TDM_C Playback", "TDMOUT_C OUT",
|
||||
"HT6872 INL", "ACODEC LOLP",
|
||||
"HT6872 INR", "ACODEC LORP",
|
||||
"Lineout", "HT6872 OUTL",
|
||||
"Lineout", "HT6872 OUTR";
|
||||
"Internal Speaker", "HT6872 OUTL",
|
||||
"Internal Speaker", "HT6872 OUTR";
|
||||
|
||||
clocks = <&clkc CLKID_MPLL2>,
|
||||
<&clkc CLKID_MPLL0>,
|
||||
@@ -247,6 +247,25 @@
|
||||
|
||||
/* 8ch hdmi interface */
|
||||
dai-link-3 {
|
||||
sound-dai = <&tdmif_a>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-1 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec-0 {
|
||||
sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
|
||||
};
|
||||
|
||||
codec-1 {
|
||||
sound-dai = <&toacodec TOACODEC_IN_A>;
|
||||
};
|
||||
};
|
||||
|
||||
/* 8ch hdmi interface */
|
||||
dai-link-4 {
|
||||
sound-dai = <&tdmif_b>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
@@ -255,19 +274,12 @@
|
||||
dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec {
|
||||
codec-0 {
|
||||
sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
|
||||
};
|
||||
};
|
||||
|
||||
dai-link-4 {
|
||||
sound-dai = <&tdmif_c>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec {
|
||||
sound-dai = <&toacodec TOACODEC_IN_C>;
|
||||
codec-1 {
|
||||
sound-dai = <&toacodec TOACODEC_IN_B>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -526,11 +538,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
&tdmif_a {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tdmif_b {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tdmif_c {
|
||||
&tdmout_a {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -538,10 +554,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tdmout_c {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&toacodec {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
* Copyright (c) 2024 Patrick Yavitz <pyavitz@gmail.com>
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@@ -16,21 +16,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
rtc: rtc@51 {
|
||||
compatible = "nxp,pcf85063a";
|
||||
reg = <0x51>;
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
fanctrl: emc2305@2f {
|
||||
compatible = "smsc,emc2305";
|
||||
reg = <0x2f>;
|
||||
#cooling-cells = <0x02>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&cpu_thermal {
|
||||
trips {
|
||||
fanmid0: fanmid0 {
|
||||
@@ -59,6 +44,21 @@
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
rtc: rtc@51 {
|
||||
compatible = "nxp,pcf85063a";
|
||||
reg = <0x51>;
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
fanctrl: emc2305@2f {
|
||||
compatible = "smsc,emc2305";
|
||||
reg = <0x2f>;
|
||||
#cooling-cells = <0x02>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&usb {
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
@@ -205,21 +205,21 @@
|
||||
|
||||
sound {
|
||||
compatible = "amlogic,axg-sound-card";
|
||||
model = "CNIoT-CORE";
|
||||
audio-widgets = "Line", "Lineout";
|
||||
audio-aux-devs = <&tdmout_b>, <&tdmout_c>, <&ht6872>;
|
||||
audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
model = "cainiao-cniot-core";
|
||||
audio-widgets = "Speaker", "Internal Speaker";
|
||||
audio-aux-devs = <&tdmout_a>, <&tdmout_b>, <&ht6872>;
|
||||
audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0",
|
||||
"TDMOUT_A IN 1", "FRDDR_B OUT 0",
|
||||
"TDMOUT_A IN 2", "FRDDR_C OUT 0",
|
||||
"TDM_A Playback", "TDMOUT_A OUT",
|
||||
"TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
"TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
"TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
"TDM_B Playback", "TDMOUT_B OUT",
|
||||
"TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||
"TDMOUT_C IN 1", "FRDDR_B OUT 2",
|
||||
"TDMOUT_C IN 2", "FRDDR_C OUT 2",
|
||||
"TDM_C Playback", "TDMOUT_C OUT",
|
||||
"HT6872 INL", "ACODEC LOLP",
|
||||
"HT6872 INR", "ACODEC LORP",
|
||||
"Lineout", "HT6872 OUTL",
|
||||
"Lineout", "HT6872 OUTR";
|
||||
"Internal Speaker", "HT6872 OUTL",
|
||||
"Internal Speaker", "HT6872 OUTR";
|
||||
|
||||
clocks = <&clkc CLKID_MPLL2>,
|
||||
<&clkc CLKID_MPLL0>,
|
||||
@@ -247,6 +247,25 @@
|
||||
|
||||
/* 8ch hdmi interface */
|
||||
dai-link-3 {
|
||||
sound-dai = <&tdmif_a>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-1 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec-0 {
|
||||
sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
|
||||
};
|
||||
|
||||
codec-1 {
|
||||
sound-dai = <&toacodec TOACODEC_IN_A>;
|
||||
};
|
||||
};
|
||||
|
||||
/* 8ch hdmi interface */
|
||||
dai-link-4 {
|
||||
sound-dai = <&tdmif_b>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
@@ -255,19 +274,12 @@
|
||||
dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec {
|
||||
codec-0 {
|
||||
sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
|
||||
};
|
||||
};
|
||||
|
||||
dai-link-4 {
|
||||
sound-dai = <&tdmif_c>;
|
||||
dai-format = "i2s";
|
||||
dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
mclk-fs = <256>;
|
||||
|
||||
codec {
|
||||
sound-dai = <&toacodec TOACODEC_IN_C>;
|
||||
codec-1 {
|
||||
sound-dai = <&toacodec TOACODEC_IN_B>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -526,11 +538,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
&tdmif_a {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tdmif_b {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tdmif_c {
|
||||
&tdmout_a {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -538,10 +554,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tdmout_c {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&toacodec {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
* Copyright (c) 2024 Patrick Yavitz <pyavitz@gmail.com>
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@@ -16,21 +16,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
rtc: rtc@51 {
|
||||
compatible = "nxp,pcf85063a";
|
||||
reg = <0x51>;
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
fanctrl: emc2305@2f {
|
||||
compatible = "smsc,emc2305";
|
||||
reg = <0x2f>;
|
||||
#cooling-cells = <0x02>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&cpu_thermal {
|
||||
trips {
|
||||
fanmid0: fanmid0 {
|
||||
@@ -59,6 +44,21 @@
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
rtc: rtc@51 {
|
||||
compatible = "nxp,pcf85063a";
|
||||
reg = <0x51>;
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
fanctrl: emc2305@2f {
|
||||
compatible = "smsc,emc2305";
|
||||
reg = <0x2f>;
|
||||
#cooling-cells = <0x02>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&usb {
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
@@ -21,9 +21,10 @@ diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/roc
|
||||
index 111111111111..222222222222 100644
|
||||
--- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
||||
+++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
||||
@@ -193,6 +193,10 @@
|
||||
@@ -193,7 +193,11 @@
|
||||
#define LN3_TX_SER_RATE_SEL_HBR3 BIT(2)
|
||||
|
||||
#define HDMI14_MAX_RATE 340000000
|
||||
#define HDMI20_MAX_RATE 600000000
|
||||
+#define DATA_RATE_MASK 0xFFFFFFF
|
||||
+#define COLOR_DEPTH_MASK BIT(31)
|
||||
@@ -346,20 +347,17 @@ index 111111111111..222222222222 100644
|
||||
static bool rk_hdptx_phy_clk_pll_calc(unsigned int data_rate,
|
||||
struct ropll_config *cfg)
|
||||
{
|
||||
@@ -765,9 +1034,13 @@ static bool rk_hdptx_phy_clk_pll_calc(unsigned int data_rate,
|
||||
@@ -765,7 +1034,11 @@ static bool rk_hdptx_phy_clk_pll_calc(unsigned int data_rate,
|
||||
static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx,
|
||||
unsigned int rate)
|
||||
{
|
||||
+ int i, bus_width = phy_get_bus_width(hdptx->phy);
|
||||
+ int bus_width = phy_get_bus_width(hdptx->phy);
|
||||
+ u8 color_depth = (bus_width & COLOR_DEPTH_MASK) ? 1 : 0;
|
||||
const struct ropll_config *cfg = NULL;
|
||||
struct ropll_config rc = {0};
|
||||
- int i;
|
||||
+
|
||||
+ if (color_depth)
|
||||
+ rate = rate * 10 / 8;
|
||||
|
||||
hdptx->rate = rate * 100;
|
||||
int ret, i;
|
||||
|
||||
@@ -825,6 +1098,9 @@ static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx,
|
||||
regmap_update_bits(hdptx->regmap, CMN_REG(0086), PLL_PCG_POSTDIV_SEL_MASK,
|
||||
|
||||
@@ -128,10 +128,10 @@ index 00000000..345d9b86
|
||||
+CONFIG_ZSTD=y
|
||||
diff --git a/dts/upstream/src/arm64/amlogic/meson-g12b-a311d-cainiao-cniot-core.dts b/dts/upstream/src/arm64/amlogic/meson-g12b-a311d-cainiao-cniot-core.dts
|
||||
new file mode 100644
|
||||
index 00000000..53318e9d
|
||||
index 00000000..bdfcce04
|
||||
--- /dev/null
|
||||
+++ b/dts/upstream/src/arm64/amlogic/meson-g12b-a311d-cainiao-cniot-core.dts
|
||||
@@ -0,0 +1,588 @@
|
||||
@@ -0,0 +1,600 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS
|
||||
@@ -339,21 +339,21 @@ index 00000000..53318e9d
|
||||
+
|
||||
+ sound {
|
||||
+ compatible = "amlogic,axg-sound-card";
|
||||
+ model = "CNIoT-CORE";
|
||||
+ audio-widgets = "Line", "Lineout";
|
||||
+ audio-aux-devs = <&tdmout_b>, <&tdmout_c>, <&ht6872>;
|
||||
+ audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
+ model = "cainiao-cniot-core";
|
||||
+ audio-widgets = "Speaker", "Internal Speaker";
|
||||
+ audio-aux-devs = <&tdmout_a>, <&tdmout_b>, <&ht6872>;
|
||||
+ audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0",
|
||||
+ "TDMOUT_A IN 1", "FRDDR_B OUT 0",
|
||||
+ "TDMOUT_A IN 2", "FRDDR_C OUT 0",
|
||||
+ "TDM_A Playback", "TDMOUT_A OUT",
|
||||
+ "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
+ "TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
+ "TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
+ "TDM_B Playback", "TDMOUT_B OUT",
|
||||
+ "TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||
+ "TDMOUT_C IN 1", "FRDDR_B OUT 2",
|
||||
+ "TDMOUT_C IN 2", "FRDDR_C OUT 2",
|
||||
+ "TDM_C Playback", "TDMOUT_C OUT",
|
||||
+ "HT6872 INL", "ACODEC LOLP",
|
||||
+ "HT6872 INR", "ACODEC LORP",
|
||||
+ "Lineout", "HT6872 OUTL",
|
||||
+ "Lineout", "HT6872 OUTR";
|
||||
+ "Internal Speaker", "HT6872 OUTL",
|
||||
+ "Internal Speaker", "HT6872 OUTR";
|
||||
+
|
||||
+ clocks = <&clkc CLKID_MPLL2>,
|
||||
+ <&clkc CLKID_MPLL0>,
|
||||
@@ -381,6 +381,25 @@ index 00000000..53318e9d
|
||||
+
|
||||
+ /* 8ch hdmi interface */
|
||||
+ dai-link-3 {
|
||||
+ sound-dai = <&tdmif_a>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-1 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec-0 {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
|
||||
+ };
|
||||
+
|
||||
+ codec-1 {
|
||||
+ sound-dai = <&toacodec TOACODEC_IN_A>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ /* 8ch hdmi interface */
|
||||
+ dai-link-4 {
|
||||
+ sound-dai = <&tdmif_b>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
@@ -389,19 +408,12 @@ index 00000000..53318e9d
|
||||
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec {
|
||||
+ codec-0 {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ dai-link-4 {
|
||||
+ sound-dai = <&tdmif_c>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&toacodec TOACODEC_IN_C>;
|
||||
+ codec-1 {
|
||||
+ sound-dai = <&toacodec TOACODEC_IN_B>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
@@ -660,11 +672,15 @@ index 00000000..53318e9d
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&tdmif_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmif_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmif_c {
|
||||
+&tdmout_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
@@ -672,10 +688,6 @@ index 00000000..53318e9d
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmout_c {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&toacodec {
|
||||
+ status = "okay";
|
||||
+};
|
||||
|
||||
401
tests/test_apa.bats
Normal file
401
tests/test_apa.bats
Normal file
@@ -0,0 +1,401 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# Load the apa script for testing
|
||||
APA_SCRIPT="${BATS_TEST_DIRNAME}/../git/extensions/apa.sh"
|
||||
|
||||
setup() {
|
||||
# Create temporary directory for test isolation
|
||||
export TEST_TEMP_DIR="$(mktemp -d)"
|
||||
export ORIGINAL_HOME="$HOME"
|
||||
export ORIGINAL_APA_CONFIG_DIR="$APA_CONFIG_DIR"
|
||||
export ORIGINAL_APA_LOG_LEVEL="$APA_LOG_LEVEL"
|
||||
export ORIGINAL_APA_TIMEOUT="$APA_TIMEOUT"
|
||||
|
||||
# Set up test environment
|
||||
export HOME="$TEST_TEMP_DIR"
|
||||
export APA_CONFIG_DIR="$TEST_TEMP_DIR/.apa"
|
||||
export APA_LOG_LEVEL="quiet"
|
||||
export APA_TIMEOUT="10"
|
||||
|
||||
# Make apa script executable and available
|
||||
chmod +x "$APA_SCRIPT"
|
||||
export PATH="$(dirname "$APA_SCRIPT"):$PATH"
|
||||
}
|
||||
|
||||
teardown() {
|
||||
# Restore original environment
|
||||
export HOME="$ORIGINAL_HOME"
|
||||
export APA_CONFIG_DIR="$ORIGINAL_APA_CONFIG_DIR"
|
||||
export APA_LOG_LEVEL="$ORIGINAL_APA_LOG_LEVEL"
|
||||
export APA_TIMEOUT="$ORIGINAL_APA_TIMEOUT"
|
||||
|
||||
# Clean up temporary files
|
||||
[ -n "$TEST_TEMP_DIR" ] && rm -rf "$TEST_TEMP_DIR"
|
||||
}
|
||||
|
||||
@test "apa script exists and is executable" {
|
||||
[ -f "$APA_SCRIPT" ]
|
||||
[ -x "$APA_SCRIPT" ]
|
||||
}
|
||||
|
||||
@test "apa shows help with --help option" {
|
||||
run bash "$APA_SCRIPT" --help
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "apa - Automated Package Assistant" ]]
|
||||
[[ "$output" =~ "Usage:" ]]
|
||||
[[ "$output" =~ "Commands:" ]]
|
||||
[[ "$output" =~ "install" ]]
|
||||
[[ "$output" =~ "update" ]]
|
||||
[[ "$output" =~ "remove" ]]
|
||||
}
|
||||
|
||||
@test "apa shows help with -h option" {
|
||||
run bash "$APA_SCRIPT" -h
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "apa - Automated Package Assistant" ]]
|
||||
}
|
||||
|
||||
@test "apa shows version with --version option" {
|
||||
run bash "$APA_SCRIPT" --version
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "apa version 1.2.3" ]]
|
||||
}
|
||||
|
||||
@test "apa shows version with -v option" {
|
||||
run bash "$APA_SCRIPT" -v
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "apa version 1.2.3" ]]
|
||||
}
|
||||
|
||||
@test "apa shows help when run with no arguments" {
|
||||
run bash "$APA_SCRIPT"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Usage:" ]]
|
||||
}
|
||||
|
||||
@test "apa install succeeds with valid package name" {
|
||||
run bash "$APA_SCRIPT" install nginx
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Package nginx installed successfully" ]]
|
||||
}
|
||||
|
||||
@test "apa install creates config directory" {
|
||||
bash "$APA_SCRIPT" install test-package
|
||||
[ -d "$APA_CONFIG_DIR" ]
|
||||
}
|
||||
|
||||
@test "apa install fails without package name" {
|
||||
run bash "$APA_SCRIPT" install
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Install command requires a package name" ]]
|
||||
}
|
||||
|
||||
@test "apa install fails with empty package name" {
|
||||
run bash "$APA_SCRIPT" install ""
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Package name cannot be empty" ]]
|
||||
}
|
||||
|
||||
@test "apa install fails with invalid package name containing spaces" {
|
||||
run bash "$APA_SCRIPT" install "invalid package"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa install fails with invalid package name containing special chars" {
|
||||
run bash "$APA_SCRIPT" install "invalid@package#"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa install accepts valid package names with dots, dashes, underscores" {
|
||||
run bash "$APA_SCRIPT" install "valid-package_name.123"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "installed successfully" ]]
|
||||
}
|
||||
|
||||
@test "apa update succeeds with valid package name" {
|
||||
run bash "$APA_SCRIPT" update nginx
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Package nginx updated successfully" ]]
|
||||
}
|
||||
|
||||
@test "apa update fails without package name" {
|
||||
run bash "$APA_SCRIPT" update
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Update command requires a package name" ]]
|
||||
}
|
||||
|
||||
@test "apa update fails with empty package name" {
|
||||
run bash "$APA_SCRIPT" update ""
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Package name cannot be empty" ]]
|
||||
}
|
||||
|
||||
@test "apa update fails with invalid package name" {
|
||||
run bash "$APA_SCRIPT" update "invalid@package"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa remove succeeds with valid package name" {
|
||||
run bash "$APA_SCRIPT" remove nginx
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Package nginx removed successfully" ]]
|
||||
}
|
||||
|
||||
@test "apa remove fails without package name" {
|
||||
run bash "$APA_SCRIPT" remove
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Remove command requires a package name" ]]
|
||||
}
|
||||
|
||||
@test "apa remove fails with empty package name" {
|
||||
run bash "$APA_SCRIPT" remove ""
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Package name cannot be empty" ]]
|
||||
}
|
||||
|
||||
@test "apa remove fails with invalid package name" {
|
||||
run bash "$APA_SCRIPT" remove "invalid package name"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa list shows installed packages" {
|
||||
run bash "$APA_SCRIPT" list
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "nginx-1.18.0" ]]
|
||||
[[ "$output" =~ "curl-7.68.0" ]]
|
||||
[[ "$output" =~ "git-2.34.1" ]]
|
||||
}
|
||||
|
||||
@test "apa search succeeds with valid query" {
|
||||
run bash "$APA_SCRIPT" search "web"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Found packages matching 'web'" ]]
|
||||
[[ "$output" =~ "web-server-toolkit" ]]
|
||||
}
|
||||
|
||||
@test "apa search fails without query" {
|
||||
run bash "$APA_SCRIPT" search
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Search command requires a query" ]]
|
||||
}
|
||||
|
||||
@test "apa search fails with empty query" {
|
||||
run bash "$APA_SCRIPT" search ""
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Search query cannot be empty" ]]
|
||||
}
|
||||
|
||||
@test "apa search handles special characters in query" {
|
||||
run bash "$APA_SCRIPT" search "web-server"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Found packages matching" ]]
|
||||
}
|
||||
|
||||
@test "apa info succeeds with valid package name" {
|
||||
run bash "$APA_SCRIPT" info nginx
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Package: nginx" ]]
|
||||
[[ "$output" =~ "Version:" ]]
|
||||
[[ "$output" =~ "Description:" ]]
|
||||
[[ "$output" =~ "Maintainer:" ]]
|
||||
}
|
||||
|
||||
@test "apa info fails without package name" {
|
||||
run bash "$APA_SCRIPT" info
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Info command requires a package name" ]]
|
||||
}
|
||||
|
||||
@test "apa info fails with empty package name" {
|
||||
run bash "$APA_SCRIPT" info ""
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Package name cannot be empty" ]]
|
||||
}
|
||||
|
||||
@test "apa info fails with invalid package name" {
|
||||
run bash "$APA_SCRIPT" info "invalid@package"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa handles unknown command gracefully" {
|
||||
run bash "$APA_SCRIPT" unknown-command
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Unknown command: unknown-command" ]]
|
||||
}
|
||||
|
||||
@test "apa handles unknown option gracefully" {
|
||||
run bash "$APA_SCRIPT" --unknown-option
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Unknown option: --unknown-option" ]]
|
||||
}
|
||||
|
||||
@test "apa quiet option suppresses info output" {
|
||||
run bash "$APA_SCRIPT" --quiet install test-package
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "installed successfully" ]]
|
||||
# Info logs should be suppressed in quiet mode
|
||||
}
|
||||
|
||||
@test "apa debug option enables debug output" {
|
||||
export APA_LOG_LEVEL="debug"
|
||||
run bash "$APA_SCRIPT" --debug install test-package
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa timeout option is accepted" {
|
||||
run bash "$APA_SCRIPT" --timeout 60 --help
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa respects APA_CONFIG_DIR environment variable" {
|
||||
export APA_CONFIG_DIR="$TEST_TEMP_DIR/custom-config"
|
||||
bash "$APA_SCRIPT" install test-package
|
||||
[ -d "$TEST_TEMP_DIR/custom-config" ]
|
||||
}
|
||||
|
||||
@test "apa respects APA_LOG_LEVEL environment variable" {
|
||||
export APA_LOG_LEVEL="debug"
|
||||
run bash "$APA_SCRIPT" install test-package
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa respects APA_TIMEOUT environment variable" {
|
||||
export APA_TIMEOUT="120"
|
||||
run bash "$APA_SCRIPT" install test-package
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa handles very long package names gracefully" {
|
||||
local long_name=$(printf 'a%.0s' {1..1000})
|
||||
run bash "$APA_SCRIPT" install "$long_name"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa handles package names with only valid characters at boundary" {
|
||||
# Test exactly valid characters
|
||||
run bash "$APA_SCRIPT" install "a"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run bash "$APA_SCRIPT" install "a-b_c.123"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run bash "$APA_SCRIPT" install "123"
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa rejects command injection attempts" {
|
||||
run bash "$APA_SCRIPT" install "; rm -rf /"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
|
||||
run bash "$APA_SCRIPT" install "$(whoami)"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
|
||||
run bash "$APA_SCRIPT" install "|cat /etc/passwd"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa handles unicode characters in package names" {
|
||||
run bash "$APA_SCRIPT" install "测试包"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid package name" ]]
|
||||
}
|
||||
|
||||
@test "apa handles null bytes in input" {
|
||||
printf "test\0package" | run bash "$APA_SCRIPT" install
|
||||
[ "$status" -eq 1 ]
|
||||
}
|
||||
|
||||
@test "apa handles missing HOME directory" {
|
||||
unset HOME
|
||||
run bash "$APA_SCRIPT" install test-package
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa handles non-writable config directory parent" {
|
||||
# This test may need to be skipped in some environments
|
||||
if [[ "$EUID" -ne 0 ]]; then
|
||||
export APA_CONFIG_DIR="/root/test-apa-config"
|
||||
run bash "$APA_SCRIPT" install test-package
|
||||
# Should handle gracefully, not necessarily succeed
|
||||
[[ "$status" -eq 0 || "$status" -eq 1 ]]
|
||||
else
|
||||
skip "Cannot test non-writable directory as root"
|
||||
fi
|
||||
}
|
||||
|
||||
@test "apa operations complete within timeout" {
|
||||
# Test that operations don't hang indefinitely
|
||||
timeout 30s bash "$APA_SCRIPT" install test-package
|
||||
[ $? -ne 124 ] # 124 is timeout's exit code
|
||||
}
|
||||
|
||||
@test "apa can handle multiple operations in sequence" {
|
||||
run bash "$APA_SCRIPT" install package1
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run bash "$APA_SCRIPT" update package1
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run bash "$APA_SCRIPT" info package1
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run bash "$APA_SCRIPT" remove package1
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa output format is consistent across commands" {
|
||||
# Test that all successful operations produce clean output
|
||||
run bash "$APA_SCRIPT" install test-package
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ ^[[:print:][:space:]]*$ ]]
|
||||
|
||||
run bash "$APA_SCRIPT" list
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ ^[[:print:][:space:]]*$ ]]
|
||||
}
|
||||
|
||||
@test "apa handles concurrent execution" {
|
||||
# Run multiple instances to test for race conditions
|
||||
bash "$APA_SCRIPT" install package1 &
|
||||
bash "$APA_SCRIPT" install package2 &
|
||||
bash "$APA_SCRIPT" list &
|
||||
|
||||
wait
|
||||
[ $? -eq 0 ]
|
||||
}
|
||||
|
||||
@test "apa config directory creation is idempotent" {
|
||||
# First run should create directory
|
||||
bash "$APA_SCRIPT" install test-package
|
||||
[ -d "$APA_CONFIG_DIR" ]
|
||||
|
||||
# Second run should not fail even if directory exists
|
||||
bash "$APA_SCRIPT" install test-package2
|
||||
[ -d "$APA_CONFIG_DIR" ]
|
||||
}
|
||||
|
||||
@test "apa validates package names consistently across commands" {
|
||||
# Test that validation works the same for all commands that take package names
|
||||
local invalid_name="invalid@package"
|
||||
|
||||
run bash "$APA_SCRIPT" install "$invalid_name"
|
||||
[ "$status" -eq 1 ]
|
||||
|
||||
run bash "$APA_SCRIPT" update "$invalid_name"
|
||||
[ "$status" -eq 1 ]
|
||||
|
||||
run bash "$APA_SCRIPT" remove "$invalid_name"
|
||||
[ "$status" -eq 1 ]
|
||||
|
||||
run bash "$APA_SCRIPT" info "$invalid_name"
|
||||
[ "$status" -eq 1 ]
|
||||
}
|
||||
731
tests/test_distro_specific.bats
Normal file
731
tests/test_distro_specific.bats
Normal file
@@ -0,0 +1,731 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# Test suite for distribution-specific functionality
|
||||
# Testing framework: BATS (Bash Automated Testing System)
|
||||
|
||||
# Load test helpers if they exist
|
||||
load test_helper 2>/dev/null || true
|
||||
|
||||
setup() {
|
||||
# Create temporary directory for test fixtures
|
||||
export BATS_TEST_TMPDIR="$(mktemp -d)"
|
||||
export ORIGINAL_PATH="$PATH"
|
||||
export ORIGINAL_ETC="/etc"
|
||||
|
||||
# Create mock /etc directory structure
|
||||
mkdir -p "$BATS_TEST_TMPDIR/etc"
|
||||
|
||||
# Mock various distribution release files
|
||||
create_mock_os_release() {
|
||||
local distro="$1"
|
||||
case "$distro" in
|
||||
"ubuntu")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
NAME="Ubuntu"
|
||||
VERSION="20.04.3 LTS (Focal Fossa)"
|
||||
ID=ubuntu
|
||||
ID_LIKE=debian
|
||||
PRETTY_NAME="Ubuntu 20.04.3 LTS"
|
||||
VERSION_ID="20.04"
|
||||
VERSION_CODENAME=focal
|
||||
UBUNTU_CODENAME=focal
|
||||
EOF
|
||||
;;
|
||||
"centos")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
NAME="CentOS Linux"
|
||||
VERSION="8"
|
||||
ID="centos"
|
||||
ID_LIKE="rhel fedora"
|
||||
VERSION_ID="8"
|
||||
PRETTY_NAME="CentOS Linux 8"
|
||||
ANSI_COLOR="0;31"
|
||||
CPE_NAME="cpe:/o:centos:centos:8"
|
||||
HOME_URL="https://www.centos.org/"
|
||||
BUG_REPORT_URL="https://bugs.centos.org/"
|
||||
EOF
|
||||
;;
|
||||
"debian")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
|
||||
NAME="Debian GNU/Linux"
|
||||
VERSION_ID="11"
|
||||
VERSION="11 (bullseye)"
|
||||
VERSION_CODENAME=bullseye
|
||||
ID=debian
|
||||
HOME_URL="https://www.debian.org/"
|
||||
SUPPORT_URL="https://www.debian.org/support"
|
||||
BUG_REPORT_URL="https://bugs.debian.org/"
|
||||
EOF
|
||||
;;
|
||||
"rhel")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
NAME="Red Hat Enterprise Linux"
|
||||
VERSION="8.5 (Ootpa)"
|
||||
ID="rhel"
|
||||
ID_LIKE="fedora"
|
||||
VERSION_ID="8.5"
|
||||
PLATFORM_ID="platform:el8"
|
||||
PRETTY_NAME="Red Hat Enterprise Linux 8.5 (Ootpa)"
|
||||
ANSI_COLOR="0;31"
|
||||
EOF
|
||||
;;
|
||||
"fedora")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
NAME="Fedora Linux"
|
||||
VERSION="35 (Workstation Edition)"
|
||||
ID=fedora
|
||||
VERSION_ID=35
|
||||
VERSION_CODENAME=""
|
||||
PLATFORM_ID="platform:f35"
|
||||
PRETTY_NAME="Fedora Linux 35 (Workstation Edition)"
|
||||
ANSI_COLOR="0;38;2;60;110;180"
|
||||
EOF
|
||||
;;
|
||||
"arch")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
NAME="Arch Linux"
|
||||
PRETTY_NAME="Arch Linux"
|
||||
ID=arch
|
||||
BUILD_ID=rolling
|
||||
ANSI_COLOR="38;2;23;147;209"
|
||||
HOME_URL="https://archlinux.org/"
|
||||
DOCUMENTATION_URL="https://wiki.archlinux.org/"
|
||||
SUPPORT_URL="https://bbs.archlinux.org/"
|
||||
BUG_REPORT_URL="https://bugs.archlinux.org/"
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Mock LSB release file
|
||||
create_mock_lsb_release() {
|
||||
local distro="$1"
|
||||
case "$distro" in
|
||||
"ubuntu")
|
||||
cat > "$BATS_TEST_TMPDIR/etc/lsb-release" << 'EOF'
|
||||
DISTRIB_ID=Ubuntu
|
||||
DISTRIB_RELEASE=20.04
|
||||
DISTRIB_CODENAME=focal
|
||||
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Mock system commands
|
||||
create_mock_commands() {
|
||||
mkdir -p "$BATS_TEST_TMPDIR/bin"
|
||||
export PATH="$BATS_TEST_TMPDIR/bin:$PATH"
|
||||
|
||||
# Mock which command
|
||||
cat > "$BATS_TEST_TMPDIR/bin/which" << 'EOF'
|
||||
#!/bin/bash
|
||||
case "$1" in
|
||||
"apt"|"apt-get") echo "/usr/bin/apt" ;;
|
||||
"yum") echo "/usr/bin/yum" ;;
|
||||
"dnf") echo "/usr/bin/dnf" ;;
|
||||
"pacman") echo "/usr/bin/pacman" ;;
|
||||
"zypper") echo "/usr/bin/zypper" ;;
|
||||
*) exit 1 ;;
|
||||
esac
|
||||
EOF
|
||||
chmod +x "$BATS_TEST_TMPDIR/bin/which"
|
||||
}
|
||||
}
|
||||
|
||||
teardown() {
|
||||
# Clean up test environment
|
||||
rm -rf "$BATS_TEST_TMPDIR"
|
||||
export PATH="$ORIGINAL_PATH"
|
||||
unset BATS_TEST_TMPDIR ORIGINAL_PATH ORIGINAL_ETC
|
||||
}
|
||||
|
||||
@test "should detect Ubuntu distribution correctly from os-release" {
|
||||
create_mock_os_release "ubuntu"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "ubuntu" ]]
|
||||
}
|
||||
|
||||
@test "should detect CentOS distribution correctly from os-release" {
|
||||
create_mock_os_release "centos"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "centos" ]]
|
||||
}
|
||||
|
||||
@test "should detect Debian distribution correctly from os-release" {
|
||||
create_mock_os_release "debian"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "debian" ]]
|
||||
}
|
||||
|
||||
@test "should detect RHEL distribution correctly from os-release" {
|
||||
create_mock_os_release "rhel"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "rhel" ]]
|
||||
}
|
||||
|
||||
@test "should detect Fedora distribution correctly from os-release" {
|
||||
create_mock_os_release "fedora"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "fedora" ]]
|
||||
}
|
||||
|
||||
@test "should detect Arch Linux distribution correctly from os-release" {
|
||||
create_mock_os_release "arch"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "arch" ]]
|
||||
}
|
||||
|
||||
@test "should detect apt package manager for Ubuntu" {
|
||||
create_mock_os_release "ubuntu"
|
||||
create_mock_commands
|
||||
|
||||
get_package_manager() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
case "$ID" in
|
||||
"ubuntu"|"debian") echo "apt" ;;
|
||||
"centos"|"rhel") echo "yum" ;;
|
||||
"fedora") echo "dnf" ;;
|
||||
"arch") echo "pacman" ;;
|
||||
"opensuse"|"sles") echo "zypper" ;;
|
||||
*) echo "unknown" ;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
run get_package_manager
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "apt" ]]
|
||||
}
|
||||
|
||||
@test "should detect yum package manager for CentOS" {
|
||||
create_mock_os_release "centos"
|
||||
create_mock_commands
|
||||
|
||||
get_package_manager() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
case "$ID" in
|
||||
"ubuntu"|"debian") echo "apt" ;;
|
||||
"centos"|"rhel") echo "yum" ;;
|
||||
"fedora") echo "dnf" ;;
|
||||
"arch") echo "pacman" ;;
|
||||
"opensuse"|"sles") echo "zypper" ;;
|
||||
*) echo "unknown" ;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
run get_package_manager
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "yum" ]]
|
||||
}
|
||||
|
||||
@test "should detect dnf package manager for Fedora" {
|
||||
create_mock_os_release "fedora"
|
||||
create_mock_commands
|
||||
|
||||
get_package_manager() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
case "$ID" in
|
||||
"ubuntu"|"debian") echo "apt" ;;
|
||||
"centos"|"rhel") echo "yum" ;;
|
||||
"fedora") echo "dnf" ;;
|
||||
"arch") echo "pacman" ;;
|
||||
"opensuse"|"sles") echo "zypper" ;;
|
||||
*) echo "unknown" ;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
run get_package_manager
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "dnf" ]]
|
||||
}
|
||||
|
||||
@test "should detect pacman package manager for Arch Linux" {
|
||||
create_mock_os_release "arch"
|
||||
create_mock_commands
|
||||
|
||||
get_package_manager() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
case "$ID" in
|
||||
"ubuntu"|"debian") echo "apt" ;;
|
||||
"centos"|"rhel") echo "yum" ;;
|
||||
"fedora") echo "dnf" ;;
|
||||
"arch") echo "pacman" ;;
|
||||
"opensuse"|"sles") echo "zypper" ;;
|
||||
*) echo "unknown" ;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
run get_package_manager
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "pacman" ]]
|
||||
}
|
||||
|
||||
@test "should handle missing os-release file gracefully" {
|
||||
rm -f "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
else
|
||||
echo "Error: Unable to detect distribution - os-release not found"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Unable to detect distribution" ]]
|
||||
}
|
||||
|
||||
@test "should handle malformed os-release file" {
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
This is not a valid
|
||||
os-release file format
|
||||
ID=
|
||||
EOF
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
if [[ -z "$ID" ]]; then
|
||||
echo "Error: Invalid distribution ID"
|
||||
return 1
|
||||
fi
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid distribution ID" ]]
|
||||
}
|
||||
|
||||
@test "should handle unsupported distribution" {
|
||||
cat > "$BATS_TEST_TMPDIR/etc/os-release" << 'EOF'
|
||||
NAME="Exotic Linux"
|
||||
ID="exotic"
|
||||
VERSION_ID="1.0"
|
||||
PRETTY_NAME="Exotic Linux 1.0"
|
||||
EOF
|
||||
|
||||
get_package_manager() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
case "$ID" in
|
||||
"ubuntu"|"debian") echo "apt" ;;
|
||||
"centos"|"rhel") echo "yum" ;;
|
||||
"fedora") echo "dnf" ;;
|
||||
"arch") echo "pacman" ;;
|
||||
"opensuse"|"sles") echo "zypper" ;;
|
||||
*)
|
||||
echo "Error: Unsupported distribution: $ID"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
run get_package_manager
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Unsupported distribution: exotic" ]]
|
||||
}
|
||||
|
||||
@test "should fall back to lsb-release when os-release is unavailable" {
|
||||
rm -f "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
create_mock_lsb_release "ubuntu"
|
||||
|
||||
detect_distribution_with_fallback() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
elif [[ -f "$BATS_TEST_TMPDIR/etc/lsb-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/lsb-release"
|
||||
echo "${DISTRIB_ID,,}"
|
||||
else
|
||||
echo "Error: Unable to detect distribution"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
run detect_distribution_with_fallback
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "ubuntu" ]]
|
||||
}
|
||||
|
||||
@test "should handle empty os-release file" {
|
||||
touch "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
if [[ -z "$ID" ]]; then
|
||||
echo "Error: Distribution ID not found"
|
||||
return 1
|
||||
fi
|
||||
echo "$ID"
|
||||
fi
|
||||
}
|
||||
|
||||
run detect_distribution
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Distribution ID not found" ]]
|
||||
}
|
||||
|
||||
@test "should validate distribution name parameter" {
|
||||
validate_distribution_name() {
|
||||
local distro="$1"
|
||||
if [[ -z "$distro" ]]; then
|
||||
echo "Error: Distribution name parameter is required"
|
||||
return 1
|
||||
fi
|
||||
if [[ "$distro" =~ [^a-zA-Z0-9._-] ]]; then
|
||||
echo "Error: Invalid characters in distribution name"
|
||||
return 1
|
||||
fi
|
||||
echo "Valid distribution name: $distro"
|
||||
return 0
|
||||
}
|
||||
|
||||
run validate_distribution_name ""
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "parameter is required" ]]
|
||||
}
|
||||
|
||||
@test "should sanitize distribution names with special characters" {
|
||||
validate_distribution_name() {
|
||||
local distro="$1"
|
||||
if [[ -z "$distro" ]]; then
|
||||
echo "Error: Distribution name parameter is required"
|
||||
return 1
|
||||
fi
|
||||
if [[ "$distro" =~ [^a-zA-Z0-9._-] ]]; then
|
||||
echo "Error: Invalid characters in distribution name"
|
||||
return 1
|
||||
fi
|
||||
echo "Valid distribution name: $distro"
|
||||
return 0
|
||||
}
|
||||
|
||||
run validate_distribution_name "ubuntu; rm -rf /"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Invalid characters" ]]
|
||||
}
|
||||
|
||||
@test "should accept valid distribution names with hyphens and dots" {
|
||||
validate_distribution_name() {
|
||||
local distro="$1"
|
||||
if [[ -z "$distro" ]]; then
|
||||
echo "Error: Distribution name parameter is required"
|
||||
return 1
|
||||
fi
|
||||
if [[ "$distro" =~ [^a-zA-Z0-9._-] ]]; then
|
||||
echo "Error: Invalid characters in distribution name"
|
||||
return 1
|
||||
fi
|
||||
echo "Valid distribution name: $distro"
|
||||
return 0
|
||||
}
|
||||
|
||||
run validate_distribution_name "ubuntu-18.04"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Valid distribution name: ubuntu-18.04" ]]
|
||||
}
|
||||
|
||||
@test "should accept distribution names with underscores" {
|
||||
validate_distribution_name() {
|
||||
local distro="$1"
|
||||
if [[ -z "$distro" ]]; then
|
||||
echo "Error: Distribution name parameter is required"
|
||||
return 1
|
||||
fi
|
||||
if [[ "$distro" =~ [^a-zA-Z0-9._-] ]]; then
|
||||
echo "Error: Invalid characters in distribution name"
|
||||
return 1
|
||||
fi
|
||||
echo "Valid distribution name: $distro"
|
||||
return 0
|
||||
}
|
||||
|
||||
run validate_distribution_name "centos_stream"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Valid distribution name: centos_stream" ]]
|
||||
}
|
||||
|
||||
@test "should complete distribution detection within reasonable time" {
|
||||
create_mock_os_release "ubuntu"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
run timeout 5s bash -c "detect_distribution"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "ubuntu" ]]
|
||||
}
|
||||
|
||||
@test "should handle concurrent distribution detection calls" {
|
||||
create_mock_os_release "ubuntu"
|
||||
|
||||
detect_distribution() {
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
echo "$ID"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
local pids=()
|
||||
for i in {1..3}; do
|
||||
detect_distribution &
|
||||
pids+=($!)
|
||||
done
|
||||
|
||||
local all_success=true
|
||||
for pid in "${pids[@]}"; do
|
||||
if ! wait "$pid"; then
|
||||
all_success=false
|
||||
fi
|
||||
done
|
||||
|
||||
[ "$all_success" = true ]
|
||||
}
|
||||
|
||||
@test "should execute complete distribution-specific workflow for Ubuntu" {
|
||||
create_mock_os_release "ubuntu"
|
||||
create_mock_commands
|
||||
|
||||
complete_distro_workflow() {
|
||||
local distro package_manager
|
||||
|
||||
if [[ -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
. "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
distro="$ID"
|
||||
else
|
||||
echo "Error: Cannot detect distribution"
|
||||
return 1
|
||||
fi
|
||||
|
||||
case "$distro" in
|
||||
"ubuntu"|"debian") package_manager="apt" ;;
|
||||
"centos"|"rhel") package_manager="yum" ;;
|
||||
"fedora") package_manager="dnf" ;;
|
||||
"arch") package_manager="pacman" ;;
|
||||
*) package_manager="unknown" ;;
|
||||
esac
|
||||
|
||||
echo "Distribution: $distro, Package Manager: $package_manager"
|
||||
echo "Ubuntu workflow completed successfully"
|
||||
return 0
|
||||
}
|
||||
|
||||
run complete_distro_workflow
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Distribution: ubuntu, Package Manager: apt" ]]
|
||||
[[ "$output" =~ "Ubuntu workflow completed successfully" ]]
|
||||
}
|
||||
|
||||
@test "should provide helpful error messages for failures" {
|
||||
rm -f "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
|
||||
detect_distribution_with_helpful_errors() {
|
||||
if [[ ! -f "$BATS_TEST_TMPDIR/etc/os-release" ]]; then
|
||||
echo "Error: Unable to detect Linux distribution"
|
||||
echo "Try: Ensure /etc/os-release exists and is readable"
|
||||
echo "Alternative: Check for /etc/lsb-release or distribution-specific files"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
run detect_distribution_with_helpful_errors
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Error: Unable to detect Linux distribution" ]]
|
||||
[[ "$output" =~ "Try: Ensure /etc/os-release exists" ]]
|
||||
[[ "$output" =~ "Alternative: Check for /etc/lsb-release" ]]
|
||||
}
|
||||
|
||||
@test "should provide script version information" {
|
||||
get_script_version() {
|
||||
echo "distro_specific_utils v1.2.3"
|
||||
return 0
|
||||
}
|
||||
|
||||
run get_script_version
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ [0-9]+\.[0-9]+\.[0-9]+ ]]
|
||||
}
|
||||
|
||||
@test "should display comprehensive help information" {
|
||||
display_help() {
|
||||
cat << 'EOF'
|
||||
Usage: distro_specific_utils [OPTIONS] [COMMAND]
|
||||
|
||||
DESCRIPTION:
|
||||
Utility for detecting Linux distributions and managing
|
||||
distribution-specific operations.
|
||||
|
||||
OPTIONS:
|
||||
-h, --help Show this help message
|
||||
-v, --version Show version information
|
||||
-d, --detect Detect current distribution
|
||||
-p, --package Show package manager for current distribution
|
||||
|
||||
COMMANDS:
|
||||
detect Detect the current Linux distribution
|
||||
package-mgr Show the package manager for current distribution
|
||||
|
||||
EXAMPLES:
|
||||
distro_specific_utils --detect
|
||||
distro_specific_utils package-mgr
|
||||
|
||||
SUPPORTED DISTRIBUTIONS:
|
||||
Ubuntu, Debian, CentOS, RHEL, Fedora, Arch Linux, openSUSE
|
||||
EOF
|
||||
}
|
||||
|
||||
run display_help
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "Usage:" ]]
|
||||
[[ "$output" =~ "OPTIONS:" ]]
|
||||
[[ "$output" =~ "EXAMPLES:" ]]
|
||||
[[ "$output" =~ "SUPPORTED DISTRIBUTIONS:" ]]
|
||||
}
|
||||
|
||||
@test "should validate system requirements" {
|
||||
check_system_requirements() {
|
||||
local missing_commands=()
|
||||
|
||||
if [[ ! -r /etc/os-release ]] && [[ ! -r /etc/lsb-release ]]; then
|
||||
echo "Warning: No distribution identification files found"
|
||||
fi
|
||||
|
||||
for cmd in cat grep sed awk; do
|
||||
if ! command -v "$cmd" >/dev/null 2>&1; then
|
||||
missing_commands+=("$cmd")
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ${#missing_commands[@]} -gt 0 ]]; then
|
||||
echo "Error: Missing required commands: ${missing_commands[*]}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "System requirements satisfied"
|
||||
return 0
|
||||
}
|
||||
|
||||
export PATH="$BATS_TEST_TMPDIR/bin:$PATH"
|
||||
for cmd in cat grep sed awk; do
|
||||
echo '#!/bin/bash' > "$BATS_TEST_TMPDIR/bin/$cmd"
|
||||
echo 'echo "mock $cmd"' >> "$BATS_TEST_TMPDIR/bin/$cmd"
|
||||
chmod +x "$BATS_TEST_TMPDIR/bin/$cmd"
|
||||
done
|
||||
|
||||
run check_system_requirements
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "System requirements satisfied" ]]
|
||||
}
|
||||
|
||||
@test "should handle insufficient permissions gracefully" {
|
||||
touch "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
chmod 000 "$BATS_TEST_TMPDIR/etc/os-release"
|
||||
|
||||
handle_permission_error() {
|
||||
local file="$BATS_TEST_TMPDIR/etc/os-release"
|
||||
if [[ ! -r "$file" ]]; then
|
||||
echo "Error: Insufficient permissions to read $file"
|
||||
echo "Try: Run with appropriate permissions or contact system administrator"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
run handle_permission_error
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Insufficient permissions" ]]
|
||||
[[ "$output" =~ "Try: Run with appropriate permissions" ]]
|
||||
}
|
||||
Reference in New Issue
Block a user