# FAN test2 ``` bash= #!/bin/sh ## -- Fan On low (2400 RPM) (2400/3200) * 40000 #IPQ8072A(110C) Trigger:93 Clear:88 #WiFi 2.4/5G RFIC(125C) Trigger:98 Clear:93 #WiFi 6G RFIC(115C) Trigger:98 Clear:93 #SDX65(105C) Trigger:88 Clear: 83 #Sub6 PA(85C) Trigger:81 Clear: 76 ## -- Fan On middle (2800 RPM) (2800/3200) * 40000 #IPQ8072A(110C) Trigger:96 Clear:91 #WiFi 2.4/5G RFIC(125C) Trigger:101 Clear:96 #WiFi 6G RFIC(115C) Trigger:101 Clear:96 #SDX65(105C) Trigger:91 Clear: 86 #Sub6 PA(85C) Trigger:83 Clear: 78 ## -- FAN ON high (3200 RPM) (3200/3200) * 40000 #IPQ8072A(110C) Trigger:99 Clear:94 #WiFi 2.4/5G RFIC(125C) Trigger:104 Clear:99 #WiFi 6G RFIC(115C) Trigger:104 Clear:99 #SDX65(105C) Trigger:93 Clear: 89 #Sub6 PA(85C) Trigger:85 Clear: 80 ## name,temp1,clear1,PWM1,temp2,clear2,PWM2,temp3,clear3,PWM3 TABLE_TEMP_DUTY="ipq,85,70,40000; wifi2.4G,90,75,40000; wifi5G,90,70,40000; wifi6G,85,70,40000; sdx65,80,65,40000; sub6pa,80,65,40000" TABLE_COL_NUM=$(echo "$TABLE_TEMP_DUTY" | sed -n '1p' | awk -F',' '{print NF}') TABLE_ROW_NUM=$(echo "$TABLE_TEMP_DUTY" | wc -l) TABLE_STYPE="ipq wifi2.4G wifi5G wifi6G sdx65 sub6pa" TABLE_IFACES="ipq wifi0 wifi1 wifi2 sdx65 sub6pa" SET_DUTY=0 DUTY_LIST="" DUTY_OLD_LIST="" CURRENT_TEMP=0 TEMP_LIST="" TEMP_OLD_LIST="" MIN_DUTY=0 MAX_DUTY=40000 DBG_MODE=0 dbg_print() { local title="$1" local message="$2" echo "[$title] $message" } ## usage: get_curret_temp "$type" ## input: ## [type]: wifi0|wifi1|wifi2|ipq|sdx65|sub6pa ## output: ## [temp]: current temp get_curret_temp() { local title="get_curret_temp" local stype=$1 local enable temp temp=0 case "$stype" in wifi*) # get enable enable=$(thermaltool -i "${stype}" -get | grep "enable" | awk -F':|,| ' '{print $5}') dbg_print "$title" "$stype enable: $enable" if [ "$enable" == "1" ]; then # get temp temp=$(thermaltool -i "${stype}" -get | grep "sensor temperature" | awk -F':|,| ' '{print $6}') dbg_print "$title" "$stype enable: $temp" fi ;; ipq) temp0=$(echo "zone5_temp/A53 core0: "$(cat /sys/devices/virtual/thermal/thermal_zone5/temp) | awk '{print $3}') temp1=$(echo "zone6_temp/A53 core1: "$(cat /sys/devices/virtual/thermal/thermal_zone6/temp) | awk '{print $3}') temp2=$(echo "zone7_temp/A53 core2: "$(cat /sys/devices/virtual/thermal/thermal_zone7/temp) | awk '{print $3}') temp3=$(echo "zone8_temp/A53 core3: "$(cat /sys/devices/virtual/thermal/thermal_zone8/temp) | awk '{print $3}') temp4=$(echo "zone9_temp/A53 MHM: "$(cat /sys/devices/virtual/thermal/thermal_zone9/temp) | awk '{print $3}') dbg_print "$title" "core0 temp: $temp0" dbg_print "$title" "core1 temp: $temp1" dbg_print "$title" "core2 temp: $temp2" dbg_print "$title" "core3 temp: $temp3" dbg_print "$title" "MHM temp: $temp4" # get max temp temp=$temp0 for tt in $(seq 1 4) do eval temp_cur=\${temp$tt} #temp_cur=$temp1 [ $temp_cur -gt $temp ] && temp=$temp_cur done ;; sdx65) temp=0 dbg_print "$title" "$stype temp: $temp" ;; sub6pa) temp=0 dbg_print "$title" "$stype temp: $temp" ;; *) temp=0 dbg_print "$title" "Unkown $stype temp: $temp" ;; esac CURRENT_TEMP=$temp dbg_print "$title" "[$stype] temp: $CURRENT_TEMP" } ## usage: get_duty_by_temp $type $temp ## input: ## [type]: ipq/wifi0/wifi1/wifi2/sdx65/sub6pa ## [temp]: current temp ## output: ## [duty]: duty cycle get_duty_by_temp() { local title="get_duty_by_temp" local stype=$1 local temp=$2 local tbl_data="" local set_duty temp_old duty_old local idx type_idx ## get table index by type type_idx=$(echo "$TABLE_TEMP_DUTY" | grep -i -n "$stype") type_idx=${type_idx%:*} tbl_data=$(echo $TABLE_TEMP_DUTY | awk -F';' '{print $'$type_idx'}') temp_old=$(echo "$TEMP_OLD_LIST" | awk -F',' '{print $'$type_idx'}') duty_old=$(echo "$DUTY_OLD_LIST" | awk -F',' '{print $'$type_idx'}') dbg_print "$title" "current temp: $temp , old temp: $temp_old , old duty: $duty_old" dbg_print "$title" "TABLE_TEMP_DUTY[$type_idx]: $tbl_data" if [ $temp -ge $temp_old ]; then dbg_print "$title" "current:$temp > old:$temp_old --> increase flow" else dbg_print "$title" "current:$temp < old:$temp_old --> decrease flow" fi set_duty=$duty_old echo "============Rennydebug_tab_col:$TABLE_COL_NUM===============" echo "============Rennydebug_tab_row:$TABLE_ROW_NUM===============" ## find duty by temp for idx in $(seq $(($TABLE_COL_NUM-2)) -3 2) do tbl_temp_trigger=$(echo "$tbl_data" | awk -F',' '{print $'$idx'}') tbl_temp_clear=$(echo "$tbl_data" | awk -F',' '{print $'$(($idx+1))'}') dbg_print "$title" "trigger:$tbl_temp_trigger , clear:$tbl_temp_clear" if [ $temp -ge $temp_old ]; then ## current >= old --> increase if [ $temp -ge $tbl_temp_trigger ]; then ## if idx over table max column, then set duty = max duty [ $(($idx+2)) -gt $TABLE_COL_NUM ] && tbl_duty=$MAX_DUTY || tbl_duty=$(echo "$tbl_data" | awk -F',' '{print $'$(($idx+2))'}') [ $tbl_duty -gt $set_duty ] && set_duty=$tbl_duty dbg_print "$title" "[$stype] curret temp($temp) over than or equal to table trigger temp($tbl_temp_trigger), set duty: $set_duty" fi else ## current < old --> decrease if [ $temp -le $tbl_temp_clear ]; then ## if idx less than 1, then set duty = min duty [ $(($idx-1)) -le 1 ] && tbl_duty=$MIN_DUTY || tbl_duty=$(echo "$tbl_data" | awk -F',' '{print $'$(($idx-1))'}') [ $tbl_duty -lt $set_duty ] && set_duty=$tbl_duty dbg_print "$title" "[$stype] curret temp($temp) less than table clear temp($tbl_temp_clear), set duty: $set_duty" fi fi done ## save current temp as old temp temp_old=$temp TEMP_OLD_LIST=$(echo -n "$TEMP_OLD_LIST" | tr "," "\n" | sed ''$type_idx's/.*/'$temp_old'/' | tr "\n" ",") dbg_print "$title" "TEMP_OLD_LIST: $TEMP_OLD_LIST" ## save current duty as old duty duty_old=$set_duty DUTY_OLD_LIST=$(echo -n "$DUTY_OLD_LIST" | tr "," "\n" | sed ''$type_idx's/.*/'$duty_old'/' | tr "\n" ",") dbg_print "$title" "DUTY_OLD_LIST: $DUTY_OLD_LIST" ## save duty SET_DUTY=$set_duty dbg_print "$title" "set duty: $SET_DUTY" } get_duty_list() { local title="get_duty_list" local temp_idx=1 DUTY_LIST="" SET_DUTY=0 CURRENT_TEMP=0 for idx in $(seq 1 $TABLE_ROW_NUM) do sensor_type=$(echo "$TABLE_STYPE" | awk -F' ' '{print $'$idx'}') iface_type=$(echo "$TABLE_IFACES" | awk -F' ' '{print $'$idx'}') ## get temp #get_curret_temp "$sensor_type" if [ "$DBG_MODE" = "0" ]; then get_curret_temp "$iface_type" else CURRENT_TEMP=$(echo "$TEMP_LIST" | awk -F',' '{print $'$temp_idx'}') temp_idx=$(($temp_idx+1)) fi ## get duty cycle by temp get_duty_by_temp "$sensor_type" $CURRENT_TEMP dbg_print "$title" "type: $sensor_type , current temp: $CURRENT_TEMP , duty: $SET_DUTY" [ -z "$DUTY_LIST" ] && DUTY_LIST=$SET_DUTY || DUTY_LIST="$DUTY_LIST,"$SET_DUTY done ## DUTY_LIST="35000,36000,37000,38000,39000,40000" dbg_print "$title" "duty list: $DUTY_LIST" } ## usage: setPWM "$duty" ## input: ## duty: duty cycle of PWM setPWM() { local duty=$1 dbg_print "setPWM" "set_duty: $duty" [ $duty -gt 40000 -o $duty -lt 0 ] && return 1 echo "================Rennytest $duty =============" echo 25 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio25/direction echo 1 > /sys/class/gpio/gpio25/value # set PWM pwm_enable=$(cat /sys/class/pwm/pwmchip0/pwm1/enable) if [ ! -d "/sys/class/pwm/pwmchip0/pwm1" ]; then echo 1 > /sys/class/pwm/pwmchip0/export echo 1 > /sys/class/pwm/pwmchip0/pwm1/enable echo 40000 > /sys/class/pwm/pwmchip0/pwm1/period echo $duty > /sys/class/pwm/pwmchip0/pwm1/duty_cycle elif [ "$pwm_enable" = "0" ]; then echo 1 > /sys/class/pwm/pwmchip0/export echo 1 > /sys/class/pwm/pwmchip0/pwm1/enable echo 40000 > /sys/class/pwm/pwmchip0/pwm1/period echo $duty > /sys/class/pwm/pwmchip0/pwm1/duty_cycle else echo 1 > /sys/class/pwm/pwmchip0/pwm1/enable echo 40000 > /sys/class/pwm/pwmchip0/pwm1/period echo $duty > /sys/class/pwm/pwmchip0/pwm1/duty_cycle fi } main() { local set_duty CURRENT_TEMP=0 TEMP_LIST="" TEMP_OLD_LIST="0,0,0,0,0,0" SET_DUTY=0 DUTY_LIST="" DUTY_OLD_LIST="0,0,0,0,0,0" if [ $1 -eq 1 ]; then DBG_MODE=1 [ -n "$2" ] && TEMP_LIST="$2" || TEMP_LIST="0,0,0,0,0,0" fi while [ true ]; do ## get duty by temp of all sensor type get_duty_list if [ -z "$DUTY_LIST" ]; then dbg_print "main" "Duty list is EMPTY !!!" break fi ## select max duty to set PWM set_duty=0 for duty in $(echo "$DUTY_LIST" | tr "," " ") do [ $duty -gt $set_duty ] && set_duty=$duty done dbg_print "main" "Select duty: $set_duty to set PWM" ## set PWM #setPWM $set_duty [ "$DBG_MODE" = "0" ] && setPWM $set_duty || dbg_print "setPWM" "set_duty: $duty" #setPWM $set_duty #break sleep 30 done } main $# $@ exit 0 ```