#!/bin/sh -e
#
# Activate Bluetooth on Variscite DART-MX8M-PLUS/VAR-SOM-MX8M-PLUS
#

# GPIO pin to enable BT module on DART-MX8M-PLUS
BT_EN_GPIO_DART="gpiochip1 6"

# GPIO pin to enable BT module on VAR-SOM-MX8M-PLUS
BT_EN_GPIO_SOM="gpiochip1 9"

# GPIO pin to control routing of UART signals
# to BT module or SOM connector on DART-MX8M-PLUS
BT_BUF_GPIO_DART="gpiochip1 9"

# GPIO pin to control routing of UART signals
# to BT module or SOM connector on VAR-SOM-MX8M-PLUS
BT_BUF_GPIO_SOM="gpiochip0 4"

# UART device connected to BT module on DART-MX8M-PLUS
BT_TTY_DEV_DART=/dev/ttymxc3

# UART device connected to BT module on VAR-SOM-MX8M-PLUS
BT_TTY_DEV_SOM=/dev/ttymxc2

# Sterling LWB BT firmware
BT_FIRMWARE_LWB=/lib/firmware/brcm/BCM43430A1.hcd

# Sterling LWB5 BT firmware
BT_FIRMWARE_LWB5=/lib/firmware/brcm/BCM4335C0.hcd

# Sterling LWB5 WIFI SDIO ID
WIFI_5G_SDIO_ID=0x4339

# WIFI SDIO ID file
WIFI_SDIO_ID_FILE=/sys/class/net/wlan0/device/device

# Return true if SOM is VAR-SOM-MX8M-PLUS
som_is_var_som_mx8m_plus()
{
	grep -q VAR-SOM-MX8M-PLUS /sys/devices/soc0/machine
}

# Set BT firmware based on WIFI SDIO ID
bt_set_firmware()
{
	# Check if WIFI SDIO ID matches Sterling LWB5 SDIO ID
	if [ "$(cat ${WIFI_SDIO_ID_FILE})" = "${WIFI_5G_SDIO_ID}" ]; then
		BT_FIRMWARE=${BT_FIRMWARE_LWB5}
	else
		BT_FIRMWARE=${BT_FIRMWARE_LWB}
	fi
}

# Set UART device connected to BT module
bt_set_uart()
{
	if som_is_var_som_mx8m_plus; then
		BT_TTY_DEV=${BT_TTY_DEV_SOM}
		BT_EN_GPIO=${BT_EN_GPIO_SOM}
		BT_BUF_GPIO=${BT_BUF_GPIO_SOM}
	else
		BT_TTY_DEV=${BT_TTY_DEV_DART}
		BT_EN_GPIO=${BT_EN_GPIO_DART}
		BT_BUF_GPIO=${BT_BUF_GPIO_DART}
	fi
}

# Check if WIFI+BT combo module is available
bt_found()
{
	# Check that WIFI HW was initialized succesfully
	for i in $(seq 1 5); do
		if [ -f ${WIFI_SDIO_ID_FILE} ]; then
			return 0
		else
			sleep 1
		fi
	done

	return 1
}

# Enable BT via GPIO(s)
bt_enable()
{
	# Power up BT module
	gpioset ${BT_EN_GPIO}=0
	sleep 1
	gpioset ${BT_EN_GPIO}=1

	# Route UART lines to BT module
	gpioset ${BT_BUF_GPIO}=0
}

# Start BT hardware
bt_start()
{
	# Exit if BT module is not available
	bt_found || exit 0

	# Set BT UART
	bt_set_uart

	# Enable BT hardware
	bt_enable

	# Set BT firmware file
	bt_set_firmware

    	# Start BT firmware loading service
    	kill -9 $(pidof brcm_patchram_plus) 2>/dev/null || true
	brcm_patchram_plus \
			--patchram ${BT_FIRMWARE} \
			--enable_hci \
			--no2bytes \
			--baudrate 3000000 \
			--scopcm=1,0,0,0,0,0,0,0,0,0 \
			--tosleep 1000 ${BT_TTY_DEV} &
}

# Stop BT hardware
bt_stop()
{
	# Exit if BT interface is not available
	[ -e /sys/class/bluetooth/hci0 ] || exit 0

	# Set BT UART
	bt_set_uart

	# Stop BT interface
	hciconfig hci0 down

	# Stop BT firmware loading service
	kill -9 $(pidof brcm_patchram_plus) 2>/dev/null || true

	# Route UART lines to SOM connector
	gpioset ${BT_BUF_GPIO}=1

  	# Power down BT module
	gpioset ${BT_EN_GPIO}=0
}

###########################
#  Execution starts here  #
###########################
case $1 in

start)
	bt_start
	;;
stop)
	bt_stop
	;;
esac

exit 0
