meta-bletchley: motor-ctrl: add support to trigger host DFU mode

Add command to perform the steps below to trigger DFU mode on host

1. turn off host ac
2. press power button and wait at least 10 seconds
3. turn on host ac, and keep hold power button for 3 seconds
4. release host power button

Example:

root@bletchley:~# power-ctrl sled3 dfu
Set host3 DFU mode
SLED3: turn ac-off
set_gpio: set power-host3 = 0 success
SLED3: pressing power button
Motor go forward to press Power button
Power button switch triggered
SLED3: turn ac-on
set_gpio: set power-host3 = 1 success
SLED3: releasing host power button
Motor reverse to initial position successful

Signed-off-by: Potin Lai <potin.lai@quantatw.com>
Change-Id: I055b862ad5a1302050d5df1505a3470858c6ec58
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
index 83d65df..643d7ca 100755
--- a/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl
+++ b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl
@@ -58,6 +58,46 @@
     fi
 }
 
+function release_power_button() {
+    local sled_num=$1
+    GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1"
+
+    if [ "$(get_gpio  "$GPIO_DETECT_PIN1")" -eq 0 ]; then
+        echo "Motor at initial position already"
+        return 0
+    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"
+        return 0
+    fi
+
+    echo "Error: Initial position switch not trigger"
+    return 1
+}
+
+function press_power_button() {
+    local sled_num=$1
+
+    GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0"
+
+    echo "Motor go forward to press Power button"
+    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 button switch triggered"
+        return 0
+    fi
+
+    echo "Error: Power button switch not trigger"
+    return 1
+}
+
 #Get i2c bus number for sledN
 function get_bus_num() {
     SLED_NUM=$1
@@ -172,6 +212,35 @@
     set_gpio "power-host${SLED_NUM}" 1
 elif [[ "$ACTION" == "ac-off" ]];then
     set_gpio "power-host${SLED_NUM}" 0
+elif [[ "$ACTION" == "dfu" ]]; then
+    echo "Set host$SLED_NUM DFU mode"
+
+    # turn ac off
+    echo "SLED$SLED_NUM: turn ac-off"
+    set_gpio "power-host${SLED_NUM}" 0
+    sleep 1
+
+    # press power button, and hold for 10 seconds
+    echo "SLED$SLED_NUM: pressing power button"
+    if ! press_power_button "$SLED_NUM"; then
+        echo "SLED$SLED_NUM: press power button failed"
+        echo "SLED$SLED_NUM: releasing power button"
+        release_power_button "$SLED_NUM"
+        exit 1
+    fi
+    sleep 10
+
+    # turn ac on
+    echo "SLED$SLED_NUM: turn ac-on"
+    set_gpio "power-host${SLED_NUM}" 1
+    sleep 3
+
+    # release power button
+    echo "SLED$SLED_NUM: releasing host power button"
+    if ! release_power_button "$SLED_NUM"; then
+        echo "SLED$SLED_NUM: release power button failed"
+        exit 1
+    fi
 else
     echo "Unknown action: [ ${ACTION} ]"
     show_usage