[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/connectivity/bt_others/boots/boots_hci.c b/src/connectivity/bt_others/boots/boots_hci.c
new file mode 100644
index 0000000..29ad374
--- /dev/null
+++ b/src/connectivity/bt_others/boots/boots_hci.c
@@ -0,0 +1,278 @@
+/* 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.
+ */
+
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include "boots.h"
+
+#define LOG_TAG "boots_hci"
+
+#define HCI_MAX_DEV 1
+#define BTPROTO_HCI 1
+
+#define HCIDEVUP _IOW('H', 201, int)
+#define HCIDEVDOWN _IOW('H', 202, int)
+#define HCIDEVRESET _IOW('H', 203, int)
+#define HCIDEVRESTAT _IOW('H', 204, int)
+#define HCIGETDEVLIST _IOR('H', 210, int)
+#define HCISETRAW _IOW('H', 220, int)
+
+enum {
+ HCI_UP,
+ HCI_INIT,
+ HCI_RUNNING,
+
+ HCI_PSCAN,
+ HCI_ISCAN,
+ HCI_AUTH,
+ HCI_ENCRYPT,
+ HCI_INQUIRY,
+
+ HCI_RAW,
+
+ HCI_RESET,
+};
+
+struct sockaddr_hci {
+ unsigned short family;
+ unsigned short device;
+ unsigned short channel;
+};
+
+struct dev_info {
+ int index;
+ int skt_fd;
+};
+
+struct hci_dev_req {
+ uint16_t dev_id;
+ uint32_t dev_opt;
+};
+
+struct hci_dev_list_req {
+ uint16_t dev_num;
+ struct hci_dev_req dev_req[0]; /* hci_dev_req structures */
+};
+
+static int commPort = 0;
+static struct dev_info hci_dev_info[HCI_MAX_DEV];
+
+//---------------------------------------------------------------------------
+static int boots_hci_open_dev(uint16_t index)
+{
+ struct sockaddr_hci addr_hci;
+ int skt_fd;
+
+ /* Create HCI socket */
+ skt_fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+ if (skt_fd < 0)
+ return skt_fd;
+
+ BPRINT_D("sock = %x", skt_fd);
+ /* Bind socket to the HCI device */
+ memset(&addr_hci, 0, sizeof(addr_hci));
+ addr_hci.family = AF_BLUETOOTH;
+ addr_hci.device = index;
+ /* 1 means HCI_USER_CHANNEL */
+ addr_hci.channel = 1;
+ if (bind(skt_fd, (struct sockaddr *) &addr_hci, sizeof(addr_hci)) < 0)
+ goto failed;
+
+ return skt_fd;
+
+failed:
+ close(skt_fd);
+ return -1;
+}
+
+//---------------------------------------------------------------------------
+static int boots_hci_close_dev(int skt_fd)
+{
+ if (skt_fd < 0) {
+ BPRINT_E("boots_hci_close_dev %d", skt_fd);
+ return -1;
+ }
+ return close(skt_fd);
+}
+
+//---------------------------------------------------------------------------
+static struct dev_info *boots_hci_init_device(uint16_t index)
+{
+ struct dev_info *dev = NULL;
+ int skt_fd;
+
+ BPRINT_I("open HCI%d", index);
+ skt_fd = boots_hci_open_dev(index);
+ if (skt_fd < 0) {
+ BPRINT_E("Unable to open HCI%d: %s (%d)", index, strerror(errno), errno);
+ return NULL;
+ }
+
+ dev = &hci_dev_info[index];
+ memset(dev, 0, sizeof(*dev));
+
+ dev->index = index;
+ dev->skt_fd = skt_fd;
+ commPort = skt_fd;
+
+ /* HCI_CHANNEL_USER don't need to set filter */
+
+ /* Start HCI device */
+ /* If we use HCI_CHANNEL_RAW, we must be send HCIDEVUP to bluez stack */
+ /*
+ while (ioctl(dd, HCIDEVUP, index) < 0 && errno != EALREADY) {
+ BPRINT_E("Can't init device HCI%d: %s (%d)",
+ index, strerror(errno), errno);
+ sleep(1);
+ }*/
+ return dev;
+}
+
+//---------------------------------------------------------------------------
+static int boots_hci_init_all_devices(void)
+{
+ int skt_fd;
+ struct hci_dev_list_req *dev_list = NULL;
+ struct hci_dev_req *dev_req = NULL;
+ int i, ret = 0;
+
+ /* Create HCI socket to get HCI devices number*/
+ skt_fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+ if (skt_fd < 0) {
+ BPRINT_E("Can't open HCI socket: %s (%d)", strerror(errno), errno);
+ ret = -1;
+ goto exit;
+ }
+ BPRINT_D("sock = %d", skt_fd);
+
+ dev_list = (struct hci_dev_list_req *)malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t));
+ if (!dev_list) {
+ BPRINT_E("Can't allocate devlist buffer");
+ ret = -1;
+ goto exit;
+ }
+ dev_req = dev_list->dev_req;
+
+ dev_list->dev_num = HCI_MAX_DEV;
+ if (ioctl(skt_fd, HCIGETDEVLIST, dev_list) < 0) {
+ BPRINT_E("Can't get device list: %s (%d)", strerror(errno), errno);
+ ret = -1;
+ goto exit;
+ }
+
+ if (dev_list->dev_num == 0) {
+ BPRINT_E("No BT device.");
+ ret = -1;
+ goto exit;
+ }
+
+ BPRINT_I("BT dev_num = %d", dev_list->dev_num);
+ for (i = 0; i < dev_list->dev_num; i++, dev_req++) {
+ /* only support HCI0 */
+ if (dev_req->dev_id >= HCI_MAX_DEV)
+ continue;
+
+ boots_hci_init_device(dev_req->dev_id);
+ }
+exit:
+ if (skt_fd >= 0)
+ close(skt_fd);
+ if (dev_list)
+ free(dev_list);
+ return ret;
+}
+
+//---------------------------------------------------------------------------
+static int boots_hci_deinit_device(int index)
+{
+ struct dev_info *dev = NULL;
+
+ dev = &hci_dev_info[index];
+ if (dev->skt_fd < 0)
+ return -1;
+
+ BPRINT_I("Stopping HCI%d socket %d", index, dev->skt_fd);
+
+ boots_hci_close_dev(dev->skt_fd);
+ memset(dev, 0, sizeof(*dev));
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+static int boots_hci_deinit_all_devices(void)
+{
+ int i;
+
+ for (i = 0; i < HCI_MAX_DEV; i++)
+ boots_hci_deinit_device(i);
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+int boots_hci_enable(char *arg, void *func_cb)
+{
+ UNUSED(boots_btif);
+ UNUSED(arg);
+ UNUSED(func_cb);
+
+ if (boots_hci_init_all_devices() < 0) {
+ BPRINT_E("adapter_ops_setup failed");
+ return -1;
+ }
+ else {
+ return commPort;
+ }
+}
+
+//---------------------------------------------------------------------------
+int boots_hci_disable(int bt_fd)
+{
+ UNUSED(bt_fd);
+
+ if (commPort >= 0) {
+ boots_hci_deinit_all_devices();
+ commPort = -1;
+ }
+ return 0;
+}
+