#!/bin/sh

# This script allows the user to override the default USB enumeration
# during the boot sequence. If there is a non-empty file called
# usbmode in /mnt/flash/startup/usb then this
# script will enumerate each mode defined in the file - one mode
# per-line.
# If that file does not exist it will look for a default version
# in /etc/legato
# Supported modes are:
#     ecm    - enumerates a CDC-ECM port for IP access over USB
#     acm    - enumerates an AT port as a CDC-ACM port
#     serial - enumerates an AT port as a serial port
#              (host driver = 'sierra' or 'GobiSerial')
#     nmea   - enumerates an NMEA port as a serial port
#     audio  - enumerates a USB audio port
#     diag   - enumerates a diag / DM port as a serial port

usb_modes=""
func=""

acm_transports=""
serial_transports=""

if [ -f /mnt/flash/startup/usb/usbmode ]
then
  usb_modes=$(cat /mnt/flash/startup/usb/usbmode)
elif [ -f /etc/legato/usbmode ]
then
  usb_modes=$(cat /etc/legato/usbmode)
fi

add_serial() {
  if [ -n "$serial_transports" ]
  then
    serial_transports="${serial_transports},$1"
  else
    serial_transports="$1"
  fi
}

if [ -z "$usb_modes" ]
then
  exit 0
else
  # Remove duplicate entries
  usb_modes=$(echo $usb_modes | xargs -n1 | sort -u | xargs)

  for usb_mode in $usb_modes
  do
    echo $usb_mode
    if [ -n "${func}" ]
    then
      func="${func},"
    fi

    if [ $usb_mode = "acm" ]
    then
      acm_transports="smd"
      func="${func}acm"
    elif [ $usb_mode = "nmea" ]
    then
      add_serial tty
      func="${func}serial"
    elif [ $usb_mode = "serial" ]
    then
      add_serial smd
      func="${func}serial"
    elif [ $usb_mode = "ecm" ]
    then
      func="${func}ecm"
    elif [ $usb_mode = "diag" ]
    then
      func="${func}diag"
      echo "diag" > /sys/class/android_usb/android0/f_diag/clients
    else
      func="${func}${usb_mode}"
    fi
  done

  if [ -n "${func}" ]
  then
    echo "Enabling USB modes ${func}"

    if [ -n "${serial_transports}" ]
    then
      echo "USB Serial: ${serial_transports}"
      echo "${serial_transports}" > /sys/class/android_usb/android0/f_serial/transports
    fi

    if [ -n "${acm_transports}" ]
    then
      echo "USB ACM: ${acm_transports}"
      echo "${acm_transports}" > /sys/class/android_usb/android0/f_acm/acm_transports
    fi

    echo $func > /sys/class/android_usb/android0/functions
  fi
fi

