#!/bin/sh
#------------------------------------------------------------------
#
# generate_platforms - Axel-BCM parsing and file generation
#
# Avoid runtime platform/board/SKU/PID check like "if (Salt-Sping)"
# as much as possible.  Instead, create files here for things you
# need that are diffent between Salt Spring and Vancouver.
#
# DO NOT:
#    Your module running shell on script:
#        if [ $PID == "SS" ]; then
#            VAL=1
#        elif [ $PID == "VANC" ]; then
#            VAL=2
#        fi
#        echo $VAL
#
#    Your module running on C/C++:
#        if (is_board_axel-bcm()) {
#           if (is_board_saltspring() {
#               return 1;
#           } else (is_board_is_vancouver() {
#               return 2;
#           }
#       }
#
# DO:
#    generate_platforms:
#        - Add your own file from /var/platform base on board ID below
#        Eg:
#            ...
#            case $board_id in
#                # Salt Spring
#                0)
#                    echo 1 > ${DST_DIR}/my_value
#                ...
#                # Vancouver
#                1)
#                    echo 2 > ${DST_DIR}/my_value
#                ...
#
#    Your module running on shell script:
#        echo /var/platform/my_value
#
#    Your module on C/C++:
#        - Pass the platform generated value your program needs as an
#          argument when you start your application
#        - For click, add a handler that will take the value from shell
#        Eg:
#          Commnad line:
#            my_prog `cat /var/platform/my_value`
#          C/C++ code:
#            my_val = argv[1];
#
#    Your module on click element:
#        - Add a set handler that will take the value from shell
#        Eg:
#            echo /var/platform/my_value > /click/my_app/my_value
#
#
# Aug 2018 Joel Aller
#
# Copyright (c) 2018 by cisco Systems, Inc.
# All rights reserved.
#------------------------------------------------------------------
#set -x

. /usr/bin/parse_cmdline.sh
. /usr/bin/platformfunc.sh
. /usr/bin/modulefunc.sh
. /usr/cisco/bin/gpio.sh

DST_DIR=/var/platform

BOARD_AP9115I_PWR=204
BOARD_AP9115E_PWR=214
BOARD_AP9120I_PWR=216  # TODO: DanD to verify VC power
BOARD_AP9120E_PWR=216  # TODO: DanD to verify VC power

DART_FILEPATH="/meraki_gpio/dart_connector"
WCPSTATE_FILEPATH="/tmp/wcpstate"

# $1 - Error message
error_action () {
    echo "WARNING: $1"
    echo "WARNING: $1" > ${DST_DIR}/error_log
}

gen_bootloader() {
    val="`cmdline_get_bootedpart`"
    if [ ! -z "$val" ]; then
        echo $val > ${DST_DIR}/booted_partition
    else
        error_action "Unknown booted partition"
    fi

    val="`cmdline_get_activepart`"
    if [ ! -z "$val" ]; then
        echo $val > ${DST_DIR}/active_partition
        echo `cmdline_get_alternateboot $val` > ${DST_DIR}/alternate_partition
    else
        error_action "Unknown active partition"
    fi

    val="`cmdline_get_activeboot`"
    if [ ! -z "$val" ]; then
        echo $val > ${DST_DIR}/bootloader_booted
        if [ $val -eq 0 ]; then
            echo master > ${DST_DIR}/show_bootloader_booted
        elif [ $val -eq 1 ]; then
            echo shadow > ${DST_DIR}/show_bootloader_booted
        else
            echo unknow > ${DST_DIR}/show_bootloader_booted
            error_action "Unknown bootloader booted"
        fi
    else
        # Older u-boot does not support shadowing. Assume we are booted on master
        echo 0 > ${DST_DIR}/bootloader_booted
        echo master > ${DST_DIR}/show_bootloader_booted
        error_action "WARNING: Old bootloader. Please upgrade to the new version"
    fi

    val="`cmdline_get_bootloader_version`"
    if [ ! -z "$val" ]; then
        echo $val > ${DST_DIR}/bootloader_raw_version
        if [ "${val:0:2}" == "0x" ]; then
            echo $val > ${DST_DIR}/bootloader_version
        else
            printf '0x%x\n' $((val & ~1))  > ${DST_DIR}/bootloader_version
        fi
        if [ "$((val & 1))" -ne 0 ]; then
            echo developer > ${DST_DIR}/bootloader_release
        else
            echo release > ${DST_DIR}/bootloader_release
        fi
    else
        echo 0x0000 > ${DST_DIR}/bootloader_version
        error_action "Unknown bootloader version"
    fi

    val="`cmdline_get_bootloader_forceboot`"
    if [ ! -z "$val" ]; then
        echo $val > ${DST_DIR}/bootloader_forcebooted
    else
        echo 0 > ${DST_DIR}/bootloader_forcebooted
    fi
}

