#!/bin/bash set -euo pipefail CARD_ID="toesaudio" CARD_NAME="toesaudio" I2C_BUS="${I2C_BUS:-1}" CODEC_ADDR="${CODEC_ADDR:-0x18}" MIC_THSEL_LEVEL="${MIC_THSEL_LEVEL:-high}" DAC=${1:-127} DRIVER=${2:-0} ANALOG=${3:-50} find_card() { awk -v id="$CARD_ID" -v name="$CARD_NAME" ' index($0, "[" id "]") || index($0, name) { print $1; exit } ' /proc/asound/cards } codec_ready() { i2cget -y -f "$I2C_BUS" "$CODEC_ADDR" 0 >/dev/null 2>&1 } set_mixer() { amixer -q -c "$CARD" "$@" >/dev/null 2>&1 || true } set_mic_pins() { if ! command -v pinctrl >/dev/null 2>&1; then return 0 fi case "$MIC_THSEL_LEVEL" in low) pinctrl set 8 op pn dl >/dev/null 2>&1 || true ;; *) pinctrl set 8 op pn dh >/dev/null 2>&1 || true ;; esac pinctrl set 13 ip pn >/dev/null 2>&1 || true } CARD="" for _ in $(seq 1 20); do CARD="$(find_card || true)" if [ -n "$CARD" ]; then break fi sleep 1 done if [ -z "$CARD" ]; then echo "toesaudio card not present; skipping restore." exit 0 fi for _ in $(seq 1 20); do if codec_ready; then break fi sleep 1 done if ! codec_ready; then echo "TLV320 codec not responding on i2c-${I2C_BUS} addr ${CODEC_ADDR}; skipping restore." exit 0 fi set_mic_pins set_mixer sset 'DAC Left Input' 'Left Data' set_mixer sset 'DAC Right Input' 'Right Data' set_mixer sset 'Output Left From Left DAC' on set_mixer sset 'Output Right From Right DAC' on set_mixer sset 'Speaker' on set_mixer sset 'Speaker Driver' "$DRIVER" set_mixer sset 'Speaker Driver' on set_mixer sset 'Speaker Analog' "$ANALOG" set_mixer sset 'DAC' "${DAC},${DAC}" set_mixer sset 'HP Left' off set_mixer sset 'HP Right' off set_mixer sset 'HP Driver' '0,0' set_mixer sset 'HP Driver' off