#!/bin/bash ### BEGIN INIT INFO # Provides: mts-io # Default-Start: S # Default-Stop: # Short-Description: load the mts-io driver # Description: mts-io driver initializes the Conduit hardware and # provides user mode access through the driver to the # Conduit features. ### END INIT INFO . /etc/default/mts-io ((fail=0)) # To log debug, set LOGDBG to /usr/bin/LOGGER if ((DEBUG)) ; then LOGDBG=/usr/bin/logger ${LOGDBG} -t "mts-io" -p daemon.info -s "LOGDBG turned on" else LOGDBG=":" fi ${LOGDBG} -p daemon.info 'mts-io script' sysdir=/sys/devices/platform/mts-io gpiodir=/sys/class/gpio port1=${sysdir}/ap1 port2=${sysdir}/ap2 USBRST=${sysdir}/usbhub-reset RST[0]="${sysdir}/wifi-bt-reset" RST[1]="${sysdir}/mtq-reset" RST[2]="${sysdir}/ap1/reset" RST[3]="${sysdir}/ap1/creset" RST[4]="${sysdir}/ap2/reset" RST[5]="${sysdir}/ap2/creset" RST[6]="${sysdir}/secure-reset" RST[7]="${sysdir}/eth-reset" RST[8]="${sysdir}/sm1-reset" if ((GPSGNSSRESET)) ; then RST[9]="${sysdir}/gnss-reset" fi WPIN[0]="${sysdir}/ap1/cdone" WPIN[1]="${sysdir}/ap2/cdone" USLPTIME=60000 # 30 milliseconds from Redpine Signals Reset Spec WAIT="/bin/busybox usleep ${USLPTIME}" # Wait 10 WAIT intervals for pins to come high waitpins() { ((i=0)) while((i < ${#WPIN[@]})) ; do ((j=0)) while [[ -r ${WPIN[$i]} ]] && ! (($(cat ${WPIN[$i]}))) ; do logger -t "mts-io" -p daemon.error -s "Wait on ${WPIN[$i]}" ${WAIT} ((j++)) if ((j > 10)) ; then ((fail++)) ${LOGDBG} -t "mts-io" -p daemon.error -s "Ready failure on ${WPIN[$i]}" break fi done ((i++)) done } reset_path() { pin=$1 ${LOGDBG} -t "mts-io" -p daemon.info Reset $pin if [[ -f ${pin} ]] ; then if ! ( (echo 1 >${pin}) && ${WAIT} && (echo 0 >${pin}) && ${WAIT} && (echo 1 >${pin}) ) ; then /usr/bin/logger -t "mts-io" -p daemon.error -s "Failed write to ${pin}" return 1 fi sleep 2 ${LOGDBG} -t "mts-io" -p daemon.info Completeed reset $pin else ${LOGDBG} -t "mts-io" -p daemon.info "${pin} does not exist" fi return 0 } reset_array() { ((i=${#RST[@]}-1)) while ((i>=0)) ; do if [[ -f ${RST[$i]} ]] ; then if ! ( (echo 1 >${RST[i]}) ) ; then /usr/bin/logger -t "mts-io" -p daemon.error -s "Failed write to ${RST[$i]}" fail=1 else ${LOGDBG} -t "mts-io" -p daemon.error -s "Wrote 1 to ${RST[$i]}" fi else ${LOGDBG} -t "mts-io" -p daemon.info "${RST[$i]} does not exist" RST[$i]="" fi ((i--)) done ((DBG)) && (cd $sysdir ; head gnss-reset eth-reset wifi-bt-reset usbhub-reset | logger -p daemon.info) ((i=${#RST[@]}-1)) while ((i>=0)) ; do ${LOGDBG} -s -p daemon.info "i value is $i RST is ${RST[$i]} count is ${#RST[$i]}" if ((${#RST[$i]} > 0)) && [[ -f ${RST[$i]} ]] ; then if ! ( (echo 0 >${RST[i]}) ) ; then /usr/bin/logger -t "mts-io" -p daemon.error -s "Failed write to ${RST[$i]}" fail=1 else ${LOGDBG} -t "mts-io" -p daemon.error -s "Wrote 0 to ${RST[$i]}" : fi else ${LOGDBG} -t "mts-io" -p daemon.info "${RST[$i]} does not exist" fi ((i--)) done ${WAIT} ((DBG)) && (cd $sysdir ; head gnss-reset eth-reset wifi-bt-reset usbhub-reset | logger -p daemon.info) ((i=${#RST[@]}-1)) while ((i>=0)) ; do if ((${#RST[$i]} > 0)) && [[ -f ${RST[$i]} ]] ; then if ! ( (echo 1 >${RST[$i]}) ) ; then /usr/bin/logger -t "mts-io" -p daemon.error -s "Failed write to ${RST[$i]}" fail=1 else ${LOGDBG} -t "mts-io" -p daemon.error -s "Wrote 1 to ${RST[$i]}" fi else ${LOGDBG} -t "mts-io" -p daemon.info "${RST[$i]} does not exist" fi ((i--)) done ((DBG)) && (cd $sysdir ; head gnss-reset eth-reset wifi-bt-reset usbhub-reset | logger -p daemon.info) return $fail } read_card_info() { ap1_product_id="" ap2_product_id="" if [[ -d $sysdir/ap1 ]]; then ap1_product_id=$(cat $sysdir/ap1/product-id) fi if [[ -d $sysdir/ap2 ]]; then ap2_product_id=$(cat $sysdir/ap2/product-id) fi lora_hw=$(mts-io-sysfs show lora/hw-version 2> /dev/null) if [ -d $port1 ] && [[ $(cat $port1/hw-version) = $lora_hw ]]; then ln -sf /dev/spidev32766.2 /dev/spidev0.0 elif [ -d $port2 ] && [[ $(cat $port2/hw-version) = $lora_hw ]]; then ln -sf /dev/spidev32765.2 /dev/spidev0.0 fi } mfser_init() { found_ap1=0 if [[ $ap1_product_id =~ ^MTAC-MFSER- ]]; then /usr/bin/logger -t "mts-io" -p daemon.info -s "Linking /dev/mfser to /dev/ttyAP1" ln -sf /dev/ttyAP1 /dev/mfser found_ap1=1 fi if [[ $ap2_product_id =~ ^MTAC-MFSER- ]]; then if [[ $found_ap1 = 1 ]]; then /usr/bin/logger -t "mts-io" -p daemon.info -s "Linking /dev/mfser-2 to /dev/ttyAP2" ln -sf /dev/ttyAP2 /dev/mfser-2 else /usr/bin/logger -t "mts-io" -p daemon.info -s "Linking /dev/mfser to /dev/ttyAP2" ln -sf /dev/ttyAP2 /dev/mfser fi fi } case $1 in start) /usr/bin/logger -t "mts-io" -p daemon.info -s "Loading mts-io module" if ! modprobe mts_io ; then ((fail++)) fi /usr/bin/logger -t "mts-io" -p daemon.info -s "Resetting system modules" read_card_info /bin/busybox usleep $USLPTIME reset_array [ -w /sys/devices/platform/mts-io/radio-reset ] && mts-io-sysfs store radio-reset 0 mfser_init waitpins # Fix Telit error -62 and Redpine wrong USB speed detection on reset. sleep 1 if ! reset_path $USBRST ; then ((fail++)) fi if ((fail == 0)) ; then echo "OK" else echo "FAIL" fi exit $fail ;; stop) /usr/bin/logger -t "mts-io" -p daemon.info -s "Unloading mts-io module" modprobe -r mts_io RETVAL=$? if ((RETVAL == 0)) ; then echo "OK" else echo "FAIL" fi ;; restart) $0 stop sleep 1 $0 start ;; reload) /usr/bin/logger -t "mts-io" -p daemon.info -s "Resetting system modules" if ! reset_path $USBRST ; then ((fail++)) fi /bin/busybox usleep $USLPTIME reset_array mts-io-sysfs store radio-reset 0 mfser_init if ((fail == 0)) ; then echo "OK" else echo "FAIL" fi exit $fail ;; status) if [[ -d ${sysdir} ]] ; then echo Driver is loaded exit 0 else echo Driver is not loaded exit 3 fi ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 2 ;; esac