#!/bin/bash dac_upd() { V=`i2cget -y 1 0x48 "$1"` V=$(( (V & ~$2) | $3 )) i2cset -y 1 0x48 "$1" "$V" } #echo "$@" >> /tmp/botic_helper.log #logger -p 0 "$@" IFS=, set -- $1 case "$1" in ctl_info) # fixed,min,max,step,tlv_type,tlv_a,tlb_b if [ "$2" = "MasterTrim Playback Volume" ]; then CI="1,0,0x7fffffff,0,2,-12000,0" else CI="1,-255,0,0,4,-12750,0" fi echo "$CI" > "/sys/$3" ;; ctl_get) if [[ "$2" == "MasterTrim Playback Volume" ]]; then M1=$(i2cget -y 1 0x48 23) M2=$(i2cget -y 1 0x48 22) M3=$(i2cget -y 1 0x48 21) M4=$(i2cget -y 1 0x48 20) V="$M1${M2#0x}${M3#0x}${M4#0x}" echo "$V" > "/sys/$3" elif [[ "$2" =~ ^DAC([0-7])\ Playback\ Volume$ ]]; then R=${BASH_REMATCH[1]} # retrieve volume on the requested DAC V=$(i2cget -y 1 0x48 "$R") # add '-' echo "-$V" > "/sys/$3" else exit 1 fi ;; ctl_set) if [[ "$2" == "MasterTrim Playback Volume" ]]; then V=$(cat "/sys/$3") V=$(printf "%08x" "$V") i2cset -y 1 0x48 23 "0x${V:0:2}" i2cset -y 1 0x48 22 "0x${V:2:2}" i2cset -y 1 0x48 21 "0x${V:4:2}" i2cset -y 1 0x48 20 "0x${V:6:2}" elif [[ "$2" =~ ^DAC([0-7])\ Playback\ Volume$ ]]; then R=${BASH_REMATCH[1]} V=$(cat "/sys/$3") # remove '-' V=${V#-} # set volume on the requested DAC i2cset -y 1 0x48 "$R" "$V" else exit 1 fi ;; hw_params) # Example: hw_params,P,2,16385,96000,24576000,6144000,0,2,0,2,0,0 # ${1} - hw_params (operation name) # ${2} - P (playback) # ${3} - 2 (channels) # ${4} - 16385 (dai format) # ${5} - 96000 (freq) # ${6} - 24576000 (mclk freq) # ${7} - 6144000 (bclk freq) # ${8} - 0 (this is not DSD stream) # ${9} - 2 (number of data outputs ~ serconfig) # ${10} - 0 (# of the 1st output) # ${11} - 2 (# of the 2nd output) # ${12} - 0 (# of the 3rd output - not used here) # ${13} - 0 (# of the 4th output - not used here) ### IIR bandwidth if [[ "${8}" == 0 ]]; then dac_upd 14 0x6 0x0 # PCM normal else dac_upd 14 0x6 0x2 # DSD 50k #dac_upd 14 0x6 0x4 # DSD 60k #dac_upd 14 0x6 0x6 # DSD 70k fi ;; *) ;; esac