xref: /openbmc/openbmc/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/motor-init (revision 9f71d0b467184de94603c19cd04f240b277a4424)
14a0948d0SAllen.Wang#!/bin/bash -e
24a0948d0SAllen.Wang
34a0948d0SAllen.Wang# Initialize for step motor of sled:
44a0948d0SAllen.Wang#   Enable pwm and setup pwm duty
54a0948d0SAllen.Wang#   Setup gpio pins for step motor control
64a0948d0SAllen.Wang#   Moving step motor back to initial position
74a0948d0SAllen.Wang
84a0948d0SAllen.Wangexport PATH=$PATH:/usr/libexec
94a0948d0SAllen.Wang
10501f4c78SPotin Lai# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
11501f4c78SPotin Laisource /usr/libexec/bletchley-common-functions
12501f4c78SPotin Lai
13*9f71d0b4Scchouxrenice -10 $$ >/dev/null 2>&1
14*9f71d0b4Scchoux
156af0dff7SAllen.WangPWM_CLASS_PATH="/sys/class/pwm/pwmchip0"
165ff992efSAllen.Wang#Sleld 1~6 using bmc pwm8~13 as motor driver stick
175ff992efSAllen.WangPWM_NUM_OFFSET=7
186af0dff7SAllen.WangPWM_PERIOD=2500000 #400HZ
196af0dff7SAllen.WangPWM_DUTY=250000    #PWM_PERIOD X 10%
204a0948d0SAllen.WangCALIBRATE_TIMEOUT=120
214a0948d0SAllen.Wang
224a0948d0SAllen.Wang#Enable pwm for sledN
234a0948d0SAllen.Wangfunction open_pwm() {
249f4bd399SEricChiangQuanta    local SLED_NUM
259f4bd399SEricChiangQuanta    SLED_NUM="$(sled_mapping "$1")"
269f4bd399SEricChiangQuanta    echo "Open pwm of sled$1"
276af0dff7SAllen.Wang    PWM_NUM=$(( SLED_NUM + PWM_NUM_OFFSET ))
286af0dff7SAllen.Wang    PWM_PATH="${PWM_CLASS_PATH}/pwm${PWM_NUM}"
296af0dff7SAllen.Wang    if [ ! -d "$PWM_PATH" ];then
306af0dff7SAllen.Wang        echo "$PWM_NUM" > "${PWM_CLASS_PATH}/export"
316af0dff7SAllen.Wang    fi
326af0dff7SAllen.Wang    if [ -d "$PWM_PATH" ];then
336af0dff7SAllen.Wang        echo "set pwm period to $PWM_PERIOD ns"
346af0dff7SAllen.Wang        if ! echo "$PWM_PERIOD" > "${PWM_PATH}/period"; then
356af0dff7SAllen.Wang            echo "Error: set pwm period fail"
366af0dff7SAllen.Wang            return 1
374a0948d0SAllen.Wang        fi
384a0948d0SAllen.Wang
396af0dff7SAllen.Wang        if ! echo 1 > "${PWM_PATH}/enable"; then
406af0dff7SAllen.Wang            echo "Error: set pwm enable fail"
416af0dff7SAllen.Wang            return 1
426af0dff7SAllen.Wang        fi
436af0dff7SAllen.Wang
446af0dff7SAllen.Wang        if ! echo "$PWM_DUTY" > "${PWM_PATH}/duty_cycle"; then
456af0dff7SAllen.Wang            echo "Error: set pwm duty_cycle fail"
466af0dff7SAllen.Wang            return 1
476af0dff7SAllen.Wang        fi
486af0dff7SAllen.Wang    else
496af0dff7SAllen.Wang        echo "Error: ${PWM_PATH} not exist, export pwm${PWM_NUM} fail"
506af0dff7SAllen.Wang        return 1
516af0dff7SAllen.Wang    fi
524a0948d0SAllen.Wang}
534a0948d0SAllen.Wang
544a0948d0SAllen.Wang#Init gpio pins for step motor control
554a0948d0SAllen.Wangfunction init_gpios() {
564a0948d0SAllen.Wang    echo "Init GPIOs:"
574a0948d0SAllen.Wang    motor_ctrl_gpio_pins_names=(    "SLED${1}_MD_STBY_RESET"
584a0948d0SAllen.Wang                                    "SLED${1}_MD_IOEXP_EN_FAULT"
594a0948d0SAllen.Wang                                    "SLED${1}_MD_DIR"
604a0948d0SAllen.Wang                                    "SLED${1}_MD_DECAY"
614a0948d0SAllen.Wang                                    "SLED${1}_MD_MODE1"
624a0948d0SAllen.Wang                                    "SLED${1}_MD_MODE2"
634a0948d0SAllen.Wang                                    "SLED${1}_MD_MODE3" )
644a0948d0SAllen.Wang
654a0948d0SAllen.Wang    for  gpio_name in "${motor_ctrl_gpio_pins_names[@]}"; do
664a0948d0SAllen.Wang        set_gpio "$gpio_name"   0
674a0948d0SAllen.Wang    done
684a0948d0SAllen.Wang}
694a0948d0SAllen.Wang
709f4bd399SEricChiangQuantaif is_sled_valid "$1"; then
714a0948d0SAllen.Wang  SLED=$1
724a0948d0SAllen.Wang  SLED_NUM=${SLED:4}
734a0948d0SAllen.Wangelse
744a0948d0SAllen.Wang  #show_usage
754a0948d0SAllen.Wang  echo "invalid sled name: ${1}"
764a0948d0SAllen.Wang  exit 1;
774a0948d0SAllen.Wangfi
784a0948d0SAllen.Wang
794a0948d0SAllen.Wang#Check if sled is present
80501f4c78SPotin Laiif ! is_sled_present "${SLED_NUM}"; then
814a0948d0SAllen.Wang    echo "${SLED} is not present, skip motor initialize"
824a0948d0SAllen.Wang    exit 1
834a0948d0SAllen.Wangfi
844a0948d0SAllen.Wang
859f4bd399SEricChiangQuantasled_gpio_num=$(sled_mapping "$SLED_NUM")
864a0948d0SAllen.Wang#Init gpios
879f4bd399SEricChiangQuantainit_gpios "$sled_gpio_num"
884a0948d0SAllen.Wang
894a0948d0SAllen.Wang#enable pwm
904a0948d0SAllen.Wangopen_pwm "$SLED_NUM"
914a0948d0SAllen.Wang
924a0948d0SAllen.Wang#SLED{N}_MS_DETECT1  (initial position)
939f4bd399SEricChiangQuantaDETECT_PIN1="SLED${sled_gpio_num}_MS_DETECT1"
944a0948d0SAllen.WangINIT_POS=$(get_gpio "$DETECT_PIN1")
954a0948d0SAllen.Wang
964a0948d0SAllen.Wangif [ "$INIT_POS" -eq 1 ];then
974a0948d0SAllen.Wang    echo "Making motor back to initial position..."
984a0948d0SAllen.Wang    motor-ctrl "$SLED" r >/dev/null
99d2e7f202SPotin Lai    wait_gpio_falling "$DETECT_PIN1" "$CALIBRATE_TIMEOUT"
1004a0948d0SAllen.Wang    motor-ctrl "$SLED" s >/dev/null
1014a0948d0SAllen.Wangfi
1024a0948d0SAllen.Wang
103d2e7f202SPotin LaiINIT_POS=$(get_gpio "$DETECT_PIN1")
1044a0948d0SAllen.Wangif [ "$INIT_POS" -eq 0 ];then
1054a0948d0SAllen.Wang    echo "Motor calibrated to initial position."
1064a0948d0SAllen.Wang    exit 0
1074a0948d0SAllen.Wangelse
108d2e7f202SPotin Lai    echo "Error: Step motor run over 1 cycle but switch never triggered"
1094a0948d0SAllen.Wang    echo "Find motor initial position failed"
1104a0948d0SAllen.Wang    exit 1
1114a0948d0SAllen.Wangfi
112