summaryrefslogtreecommitdiffstats
path: root/system/displaylink/udev.sh
blob: 521b7ef2effeead2ebd11104fe83be498c03da74 (plain)
#!/bin/sh
# Copyright (c) 2016 DisplayLink (UK) Ltd.
# File autogenerated by udev-installer.sh script

get_evdi_dev_count()
{
  if [ "$(ls -l /sys/devices/platform/* | grep evdi | wc -l)" = "0" ]; then
    echo "0"
    return
  fi

  cat /sys/devices/platform/evdi.*/drm/card*/card*/status | grep "^connected$" | wc -l
}

get_displaylink_dev_count()
{
  cat /sys/bus/usb/devices/*/idVendor | grep 17e9 | wc -l
}

start_displaylink()
{
  if [ "$(get_displaylink_dev_count)" != "0" ]; then
    start_service
  fi
}

try_stop_displaylink()
{
  if [ "$(get_evdi_dev_count)" = "0" ]; then
    parent_dev_path="$1"
    if [ -d "$parent_dev_path" ]; then
      echo "1"
      return
    fi

    if [ "$(get_displaylink_dev_count)" = "0" ]; then
      stop_service
      echo "0"
      return
    fi
  fi
  echo "1"
}

stop_displaylink()
{
  parent_devpath=$(dirname /sys$1)
  retry_num="50" # 5s
  while [ "$(try_stop_displaylink $parent_devpath)" != "0" ] && [ "$retry_num" != "0" ];
  do
    sleep 0.1
    retry_num=$((retry_num-1))
  done
}

main()
{
  op=$1
  devpath=$2
  if [ "$op" = "START" ]; then
    start_displaylink
  elif [ "$op" = "STOP" ]; then
    stop_displaylink $devpath
  fi
}

start_service()
{
  sh /etc/rc.d/rc.displaylink start &
}

stop_service()
{
  sh /etc/rc.d/rc.displaylink stop &
}


main $1 $2