diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-09-29 08:37:29 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-09-29 08:37:29 +0000 |
commit | ca5381c155b43e87aaeadd1b1c78bed05826803f (patch) | |
tree | 4f7a87e6c4396a4bc149959e2a6cf55eaa85b674 | |
parent | 562d5482539405beae43239d977897f9aaa88839 (diff) | |
parent | 7ef626c390d9977f7252a3d95e728efa01e83e28 (diff) | |
download | platform_hardware_qcom_bt-ca5381c155b43e87aaeadd1b1c78bed05826803f.tar.gz platform_hardware_qcom_bt-ca5381c155b43e87aaeadd1b1c78bed05826803f.tar.bz2 platform_hardware_qcom_bt-ca5381c155b43e87aaeadd1b1c78bed05826803f.zip |
release-request-fbd98711-169e-4972-a5f2-db043df00e09-for-git_pi-release-4367572 snap-temp-L13500000107248413
Change-Id: I8caa63b3c80f7070efdc9c9df6b0ef81c8e7737b
-rw-r--r-- | sdm845/Android.mk | 3 | ||||
-rwxr-xr-x | sdm845/CleanSpec.mk | 54 | ||||
-rw-r--r-- | sdm845/libbt-vendor/Android.mk | 88 | ||||
-rw-r--r-- | sdm845/libbt-vendor/NOTICE | 190 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/bt_vendor_persist.h | 69 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/bt_vendor_qcom.h | 97 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/hci_smd.h | 37 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/hci_uart.h | 263 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/hw_ar3k.h | 164 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/hw_rome.h | 290 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/vnd_generic.txt | 9 | ||||
-rw-r--r-- | sdm845/libbt-vendor/include/vnd_mako.txt | 9 | ||||
-rw-r--r-- | sdm845/libbt-vendor/src/bt_vendor_persist.cpp | 91 | ||||
-rwxr-xr-x | sdm845/libbt-vendor/src/bt_vendor_qcom.c | 1483 | ||||
-rw-r--r-- | sdm845/libbt-vendor/src/hardware.c | 194 | ||||
-rw-r--r-- | sdm845/libbt-vendor/src/hci_smd.c | 161 | ||||
-rw-r--r-- | sdm845/libbt-vendor/src/hci_uart.c | 526 | ||||
-rw-r--r-- | sdm845/libbt-vendor/src/hw_ar3k.c | 1488 | ||||
-rw-r--r-- | sdm845/libbt-vendor/src/hw_rome.c | 1950 | ||||
-rw-r--r-- | sdm845/libbt-vendor/vnd_buildcfg.mk | 32 |
20 files changed, 0 insertions, 7198 deletions
diff --git a/sdm845/Android.mk b/sdm845/Android.mk deleted file mode 100644 index cd2c3ae..0000000 --- a/sdm845/Android.mk +++ /dev/null @@ -1,3 +0,0 @@ -ifeq ($(call is-vendor-board-platform,QCOM),true) -include $(call all-named-subdir-makefiles,libbt-vendor) -endif # is-vendor-board-platform diff --git a/sdm845/CleanSpec.mk b/sdm845/CleanSpec.mk deleted file mode 100755 index 8ab6f23..0000000 --- a/sdm845/CleanSpec.mk +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2007 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# If you don't need to do a full clean build but would like to touch -# a file or delete some intermediate files, add a clean step to the end -# of the list. These steps will only be run once, if they haven't been -# run before. -# -# E.g.: -# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) -# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) -# -# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with -# files that are missing or have been moved. -# -# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. -# Use $(OUT_DIR) to refer to the "out" directory. -# -# If you need to re-do something that's already mentioned, just copy -# the command and add it to the bottom of the list. E.g., if a change -# that you made last week required touching a file and a change you -# made today requires touching the same file, just copy the old -# touch step and add it to the end of the list. -# -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ - -# For example: -#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) -#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) -#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) -#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) - -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ -$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libbt-vendor_intermediates) -$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/NOTICE_FILES/src/system/vendor/lib/libbt-vendor.so.txt) -$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/lib/libbt-vendor.so) -$(call add-clean-step, rm -rf $(PRODUCT_OUT)/symbols/system/vendor/lib/libbt-vendor.so) -$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/vendor/lib/libbt-vendor.so) diff --git a/sdm845/libbt-vendor/Android.mk b/sdm845/libbt-vendor/Android.mk deleted file mode 100644 index 8d3f9d4..0000000 --- a/sdm845/libbt-vendor/Android.mk +++ /dev/null @@ -1,88 +0,0 @@ -# -# Copyright 2012 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH := $(call my-dir) - -ifeq ($(BOARD_HAVE_BLUETOOTH_QCOM),true) - -include $(CLEAR_VARS) - - -LOCAL_SRC_FILES := \ - src/bt_vendor_qcom.c \ - src/hardware.c \ - src/hci_uart.c \ - src/hci_smd.c \ - src/hw_rome.c \ - src/hw_ar3k.c \ - src/bt_vendor_persist.cpp - -#Disable this flag in case if FM over UART support not needed -LOCAL_CFLAGS := -DFM_OVER_UART - -ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT))) -LOCAL_CFLAGS += -DPANIC_ON_SOC_CRASH -LOCAL_CFLAGS += -DENABLE_DBG_FLAGS -endif - -LOCAL_C_INCLUDES += \ - $(LOCAL_PATH)/include \ - external/bluetooth/bluedroid/hci/include \ - system/bt/hci/include \ - $(TARGET_OUT_HEADERS)/bt/hci_qcomm_init \ - $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include - -LOCAL_ADDITIONAL_DEPENDENCIES += \ -$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr - -ifeq ($(BOARD_HAS_QCA_BT_AR3002), true) -LOCAL_C_FLAGS := \ - -DBT_WAKE_VIA_PROC -endif #BOARD_HAS_QCA_BT_AR3002 - -ifeq ($(WIFI_BT_STATUS_SYNC), true) -LOCAL_CFLAGS += -DWIFI_BT_STATUS_SYNC -endif #WIFI_BT_STATUS_SYNC - -LOCAL_SHARED_LIBRARIES := \ - libcutils \ - liblog \ - libbtnv - -LOCAL_MODULE := libbt-vendor -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_CLASS := SHARED_LIBRARIES -LOCAL_MODULE_OWNER := qcom - -ifdef TARGET_2ND_ARCH -LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib -LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 -else -LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES) -endif - -LOCAL_CFLAGS += -DBT_NV_SUPPORT - -ifneq ($(BOARD_ANT_WIRELESS_DEVICE),) -LOCAL_CFLAGS += -DENABLE_ANT -endif -#LOCAL_CFLAGS += -DREAD_BT_ADDR_FROM_PROP - -#include $(LOCAL_PATH)/vnd_buildcfg.mk - -include $(BUILD_SHARED_LIBRARY) - -endif # BOARD_HAVE_BLUETOOTH_QCOM diff --git a/sdm845/libbt-vendor/NOTICE b/sdm845/libbt-vendor/NOTICE deleted file mode 100644 index 33ff961..0000000 --- a/sdm845/libbt-vendor/NOTICE +++ /dev/null @@ -1,190 +0,0 @@ - - Copyright (c) 2005-2012, The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/sdm845/libbt-vendor/include/bt_vendor_persist.h b/sdm845/libbt-vendor/include/bt_vendor_persist.h deleted file mode 100644 index 4f2e8ee..0000000 --- a/sdm845/libbt-vendor/include/bt_vendor_persist.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef BT_VENDOR_PERSIST_H_ -#define BT_VENDOR_PERSIST_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include <stdio.h> - -#ifdef BT_NV_SUPPORT - -#endif /* BT_NV_SUPPORT */ -typedef unsigned char boolean; -/*=========================================================================== -FUNCTION bt_vendor_nv_read - -DESCRIPTION - Helper Routine to process the nv read command - -DEPENDENCIES - NIL - -RETURN VALUE - RETURN VALUE - FALSE = failure, else TRUE - -SIDE EFFECTS - None - -===========================================================================*/ -extern uint8_t bt_vendor_nv_read -( - uint8_t nv_item, - uint8_t * rsp_buf -); - -#ifdef __cplusplus -} -#endif - -#endif /* BT_VENDOR_PERSIST_H_ */ - diff --git a/sdm845/libbt-vendor/include/bt_vendor_qcom.h b/sdm845/libbt-vendor/include/bt_vendor_qcom.h deleted file mode 100644 index 8565b6c..0000000 --- a/sdm845/libbt-vendor/include/bt_vendor_qcom.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef BT_VENDOR_QCOM_H -#define BT_VENDOR_QCOM_H - -#include <stdbool.h> -#include "bt_vendor_lib.h" - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;} -#define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);} -#define UINT32_TO_STREAM(p, u32) {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8); *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);} - -typedef enum { - BT_SOC_DEFAULT = 0, - BT_SOC_SMD = BT_SOC_DEFAULT, - BT_SOC_AR3K, - BT_SOC_ROME, - BT_SOC_CHEROKEE, - /* Add chipset type here */ - BT_SOC_RESERVED -}bt_soc_type; - -typedef enum { - FM_VND_OP_POWER_CTRL = (unsigned int)BT_VND_OP_A2DP_OFFLOAD_STOP + 1, - BT_VND_OP_FM_USERIAL_OPEN, - BT_VND_OP_FM_USERIAL_CLOSE, -}bt_fm_serial; - -typedef enum { - BT_VND_OP_ANT_USERIAL_OPEN = 254, - BT_VND_OP_ANT_USERIAL_CLOSE -}ant_serial; - -/* HW_NEED_END_WITH_HCI_RESET - - code implementation of sending a HCI_RESET command during the epilog - process. It calls back to the callers after command complete of HCI_RESET - is received. - - Default TRUE . -*/ -#ifndef HW_NEED_END_WITH_HCI_RESET -#define HW_NEED_END_WITH_HCI_RESET TRUE -#endif - -#define HCI_RESET 0x0C03 -#define HCI_CMD_PREAMBLE_SIZE 3 -#define HCI_EVT_CMD_CMPL_STATUS_RET_BYTE 5 -#define HCI_EVT_CMD_CMPL_OPCODE 3 -#define BT_PWR_CNTRL_DEVICE "/dev/btpower" - -enum { - BT_STATUS_SUCCESS = 0, - BT_STATUS_FAIL, - BT_STATUS_INVAL, - BT_STATUS_NOMEM, - BT_STATUS_PROP_FAILURE, -}; -#define BT_CMD_PWR_CTRL 0xbfad -struct bt_qcom_struct { - int fd[2]; - int ant_fd; - int fm_fd; - bt_vendor_callbacks_t *cb; - uint8_t bdaddr[6]; - int soc_type; - int rfkill_id; - char *rfkill_state; - bool enable_extldo; -}; -extern struct bt_qcom_struct *q; -extern pthread_mutex_t q_lock; - -#endif /* BT_VENDOR_QCOM_H */ - diff --git a/sdm845/libbt-vendor/include/hci_smd.h b/sdm845/libbt-vendor/include/hci_smd.h deleted file mode 100644 index 055b779..0000000 --- a/sdm845/libbt-vendor/include/hci_smd.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * - * Filename: hci_smd.h - * - * Description: Contains vendor-specific definitions used in smd controls - * - ******************************************************************************/ - -#ifndef HCI_SMD_H -#define HCI_SMD_H - -#define APPS_RIVA_BT_ACL_CH "/dev/smd2" -#define APPS_RIVA_BT_CMD_CH "/dev/smd3" - -int bt_hci_init_transport ( int *pFd ); - -int bt_hci_deinit_transport(int *pFd); - -#endif /* HCI_SMD_H */ diff --git a/sdm845/libbt-vendor/include/hci_uart.h b/sdm845/libbt-vendor/include/hci_uart.h deleted file mode 100644 index 21e9689..0000000 --- a/sdm845/libbt-vendor/include/hci_uart.h +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * Copyright (C) 2009-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef HCI_UART_H -#define HCI_UART_H - -#include <asm-generic/ioctls.h> - -/* Variables to identify the platform */ -/*BT HS UART TTY DEVICE */ -#define BT_HS_UART_DEVICE "/dev/ttyHS0" - -/**** baud rates ****/ -#define USERIAL_BAUD_300 0 -#define USERIAL_BAUD_600 1 -#define USERIAL_BAUD_1200 2 -#define USERIAL_BAUD_2400 3 -#define USERIAL_BAUD_9600 4 -#define USERIAL_BAUD_19200 5 -#define USERIAL_BAUD_57600 6 -#define USERIAL_BAUD_115200 7 -#define USERIAL_BAUD_230400 8 -#define USERIAL_BAUD_460800 9 -#define USERIAL_BAUD_921600 10 -#define USERIAL_BAUD_1M 11 -#define USERIAL_BAUD_1_5M 12 -#define USERIAL_BAUD_2M 13 -#define USERIAL_BAUD_3M 14 -#define USERIAL_BAUD_4M 15 -#define USERIAL_BAUD_AUTO 16 - -/**** Data Format ****/ -/* Stop Bits */ -#define USERIAL_STOPBITS_1 1 -#define USERIAL_STOPBITS_1_5 (1<<1) -#define USERIAL_STOPBITS_2 (1<<2) - -/* Parity Bits */ -#define USERIAL_PARITY_NONE (1<<3) -#define USERIAL_PARITY_EVEN (1<<4) -#define USERIAL_PARITY_ODD (1<<5) - -/* Data Bits */ -#define USERIAL_DATABITS_5 (1<<6) -#define USERIAL_DATABITS_6 (1<<7) -#define USERIAL_DATABITS_7 (1<<8) -#define USERIAL_DATABITS_8 (1<<9) - -/* HCI Packet types */ -#define HCI_COMMAND_PKT 0x01 -#define HCI_ACLDATA_PKT 0x02 -#define HCI_SCODATA_PKT 0x03 -#define HCI_EVENT_PKT 0x04 -#define HCI_VENDOR_PKT 0xff - -/* HCI Command/Event Opcode */ -#define HCI_RESET 0x0C03 -#define EVT_CMD_COMPLETE 0x0E - -/* Command opcode pack/unpack */ -#define cmd_opcode_pack(ogf, ocf) (uint16_t)((ocf & 0x03ff)|(ogf << 10)) - -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) -/* These are the ioctl values used for bt_wake ioctl via UART driver. you may - * need to redefine them on you platform! - * Logically they need to be unique and not colide with existing uart ioctl's. - */ -#ifndef USERIAL_IOCTL_BT_WAKE_ASSERT -#define USERIAL_IOCTL_BT_WAKE_ASSERT 0x8003 -#endif -#ifndef USERIAL_IOCTL_BT_WAKE_DEASSERT -#define USERIAL_IOCTL_BT_WAKE_DEASSERT 0x8004 -#endif -#ifndef USERIAL_IOCTL_BT_WAKE_GET_ST -#define USERIAL_IOCTL_BT_WAKE_GET_ST 0x8005 -#endif -#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - -/* UART CLOCK IOCTLS*/ -/* UART CLOCK IOCTLS*/ -#define USERIAL_OP_CLK_ON TIOCPMGET /* PM get */ -#define USERIAL_OP_CLK_OFF TIOCPMPUT /* PM put */ -#define USERIAL_OP_CLK_STATE TIOCPMACT /* PM is active */ - -/****************************************************************************** -** Type definitions -******************************************************************************/ - -/* Structure used to configure serial port during open */ -typedef struct -{ - uint16_t fmt; /* Data format */ - uint8_t baud; /* Baud rate */ -} tUSERIAL_CFG; - -typedef enum { -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - USERIAL_OP_ASSERT_BT_WAKE, - USERIAL_OP_DEASSERT_BT_WAKE, - USERIAL_OP_GET_BT_WAKE_STATE, -#endif - USERIAL_OP_FLOW_ON, - USERIAL_OP_FLOW_OFF, - USERIAL_OP_NOP, -} userial_vendor_ioctl_op_t; - -/* UPIO signals */ -enum { - UPIO_BT_WAKE = 0, - UPIO_HOST_WAKE, - UPIO_LPM_MODE, - UPIO_MAX_COUNT -}; - -/* UPIO assertion/deassertion */ -enum { - UPIO_UNKNOWN = 0, - UPIO_DEASSERT, - UPIO_ASSERT -}; - -#define VND_PORT_NAME_MAXLEN 256 - -/* vendor serial control block */ -typedef struct -{ - int fd; /* fd to Bluetooth device */ - struct termios termios; /* serial terminal of BT port */ - char port_name[VND_PORT_NAME_MAXLEN]; -} vnd_userial_cb_t; - -typedef struct { - uint8_t ncmd; - uint16_t opcode; -} __attribute__ ((packed)) evt_cmd_complete; - -typedef struct { - uint8_t status; - uint8_t ncmd; - uint16_t opcode; -} __attribute__ ((packed)) evt_cmd_status; - -typedef struct { - uint16_t opcode; - uint8_t plen; -} __attribute__ ((packed)) hci_command_hdr; - -typedef struct { - uint8_t evt; - uint8_t plen; -} __attribute__ ((packed)) hci_event_hdr; - -/****************************************************************************** -** Extern -******************************************************************************/ -extern vnd_userial_cb_t vnd_userial; - - -/******************************************************************************* -** -** Function userial_vendor_init -** -** Description Initialize userial vendor-specific control block -** -** Returns None -** -*******************************************************************************/ -void userial_vendor_init(void); - -/******************************************************************************* -** -** Function userial_vendor_open -** -** Description Open the serial port with the given configuration -** -** Returns device fd -** -*******************************************************************************/ -int userial_vendor_open(tUSERIAL_CFG *p_cfg); - -/******************************************************************************* -** -** Function userial_vendor_close -** -** Description Conduct vendor-specific close work -** -** Returns None -** -*******************************************************************************/ -void userial_vendor_close(void); - -/******************************************************************************* -** -** Function userial_vendor_set_baud -** -** Description Set new baud rate -** -** Returns None -** -*******************************************************************************/ -void userial_vendor_set_baud(uint8_t userial_baud); - -/******************************************************************************* -** -** Function userial_vendor_ioctl -** -** Description ioctl inteface -** -** Returns int error -** -*******************************************************************************/ -int userial_vendor_ioctl(userial_vendor_ioctl_op_t op, int *p_data); - -/******************************************************************************* -** -** Function userial_to_tcio_baud -** -** Description helper function converts USERIAL baud rates into TCIO -** conforming baud rates -** -** Returns TRUE/FALSE -** -*******************************************************************************/ -uint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud); - -/******************************************************************************* -** -** Function userial_to_baud_tcio -** -** Description helper function converts TCIO baud rate into integer -** -** Returns uint32_t -** -*******************************************************************************/ -int userial_tcio_baud_to_int(uint32_t baud); - -/******************************************************************************* -** -** Function read_hci_event -** -** Description Read HCI event during vendor initialization -** -** Returns int: size to read -** -*******************************************************************************/ -int read_hci_event(int fd, unsigned char* buf, int size); - -#endif /* HCI_UART_H */ diff --git a/sdm845/libbt-vendor/include/hw_ar3k.h b/sdm845/libbt-vendor/include/hw_ar3k.h deleted file mode 100644 index 2129548..0000000 --- a/sdm845/libbt-vendor/include/hw_ar3k.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef HW_AR3K_H -#define HW_AR3K_H - -/****************************************************************************** -** Constants & Macros -******************************************************************************/ -#define MAX_CNT_RETRY 100 - -#define HCI_MAX_CMD_SIZE 260 -#define HCI_MAX_EVENT_SIZE 260 -#define HCI_CHG_BAUD_CMD_OCF 0x0C -#define HCI_VENDOR_CMD_OGF 0x3F -#define WRITE_BDADDR_CMD_LEN 14 -#define WRITE_BAUD_CMD_LEN 6 -#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN -#define GET_VERSION_OCF 0x1E -/* Byte order conversions */ -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define htobs(d) (d) -#define htobl(d) (d) -#define btohs(d) (d) -#define btohl(d) (d) -#elif __BYTE_ORDER == __BIG_ENDIAN -#define htobs(d) bswap_16(d) -#define htobl(d) bswap_32(d) -#define btohs(d) bswap_16(d) -#define btohl(d) bswap_32(d) -#else -#error "Unknown byte order" -#endif - -#define FW_PATH "/system/etc/firmware/ar3k/" - -#define STREAM_TO_UINT16(u16, p) \ - {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;} -#define UINT16_TO_STREAM(p, u16) \ - {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);} -#define UINT32_TO_STREAM(p, u32) \ - {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8);\ - *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);} - -#define MAX_TAGS 50 -#define PS_HDR_LEN 4 -#define HCI_VENDOR_CMD_OGF 0x3F -#define HCI_PS_CMD_OCF 0x0B - -#define VERIFY_CRC 9 -#define PS_REGION 1 -#define PATCH_REGION 2 -#define BDADDR_FILE "ar3kbdaddr.pst" - - -#define MAX_PATCH_CMD 244 -struct patch_entry { - int16_t len; - uint8_t data[MAX_PATCH_CMD]; -}; -#define HCI_UART_RAW_DEVICE 0 -#define HCI_COMMAND_HDR_SIZE 3 -#define PS_WRITE 1 -#define PS_RESET 2 -#define WRITE_PATCH 8 -#define ENABLE_PATCH 11 - -#define HCI_PS_CMD_HDR_LEN 7 -#define HCI_CMD_MAX_LEN 258 -#define PS_RESET_PARAM_LEN 6 -#define PS_RESET_CMD_LEN (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN) - -#define PS_ID_MASK 0xFF - - -#define LOCAL_NAME_BUFFER_LEN 32 -#define DEV_REGISTER 0x4FFC -#define GET_DEV_TYPE_OCF 0x05 - -#define HCIDEVUP _IOW('H', 201, int) -#define OGF_VENDOR_CMD 0x3f -#define EVT_CMD_COMPLETE_SIZE 3 -#define EVT_CMD_STATUS 0x0F -#define EVT_CMD_STATUS_SIZE 4 -#define HCI_COMMAND_HDR_SIZE 3 -#define HCI_EVENT_HDR_SIZE 2 -#define HCI_EV_SUCCESS 0x00 -/* HCI Socket options */ -#define HCI_DATA_DIR 1 -#define HCI_FILTER 2 -#define HCI_TIME_STAMP 3 - -/* HCI CMSG flags */ -#define HCI_CMSG_DIR 0x0001 -#define HCI_CMSG_TSTAMP 0x0002 - -#ifndef VENDOR_LPM_PROC_NODE -#define VENDOR_LPM_PROC_NODE "/sys/module/hci_uart/parameters/ath_lpm" -#endif - -/* proc fs node for notifying write request */ -#ifndef VENDOR_BTWRITE_PROC_NODE -#define VENDOR_BTWRITE_PROC_NODE "/sys/module/hci_uart/parameters/ath_btwrite" -#endif - -/****************************************************************************** -** Local type definitions -******************************************************************************/ -typedef struct { - uint8_t b[6]; -} __attribute__((packed)) bdaddr_t; - -struct sockaddr_hci { - sa_family_t hci_family; - unsigned short hci_dev; - unsigned short hci_channel; -}; - -struct tag_info { - unsigned section; - unsigned line_count; - unsigned char_cnt; - unsigned byte_count; -}; - -struct ps_cfg_entry { - uint32_t id; - uint32_t len; - uint8_t *data; -}; - -struct ps_entry_type { - unsigned char type; - unsigned char array; -}; - -struct uart_t { - char *type; - int m_id; - int p_id; - int proto; - int init_speed; - int speed; - int flags; - int pm; - char *bdaddr; - int (*init) (int fd, struct uart_t *u, struct termios *ti); - int (*post) (int fd, struct uart_t *u, struct termios *ti); -}; -#endif /* HW_AR3K_H */ diff --git a/sdm845/libbt-vendor/include/hw_rome.h b/sdm845/libbt-vendor/include/hw_rome.h deleted file mode 100644 index 08efb39..0000000 --- a/sdm845/libbt-vendor/include/hw_rome.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef HW_ROME_H -#define HW_ROME_H - - -/****************************************************************************** -** Constants & Macros -******************************************************************************/ -#define HCI_MAX_CMD_SIZE 260 -#define HCI_MAX_EVENT_SIZE 260 -#define PRINT_BUF_SIZE ((HCI_MAX_CMD_SIZE * 3) + 2) - -#define HCI_CHG_BAUD_CMD_OCF 0x0C -#define HCI_VENDOR_CMD_OGF 0x3F -#define WRITE_BDADDR_CMD_LEN 14 -#define WRITE_BAUD_CMD_LEN 6 -#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN -#define GET_VERSION_OCF 0x1E - -#define PS_HDR_LEN 4 -#define HCI_VENDOR_CMD_OGF 0x3F -#define HCI_PS_CMD_OCF 0x0B - -#define HCI_COMMAND_HDR_SIZE 3 -#define EVT_CMD_COMPLETE_SIZE 3 -#define EVT_CMD_STATUS 0x0F -#define EVT_CMD_STATUS_SIZE 4 -#define HCI_EVENT_HDR_SIZE 2 -#define HCI_EV_SUCCESS 0x00 -/* HCI Socket options */ -#define HCI_DATA_DIR 1 -#define HCI_FILTER 2 -#define HCI_TIME_STAMP 3 - -#define P_ID_OFFSET (0) -#define HCI_CMD_IND (1) -#define EVENTCODE_OFFSET (1) -#define EVT_PLEN (2) -#define PLEN (3) -#define CMD_RSP_OFFSET (3) -#define RSP_TYPE_OFFSET (4) -#define BAUDRATE_RSP_STATUS_OFFSET (4) -#define CMD_STATUS_OFFSET (5) -#define P_ROME_VER_OFFSET (4) -#define P_BUILD_VER_OFFSET (6) -#define P_BASE_ADDR_OFFSET (8) -#define P_ENTRY_ADDR_OFFSET (12) -#define P_LEN_OFFSET (16) -#define P_CRC_OFFSET (20) -#define P_CONTROL_OFFSET (24) -#define PATCH_HDR_LEN (28) -#define MAX_DATA_PER_SEGMENT (239) -#define VSEVENT_CODE (0xFF) -#define HC_VS_MAX_CMD_EVENT (0xFF) -#define PATCH_PROD_ID_OFFSET (5) -#define PATCH_PATCH_VER_OFFSET (9) -#define PATCH_ROM_BUILD_VER_OFFSET (11) -#define PATCH_SOC_VER_OFFSET (13) -#define MAX_SIZE_PER_TLV_SEGMENT (243) - -/* VS Opcode */ -#define HCI_PATCH_CMD_OCF (0) -#define EDL_SET_BAUDRATE_CMD_OCF (0x48) -#define EDL_WIPOWER_VS_CMD_OCF (0x1f) -#define HCI_VS_GET_ADDON_FEATURES_SUPPORT (0x1d) - -/* VS Commands */ -#define VSC_SET_BAUDRATE_REQ_LEN (1) -#define EDL_PATCH_CMD_LEN (1) -#define EDL_PATCH_CMD_REQ_LEN (1) -#define EDL_WIP_QUERY_CHARGING_STATUS_LEN (0x01) -#define EDL_WIP_START_HANDOFF_TO_HOST_LEN (0x01) -#define EDL_PATCH_DLD_REQ_CMD (0x01) -#define EDL_PATCH_RST_REQ_CMD (0x05) -#define EDL_PATCH_SET_REQ_CMD (0x16) -#define EDL_PATCH_ATCH_REQ_CMD (0x17) -#define EDL_PATCH_VER_REQ_CMD (0x19) -#define EDL_GET_BUILD_INFO (0x20) -#define EDL_PATCH_TLV_REQ_CMD (0x1E) -#define EDL_WIP_QUERY_CHARGING_STATUS_CMD (0x1D) -#define EDL_WIP_START_HANDOFF_TO_HOST_CMD (0x1E) - -/* VS Event */ -#define EDL_CMD_REQ_RES_EVT (0x00) -#define EDL_CMD_EXE_STATUS_EVT (0x00) -#define EDL_SET_BAUDRATE_RSP_EVT (0x92) -#define EDL_PATCH_VER_RES_EVT (0x19) -#define EDL_TVL_DNLD_RES_EVT (0x04) -#define EDL_APP_VER_RES_EVT (0x02) -#define EDL_WIP_QUERY_CHARGING_STATUS_EVT (0x18) -#define EDL_WIP_START_HANDOFF_TO_HOST_EVENT (0x19) -#define HCI_VS_GET_ADDON_FEATURES_EVENT (0x1B) -#define HCI_VS_GET_BUILD_VER_EVT (0x05) -#define HCI_VS_STRAY_EVT (0x17) - -/* Status Codes of HCI CMD execution*/ -#define HCI_CMD_SUCCESS (0x0) -#define PATCH_LEN_ERROR (0x1) -#define PATCH_VER_ERROR (0x2) -#define PATCH_CRC_ERROR (0x3) -#define PATCH_NOT_FOUND (0x4) -#define TLV_TYPE_ERROR (0x10) -#define NVM_ACCESS_CODE (0x0B) -#define BAUDRATE_CHANGE_SUCCESS (1) - -/* Wipower status codes */ -#define WIPOWER_IN_EMBEDDED_MODE 0x01 -#define NON_WIPOWER_MODE 0x02 - -/* mask to validate support for wipower */ -#define ADDON_FEATURES_EVT_WIPOWER_MASK (0x01) - -/* TLV_TYPE */ -#define TLV_TYPE_PATCH (1) -#define TLV_TYPE_NVM (2) - -/* NVM */ -#define MAX_TAG_CMD 30 -#define TAG_END 0xFF -#define NVM_ACCESS_SET 0x01 -#define TAG_NUM_OFFSET 5 -#define TAG_NUM_2 2 -#define TAG_BDADDR_OFFSET 7 - -/* NVM Tags specifically used for ROME 1.0 */ -#define ROME_1_0_100022_1 0x101000221 -#define ROME_1_0_100019 0x101000190 -#define ROME_1_0_6002 0x100600200 - -/* Default NVM Version setting for ROME 1.0 */ -#define NVM_VERSION ROME_1_0_100022_1 - - -#define LSH(val, n) ((uint32_t)(val) << (n)) -#define EXTRACT_BYTE(val, pos) (char) (((val) >> (8 * (pos))) & 0xFF) -#define CALC_SEG_SIZE(len, max) ((plen) % (max))?((plen/max)+1) : ((plen) / (max)) - -#define ROME_FW_PATH "/system/etc/firmware/rampatch.img" -#define ROME_RAMPATCH_TLV_PATH "/system/etc/firmware/rampatch_tlv.img" -#define ROME_NVM_TLV_PATH "/system/etc/firmware/nvm_tlv.bin" -#define ROME_RAMPATCH_TLV_1_0_3_PATH "/system/etc/firmware/rampatch_tlv_1.3.tlv" -#define ROME_NVM_TLV_1_0_3_PATH "/system/etc/firmware/nvm_tlv_1.3.bin" -#define ROME_RAMPATCH_TLV_2_0_1_PATH "/system/etc/firmware/rampatch_tlv_2.1.tlv" -#define ROME_NVM_TLV_2_0_1_PATH "/system/etc/firmware/nvm_tlv_2.1.bin" -#define ROME_RAMPATCH_TLV_3_0_0_PATH "/bt_firmware/image/btfw30.tlv" -#define ROME_NVM_TLV_3_0_0_PATH "/bt_firmware/image/btnv30.bin" -#define ROME_RAMPATCH_TLV_3_0_2_PATH "/bt_firmware/image/btfw32.tlv" -#define ROME_NVM_TLV_3_0_2_PATH "/bt_firmware/image/btnv32.bin" - -#define ROME_3_1_FW_SU "bprm.cnss.3.1" -#define ROME_3_2_FW_SU "btfwp.cnss.3.2" - -/* Rome 3.1 FW SU release has been branched from rome 3.0 SU 224 - So, rome 3.1 formula is SU = patch version -(0xE0 = 224) - 0x111 -1 -*/ -#define ROME_3_1_FW_SW_OFFSET 0x01F2 - -/* Rome 3.2 FW SU formula is SU = patch version - 0x111 -1 */ -#define ROME_3_2_FW_SW_OFFSET 0x0112 - -/* This header value in rampatch file decides event handling mechanism in the HOST */ -#define ROME_SKIP_EVT_NONE 0x00 -#define ROME_SKIP_EVT_VSE 0x01 -#define ROME_SKIP_EVT_CC 0x02 -#define ROME_SKIP_EVT_VSE_CC 0x03 - -/****************************************************************************** -** Local type definitions -******************************************************************************/ -typedef struct { - unsigned short rom_version; - unsigned short build_version; -} __attribute__ ((packed)) patch_version; - -typedef struct { - unsigned int patch_id; - patch_version patch_ver; - unsigned int patch_base_addr; - unsigned int patch_entry_addr; - unsigned short patch_length; - int patch_crc; - unsigned short patch_ctrl; -} __attribute__ ((packed)) patch_info; - -typedef struct { - unsigned int tlv_data_len; - unsigned int tlv_patch_data_len; - unsigned char sign_ver; - unsigned char sign_algorithm; - unsigned char dwnd_cfg; - unsigned char reserved1; - unsigned short prod_id; - unsigned short build_ver; - unsigned short patch_ver; - unsigned short reserved2; - unsigned int patch_entry_addr; -} __attribute__ ((packed)) tlv_patch_hdr; - -typedef struct { - unsigned short tag_id; - unsigned short tag_len; - unsigned int tag_ptr; - unsigned int tag_ex_flag; -} __attribute__ ((packed)) tlv_nvm_hdr; - -typedef struct { - unsigned char tlv_type; - unsigned char tlv_length1; - unsigned char tlv_length2; - unsigned char tlv_length3; - - union{ - tlv_patch_hdr patch; - tlv_nvm_hdr nvm; - }tlv; -} __attribute__ ((packed)) tlv_patch_info; - - -enum{ - BAUDRATE_115200 = 0x00, - BAUDRATE_57600 = 0x01, - BAUDRATE_38400 = 0x02, - BAUDRATE_19200 = 0x03, - BAUDRATE_9600 = 0x04, - BAUDRATE_230400 = 0x05, - BAUDRATE_250000 = 0x06, - BAUDRATE_460800 = 0x07, - BAUDRATE_500000 = 0x08, - BAUDRATE_720000 = 0x09, - BAUDRATE_921600 = 0x0A, - BAUDRATE_1000000 = 0x0B, - BAUDRATE_1250000 = 0x0C, - BAUDRATE_2000000 = 0x0D, - BAUDRATE_3000000 = 0x0E, - BAUDRATE_4000000 = 0x0F, - BAUDRATE_1600000 = 0x10, - BAUDRATE_3200000 = 0x11, - BAUDRATE_3500000 = 0x12, - BAUDRATE_AUTO = 0xFE, - BAUDRATE_Reserved = 0xFF -}; - -enum{ - ROME_PATCH_VER_0100 = 0x0100, - ROME_PATCH_VER_0101 = 0x0101, - ROME_PATCH_VER_0200 = 0x0200, - ROME_PATCH_VER_0300 = 0x0300, - ROME_PATCH_VER_0302 = 0x0302 - }; - -enum{ - ROME_SOC_ID_00 = 0x00000000, - ROME_SOC_ID_11 = 0x00000011, - ROME_SOC_ID_22 = 0x00000022, - ROME_SOC_ID_44 = 0x00000044 -}; - -enum{ - ROME_VER_UNKNOWN = 0, - ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ), - ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ), - ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), - ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), - ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), - ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ) -}; - -//declarations -int rome_soc_init(int fd, char *bdaddr); -int check_embedded_mode(int fd); -int rome_get_addon_feature_list(int fd); -void enable_controller_log(int fd, unsigned char req); -void cherokee_shutdown_vs_cmd(int fd); -#endif /* HW_ROME_H */ diff --git a/sdm845/libbt-vendor/include/vnd_generic.txt b/sdm845/libbt-vendor/include/vnd_generic.txt deleted file mode 100644 index 43e790c..0000000 --- a/sdm845/libbt-vendor/include/vnd_generic.txt +++ /dev/null @@ -1,9 +0,0 @@ -BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1" -FW_PATCHFILE_LOCATION = "/vendor/firmware/" -BT_WAKE_VIA_USERIAL_IOCTL = TRUE -LPM_IDLE_TIMEOUT_MULTIPLE = 5 -SCO_USE_I2S_INTERFACE = TRUE -BTVND_DBG = FALSE -BTHW_DBG = TRUE -VNDUSERIAL_DBG = FALSE -UPIO_DBG = FALSE diff --git a/sdm845/libbt-vendor/include/vnd_mako.txt b/sdm845/libbt-vendor/include/vnd_mako.txt deleted file mode 100644 index 5408c92..0000000 --- a/sdm845/libbt-vendor/include/vnd_mako.txt +++ /dev/null @@ -1,9 +0,0 @@ -BLUETOOTH_UART_DEVICE_PORT = "/dev/smd3" -FW_PATCHFILE_LOCATION = "/vendor/firmware/" -BT_WAKE_VIA_USERIAL_IOCTL = TRUE -LPM_IDLE_TIMEOUT_MULTIPLE = 5 -SCO_USE_I2S_INTERFACE = TRUE -BTVND_DBG = FALSE -BTHW_DBG = TRUE -VNDUSERIAL_DBG = FALSE -UPIO_DBG = FALSE diff --git a/sdm845/libbt-vendor/src/bt_vendor_persist.cpp b/sdm845/libbt-vendor/src/bt_vendor_persist.cpp deleted file mode 100644 index 519e826..0000000 --- a/sdm845/libbt-vendor/src/bt_vendor_persist.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "bt_vendor_persist.h" - -#ifdef BT_NV_SUPPORT -#include "bt_nv.h" -#include <utils/Log.h> - -/*=========================================================================== -FUNCTION bt_vendor_nv_read - -DESCRIPTION - Helper Routine to process the nv read command - -DEPENDENCIES - NIL - -RETURN VALUE - RETURN VALUE - FALSE = failure, else TRUE - -SIDE EFFECTS - None - -===========================================================================*/ -uint8_t bt_vendor_nv_read -( - uint8_t nv_item, - uint8_t * rsp_buf -) -{ - nv_persist_item_type my_nv_item; - nv_persist_stat_enum_type cmd_result; - boolean result = FALSE; - - switch(nv_item) - { - case NV_BD_ADDR_I: - cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BD_ADDR_I, &my_nv_item); - ALOGI("CMD result: %d", cmd_result); - if (NV_SUCCESS != cmd_result) - { - ALOGE("Failed to read BD_ADDR from NV"); - /* Send fail response */ - result = FALSE; - } - else - { - /* copy bytes */ - rsp_buf[0] = my_nv_item.bd_addr[0]; - rsp_buf[1] = my_nv_item.bd_addr[1]; - rsp_buf[2] = my_nv_item.bd_addr[2]; - rsp_buf[3] = my_nv_item.bd_addr[3]; - rsp_buf[4] = my_nv_item.bd_addr[4]; - rsp_buf[5] = my_nv_item.bd_addr[5]; - - ALOGI("BD address read for NV_BD_ADDR_I: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - (unsigned int) my_nv_item.bd_addr[0],(unsigned int) my_nv_item.bd_addr[1], - (unsigned int) my_nv_item.bd_addr[2],(unsigned int) my_nv_item.bd_addr[3], - (unsigned int) my_nv_item.bd_addr[4],(unsigned int) my_nv_item.bd_addr[5]); - result = TRUE; - } - break; - } - return result; -} -#endif /* End of BT_NV_SUPPORT */ diff --git a/sdm845/libbt-vendor/src/bt_vendor_qcom.c b/sdm845/libbt-vendor/src/bt_vendor_qcom.c deleted file mode 100755 index 8cbf5d1..0000000 --- a/sdm845/libbt-vendor/src/bt_vendor_qcom.c +++ /dev/null @@ -1,1483 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * - * Filename: bt_vendor_qcom.c - * - * Description: vendor specific library implementation - * - ******************************************************************************/ -#define LOG_TAG "bt_vendor" -#define BLUETOOTH_MAC_ADDR_BOOT_PROPERTY "ro.boot.btmacaddr" - -#include <utils/Log.h> -#include <cutils/properties.h> -#include <fcntl.h> -#include <termios.h> -#include "bt_vendor_qcom.h" -#include "hci_uart.h" -#include "hci_smd.h" -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <cutils/sockets.h> -#include <linux/un.h> -#include "bt_vendor_persist.h" -#include "hw_rome.h" -#include "bt_vendor_lib.h" -#define WAIT_TIMEOUT 200000 -#define BT_VND_OP_GET_LINESPEED 30 - -#define STOP_WCNSS_FILTER 0xDD -#define STOP_WAIT_TIMEOUT 1000 - -#define SOC_INIT_PROPERTY "wc_transport.soc_initialized" - -#define BT_VND_FILTER_START "wc_transport.start_hci" - -#define CMD_TIMEOUT 0x22 - -static void wait_for_patch_download(bool is_ant_req); -static bool is_debug_force_special_bytes(void); -int connect_to_local_socket(char* name); -/****************************************************************************** -** Externs -******************************************************************************/ -extern int hw_config(int nState); -extern int is_hw_ready(); -extern int chipset_ver; - -/****************************************************************************** -** Variables -******************************************************************************/ -struct bt_qcom_struct *q = NULL; -pthread_mutex_t q_lock = PTHREAD_MUTEX_INITIALIZER; - -int userial_clock_operation(int fd, int cmd); -int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti); -int userial_vendor_get_baud(void); -int readTrpState(); -void lpm_set_ar3k(uint8_t pio, uint8_t action, uint8_t polarity); -bool is_download_progress(); - -static const tUSERIAL_CFG userial_init_cfg = -{ - (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1), - USERIAL_BAUD_115200 -}; - -#if (HW_NEED_END_WITH_HCI_RESET == TRUE) -void __hw_epilog_process(void); -#endif - -#ifdef WIFI_BT_STATUS_SYNC -#include <string.h> -#include <errno.h> -#include <dlfcn.h> -#include "cutils/properties.h" - -static const char WIFI_PROP_NAME[] = "wlan.driver.status"; -static const char SERVICE_PROP_NAME[] = "bluetooth.hsic_ctrl"; -static const char BT_STATUS_NAME[] = "bluetooth.enabled"; -static const char WIFI_SERVICE_PROP[] = "wlan.hsic_ctrl"; - -#define WIFI_BT_STATUS_LOCK "/data/connectivity/wifi_bt_lock" -int isInit=0; -#endif /* WIFI_BT_STATUS_SYNC */ -bool is_soc_initialized(void); - -/****************************************************************************** -** Local type definitions -******************************************************************************/ - -/****************************************************************************** -** Functions -******************************************************************************/ -#ifdef WIFI_BT_STATUS_SYNC -int bt_semaphore_create(void) -{ - int fd; - - fd = open(WIFI_BT_STATUS_LOCK, O_RDONLY); - - if (fd < 0) - ALOGE("can't create file\n"); - - return fd; -} - -int bt_semaphore_get(int fd) -{ - int ret; - - if (fd < 0) - return -1; - - ret = flock(fd, LOCK_EX); - if (ret != 0) { - ALOGE("can't hold lock: %s\n", strerror(errno)); - return -1; - } - - return ret; -} - -int bt_semaphore_release(int fd) -{ - int ret; - - if (fd < 0) - return -1; - - ret = flock(fd, LOCK_UN); - if (ret != 0) { - ALOGE("can't release lock: %s\n", strerror(errno)); - return -1; - } - - return ret; -} - -int bt_semaphore_destroy(int fd) -{ - if (fd < 0) - return -1; - - return close (fd); -} - -int bt_wait_for_service_done(void) -{ - char service_status[PROPERTY_VALUE_MAX]; - int count = 30; - - ALOGE("%s: check\n", __func__); - - /* wait for service done */ - while (count-- > 0) { - property_get(WIFI_SERVICE_PROP, service_status, NULL); - - if (strcmp(service_status, "") != 0) { - usleep(200000); - } else { - break; - } - } - - return 0; -} - -#endif /* WIFI_BT_STATUS_SYNC */ - -/** Get Bluetooth SoC type from system setting */ -static int get_bt_soc_type() -{ - int ret = 0; - char bt_soc_type[PROPERTY_VALUE_MAX]; - - ALOGI("bt-vendor : get_bt_soc_type"); - - ret = property_get("qcom.bluetooth.soc", bt_soc_type, NULL); - if (ret != 0) { - ALOGI("qcom.bluetooth.soc set to %s\n", bt_soc_type); - if (!strncasecmp(bt_soc_type, "rome", sizeof("rome"))) { - return BT_SOC_ROME; - } - else if (!strncasecmp(bt_soc_type, "cherokee", sizeof("cherokee"))) { - return BT_SOC_CHEROKEE; - } - else if (!strncasecmp(bt_soc_type, "ath3k", sizeof("ath3k"))) { - return BT_SOC_AR3K; - } - else if (!strncasecmp(bt_soc_type, "cherokee", sizeof("cherokee"))) { - return BT_SOC_CHEROKEE; - } - else { - ALOGI("qcom.bluetooth.soc not set, so using default.\n"); - return BT_SOC_DEFAULT; - } - } - else { - ALOGE("%s: Failed to get soc type", __FUNCTION__); - ret = BT_SOC_DEFAULT; - } - - return ret; -} - -bool can_perform_action(char action) { - bool can_perform = false; - char ref_count[PROPERTY_VALUE_MAX]; - char inProgress[PROPERTY_VALUE_MAX] = {'\0'}; - int value, ret; - - property_get("wc_transport.ref_count", ref_count, "0"); - - value = atoi(ref_count); - ALOGV("%s: ref_count: %s\n",__func__, ref_count); - - if(action == '1') { - ALOGV("%s: on : value is: %d", __func__, value); - if(value == 1) - { - if ((is_soc_initialized() == true) - || is_download_progress() || get_bt_soc_type() == BT_SOC_CHEROKEE) - { - value++; - ALOGV("%s: on : value is incremented to : %d", __func__, value); - } - } - else - { - value++; - } - - if (value == 1) - can_perform = true; - else if (value > 3) - return false; - } - else { - ALOGV("%s: off : value is: %d", __func__, value); - if (--value <= 0) { - ALOGE("%s: BT turn off twice before BT On(ref_count=%d)\n", - __func__, value); - value = 0; - can_perform = true; - } - } - - snprintf(ref_count, 3, "%d", value); - ALOGV("%s: updated ref_count is: %s", __func__, ref_count); - - ret = property_set("wc_transport.ref_count", ref_count); - if (ret < 0) { - ALOGE("%s: Error while updating property: %d\n", __func__, ret); - return false; - } - ALOGV("%s returning %d", __func__, can_perform); - return can_perform; -} - -void stop_hci_filter() { - char value[PROPERTY_VALUE_MAX] = {'\0'}; - int retval, filter_ctrl, i; - char stop_val = STOP_WCNSS_FILTER; - int soc_type = BT_SOC_DEFAULT; - - ALOGV("%s: Entry ", __func__); - - if ((soc_type = get_bt_soc_type()) == BT_SOC_CHEROKEE) { - property_get("wc_transport.hci_filter_status", value, "0"); - if (strcmp(value, "0") == 0) { - ALOGI("%s: hci_filter has been stopped already", __func__); - } - else { - filter_ctrl = connect_to_local_socket("wcnssfilter_ctrl"); - if (filter_ctrl < 0) { - ALOGI("%s: Error while connecting to CTRL_SOCK, filter should stopped: %d", - __func__, filter_ctrl); - } - else { - retval = write(filter_ctrl, &stop_val, 1); - if (retval != 1) { - ALOGI("%s: problem writing to CTRL_SOCK, ignore: %d", __func__, retval); - //Ignore and fallback - } - - close(filter_ctrl); - } - } - - /* Ensure Filter is closed by checking the status before - RFKILL 0 operation. this should ideally comeout very - quick */ - for(i=0; i<500; i++) { - property_get(BT_VND_FILTER_START, value, "false"); - if (strcmp(value, "false") == 0) { - ALOGI("%s: WCNSS_FILTER stopped", __func__); - usleep(STOP_WAIT_TIMEOUT * 10); - break; - } else { - /*sleep of 1ms, This should give enough time for FILTER to - exit with all necessary cleanup*/ - usleep(STOP_WAIT_TIMEOUT); - } - } - - /*Never use SIGKILL to stop the filter*/ - /* Filter will be stopped by below two conditions - - by Itself, When it realizes there are no CONNECTED clients - - Or through STOP_WCNSS_FILTER byte on Control socket - both of these ensure clean shutdown of chip - */ - //property_set(BT_VND_FILTER_START, "false"); - } else if (soc_type == BT_SOC_ROME) { - property_set(BT_VND_FILTER_START, "false"); - } else { - ALOGI("%s: Unknown soc type %d, Unexpected!", __func__, soc_type); - } - - ALOGV("%s: Exit ", __func__); -} - -int start_hci_filter() { - ALOGV("%s: Entry ", __func__); - int i, init_success = -1; - char value[PROPERTY_VALUE_MAX] = {'\0'}; - - property_get(BT_VND_FILTER_START, value, false); - - if (strcmp(value, "true") == 0) { - ALOGI("%s: hci_filter has been started already", __func__); - //Filter should have been started OR in the process of initializing - //Make sure of hci_filter_status and return the state based on it - } else { - - property_set("wc_transport.hci_filter_status", "0"); - property_set(BT_VND_FILTER_START, "true"); - ALOGV("%s: %s set to true ", __func__, BT_VND_FILTER_START ); - } - - /*If there are back to back ON requests from different clients, - All client should come and stuck in this while loop till FILTER - comesup and ready to accept the connections */ - //sched_yield(); - for(i=0; i<45; i++) { - property_get("wc_transport.hci_filter_status", value, "0"); - if (strcmp(value, "1") == 0) { - init_success = 1; - break; - } else { - usleep(WAIT_TIMEOUT); - } - } - ALOGV("start_hcifilter status:%d after %f seconds \n", init_success, 0.2*i); - - ALOGV("%s: Exit ", __func__); - return init_success; -} - -/* - * Bluetooth Controller power up or shutdown, this function is called with - * q_lock held and q is non-NULL - */ -static int bt_powerup(int en ) -{ - char rfkill_type[64], *enable_ldo_path = NULL; - char type[16], enable_ldo[6]; - int fd = 0, size, i, ret, fd_ldo, fd_btpower; - - char disable[PROPERTY_VALUE_MAX]; - char state; - char on = (en)?'1':'0'; - -#ifdef WIFI_BT_STATUS_SYNC - char wifi_status[PROPERTY_VALUE_MAX]; - int lock_fd; -#endif /*WIFI_BT_STATUS_SYNC*/ - - ALOGI("bt_powerup: %c", on); - - /* Check if rfkill has been disabled */ - ret = property_get("ro.rfkilldisabled", disable, "0"); - if (!ret ){ - ALOGE("Couldn't get ro.rfkilldisabled (%d)", ret); - return -1; - } - /* In case rfkill disabled, then no control power*/ - if (strcmp(disable, "1") == 0) { - ALOGI("ro.rfkilldisabled : %s", disable); - return -1; - } - -#ifdef WIFI_BT_STATUS_SYNC - lock_fd = bt_semaphore_create(); - bt_semaphore_get(lock_fd); - bt_wait_for_service_done(); -#endif - - /* Assign rfkill_id and find bluetooth rfkill state path*/ - for(i = 0; (q->rfkill_id == -1) && (q->rfkill_state == NULL); i++) - { - snprintf(rfkill_type, sizeof(rfkill_type), "/sys/class/rfkill/rfkill%d/type", i); - if ((fd = open(rfkill_type, O_RDONLY)) < 0) - { - ALOGE("open(%s) failed: %s (%d)\n", rfkill_type, strerror(errno), errno); - -#ifdef WIFI_BT_STATUS_SYNC - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); -#endif - return -1; - } - - size = read(fd, &type, sizeof(type)); - close(fd); - - if ((size >= 9) && !memcmp(type, "bluetooth", 9)) - { - asprintf(&q->rfkill_state, "/sys/class/rfkill/rfkill%d/state", q->rfkill_id = i); - break; - } - } - - /* Get rfkill State to control */ - if (q->rfkill_state != NULL) - { - if ((fd = open(q->rfkill_state, O_RDWR)) < 0) - { - ALOGE("open(%s) for write failed: %s (%d)", q->rfkill_state, strerror(errno), errno); -#ifdef WIFI_BT_STATUS_SYNC - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); -#endif - - return -1; - } - } - /* Always perform BT power action so as to have the chance to - recover BT power properly from un-expected error. */ -#ifdef CHECK_BT_POWER_PERFORM_ACTION - if(can_perform_action(on) == false) { - ALOGE("%s:can't perform action as it is being used by other clients", __func__); -#ifdef WIFI_BT_STATUS_SYNC - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); -#endif - goto done; - } -#else - ALOGI("%s: always perform action", __func__); -#endif - ret = asprintf(&enable_ldo_path, "/sys/class/rfkill/rfkill%d/device/extldo", q->rfkill_id); - if( (ret < 0 ) || (enable_ldo_path == NULL) ) - { - ALOGE("Memory Allocation failure"); - return -1; - } - if ((fd_ldo = open(enable_ldo_path, O_RDWR)) < 0) { - ALOGE("open(%s) failed: %s (%d)", enable_ldo_path, strerror(errno), errno); - return -1; - } - size = read(fd_ldo, &enable_ldo, sizeof(enable_ldo)); - close(fd_ldo); - if (size <= 0) { - ALOGE("read(%s) failed: %s (%d)", enable_ldo_path, strerror(errno), errno); - return -1; - } - if (!memcmp(enable_ldo, "true", 4)) { - ALOGI("External LDO has been configured"); - ret = property_set("wc_transport.extldo", "enabled"); - if (ret < 0) { - ALOGI("%s: Not able to set property wc_transport.extldo\n", __func__); - } - q->enable_extldo = TRUE; - } - - if(on == '0'){ - ALOGE("Stopping HCI filter as part of CTRL:OFF"); - stop_hci_filter(); - property_set("wc_transport.soc_initialized", "0"); - } - - if (q->soc_type >= BT_SOC_CHEROKEE && q->soc_type < BT_SOC_RESERVED) { - ALOGI("open bt power devnode,send ioctl power op :%d ",en); - fd_btpower = open(BT_PWR_CNTRL_DEVICE, O_RDWR, O_NONBLOCK); - if (fd_btpower < 0) { - ALOGE("\nfailed to open bt device error = (%s)\n",strerror(errno)); -#ifdef WIFI_BT_STATUS_SYNC - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); -#endif - return -1; - } - ret = ioctl(fd_btpower, BT_CMD_PWR_CTRL, (unsigned long)en); - if (ret < 0) { - ALOGE(" ioctl failed to power control:%d error =(%s)",ret,strerror(errno)); - } - close(fd_btpower); - } else { - ALOGI("Write %c to rfkill\n", on); - /* Write value to control rfkill */ - if(fd >= 0) { - if ((size = write(fd, &on, 1)) < 0) { - ALOGE("write(%s) failed: %s (%d)", q->rfkill_state, strerror(errno), errno); -#ifdef WIFI_BT_STATUS_SYNC - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); -#endif - return -1; - } - } - } -#ifdef WIFI_BT_STATUS_SYNC - /* query wifi status */ - property_get(WIFI_PROP_NAME, wifi_status, ""); - - ALOGE("bt get wifi status: %s, isInit: %d\n", wifi_status, isInit); - - /* If wlan driver is not loaded, and bt is changed from off => on */ - if (strncmp(wifi_status, "unloaded", strlen("unloaded")) == 0 || strlen(wifi_status) == 0) { - if (on == '1') { - ALOGI("%s: BT_VND_PWR_ON\n", __func__); - if(property_set(SERVICE_PROP_NAME, "load_wlan") < 0) { - ALOGE("%s Property setting failed", SERVICE_PROP_NAME); - close(fd); - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); - return -1; - } - } - else if (isInit == 0 && on == '0') { - ALOGI("%s: BT_VND_PWR_OFF\n", __func__); - if(property_set(SERVICE_PROP_NAME, "unbind_hsic") < 0) { - ALOGE("%s Property setting failed", SERVICE_PROP_NAME); - close(fd); - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); - return -1; - } - } - } - - if (isInit == 0 && on == '0') - property_set(BT_STATUS_NAME, "false"); - else if (on == '1') - property_set(BT_STATUS_NAME, "true"); - - bt_semaphore_release(lock_fd); - bt_semaphore_destroy(lock_fd); -#endif /* WIFI_BT_STATUS_SYNC */ - -done: - if (fd >= 0) - close(fd); - return 0; -} - -static inline void soc_init(int soc_type) -{ - switch (soc_type) - { - case BT_SOC_CHEROKEE: - case BT_SOC_ROME: - case BT_SOC_AR3K: - ALOGI("bt-vendor : Initializing UART transport layer"); - userial_vendor_init(); - break; - case BT_SOC_DEFAULT: - break; - default: - ALOGE("Unknown soc yype: %d", soc_type); - break; - } -} - -/* Copy BD Address as little-endian byte order */ -static inline void le2bd(unsigned char *src, unsigned char *dst) -{ - int i; - for (i = 0; i < 6; i++) - dst[i] = src[5-i]; -} - -static inline void print_bdaddr(unsigned char *addr) -{ - ALOGI("BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x", addr[0], addr[1], - addr[2], addr[3], addr[4], addr[5]); -} - -/***************************************************************************** -** -** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS -** -*****************************************************************************/ - -static int init(const bt_vendor_callbacks_t *cb, unsigned char *bdaddr) -{ - char prop[PROPERTY_VALUE_MAX] = {0}; - struct bt_qcom_struct *temp = NULL; - int ret = BT_STATUS_SUCCESS, i; - - ALOGI("++%s", __FUNCTION__); - - if (!cb || !bdaddr) { - ALOGE("Invalid input args cb %p bdaddr %p", cb, bdaddr); - ret = -BT_STATUS_INVAL; - goto out; - } - - temp = (struct bt_qcom_struct *) malloc(sizeof(*q)); - if (!temp) { - ALOGE("Failed to allocate memory. err %s(%d)", strerror(errno), errno); - ret = -BT_STATUS_NOMEM; - goto out; - } - memset(temp, 0, sizeof(*temp)); - - temp->rfkill_id = -1; - temp->enable_extldo = FALSE; - temp->cb = cb; - temp->ant_fd = -1; - temp->soc_type = get_bt_soc_type(); - soc_init(temp->soc_type); - - le2bd(bdaddr, temp->bdaddr); - print_bdaddr(temp->bdaddr); - snprintf(prop, sizeof(prop), "%02x:%02x:%02x:%02x:%02x:%02x", - temp->bdaddr[0], temp->bdaddr[1], temp->bdaddr[2], - temp->bdaddr[3], temp->bdaddr[4], temp->bdaddr[5]); - ret = property_set("wc_transport.stack_bdaddr", prop); - if (ret < 0) { - ALOGE("Failed to set wc_transport.stack_bdaddr prop, ret = %d", ret); - ret = -BT_STATUS_PROP_FAILURE; - goto out; - } - -/* TODO: Move these fields inside bt_qcom context */ -#ifdef WIFI_BT_STATUS_SYNC - isInit = 1; -#endif /* WIFI_BT_STATUS_SYNC */ - - /* Everything successful */ - q = temp; - return ret; - -out: - if (temp) - free(temp); - ALOGI("--%s ret %d", __FUNCTION__, ret); - return ret; -} - -#ifdef READ_BT_ADDR_FROM_PROP -static bool validate_tok(char* bdaddr_tok) { - int i = 0; - bool ret; - - if (strlen(bdaddr_tok) != 2) { - ret = FALSE; - ALOGE("Invalid token length"); - } else { - ret = TRUE; - for (i=0; i<2; i++) { - if ((bdaddr_tok[i] >= '0' && bdaddr_tok[i] <= '9') || - (bdaddr_tok[i] >= 'A' && bdaddr_tok[i] <= 'F') || - (bdaddr_tok[i] >= 'a' && bdaddr_tok[i] <= 'f')) { - ret = TRUE; - ALOGV("%s: tok %s @ %d is good", __func__, bdaddr_tok, i); - } else { - ret = FALSE; - ALOGE("invalid character in tok: %s at ind: %d", bdaddr_tok, i); - break; - } - } - } - return ret; -} -#endif /*READ_BT_ADDR_FROM_PROP*/ - -int connect_to_local_socket(char* name) { - socklen_t len; int sk = -1; - - ALOGE("%s: ACCEPT ", __func__); - sk = socket(AF_LOCAL, SOCK_STREAM, 0); - if (sk < 0) { - ALOGE("Socket creation failure"); - return -1; - } - - if(socket_local_client_connect(sk, name, - ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM) < 0) - { - ALOGE("failed to connect (%s)", strerror(errno)); - close(sk); - sk = -1; - } else { - ALOGE("%s: Connection succeeded\n", __func__); - } - return sk; -} - -bool is_soc_initialized() { - bool init = false; - char init_value[PROPERTY_VALUE_MAX]; - int ret; - - ALOGI("bt-vendor : is_soc_initialized"); - - ret = property_get(SOC_INIT_PROPERTY, init_value, NULL); - if (ret != 0) { - ALOGI("%s set to %s\n", SOC_INIT_PROPERTY, init_value); - if (!strncasecmp(init_value, "1", sizeof("1"))) { - init = true; - } - } - else { - ALOGE("%s: Failed to get %s", __FUNCTION__, SOC_INIT_PROPERTY); - } - - return init; -} - -/* flavor of op without locks */ -static int __op(bt_vendor_opcode_t opcode, void *param) -{ - int retval = BT_STATUS_SUCCESS; - int nCnt = 0; - int nState = -1; - bool is_ant_req = false; - bool is_fm_req = false; - char wipower_status[PROPERTY_VALUE_MAX]; - char emb_wp_mode[PROPERTY_VALUE_MAX]; - char bt_version[PROPERTY_VALUE_MAX]; - char lpm_config[PROPERTY_VALUE_MAX]; - bool ignore_boot_prop = TRUE; -#ifdef READ_BT_ADDR_FROM_PROP - int i = 0; - static char bd_addr[PROPERTY_VALUE_MAX]; - uint8_t local_bd_addr_from_prop[6]; - char* tok; -#endif - bool skip_init = true; - int opcode_init = opcode; - ALOGV("++%s opcode %d", __FUNCTION__, opcode); - - switch(opcode_init) - { -#ifdef FM_OVER_UART - case FM_VND_OP_POWER_CTRL: - { - is_fm_req = true; - if (is_soc_initialized()) { - // add any FM specific actions if needed in future - break; - } - } -#endif - case BT_VND_OP_POWER_CTRL: - { - if (!param) { - ALOGE("opcode = %d: param is null", opcode_init); - break; - } - nState = *(int *) param; - ALOGI("bt-vendor : BT_VND_OP_POWER_CTRL: %s", - (nState == BT_VND_PWR_ON)? "On" : "Off" ); - - switch(q->soc_type) - { - case BT_SOC_DEFAULT: - if (readTrpState()) - { - ALOGI("bt-vendor : resetting BT status"); - hw_config(BT_VND_PWR_OFF); - } - retval = hw_config(nState); - if(nState == BT_VND_PWR_ON - && retval == 0 - && is_hw_ready() == TRUE){ - retval = 0; - } - else { - retval = -1; - } - break; - case BT_SOC_ROME: - case BT_SOC_AR3K: - case BT_SOC_CHEROKEE: - if (q->soc_type == BT_SOC_ROME) - { - if (nState == BT_VND_PWR_ON) - { - /* Always power BT off before power on. */ - ALOGI("bt-vendor: always power off before power on"); - bt_powerup(BT_VND_PWR_OFF); - } - } - - /* BT Chipset Power Control through Device Tree Node */ - retval = bt_powerup(nState); - default: - break; - } - } - break; - - case BT_VND_OP_FW_CFG: { - /* call hciattach to initalize the stack */ - if (q->soc_type == BT_SOC_ROME) { - if (is_soc_initialized()) { - ALOGI("Bluetooth FW and transport layer are initialized"); - q->cb->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); - } else { - ALOGE("bt_vendor_cbacks is null or SoC not initialized"); - ALOGE("Error : hci, smd initialization Error"); - retval = -1; - } - } else { - ALOGI("Bluetooth FW and transport layer are initialized"); - q->cb->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); - } - } - break; - - case BT_VND_OP_SCO_CFG: - q->cb->scocfg_cb(BT_VND_OP_RESULT_SUCCESS); //dummy - break; -#ifdef ENABLE_ANT - case BT_VND_OP_ANT_USERIAL_OPEN: - ALOGI("bt-vendor : BT_VND_OP_ANT_USERIAL_OPEN"); - is_ant_req = true; - goto userial_open; -#endif -#ifdef FM_OVER_UART - case BT_VND_OP_FM_USERIAL_OPEN: - ALOGI("bt-vendor : BT_VND_OP_FM_USERIAL_OPEN"); - is_fm_req = true; - goto userial_open; -#endif -userial_open: - case BT_VND_OP_USERIAL_OPEN: - { - if (!param) { - ALOGE("opcode = %d: param is null", opcode_init); - break; - } - int (*fd_array)[] = (int (*)[]) param; - int idx, fd = -1, fd_filter = -1; - ALOGI("bt-vendor : BT_VND_OP_USERIAL_OPEN"); - switch(q->soc_type) - { - case BT_SOC_DEFAULT: - { - if(bt_hci_init_transport(q->fd) != -1){ - int (*fd_array)[] = (int (*) []) param; - - (*fd_array)[CH_CMD] = q->fd[0]; - (*fd_array)[CH_EVT] = q->fd[0]; - (*fd_array)[CH_ACL_OUT] = q->fd[1]; - (*fd_array)[CH_ACL_IN] = q->fd[1]; - } - else { - retval = -1; - break; - } - retval = 2; - } - break; - case BT_SOC_AR3K: - { - fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg); - if (fd != -1) { - for (idx=0; idx < CH_MAX; idx++) - (*fd_array)[idx] = fd; - retval = 1; - } - else { - retval = -1; - break; - } - - /* Vendor Specific Process should happened during userial_open process - After userial_open, rx read thread is running immediately, - so it will affect VS event read process. - */ - if(ath3k_init(fd,3000000,115200,NULL,&vnd_userial.termios)<0) - retval = -1; - } - break; - case BT_SOC_ROME: - { - wait_for_patch_download(is_ant_req); - property_get("ro.bluetooth.emb_wp_mode", emb_wp_mode, false); - if (!is_soc_initialized()) { - char* dlnd_inprog = is_ant_req ? "ant" : "bt"; - if (property_set("wc_transport.patch_dnld_inprog", dlnd_inprog) < 0) { - ALOGE("%s: Failed to set dnld_inprog %s", __FUNCTION__, dlnd_inprog); - } - - fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg); - if (fd < 0) { - ALOGE("userial_vendor_open returns err"); - retval = -1; - break; - } - - /* Clock on */ - userial_clock_operation(fd, USERIAL_OP_CLK_ON); - - if(strcmp(emb_wp_mode, "true") == 0) { - property_get("ro.bluetooth.wipower", wipower_status, false); - if(strcmp(wipower_status, "true") == 0) { - check_embedded_mode(fd); - } else { - ALOGI("Wipower not enabled"); - } - } - ALOGV("rome_soc_init is started"); - property_set("wc_transport.soc_initialized", "0"); -#ifdef READ_BT_ADDR_FROM_PROP - /*Give priority to read BD address from boot property*/ - ignore_boot_prop = FALSE; - if (property_get(BLUETOOTH_MAC_ADDR_BOOT_PROPERTY, bd_addr, NULL)) { - ALOGV("BD address read from Boot property: %s\n", bd_addr); - tok = strtok(bd_addr, ":"); - while (tok != NULL) { - ALOGV("bd add [%d]: %d ", i, strtol(tok, NULL, 16)); - if (i>=6) { - ALOGE("bd property of invalid length"); - ignore_boot_prop = TRUE; - break; - } - if (i == 6 && !ignore_boot_prop) { - ALOGV("Valid BD address read from prop"); - memcpy(q->bdaddr, local_bd_addr_from_prop, sizeof(vnd_local_bd_addr)); - ignore_boot_prop = FALSE; - } else { - ALOGE("There are not enough tokens in BD addr"); - ignore_boot_prop = TRUE; - break; - } - local_bd_addr_from_prop[5-i] = strtol(tok, NULL, 16); - tok = strtok(NULL, ":"); - i++; - } - if (i == 6 && !ignore_boot_prop) { - ALOGV("Valid BD address read from prop"); - memcpy(vnd_local_bd_addr, local_bd_addr_from_prop, sizeof(vnd_local_bd_addr)); - ignore_boot_prop = FALSE; - } else { - ALOGE("There are not enough tokens in BD addr"); - ignore_boot_prop = TRUE; - } - } - else { - ALOGE("BD address boot property not set"); - ignore_boot_prop = TRUE; - } -#endif //READ_BT_ADDR_FROM_PROP - /* Always read BD address from NV file */ - if(ignore_boot_prop && !bt_vendor_nv_read(1, q->bdaddr)) - { - /* Since the BD address is configured in boot time We should not be here */ - ALOGI("Failed to read BD address. Use the one from bluedroid stack/ftm"); - } - if(rome_soc_init(fd, (char*)q->bdaddr)<0) { - retval = -1; - } else { - ALOGV("rome_soc_init is completed"); - property_set("wc_transport.soc_initialized", "1"); - skip_init = false; - } - } - if (property_set("wc_transport.patch_dnld_inprog", "null") < 0) { - ALOGE("%s: Failed to set property", __FUNCTION__); - } - - property_set("wc_transport.clean_up","0"); - if (retval != -1) { - - retval = start_hci_filter(); - if (retval < 0) { - ALOGE("%s: WCNSS_FILTER wouldn't have started in time\n", __func__); - } else { -#ifdef ENABLE_ANT - if (is_ant_req) { - ALOGI("%s: connect to ant channel", __func__); - q->ant_fd = fd_filter = connect_to_local_socket("ant_sock"); - } - else -#endif - { - ALOGI("%s: connect to bt channel", __func__); - vnd_userial.fd = fd_filter = connect_to_local_socket("bt_sock"); - } - - if (fd_filter != -1) { - ALOGI("%s: received the socket fd: %d is_ant_req: %d is_fm_req: %d\n", - __func__, fd_filter, is_ant_req,is_fm_req); - if((strcmp(emb_wp_mode, "true") == 0) && !is_ant_req && !is_fm_req) { - if (chipset_ver >= ROME_VER_3_0) { - /* get rome supported feature request */ - ALOGE("%s: %x08 %0x", __FUNCTION__,chipset_ver, ROME_VER_3_0); - rome_get_addon_feature_list(fd_filter); - } - } - if (!skip_init) { - /*Skip if already sent*/ - enable_controller_log(fd_filter, (is_ant_req || is_fm_req) ); - skip_init = true; - } - for (idx=0; idx < CH_MAX; idx++) - (*fd_array)[idx] = fd_filter; - retval = 1; - } - else { - if (is_ant_req) - ALOGE("Unable to connect to ANT Server Socket!!!"); - else - ALOGE("Unable to connect to BT Server Socket!!!"); - retval = -1; - } - } - } else { - if (q->soc_type == BT_SOC_ROME) - ALOGE("Failed to initialize ROME Controller!!!"); - } - - if (fd >= 0) { - userial_clock_operation(fd, USERIAL_OP_CLK_OFF); - /*Close the UART port*/ - close(fd); - } - } - break; - case BT_SOC_CHEROKEE: - { - property_get("ro.bluetooth.emb_wp_mode", emb_wp_mode, false); - retval = start_hci_filter(); - if (retval < 0) { - ALOGE("WCNSS_FILTER wouldn't have started in time\n"); - - } else { -#ifdef ENABLE_ANT - if (is_ant_req) { - ALOGI("%s: connect to ant channel", __func__); - q->ant_fd = fd_filter = connect_to_local_socket("ant_sock"); - } - else -#endif -#ifdef FM_OVER_UART - if (is_fm_req && (q->soc_type >=BT_SOC_ROME && q->soc_type < BT_SOC_RESERVED)) { - ALOGI("%s: connect to fm channel", __func__); - q->fm_fd = fd_filter = connect_to_local_socket("fm_sock"); - } - else -#endif - { - ALOGI("%s: connect to bt channel", __func__); - vnd_userial.fd = fd_filter = connect_to_local_socket("bt_sock"); - - } - if (fd_filter != -1) { - ALOGV("%s: received the socket fd: %d \n", - __func__, fd_filter); - - for (idx=0; idx < CH_MAX; idx++) { - (*fd_array)[idx] = fd_filter; - } - retval = 1; - } - else { -#ifdef ENABLE_ANT - if (is_ant_req) - ALOGE("Unable to connect to ANT Server Socket!!!"); - else -#endif -#ifdef FM_OVER_UART - if (is_fm_req) - ALOGE("Unable to connect to FM Server Socket!!!"); - else -#endif - ALOGE("Unable to connect to BT Server Socket!!!"); - retval = -1; - } - } - } - break; - default: - ALOGE("Unknown soc_type: 0x%x", q->soc_type); - break; - } - } break; -#ifdef ENABLE_ANT - case BT_VND_OP_ANT_USERIAL_CLOSE: - { - ALOGI("bt-vendor : BT_VND_OP_ANT_USERIAL_CLOSE"); - property_set("wc_transport.clean_up","1"); - if (q->ant_fd != -1) { - ALOGE("closing ant_fd"); - close(q->ant_fd); - q->ant_fd = -1; - } - } - break; -#endif -#ifdef FM_OVER_UART - case BT_VND_OP_FM_USERIAL_CLOSE: - { - ALOGI("bt-vendor : BT_VND_OP_FM_USERIAL_CLOSE"); - property_set("wc_transport.clean_up","1"); - if (q->fm_fd != -1) { - ALOGE("closing fm_fd"); - close(q->fm_fd); - q->fm_fd = -1; - } - break; - } -#endif - case BT_VND_OP_USERIAL_CLOSE: - { - ALOGI("bt-vendor : BT_VND_OP_USERIAL_CLOSE soc_type: %d", q->soc_type); - switch(q->soc_type) - { - case BT_SOC_DEFAULT: - bt_hci_deinit_transport(q->fd); - break; - case BT_SOC_ROME: - case BT_SOC_AR3K: - case BT_SOC_CHEROKEE: - { - property_set("wc_transport.clean_up","1"); - userial_vendor_close(); - break; - } - default: - ALOGE("Unknown soc_type: 0x%x", q->soc_type); - break; - } - } - break; - - case BT_VND_OP_GET_LPM_IDLE_TIMEOUT: - { - if (!param) { - ALOGE("opcode = %d: param is null", opcode_init); - break; - } - uint32_t *timeout_ms = (uint32_t *) param; - *timeout_ms = 1000; - } - - break; - - case BT_VND_OP_LPM_SET_MODE: - if (q->soc_type == BT_SOC_AR3K) { - if (!param) { - ALOGE("opcode = %d: param is null", opcode_init); - break; - } - uint8_t *mode = (uint8_t *) param; - - if (*mode) { - lpm_set_ar3k(UPIO_LPM_MODE, UPIO_ASSERT, 0); - } - else { - lpm_set_ar3k(UPIO_LPM_MODE, UPIO_DEASSERT, 0); - } - q->cb->lpm_cb(BT_VND_OP_RESULT_SUCCESS); - } else { - int lpm_result = BT_VND_OP_RESULT_SUCCESS; - - property_get("persist.service.bdroid.lpmcfg", lpm_config, "all"); - ALOGI("%s: property_get: persist.service.bdroid.lpmcfg: %s", - __func__, lpm_config); - - if (!strcmp(lpm_config, "all")) { - // respond with success since we want to hold wake lock through LPM - lpm_result = BT_VND_OP_RESULT_SUCCESS; - } - else { - lpm_result = BT_VND_OP_RESULT_FAIL; - } - - q->cb->lpm_cb(lpm_result); - } - break; - - case BT_VND_OP_LPM_WAKE_SET_STATE: { - switch(q->soc_type) { - case BT_SOC_CHEROKEE: - case BT_SOC_ROME: { - if (!param) { - ALOGE("opcode = %d: param is null", opcode_init); - break; - } - uint8_t *state = (uint8_t *) param; - uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \ - BT_VND_LPM_WAKE_ASSERT : BT_VND_LPM_WAKE_DEASSERT; - - if (wake_assert == 0) - ALOGV("ASSERT: Waking up BT-Device"); - else if (wake_assert == 1) - ALOGV("DEASSERT: Allowing BT-Device to Sleep"); - -#ifdef QCOM_BT_SIBS_ENABLE - ALOGI("Invoking HCI H4 callback function"); - q->cb->lpm_set_state_cb(wake_assert); -#endif - } - break; - case BT_SOC_AR3K: { - if (!param) { - ALOGE("opcode = %d: param is null", opcode_init); - break; - } - uint8_t *state = (uint8_t *) param; - uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \ - UPIO_ASSERT : UPIO_DEASSERT; - lpm_set_ar3k(UPIO_BT_WAKE, wake_assert, 0); - } - case BT_SOC_DEFAULT: - break; - default: - ALOGE("Unknown soc_type: 0x%x", q->soc_type); - break; - } - } - break; - case BT_VND_OP_EPILOG: { -#if (HW_NEED_END_WITH_HCI_RESET == FALSE) - q->cb->epilog_cb(BT_VND_OP_RESULT_SUCCESS); -#else - switch(q->soc_type) - { - case BT_SOC_CHEROKEE: - case BT_SOC_ROME: - { - char value[PROPERTY_VALUE_MAX] = {'\0'}; - property_get("wc_transport.hci_filter_status", value, "0"); - if(is_soc_initialized()&& (strcmp(value,"1") == 0)) - { - __hw_epilog_process(); - } - else - { - q->cb->epilog_cb(BT_VND_OP_RESULT_SUCCESS); - } - } - break; - default: - __hw_epilog_process(); - break; - } -#endif - } - break; - case BT_VND_OP_GET_LINESPEED: - { - retval = -1; - if(!is_soc_initialized()) { - ALOGE("BT_VND_OP_GET_LINESPEED: error" - " - transport driver not initialized!"); - break; - } - - switch(q->soc_type) - { - case BT_SOC_CHEROKEE: - retval = 3200000; - break; - case BT_SOC_ROME: - retval = 3000000; - break; - default: - retval = userial_vendor_get_baud(); - break; - } - break; - } - } - -out: - ALOGV("--%s", __FUNCTION__); - return retval; -} - -static int op(bt_vendor_opcode_t opcode, void *param) -{ - int ret; - ALOGV("++%s", __FUNCTION__); -#ifdef BT_THREADLOCK_SAFE - pthread_mutex_lock(&q_lock); -#endif - if (!q) { - ALOGE("op called with NULL context"); - ret = -BT_STATUS_INVAL; - goto out; - } - ret = __op(opcode, param); -out: -#ifdef BT_THREADLOCK_SAFE - pthread_mutex_unlock(&q_lock); -#endif - ALOGV("--%s ret = 0x%x", __FUNCTION__, ret); - return ret; -} - -static void ssr_cleanup(int reason) -{ - int pwr_state = BT_VND_PWR_OFF; - int ret; - unsigned char trig_ssr = 0xEE; - - ALOGI("++%s", __FUNCTION__); - - pthread_mutex_lock(&q_lock); - if (!q) { - ALOGE("ssr_cleanup called with NULL context"); - goto out; - } - if (property_set("wc_transport.patch_dnld_inprog", "null") < 0) { - ALOGE("Failed to set property"); - } - - if (q->soc_type >= BT_SOC_ROME && q->soc_type < BT_SOC_RESERVED) { -#ifdef ENABLE_ANT - /*Indicate to filter by sending special byte */ - if (reason == CMD_TIMEOUT) { - trig_ssr = 0xEE; - ret = write (vnd_userial.fd, &trig_ssr, 1); - ALOGI("Trig_ssr is being sent to BT socket, ret %d err %s", - ret, strerror(errno)); - - if (is_debug_force_special_bytes()) { - /* - * Then we should send special byte to crash SOC in - * WCNSS_Filter, so we do not need to power off UART here. - */ - goto out; - } - } - - /* Close both ANT channel */ - __op(BT_VND_OP_ANT_USERIAL_CLOSE, NULL); -#endif - /* Close both BT channel */ - __op(BT_VND_OP_USERIAL_CLOSE, NULL); - -#ifdef FM_OVER_UART - __op(BT_VND_OP_FM_USERIAL_CLOSE, NULL); -#endif - /*CTRL OFF twice to make sure hw - * turns off*/ -#ifdef ENABLE_ANT - __op(BT_VND_OP_POWER_CTRL, &pwr_state); -#endif - } - /*Generally switching of chip should be enough*/ - __op(BT_VND_OP_POWER_CTRL, &pwr_state); - -out: - pthread_mutex_unlock(&q_lock); - ALOGI("--%s", __FUNCTION__); -} - -/** Closes the interface */ -static void cleanup(void) -{ - ALOGI("cleanup"); - - pthread_mutex_lock(&q_lock); - q->cb = NULL; - free(q); - q = NULL; - pthread_mutex_unlock(&q_lock); - -#ifdef WIFI_BT_STATUS_SYNC - isInit = 0; -#endif /* WIFI_BT_STATUS_SYNC */ -} - -/* Check for one of the cients ANT/BT patch download is already in -** progress if yes wait till complete -*/ -void wait_for_patch_download(bool is_ant_req) { - ALOGV("%s:", __FUNCTION__); - char inProgress[PROPERTY_VALUE_MAX] = {'\0'}; - while (1) { - property_get("wc_transport.patch_dnld_inprog", inProgress, "null"); - - if(is_ant_req && !(strcmp(inProgress,"bt"))) { - //ANT request, wait for BT to finish - usleep(50000); - } - else if(!is_ant_req && !(strcmp(inProgress,"ant"))) { - //BT request, wait for ANT to finish - usleep(50000); - } - else { - ALOGI("%s: patch download completed", __FUNCTION__); - break; - } - } -} - -bool is_download_progress () { - char inProgress[PROPERTY_VALUE_MAX] = {'\0'}; - bool retval = false; - - ALOGV("%s:", __FUNCTION__); - - if ((q->soc_type = get_bt_soc_type()) < 0) { - ALOGE("%s: Failed to detect BT SOC Type", __FUNCTION__); - return -1; - } - - switch(q->soc_type) - { - case BT_SOC_ROME: - ALOGI("%s: ROME case", __func__); - property_get("wc_transport.patch_dnld_inprog", inProgress, "null"); - if(strcmp(inProgress,"null") == 0) { - retval = false; - } else { - retval = true; - } - break; - case BT_SOC_CHEROKEE: - ALOGI("%s: CHEROKEE case", __func__); - break; - case BT_SOC_DEFAULT: - break; - default: - ALOGE("Unknown btSocType: 0x%x", q->soc_type); - break; - } - return retval; -} - -static bool is_debug_force_special_bytes() { - int ret = 0; - char value[PROPERTY_VALUE_MAX] = {'\0'}; - bool enabled = false; -#ifdef ENABLE_DBG_FLAGS - enabled = true; -#endif - - ret = property_get("wc_transport.force_special_byte", value, NULL); - - if (ret) { - enabled = (strcmp(value, "false") ==0) ? false : true; - ALOGV("%s: wc_transport.force_special_byte: %s, enabled: %d ", - __func__, value, enabled); - } - - return enabled; -} - -// Entry point of DLib -/* Remove 'ssr_cleanup' because it's not defined in 'bt_vendor_interface_t'. */ -const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = { - sizeof(bt_vendor_interface_t), - init, - op, - cleanup -}; diff --git a/sdm845/libbt-vendor/src/hardware.c b/sdm845/libbt-vendor/src/hardware.c deleted file mode 100644 index 90db801..0000000 --- a/sdm845/libbt-vendor/src/hardware.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * - * Filename: hardware.c - * - * Description: Contains controller-specific functions, like - * firmware patch download - * low power mode operations - * - ******************************************************************************/ - -#define LOG_TAG "bt_vendor" - -#include <utils/Log.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <signal.h> -#include <time.h> -#include <errno.h> -#include <fcntl.h> -#include <dirent.h> -#include <ctype.h> -#include <cutils/properties.h> -#include <stdlib.h> -#include "bt_hci_bdroid.h" -#include "bt_vendor_qcom.h" -#include <string.h> -#define MAX_CNT_RETRY 100 - -int hw_config(int nState) -{ - char *szState[] = {"true", "false"}; - char *szReqSt = NULL; - char szBtSocStatus[PROPERTY_VALUE_MAX] = {'\0', }; - - if(nState == BT_VND_PWR_OFF) - szReqSt = szState[1]; - else - szReqSt = szState[0]; - - if((property_get("bluetooth.status", szBtSocStatus, "") <= 0)) - { - if(nState == BT_VND_PWR_ON ) { - ALOGW("Hw_config: First Time BT on after boot.Starting hciattach daemon BTStatus=%s",szBtSocStatus); - if (property_set("bluetooth.hciattach", szReqSt) < 0) - { - ALOGE("Hw_config: Property Setting fail"); - return -1; - } - } - } else if( !(strncmp(szBtSocStatus, "on", strlen("on")))) { - //BTSOC is already on - ALOGW("Hw_config: nState = %d", nState); - } else { - ALOGW("Hw_config: trigerring hciattach"); - if (property_set("bluetooth.hciattach", szReqSt) < 0) - { - ALOGE("Hw_config: Property Setting fail"); - return -1; - } - } - - return 0; -} - -int readTrpState() -{ - char szBtStatus[PROPERTY_VALUE_MAX] = {0, }; - if(property_get("bluetooth.status", szBtStatus, "") < 0){ - ALOGE("Fail to get bluetooth status"); - return FALSE; - } - - if(!strncmp(szBtStatus, "on", strlen("on"))){ - ALOGI("bluetooth status is on"); - return TRUE; - } - return FALSE; -} - -int is_hw_ready() -{ - int i=0; - char szStatus[10] = {0,}; - - for(i=MAX_CNT_RETRY; i>0; i--){ - //TODO :: checking routine - if(readTrpState()==TRUE){ - break; - } - usleep(50*1000); - } - return (i==0)? FALSE:TRUE; -} - -#if (HW_NEED_END_WITH_HCI_RESET == TRUE) -/******************************************************************************* -** -** Function hw_epilog_cback -** -** Description Callback function for Command Complete Events from HCI -** commands sent in epilog process. -** -** Returns None -** -*******************************************************************************/ -void hw_epilog_cback(void *p_mem) -{ - HC_BT_HDR *p_evt_buf = (HC_BT_HDR *) p_mem; - char *p_name, *p_tmp; - uint8_t *p, status; - uint16_t opcode; - - status = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_RET_BYTE); - p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE; - STREAM_TO_UINT16(opcode,p); - - ALOGI("%s Opcode:0x%04X Status: %d", __FUNCTION__, opcode, status); - -#ifdef BT_THREADLOCK_SAFE - pthread_mutex_lock(&q_lock); -#endif - if (!q) { - ALOGE("hw_epilog_cback called with NULL context"); - goto out; - } - /* Must free the RX event buffer */ - q->cb->dealloc(p_evt_buf); - - /* Once epilog process is done, must call callback to notify caller */ - q->cb->epilog_cb(BT_VND_OP_RESULT_SUCCESS); -out: -#ifdef BT_THREADLOCK_SAFE - pthread_mutex_unlock(&q_lock); -#endif - return; -} - -/******************************************************************************* -** -** Function hw_epilog_process -** -** Description Sample implementation of epilog process. This process is -** called with q_lock held and q->cb is assumed to be valid. -** -** Returns None -** -*******************************************************************************/ -void __hw_epilog_process(void) -{ - HC_BT_HDR *p_buf = NULL; - uint8_t *p; - - ALOGI("hw_epilog_process"); - - /* Sending a HCI_RESET */ - /* Must allocate command buffer via HC's alloc API */ - p_buf = (HC_BT_HDR *) q->cb->alloc(BT_HC_HDR_SIZE + HCI_CMD_PREAMBLE_SIZE); - if (p_buf) - { - p_buf->event = MSG_STACK_TO_HC_HCI_CMD; - p_buf->offset = 0; - p_buf->layer_specific = 0; - p_buf->len = HCI_CMD_PREAMBLE_SIZE; - - p = (uint8_t *) (p_buf + 1); - UINT16_TO_STREAM(p, HCI_RESET); - *p = 0; /* parameter length */ - - /* Send command via HC's xmit_cb API */ - q->cb->xmit_cb(HCI_RESET, p_buf, hw_epilog_cback); - } - else - { - ALOGE("vendor lib epilog process aborted [no buffer]"); - q->cb->epilog_cb(BT_VND_OP_RESULT_FAIL); - } -} -#endif // (HW_NEED_END_WITH_HCI_RESET == TRUE) diff --git a/sdm845/libbt-vendor/src/hci_smd.c b/sdm845/libbt-vendor/src/hci_smd.c deleted file mode 100644 index 7e5b16d..0000000 --- a/sdm845/libbt-vendor/src/hci_smd.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * - * Filename: hci_smd.c - * - * Description: Contains vendor-specific userial functions - * - ******************************************************************************/ - -#define LOG_TAG "bt_vendor" - -#include <utils/Log.h> -#include <termios.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include "bt_vendor_qcom.h" -#include "hci_smd.h" -#include <string.h> -#include <cutils/properties.h> - -/***************************************************************************** -** Macros & Constants -*****************************************************************************/ -#define NUM_OF_DEVS 2 -static char *s_pszDevSmd[] = { - "/dev/smd3", - "/dev/smd2" -}; - -/****************************************************************************** -** Externs -******************************************************************************/ -extern int is_bt_ssr_hci; - - -/***************************************************************************** -** Functions -*****************************************************************************/ - -int bt_hci_init_transport_id (int chId ) -{ - struct termios term; - int fd = -1; - int retry = 0; - char ssrvalue[92]= {'\0'}; - - ssrvalue[0] = '0'; - if(chId >= 2 || chId <0) - return -1; - - fd = open(s_pszDevSmd[chId], (O_RDWR | O_NOCTTY)); - - while ((-1 == fd) && (retry < 7)) { - ALOGE("init_transport: Cannot open %s: %s\n. Retry after 2 seconds", - s_pszDevSmd[chId], strerror(errno)); - usleep(2000000); - fd = open(s_pszDevSmd[chId], (O_RDWR | O_NOCTTY)); - retry++; - } - - if (-1 == fd) - { - ALOGE("init_transport: Cannot open %s: %s\n", - s_pszDevSmd[chId], strerror(errno)); - return -1; - } - - /* Sleep (0.5sec) added giving time for the smd port to be successfully - opened internally. Currently successful return from open doesn't - ensure the smd port is successfully opened. - TODO: Following sleep to be removed once SMD port is successfully - opened immediately on return from the aforementioned open call */ - - property_get("bluetooth.isSSR", ssrvalue, ""); - - if(ssrvalue[0] == '1') - { - /*reset the SSR flag */ - if(chId == 1) - { - if(property_set("bluetooth.isSSR", "0") < 0) - { - ALOGE("SSR: hci_smd.c:SSR case : error in setting up property new\n "); - } - else - { - ALOGE("SSR: hci_smd.c:SSR case : Reset the SSr Flag new\n "); - } - } - ALOGE("hci_smd.c:IN SSR sleep for 500 msec New \n"); - usleep(500000); - } - - if (tcflush(fd, TCIOFLUSH) < 0) - { - ALOGE("init_uart: Cannot flush %s\n", s_pszDevSmd[chId]); - close(fd); - return -1; - } - - if (tcgetattr(fd, &term) < 0) - { - ALOGE("init_uart: Error while getting attributes\n"); - close(fd); - return -1; - } - - cfmakeraw(&term); - - /* JN: Do I need to make flow control configurable, since 4020 cannot - * disable it? - */ - term.c_cflag |= (CRTSCTS | CLOCAL); - - if (tcsetattr(fd, TCSANOW, &term) < 0) - { - ALOGE("init_uart: Error while getting attributes\n"); - close(fd); - return -1; - } - - ALOGI("Done intiailizing UART\n"); - return fd; -} - -int bt_hci_init_transport(int *pFd) -{ - int i = 0; - int fd; - for(i=0; i < NUM_OF_DEVS; i++){ - fd = bt_hci_init_transport_id(i); - if(fd < 0 ){ - return -1; - } - pFd[i] = fd; - } - return 0; -} - -int bt_hci_deinit_transport(int *pFd) -{ - close(pFd[0]); - close(pFd[1]); - return TRUE; -} diff --git a/sdm845/libbt-vendor/src/hci_uart.c b/sdm845/libbt-vendor/src/hci_uart.c deleted file mode 100644 index 2aeace8..0000000 --- a/sdm845/libbt-vendor/src/hci_uart.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * - * Filename: userial_vendor.c - * - * Description: Contains vendor-specific userial functions - * - ******************************************************************************/ - -#define LOG_TAG "bt_vendor" - -#include <utils/Log.h> -#include <termios.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include "bt_vendor_qcom.h" -#include "hci_uart.h" -#include <string.h> - -/****************************************************************************** -** Constants & Macros -******************************************************************************/ - -#ifndef VNDUSERIAL_DBG -#define VNDUSERIAL_DBG TRUE -#endif - -#if (VNDUSERIAL_DBG == TRUE) -#define VNDUSERIALDBG(param, ...) {ALOGI(param, ## __VA_ARGS__);} -#else -#define VNDUSERIALDBG(param, ...) {} -#endif - -#define RESERVED(p) if(p) ALOGI( "%s: reserved param", __FUNCTION__); - -/****************************************************************************** -** Global variables -******************************************************************************/ -vnd_userial_cb_t vnd_userial; - -/***************************************************************************** -** Functions -*****************************************************************************/ - -/******************************************************************************* -** -** Function userial_to_tcio_baud -** -** Description helper function converts USERIAL baud rates into TCIO -** conforming baud rates -** -** Returns TRUE/FALSE -** -*******************************************************************************/ -uint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud) -{ - if (cfg_baud == USERIAL_BAUD_115200) - *baud = B115200; - else if (cfg_baud == USERIAL_BAUD_4M) - *baud = B4000000; - else if (cfg_baud == USERIAL_BAUD_3M) - *baud = B3000000; - else if (cfg_baud == USERIAL_BAUD_2M) - *baud = B2000000; - else if (cfg_baud == USERIAL_BAUD_1M) - *baud = B1000000; - else if (cfg_baud == USERIAL_BAUD_921600) - *baud = B921600; - else if (cfg_baud == USERIAL_BAUD_460800) - *baud = B460800; - else if (cfg_baud == USERIAL_BAUD_230400) - *baud = B230400; - else if (cfg_baud == USERIAL_BAUD_57600) - *baud = B57600; - else if (cfg_baud == USERIAL_BAUD_19200) - *baud = B19200; - else if (cfg_baud == USERIAL_BAUD_9600) - *baud = B9600; - else if (cfg_baud == USERIAL_BAUD_1200) - *baud = B1200; - else if (cfg_baud == USERIAL_BAUD_600) - *baud = B600; - else - { - ALOGE( "userial vendor open: unsupported baud idx %i", cfg_baud); - *baud = B115200; - return FALSE; - } - - return TRUE; -} - -/******************************************************************************* -** -** Function userial_to_baud_tcio -** -** Description helper function converts TCIO baud rate into integer -** -** Returns uint32_t -** -*******************************************************************************/ -int userial_tcio_baud_to_int(uint32_t baud) -{ - int baud_rate =0; - - switch (baud) - { - case B600: - baud_rate = 600; - break; - case B1200: - baud_rate = 1200; - break; - case B9600: - baud_rate = 9600; - break; - case B19200: - baud_rate = 19200; - break; - case B57600: - baud_rate = 57600; - break; - case B115200: - baud_rate = 115200; - break; - case B230400: - baud_rate = 230400; - break; - case B460800: - baud_rate = 460800; - break; - case B921600: - baud_rate = 921600; - break; - case B1000000: - baud_rate = 1000000; - break; - case B2000000: - baud_rate = 2000000; - break; - case B3000000: - baud_rate = 3000000; - break; - case B4000000: - baud_rate = 4000000; - break; - default: - ALOGE( "%s: unsupported baud %d", __FUNCTION__, baud); - break; - } - - ALOGI( "%s: Current Baudrate = %d bps", __FUNCTION__, baud_rate); - return baud_rate; -} - - -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) -/******************************************************************************* -** -** Function userial_ioctl_init_bt_wake -** -** Description helper function to set the open state of the bt_wake if ioctl -** is used. it should not hurt in the rfkill case but it might -** be better to compile it out. -** -** Returns none -** -*******************************************************************************/ -void userial_ioctl_init_bt_wake(int fd) -{ - uint32_t bt_wake_state; - - /* assert BT_WAKE through ioctl */ - ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); - ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, &bt_wake_state); - VNDUSERIALDBG("userial_ioctl_init_bt_wake read back BT_WAKE state=%i", \ - bt_wake_state); -} -#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - - -/***************************************************************************** -** Userial Vendor API Functions -*****************************************************************************/ - -/******************************************************************************* -** -** Function userial_vendor_init -** -** Description Initialize userial vendor-specific control block -** -** Returns None -** -*******************************************************************************/ -void userial_vendor_init(void) -{ - vnd_userial.fd = -1; - snprintf(vnd_userial.port_name, VND_PORT_NAME_MAXLEN, "%s", BT_HS_UART_DEVICE); -} - -/******************************************************************************* -** -** Function userial_vendor_open -** -** Description Open the serial port with the given configuration -** -** Returns device fd -** -*******************************************************************************/ -int userial_vendor_open(tUSERIAL_CFG *p_cfg) -{ - uint32_t baud; - uint8_t data_bits; - uint16_t parity; - uint8_t stop_bits; - - vnd_userial.fd = -1; - - if (!userial_to_tcio_baud(p_cfg->baud, &baud)) - { - return -1; - } - - if(p_cfg->fmt & USERIAL_DATABITS_8) - data_bits = CS8; - else if(p_cfg->fmt & USERIAL_DATABITS_7) - data_bits = CS7; - else if(p_cfg->fmt & USERIAL_DATABITS_6) - data_bits = CS6; - else if(p_cfg->fmt & USERIAL_DATABITS_5) - data_bits = CS5; - else - { - ALOGE("userial vendor open: unsupported data bits"); - return -1; - } - - if(p_cfg->fmt & USERIAL_PARITY_NONE) - parity = 0; - else if(p_cfg->fmt & USERIAL_PARITY_EVEN) - parity = PARENB; - else if(p_cfg->fmt & USERIAL_PARITY_ODD) - parity = (PARENB | PARODD); - else - { - ALOGE("userial vendor open: unsupported parity bit mode"); - return -1; - } - - if(p_cfg->fmt & USERIAL_STOPBITS_1) - stop_bits = 0; - else if(p_cfg->fmt & USERIAL_STOPBITS_2) - stop_bits = CSTOPB; - else - { - ALOGE("userial vendor open: unsupported stop bits"); - return -1; - } - - ALOGI("userial vendor open: opening %s", vnd_userial.port_name); - - if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR|O_NOCTTY)) == -1) - { - ALOGE("userial vendor open: unable to open %s: %s(%d)", vnd_userial.port_name, - strerror(errno), errno); - return -1; - } - - tcflush(vnd_userial.fd, TCIOFLUSH); - - tcgetattr(vnd_userial.fd, &vnd_userial.termios); - cfmakeraw(&vnd_userial.termios); - - /* Set UART Control Modes */ - vnd_userial.termios.c_cflag |= CLOCAL; - vnd_userial.termios.c_cflag |= (CRTSCTS | stop_bits); - - tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); - - /* set input/output baudrate */ - cfsetospeed(&vnd_userial.termios, baud); - cfsetispeed(&vnd_userial.termios, baud); - tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); - - tcflush(vnd_userial.fd, TCIOFLUSH); - -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - userial_ioctl_init_bt_wake(vnd_userial.fd); -#endif - - ALOGI("device fd = %d open", vnd_userial.fd); - - return vnd_userial.fd; -} - -/******************************************************************************* -** -** Function userial_vendor_close -** -** Description Conduct vendor-specific close work -** -** Returns None -** -*******************************************************************************/ -void userial_vendor_close(void) -{ - int result; - - if (vnd_userial.fd == -1) - return; - -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - /* de-assert bt_wake BEFORE closing port */ - ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); -#endif - - ALOGI("device fd = %d close", vnd_userial.fd); - - if ((result = close(vnd_userial.fd)) < 0) - ALOGE( "close(fd:%d) FAILED result:%d", vnd_userial.fd, result); - - vnd_userial.fd = -1; -} - -/******************************************************************************* -** -** Function userial_vendor_set_baud -** -** Description Set new baud rate -** -** Returns None -** -*******************************************************************************/ -void userial_vendor_set_baud(uint8_t userial_baud) -{ - uint32_t tcio_baud; - - VNDUSERIALDBG("## userial_vendor_set_baud: %d", userial_baud); - - userial_to_tcio_baud(userial_baud, &tcio_baud); - - cfsetospeed(&vnd_userial.termios, tcio_baud); - cfsetispeed(&vnd_userial.termios, tcio_baud); - tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */ -// tcflush(vnd_userial.fd, TCIOFLUSH); -} - -/******************************************************************************* -** -** Function userial_vendor_get_baud -** -** Description Get current baud rate -** -** Returns int -** -*******************************************************************************/ -int userial_vendor_get_baud(void) -{ - if (vnd_userial.fd == -1) - { - ALOGE( "%s: uart port(%s) has not been opened", __FUNCTION__, BT_HS_UART_DEVICE ); - return -1; - } - - return userial_tcio_baud_to_int(cfgetispeed(&vnd_userial.termios)); -} - -/******************************************************************************* -** -** Function userial_vendor_ioctl -** -** Description ioctl inteface -** -** Returns None -** -*******************************************************************************/ -int userial_vendor_ioctl(userial_vendor_ioctl_op_t op, int *p_data) -{ - int err = -1; - - switch(op) - { -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - case USERIAL_OP_ASSERT_BT_WAKE: - VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##"); - err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); - break; - - case USERIAL_OP_DEASSERT_BT_WAKE: - VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##"); - err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); - break; - - case USERIAL_OP_GET_BT_WAKE_STATE: - err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data); - break; -#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - case USERIAL_OP_FLOW_ON: - ALOGI("## userial_vendor_ioctl: UART Flow On "); - *p_data |=TIOCM_RTS; - err = ioctl(vnd_userial.fd, TIOCMSET, p_data); - break; - - case USERIAL_OP_FLOW_OFF: - ALOGI("## userial_vendor_ioctl: UART Flow Off "); - ioctl(vnd_userial.fd, TIOCMGET, p_data); - *p_data &= ~TIOCM_RTS; - err = ioctl(vnd_userial.fd, TIOCMSET, p_data); - break; - - default: - break; - } - - return err; -} - -/******************************************************************************* -** -** Function userial_set_port -** -** Description Configure UART port name -** -** Returns 0 : Success -** Otherwise : Fail -** -*******************************************************************************/ -int userial_set_port(char *p_conf_name, char *p_conf_value, int param) -{ - RESERVED(p_conf_name); - RESERVED(param); - strlcpy(vnd_userial.port_name, p_conf_value, VND_PORT_NAME_MAXLEN); - - return 0; -} - -/******************************************************************************* -** -** Function read_hci_event -** -** Description Read HCI event during vendor initialization -** -** Returns int: size to read -** -*******************************************************************************/ -int read_hci_event(int fd, unsigned char* buf, int size) -{ - int remain, r; - int count = 0; - - if (size <= 0) { - ALOGE("Invalid size arguement!"); - return -1; - } - - ALOGI("%s: Wait for Command Compete Event from SOC", __FUNCTION__); - - /* The first byte identifies the packet type. For HCI event packets, it - * should be 0x04, so we read until we get to the 0x04. */ - while (1) { - r = read(fd, buf, 1); - if (r <= 0) - return -1; - if (buf[0] == 0x04) - break; - } - count++; - - /* The next two bytes are the event code and parameter total length. */ - while (count < 3) { - r = read(fd, buf + count, 3 - count); - if (r <= 0) - return -1; - count += r; - } - - /* Now we read the parameters. */ - if (buf[2] < (size - 3)) - remain = buf[2]; - else - remain = size - 3; - - while ((count - 3) < remain) { - r = read(fd, buf + count, remain - (count - 3)); - if (r <= 0) - return -1; - count += r; - } - return count; -} - -int userial_clock_operation(int fd, int cmd) -{ - int ret = 0; - - switch (cmd) - { - case USERIAL_OP_CLK_ON: - case USERIAL_OP_CLK_OFF: - ioctl(fd, cmd); - break; - case USERIAL_OP_CLK_STATE: - ret = ioctl(fd, cmd); - break; - } - - return ret; -} diff --git a/sdm845/libbt-vendor/src/hw_ar3k.c b/sdm845/libbt-vendor/src/hw_ar3k.c deleted file mode 100644 index cc54db8..0000000 --- a/sdm845/libbt-vendor/src/hw_ar3k.c +++ /dev/null @@ -1,1488 +0,0 @@ -/* - * - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You may - * obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. - * - */ - -/****************************************************************************** - * - * Filename: hw_ar3k.c - * - * Description: Contains controller-specific functions, like - * firmware patch download - * low power mode operations - * - ******************************************************************************/ -#ifdef __cplusplus -extern "C" { -#endif - -#define LOG_TAG "bt_vendor" - -#include <sys/socket.h> -#include <utils/Log.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <signal.h> -#include <time.h> -#include <errno.h> -#include <fcntl.h> -#include <dirent.h> -#include <ctype.h> -#include <cutils/properties.h> -#include <stdlib.h> -#include <termios.h> -#include <string.h> - -#include "bt_hci_bdroid.h" -#include "bt_vendor_qcom.h" -#include "hci_uart.h" -#include "hw_ar3k.h" - -/****************************************************************************** -** Variables -******************************************************************************/ -int cbstat = 0; -#define PATCH_LOC_STRING_LEN 8 -char ARbyte[3]; -char ARptr[MAX_PATCH_CMD + 1]; -int byte_cnt; -int patch_count = 0; -char patch_loc[PATCH_LOC_STRING_LEN + 1]; -int PSCounter=0; - -uint32_t dev_type = 0; -uint32_t rom_version = 0; -uint32_t build_version = 0; - -char patch_file[PATH_MAX]; -char ps_file[PATH_MAX]; -FILE *stream; -int tag_count=0; - -/* for friendly debugging outpout string */ -static char *lpm_mode[] = { - "UNKNOWN", - "disabled", - "enabled" -}; - -static char *lpm_state[] = { - "UNKNOWN", - "de-asserted", - "asserted" -}; - -static uint8_t upio_state[UPIO_MAX_COUNT]; -struct ps_cfg_entry ps_list[MAX_TAGS]; - -#define PS_EVENT_LEN 100 - -#ifdef __cplusplus -} -#endif - -#define RESERVED(p) if(p) ALOGI( "%s: reserved param", __FUNCTION__); - -/***************************************************************************** -** Functions -*****************************************************************************/ - -int is_bt_soc_ath() { - int ret = 0; - char bt_soc_type[PROPERTY_VALUE_MAX]; - ret = property_get("qcom.bluetooth.soc", bt_soc_type, NULL); - if (ret != 0) { - ALOGI("qcom.bluetooth.soc set to %s\n", bt_soc_type); - if (!strncasecmp(bt_soc_type, "ath3k", sizeof("ath3k"))) - return 1; - } else { - ALOGI("qcom.bluetooth.soc not set, so using default.\n"); - } - - return 0; -} - -/* - * Send HCI command and wait for command complete event. - * The event buffer has to be freed by the caller. - */ - -static int send_hci_cmd_sync(int dev, uint8_t *cmd, int len, uint8_t **event) -{ - int err; - uint8_t *hci_event; - uint8_t pkt_type = HCI_COMMAND_PKT; - - if (len == 0) - return len; - - if (write(dev, &pkt_type, 1) != 1) - return -EILSEQ; - if (write(dev, (unsigned char *)cmd, len) != len) - return -EILSEQ; - - hci_event = (uint8_t *)malloc(PS_EVENT_LEN); - if (!hci_event) - return -ENOMEM; - - err = read_hci_event(dev, (unsigned char *)hci_event, PS_EVENT_LEN); - if (err > 0) { - *event = hci_event; - } else { - free(hci_event); - return -EILSEQ; - } - - return len; -} - -static void convert_bdaddr(char *str_bdaddr, char *bdaddr) -{ - char bdbyte[3]; - char *str_byte = str_bdaddr; - int i, j; - int colon_present = 0; - - if (strstr(str_bdaddr, ":")) - colon_present = 1; - - bdbyte[2] = '\0'; - - /* Reverse the BDADDR to LSB first */ - for (i = 0, j = 5; i < 6; i++, j--) { - bdbyte[0] = str_byte[0]; - bdbyte[1] = str_byte[1]; - bdaddr[j] = strtol(bdbyte, NULL, 16); - - if (colon_present == 1) - str_byte += 3; - else - str_byte += 2; - } -} - -static int uart_speed(int s) -{ - switch (s) { - case 9600: - return B9600; - case 19200: - return B19200; - case 38400: - return B38400; - case 57600: - return B57600; - case 115200: - return B115200; - case 230400: - return B230400; - case 460800: - return B460800; - case 500000: - return B500000; - case 576000: - return B576000; - case 921600: - return B921600; - case 1000000: - return B1000000; - case 1152000: - return B1152000; - case 1500000: - return B1500000; - case 2000000: - return B2000000; -#ifdef B2500000 - case 2500000: - return B2500000; -#endif -#ifdef B3000000 - case 3000000: - return B3000000; -#endif -#ifdef B3500000 - case 3500000: - return B3500000; -#endif -#ifdef B4000000 - case 4000000: - return B4000000; -#endif - default: - return B57600; - } -} - -int set_speed(int fd, struct termios *ti, int speed) -{ - if (cfsetospeed(ti, uart_speed(speed)) < 0) - return -errno; - - if (cfsetispeed(ti, uart_speed(speed)) < 0) - return -errno; - - if (tcsetattr(fd, TCSANOW, ti) < 0) - return -errno; - - return 0; -} - -static void load_hci_ps_hdr(uint8_t *cmd, uint8_t ps_op, int len, int index) -{ - hci_command_hdr *ch = (void *)cmd; - - ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, - HCI_PS_CMD_OCF)); - ch->plen = len + PS_HDR_LEN; - cmd += HCI_COMMAND_HDR_SIZE; - - cmd[0] = ps_op; - cmd[1] = index; - cmd[2] = index >> 8; - cmd[3] = len; -} - - -static int read_ps_event(uint8_t *event, uint16_t ocf) -{ - hci_event_hdr *eh; - uint16_t opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, ocf)); - - event++; - - eh = (void *)event; - event += HCI_EVENT_HDR_SIZE; - - if (eh->evt == EVT_CMD_COMPLETE) { - evt_cmd_complete *cc = (void *)event; - - event += EVT_CMD_COMPLETE_SIZE; - - if (cc->opcode == opcode && event[0] == HCI_EV_SUCCESS) - return 0; - else - return -EILSEQ; - } - - return -EILSEQ; -} - -#define PS_WRITE 1 -#define PS_RESET 2 -#define WRITE_PATCH 8 -#define ENABLE_PATCH 11 - -#define HCI_PS_CMD_HDR_LEN 7 - -static int write_cmd(int fd, uint8_t *buffer, int len) -{ - uint8_t *event; - int err; - - err = send_hci_cmd_sync(fd, buffer, len, &event); - if (err < 0) - return err; - - err = read_ps_event(event, HCI_PS_CMD_OCF); - - free(event); - - return err; -} - -#define PS_RESET_PARAM_LEN 6 -#define PS_RESET_CMD_LEN (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN) - -#define PS_ID_MASK 0xFF - -/* Sends PS commands using vendor specficic HCI commands */ -static int write_ps_cmd(int fd, uint8_t opcode, uint32_t ps_param) -{ - uint8_t cmd[HCI_MAX_CMD_SIZE]; - uint32_t i; - - switch (opcode) { - case ENABLE_PATCH: - load_hci_ps_hdr(cmd, opcode, 0, 0x00); - - if (write_cmd(fd, cmd, HCI_PS_CMD_HDR_LEN) < 0) - return -EILSEQ; - break; - - case PS_RESET: - load_hci_ps_hdr(cmd, opcode, PS_RESET_PARAM_LEN, 0x00); - - cmd[7] = 0x00; - cmd[PS_RESET_CMD_LEN - 2] = ps_param & PS_ID_MASK; - cmd[PS_RESET_CMD_LEN - 1] = (ps_param >> 8) & PS_ID_MASK; - - if (write_cmd(fd, cmd, PS_RESET_CMD_LEN) < 0) - return -EILSEQ; - break; - - case PS_WRITE: - for (i = 0; i < ps_param; i++) { - load_hci_ps_hdr(cmd, opcode, ps_list[i].len, - ps_list[i].id); - - memcpy(&cmd[HCI_PS_CMD_HDR_LEN], ps_list[i].data, - ps_list[i].len); - - if (write_cmd(fd, cmd, ps_list[i].len + - HCI_PS_CMD_HDR_LEN) < 0) - return -EILSEQ; - } - break; - } - - return 0; -} - -#define PS_ASIC_FILE "PS_ASIC.pst" -#define PS_FPGA_FILE "PS_FPGA.pst" -#define MAXPATHLEN 4096 -static void get_ps_file_name(uint32_t devtype, uint32_t rom_version,char *path) -{ - char *filename; - - if (devtype == 0xdeadc0de) - filename = PS_ASIC_FILE; - else - filename = PS_FPGA_FILE; - - snprintf(path, MAXPATHLEN, "%s%x/%s", FW_PATH, rom_version, filename); -} - -#define PATCH_FILE "RamPatch.txt" -#define FPGA_ROM_VERSION 0x99999999 -#define ROM_DEV_TYPE 0xdeadc0de - -static void get_patch_file_name(uint32_t dev_type, uint32_t rom_version, - uint32_t build_version, char *path) -{ - if (rom_version == FPGA_ROM_VERSION && dev_type != ROM_DEV_TYPE - &&dev_type != 0 && build_version == 1) - path[0] = '\0'; - else - snprintf(path, MAXPATHLEN, "%s%x/%s", FW_PATH, rom_version, PATCH_FILE); -} - -static int set_cntrlr_baud(int fd, int speed) -{ - int baud; - struct timespec tm = { 0, 500000}; - unsigned char cmd[MAX_CMD_LEN], rsp[HCI_MAX_EVENT_SIZE]; - unsigned char *ptr = cmd + 1; - hci_command_hdr *ch = (void *)ptr; - - cmd[0] = HCI_COMMAND_PKT; - - /* set controller baud rate to user specified value */ - ptr = cmd + 1; - ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, - HCI_CHG_BAUD_CMD_OCF)); - ch->plen = 2; - ptr += HCI_COMMAND_HDR_SIZE; - - baud = speed/100; - ptr[0] = (char)baud; - ptr[1] = (char)(baud >> 8); - - if (write(fd, cmd, WRITE_BAUD_CMD_LEN) != WRITE_BAUD_CMD_LEN) { - ALOGI("Failed to write change baud rate command"); - return -ETIMEDOUT; - } - - nanosleep(&tm, NULL); - - if (read_hci_event(fd, rsp, sizeof(rsp)) < 0) - return -ETIMEDOUT; - - return 0; -} - -#define PS_UNDEF 0 -#define PS_ID 1 -#define PS_LEN 2 -#define PS_DATA 3 - -#define PS_MAX_LEN 500 -#define LINE_SIZE_MAX (PS_MAX_LEN * 2) -#define ENTRY_PER_LINE 16 - -#define __check_comment(buf) (((buf)[0] == '/') && ((buf)[1] == '/')) -#define __skip_space(str) while (*(str) == ' ') ((str)++) - - -#define __is_delim(ch) ((ch) == ':') -#define MAX_PREAMBLE_LEN 4 - -/* Parse PS entry preamble of format [X:X] for main type and subtype */ -static int get_ps_type(char *ptr, int index, char *type, char *sub_type) -{ - int i; - int delim = FALSE; - - if (index > MAX_PREAMBLE_LEN) - return -EILSEQ; - - for (i = 1; i < index; i++) { - if (__is_delim(ptr[i])) { - delim = TRUE; - continue; - } - - if (isalpha(ptr[i])) { - if (delim == FALSE) - (*type) = toupper(ptr[i]); - else - (*sub_type) = toupper(ptr[i]); - } - } - - return 0; -} - -#define ARRAY 'A' -#define STRING 'S' -#define DECIMAL 'D' -#define BINARY 'B' - -#define PS_HEX 0 -#define PS_DEC 1 - -static int get_input_format(char *buf, struct ps_entry_type *format) -{ - char *ptr = NULL; - char type = '\0'; - char sub_type = '\0'; - - format->type = PS_HEX; - format->array = TRUE; - - if (strstr(buf, "[") != buf) - return 0; - - ptr = strstr(buf, "]"); - if (!ptr) - return -EILSEQ; - - if (get_ps_type(buf, ptr - buf, &type, &sub_type) < 0) - return -EILSEQ; - - /* Check is data type is of array */ - if (type == ARRAY || sub_type == ARRAY) - format->array = TRUE; - - if (type == STRING || sub_type == STRING) - format->array = FALSE; - - if (type == DECIMAL || type == BINARY) - format->type = PS_DEC; - else - format->type = PS_HEX; - - return 0; -} - - - -#define UNDEFINED 0xFFFF - -static unsigned int read_data_in_section(char *buf, struct ps_entry_type type) -{ - char *ptr = buf; - - if (!buf) - return UNDEFINED; - - if (buf == strstr(buf, "[")) { - ptr = strstr(buf, "]"); - if (!ptr) - return UNDEFINED; - - ptr++; - } - - if (type.type == PS_HEX && type.array != TRUE) - return strtol(ptr, NULL, 16); - - return UNDEFINED; -} - - -/* Read PS entries as string, convert and add to Hex array */ -static void update_tag_data(struct ps_cfg_entry *tag, - struct tag_info *info, const char *ptr) -{ - char buf[3]; - - buf[2] = '\0'; - - strlcpy(buf, &ptr[info->char_cnt],sizeof(buf)); - tag->data[info->byte_count] = strtol(buf, NULL, 16); - info->char_cnt += 3; - info->byte_count++; - - strlcpy(buf, &ptr[info->char_cnt], sizeof(buf)); - tag->data[info->byte_count] = strtol(buf, NULL, 16); - info->char_cnt += 3; - info->byte_count++; -} - -static inline int update_char_count(const char *buf) -{ - char *end_ptr; - - if (strstr(buf, "[") == buf) { - end_ptr = strstr(buf, "]"); - if (!end_ptr) - return 0; - else - return(end_ptr - buf) + 1; - } - - return 0; -} - -#define PS_HEX 0 -#define PS_DEC 1 - -static int ath_parse_ps(FILE *stream) -{ - char buf[LINE_SIZE_MAX + 1]; - char *ptr; - uint8_t tag_cnt = 0; - int16_t byte_count = 0; - struct ps_entry_type format; - struct tag_info status = { 0, 0, 0, 0}; - - do { - int read_count; - struct ps_cfg_entry *tag; - - ptr = fgets(buf, LINE_SIZE_MAX, stream); - if (!ptr) - break; - - __skip_space(ptr); - if (__check_comment(ptr)) - continue; - - /* Lines with a '#' will be followed by new PS entry */ - if (ptr == strstr(ptr, "#")) { - if (status.section != PS_UNDEF) { - return -EILSEQ; - } else { - status.section = PS_ID; - continue; - } - } - - tag = &ps_list[tag_cnt]; - - switch (status.section) { - case PS_ID: - if (get_input_format(ptr, &format) < 0) - return -EILSEQ; - - tag->id = read_data_in_section(ptr, format); - status.section = PS_LEN; - break; - - case PS_LEN: - if (get_input_format(ptr, &format) < 0) - return -EILSEQ; - - byte_count = read_data_in_section(ptr, format); - if (byte_count > PS_MAX_LEN) - return -EILSEQ; - - tag->len = byte_count; - tag->data = (uint8_t *)malloc(byte_count); - - status.section = PS_DATA; - status.line_count = 0; - break; - - case PS_DATA: - if (status.line_count == 0) - if (get_input_format(ptr, &format) < 0) - return -EILSEQ; - - __skip_space(ptr); - - status.char_cnt = update_char_count(ptr); - - read_count = (byte_count > ENTRY_PER_LINE) ? - ENTRY_PER_LINE : byte_count; - - if (format.type == PS_HEX && format.array == TRUE) { - while (read_count > 0) { - update_tag_data(tag, &status, ptr); - read_count -= 2; - } - - if (byte_count > ENTRY_PER_LINE) - byte_count -= ENTRY_PER_LINE; - else - byte_count = 0; - } - - status.line_count++; - - if (byte_count == 0) - memset(&status, 0x00, sizeof(struct tag_info)); - - if (status.section == PS_UNDEF) - tag_cnt++; - - if (tag_cnt == MAX_TAGS) - return -EILSEQ; - break; - } - } while (ptr); - - return tag_cnt; -} - -#define PS_RAM_SIZE 2048 - -static int ps_config_download(int fd, int tag_count) -{ - if (write_ps_cmd(fd, PS_RESET, PS_RAM_SIZE) < 0) - return -1; - - if (tag_count > 0) - if (write_ps_cmd(fd, PS_WRITE, tag_count) < 0) - return -1; - return 0; -} - -static int write_bdaddr(int pConfig, char *bdaddr) -{ - uint8_t *event; - int err; - uint8_t cmd[13]; - uint8_t *ptr = cmd; - hci_command_hdr *ch = (void *)cmd; - - memset(cmd, 0, sizeof(cmd)); - - ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, - HCI_PS_CMD_OCF)); - ch->plen = 10; - ptr += HCI_COMMAND_HDR_SIZE; - - ptr[0] = 0x01; - ptr[1] = 0x01; - ptr[2] = 0x00; - ptr[3] = 0x06; - - convert_bdaddr(bdaddr, (char *)&ptr[4]); - - err = send_hci_cmd_sync(pConfig, cmd, sizeof(cmd), &event); - if (err < 0) - return err; - - err = read_ps_event(event, HCI_PS_CMD_OCF); - - free(event); - - return err; -} - -static void write_bdaddr_from_file(int rom_version, int fd) -{ - FILE *stream; - char bdaddr[PATH_MAX]; - char bdaddr_file[PATH_MAX]; - - snprintf(bdaddr_file, MAXPATHLEN, "%s%x/%s", - FW_PATH, rom_version, BDADDR_FILE); - - stream = fopen(bdaddr_file, "r"); - if (!stream) - return; - - if (fgets(bdaddr, PATH_MAX - 1, stream)) - write_bdaddr(fd, bdaddr); - - fclose(stream); -} - -#define HCI_EVT_CMD_CMPL_OPCODE 3 -#define HCI_EVT_CMD_CMPL_STATUS_RET_BYTE 5 - -void baswap(bdaddr_t *dst, const bdaddr_t *src) -{ - register unsigned char *d = (unsigned char *) dst; - register const unsigned char *s = (const unsigned char *) src; - register int i; - for (i = 0; i < 6; i++) - d[i] = s[5-i]; -} - - -int str2ba(const char *str, bdaddr_t *ba) -{ - uint8_t b[6]; - const char *ptr = str; - int i; - - for (i = 0; i < 6; i++) { - b[i] = (uint8_t) strtol(ptr, NULL, 16); - ptr = strchr(ptr, ':'); - if (i != 5 && !ptr) - ptr = ":00:00:00:00:00"; - ptr++; - } - baswap(ba, (bdaddr_t *) b); - return 0; -} - -#define DEV_REGISTER 0x4FFC -#define GET_DEV_TYPE_OCF 0x05 - -static int get_device_type(int dev, uint32_t *code) -{ - uint8_t cmd[8] = {0}; - uint8_t *event; - uint32_t reg; - int err; - uint8_t *ptr = cmd; - hci_command_hdr *ch = (void *)cmd; - - ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, - GET_DEV_TYPE_OCF)); - ch->plen = 5; - ptr += HCI_COMMAND_HDR_SIZE; - - ptr[0] = (uint8_t)DEV_REGISTER; - ptr[1] = (uint8_t)DEV_REGISTER >> 8; - ptr[2] = (uint8_t)DEV_REGISTER >> 16; - ptr[3] = (uint8_t)DEV_REGISTER >> 24; - ptr[4] = 0x04; - - err = send_hci_cmd_sync(dev, cmd, sizeof(cmd), &event); - if (err < 0) - return err; - - err = read_ps_event(event, GET_DEV_TYPE_OCF); - if (err < 0) - goto cleanup; - - reg = event[10]; - reg = (reg << 8) | event[9]; - reg = (reg << 8) | event[8]; - reg = (reg << 8) | event[7]; - *code = reg; - -cleanup: - free(event); - - return err; -} - -#define GET_VERSION_OCF 0x1E - -static int read_ath3k_version(int pConfig, uint32_t *rom_version, - uint32_t *build_version) -{ - uint8_t cmd[3] = {0}; - uint8_t *event; - int err; - int status; - hci_command_hdr *ch = (void *)cmd; - - ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, - GET_VERSION_OCF)); - ch->plen = 0; - - err = send_hci_cmd_sync(pConfig, cmd, sizeof(cmd), &event); - if (err < 0) - return err; - - err = read_ps_event(event, GET_VERSION_OCF); - if (err < 0) - goto cleanup; - - status = event[10]; - status = (status << 8) | event[9]; - status = (status << 8) | event[8]; - status = (status << 8) | event[7]; - *rom_version = status; - - status = event[14]; - status = (status << 8) | event[13]; - status = (status << 8) | event[12]; - status = (status << 8) | event[11]; - *build_version = status; - -cleanup: - free(event); - - return err; -} - -#define VERIFY_CRC 9 -#define PS_REGION 1 -#define PATCH_REGION 2 - -static int get_ath3k_crc(int dev) -{ - uint8_t cmd[7] = {0}; - uint8_t *event; - int err; - - load_hci_ps_hdr(cmd, VERIFY_CRC, 0, PS_REGION | PATCH_REGION); - - err = send_hci_cmd_sync(dev, cmd, sizeof(cmd), &event); - if (err < 0) - return err; - /* Send error code if CRC check patched */ - if (read_ps_event(event, HCI_PS_CMD_OCF) >= 0) - err = -EILSEQ; - - free(event); - - return err; -} - -#define SET_PATCH_RAM_ID 0x0D -#define SET_PATCH_RAM_CMD_SIZE 11 -#define ADDRESS_LEN 4 -static int set_patch_ram(int dev, char *patch_loc, int len) -{ - int err; - uint8_t cmd[20] = {0}; - int i, j; - char loc_byte[3]; - uint8_t *event; - uint8_t *loc_ptr = &cmd[7]; - - RESERVED(len); - - if (!patch_loc) - return -1; - - loc_byte[2] = '\0'; - - load_hci_ps_hdr(cmd, SET_PATCH_RAM_ID, ADDRESS_LEN, 0); - - for (i = 0, j = 3; i < 4; i++, j--) { - loc_byte[0] = patch_loc[0]; - loc_byte[1] = patch_loc[1]; - loc_ptr[j] = strtol(loc_byte, NULL, 16); - patch_loc += 2; - } - - err = send_hci_cmd_sync(dev, cmd, SET_PATCH_RAM_CMD_SIZE, &event); - if (err < 0) - return err; - - err = read_ps_event(event, HCI_PS_CMD_OCF); - - free(event); - - return err; -} - -#define PATCH_LOC_KEY "DA:" -#define PATCH_LOC_STRING_LEN 8 -static int ps_patch_download(int fd, FILE *stream) -{ - char byte[3]; - char ptr[MAX_PATCH_CMD + 1]; - int byte_cnt; - int patch_count = 0; - char patch_loc[PATCH_LOC_STRING_LEN + 1]; - - byte[2] = '\0'; - - while (fgets(ptr, MAX_PATCH_CMD, stream)) { - if (strlen(ptr) <= 1) - continue; - else if (strstr(ptr, PATCH_LOC_KEY) == ptr) { - strlcpy(patch_loc, &ptr[sizeof(PATCH_LOC_KEY) - 1], - PATCH_LOC_STRING_LEN); - if (set_patch_ram(fd, patch_loc, sizeof(patch_loc)) < 0) - return -1; - } else if (isxdigit(ptr[0])) - break; - else - return -1; - } - - byte_cnt = strtol(ptr, NULL, 16); - - while (byte_cnt > 0) { - int i; - uint8_t cmd[HCI_MAX_CMD_SIZE] = {0}; - struct patch_entry patch; - - if (byte_cnt > MAX_PATCH_CMD) - patch.len = MAX_PATCH_CMD; - else - patch.len = byte_cnt; - - for (i = 0; i < patch.len; i++) { - if (!fgets(byte, 3, stream)) - return -1; - - patch.data[i] = strtoul(byte, NULL, 16); - } - - load_hci_ps_hdr(cmd, WRITE_PATCH, patch.len, patch_count); - memcpy(&cmd[HCI_PS_CMD_HDR_LEN], patch.data, patch.len); - - if (write_cmd(fd, cmd, patch.len + HCI_PS_CMD_HDR_LEN) < 0) - return -1; - - patch_count++; - byte_cnt = byte_cnt - MAX_PATCH_CMD; - } - - if (write_ps_cmd(fd, ENABLE_PATCH, 0) < 0) - return -1; - - return patch_count; -} - -static int ath_ps_download(int fd) -{ - int err = 0; - int tag_count; - int patch_count = 0; - uint32_t rom_version = 0; - uint32_t build_version = 0; - uint32_t dev_type = 0; - char patch_file[PATH_MAX]; - char ps_file[PATH_MAX]; - FILE *stream; - - /* - * Verfiy firmware version. depending on it select the PS - * config file to download. - */ - if (get_device_type(fd, &dev_type) < 0) { - err = -EILSEQ; - goto download_cmplete; - } - - if (read_ath3k_version(fd, &rom_version, &build_version) < 0) { - err = -EILSEQ; - goto download_cmplete; - } - - /* Do not download configuration if CRC passes */ - if (get_ath3k_crc(fd) < 0) { - err = 0; - goto download_cmplete; - } - - get_ps_file_name(dev_type, rom_version, ps_file); - get_patch_file_name(dev_type, rom_version, build_version, patch_file); - - stream = fopen(ps_file, "r"); - if (!stream) { - ALOGI("firmware file open error:%s, ver:%x\n",ps_file, rom_version); - if (rom_version == 0x1020201) - err = 0; - else - err = -EILSEQ; - goto download_cmplete; - } - tag_count = ath_parse_ps(stream); - - fclose(stream); - - if (tag_count < 0) { - err = -EILSEQ; - goto download_cmplete; - } - - /* - * It is not necessary that Patch file be available, - * continue with PS Operations if patch file is not available. - */ - if (patch_file[0] == '\0') - err = 0; - - stream = fopen(patch_file, "r"); - if (!stream) - err = 0; - else { - patch_count = ps_patch_download(fd, stream); - fclose(stream); - - if (patch_count < 0) { - err = -EILSEQ; - goto download_cmplete; - } - } - - err = ps_config_download(fd, tag_count); - -download_cmplete: - if (!err) - write_bdaddr_from_file(rom_version, fd); - - return err; -} - -int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti) -{ - ALOGI(" %s ", __FUNCTION__); - - int r; - int err = 0; - struct timespec tm = { 0, 500000}; - unsigned char cmd[MAX_CMD_LEN] = {0}; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - unsigned char *ptr = cmd + 1; - hci_command_hdr *ch = (void *)ptr; - int flags = 0; - - if (ioctl(fd, TIOCMGET, &flags) < 0) { - ALOGI("TIOCMGET failed in init\n"); - return -1; - } - flags |= TIOCM_RTS; - if (ioctl(fd, TIOCMSET, &flags) < 0) { - ALOGI("TIOCMSET failed in init: HW Flow-on error\n"); - return -1; - } - - /* set both controller and host baud rate to maximum possible value */ - err = set_cntrlr_baud(fd, speed); - ALOGI("set_cntrlr_baud : ret:%d \n", err); - if (err < 0) - return err; - - err = set_speed(fd, ti, speed); - if (err < 0) { - ALOGI("Can't set required baud rate"); - return err; - } - - /* Download PS and patch */ - r = ath_ps_download(fd); - if (r < 0) { - ALOGI("Failed to Download configuration"); - err = -ETIMEDOUT; - goto failed; - } - - ALOGI("ath_ps_download is done\n"); - - cmd[0] = HCI_COMMAND_PKT; - /* Write BDADDR */ - if (bdaddr) { - ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, - HCI_PS_CMD_OCF)); - ch->plen = 10; - ptr += HCI_COMMAND_HDR_SIZE; - - ptr[0] = 0x01; - ptr[1] = 0x01; - ptr[2] = 0x00; - ptr[3] = 0x06; - str2ba(bdaddr, (bdaddr_t *)(ptr + 4)); - - if (write(fd, cmd, WRITE_BDADDR_CMD_LEN) != - WRITE_BDADDR_CMD_LEN) { - ALOGI("Failed to write BD_ADDR command\n"); - err = -ETIMEDOUT; - goto failed; - } - - if (read_hci_event(fd, rsp, sizeof(rsp)) < 0) { - ALOGI("Failed to set BD_ADDR\n"); - err = -ETIMEDOUT; - goto failed; - } - } - - /* Send HCI Reset */ - cmd[1] = 0x03; - cmd[2] = 0x0C; - cmd[3] = 0x00; - - r = write(fd, cmd, 4); - if (r != 4) { - err = -ETIMEDOUT; - goto failed; - } - - nanosleep(&tm, NULL); - if (read_hci_event(fd, rsp, sizeof(rsp)) < 0) { - err = -ETIMEDOUT; - goto failed; - } - - ALOGI("HCI Reset is done\n"); - err = set_cntrlr_baud(fd, speed); - if (err < 0) - ALOGI("set_cntrlr_baud0:%d,%d\n", speed, err); - -failed: - if (err < 0) { - set_cntrlr_baud(fd, init_speed); - set_speed(fd, ti, init_speed); - } - - return err; - -} -#define BTPROTO_HCI 1 - -/* Open HCI device. - * Returns device descriptor (dd). */ -int hci_open_dev(int dev_id) -{ - struct sockaddr_hci a; - int dd, err; - - /* Create HCI socket */ - dd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - if (dd < 0) - return dd; - - /* Bind socket to the HCI device */ - memset(&a, 0, sizeof(a)); - a.hci_family = AF_BLUETOOTH; - a.hci_dev = dev_id; - if (bind(dd, (struct sockaddr *) &a, sizeof(a)) < 0) - goto failed; - - return dd; - -failed: - err = errno; - close(dd); - errno = err; - - return -1; -} - -int hci_close_dev(int dd) -{ - return close(dd); -} - -/* HCI functions that require open device - * dd - Device descriptor returned by hci_open_dev. */ - -int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param) -{ - uint8_t type = HCI_COMMAND_PKT; - hci_command_hdr hc; - struct iovec iv[3]; - int ivn; - - hc.opcode = htobs(cmd_opcode_pack(ogf, ocf)); - hc.plen= plen; - - iv[0].iov_base = &type; - iv[0].iov_len = 1; - iv[1].iov_base = &hc; - iv[1].iov_len = HCI_COMMAND_HDR_SIZE; - ivn = 2; - - if (plen) { - iv[2].iov_base = param; - iv[2].iov_len = plen; - ivn = 3; - } - - while (writev(dd, iv, ivn) < 0) { - if (errno == EAGAIN || errno == EINTR) - continue; - return -1; - } - return 0; -} - -#define HCI_SLEEP_CMD_OCF 0x04 -#define TIOCSETD 0x5423 -#define HCIUARTSETFLAGS _IOW('U', 204, int) -#define HCIUARTSETPROTO _IOW('U', 200, int) -#define HCIUARTGETDEVICE _IOW('U', 202, int) -/* - * Atheros AR300x specific initialization post callback - */ -int ath3k_post(int fd, int pm) -{ - int dev_id, dd; - struct timespec tm = { 0, 50000}; - - sleep(1); - - dev_id = ioctl(fd, HCIUARTGETDEVICE, 0); - if (dev_id < 0) { - perror("cannot get device id"); - return dev_id; - } - - dd = hci_open_dev(dev_id); - if (dd < 0) { - perror("HCI device open failed"); - return dd; - } - - if (ioctl(dd, HCIDEVUP, dev_id) < 0 && errno != EALREADY) { - perror("hci down:Power management Disabled"); - hci_close_dev(dd); - return -1; - } - - /* send vendor specific command with Sleep feature Enabled */ - if (hci_send_cmd(dd, OGF_VENDOR_CMD, HCI_SLEEP_CMD_OCF, 1, &pm) < 0) - perror("PM command failed, power management Disabled"); - - nanosleep(&tm, NULL); - hci_close_dev(dd); - - return 0; -} - - - -#define FLOW_CTL 0x0001 -#define ENABLE_PM 1 -#define DISABLE_PM 0 - -/* Initialize UART driver */ -static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) -{ - ALOGI(" %s ", __FUNCTION__); - - struct termios ti; - - int i, fd; - unsigned long flags = 0; - - if (raw) - flags |= 1 << HCI_UART_RAW_DEVICE; - - - fd = open(dev, O_RDWR | O_NOCTTY); - - if (fd < 0) { - ALOGI("Can't open serial port"); - return -1; - } - - - tcflush(fd, TCIOFLUSH); - - if (tcgetattr(fd, &ti) < 0) { - ALOGI("Can't get port settings: %d\n", errno); - return -1; - } - - cfmakeraw(&ti); - - ti.c_cflag |= CLOCAL; - if (u->flags & FLOW_CTL) - ti.c_cflag |= CRTSCTS; - else - ti.c_cflag &= ~CRTSCTS; - - if (tcsetattr(fd, TCSANOW, &ti) < 0) { - ALOGI("Can't set port settings"); - return -1; - } - - if (set_speed(fd, &ti, u->init_speed) < 0) { - ALOGI("Can't set initial baud rate"); - return -1; - } - - tcflush(fd, TCIOFLUSH); - - if (send_break) { - tcsendbreak(fd, 0); - usleep(500000); - } - - ath3k_init(fd,u->speed,u->init_speed,u->bdaddr, &ti); - - ALOGI("Device setup complete\n"); - - - tcflush(fd, TCIOFLUSH); - - // Set actual baudrate - /* - if (set_speed(fd, &ti, u->speed) < 0) { - perror("Can't set baud rate"); - return -1; - } - - i = N_HCI; - if (ioctl(fd, TIOCSETD, &i) < 0) { - perror("Can't set line discipline"); - return -1; - } - - if (flags && ioctl(fd, HCIUARTSETFLAGS, flags) < 0) { - perror("Can't set UART flags"); - return -1; - } - - if (ioctl(fd, HCIUARTSETPROTO, u->proto) < 0) { - perror("Can't set device"); - return -1; - } - -#if !defined(SW_BOARD_HAVE_BLUETOOTH_RTK) - ath3k_post(fd, u->pm); -#endif - */ - - return fd; -} - - -int hw_config_ath3k(char *port_name) -{ - ALOGI(" %s ", __FUNCTION__); - PSCounter=0; - struct sigaction sa; - struct uart_t u ; - int n=0,send_break=0,raw=0; - - memset(&u, 0, sizeof(u)); - u.speed =3000000; - u.init_speed =115200; - u.flags |= FLOW_CTL; - u.pm = DISABLE_PM; - - n = init_uart(port_name, &u, send_break, raw); - if (n < 0) { - ALOGI("Can't initialize device"); - } - - return n; -} - -void lpm_set_ar3k(uint8_t pio, uint8_t action, uint8_t polarity) -{ - int rc; - int fd = -1; - char buffer; - - ALOGI("lpm mode: %d action: %d", pio, action); - - RESERVED(polarity); - - switch (pio) - { - case UPIO_LPM_MODE: - if (upio_state[UPIO_LPM_MODE] == action) - { - ALOGI("LPM is %s already", lpm_mode[action]); - return; - } - - fd = open(VENDOR_LPM_PROC_NODE, O_WRONLY); - - if (fd < 0) - { - ALOGE("upio_set : open(%s) for write failed: %s (%d)", - VENDOR_LPM_PROC_NODE, strerror(errno), errno); - return; - } - - if (action == UPIO_ASSERT) - { - buffer = '1'; - } - else - { - buffer = '0'; - } - - if (write(fd, &buffer, 1) < 0) - { - ALOGE("upio_set : write(%s) failed: %s (%d)", - VENDOR_LPM_PROC_NODE, strerror(errno),errno); - } - else - { - upio_state[UPIO_LPM_MODE] = action; - ALOGI("LPM is set to %s", lpm_mode[action]); - } - - if (fd >= 0) - close(fd); - - break; - - case UPIO_BT_WAKE: - /* UPIO_DEASSERT should be allowed because in Rx case assert occur - * from the remote side where as deassert will be initiated from Host - */ - if ((action == UPIO_ASSERT) && (upio_state[UPIO_BT_WAKE] == action)) - { - ALOGI("BT_WAKE is %s already", lpm_state[action]); - - return; - } - - if (action == UPIO_DEASSERT) - buffer = '0'; - else - buffer = '1'; - - fd = open(VENDOR_BTWRITE_PROC_NODE, O_WRONLY); - - if (fd < 0) - { - ALOGE("upio_set : open(%s) for write failed: %s (%d)", - VENDOR_BTWRITE_PROC_NODE, strerror(errno), errno); - return; - } - - if (write(fd, &buffer, 1) < 0) - { - ALOGE("upio_set : write(%s) failed: %s (%d)", - VENDOR_BTWRITE_PROC_NODE, strerror(errno),errno); - } - else - { - upio_state[UPIO_BT_WAKE] = action; - ALOGI("BT_WAKE is set to %s", lpm_state[action]); - } - - ALOGI("proc btwrite assertion"); - - if (fd >= 0) - close(fd); - - break; - - case UPIO_HOST_WAKE: - ALOGI("upio_set: UPIO_HOST_WAKE"); - break; - } - -} diff --git a/sdm845/libbt-vendor/src/hw_rome.c b/sdm845/libbt-vendor/src/hw_rome.c deleted file mode 100644 index ccfb137..0000000 --- a/sdm845/libbt-vendor/src/hw_rome.c +++ /dev/null @@ -1,1950 +0,0 @@ -/* - * - * Copyright (c) 2013, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You may - * obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. - * - */ - -/****************************************************************************** - * - * Filename: hw_rome.c - * - * Description: Contains controller-specific functions, like - * firmware patch download - * low power mode operations - * - ******************************************************************************/ -#ifdef __cplusplus -extern "C" { -#endif - -#define LOG_TAG "bt_vendor" - -#include <sys/socket.h> -#include <utils/Log.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <signal.h> -#include <time.h> -#include <errno.h> -#include <fcntl.h> -#include <dirent.h> -#include <ctype.h> -#include <cutils/properties.h> -#include <stdlib.h> -#include <termios.h> -#include <string.h> -#include <stdbool.h> -#include "bt_hci_bdroid.h" -#include "bt_vendor_qcom.h" -#include "hci_uart.h" -#include "hw_rome.h" - -#define BT_VERSION_FILEPATH "/data/misc/bluedroid/bt_fw_version.txt" - -#ifdef __cplusplus -} -#endif - -#define RESERVED(p) if(p) ALOGI( "%s: reserved param", __FUNCTION__); - -int read_vs_hci_event(int fd, unsigned char* buf, int size); - -/****************************************************************************** -** Variables -******************************************************************************/ -FILE *file; -unsigned char *phdr_buffer; -unsigned char *pdata_buffer = NULL; -patch_info rampatch_patch_info; -int chipset_ver = 0; -unsigned char gTlv_type; -unsigned char gTlv_dwndCfg; -static unsigned int wipower_flag = 0; -static unsigned int wipower_handoff_ready = 0; -char *rampatch_file_path = NULL; -char *nvm_file_path = NULL; -char *fw_su_info = NULL; -unsigned short fw_su_offset =0; -extern char enable_extldo; -unsigned char wait_vsc_evt = TRUE; -bool patch_dnld_pending = FALSE; -int dnld_fd = -1; - -/****************************************************************************** -** Extern variables -******************************************************************************/ - -/***************************************************************************** -** Functions -*****************************************************************************/ -int do_write(int fd, unsigned char *buf,int len) -{ - int ret = 0; - int write_offset = 0; - int write_len = len; - do { - ret = write(fd,buf+write_offset,write_len); - if (ret < 0) - { - ALOGE("%s, write failed ret = %d err = %s",__func__,ret,strerror(errno)); - return -1; - } else if (ret == 0) { - ALOGE("%s, write failed with ret 0 err = %s",__func__,strerror(errno)); - return 0; - } else { - if (ret < write_len) { - ALOGD("%s, Write pending,do write ret = %d err = %s",__func__,ret, - strerror(errno)); - write_len = write_len - ret; - write_offset = ret; - } else { - ALOGV("Write successful"); - break; - } - } - } while(1); - return len; -} - -int get_vs_hci_event(unsigned char *rsp) -{ - int err = 0; - unsigned char paramlen = 0; - unsigned char EMBEDDED_MODE_CHECK = 0x02; - FILE *btversionfile = 0; - unsigned int soc_id = 0; - unsigned int productid = 0; - unsigned short patchversion = 0; - char build_label[255]; - int build_lbl_len; - unsigned short buildversion = 0; - - if( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE)) - ALOGI("%s: Received HCI-Vendor Specific event", __FUNCTION__); - else { - ALOGI("%s: Failed to receive HCI-Vendor Specific event", __FUNCTION__); - err = -EIO; - goto failed; - } - - ALOGI("%s: Parameter Length: 0x%x", __FUNCTION__, paramlen = rsp[EVT_PLEN]); - ALOGI("%s: Command response: 0x%x", __FUNCTION__, rsp[CMD_RSP_OFFSET]); - ALOGI("%s: Response type : 0x%x", __FUNCTION__, rsp[RSP_TYPE_OFFSET]); - - /* Check the status of the operation */ - switch ( rsp[CMD_RSP_OFFSET] ) - { - case EDL_CMD_REQ_RES_EVT: - ALOGI("%s: Command Request Response", __FUNCTION__); - switch(rsp[RSP_TYPE_OFFSET]) - { - case EDL_PATCH_VER_RES_EVT: - case EDL_APP_VER_RES_EVT: - ALOGI("\t Current Product ID\t\t: 0x%08x", - productid = (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 | - rsp[PATCH_PROD_ID_OFFSET+2] << 16 | - rsp[PATCH_PROD_ID_OFFSET+1] << 8 | - rsp[PATCH_PROD_ID_OFFSET] )); - - /* Patch Version indicates FW patch version */ - ALOGI("\t Current Patch Version\t\t: 0x%04x", - (patchversion = (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 | - rsp[PATCH_PATCH_VER_OFFSET] ))); - - /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */ - ALOGI("\t Current ROM Build Version\t: 0x%04x", buildversion = - (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 | - rsp[PATCH_ROM_BUILD_VER_OFFSET] )); - - /* In case rome 1.0/1.1, there is no SOC ID version available */ - if (paramlen - 10) - { - ALOGI("\t Current SOC Version\t\t: 0x%08x", soc_id = - (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 | - rsp[PATCH_SOC_VER_OFFSET+2] << 16 | - rsp[PATCH_SOC_VER_OFFSET+1] << 8 | - rsp[PATCH_SOC_VER_OFFSET] )); - } - - if (NULL != (btversionfile = fopen(BT_VERSION_FILEPATH, "wb"))) { - fprintf(btversionfile, "Bluetooth Controller Product ID : 0x%08x\n", productid); - fprintf(btversionfile, "Bluetooth Controller Patch Version : 0x%04x\n", patchversion); - fprintf(btversionfile, "Bluetooth Controller Build Version : 0x%04x\n", buildversion); - fprintf(btversionfile, "Bluetooth Controller SOC Version : 0x%08x\n", soc_id); - fclose(btversionfile); - }else { - ALOGI("Failed to dump SOC version info. Errno:%d", errno); - } - /* Rome Chipset Version can be decided by Patch version and SOC version, - Upper 2 bytes will be used for Patch version and Lower 2 bytes will be - used for SOC as combination for BT host driver */ - chipset_ver = (buildversion << 16) |(soc_id & 0x0000ffff); - - break; - case EDL_TVL_DNLD_RES_EVT: - case EDL_CMD_EXE_STATUS_EVT: - switch (err = rsp[CMD_STATUS_OFFSET]) - { - case HCI_CMD_SUCCESS: - ALOGI("%s: Download Packet successfully!", __FUNCTION__); - break; - case PATCH_LEN_ERROR: - ALOGI("%s: Invalid patch length argument passed for EDL PATCH " - "SET REQ cmd", __FUNCTION__); - break; - case PATCH_VER_ERROR: - ALOGI("%s: Invalid patch version argument passed for EDL PATCH " - "SET REQ cmd", __FUNCTION__); - break; - case PATCH_CRC_ERROR: - ALOGI("%s: CRC check of patch failed!!!", __FUNCTION__); - break; - case PATCH_NOT_FOUND: - ALOGI("%s: Invalid patch data!!!", __FUNCTION__); - break; - case TLV_TYPE_ERROR: - ALOGI("%s: TLV Type Error !!!", __FUNCTION__); - break; - default: - ALOGI("%s: Undefined error (0x%x)", __FUNCTION__, err); - break; - } - break; - case HCI_VS_GET_BUILD_VER_EVT: - build_lbl_len = rsp[5]; - memcpy (build_label, &rsp[6], build_lbl_len); - *(build_label+build_lbl_len) = '\0'; - - ALOGI("BT SoC FW SU Build info: %s, %d", build_label, build_lbl_len); - if (NULL != (btversionfile = fopen(BT_VERSION_FILEPATH, "a+b"))) { - fprintf(btversionfile, "Bluetooth Contoller SU Build info : %s\n", build_label); - fclose(btversionfile); - } else { - ALOGI("Failed to dump FW SU build info. Errno:%d", errno); - } - break; - } - break; - - case NVM_ACCESS_CODE: - ALOGI("%s: NVM Access Code!!!", __FUNCTION__); - err = HCI_CMD_SUCCESS; - break; - case EDL_SET_BAUDRATE_RSP_EVT: - /* Rome 1.1 has bug with the response, so it should ignore it. */ - if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS) - { - ALOGE("%s: Set Baudrate request failed - 0x%x", __FUNCTION__, - rsp[CMD_STATUS_OFFSET]); - err = -1; - } - break; - case EDL_WIP_QUERY_CHARGING_STATUS_EVT: - /* Query charging command has below return values - 0 - in embedded mode not charging - 1 - in embedded mode and charging - 2 - hadofff completed and in normal mode - 3 - no wipower supported on mtp. so irrepective of charging - handoff command has to be sent if return values are 0 or 1. - These change include logic to enable generic BT turn on sequence.*/ - if (rsp[4] < EMBEDDED_MODE_CHECK) - { - ALOGI("%s: WiPower Charging in Embedded Mode!!!", __FUNCTION__); - wipower_handoff_ready = rsp[4]; - wipower_flag = 1; - } - break; - case EDL_WIP_START_HANDOFF_TO_HOST_EVENT: - /*TODO: rsp code 00 mean no charging - this is going to change in FW soon*/ - if (rsp[4] == NON_WIPOWER_MODE) - { - ALOGE("%s: WiPower Charging hand off not ready!!!", __FUNCTION__); - } - break; - case HCI_VS_GET_ADDON_FEATURES_EVENT: - if ((rsp[4] & ADDON_FEATURES_EVT_WIPOWER_MASK)) - { - ALOGD("%s: WiPower feature supported!!", __FUNCTION__); - property_set("persist.bluetooth.a4wp", "true"); - } - break; - case HCI_VS_STRAY_EVT: - /* WAR to handle stray Power Apply EVT during patch download */ - ALOGD("%s: Stray HCI VS EVENT", __FUNCTION__); - if (patch_dnld_pending && dnld_fd != -1) - { - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - memset(rsp, 0x00, HCI_MAX_EVENT_SIZE); - read_vs_hci_event(dnld_fd, rsp, HCI_MAX_EVENT_SIZE); - } - else - { - ALOGE("%s: Not a valid status!!!", __FUNCTION__); - err = -1; - } - break; - default: - ALOGE("%s: Not a valid status!!!", __FUNCTION__); - err = -1; - break; - } - -failed: - return err; -} - - -/* - * Read an VS HCI event from the given file descriptor. - */ -int read_vs_hci_event(int fd, unsigned char* buf, int size) -{ - int remain, r; - int count = 0, i; - - if (size <= 0) { - ALOGE("Invalid size arguement!"); - return -1; - } - - ALOGI("%s: Wait for HCI-Vendor Specfic Event from SOC", __FUNCTION__); - - /* The first byte identifies the packet type. For HCI event packets, it - * should be 0x04, so we read until we get to the 0x04. */ - /* It will keep reading until find 0x04 byte */ - while (1) { - r = read(fd, buf, 1); - if (r <= 0) - return -1; - if (buf[0] == 0x04) - break; - } - count++; - - /* The next two bytes are the event code and parameter total length. */ - while (count < 3) { - r = read(fd, buf + count, 3 - count); - if ((r <= 0) || (buf[1] != 0xFF )) { - ALOGE("It is not VS event !! ret: %d, EVT: %d", r, buf[1]); - return -1; - } - count += r; - } - - /* Now we read the parameters. */ - if (buf[2] < (size - 3)) - remain = buf[2]; - else - remain = size - 3; - - while ((count - 3) < remain) { - r = read(fd, buf + count, remain - (count - 3)); - if (r <= 0) - return -1; - count += r; - } - - /* Check if the set patch command is successful or not */ - if(get_vs_hci_event(buf) != HCI_CMD_SUCCESS) - return -1; - - return count; -} - -/* - * For Hand-Off related Wipower commands, Command complete arrives first and - * the followd with VS event - * - */ -int hci_send_wipower_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) -{ - int ret = 0; - int err = 0; - - /* Send the HCI command packet to UART for transmission */ - ret = do_write(fd, cmd, size); - if (ret != size) { - ALOGE("%s: WP Send failed with ret value: %d", __FUNCTION__, ret); - goto failed; - } - - /* Wait for command complete event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to charging status cmd on Controller", __FUNCTION__); - goto failed; - } - - ALOGI("%s: WP Received HCI command complete Event from SOC", __FUNCTION__); -failed: - return ret; -} - - -int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) -{ - int ret = 0; - - /* Send the HCI command packet to UART for transmission */ - ret = do_write(fd, cmd, size); - if (ret != size) { - ALOGE("%s: Send failed with ret value: %d", __FUNCTION__, ret); - goto failed; - } - - if (wait_vsc_evt) { - /* Check for response from the Controller */ - if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { - ret = -ETIMEDOUT; - ALOGI("%s: Failed to get HCI-VS Event from SOC", __FUNCTION__); - goto failed; - } - ALOGI("%s: Received HCI-Vendor Specific Event from SOC", __FUNCTION__); - } - -failed: - return ret; -} - -void frame_hci_cmd_pkt( - unsigned char *cmd, - int edl_cmd, unsigned int p_base_addr, - int segtNo, int size - ) -{ - int offset = 0; - hci_command_hdr *cmd_hdr; - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_PATCH_CMD_OCF); - cmd_hdr->plen = size; - cmd[4] = edl_cmd; - - switch (edl_cmd) - { - case EDL_PATCH_SET_REQ_CMD: - /* Copy the patch header info as CMD params */ - memcpy(&cmd[5], phdr_buffer, PATCH_HDR_LEN); - ALOGD("%s: Sending EDL_PATCH_SET_REQ_CMD", __FUNCTION__); - ALOGD("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", - segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - break; - case EDL_PATCH_DLD_REQ_CMD: - offset = ((segtNo - 1) * MAX_DATA_PER_SEGMENT); - p_base_addr += offset; - cmd_hdr->plen = (size + 6); - cmd[5] = (size + 4); - cmd[6] = EXTRACT_BYTE(p_base_addr, 0); - cmd[7] = EXTRACT_BYTE(p_base_addr, 1); - cmd[8] = EXTRACT_BYTE(p_base_addr, 2); - cmd[9] = EXTRACT_BYTE(p_base_addr, 3); - memcpy(&cmd[10], (pdata_buffer + offset), size); - - ALOGD("%s: Sending EDL_PATCH_DLD_REQ_CMD: size: %d bytes", - __FUNCTION__, size); - ALOGD("HCI-CMD %d:\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t" - "0x%x\t0x%x\t0x%x\t\n", segtNo, cmd[0], cmd[1], cmd[2], - cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]); - break; - case EDL_PATCH_ATCH_REQ_CMD: - ALOGD("%s: Sending EDL_PATCH_ATTACH_REQ_CMD", __FUNCTION__); - ALOGD("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", - segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - break; - case EDL_PATCH_RST_REQ_CMD: - ALOGD("%s: Sending EDL_PATCH_RESET_REQ_CMD", __FUNCTION__); - ALOGD("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", - segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - break; - case EDL_PATCH_VER_REQ_CMD: - ALOGD("%s: Sending EDL_PATCH_VER_REQ_CMD", __FUNCTION__); - ALOGD("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", - segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - break; - case EDL_PATCH_TLV_REQ_CMD: - ALOGD("%s: Sending EDL_PATCH_TLV_REQ_CMD", __FUNCTION__); - /* Parameter Total Length */ - cmd[3] = size +2; - - /* TLV Segment Length */ - cmd[5] = size; - ALOGD("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", - segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); - offset = (segtNo * MAX_SIZE_PER_TLV_SEGMENT); - memcpy(&cmd[6], (pdata_buffer + offset), size); - break; - case EDL_GET_BUILD_INFO: - ALOGD("%s: Sending EDL_GET_BUILD_INFO", __FUNCTION__); - ALOGD("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", - segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - break; - default: - ALOGE("%s: Unknown EDL CMD !!!", __FUNCTION__); - } -} - -void rome_extract_patch_header_info(unsigned char *buf) -{ - int index; - - /* Extract patch id */ - for (index = 0; index < 4; index++) - rampatch_patch_info.patch_id |= - (LSH(buf[index + P_ID_OFFSET], (index * 8))); - - /* Extract (ROM and BUILD) version information */ - for (index = 0; index < 2; index++) - rampatch_patch_info.patch_ver.rom_version |= - (LSH(buf[index + P_ROME_VER_OFFSET], (index * 8))); - - for (index = 0; index < 2; index++) - rampatch_patch_info.patch_ver.build_version |= - (LSH(buf[index + P_BUILD_VER_OFFSET], (index * 8))); - - /* Extract patch base and entry addresses */ - for (index = 0; index < 4; index++) - rampatch_patch_info.patch_base_addr |= - (LSH(buf[index + P_BASE_ADDR_OFFSET], (index * 8))); - - /* Patch BASE & ENTRY addresses are same */ - rampatch_patch_info.patch_entry_addr = rampatch_patch_info.patch_base_addr; - - /* Extract total length of the patch payload */ - for (index = 0; index < 4; index++) - rampatch_patch_info.patch_length |= - (LSH(buf[index + P_LEN_OFFSET], (index * 8))); - - /* Extract the CRC checksum of the patch payload */ - for (index = 0; index < 4; index++) - rampatch_patch_info.patch_crc |= - (LSH(buf[index + P_CRC_OFFSET], (index * 8))); - - /* Extract patch control value */ - for (index = 0; index < 4; index++) - rampatch_patch_info.patch_ctrl |= - (LSH(buf[index + P_CONTROL_OFFSET], (index * 8))); - - ALOGI("PATCH_ID\t : 0x%x", rampatch_patch_info.patch_id); - ALOGI("ROM_VERSION\t : 0x%x", rampatch_patch_info.patch_ver.rom_version); - ALOGI("BUILD_VERSION\t : 0x%x", rampatch_patch_info.patch_ver.build_version); - ALOGI("PATCH_LENGTH\t : 0x%x", rampatch_patch_info.patch_length); - ALOGI("PATCH_CRC\t : 0x%x", rampatch_patch_info.patch_crc); - ALOGI("PATCH_CONTROL\t : 0x%x\n", rampatch_patch_info.patch_ctrl); - ALOGI("PATCH_BASE_ADDR\t : 0x%x\n", rampatch_patch_info.patch_base_addr); - -} - -int rome_edl_set_patch_request(int fd) -{ - int size, err; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - /* Frame the HCI CMD to be sent to the Controller */ - frame_hci_cmd_pkt(cmd, EDL_PATCH_SET_REQ_CMD, 0, - -1, PATCH_HDR_LEN + 1); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to set the patch info to the Controller!"); - goto error; - } - - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to set patch info on Controller", __FUNCTION__); - goto error; - } - ALOGI("%s: Successfully set patch info on the Controller", __FUNCTION__); -error: - return err; -} - -int rome_edl_patch_download_request(int fd) -{ - int no_of_patch_segment; - int index = 1, err = 0, size = 0; - unsigned int p_base_addr; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - no_of_patch_segment = (rampatch_patch_info.patch_length / - MAX_DATA_PER_SEGMENT); - ALOGI("%s: %d patch segments to be d'loaded from patch base addr: 0x%x", - __FUNCTION__, no_of_patch_segment, - rampatch_patch_info.patch_base_addr); - - /* Initialize the patch base address from the one read from bin file */ - p_base_addr = rampatch_patch_info.patch_base_addr; - - /* - * Depending upon size of the patch payload, download the patches in - * segments with a max. size of 239 bytes - */ - for (index = 1; index <= no_of_patch_segment; index++) { - - ALOGI("%s: Downloading patch segment: %d", __FUNCTION__, index); - - /* Frame the HCI CMD PKT to be sent to Controller*/ - frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, - index, MAX_DATA_PER_SEGMENT); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Initialize the RSP packet everytime to 0 */ - memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send the patch payload to the Controller!"); - goto error; - } - - /* Read Command Complete Event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to downlaod patch segment: %d!", - __FUNCTION__, index); - goto error; - } - ALOGI("%s: Successfully downloaded patch segment: %d", - __FUNCTION__, index); - } - - /* Check if any pending patch data to be sent */ - size = (rampatch_patch_info.patch_length < MAX_DATA_PER_SEGMENT) ? - rampatch_patch_info.patch_length : - (rampatch_patch_info.patch_length % MAX_DATA_PER_SEGMENT); - - if (size) - { - /* Frame the HCI CMD PKT to be sent to Controller*/ - frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, index, size); - - /* Initialize the RSP packet everytime to 0 */ - memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send the patch payload to the Controller!"); - goto error; - } - - /* Read Command Complete Event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to downlaod patch segment: %d!", - __FUNCTION__, index); - goto error; - } - - ALOGI("%s: Successfully downloaded patch segment: %d", - __FUNCTION__, index); - } - -error: - return err; -} - -static int rome_download_rampatch(int fd) -{ - int c, tmp, size, index, ret = -1; - - ALOGI("%s: ", __FUNCTION__); - - /* Get handle to the RAMPATCH binary file */ - ALOGI("%s: Getting handle to the RAMPATCH binary file from %s", __FUNCTION__, ROME_FW_PATH); - file = fopen(ROME_FW_PATH, "r"); - if (file == NULL) { - ALOGE("%s: Failed to get handle to the RAMPATCH bin file!", - __FUNCTION__); - return -ENFILE; - } - - /* Allocate memory for the patch headder info */ - ALOGI("%s: Allocating memory for the patch header", __FUNCTION__); - phdr_buffer = (unsigned char *) malloc(PATCH_HDR_LEN + 1); - if (phdr_buffer == NULL) { - ALOGE("%s: Failed to allocate memory for patch header", - __FUNCTION__); - goto phdr_alloc_failed; - } - for (index = 0; index < PATCH_HDR_LEN + 1; index++) - phdr_buffer[index] = 0x0; - - /* Read 28 bytes of patch header information */ - ALOGI("%s: Reading patch header info", __FUNCTION__); - index = 0; - do { - c = fgetc (file); - phdr_buffer[index++] = (unsigned char)c; - } while (index != PATCH_HDR_LEN); - - /* Save the patch header info into local structure */ - ALOGI("%s: Saving patch hdr. info", __FUNCTION__); - rome_extract_patch_header_info((unsigned char *)phdr_buffer); - - /* Set the patch header info onto the Controller */ - ret = rome_edl_set_patch_request(fd); - if (ret < 0) { - ALOGE("%s: Error setting the patchheader info!", __FUNCTION__); - goto pdata_alloc_failed; - } - - /* Allocate memory for the patch payload */ - ALOGI("%s: Allocating memory for patch payload", __FUNCTION__); - size = rampatch_patch_info.patch_length; - pdata_buffer = (unsigned char *) malloc(size+1); - if (pdata_buffer == NULL) { - ALOGE("%s: Failed to allocate memory for patch payload", - __FUNCTION__); - goto pdata_alloc_failed; - } - for (index = 0; index < size+1; index++) - pdata_buffer[index] = 0x0; - - /* Read the patch data from Rampatch binary image */ - ALOGI("%s: Reading patch payload from RAMPATCH file", __FUNCTION__); - index = 0; - do { - c = fgetc (file); - pdata_buffer[index++] = (unsigned char)c; - } while (c != EOF); - - /* Downloading patches in segments to controller */ - ret = rome_edl_patch_download_request(fd); - if (ret < 0) { - ALOGE("%s: Error downloading patch segments!", __FUNCTION__); - goto cleanup; - } -cleanup: - free(pdata_buffer); -pdata_alloc_failed: - free(phdr_buffer); -phdr_alloc_failed: - fclose(file); -error: - return ret; -} - -int rome_attach_rampatch(int fd) -{ - int size, err; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - /* Frame the HCI CMD to be sent to the Controller */ - frame_hci_cmd_pkt(cmd, EDL_PATCH_ATCH_REQ_CMD, 0, - -1, EDL_PATCH_CMD_LEN); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to attach the patch payload to the Controller!"); - goto error; - } - - /* Read Command Complete Event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to attach the patch segment(s)", __FUNCTION__); - goto error; - } -error: - return err; -} - -int rome_rampatch_reset(int fd) -{ - int size, err = 0, flags; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - struct timespec tm = { 0, 100*1000*1000 }; /* 100 ms */ - - /* Frame the HCI CMD to be sent to the Controller */ - frame_hci_cmd_pkt(cmd, EDL_PATCH_RST_REQ_CMD, 0, - -1, EDL_PATCH_CMD_LEN); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); - - /* Send HCI Command packet to Controller */ - err = do_write(fd, cmd, size); - if (err != size) { - ALOGE("%s: Send failed with ret value: %d", __FUNCTION__, err); - goto error; - } - - /* - * Controller doesn't sends any response for the patch reset - * command. HOST has to wait for 100ms before proceeding. - */ - nanosleep(&tm, NULL); - -error: - return err; -} - -/* This function is called with q_lock held and q is non-NULL */ -int rome_get_tlv_file(char *file_path) -{ - FILE * pFile; - long fileSize; - int readSize, err = 0, total_segment, remain_size, nvm_length, nvm_index, i; - unsigned short nvm_tag_len; - tlv_patch_info *ptlv_header; - tlv_nvm_hdr *nvm_ptr; - unsigned char data_buf[PRINT_BUF_SIZE]={0,}; - unsigned char *nvm_byte_ptr; - - ALOGI("File Open (%s)", file_path); - pFile = fopen ( file_path , "r" ); - if (pFile==NULL) {; - ALOGE("%s File Open Fail", file_path); - return -1; - } - - /* Get File Size */ - fseek (pFile , 0 , SEEK_END); - fileSize = ftell (pFile); - rewind (pFile); - - pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); - if (pdata_buffer == NULL) { - ALOGE("Allocated Memory failed"); - fclose (pFile); - return -1; - } - - /* Copy file into allocated buffer */ - readSize = fread (pdata_buffer,1,fileSize,pFile); - - /* File Close */ - fclose (pFile); - - if (readSize != fileSize) { - ALOGE("Read file size(%d) not matched with actual file size (%ld bytes)",readSize,fileSize); - return -1; - } - - ptlv_header = (tlv_patch_info *) pdata_buffer; - - /* To handle different event between rampatch and NVM */ - gTlv_type = ptlv_header->tlv_type; - gTlv_dwndCfg = ptlv_header->tlv.patch.dwnd_cfg; - - if(ptlv_header->tlv_type == TLV_TYPE_PATCH){ - ALOGI("===================================================="); - ALOGI("TLV Type\t\t\t : 0x%x", ptlv_header->tlv_type); - ALOGI("Length\t\t\t : %d bytes", (ptlv_header->tlv_length1) | - (ptlv_header->tlv_length2 << 8) | - (ptlv_header->tlv_length3 << 16)); - ALOGI("Total Length\t\t\t : %d bytes", ptlv_header->tlv.patch.tlv_data_len); - ALOGI("Patch Data Length\t\t\t : %d bytes",ptlv_header->tlv.patch.tlv_patch_data_len); - ALOGI("Signing Format Version\t : 0x%x", ptlv_header->tlv.patch.sign_ver); - ALOGI("Signature Algorithm\t\t : 0x%x", ptlv_header->tlv.patch.sign_algorithm); - ALOGI("Event Handling\t\t\t : 0x%x", ptlv_header->tlv.patch.dwnd_cfg); - ALOGI("Reserved\t\t\t : 0x%x", ptlv_header->tlv.patch.reserved1); - ALOGI("Product ID\t\t\t : 0x%04x\n", ptlv_header->tlv.patch.prod_id); - ALOGI("Rom Build Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.build_ver); - ALOGI("Patch Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.patch_ver); - ALOGI("Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved2); - ALOGI("Patch Entry Address\t\t : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr)); - ALOGI("===================================================="); - - } else if(ptlv_header->tlv_type == TLV_TYPE_NVM) { - ALOGI("===================================================="); - ALOGI("TLV Type\t\t\t : 0x%x", ptlv_header->tlv_type); - ALOGI("Length\t\t\t : %d bytes", nvm_length = (ptlv_header->tlv_length1) | - (ptlv_header->tlv_length2 << 8) | - (ptlv_header->tlv_length3 << 16)); - - if(nvm_length <= 0) - return readSize; - - for(nvm_byte_ptr=(unsigned char *)(nvm_ptr = &(ptlv_header->tlv.nvm)), nvm_index=0; - nvm_index < nvm_length ; nvm_ptr = (tlv_nvm_hdr *) nvm_byte_ptr) - { - ALOGI("TAG ID\t\t\t : %d", nvm_ptr->tag_id); - ALOGI("TAG Length\t\t\t : %d", nvm_tag_len = nvm_ptr->tag_len); - ALOGI("TAG Pointer\t\t\t : %d", nvm_ptr->tag_ptr); - ALOGI("TAG Extended Flag\t\t : %d", nvm_ptr->tag_ex_flag); - - /* Increase nvm_index to NVM data */ - nvm_index+=sizeof(tlv_nvm_hdr); - nvm_byte_ptr+=sizeof(tlv_nvm_hdr); - - /* Write BD Address */ - if(nvm_ptr->tag_id == TAG_NUM_2){ - memcpy(nvm_byte_ptr, q->bdaddr, 6); - ALOGI("BD Address: %.02x:%.02x:%.02x:%.02x:%.02x:%.02x", - *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), - *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); - } - - for(i =0;(i<nvm_ptr->tag_len && (i*3 + 2) <PRINT_BUF_SIZE);i++) - snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", (char *)data_buf, *(nvm_byte_ptr + i)); - - ALOGI("TAG Data\t\t\t : %s", data_buf); - - /* Clear buffer */ - memset(data_buf, 0x0, PRINT_BUF_SIZE); - - /* increased by tag_len */ - nvm_index+=nvm_ptr->tag_len; - nvm_byte_ptr +=nvm_ptr->tag_len; - } - - ALOGI("===================================================="); - - } else { - ALOGI("TLV Header type is unknown (%d) ", ptlv_header->tlv_type); - } - - return readSize; -} - -int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc_evt) -{ - int size=0, err = -1; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - ALOGI("%s: Downloading TLV Patch segment no.%d, size:%d", __FUNCTION__, index, seg_size); - - /* Frame the HCI CMD PKT to be sent to Controller*/ - frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Initialize the RSP packet everytime to 0 */ - memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send the patch payload to the Controller! 0x%x", err); - return err; - } - - if(wait_cc_evt) { - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to downlaod patch segment: %d!", __FUNCTION__, index); - return err; - } - } - - ALOGI("%s: Successfully downloaded patch segment: %d", __FUNCTION__, index); - return err; -} - -int rome_tlv_dnld_req(int fd, int tlv_size) -{ - int total_segment, remain_size, i, err = -1; - unsigned char wait_cc_evt = TRUE; - - total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; - remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ - tlv_size: (tlv_size%MAX_SIZE_PER_TLV_SEGMENT); - - ALOGI("%s: TLV size: %d, Total Seg num: %d, remain size: %d", - __FUNCTION__,tlv_size, total_segment, remain_size); - - if (gTlv_type == TLV_TYPE_PATCH) { - /* Prior to Rome version 3.2(including inital few rampatch release of Rome 3.2), the event - * handling mechanism is ROME_SKIP_EVT_NONE. After few release of rampatch for Rome 3.2, the - * mechamism is changed to ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now - */ - switch(gTlv_dwndCfg) - { - case ROME_SKIP_EVT_NONE: - wait_vsc_evt = TRUE; - wait_cc_evt = TRUE; - ALOGI("Event handling type: ROME_SKIP_EVT_NONE"); - break; - case ROME_SKIP_EVT_VSE_CC: - wait_vsc_evt = FALSE; - wait_cc_evt = FALSE; - ALOGI("Event handling type: ROME_SKIP_EVT_VSE_CC"); - break; - /* Not handled for now */ - case ROME_SKIP_EVT_VSE: - case ROME_SKIP_EVT_CC: - default: - ALOGE("Unsupported Event handling: %d", gTlv_dwndCfg); - break; - } - } else { - wait_vsc_evt = TRUE; - wait_cc_evt = TRUE; - } - - for(i=0;i<total_segment ;i++){ - if ((i+1) == total_segment) { - if ((chipset_ver >= ROME_VER_1_1) && (chipset_ver < ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is from 1.1 to 3.1 - * 1. No CCE for the last command segment but all other segment - * 2. All the command segments get VSE including the last one - */ - wait_cc_evt = !remain_size ? FALSE: TRUE; - } else if ((chipset_ver >= ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is 3.2 - * 1. None of the command segments receive CCE - * 2. No command segments receive VSE except the last one - * 3. If gTlv_dwndCfg is ROME_SKIP_EVT_NONE then the logic is - * same as Rome 2.1, 2.2, 3.0 - */ - if (gTlv_dwndCfg == ROME_SKIP_EVT_NONE) { - wait_cc_evt = !remain_size ? FALSE: TRUE; - } else if (gTlv_dwndCfg == ROME_SKIP_EVT_VSE_CC) { - wait_vsc_evt = !remain_size ? TRUE: FALSE; - } - } - } - - patch_dnld_pending = TRUE; - if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) - goto error; - patch_dnld_pending = FALSE; - } - - if ((chipset_ver >= ROME_VER_1_1) && (chipset_ver < ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is from 1.1 to 3.1 - * 1. No CCE for the last command segment but all other segment - * 2. All the command segments get VSE including the last one - */ - wait_cc_evt = remain_size ? FALSE: TRUE; - } else if ((chipset_ver >= ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is 3.2 - * 1. None of the command segments receive CCE - * 2. No command segments receive VSE except the last one - * 3. If gTlv_dwndCfg is ROME_SKIP_EVT_NONE then the logic is - * same as Rome 2.1, 2.2, 3.0 - */ - if (gTlv_dwndCfg == ROME_SKIP_EVT_NONE) { - wait_cc_evt = remain_size ? FALSE: TRUE; - } else if (gTlv_dwndCfg == ROME_SKIP_EVT_VSE_CC) { - wait_vsc_evt = remain_size ? TRUE: FALSE; - } - } - patch_dnld_pending = TRUE; - if(remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); - patch_dnld_pending = FALSE; -error: - if(patch_dnld_pending) patch_dnld_pending = FALSE; - return err; -} - -int rome_download_tlv_file(int fd) -{ - int tlv_size, err = -1; - - /* Rampatch TLV file Downloading */ - pdata_buffer = NULL; - if((tlv_size = rome_get_tlv_file(rampatch_file_path)) < 0) - goto error; - - if((err =rome_tlv_dnld_req(fd, tlv_size)) <0 ) - goto error; - - if (pdata_buffer != NULL){ - free (pdata_buffer); - pdata_buffer = NULL; - } -nvm_download: - if(!nvm_file_path) { - ALOGI("%s: nvm file is not available", __FUNCTION__); - err = 0; // in case of nvm/rampatch is not available - goto error; - } - - /* NVM TLV file Downloading */ - if((tlv_size = rome_get_tlv_file(nvm_file_path)) <= 0) - goto error; - - if((err =rome_tlv_dnld_req(fd, tlv_size)) <0 ) - goto error; - -error: - if (pdata_buffer != NULL) - free (pdata_buffer); - - return err; -} - -int rome_1_0_nvm_tag_dnld(int fd) -{ - int i, size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - -#if (NVM_VERSION >= ROME_1_0_100019) - unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = - { - /* Tag 2 */ /* BD Address */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 9, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 2, - /* Tag Len */ 6, - /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 - }, - /* Tag 6 */ /* Bluetooth Support Features */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 11, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 6, - /* Tag Len */ 8, - /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B - }, - /* Tag 17 */ /* HCI Transport Layer Setting */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 11, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 17, - /* Tag Len */ 8, - /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 - }, - /* Tag 35 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 58, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 35, - /* Tag Len */ 55, - /* Tag Value */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x58, 0x59, - 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, - 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, - 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, - 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, - 0x1B, 0x14, 0x01, 0x04, 0x48 - }, - /* Tag 36 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 15, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 36, - /* Tag Len */ 12, - /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 - }, - /* Tag 39 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 7, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 39, - /* Tag Len */ 4, - /* Tag Value */ 0x12,0x00,0x00,0x00 - }, - /* Tag 41 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 91, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 41, - /* Tag Len */ 88, - /* Tag Value */ 0x15, 0x00, 0x00, 0x00, 0xF6, 0x02, 0x00, 0x00, 0x76, 0x00, - 0x1E, 0x00, 0x29, 0x02, 0x1F, 0x00, 0x61, 0x00, 0x1A, 0x00, - 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x91, 0x00, - 0x06, 0x00, 0x92, 0x00, 0x03, 0x00, 0xA6, 0x01, 0x50, 0x00, - 0xAA, 0x01, 0x15, 0x00, 0xAB, 0x01, 0x0A, 0x00, 0xAC, 0x01, - 0x00, 0x00, 0xB0, 0x01, 0xC5, 0x00, 0xB3, 0x01, 0x03, 0x00, - 0xB4, 0x01, 0x13, 0x00, 0xB5, 0x01, 0x0C, 0x00, 0xC5, 0x01, - 0x0D, 0x00, 0xC6, 0x01, 0x10, 0x00, 0xCA, 0x01, 0x2B, 0x00, - 0xCB, 0x01, 0x5F, 0x00, 0xCC, 0x01, 0x48, 0x00 - }, - /* Tag 42 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 63, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 42, - /* Tag Len */ 60, - /* Tag Value */ 0xD7, 0xC0, 0x00, 0x00, 0x8F, 0x5C, 0x02, 0x00, 0x80, 0x47, - 0x60, 0x0C, 0x70, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, - 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xC7, 0x01, 0xFE, 0x01, - 0x3D, 0x02, 0x83, 0x02, 0xD1, 0x02, 0x29, 0x03, 0x00, 0x0A, - 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFD, 0x00, - 0xF9, 0x01, 0xF1, 0x03, 0xDE, 0x07, 0x00, 0x00, 0x9A, 0x01 - }, - /* Tag 84 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 153, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 84, - /* Tag Len */ 150, - /* Tag Value */ 0x7C, 0x6A, 0x59, 0x47, 0x19, 0x36, 0x35, 0x25, 0x25, 0x28, - 0x2C, 0x2B, 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x28, 0x29, 0x28, - 0x29, 0x29, 0x2C, 0x29, 0x2C, 0x29, 0x2C, 0x28, 0x29, 0x28, - 0x29, 0x28, 0x29, 0x2A, 0x00, 0x00, 0x2C, 0x2A, 0x2C, 0x18, - 0x98, 0x98, 0x98, 0x98, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x13, 0x1E, 0x1E, 0x1E, 0x1E, 0x13, 0x13, 0x11, 0x13, - 0x1E, 0x1E, 0x13, 0x12, 0x12, 0x12, 0x11, 0x12, 0x1F, 0x12, - 0x12, 0x12, 0x10, 0x0C, 0x18, 0x0D, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, - 0x0E, 0x0D, 0x01, 0x01, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0D, - 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x05, 0x10, 0x03, 0x00, - 0x7E, 0x7B, 0x7B, 0x72, 0x71, 0x50, 0x50, 0x50, 0x00, 0x40, - 0x60, 0x60, 0x30, 0x08, 0x02, 0x0F, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x16, 0x16, 0x08, 0x08, 0x00, - 0x00, 0x00, 0x1E, 0x34, 0x2B, 0x1B, 0x23, 0x2B, 0x15, 0x0D - }, - /* Tag 85 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 119, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 85, - /* Tag Len */ 116, - /* Tag Value */ 0x03, 0x00, 0x38, 0x00, 0x45, 0x77, 0x00, 0xE8, 0x00, 0x59, - 0x01, 0xCA, 0x01, 0x3B, 0x02, 0xAC, 0x02, 0x1D, 0x03, 0x8E, - 0x03, 0x00, 0x89, 0x01, 0x0E, 0x02, 0x5C, 0x02, 0xD7, 0x02, - 0xF8, 0x08, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x02, 0x55, 0x02, - 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0x00, 0x00, - 0x00, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0x14, 0x0F, 0x0A, 0x0F, - 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x0C, 0x0C, - 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x0F, 0x14, 0x05, 0x47, 0xCF, 0x77, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xAC, 0x7C, 0xFF, 0x40, 0x00, 0x00, 0x00, - 0x12, 0x04, 0x04, 0x01, 0x04, 0x03 - }, - {TAG_END} - }; -#elif (NVM_VERSION == ROME_1_0_6002) - unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = - { - /* Tag 2 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 9, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 2, - /* Tag Len */ 6, - /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 /* BD Address */ - }, - /* Tag 6 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 11, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 6, - /* Tag Len */ 8, - /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B - }, - /* Tag 17 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 11, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 17, - /* Tag Len */ 8, - /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 - }, - /* Tag 36 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 15, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 36, - /* Tag Len */ 12, - /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 - }, - - /* Tag 39 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 7, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 39, - /* Tag Len */ 4, - /* Tag Value */ 0x12,0x00,0x00,0x00 - }, - - /* Tag 41 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 199, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 41, - /* Tag Len */ 196, - /* Tag Value */ 0x30,0x00,0x00,0x00,0xD5,0x00,0x0E,0x00,0xD6,0x00,0x0E,0x00, - 0xD7,0x00,0x16,0x00,0xD8,0x00,0x16,0x00,0xD9,0x00,0x16,0x00, - 0xDA,0x00,0x1E,0x00,0xDB,0x00,0x26,0x00,0xDC,0x00,0x5F,0x00, - 0xDD,0x00,0x2F,0x00,0xDE,0x00,0x5F,0x00,0xE0,0x00,0x0E,0x00, - 0xE1,0x00,0x0E,0x00,0xE2,0x00,0x16,0x00,0xE3,0x00,0x16,0x00, - 0xE4,0x00,0x16,0x00,0xE5,0x00,0x1E,0x00,0xE6,0x00,0x26,0x00, - 0xE7,0x00,0x5F,0x00,0xE8,0x00,0x2F,0x00,0xE9,0x00,0x5F,0x00, - 0xEC,0x00,0x0C,0x00,0xED,0x00,0x08,0x00,0xEE,0x00,0x14,0x00, - 0xEF,0x00,0x24,0x00,0xF0,0x00,0x40,0x00,0xF1,0x00,0x4C,0x00, - 0xF2,0x00,0x70,0x00,0xF3,0x00,0x80,0x00,0xF4,0x00,0x80,0x00, - 0xF5,0x00,0x80,0x00,0xF8,0x00,0x0C,0x00,0xF9,0x00,0x18,0x00, - 0xFA,0x00,0x14,0x00,0xFB,0x00,0x24,0x00,0xFC,0x00,0x40,0x00, - 0xFD,0x00,0x4C,0x00,0xFE,0x00,0x70,0x00,0xFF,0x00,0x80,0x00, - 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x00,0x04,0x01,0x1B,0x00, - 0x05,0x01,0x14,0x00,0x06,0x01,0x01,0x00,0x07,0x01,0x04,0x00, - 0x08,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x0A,0x01,0x03,0x00, - 0x0B,0x01,0x03,0x00 - }, - - /* Tag 44 */ - { /* Packet Type */HCI_COMMAND_PKT, - /* Opcode */ 0x0b,0xfc, - /* Total Len */ 44, - /* NVM CMD */ NVM_ACCESS_SET, - /* Tag Num */ 44, - /* Tag Len */ 41, - /* Tag Value */ 0x6F,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x10,0x02,0x02, - 0x01,0x00,0x14,0x01,0x06,0x28,0xA0,0x62,0x03,0x64,0x01,0x01, - 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xFF,0x10,0x02,0x01, - 0x00,0x14,0x01,0x02,0x03 - }, - {TAG_END} - }; -#endif - - ALOGI("%s: Start sending NVM Tags (ver: 0x%x)", __FUNCTION__, (unsigned int) NVM_VERSION); - - for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++) - { - /* Write BD Address */ - if(cmds[i][TAG_NUM_OFFSET] == TAG_NUM_2){ - memcpy(&cmds[i][TAG_BDADDR_OFFSET], q->bdaddr, 6); - ALOGI("BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - cmds[i][TAG_BDADDR_OFFSET ], cmds[i][TAG_BDADDR_OFFSET + 1], - cmds[i][TAG_BDADDR_OFFSET + 2], cmds[i][TAG_BDADDR_OFFSET + 3], - cmds[i][TAG_BDADDR_OFFSET + 4], cmds[i][TAG_BDADDR_OFFSET + 5]); - } - size = cmds[i][3] + HCI_COMMAND_HDR_SIZE + 1; - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)&cmds[i][0], rsp, size); - if ( err != size) { - ALOGE("Failed to attach the patch payload to the Controller!"); - goto error; - } - - /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to get patch version(s)", __FUNCTION__); - goto error; - } - } - -error: - return err; -} - - - -int rome_patch_ver_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - /* Frame the HCI CMD to be sent to the Controller */ - frame_hci_cmd_pkt(cmd, EDL_PATCH_VER_REQ_CMD, 0, - -1, EDL_PATCH_CMD_LEN); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to attach the patch payload to the Controller!"); - goto error; - } - - /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to get patch version(s)", __FUNCTION__); - goto error; - } -error: - return err; - -} - -int rome_get_build_info_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - /* Frame the HCI CMD to be sent to the Controller */ - frame_hci_cmd_pkt(cmd, EDL_GET_BUILD_INFO, 0, - -1, EDL_PATCH_CMD_LEN); - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send get build info cmd to the SoC!"); - goto error; - } - - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to get build info", __FUNCTION__); - goto error; - } -error: - return err; - -} - - -int rome_set_baudrate_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - hci_command_hdr *cmd_hdr; - int flags; - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); - cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; - cmd[4] = BAUDRATE_3000000; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); - - /* Flow off during baudrate change */ - if ((err = userial_vendor_ioctl(USERIAL_OP_FLOW_OFF , &flags)) < 0) - { - ALOGE("%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); - goto error; - } - - /* Send the HCI command packet to UART for transmission */ - err = do_write(fd, cmd, size); - if (err != size) { - ALOGE("%s: Send failed with ret value: %d", __FUNCTION__, err); - goto error; - } - - /* Change Local UART baudrate to high speed UART */ - userial_vendor_set_baud(USERIAL_BAUD_3M); - - /* Flow on after changing local uart baudrate */ - if ((err = userial_vendor_ioctl(USERIAL_OP_FLOW_ON , &flags)) < 0) - { - ALOGE("%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); - return err; - } - - /* Check for response from the Controller */ - if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { - ALOGE("%s: Failed to get HCI-VS Event from SOC", __FUNCTION__); - goto error; - } - - ALOGI("%s: Received HCI-Vendor Specific Event from SOC", __FUNCTION__); - - /* Wait for command complete event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to set patch info on Controller", __FUNCTION__); - goto error; - } - -error: - return err; - -} - - -int rome_hci_reset_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - hci_command_hdr *cmd_hdr; - int flags; - - ALOGI("%s: HCI RESET ", __FUNCTION__); - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = HCI_RESET; - cmd_hdr->plen = 0; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); - - /* Flow off during baudrate change */ - if ((err = userial_vendor_ioctl(USERIAL_OP_FLOW_OFF , &flags)) < 0) - { - ALOGE("%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); - goto error; - } - - /* Send the HCI command packet to UART for transmission */ - ALOGI("%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); - err = do_write(fd, cmd, size); - if (err != size) { - ALOGE("%s: Send failed with ret value: %d", __FUNCTION__, err); - goto error; - } - - /* Change Local UART baudrate to high speed UART */ - userial_vendor_set_baud(USERIAL_BAUD_3M); - - /* Flow on after changing local uart baudrate */ - if ((err = userial_vendor_ioctl(USERIAL_OP_FLOW_ON , &flags)) < 0) - { - ALOGE("%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); - return err; - } - - /* Wait for command complete event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to set patch info on Controller", __FUNCTION__); - goto error; - } - -error: - return err; - -} - - -int rome_hci_reset(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - hci_command_hdr *cmd_hdr; - int flags; - - ALOGI("%s: HCI RESET ", __FUNCTION__); - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = HCI_RESET; - cmd_hdr->plen = 0; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); - err = do_write(fd, cmd, size); - if (err != size) { - ALOGE("%s: Send failed with ret value: %d", __FUNCTION__, err); - err = -1; - goto error; - } - - /* Wait for command complete event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { - ALOGE("%s: Failed to set patch info on Controller", __FUNCTION__); - goto error; - } - -error: - return err; - -} - -int rome_wipower_current_charging_status_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - hci_command_hdr *cmd_hdr; - int flags; - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_WIPOWER_VS_CMD_OCF); - cmd_hdr->plen = EDL_WIP_QUERY_CHARGING_STATUS_LEN; - cmd[4] = EDL_WIP_QUERY_CHARGING_STATUS_CMD; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_WIP_QUERY_CHARGING_STATUS_LEN); - - ALOGD("%s: Sending EDL_WIP_QUERY_CHARGING_STATUS_CMD", __FUNCTION__); - ALOGD("HCI-CMD: \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - - err = hci_send_wipower_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send EDL_WIP_QUERY_CHARGING_STATUS_CMD command!"); - goto error; - } - - /* Check for response from the Controller */ - if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { - err = -ETIMEDOUT; - ALOGI("%s: WP Failed to get HCI-VS Event from SOC", __FUNCTION__); - goto error; - } - - /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ - if (rsp[4] >= NON_WIPOWER_MODE) { - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if (err < 0) { - ALOGE("%s: Failed to get charging status", __FUNCTION__); - goto error; - } - } - -error: - return err; -} - -int addon_feature_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - hci_command_hdr *cmd_hdr; - int flags; - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_VS_GET_ADDON_FEATURES_SUPPORT); - cmd_hdr->plen = 0x00; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); - - ALOGD("%s: Sending HCI_VS_GET_ADDON_FEATURES_SUPPORT", __FUNCTION__); - ALOGD("HCI-CMD: \t0x%x \t0x%x \t0x%x \t0x%x", cmd[0], cmd[1], cmd[2], cmd[3]); - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send HCI_VS_GET_ADDON_FEATURES_SUPPORT command!"); - goto error; - } - - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if (err < 0) { - ALOGE("%s: Failed to get feature request", __FUNCTION__); - goto error; - } -error: - return err; -} - - -int check_embedded_mode(int fd) { - int err = 0; - - wipower_flag = 0; - /* Get current wipower charging status */ - if ((err = rome_wipower_current_charging_status_req(fd)) < 0) - { - ALOGI("%s: Wipower status req failed (0x%x)", __FUNCTION__, err); - } - usleep(500); - - ALOGE("%s: wipower_flag: %d", __FUNCTION__, wipower_flag); - - return wipower_flag; -} - -int rome_get_addon_feature_list(int fd) { - int err = 0; - - /* Get addon features that are supported by FW */ - if ((err = addon_feature_req(fd)) < 0) - { - ALOGE("%s: failed (0x%x)", __FUNCTION__, err); - } - return err; -} - -int rome_wipower_forward_handoff_req(int fd) -{ - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - hci_command_hdr *cmd_hdr; - int flags; - - memset(cmd, 0x0, HCI_MAX_CMD_SIZE); - - cmd_hdr = (void *) (cmd + 1); - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_WIPOWER_VS_CMD_OCF); - cmd_hdr->plen = EDL_WIP_START_HANDOFF_TO_HOST_LEN; - cmd[4] = EDL_WIP_START_HANDOFF_TO_HOST_CMD; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_WIP_START_HANDOFF_TO_HOST_LEN); - - ALOGD("%s: Sending EDL_WIP_START_HANDOFF_TO_HOST_CMD", __FUNCTION__); - ALOGD("HCI-CMD: \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); - err = hci_send_wipower_vs_cmd(fd, (unsigned char *)cmd, rsp, size); - if ( err != size) { - ALOGE("Failed to send EDL_WIP_START_HANDOFF_TO_HOST_CMD command!"); - goto error; - } - - /* Check for response from the Controller */ - if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { - err = -ETIMEDOUT; - ALOGI("%s: WP Failed to get HCI-VS Event from SOC", __FUNCTION__); - goto error; - } - -error: - return err; -} - - -void enable_controller_log (int fd, unsigned char wait_for_evt) -{ - int ret = 0; - /* VS command to enable controller logging to the HOST. By default it is disabled */ - unsigned char cmd[6] = {0x01, 0x17, 0xFC, 0x02, 0x00, 0x00}; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - char value[PROPERTY_VALUE_MAX] = {'\0'}; - - property_get("persist.service.bdroid.soclog", value, "false"); - - // value at cmd[5]: 1 - to enable, 0 - to disable - ret = (strcmp(value, "true") == 0) ? cmd[5] = 0x01: 0; - ALOGI("%s: %d", __func__, ret); - /* Ignore vsc evt if wait_for_evt is true */ - if (wait_for_evt) wait_vsc_evt = FALSE; - - ret = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, 6); - if (ret != 6) { - ALOGE("%s: command failed", __func__); - } - /*Ignore hci_event if wait_for_evt is true*/ - if (wait_for_evt) - goto end; - ret = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if (ret < 0) { - ALOGE("%s: Failed to get CC for enable SoC log", __FUNCTION__); - } -end: - wait_vsc_evt = TRUE; - return; -} - - -/* This function is called with q_lock held and q is non-NULL */ -static int disable_internal_ldo(int fd) -{ - int ret = 0; - if (q->enable_extldo) { - unsigned char cmd[5] = {0x01, 0x0C, 0xFC, 0x01, 0x32}; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - - ALOGI(" %s ", __FUNCTION__); - ret = do_write(fd, cmd, 5); - if (ret != 5) { - ALOGE("%s: Send failed with ret value: %d", __FUNCTION__, ret); - ret = -1; - } else { - /* Wait for command complete event */ - ret = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( ret < 0) { - ALOGE("%s: Failed to get response from controller", __FUNCTION__); - } - } - } - return ret; -} - -int rome_soc_init(int fd, char *bdaddr) -{ - int err = -1, size = 0; - dnld_fd = fd; - ALOGI(" %s ", __FUNCTION__); - RESERVED(bdaddr); - - /* If wipower charging is going on in embedded mode then start hand off req */ - if (wipower_flag == WIPOWER_IN_EMBEDDED_MODE && wipower_handoff_ready != NON_WIPOWER_MODE) - { - wipower_flag = 0; - wipower_handoff_ready = 0; - if ((err = rome_wipower_forward_handoff_req(fd)) < 0) - { - ALOGI("%s: Wipower handoff failed (0x%x)", __FUNCTION__, err); - } - } - - /* Get Rome version information */ - if((err = rome_patch_ver_req(fd)) <0){ - ALOGI("%s: Fail to get Rome Version (0x%x)", __FUNCTION__, err); - goto error; - } - - ALOGI("%s: Chipset Version (0x%08x)", __FUNCTION__, chipset_ver); - - switch (chipset_ver){ - case ROME_VER_1_0: - { - /* Set and Download the RAMPATCH */ - ALOGI("%s: Setting Patch Header & Downloading Patches", __FUNCTION__); - err = rome_download_rampatch(fd); - if (err < 0) { - ALOGE("%s: DOWNLOAD RAMPATCH failed!", __FUNCTION__); - goto error; - } - ALOGI("%s: DOWNLOAD RAMPTACH complete", __FUNCTION__); - - /* Attach the RAMPATCH */ - ALOGI("%s: Attaching the patches", __FUNCTION__); - err = rome_attach_rampatch(fd); - if (err < 0) { - ALOGE("%s: ATTACH RAMPATCH failed!", __FUNCTION__); - goto error; - } - ALOGI("%s: ATTACH RAMPTACH complete", __FUNCTION__); - - /* Send Reset */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); - err = rome_rampatch_reset(fd); - if ( err < 0 ) { - ALOGE("Failed to RESET after RAMPATCH upgrade!"); - goto error; - } - - /* NVM download */ - ALOGI("%s: Downloading NVM", __FUNCTION__); - err = rome_1_0_nvm_tag_dnld(fd); - if ( err <0 ) { - ALOGE("Downloading NVM Failed !!"); - goto error; - } - - /* Change baud rate 115.2 kbps to 3Mbps*/ - err = rome_hci_reset_req(fd); - if (err < 0) { - ALOGE("HCI Reset Failed !!"); - goto error; - } - - ALOGI("HCI Reset is done\n"); - } - break; - case ROME_VER_1_1: - rampatch_file_path = ROME_RAMPATCH_TLV_PATH; - nvm_file_path = ROME_NVM_TLV_PATH; - goto download; - case ROME_VER_1_3: - rampatch_file_path = ROME_RAMPATCH_TLV_1_0_3_PATH; - nvm_file_path = ROME_NVM_TLV_1_0_3_PATH; - goto download; - case ROME_VER_2_1: - rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH; - nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; - goto download; - case ROME_VER_3_0: - rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; - nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; - fw_su_info = ROME_3_1_FW_SU; - fw_su_offset = ROME_3_1_FW_SW_OFFSET; - goto download; - case ROME_VER_3_2: - rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; - nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; - fw_su_info = ROME_3_2_FW_SU; - fw_su_offset = ROME_3_2_FW_SW_OFFSET; - -download: - /* Change baud rate 115.2 kbps to 3Mbps*/ - err = rome_set_baudrate_req(fd); - if (err < 0) { - ALOGE("%s: Baud rate change failed!", __FUNCTION__); - goto error; - } - ALOGI("%s: Baud rate changed successfully ", __FUNCTION__); - /* Donwload TLV files (rampatch, NVM) */ - err = rome_download_tlv_file(fd); - if (err < 0) { - ALOGE("%s: Download TLV file failed!", __FUNCTION__); - goto error; - } - ALOGI("%s: Download TLV file successfully ", __FUNCTION__); - - /* Get SU FM label information */ - if((err = rome_get_build_info_req(fd)) <0){ - ALOGI("%s: Fail to get Rome FW SU Build info (0x%x)", __FUNCTION__, err); - //Ignore the failure of ROME FW SU label information - err = 0; - } - - /* Disable internal LDO to use external LDO instead*/ - err = disable_internal_ldo(fd); - - /* Send HCI Reset */ - err = rome_hci_reset(fd); - if ( err <0 ) { - ALOGE("HCI Reset Failed !!"); - goto error; - } - - ALOGI("HCI Reset is done\n"); - - break; - default: - ALOGI("%s: Detected unknown SoC version: 0x%08x", __FUNCTION__, chipset_ver); - err = -1; - break; - } - -error: - dnld_fd = -1; - return err; -} diff --git a/sdm845/libbt-vendor/vnd_buildcfg.mk b/sdm845/libbt-vendor/vnd_buildcfg.mk deleted file mode 100644 index d18e121..0000000 --- a/sdm845/libbt-vendor/vnd_buildcfg.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright 2012 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -intermediates := $(local-intermediates-dir) - -SRC := $(call my-dir)/include/$(addprefix vnd_, $(addsuffix .txt,$(basename $(TARGET_DEVICE)))) -ifeq (,$(wildcard $(SRC))) -# configuration file does not exist. Use default one -SRC := $(call my-dir)/include/vnd_generic.txt -endif -GEN := $(intermediates)/vnd_buildcfg.h -TOOL := $(TOP_DIR)external/bluetooth/bluedroid/tools/gen-buildcfg.sh - -$(GEN): PRIVATE_PATH := $(call my-dir) -$(GEN): PRIVATE_CUSTOM_TOOL = $(TOOL) $< $@ -$(GEN): $(SRC) $(TOOL) - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES += $(GEN) |