[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/connectivity/bt_others/boots/boots_btif.c b/src/connectivity/bt_others/boots/boots_btif.c
new file mode 100644
index 0000000..a5c4d14
--- /dev/null
+++ b/src/connectivity/bt_others/boots/boots_btif.c
@@ -0,0 +1,224 @@
+/* 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 <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "boots.h"
+
+//---------------------------------------------------------------------------
+#define LOG_TAG "boots_btif"
+
+//---------------------------------------------------------------------------
+extern int fd[BOOTS_BTIF_ALL];
+extern int mtk_66xx_Init(int comPort, unsigned int chipId);
+extern uint32_t mtk_66xx_detect(void);
+extern int boots_hci_enable(char *arg, void *func_cb);
+extern int boots_hci_disable(int bt_fd);
+
+//---------------------------------------------------------------------------
+static char *get_inf_path(boots_if_e interface)
+{
+ int i = 0;
+
+ while (boots_btif[i].inf != interface) {
+ i++;
+ }
+ BPRINT_D("path: %s", boots_btif[i].p);
+ return boots_btif[i].p;
+}
+
+//---------------------------------------------------------------------------
+static int bt_init(int fd, uint32_t chip)
+{
+ /* Patch download is moved to WMT driver on combo chip */
+ /* Invoke HCI transport entrance */
+ if (mtk_66xx_Init(fd, chip) != 0) {
+ BPRINT_E("mtk_66xx_Init failed");
+ return -1;
+ }
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+static int stpbt_enable(char *dev)
+{
+ int fd = -1;
+
+ if (dev == NULL) return fd;
+
+ fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK);
+ if (fd < 0) {
+ BPRINT_E("Can't open BT port, errno: %d", fd);
+ return -1;
+ } else {
+ BPRINT_D("Open %s(%d) successfully", dev, fd);
+ }
+
+ return fd;
+}
+
+//---------------------------------------------------------------------------
+static void stpbt_disable(int fd)
+{
+ if (fd > 0)
+ close(fd);
+
+ return;
+}
+
+//---------------------------------------------------------------------------
+int boots_btif_open(boots_if_e interface)
+{
+ uint32_t chip = 0x0000;
+ /**
+ * Depends on different interface:
+ * HCI, STPBT, UART & ETHERNET
+ * to do.
+ */
+ switch (interface) {
+ case BOOTS_BTIF_STPBT:
+ fd[interface] = stpbt_enable(get_inf_path(interface));
+ break;
+ case BOOTS_BTIF_HCI:
+ fd[interface] = boots_hci_enable(get_inf_path(interface), NULL);
+ break;
+ default:
+ BPRINT_E("%s: Incorrect interface: %d", __func__, interface);
+ return -1;
+ break;
+ }
+
+ if (fd[interface] > 0) {
+ chip = mtk_66xx_detect();
+ switch (chip) {
+ case 0x6630:
+// case 0x8167:
+ BPRINT_I("chip: %04X", chip);
+ if (bt_init(fd[interface], chip) != 0) {
+ return -1;
+ }
+ break;
+ default:
+ break;
+ };
+ }
+
+ return fd[interface];
+}
+
+//---------------------------------------------------------------------------
+int boots_btif_close(boots_if_e interface)
+{
+ /** bt deinit */
+ if (fd[interface] < 0) {
+ return -1;
+ }
+
+ switch (interface) {
+ case BOOTS_BTIF_STPBT:
+ stpbt_disable(fd[interface]);
+ break;
+ case BOOTS_BTIF_HCI:
+ boots_hci_disable(fd[interface]);
+ break;
+ default:
+ BPRINT_E("%s: Incorrect interface: %d", __func__, interface);
+ break;
+ }
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+ssize_t boots_btif_read(int fd, uint8_t *buf, size_t size)
+{
+ ssize_t nRead = 0;
+
+ if (fd < 0) {
+ BPRINT_E("File descriptor in bad state");
+ return -EIO;
+ } else if (!buf || !size) {
+ BPRINT_E("%s: Invalid argument buf:%p, size:%d", __func__, buf, (int)size);
+ return -EINVAL;
+ }
+
+ nRead = read(fd, buf, size);
+ if (nRead <= 0) {
+ if (errno == EINTR || errno == EAGAIN) {
+ BPRINT_W("%s: %s(%d)", __func__, strerror(errno), errno);
+ return 0;
+ } else {
+ BPRINT_E("%s: %s(%d)", __func__, strerror(errno), errno);
+ return -errno;
+ }
+ }
+
+ return nRead;
+}
+
+//---------------------------------------------------------------------------
+ssize_t boots_btif_write(int fd, uint8_t *buf, size_t len)
+{
+ ssize_t ret = 0;
+ size_t bytesToWrite = len;
+
+ if (fd < 0) {
+ BPRINT_E("%s: No available com port", __func__);
+ return -EIO;
+ }
+
+ while (bytesToWrite > 0) {
+ ret = write(fd, buf, bytesToWrite);
+ if (ret <= 0) {
+ if (errno == EINTR || errno == EAGAIN) {
+ BPRINT_W("%s: %s(%d)", __func__, strerror(errno), errno);
+ return 0;
+ } else {
+ BPRINT_E("%s: %s(%d)", __func__, strerror(errno), errno);
+ return -errno;
+ }
+ }
+ bytesToWrite -= ret;
+ buf += ret;
+ }
+
+ return (len - bytesToWrite);
+}
+
+//---------------------------------------------------------------------------