blob: 83d65df843cfa1de312145ecc0340303484c5ddb [file] [log] [blame]
Allen.Wang4a0948d2021-12-15 13:41:18 +08001#!/bin/bash
2#
3# Power Control tool
4# Enable/disable AC relay
5# On/off System by step moter to press power key
6
7export PATH=$PATH:/usr/sbin:/usr/libexec
8
9DELAY_POWER_ON="0.5"
10DELAY_POWER_OFF="5"
11POWER_BTN_TIMEOUT_CNT=60
12
13#Switch pull low while it be touched
14function wait_for_switch() {
15 TARGET_PIN=$1
16 TARGET_SWITCH=1
17 TIME_CNT=0
18 while [ "$TARGET_SWITCH" -eq 1 ] ;do
19 TARGET_SWITCH=$(get_gpio "$TARGET_PIN")
20 sleep 0.1
21 TIME_CNT=$(( TIME_CNT +1))
22 if [ $TIME_CNT -gt $POWER_BTN_TIMEOUT_CNT ];then
23 echo "Error: Too long to get target switch, force exit" >&2
24 break
25 fi
26 done
27}
28
29function trigger_power_button() {
30 local sled_num=$1
Allen.Wang6af0dff2021-12-28 20:23:05 +080031 local delay_time=$2
Allen.Wang4a0948d2021-12-15 13:41:18 +080032
33 #SLED{N}_MS_DETECT1 (initial position)
34 GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1"
35 #SLED{N}_MS_DETECT0 (MAC position)
36 GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0"
37
38 echo "Motor go forward to press Power key"
39 motor-ctrl "sled${sled_num}" f >/dev/null
40 wait_for_switch "${GPIO_DETECT_PIN0}"
41 motor-ctrl "sled${sled_num}" s >/dev/null
42
43 if [ "$(get_gpio "$GPIO_DETECT_PIN0")" -eq 0 ];then
44 echo "Power key switch triggered"
45 echo "Press power key for Sled${1} ${delay_time} seconds..."
46 sleep "$delay_time"
47 else
Allen.Wang6af0dff2021-12-28 20:23:05 +080048 echo "Power key switch not trigger, back motor to initial position"
Allen.Wang4a0948d2021-12-15 13:41:18 +080049 fi
50
51 motor-ctrl "sled${sled_num}" r >/dev/null
52 wait_for_switch "${GPIO_DETECT_PIN1}"
53 motor-ctrl "sled${sled_num}" s >/dev/null
54 if [ "$(get_gpio "$GPIO_DETECT_PIN1")" -eq 0 ];then
55 echo "Motor reverse to initial position successful"
56 else
Allen.Wang6af0dff2021-12-28 20:23:05 +080057 echo "Initial position switch not trigger, force stop motor"
Allen.Wang4a0948d2021-12-15 13:41:18 +080058 fi
59}
60
61#Get i2c bus number for sledN
62function get_bus_num() {
63 SLED_NUM=$1
64 local bus=0
Allen.Wang5ff992e2022-01-04 21:00:38 +080065 #Mapping Sled number 1~6 to i2c bus number 0~5
66 if [[ "$SLED_NUM" = [1-6] ]]; then
67 bus=$(( SLED_NUM - 1 ))
Allen.Wang4a0948d2021-12-15 13:41:18 +080068 fi
69 echo "$bus"
70}
71
72function set_gpio()
73{
74 NET_NAME=$1
75 OUT_VAL=$2
76 mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
77 if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
78 echo "set_gpio: can not find gpio, $NET_NAME"
79 return 1
80 fi
81 echo -n "set_gpio: set $NET_NAME = $OUT_VAL"
82 if ! gpioset "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}"="$OUT_VAL"; then
83 echo " failed"
84 return 1
85 fi
86 echo " success"
87 return 0
88}
89
90function get_gpio()
91{
92 NET_NAME=$1
93 RET_VAL=2
94
95 mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
96 if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
97 echo "get_gpio: can not find gpio, $NET_NAME" >&2
98 return 1
99 fi
100 if ! RET_VAL=$(gpioget "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}") ; then
101 echo "get_gpio: get ${NET_NAME} failed" >&2
102 return 1
103 fi
104 echo "${RET_VAL}"
105 return 0
106}
107
108function get_ac_status(){
109 i2c_bus=$(get_bus_num "$1")
110 p1_output_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x03)
111 p1_config_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x07)
112 host_pwr="$(( (p1_output_reg & 0x80)>>7 ))"
113 is_output="$(( (~p1_config_reg & 0x80)>>7 ))"
114
115 if [ "$(( host_pwr & is_output ))" -eq 1 ];then
116 echo "AC on"
117 else
118 echo "AC off"
119 fi
120}
121
122function show_usage(){
Allen.Wang5ff992e2022-01-04 21:00:38 +0800123 echo "Usage: power-ctrl [sled1 | sled2 | sled3 | sled4 | sled5 | sled6] [on off ac-on ac-off status]"
Allen.Wang4a0948d2021-12-15 13:41:18 +0800124 echo " power-ctrl chassis-cycle"
125}
126
127if [ $# -eq 1 ]; then
128 if [ "$1" = "chassis-cycle" ];then
129 echo "chassis cycle...."
130 i2cset -y -f 12 0x11 0xd9 c
131 exit 0
132 else
133 echo "Invalid argument: [ $1 ]"
134 show_usage
135 exit 1;
136 fi
137fi
138
139if [ $# -gt 2 ]; then
140 echo "Too many arguments"
141 show_usage
142 exit 1;
143fi
144
Allen.Wang5ff992e2022-01-04 21:00:38 +0800145if [[ "$1" =~ ^(sled[1-6]{1})$ ]]; then
Allen.Wang4a0948d2021-12-15 13:41:18 +0800146 SLED=$1
147 ACTION=$2
148 SLED_NUM=${SLED:4}
149else
150 echo "invalid sled name: ${1}"
151 show_usage
152 exit 1;
153fi
154
155#Check if sled is present
156SLED_PRESENT=$(get_gpio "presence-sled${SLED_NUM}")
157if [ "$SLED_PRESENT" != 0 ];then
158 echo "${SLED} is not present!"
159 exit 1
160fi
161
162if [[ "$ACTION" == "on" ]]; then
163 echo "Power on ${SLED}"
164 trigger_power_button "$SLED_NUM" "$DELAY_POWER_ON"
165elif [[ "$ACTION" == "off" ]];then
166 echo "Power off ${SLED}"
167 trigger_power_button "$SLED_NUM" "$DELAY_POWER_OFF"
168elif [[ "$ACTION" == "status" ]];then
169 get_ac_status "$SLED_NUM"
170 #TODO : check or record Host(DC) power status
171elif [[ "$ACTION" == "ac-on" ]];then
172 set_gpio "power-host${SLED_NUM}" 1
173elif [[ "$ACTION" == "ac-off" ]];then
174 set_gpio "power-host${SLED_NUM}" 0
175else
176 echo "Unknown action: [ ${ACTION} ]"
177 show_usage
178fi