diff options
Diffstat (limited to 'meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl')
-rwxr-xr-x | meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl new file mode 100755 index 000000000..111ce8bbc --- /dev/null +++ b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl @@ -0,0 +1,178 @@ +#!/bin/bash +# +# Power Control tool +# Enable/disable AC relay +# On/off System by step moter to press power key + +export PATH=$PATH:/usr/sbin:/usr/libexec + +DELAY_POWER_ON="0.5" +DELAY_POWER_OFF="5" +POWER_BTN_TIMEOUT_CNT=60 + +#Switch pull low while it be touched +function wait_for_switch() { + TARGET_PIN=$1 + TARGET_SWITCH=1 + TIME_CNT=0 + while [ "$TARGET_SWITCH" -eq 1 ] ;do + TARGET_SWITCH=$(get_gpio "$TARGET_PIN") + sleep 0.1 + TIME_CNT=$(( TIME_CNT +1)) + if [ $TIME_CNT -gt $POWER_BTN_TIMEOUT_CNT ];then + echo "Error: Too long to get target switch, force exit" >&2 + break + fi + done +} + +function trigger_power_button() { + local sled_num=$1 + local delay_time=$2 + + #SLED{N}_MS_DETECT1 (initial position) + GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1" + #SLED{N}_MS_DETECT0 (MAC position) + GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0" + + echo "Motor go forward to press Power key" + motor-ctrl "sled${sled_num}" f >/dev/null + wait_for_switch "${GPIO_DETECT_PIN0}" + motor-ctrl "sled${sled_num}" s >/dev/null + + if [ "$(get_gpio "$GPIO_DETECT_PIN0")" -eq 0 ];then + echo "Power key switch triggered" + echo "Press power key for Sled${1} ${delay_time} seconds..." + sleep "$delay_time" + else + echo "Power key switch not trigger, back motor to initail position" + fi + + motor-ctrl "sled${sled_num}" r >/dev/null + wait_for_switch "${GPIO_DETECT_PIN1}" + motor-ctrl "sled${sled_num}" s >/dev/null + if [ "$(get_gpio "$GPIO_DETECT_PIN1")" -eq 0 ];then + echo "Motor reverse to initial position successful" + else + echo "Initail position switch not trigger, force stop motor" + fi +} + +#Get i2c bus number for sledN +function get_bus_num() { + SLED_NUM=$1 + local bus=0 + + if [[ "$SLED_NUM" = [0-5] ]]; then + bus="$SLED_NUM" + fi + echo "$bus" +} + +function set_gpio() +{ + NET_NAME=$1 + OUT_VAL=$2 + mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME") + if [ "${#GPIO_INFO[@]}" -ne 2 ]; then + echo "set_gpio: can not find gpio, $NET_NAME" + return 1 + fi + echo -n "set_gpio: set $NET_NAME = $OUT_VAL" + if ! gpioset "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}"="$OUT_VAL"; then + echo " failed" + return 1 + fi + echo " success" + return 0 +} + +function get_gpio() +{ + NET_NAME=$1 + RET_VAL=2 + + mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME") + if [ "${#GPIO_INFO[@]}" -ne 2 ]; then + echo "get_gpio: can not find gpio, $NET_NAME" >&2 + return 1 + fi + if ! RET_VAL=$(gpioget "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}") ; then + echo "get_gpio: get ${NET_NAME} failed" >&2 + return 1 + fi + echo "${RET_VAL}" + return 0 +} + +function get_ac_status(){ + i2c_bus=$(get_bus_num "$1") + p1_output_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x03) + p1_config_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x07) + host_pwr="$(( (p1_output_reg & 0x80)>>7 ))" + is_output="$(( (~p1_config_reg & 0x80)>>7 ))" + + if [ "$(( host_pwr & is_output ))" -eq 1 ];then + echo "AC on" + else + echo "AC off" + fi +} + +function show_usage(){ + echo "Usage: power-ctrl [sled0 | sled1 | sled2 | sled3 | sled4 | sled5] [on off ac-on ac-off status]" + echo " power-ctrl chassis-cycle" +} + +if [ $# -eq 1 ]; then + if [ "$1" = "chassis-cycle" ];then + echo "chassis cycle...." + i2cset -y -f 12 0x11 0xd9 c + exit 0 + else + echo "Invalid argument: [ $1 ]" + show_usage + exit 1; + fi +fi + +if [ $# -gt 2 ]; then + echo "Too many arguments" + show_usage + exit 1; +fi + +if [[ "$1" =~ ^(slot[0-5]{1})$ ]] || [[ "$1" =~ ^(sled[0-5]{1})$ ]]; then + SLED=$1 + ACTION=$2 + SLED_NUM=${SLED:4} +else + echo "invalid sled name: ${1}" + show_usage + exit 1; +fi + +#Check if sled is present +SLED_PRESENT=$(get_gpio "presence-sled${SLED_NUM}") +if [ "$SLED_PRESENT" != 0 ];then + echo "${SLED} is not present!" + exit 1 +fi + +if [[ "$ACTION" == "on" ]]; then + echo "Power on ${SLED}" + trigger_power_button "$SLED_NUM" "$DELAY_POWER_ON" +elif [[ "$ACTION" == "off" ]];then + echo "Power off ${SLED}" + trigger_power_button "$SLED_NUM" "$DELAY_POWER_OFF" +elif [[ "$ACTION" == "status" ]];then + get_ac_status "$SLED_NUM" + #TODO : check or record Host(DC) power status +elif [[ "$ACTION" == "ac-on" ]];then + set_gpio "power-host${SLED_NUM}" 1 +elif [[ "$ACTION" == "ac-off" ]];then + set_gpio "power-host${SLED_NUM}" 0 +else + echo "Unknown action: [ ${ACTION} ]" + show_usage +fi |