summaryrefslogtreecommitdiff
path: root/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl
blob: 111ce8bbc85a6a45e9ae19fb694ed57456ca6f30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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