blob: cecb99618b907984fa4115fda8f99b48d945b458 [file] [log] [blame]
#!/bin/bash -e
# Initialize for step motor of sled:
# Enable pwm and setup pwm duty
# Setup gpio pins for step motor control
# Moving step motor back to initial position
export PATH=$PATH:/usr/libexec
PWM_BASE_ADDR="0x1e61"
DEV_FILE="/dev/mem"
CALIBRATE_TIMEOUT=120
#Get pwm register address for sledN
function get_pwm_offset() {
local offset=0
case $1 in
0)
offset="0080"
;;
1)
offset="0090"
;;
2)
offset="00a0"
;;
3)
offset="00b0"
;;
4)
offset="00c0"
;;
5)
offset="00d0"
;;
esac
echo ${PWM_BASE_ADDR}${offset}
}
#Get pwm duty register address for sledN
function get_duty_offset() {
local offset=0
case $1 in
0)
offset="0084"
;;
1)
offset="0094"
;;
2)
offset="00a4"
;;
3)
offset="00b4"
;;
4)
offset="00c4"
;;
5)
offset="00d4"
;;
esac
echo ${PWM_BASE_ADDR}${offset}
}
#Enable pwm for sledN
function open_pwm() {
local SLED_NUM="$1"
echo "Open pwm of sled$SLED_NUM"
#enable BMC PWM
if [ ! -c "$DEV_FILE" ]; then
mknod /dev/mem c 1 1
fi
PWM_OFFSET=$(get_pwm_offset "$SLED_NUM")
DUTY_OFFSET=$(get_duty_offset "$SLED_NUM")
echo "setting ${PWM_OFFSET} to 0x000113F3"
echo "setting ${DUTY_OFFSET} to 0xFF006400"
devmem "$PWM_OFFSET" 32 0x000113F3
devmem "$DUTY_OFFSET" 32 0xFF006400
}
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
}
#Init gpio pins for step motor control
function init_gpios() {
echo "Init GPIOs:"
motor_ctrl_gpio_pins_names=( "SLED${1}_MD_STBY_RESET"
"SLED${1}_MD_IOEXP_EN_FAULT"
"SLED${1}_MD_DIR"
"SLED${1}_MD_DECAY"
"SLED${1}_MD_MODE1"
"SLED${1}_MD_MODE2"
"SLED${1}_MD_MODE3" )
for gpio_name in "${motor_ctrl_gpio_pins_names[@]}"; do
set_gpio "$gpio_name" 0
done
}
if [[ "$1" =~ ^(slot[0-5]{1})$ ]] || [[ "$1" =~ ^(sled[0-5]{1})$ ]]; then
SLED=$1
SLED_NUM=${SLED:4}
else
#show_usage
echo "invalid sled name: ${1}"
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, skip motor initialize"
exit 1
fi
#Init gpios
init_gpios "$SLED_NUM"
#enable pwm
open_pwm "$SLED_NUM"
#SLED{N}_MS_DETECT1 (initial position)
DETECT_PIN1="SLED${SLED_NUM}_MS_DETECT1"
INIT_POS=$(get_gpio "$DETECT_PIN1")
if [ "$INIT_POS" -eq 1 ];then
time_count=0
echo "Making motor back to initial position..."
motor-ctrl "$SLED" r >/dev/null
while [ "$INIT_POS" -eq 1 ] ;do
INIT_POS=$(get_gpio "$DETECT_PIN1")
sleep 0.1
time_count=$(( time_count + 1 ))
if [ $time_count -gt $CALIBRATE_TIMEOUT ];then
echo "Error: Step motor run over 1 cycle but switch never triggered"
break
fi
done
motor-ctrl "$SLED" s >/dev/null
fi
if [ "$INIT_POS" -eq 0 ];then
echo "Motor calibrated to initial position."
exit 0
else
echo "Find motor initial position failed"
exit 1
fi