[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/connectivity/bt_others/boots/boots_script.c b/src/connectivity/bt_others/boots/boots_script.c
new file mode 100644
index 0000000..c51dbb1
--- /dev/null
+++ b/src/connectivity/bt_others/boots/boots_script.c
@@ -0,0 +1,590 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2016~2017. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+//- vim: set ts=4 sts=4 sw=4 et: --------------------------------------------
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#include "boots_pkt.h"
+
+//---------------------------------------------------------------------------
+#define LOG_TAG "boots_script"
+
+#define LINESIZE    8192
+#define LINEVALUESIZE   4096
+
+#define SCRIPTLINE(name) {#name, SCRIPT_##name, sizeof(#name)-1, FUN_##name}
+
+//---------------------------------------------------------------------------
+typedef struct per_cmd_info {
+    char *name;
+    uint8_t scriptType;
+    int nameLen;
+    void* (*func_cmd)(int, char*, uint8_t*, void **, int *); // reserved.now, only print log,  if needed to preprocess cmd, please register for each one
+} S_per_cmd_info;
+
+//---------------------------------------------------------------------------
+static void* FUN_TITLE(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_PROC(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_TX(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_RX(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_WAITRX(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_LOOP(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_LOOPEND(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_TIMEOUT(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_WAIT(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_USBALT(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_CMD(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+static void* FUN_END(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen);
+
+//---------------------------------------------------------------------------
+static S_per_cmd_info script_line_s[] = {
+  SCRIPTLINE(TITLE),
+  SCRIPTLINE(PROC),
+  SCRIPTLINE(TX),
+  SCRIPTLINE(RX),
+  SCRIPTLINE(WAITRX),
+  SCRIPTLINE(LOOPEND),    /* should be ahead of LOOP */
+  SCRIPTLINE(LOOP),
+  SCRIPTLINE(WAIT),
+  SCRIPTLINE(TIMEOUT),
+  SCRIPTLINE(USBALT),
+  SCRIPTLINE(TIMEOUT),
+  SCRIPTLINE(CMD),
+  SCRIPTLINE(END)
+};
+
+static int script_line_num = sizeof(script_line_s)/sizeof(S_per_cmd_info);
+
+static uint8_t packet_value_array[LINEVALUESIZE];
+static int paramValue = 0;
+
+static char *line = NULL;
+
+//---------------------------------------------------------------------------
+#if 0
+static char hextoascii(int i)
+{
+    i &= 0x0F;
+
+    if (i >= 0 && i <= 9)
+        return i + '0';
+    else
+        return i + ('A' - 0x0A);
+}
+
+static int print_hexes(char *hex, int len)
+{
+    int i;
+    printf("\tFormat in HEX   -- ");
+    for (i = 0; i < len; i++, hex++) {
+        putchar(hextoascii(*hex >> 4));
+        putchar(hextoascii(*hex & 0x0f));
+        putchar(' ');
+    }
+    putchar('\r');
+    putchar('\n');
+    return 0;
+}
+
+static char* xitoa(int val, int base)
+{
+    static char sbuf[32] = {0};
+    int i = 30;
+    for(; val && i; --i, val /= base)
+    {
+        sbuf[i]="0123456789abcdef"[val % base];
+    }
+    return &sbuf[i+1];
+}
+#endif
+
+static uint8_t xatoi(char *p, int len)
+{
+    int n= 0;
+    uint8_t v = 0;
+
+    for(n=0; n<len; n++){
+        if((*p>='0')&&(*p<='9'))  v = v*16 + (*p-'0');
+        else if((*p>='A')&&(*p<='F'))  v = v*16 + (10+*p-'A');
+        else if((*p>='a')&&(*p<='f'))  v = v*16 + (10+*p-'a');
+        else return(-1);
+        p++;
+    }
+    return v;
+}
+
+static void filter_space_c(char** ppStr, int head_filter, int tail_filter)
+{
+    char* str;
+    int start, end, strLen;
+
+    if (ppStr != NULL && *ppStr != NULL){
+        str = *ppStr;
+        //1. head fliter
+        if ((head_filter == 1) && (*str != '\0')){
+            for (start=0; *str==' '; start++){
+               str++;
+            }
+        }
+        //2. tail filter
+        if ((tail_filter == 1) && (*str != '\0')){
+            strLen = strlen(str);
+            for (end = strLen - 1; end >= 0 && str[end]==' '; end--){
+                str[end] = '\0';
+            }
+        }
+        *ppStr = str;
+    }
+}
+
+static int packet_safe_atoi(char valueStr[], uint8_t value[], int size)
+{
+    char *token = NULL, *savepStr=NULL;
+    uint8_t *valueIs = value;
+    int i = 0, repeat = 0, split_num = 0, len = 0;
+    int num = 0;
+    int ret = 0;
+
+    if (size > LINEVALUESIZE) {
+        BPRINT_W("Incorrect size %d", size);
+        size = LINEVALUESIZE;
+    }
+
+    memset(valueIs, 0, size);
+
+    token=strtok_r(valueStr, " ", &savepStr);
+    while(token != NULL){
+        len = strlen(token);
+        repeat = len/2 + len%2;
+        do{
+            split_num = ((len >= 2)?(2):(1));
+            ret = xatoi((token + i * 2), split_num);
+            if (ret < 0) {
+                BPRINT_E("Illegal string(%s), abort <\n", token + i*2);
+                num = 0;
+                break;
+            } else {
+                valueIs[num] = ret;
+            }
+            ++num;
+            ++i;
+            len -= i*2;
+        }while((--repeat) > 0);
+
+        if(num > 0){
+            token=strtok_r(NULL, " ", &savepStr);
+            i = 0;
+        }
+        else{
+            break;
+        }
+    }
+/*
+    if(num != 0){
+        int i = 0, tmpN = num;
+        printf("packet[num==%d]>", num);
+        while(tmpN){
+            printf("%02x", valueIs[i]);
+            printf(" ");
+            --tmpN;
+            ++i;
+        }
+        printf("\n");
+    }
+*/
+    return num;
+}
+
+static void* FUN_TITLE(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = ((Invalue == NULL)?0:(strlen(Invalue) + 1));
+    *oValue = (void*)((*oLen == 0)?NULL:Invalue);
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<",
+        script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType);
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_PROC(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = ((Invalue == NULL)?0:(strlen(Invalue) + 1));
+    *oValue = (void*)((*oLen == 0)?NULL:Invalue);
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType);
+
+    return (void*)NULL;
+}
+
+static void* FUN_TX(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = ((Invalue != NULL)?(xatoi(Invalue, 2)):(0));
+    *oLen = 0;
+    *oValue = NULL;
+
+    if((Invalue != NULL)){
+        *oLen = packet_safe_atoi(Invalue, packet_value_array, sizeof(packet_value_array));
+        if (*oLen > 0){
+            *oValue = packet_value_array;
+        }
+        else{
+            *oLen = 0;
+            *oValue = NULL;
+        }
+    }
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType);
+
+    return (void*)NULL;
+}
+
+static void* FUN_RX(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = ((Invalue != NULL)?(xatoi(Invalue, 2)):(0));
+    *oLen = 0;
+    *oValue = NULL;
+
+    if((Invalue != NULL)){
+        *oLen = packet_safe_atoi(Invalue, packet_value_array, sizeof(packet_value_array));
+        if (*oLen > 0){
+            *oValue = packet_value_array;
+        }
+        else{
+            *oLen = 0;
+            *oValue = NULL;
+        }
+    }
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType);
+
+    return (void*)NULL;
+}
+
+static void* FUN_WAITRX(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = ((Invalue != NULL)?(xatoi(Invalue, 2)):(0));
+    *oLen = 0;
+    *oValue = NULL;
+
+    if((Invalue != NULL)){
+        *oLen = packet_safe_atoi(Invalue, packet_value_array, sizeof(packet_value_array));
+        if (*oLen > 0){
+            *oValue = packet_value_array;
+        }
+        else{
+            *oLen = 0;
+            *oValue = NULL;
+        }
+    }
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType);
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_LOOP(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = 1;
+    paramValue = ((*oLen == 0)?(0):(atoi(Invalue)));
+    *oValue = &paramValue;
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<LOOP Count>%d",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType, *((int*)(*oValue)));
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_LOOPEND(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = 0;
+    *oValue = NULL;
+    UNUSED(Invalue);
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType);
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_TIMEOUT(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = 1;
+    paramValue = ((*oLen == 0)?(0):(atoi(Invalue)));
+    *oValue = &paramValue;
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<TIMEOUT>%d",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType, *((int*)(*oValue)));
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_WAIT(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = ((Invalue == NULL)?0:(strlen(Invalue) + 1));
+    paramValue = ((*oLen == 0)?(0):(atoi(Invalue)));
+    *oValue = &paramValue;
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<WAIT>%d",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType, *((int*)(*oValue)));
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_USBALT(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = 1;
+    paramValue = ((*oLen == 0)?(0):(atoi(Invalue)));
+    *oValue = &paramValue;
+
+    BPRINT_D("lineName>%s<Type>0x%02x-0x%02x<USBALT>%d",
+            script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType, *opktType, *((int*)(*oValue)));
+
+    return (void*)NULL;
+}
+
+
+static void* FUN_CMD(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0x01;
+    *oLen = 0;
+    *oValue = NULL;
+
+    if((Invalue != NULL)){
+        *oLen = packet_safe_atoi(Invalue, &(packet_value_array[1]), sizeof(packet_value_array) - 1);
+        if (*oLen > 0){
+            packet_value_array[0] = 0x01;
+            *oLen += 1;
+            *oValue = packet_value_array;
+        }
+        else{
+            *oLen = 0;
+            *oValue = NULL;
+        }
+    }
+
+    BPRINT_D("lineName>%s<packetType>0x%02x<", script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType);
+    return (void*)NULL;
+}
+
+static void* FUN_END(int InfoundIndex, char* Invalue, uint8_t* opktType, void** oValue, int* oLen)
+{
+    *opktType = 0;
+    *oLen = 0;
+    *oValue = NULL;
+    UNUSED(Invalue);
+
+    BPRINT_D("lineName>%s<packetType>0x%02x<", script_line_s[InfoundIndex].name, script_line_s[InfoundIndex].scriptType);
+    return (void*)NULL;
+}
+
+
+static pkt_list_s *script_line_handle(char *lineName, char *lineValue)
+{
+    int i;
+    uint8_t pktType = 0;
+    void *value = NULL;
+    int valueLen;
+    UNUSED(boots_btif);
+
+    for(i = 0 ;i < script_line_num; i++){
+        if(!strncmp(lineName, script_line_s[i].name, script_line_s[i].nameLen)){
+            script_line_s[i].func_cmd(i, lineValue, &pktType, &value, &valueLen);
+#if 0
+            int num;
+            switch (script_line_s[i].scriptType) {
+                case SCRIPT_TX:
+                case SCRIPT_RX:
+                case SCRIPT_WAITRX:
+                case SCRIPT_CMD:
+                    num = 0;
+                    printf("[boots_script:D] TYPE = %02x < ", script_line_s[i].scriptType);
+                    while(num < valueLen){
+                        printf("%02x ", *((uint8_t*)value + num));
+                        ++num;
+                    }
+                    printf("\n");
+                    break;
+                case SCRIPT_TITLE:
+                case SCRIPT_PROC:
+                    BPRINT_D("TYPE = %02x < %s", script_line_s[i].scriptType, (char*)value);
+                    break;
+                case SCRIPT_LOOP:
+                    BPRINT_D("TYPE = %02x < %d", script_line_s[i].scriptType, *((int*)value));
+                    break;
+                case SCRIPT_TIMEOUT:
+                    BPRINT_D("TYPE = %02x < %d", script_line_s[i].scriptType, *((int*)value));
+                    break;
+                case SCRIPT_WAIT:
+                    BPRINT_D("TYPE = %02x < %d", script_line_s[i].scriptType, *((int*)value));
+                    break;
+                case SCRIPT_USBALT:
+                    BPRINT_D("TYPE = %02x < %d", script_line_s[i].scriptType, *((int*)value));
+                    break;
+                default:
+                    break;
+            }
+#endif
+            return boots_pkt_node_push(script_line_s[i].scriptType, pktType, value, valueLen, NULL, NULL);
+        }
+
+    }
+    return NULL;
+}
+
+static pkt_list_s *script_line_parse(char *line)
+{
+    char *tmpStr = line;
+    char *delimStr = ":=";
+    char *subdelimStr = "//";
+    char *lineName, *lineValue;//, *lineAnno;
+    char *saveptr;
+    int slen;
+
+    // 1. filter out space until found out a char
+    filter_space_c(&tmpStr, 1, 0);
+
+    // 2. filter out annotation line
+    if ((*tmpStr == '#') || (strncmp(tmpStr, "//", 2) == 0)) {
+        // do nothing, just ignore
+
+    } else {
+        slen = strlen(tmpStr);
+        // 3. filter out new line('\n' 0A) & carriage ret ('\r' 0D)
+        if (tmpStr[slen - 1] == 0x0A) {
+            tmpStr[slen - 1] = '\0';
+            if (tmpStr[slen - 2] == 0x0D) {
+                tmpStr[slen - 2] = '\0';
+            }
+        }
+        slen = strlen(tmpStr);
+
+        if (slen == 0) {
+            // do nothing--only ignore
+        } else {
+            //BPRINT_D("line <%s>", tmpStr);
+            // 4. parse
+            lineName = strtok_r(tmpStr, delimStr, &saveptr);
+            if (lineName != NULL) {
+                lineValue = strtok_r(saveptr, subdelimStr, &lineValue);
+            } else {
+                return NULL;
+            }
+            //BPRINT_D("orgName <%s>", lineName);
+            //BPRINT_D("orgValue <%s>", lineValue);
+            //BPRINT_D("filter out space ...");
+
+            // 5. filter out space
+            filter_space_c(&lineName, 1, 1);
+            filter_space_c(&lineValue, 1, 1);
+
+            //BPRINT_D("newName <%s>", lineName);
+            //BPRINT_D("newValue <%s>", lineValue);
+
+            // 6. map Type and create node
+            return script_line_handle(lineName, lineValue);
+        }
+    }
+    return NULL;
+}
+
+//---------------------------------------------------------------------------
+FILE *boots_script_open(char *file)
+{
+    BPRINT_D("%s: %s", __func__, file);
+    return fopen(file, "r");
+}
+
+//---------------------------------------------------------------------------
+void boots_script_close(FILE *fd)
+{
+    if (line) {
+        free(line);
+        line = NULL;
+    }
+    if (fd) fclose(fd);
+}
+
+//---------------------------------------------------------------------------
+pkt_list_s *boots_script_get(FILE *fd)
+{
+    pkt_list_s *n = NULL;
+    char *buf = NULL;
+    size_t buf_size = 0;
+    ssize_t nread;
+
+    if (!fd) return NULL;
+
+    do {
+        if ((nread = getline(&buf, &buf_size, fd)) < 0)
+            break;
+        n = script_line_parse(buf);
+
+    } while (!n || nread == 0);
+
+    free(buf);
+
+    return n;
+}
+
+//---------------------------------------------------------------------------
+void boots_script_loop(FILE * fd, long size)
+{
+    (void)fseek(fd, size, SEEK_SET);
+}
+
+//---------------------------------------------------------------------------