# $1 - Board id from bootloader
gen_board_info() {
    local val=$1
    local board_id=$((val >> 1))
    local antenna=$((val & 1))

    echo $board_id > ${DST_DIR}/board_id
    case $board_id in
        # Salt Spring
        0)
            if [ $antenna -eq 0 ]; then
                echo SS-I > ${DST_DIR}/board_name
            else
                echo SS-E > ${DST_DIR}/board_name
            fi
            # Radio or wifi stuff
            echo 5G > ${DST_DIR}/radio1
            echo 2G > ${DST_DIR}/radio0
            echo 1 > ${DST_DIR}/bands0
            echo 0 > ${DST_DIR}/txrx_cap0
            echo "devpath2=pcie/1/1/" >> ${DST_DIR}/wifi_nvram_setting
            echo "1:boardflags4=0x20008" >> ${DST_DIR}/wifi_nvram_setting
            echo "2:boardflags4=0x2000E" >> ${DST_DIR}/wifi_nvram_setting
            echo "1:olpc_2g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            echo "1:olpc_5g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            echo "2:olpc_2g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            echo "2:olpc_5g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            # BLE stuff
            echo 2640R2 > ${DST_DIR}/ble_chip
            # TBD: GPIO stuff

            # No cleanair/sensord for SS
            rm -f /usr/sbin/sensord /opt/cisco/pkg/cleanair_*.ipk

            # no self-identify antenna for SS
            rm -f /lib/modules/sia_driver.ko

            # Resulting PSE=20W on 2-wire PoE+
            if [ $antenna -eq 0 ]; then
                plat_set_poe_max $BOARD_AP9115I_PWR
            elif [ $antenna -eq 1 ]; then
                plat_set_poe_max $BOARD_AP9115E_PWR
            fi
            ;;
        # Vancouver
        1)
            # TBD: Remove later
            if [ $antenna -eq 0 ]; then
                echo VANC-I > ${DST_DIR}/board_name
            else
                echo VANC-E > ${DST_DIR}/board_name
            fi
            # Radio or wifi stuff
            echo 5G > ${DST_DIR}/radio1
            echo XOR > ${DST_DIR}/radio0
            echo 3 > ${DST_DIR}/bands0
            echo 4 > ${DST_DIR}/txrx_cap0
            # RHL stuff
            # detect RHL_BOARD and append overides to wifi_nvram_setting
            lspci_cw="$(/usr/sbin/lspci | /bin/grep '0001:01:00.0' | /bin/grep 'Device 1c10')"
            if [ x"$lspci_cw" = x ]; then
                echo "No auxiliary radio device detected"
                echo "devpath2=pcie/1/1/" >> ${DST_DIR}/wifi_nvram_setting
            else
                echo "Auxiliary radio device detected"
                touch ${DST_DIR}/has_rhl
                # Append all board overides to wifi_nvram_setting
                echo "devpath2=pcie/2/1/" >> ${DST_DIR}/wifi_nvram_setting
            fi
            echo "1:boardflags4=0x20008" >> ${DST_DIR}/wifi_nvram_setting
            echo "2:boardflags4=0x3000A" >> ${DST_DIR}/wifi_nvram_setting
            echo "1:olpc_2g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            echo "1:olpc_5g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            echo "2:olpc_2g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            echo "2:olpc_5g_th=10" >> ${DST_DIR}/wifi_nvram_setting
            if [ $antenna -eq 1 ]; then
                # CCK power adjustment for Vancouver-E (CSCvq91095)
                echo "2:boardflags4=0xA" >> ${DST_DIR}/wifi_nvram_setting
            fi

            #rm -f /usr/sbin/sensord
            # BLE stuff
            echo 2652R1 > ${DST_DIR}/ble_chip
            # TBD: GPIO stuff

            # Resulting PSE=25.5W on 2-wire PoE+
            if [ $antenna -eq 0 ]; then
                plat_set_poe_max $BOARD_AP9120I_PWR
                echo 436 > ${DST_DIR}/rhb_reset_gpio
                # no self-identify antenna for I-SKU
                rm -f /lib/modules/sia_driver.ko
            elif [ $antenna -eq 1 ]; then
                plat_set_poe_max $BOARD_AP9120E_PWR
                echo 462 > ${DST_DIR}/rhb_reset_gpio
                # 2.4Ghz RP-TNC/DART4 switch
                echo 67,4 > /proc/brcm/set_pinmux
                setup_gpio 483 "out" "2g_dart_sw"
		touch ${DST_DIR}/has_dart
                # Dart connector detection logic
                echo 81,4 > /proc/brcm/set_pinmux #setup GPIO Pin 81 to pinmux 4
                setup_gpio 497 "in" "dart_connector"
                touch ${DST_DIR}/has_dart
                ln -s ${DART_FILEPATH} ${WCPSTATE_FILEPATH}
                touch ${DST_DIR}/is_sia_capable
            fi
            ;;
        *)
            echo UNKNOWN > ${DST_DIR}/board_name
            error_action "Unknown board id"
    esac

    touch ${DST_DIR}/has_usb

    if [ $antenna -eq 0 ]; then
        echo internal > ${DST_DIR}/antenna
    else
        echo external > ${DST_DIR}/antenna
    fi
}

mkdir -p $DST_DIR
rm -f $DST_DIR/*

# Create cookie files
create_platform_files

gen_bootloader

val="`cmdline_get_board_id`"
if [ ! -z "$val" ]; then
    gen_board_info $val
else
    # FIX-IT:  default to SaltSpring board type for old bootloader
    gen_board_info 0
    # echo -1 > ${DST_DIR}/board_id
    # error_action "Unknown board id"
fi

val="`cmdline_get_poe_max`"
if [ ! -z "$val" ]; then
    # Possible overide
    plat_set_poe_max $val
fi
