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