#!/bin/bash # ============================================================================== # SCRIPT GLOBAL MIS À JOUR : MULTI-DAC INTEGRÉ (2x PCM5122 + 1x PCM5102A) # Noyau cible : 6.18.45 | Emplacement unique : /boot/overlay-user/ # ============================================================================== set -e echo "--- [1/6] PURGE ET NETTOYAGE DES ANCIENS RÉSIDUS ---" if systemctl is-enabled init-dac.service >/dev/null 2>&1; then systemctl disable init-dac.service || true fi rm -f /etc/systemd/system/init-dac.service systemctl daemon-reload mkdir -p /boot/overlay-user rm -f /boot/pcm5122_i2s.dtbo rm -f /usr/local/bin/check_dac echo "--- [2/6] Réécriture du fichier d'environnement de Boot ---" sed -i '/overlay_prefix=/d' /boot/dietpiEnv.txt sed -i '/overlays=/d' /boot/dietpiEnv.txt sed -i '/user_overlays=/d' /boot/dietpiEnv.txt echo "overlay_prefix=rk35xx-radxa-zero-3w rockchip-rk3566 rockchip-rk3568-hk radxa-zero3 rk3568" >> /boot/dietpiEnv.txt echo "overlays=i2c0 ext-ant" >> /boot/dietpiEnv.txt echo "user_overlays=pcm5122_i2s" >> /boot/dietpiEnv.txt echo "--- [3/6] ÉCRITURE ET COMPILATION DU DTS I2S GENÉRIQUE PUR ---" cat << '_EOF_' > /boot/overlay-user/pcm5122_i2s.dts /dts-v1/; /plugin/; / { compatible = "radxa,zero3", "rockchip,rk3566"; fragment@0 { target = <&i2s3_2ch>; __overlay__ { status = "okay"; #sound-dai-cells = <0>; rockchip,clk-trcm = <1>; rockchip,playback-channels = <2>; rockchip,capture-channels = <2>; pinctrl-names = "default"; pinctrl-0 = <&i2s3m0_sclk &i2s3m0_lrck &i2s3m0_sdi &i2s3m0_sdo>; }; }; fragment@1 { target = <&i2c3>; __overlay__ { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&i2c3m0_xfer>; #address-cells = <1>; #size-cells = <0>; }; }; fragment@2 { target-path = "/"; __overlay__ { sound { status = "okay"; compatible = "simple-audio-card"; simple-audio-card,name = "PCM5122I2S"; simple-audio-card,format = "i2s"; simple-audio-card,continuous-clock; simple-audio-card,bitclock-master = <&cpu_dai>; simple-audio-card,frame-master = <&cpu_dai>; simple-audio-card,bclk-ratio = <64>; cpu_dai: simple-audio-card,cpu { sound-dai = <&i2s3_2ch>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; }; codec_dai: simple-audio-card,codec { sound-dai = <&pcm5102a_codec>; }; }; pcm5102a_codec: pcm5102a-codec { #sound-dai-cells = <0>; compatible = "ti,pcm5102a"; status = "okay"; }; }; }; }; _EOF_ dtc -I dts -O dtb -@ -o /boot/overlay-user/pcm5122_i2s.dtbo /boot/overlay-user/pcm5122_i2s.dts echo "--- [4/6] SÉQUENCE SÉCURISÉE MULTI-DAC POUR LES COPIES EN PARALLÈLE ---" cat << '_EOF_' > /boot/overlay-user/init_dac.sh #!/bin/bash sleep 2 DACS=("0x4c" "0x4d") for TARGET_ADDR in "${DACS[@]}"; do if i2cdetect -y 3 | grep -q "${TARGET_ADDR#0x}"; then echo "Initialisation matérielle brute du PCM5122 à l'adresse $TARGET_ADDR sur I2C-3..." # Reset logiciel complet i2cset -y -f 3 $TARGET_ADDR 0x01 0x11 || true sleep 0.1 # Configuration Esclave PLL (Sans MCLK physique) i2cset -y -f 3 $TARGET_ADDR 0x02 0x10 || true i2cset -y -f 3 $TARGET_ADDR 0x25 0x08 || true # Ajustement des diviseurs de la PLL interne pour Ratio 64 i2cset -y -f 3 $TARGET_ADDR 0x0d 0x00 || true i2cset -y -f 3 $TARGET_ADDR 0x26 0x00 || true i2cset -y -f 3 $TARGET_ADDR 0x41 0x00 || true # Passage en mode actif, volume max et ouverture du Mute matériel (Registre 108 / 0x6C) i2cset -y -f 3 $TARGET_ADDR 0x02 0x00 || true i2cset -y -f 3 $TARGET_ADDR 0x03 0x00 || true i2cset -y -f 3 $TARGET_ADDR 0x3d 0x30 || true i2cset -y -f 3 $TARGET_ADDR 0x3e 0x30 || true i2cset -y -f 3 $TARGET_ADDR 0x6c 0x11 || true echo " [OK] Configuration matérielle réussie pour $TARGET_ADDR" else echo "--> Aucun DAC détecté à l'adresse $TARGET_ADDR sur le bus I2C-3." fi done _EOF_ chmod +x /boot/overlay-user/init_dac.sh cat << '_EOF_' > /etc/systemd/system/init-dac.service [Unit] Description=Initialisation manuelle des PCM5122 en mode Esclave After=sound.target i2c-dev.target DefaultDependencies=no [Service] Type=oneshot ExecStart=/boot/overlay-user/init_dac.sh RemainAfterExit=yes [Install] WantedBy=sysinit.target _EOF_ systemctl daemon-reload systemctl enable init-dac.service echo "--- [5/6] CONFIGURATIONS AUDIO ALSA EN MODE PASSTHROUGH S32_LE ---" cat << '_EOF_' > /etc/modprobe.d/alsa-options.conf options snd_soc_simple_card index=0 options snd_soc_rockchip_hdmi index=1 options snd_soc_hdmi_codec index=2 _EOF_ cat << '_EOF_' > /etc/asound.conf pcm.!default { type plug slave { pcm "hw:0,0" format S32_LE } } ctl.!default { type hw card 0 } _EOF_ echo "--- [6/6] CRÉATION DE L'OUTIL DE DIAGNOSTIC ADAPTÉ ---" cat << '_EOF_' > /boot/overlay-user/check_dac.sh #!/bin/bash VERT='\033[0;32m' ROUGE='\033[0;31m' JAUNE='\033[1;33m' BLEU='\033[0;34m' NEUTRE='\033[0m' clear echo -e "${BLEU}======================================================================${NEUTRE}" echo -e "${BLEU} DIAGNOSTIC EN MODE CONFIGURATION PARALLÈLE MULTI-DAC ${NEUTRE}" echo -e "${BLEU}======================================================================${NEUTRE}" DACS=("0x4c" "0x4d") for TARGET_ADDR in "${DACS[@]}"; do echo -e "\n${JAUNE}--- ANALYSE DE LA PUCE $TARGET_ADDR ---${NEUTRE}" if i2cdetect -y 3 | grep -q "${TARGET_ADDR#0x}"; then echo -e " -> Liaison I2C physique : ${VERT}OK (Puce détectée)${NEUTRE}" REG04=\$(i2cget -y -f 3 \$TARGET_ADDR 0x04 2>/dev/null || echo "ERR") REG6C=\$(i2cget -y -f 3 \$TARGET_ADDR 0x6c 2>/dev/null || echo "ERR") echo -e " -> Registre 0x04 (PLL Lock Status) : \$REG04" echo -e " -> Registre 0x6C (Mute Status) : \$REG6C" if [ "\$REG04" == "0x00" ] || [ "\$REG04" == "0x0" ]; then echo -e " -> Statut de la PLL : ${VERT}VERROUILLÉE (SUCCÈS)${NEUTRE}" else echo -e " -> Statut de la PLL : ${ROUGE}ERREUR HORLOGE (0x\$REG04)${NEUTRE}" fi else echo -e " -> Liaison I2C physique : ${ROUGE}ABSENT (Non câblée ou non détectée)${NEUTRE}" fi done echo -e "\n${JAUNE}Ré-application manuelle de la séquence I2C...${NEUTRE}" /boot/overlay-user/init_dac.sh echo -e "${BLEU}======================================================================${NEUTRE}" _EOF_ chmod +x /boot/overlay-user/check_dac.sh ln -sf /boot/overlay-user/check_dac.sh /usr/local/bin/check_dac echo "======================================================================" echo " DÉPLOIEMENT EFFECTUÉ AVEC SUCCÈS ! REBOOT REQUIS... " echo "======================================================================" # ============================================================================== # pour l'activer : # nano deploy_pcm.sh # copier ce script, puis faire CTRL+O et CTRL+X # puis exécuter : # bash deploy_pcm.sh # ==============================================================================