summaryrefslogtreecommitdiff
path: root/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl
diff options
context:
space:
mode:
authorAllen.Wang <Allen_Wang@quantatw.com>2021-12-15 08:41:18 +0300
committerPatrick Williams <patrick@stwcx.xyz>2021-12-29 06:40:08 +0300
commit4a0948d0184e35770ca24cd591e9a29fd5ff44a6 (patch)
tree7c320dd7a07df7ec61d63a5e17a930acbb5242ed /meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl
parentd58f23c78a2501d4b6ed36a74c23de28595d4f78 (diff)
downloadopenbmc-4a0948d0184e35770ca24cd591e9a29fd5ff44a6.tar.xz
meta-bletchley: Add services to control step motor
For Bletchley platform, we can only power on system by step motor to press power key. Add tools and service to initialize step motor and control system power by motor. Signed-off-by: Allen.Wang <Allen_Wang@quantatw.com> Change-Id: Ic75352a037566d701b2e362743c527c370b0c2e5 Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl')
-rwxr-xr-xmeta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl178
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