From 8f97e7642febae707598917c084d3fa5bb257200 Mon Sep 17 00:00:00 2001 From: Weiguo Hu Date: Mon, 30 Jul 2018 16:30:00 +0800 Subject: [PATCH] realtek bt bringup Change-Id: Iebf72692e2f20657aecfbe3e9e30fed6285f8774 Signed-off-by: Weiguo Hu --- rtkbt/code/libbt-vendor/Android.mk | 9 +- rtkbt/code/libbt-vendor/codec/msbc/sbc.c | 1763 +++++++++++++++++ rtkbt/code/libbt-vendor/codec/msbc/sbc.h | 79 + rtkbt/code/libbt-vendor/codec/msbc/sbc_math.h | 70 + .../code/libbt-vendor/codec/msbc/sbc_tables.h | 169 ++ rtkbt/code/libbt-vendor/include/bt_list.h | 0 rtkbt/code/libbt-vendor/include/bt_skbuff.h | 4 +- .../code/libbt-vendor/include/bt_vendor_rtk.h | 8 +- rtkbt/code/libbt-vendor/include/hardware.h | 197 ++ rtkbt/code/libbt-vendor/include/hci_h5_int.h | 3 + .../code/libbt-vendor/include/rtk_btservice.h | 18 + .../libbt-vendor/include/rtk_btsnoop_net.h | 0 rtkbt/code/libbt-vendor/include/rtk_hcidefs.h | 0 rtkbt/code/libbt-vendor/include/rtk_parse.h | 2 +- rtkbt/code/libbt-vendor/include/rtk_poll.h | 34 + rtkbt/code/libbt-vendor/include/rtk_socket.h | 73 + rtkbt/code/libbt-vendor/include/unused.h | 24 + rtkbt/code/libbt-vendor/include/upio.h | 2 +- .../libbt-vendor/include/userial_vendor.h | 23 +- .../code/libbt-vendor/include/vnd_buildcfg.h | 0 rtkbt/code/libbt-vendor/src/bt_list.c | 0 rtkbt/code/libbt-vendor/src/bt_skbuff.c | 4 +- rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c | 48 +- rtkbt/code/libbt-vendor/src/hardware.c | 1300 +----------- rtkbt/code/libbt-vendor/src/hardware_uart.c | 1233 ++++++++++++ rtkbt/code/libbt-vendor/src/hardware_usb.c | 930 +++++++++ rtkbt/code/libbt-vendor/src/hci_h5.c | 243 +-- rtkbt/code/libbt-vendor/src/rtk_btservice.c | 765 +++++++ rtkbt/code/libbt-vendor/src/rtk_btsnoop_net.c | 30 +- rtkbt/code/libbt-vendor/src/rtk_heartbeat.c | 245 +++ rtkbt/code/libbt-vendor/src/rtk_parse.c | 150 +- rtkbt/code/libbt-vendor/src/rtk_poll.c | 248 +++ rtkbt/code/libbt-vendor/src/rtk_socket.c | 191 ++ rtkbt/code/libbt-vendor/src/upio.c | 4 +- rtkbt/code/libbt-vendor/src/userial_vendor.c | 848 ++++++-- rtkbt/code/rtkcmd/Android.mk | 12 + rtkbt/code/rtkcmd/rtkcmd.c | 238 +++ rtkbt/rtkbt.mk | 81 +- rtkbt/vendor/firmware_box/fw_info.txt | 18 + rtkbt/vendor/firmware_box/rtl8723b_config | Bin 0 -> 44 bytes rtkbt/vendor/firmware_box/rtl8723b_fw | Bin 0 -> 46740 bytes .../vendor/firmware_box/rtl8723bs_VQ0_config | Bin 0 -> 117 bytes rtkbt/vendor/firmware_box/rtl8723bs_VQ0_fw | Bin 0 -> 46236 bytes rtkbt/vendor/firmware_box/rtl8723bs_config | Bin 0 -> 105 bytes rtkbt/vendor/firmware_box/rtl8723bs_fw | Bin 0 -> 46104 bytes rtkbt/vendor/firmware_box/rtl8723bu_config | Bin 0 -> 78 bytes rtkbt/vendor/firmware_box/rtl8723d_config | Bin 0 -> 56 bytes rtkbt/vendor/firmware_box/rtl8723d_fw | Bin 0 -> 51192 bytes rtkbt/vendor/firmware_box/rtl8723ds_config | Bin 0 -> 75 bytes rtkbt/vendor/firmware_box/rtl8723ds_fw | Bin 0 -> 52896 bytes rtkbt/vendor/firmware_box/rtl8761a_config | Bin 0 -> 105 bytes rtkbt/vendor/firmware_box/rtl8761a_fw | Bin 0 -> 66740 bytes rtkbt/vendor/firmware_box/rtl8761at_config | Bin 0 -> 109 bytes rtkbt/vendor/firmware_box/rtl8761at_fw | Bin 0 -> 67044 bytes rtkbt/vendor/firmware_box/rtl8761au8192ee_fw | Bin 0 -> 68620 bytes rtkbt/vendor/firmware_box/rtl8761au8812ae_fw | Bin 0 -> 70708 bytes rtkbt/vendor/firmware_box/rtl8761au_fw | Bin 0 -> 69044 bytes .../firmware_box/rtl8761aw8192eu_config | Bin 0 -> 81 bytes rtkbt/vendor/firmware_box/rtl8761aw8192eu_fw | Bin 0 -> 71964 bytes rtkbt/vendor/firmware_box/rtl8821a_config | Bin 0 -> 78 bytes rtkbt/vendor/firmware_box/rtl8821a_fw | Bin 0 -> 41184 bytes rtkbt/vendor/firmware_box/rtl8821as_config | Bin 0 -> 101 bytes rtkbt/vendor/firmware_box/rtl8821as_fw | Bin 0 -> 40744 bytes rtkbt/vendor/firmware_box/rtl8821c_config | Bin 0 -> 56 bytes rtkbt/vendor/firmware_box/rtl8821c_fw | Bin 0 -> 39752 bytes rtkbt/vendor/firmware_box/rtl8821cs_config | Bin 0 -> 75 bytes rtkbt/vendor/firmware_box/rtl8821cs_fw | Bin 0 -> 41712 bytes rtkbt/vendor/firmware_box/rtl8822b_config | Bin 0 -> 56 bytes rtkbt/vendor/firmware_box/rtl8822b_fw | Bin 0 -> 54452 bytes rtkbt/vendor/firmware_box/rtl8822bs_config | Bin 0 -> 75 bytes rtkbt/vendor/firmware_box/rtl8822bs_fw | Bin 0 -> 44972 bytes 71 files changed, 7328 insertions(+), 1738 deletions(-) mode change 100644 => 100755 rtkbt/code/libbt-vendor/Android.mk create mode 100755 rtkbt/code/libbt-vendor/codec/msbc/sbc.c create mode 100755 rtkbt/code/libbt-vendor/codec/msbc/sbc.h create mode 100755 rtkbt/code/libbt-vendor/codec/msbc/sbc_math.h create mode 100755 rtkbt/code/libbt-vendor/codec/msbc/sbc_tables.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/bt_list.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/bt_skbuff.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/bt_vendor_rtk.h create mode 100755 rtkbt/code/libbt-vendor/include/hardware.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/hci_h5_int.h create mode 100755 rtkbt/code/libbt-vendor/include/rtk_btservice.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/rtk_btsnoop_net.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/rtk_hcidefs.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/rtk_parse.h create mode 100755 rtkbt/code/libbt-vendor/include/rtk_poll.h create mode 100755 rtkbt/code/libbt-vendor/include/rtk_socket.h create mode 100755 rtkbt/code/libbt-vendor/include/unused.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/upio.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/userial_vendor.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/include/vnd_buildcfg.h mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/bt_list.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/bt_skbuff.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/hardware.c create mode 100755 rtkbt/code/libbt-vendor/src/hardware_uart.c create mode 100755 rtkbt/code/libbt-vendor/src/hardware_usb.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/hci_h5.c create mode 100755 rtkbt/code/libbt-vendor/src/rtk_btservice.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/rtk_btsnoop_net.c create mode 100755 rtkbt/code/libbt-vendor/src/rtk_heartbeat.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/rtk_parse.c create mode 100755 rtkbt/code/libbt-vendor/src/rtk_poll.c create mode 100755 rtkbt/code/libbt-vendor/src/rtk_socket.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/upio.c mode change 100644 => 100755 rtkbt/code/libbt-vendor/src/userial_vendor.c create mode 100755 rtkbt/code/rtkcmd/Android.mk create mode 100755 rtkbt/code/rtkcmd/rtkcmd.c mode change 100644 => 100755 rtkbt/rtkbt.mk create mode 100755 rtkbt/vendor/firmware_box/fw_info.txt create mode 100755 rtkbt/vendor/firmware_box/rtl8723b_config create mode 100755 rtkbt/vendor/firmware_box/rtl8723b_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8723bs_VQ0_config create mode 100755 rtkbt/vendor/firmware_box/rtl8723bs_VQ0_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8723bs_config create mode 100755 rtkbt/vendor/firmware_box/rtl8723bs_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8723bu_config create mode 100755 rtkbt/vendor/firmware_box/rtl8723d_config create mode 100755 rtkbt/vendor/firmware_box/rtl8723d_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8723ds_config create mode 100755 rtkbt/vendor/firmware_box/rtl8723ds_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8761a_config create mode 100755 rtkbt/vendor/firmware_box/rtl8761a_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8761at_config create mode 100755 rtkbt/vendor/firmware_box/rtl8761at_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8761au8192ee_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8761au8812ae_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8761au_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8761aw8192eu_config create mode 100755 rtkbt/vendor/firmware_box/rtl8761aw8192eu_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8821a_config create mode 100755 rtkbt/vendor/firmware_box/rtl8821a_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8821as_config create mode 100755 rtkbt/vendor/firmware_box/rtl8821as_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8821c_config create mode 100755 rtkbt/vendor/firmware_box/rtl8821c_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8821cs_config create mode 100755 rtkbt/vendor/firmware_box/rtl8821cs_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8822b_config create mode 100755 rtkbt/vendor/firmware_box/rtl8822b_fw create mode 100755 rtkbt/vendor/firmware_box/rtl8822bs_config create mode 100755 rtkbt/vendor/firmware_box/rtl8822bs_fw diff --git a/rtkbt/code/libbt-vendor/Android.mk b/rtkbt/code/libbt-vendor/Android.mk old mode 100644 new mode 100755 index 1945150..ea5fdb6 --- a/rtkbt/code/libbt-vendor/Android.mk +++ b/rtkbt/code/libbt-vendor/Android.mk @@ -5,6 +5,8 @@ include $(CLEAR_VARS) BDROID_DIR := $(TOP_DIR)system/bt LOCAL_SRC_FILES := \ + codec/msbc/sbc.c \ + src/rtk_socket.c \ src/bt_vendor_rtk.c \ src/hardware.c \ src/userial_vendor.c \ @@ -13,10 +15,16 @@ LOCAL_SRC_FILES := \ src/bt_skbuff.c \ src/hci_h5.c \ src/rtk_parse.c \ + src/rtk_btservice.c \ + src/hardware_uart.c \ + src/hardware_usb.c \ + src/rtk_heartbeat.c \ + src/rtk_poll.c \ src/rtk_btsnoop_net.c LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/include \ + $(LOCAL_PATH)/codec/msbc \ $(BDROID_DIR)/hci/include LOCAL_SHARED_LIBRARIES := \ @@ -28,6 +36,5 @@ LOCAL_MODULE := libbt-vendor-realtek LOCAL_MODULE_TAGS := optional LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE_CLASS := SHARED_LIBRARIES -LOCAL_CPPFLAGS := -Werror -Wunused-parameter include $(BUILD_SHARED_LIBRARY) diff --git a/rtkbt/code/libbt-vendor/codec/msbc/sbc.c b/rtkbt/code/libbt-vendor/codec/msbc/sbc.c new file mode 100755 index 0000000..e138e9d --- /dev/null +++ b/rtkbt/code/libbt-vendor/codec/msbc/sbc.c @@ -0,0 +1,1763 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2004-2006 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* todo items: + + use a log2 table for byte integer scale factors calculation (sum log2 results for high and low bytes) + fill bitpool by 16 bits instead of one at a time in bits allocation/bitpool generation + port to the dsp + don't consume more bytes than passed into the encoder + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +//#include +#include +#include +//#include +#include +#include + +#include "sbc.h" +#include "sbc_math.h" +#include "sbc_tables.h" +#include "cutils/log.h" + + +#define SBC_SYNCWORD 0xAD +#define SBC_POOLTAG 'CBSR' + +/* sampling frequency */ +#define SBC_FS_16 0x00 +#define SBC_FS_32 0x01 +#define SBC_FS_44 0x02 +#define SBC_FS_48 0x03 + +/* nrof_blocks */ +#define SBC_NB_4 0x00 +#define SBC_NB_8 0x01 +#define SBC_NB_12 0x02 +#define SBC_NB_16 0x03 + +/* channel mode */ +#define SBC_CM_MONO 0x00 +#define SBC_CM_DUAL_CHANNEL 0x01 +#define SBC_CM_STEREO 0x02 +#define SBC_CM_JOINT_STEREO 0x03 + +/* allocation mode */ +#define SBC_AM_LOUDNESS 0x00 +#define SBC_AM_SNR 0x01 + +/* subbands */ +#define SBC_SB_4 0x00 +#define SBC_SB_8 0x01 + +#define SBC_ALIGN_BITS 4 +#define SBC_ALIGN_MASK ((1 << (SBC_ALIGN_BITS)) - 1) + + +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned int u_int32_t; + +#ifndef UINT +typedef unsigned int UINT; +#endif + + +#if defined(WIN32) && !defined(__cplusplus) + +#define inline __inline + +#endif + +typedef long long sbc_extended_t; +/* +static __inline void sbc_synthesize_four(struct sbc_decoder_state *state, + struct sbc_frame *frame, int ch, int blk); +*/ + + +/* This structure contains an unpacked SBC frame. + Yes, there is probably quite some unused space herein */ +struct sbc_frame +{ + uint16_t sampling_frequency; /* in kHz */ + unsigned char blocks; + enum { + MONO = SBC_CM_MONO, + DUAL_CHANNEL = SBC_CM_DUAL_CHANNEL, + STEREO = SBC_CM_STEREO, + JOINT_STEREO = SBC_CM_JOINT_STEREO + } channel_mode; + uint8_t channels; + enum { + LOUDNESS = SBC_AM_LOUDNESS, + SNR = SBC_AM_SNR + } allocation_method; + uint8_t subbands; + uint8_t bitpool; + uint8_t join; /* bit number x set means joint stereo has been used in subband x */ + int scale_factor[2][8]; /* only the lower 4 bits of every element are to be used */ + uint16_t audio_sample[16][2][8]; /* raw integer subband samples in the frame */ + + int sb_sample_f[16][2][8]; + int sb_sample[16][2][8]; /* modified subband samples */ + short pcm_sample[2][16*8]; /* original pcm audio samples */ +}; + +struct sbc_decoder_state { + int subbands; + long long V[2][170]; + int offset[2][16]; +}; + +struct sbc_encoder_state { + int subbands; + int32_t X[2][80]; +}; + +/* + * Calculates the CRC-8 of the first len bits in data + */ +static const uint8_t crc_table[256] = { + 0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53, + 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, + 0xCD, 0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E, + 0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B, 0x76, + 0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4, + 0x6F, 0x72, 0x55, 0x48, 0x1B, 0x06, 0x21, 0x3C, + 0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19, + 0xA2, 0xBF, 0x98, 0x85, 0xD6, 0xCB, 0xEC, 0xF1, + 0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40, + 0xFB, 0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8, + 0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90, 0x8D, + 0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65, + 0x94, 0x89, 0xAE, 0xB3, 0xE0, 0xFD, 0xDA, 0xC7, + 0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F, + 0x59, 0x44, 0x63, 0x7E, 0x2D, 0x30, 0x17, 0x0A, + 0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2, + 0x26, 0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75, + 0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80, 0x9D, + 0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8, + 0x03, 0x1E, 0x39, 0x24, 0x77, 0x6A, 0x4D, 0x50, + 0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2, + 0x49, 0x54, 0x73, 0x6E, 0x3D, 0x20, 0x07, 0x1A, + 0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F, + 0x84, 0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7, + 0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B, 0x66, + 0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E, + 0xF8, 0xE5, 0xC2, 0xDF, 0x8C, 0x91, 0xB6, 0xAB, + 0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, + 0xB2, 0xAF, 0x88, 0x95, 0xC6, 0xDB, 0xFC, 0xE1, + 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09, + 0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, + 0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFE, 0xD9, 0xC4 +}; + +static uint8_t sbc_crc8(const uint8_t * data, size_t len) +{ + uint8_t crc = 0x0f; + size_t i; + uint8_t octet; + + for (i = 0; i < len / 8; i++) + crc = crc_table[crc ^ data[i]]; + + octet = data[i]; + for (i = 0; i < len % 8; i++) + { + char bit = ((octet ^ crc) & 0x80) >> 7; + + crc = ((crc & 0x7f) << 1) ^ (bit ? 0x1d : 0); + + octet = octet << 1; + } + + return crc; +} + +/* + * Code straight from the spec to calculate the bits array + * Takes a pointer to the frame in question, a pointer to the bits array and the sampling frequency (as 2 bit integer) + */ +static void sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8], uint8_t sf) +{ + if (frame->channel_mode == MONO || frame->channel_mode == DUAL_CHANNEL) + { + int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; + int ch, sb; + + for (ch = 0; ch < frame->channels; ch++) + { + if (frame->allocation_method == SNR) + { + for (sb = 0; sb < frame->subbands; sb++) + { + bitneed[ch][sb] = frame->scale_factor[ch][sb]; + } + } + + else + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (frame->scale_factor[ch][sb] == 0) + { + bitneed[ch][sb] = -5; + } + else + { + if (frame->subbands == 4) + { + loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; + } + + else + { + loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; + } + + if (loudness > 0) + { + bitneed[ch][sb] = loudness / 2; + } + + else + { + bitneed[ch][sb] = loudness; + } + } + } + } + + max_bitneed = 0; + for (sb = 0; sb < frame->subbands; sb++) + { + if (bitneed[ch][sb] > max_bitneed) + max_bitneed = bitneed[ch][sb]; + } + + bitcount = 0; + slicecount = 0; + bitslice = max_bitneed + 1; + do + { + bitslice--; + bitcount += slicecount; + slicecount = 0; + for (sb = 0; sb < frame->subbands; sb++) + { + if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) + { + slicecount++; + } + + else if (bitneed[ch][sb] == bitslice + 1) + { + slicecount += 2; + } + } + } while (bitcount + slicecount < frame->bitpool); + + if (bitcount + slicecount == frame->bitpool) + { + bitcount += slicecount; + bitslice--; + } + + for (sb = 0; sb < frame->subbands; sb++) + { + if (bitneed[ch][sb] < bitslice + 2) + { + bits[ch][sb] = 0; + } + + else + { + bits[ch][sb] = bitneed[ch][sb] - bitslice; + if (bits[ch][sb] > 16) + bits[ch][sb] = 16; + } + } + + sb = 0; + while (bitcount < frame->bitpool && sb < frame->subbands) + { + if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) + { + bits[ch][sb]++; + bitcount++; + } + + else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) + { + bits[ch][sb] = 2; + bitcount += 2; + } + sb++; + } + + sb = 0; + while (bitcount < frame->bitpool && sb < frame->subbands) + { + if (bits[ch][sb] < 16) + { + bits[ch][sb]++; + bitcount++; + } + sb++; + } + + } + + } + + else if (frame->channel_mode == STEREO || frame->channel_mode == JOINT_STEREO) + { + int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; + int ch, sb; + + if (frame->allocation_method == SNR) + { + for (ch = 0; ch < 2; ch++) { + for (sb = 0; sb < frame->subbands; sb++) + { + bitneed[ch][sb] = frame->scale_factor[ch][sb]; + } + } + } + + else + { + for (ch = 0; ch < 2; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (frame->scale_factor[ch][sb] == 0) + { + bitneed[ch][sb] = -5; + } + + else + { + if (frame->subbands == 4) + { + loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; + } + + else + { + loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; + } + + if (loudness > 0) + { + bitneed[ch][sb] = loudness / 2; + } + + else + { + bitneed[ch][sb] = loudness; + } + } + } + } + } + + max_bitneed = 0; + for (ch = 0; ch < 2; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (bitneed[ch][sb] > max_bitneed) + max_bitneed = bitneed[ch][sb]; + } + } + + bitcount = 0; + slicecount = 0; + bitslice = max_bitneed + 1; + do { + bitslice--; + bitcount += slicecount; + slicecount = 0; + for (ch = 0; ch < 2; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) + { + slicecount++; + } + + else if (bitneed[ch][sb] == bitslice + 1) + { + slicecount += 2; + } + } + } + } while (bitcount + slicecount < frame->bitpool); + + if (bitcount + slicecount == frame->bitpool) + { + bitcount += slicecount; + bitslice--; + } + + for (ch = 0; ch < 2; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (bitneed[ch][sb] < bitslice + 2) + { + bits[ch][sb] = 0; + } + + else + { + bits[ch][sb] = bitneed[ch][sb] - bitslice; + if (bits[ch][sb] > 16) + bits[ch][sb] = 16; + } + } + } + + ch = 0; + sb = 0; + while ((bitcount < frame->bitpool) && (sb < frame->subbands)) + { + if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) + { + bits[ch][sb]++; + bitcount++; + } + + else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) + { + bits[ch][sb] = 2; + bitcount += 2; + } + if (ch == 1) + { + ch = 0; + sb++; + } + else + { + ch = 1; + } + } + + ch = 0; + sb = 0; + while ((bitcount < frame->bitpool) && (sb < frame->subbands)) + { + if (bits[ch][sb] < 16) + { + bits[ch][sb]++; + bitcount++; + } + if (ch == 1) + { + ch = 0; + sb++; + } + + else + { + ch = 1; + } + } + + } +} + +/* + * Unpacks a SBC frame at the beginning of the stream in data, + * which has at most len bytes into frame. + * Returns the length in bytes of the packed frame, or a negative + * value on error. The error codes are: + * + * -1 Data stream too short + * -2 Sync byte incorrect + * -3 CRC8 incorrect + * -4 Bitpool value out of bounds + */ +static int sbc_unpack_frame(const uint8_t * data, struct sbc_frame *frame, size_t len) +{ + UINT consumed; + /* Will copy the parts of the header that are relevant to crc calculation here */ + uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int crc_pos = 0; + int32_t temp; + + uint8_t sf; /* sampling_frequency, temporarily needed as array index */ + +// int audio_sample; + int ch, sb, blk, bit; /* channel, subband, block and bit standard counters */ + int bits[2][8]; /* bits distribution */ + int levels[2][8]; /* levels derived from that */ + + if (len < 4) + { + //DbgPrint("Exit when len < 4\n"); + return -1; + } + + if (data[0] != SBC_SYNCWORD) + { + //DbgPrint("Exit when data[0] != SBC_SYNCWORD\n"); + return -2; + } + +#if 0 + sf = (data[1] >> 6) & 0x03; + switch (sf) { + case SBC_FS_16: + frame->sampling_frequency = 16000; + break; + case SBC_FS_32: + frame->sampling_frequency = 32000; + break; + case SBC_FS_44: + frame->sampling_frequency = 44100; + break; + case SBC_FS_48: + frame->sampling_frequency = 48000; + break; + } + + switch ((data[1] >> 4) & 0x03) { + case SBC_NB_4: + frame->blocks = 4; + break; + case SBC_NB_8: + frame->blocks = 8; + break; + case SBC_NB_12: + frame->blocks = 12; + break; + case SBC_NB_16: + frame->blocks = 16; + break; + } + + frame->channel_mode = (data[1] >> 2) & 0x03; + switch (frame->channel_mode) { + case MONO: + frame->channels = 1; + break; + case DUAL_CHANNEL: /* fall-through */ + case STEREO: + case JOINT_STEREO: + frame->channels = 2; + break; + } + + frame->allocation_method = (data[1] >> 1) & 0x01; + frame->subbands = (data[1] & 0x01) ? 8 : 4; + frame->bitpool = data[2]; +#endif + + frame->sampling_frequency = 16000; + frame->blocks = 15; + frame->channel_mode = MONO; + frame->channels = 1; + frame->allocation_method = SBC_AM_LOUDNESS; + frame->subbands = 8; + frame->bitpool = 26; + + + if (((frame->channel_mode == MONO || frame->channel_mode == DUAL_CHANNEL) + && frame->bitpool > 16 * frame->subbands) + || ((frame->channel_mode == STEREO || frame->channel_mode == JOINT_STEREO) + && frame->bitpool > 32 * frame->subbands)) + { + //DbgPrint("Exit when frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&" + // "frame->bitpool > 16 * frame->subbands\n"); + return -4; + } + + /* data[3] is crc, we're checking it later */ + consumed = 32; +#if 1 + crc_header[0] = data[1]; + crc_header[1] = data[2]; +#endif + +#if 0 + crc_header[0] = 0x31; + crc_header[1] = 0x1a; +#endif + + crc_pos = 16; + + if (frame->channel_mode == JOINT_STEREO) + { + if (len * 8 < consumed + frame->subbands) + return -1; + + frame->join = 0x00; + for (sb = 0; sb < frame->subbands - 1; sb++) { + frame->join |= ((data[4] >> (7 - sb)) & 0x01) << sb; + } + if (frame->subbands == 4) { + crc_header[crc_pos / 8] = data[4] & 0xf0; + } else { + crc_header[crc_pos / 8] = data[4]; + } + + consumed += frame->subbands; + crc_pos += frame->subbands; + } + + if (len * 8 < consumed + (4 * frame->subbands * frame->channels)) + { + //DbgPrint("len * 8 < consumed + (4 * frame->subbands * frame->channels\n"); + return -1; + } + + for (ch = 0; ch < frame->channels; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + /* FIXME assert(consumed % 4 == 0); */ + frame->scale_factor[ch][sb] = (data[consumed >> 3] >> (4 - (consumed & 0x7))) & 0x0F; + crc_header[crc_pos >> 3] |= frame->scale_factor[ch][sb] << (4 - (crc_pos & 0x7)); + + consumed += 4; + crc_pos += 4; + } + } + + if (data[3] != sbc_crc8(crc_header, crc_pos)) + { + ALOGD("sbc_crc %02x -> %02x\n",data[3],sbc_crc8(crc_header, crc_pos)); + return -3; + } + + sf = SBC_FS_16; + sbc_calculate_bits(frame, bits, sf); + + for (ch = 0; ch < frame->channels; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + levels[ch][sb] = (1 << bits[ch][sb]) - 1; + } + } +#if 0 + for (blk = 0; blk < frame->blocks; blk++) + { + for (ch = 0; ch < frame->channels; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (levels[ch][sb] > 0) + { + audio_sample = 0; + for (bit = 0; bit < bits[ch][sb]; bit++) + { + if (consumed > len * 8) + { + LogEvent("Exit when consumed > len * 8\n"); + return -1; + } + + if ((data[consumed >> 3] >> (7 - (consumed & 0x7))) & 0x01) + audio_sample |= 1 << (bits[ch][sb] - bit - 1); + + consumed++; + } + + frame->sb_sample[blk][ch][sb] = + (((audio_sample << 1) | 1) << frame->scale_factor[ch][sb]) / + levels[ch][sb] - (1 << frame->scale_factor[ch][sb]); + } + + else + frame->sb_sample[blk][ch][sb] = 0; + } + } + } +#endif + +#if 1 + + for (blk = 0; blk < frame->blocks; blk++) + { + for (ch = 0; ch < frame->channels; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + frame->audio_sample[blk][ch][sb] = 0; + if (bits[ch][sb] == 0) + continue; + + for (bit = 0; bit < bits[ch][sb]; bit++) + { + int b; /* A bit */ + if (consumed > len * 8) + return -1; + + b = (data[consumed >> 3] >> (7 - (consumed & 0x7))) & 0x01; + frame->audio_sample[blk][ch][sb] |= b << (bits[ch][sb] - bit - 1); + + consumed++; + } + } + } + } + + for (blk = 0; blk < frame->blocks; blk++) + { + for (ch = 0; ch < frame->channels; ch++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (levels[ch][sb] > 0) + { + frame->sb_sample[blk][ch][sb] = + (((frame->audio_sample[blk][ch][sb] << 16) | 0x8000) / levels[ch][sb]) - 0x8000; + + frame->sb_sample[blk][ch][sb] >>= 3; + frame->sb_sample[blk][ch][sb] = (frame->sb_sample[blk][ch][sb] << (frame->scale_factor[ch][sb] + 1)); // Q13 + } + else + { + frame->sb_sample[blk][ch][sb] = 0; + } + } + } + } +#endif + + if (frame->channel_mode == JOINT_STEREO) + { + for (blk = 0; blk < frame->blocks; blk++) + { + for (sb = 0; sb < frame->subbands; sb++) + { + if (frame->join & (0x01 << sb)) { + temp = frame->sb_sample[blk][0][sb] + frame->sb_sample[blk][1][sb]; + frame->sb_sample[blk][1][sb] = frame->sb_sample[blk][0][sb] - frame->sb_sample[blk][1][sb]; + frame->sb_sample[blk][0][sb] = temp; + } + } + } + } + + if ((consumed & 0x7) != 0) + consumed += 8 - (consumed & 0x7); + + + return consumed >> 3; +} + +static void sbc_decoder_init(struct sbc_decoder_state *state, const struct sbc_frame *frame) +{ + int i, ch; + + memset(state->V, 0, sizeof(state->V)); + state->subbands = frame->subbands; + + for (ch = 0; ch < 2; ch++) + for (i = 0; i < frame->subbands * 2; i++) + state->offset[ch][i] = (10 * i + 10); +} + +static __inline void sbc_synthesize_four(struct sbc_decoder_state *state, + struct sbc_frame *frame, int ch, int blk) +{ + int i, j, k, idx; + sbc_extended_t res; + + for(i = 0; i < 8; i++) { + /* Shifting */ + state->offset[ch][i]--; + if(state->offset[ch][i] < 0) { + state->offset[ch][i] = 79; + for(j = 0; j < 9; j++) { + state->V[ch][j+80] = state->V[ch][j]; + } + } + } + + + for(i = 0; i < 8; i++) { + /* Distribute the new matrix value to the shifted position */ + SBC_FIXED_0(res); + for (j = 0; j < 4; j++) { + MULA(res, synmatrix4[i][j], frame->sb_sample[blk][ch][j]); + } + state->V[ch][state->offset[ch][i]] = SCALE4_STAGED1(res); + } + + /* Compute the samples */ + for(idx = 0, i = 0; i < 4; i++) { + k = (i + 4) & 0xf; + SBC_FIXED_0(res); + for(j = 0; j < 10; idx++) { + MULA(res, state->V[ch][state->offset[ch][i]+j++], sbc_proto_4_40m0[idx]); + MULA(res, state->V[ch][state->offset[ch][k]+j++], sbc_proto_4_40m1[idx]); + } + /* Store in output */ + frame->pcm_sample[ch][blk * 4 + i] = (short)SCALE4_STAGED2(res); // Q0 + } +} + +static __inline void sbc_synthesize_eight(struct sbc_decoder_state *state, + struct sbc_frame *frame, int ch, int blk) +{ + int i, j, k, idx; + sbc_extended_t res; + + for(i = 0; i < 16; i++) { + /* Shifting */ + state->offset[ch][i]--; + if(state->offset[ch][i] < 0) { + state->offset[ch][i] = 159; + for(j = 0; j < 9; j++) { + state->V[ch][j+160] = state->V[ch][j]; + } + } + } + + for(i = 0; i < 16; i++) { + /* Distribute the new matrix value to the shifted position */ + SBC_FIXED_0(res); + for (j = 0; j < 8; j++) { + MULA(res, synmatrix8[i][j], frame->sb_sample[blk][ch][j]); // Q28 = Q15 * Q13 + } + state->V[ch][state->offset[ch][i]] = SCALE8_STAGED1(res); // Q10 + } + + + /* Compute the samples */ + for(idx = 0, i = 0; i < 8; i++) { + k = (i + 8) & 0xf; + SBC_FIXED_0(res); + for(j = 0; j < 10; idx++) { + MULA(res, state->V[ch][state->offset[ch][i]+j++], sbc_proto_8_80m0[idx]); + MULA(res, state->V[ch][state->offset[ch][k]+j++], sbc_proto_8_80m1[idx]); + } + /* Store in output */ + frame->pcm_sample[ch][blk * 8 + i] = (short)SCALE8_STAGED2(res); // Q0 + + } +} + +static int sbc_synthesize_audio(struct sbc_decoder_state *state, struct sbc_frame *frame) +{ + int ch, blk; + + switch (frame->subbands) { + case 4: + for (ch = 0; ch < frame->channels; ch++) { + for (blk = 0; blk < frame->blocks; blk++) + sbc_synthesize_four(state, frame, ch, blk); + } + return frame->blocks * 4; + + case 8: + for (ch = 0; ch < frame->channels; ch++) { + for (blk = 0; blk < frame->blocks; blk++) + sbc_synthesize_eight(state, frame, ch, blk); + } + return frame->blocks * 8; + + default: + return -EIO; + } +} + +static void sbc_encoder_init(struct sbc_encoder_state *state, const struct sbc_frame *frame) +{ + memset(&state->X, 0, sizeof(state->X)); + state->subbands = frame->subbands; +} + +static __inline void _sbc_analyze_four(const int32_t *in, int32_t *out) +{ + + sbc_extended_t res; + sbc_extended_t t[8]; + + out[0] = out[1] = out[2] = out[3] = 0; + + MUL(res, _sbc_proto_4[0], (in[8] - in[32])); // Q18 + MULA(res, _sbc_proto_4[1], (in[16] - in[24])); + t[0] = SCALE4_STAGE1(res); // Q8 + + MUL(res, _sbc_proto_4[2], in[1]); + MULA(res, _sbc_proto_4[3], in[9]); + MULA(res, _sbc_proto_4[4], in[17]); + MULA(res, _sbc_proto_4[5], in[25]); + MULA(res, _sbc_proto_4[6], in[33]); + t[1] = SCALE4_STAGE1(res); + + MUL(res, _sbc_proto_4[7], in[2]); + MULA(res, _sbc_proto_4[8], in[10]); + MULA(res, _sbc_proto_4[9], in[18]); + MULA(res, _sbc_proto_4[10], in[26]); + MULA(res, _sbc_proto_4[11], in[34]); + t[2] = SCALE4_STAGE1(res); + + MUL(res, _sbc_proto_4[12], in[3]); + MULA(res, _sbc_proto_4[13], in[11]); + MULA(res, _sbc_proto_4[14], in[19]); + MULA(res, _sbc_proto_4[15], in[27]); + MULA(res, _sbc_proto_4[16], in[35]); + t[3] = SCALE4_STAGE1(res); + + MUL(res, _sbc_proto_4[17], in[4]); + MULA(res, _sbc_proto_4[18], (in[12] + in[28])); + MULA(res, _sbc_proto_4[19], in[20]); + MULA(res, _sbc_proto_4[17], in[36]); + t[4] = SCALE4_STAGE1(res); + + MUL(res, _sbc_proto_4[16], in[5]); + MULA(res, _sbc_proto_4[15], in[13]); + MULA(res, _sbc_proto_4[14], in[21]); + MULA(res, _sbc_proto_4[13], in[29]); + MULA(res, _sbc_proto_4[12], in[37]); + t[5] = SCALE4_STAGE1(res); + + MUL(res, _sbc_proto_4[11], in[6]); + MULA(res, _sbc_proto_4[10], in[14]); + MULA(res, _sbc_proto_4[9], in[22]); + MULA(res, _sbc_proto_4[8], in[30]); + MULA(res, _sbc_proto_4[7], in[38]); + t[6] = SCALE4_STAGE1(res); + + MUL(res, _sbc_proto_4[6], in[7]); + MULA(res, _sbc_proto_4[5], in[15]); + MULA(res, _sbc_proto_4[4], in[23]); + MULA(res, _sbc_proto_4[3], in[31]); + MULA(res, _sbc_proto_4[2], in[39]); + t[7] = SCALE4_STAGE1(res); + + MUL(res, _anamatrix4[0], t[0]); + MULA(res, _anamatrix4[1], t[1]); + MULA(res, _anamatrix4[2], t[2]); + MULA(res, _anamatrix4[1], t[3]); + MULA(res, _anamatrix4[0], t[4]); + MULA(res, _anamatrix4[3], t[5]); + MULA(res, -_anamatrix4[3], t[7]); + out[0] = (int)SCALE4_STAGE2(res); // Q0 + + MUL(res, -_anamatrix4[0], t[0]); + MULA(res, _anamatrix4[3], t[1]); + MULA(res, _anamatrix4[2], t[2]); + MULA(res, _anamatrix4[3], t[3]); + MULA(res, -_anamatrix4[0], t[4]); + MULA(res, -_anamatrix4[1], t[5]); + MULA(res, _anamatrix4[1], t[7]); + out[1] = (int)SCALE4_STAGE2(res); + + + MUL(res, -_anamatrix4[0], t[0]); + MULA(res, -_anamatrix4[3], t[1]); + MULA(res, _anamatrix4[2], t[2]); + MULA(res, -_anamatrix4[3], t[3]); + MULA(res, -_anamatrix4[0], t[4]); + MULA(res, _anamatrix4[1], t[5]); + MULA(res, -_anamatrix4[1], t[7]); + out[2] = (int)SCALE4_STAGE2(res); + + MUL(res, _anamatrix4[0], t[0]); + MULA(res, -_anamatrix4[1], t[1]); + MULA(res, _anamatrix4[2], t[2]); + MULA(res, -_anamatrix4[1], t[3]); + MULA(res, _anamatrix4[0], t[4]); + MULA(res, -_anamatrix4[3], t[5]); + MULA(res, _anamatrix4[3], t[7]); + out[3] = (int)SCALE4_STAGE2(res); +} +static __inline void sbc_analyze_four(struct sbc_encoder_state *state, + struct sbc_frame *frame, int ch, int blk) +{ + int i; + /* Input 4 New Audio Samples */ + for (i = 39; i >= 4; i--) + state->X[ch][i] = state->X[ch][i - 4]; + for (i = 3; i >= 0; i--) + state->X[ch][i] = frame->pcm_sample[ch][blk * 4 + (3 - i)]; + _sbc_analyze_four(state->X[ch], frame->sb_sample_f[blk][ch]); +} + +static __inline void _sbc_analyze_eight(const int32_t *in, int32_t *out) +{ + sbc_extended_t res; + sbc_extended_t t[8]; + + out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0; + + MUL(res, _sbc_proto_8[0], (in[16] - in[64])); // Q18 = Q18 * Q0 + MULA(res, _sbc_proto_8[1], (in[32] - in[48])); + MULA(res, _sbc_proto_8[2], in[4]); + MULA(res, _sbc_proto_8[3], in[20]); + MULA(res, _sbc_proto_8[4], in[36]); + MULA(res, _sbc_proto_8[5], in[52]); + t[0] = SCALE8_STAGE1(res); // Q10 + + MUL(res, _sbc_proto_8[6], in[2]); + MULA(res, _sbc_proto_8[7], in[18]); + MULA(res, _sbc_proto_8[8], in[34]); + MULA(res, _sbc_proto_8[9], in[50]); + MULA(res, _sbc_proto_8[10], in[66]); + t[1] = SCALE8_STAGE1(res); + + MUL(res, _sbc_proto_8[11], in[1]); + MULA(res, _sbc_proto_8[12], in[17]); + MULA(res, _sbc_proto_8[13], in[33]); + MULA(res, _sbc_proto_8[14], in[49]); + MULA(res, _sbc_proto_8[15], in[65]); + MULA(res, _sbc_proto_8[16], in[3]); + MULA(res, _sbc_proto_8[17], in[19]); + MULA(res, _sbc_proto_8[18], in[35]); + MULA(res, _sbc_proto_8[19], in[51]); + MULA(res, _sbc_proto_8[20], in[67]); + t[2] = SCALE8_STAGE1(res); + + MUL(res, _sbc_proto_8[21], in[5]); + MULA(res, _sbc_proto_8[22], in[21]); + MULA(res, _sbc_proto_8[23], in[37]); + MULA(res, _sbc_proto_8[24], in[53]); + MULA(res, _sbc_proto_8[25], in[69]); + MULA(res, -_sbc_proto_8[15], in[15]); + MULA(res, -_sbc_proto_8[14], in[31]); + MULA(res, -_sbc_proto_8[13], in[47]); + MULA(res, -_sbc_proto_8[12], in[63]); + MULA(res, -_sbc_proto_8[11], in[79]); + t[3] = SCALE8_STAGE1(res); + + MUL(res, _sbc_proto_8[26], in[6]); + MULA(res, _sbc_proto_8[27], in[22]); + MULA(res, _sbc_proto_8[28], in[38]); + MULA(res, _sbc_proto_8[29], in[54]); + MULA(res, _sbc_proto_8[30], in[70]); + MULA(res, -_sbc_proto_8[10], in[14]); + MULA(res, -_sbc_proto_8[9], in[30]); + MULA(res, -_sbc_proto_8[8], in[46]); + MULA(res, -_sbc_proto_8[7], in[62]); + MULA(res, -_sbc_proto_8[6], in[78]); + t[4] = SCALE8_STAGE1(res); + + MUL(res, _sbc_proto_8[31], in[7]); + MULA(res, _sbc_proto_8[32], in[23]); + MULA(res, _sbc_proto_8[33], in[39]); + MULA(res, _sbc_proto_8[34], in[55]); + MULA(res, _sbc_proto_8[35], in[71]); + MULA(res, -_sbc_proto_8[20], in[13]); + MULA(res, -_sbc_proto_8[19], in[29]); + MULA(res, -_sbc_proto_8[18], in[45]); + MULA(res, -_sbc_proto_8[17], in[61]); + MULA(res, -_sbc_proto_8[16], in[77]); + t[5] = SCALE8_STAGE1(res); + + MUL(res, _sbc_proto_8[36], (in[8] + in[72])); + MULA(res, _sbc_proto_8[37], in[24]); + MULA(res, _sbc_proto_8[38], in[40]); + MULA(res, _sbc_proto_8[37], in[56]); + MULA(res, -_sbc_proto_8[39], in[12]); + MULA(res, -_sbc_proto_8[5], in[28]); + MULA(res, -_sbc_proto_8[4], in[44]); + MULA(res, -_sbc_proto_8[3], in[60]); + MULA(res, -_sbc_proto_8[2], in[76]); + t[6] = SCALE8_STAGE1(res); + + MUL(res, _sbc_proto_8[35], in[9]); + MULA(res, _sbc_proto_8[34], in[25]); + MULA(res, _sbc_proto_8[33], in[41]); + MULA(res, _sbc_proto_8[32], in[57]); + MULA(res, _sbc_proto_8[31], in[73]); + MULA(res, -_sbc_proto_8[25], in[11]); + MULA(res, -_sbc_proto_8[24], in[27]); + MULA(res, -_sbc_proto_8[23], in[43]); + MULA(res, -_sbc_proto_8[22], in[59]); + MULA(res, -_sbc_proto_8[21], in[75]); + t[7] = SCALE8_STAGE1(res); + + MUL(res, _anamatrix8[0], t[0]); // = Q14 * Q10 + MULA(res, _anamatrix8[7], t[1]); + MULA(res, _anamatrix8[2], t[2]); + MULA(res, _anamatrix8[3], t[3]); + MULA(res, _anamatrix8[6], t[4]); + MULA(res, _anamatrix8[4], t[5]); + MULA(res, _anamatrix8[1], t[6]); + MULA(res, _anamatrix8[5], t[7]); + out[0] = (int)SCALE8_STAGE2(res); // Q0 + + MUL(res, _anamatrix8[1], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, _anamatrix8[3], t[2]); + MULA(res, -_anamatrix8[5], t[3]); + MULA(res, -_anamatrix8[6], t[4]); + MULA(res, -_anamatrix8[2], t[5]); + MULA(res, -_anamatrix8[0], t[6]); + MULA(res, -_anamatrix8[4], t[7]); + out[1] = (int)SCALE8_STAGE2(res); + + MUL(res, -_anamatrix8[1], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, _anamatrix8[4], t[2]); + MULA(res, -_anamatrix8[2], t[3]); + MULA(res, -_anamatrix8[6], t[4]); + MULA(res, _anamatrix8[5], t[5]); + MULA(res, _anamatrix8[0], t[6]); + MULA(res, _anamatrix8[3], t[7]); + out[2] = (int)SCALE8_STAGE2(res); + + MUL(res, -_anamatrix8[0], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, _anamatrix8[5], t[2]); + MULA(res, -_anamatrix8[4], t[3]); + MULA(res, _anamatrix8[6], t[4]); + MULA(res, _anamatrix8[3], t[5]); + MULA(res, -_anamatrix8[1], t[6]); + MULA(res, -_anamatrix8[2], t[7]); + out[3] = (int)SCALE8_STAGE2(res); + + MUL(res, -_anamatrix8[0], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, -_anamatrix8[5], t[2]); + MULA(res, _anamatrix8[4], t[3]); + MULA(res, _anamatrix8[6], t[4]); + MULA(res, -_anamatrix8[3], t[5]); + MULA(res, -_anamatrix8[1], t[6]); + MULA(res, _anamatrix8[2], t[7]); + out[4] = (int)SCALE8_STAGE2(res); + + MUL(res, -_anamatrix8[1], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, -_anamatrix8[4], t[2]); + MULA(res, _anamatrix8[2], t[3]); + MULA(res, -_anamatrix8[6], t[4]); + MULA(res, -_anamatrix8[5], t[5]); + MULA(res, _anamatrix8[0], t[6]); + MULA(res, -_anamatrix8[3], t[7]); + out[5] = (int)SCALE8_STAGE2(res); + + MUL(res, _anamatrix8[1], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, -_anamatrix8[3], t[2]); + MULA(res, _anamatrix8[5], t[3]); + MULA(res, -_anamatrix8[6], t[4]); + MULA(res, _anamatrix8[2], t[5]); + MULA(res, -_anamatrix8[0], t[6]); + MULA(res, _anamatrix8[4], t[7]); + out[6] = (int)SCALE8_STAGE2(res); + + MUL(res, _anamatrix8[0], t[0]); + MULA(res, _anamatrix8[7], t[1]); + MULA(res, -_anamatrix8[2], t[2]); + MULA(res, -_anamatrix8[3], t[3]); + MULA(res, _anamatrix8[6], t[4]); + MULA(res, -_anamatrix8[4], t[5]); + MULA(res, _anamatrix8[1], t[6]); + MULA(res, -_anamatrix8[5], t[7]); + out[7] = (int)SCALE8_STAGE2(res); +} + +static __inline void sbc_analyze_eight(struct sbc_encoder_state *state, + struct sbc_frame *frame, int ch, int blk) +{ + int i; + + /* Input 8 Audio Samples */ + for (i = 79; i >= 8; i--) + state->X[ch][i] = state->X[ch][i - 8]; + for (i = 7; i >= 0; i--) + state->X[ch][i] = frame->pcm_sample[ch][blk * 8 + (7 - i)]; + _sbc_analyze_eight(state->X[ch], frame->sb_sample_f[blk][ch]); +} + +static int sbc_analyze_audio(struct sbc_encoder_state *state, struct sbc_frame *frame) +{ + int ch, blk; + + switch (frame->subbands) + { + case 4: + for (ch = 0; ch < frame->channels; ch++) + for (blk = 0; blk < frame->blocks; blk++) { + sbc_analyze_four(state, frame, ch, blk); + } + return frame->blocks * 4; + + case 8: + for (ch = 0; ch < frame->channels; ch++) + for (blk = 0; blk < frame->blocks; blk++) { + sbc_analyze_eight(state, frame, ch, blk); + } + return frame->blocks * 8; + + default: + return -EIO; + } +} + +/* + * Packs the SBC frame from frame into the memory at data. At most len + * bytes will be used, should more memory be needed an appropriate + * error code will be returned. Returns the length of the packed frame + * on success or a negative value on error. + * + * The error codes are: + * -1 Not enough memory reserved + * -2 Unsupported sampling rate + * -3 Unsupported number of blocks + * -4 Unsupported number of subbands + * -5 Bitpool value out of bounds + * -99 not implemented + */ + +static int sbc_pack_frame(uint8_t * data, struct sbc_frame *frame, size_t len) +{ + size_t produced; + /* Will copy the header parts for CRC-8 calculation here */ + uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int crc_pos = 0; + + uint8_t sf; /* Sampling frequency as temporary value for table lookup */ + + int ch, sb, blk, bit; /* channel, subband, block and bit counters */ + int bits[2][8]; /* bits distribution */ + int levels[2][8]; /* levels are derived from that */ + + u_int32_t scalefactor[2][8]; /* derived from frame->scale_factor */ + + if (len < 4) + { + return -1; + } + + /* Clear first 4 bytes of data (that's the constant length part of the SBC header) */ + memset(data, 0, 4); + + data[0] = SBC_SYNCWORD; + + if (frame->sampling_frequency == 16000) + { + data[1] |= (SBC_FS_16 & 0x03) << 6; + sf = SBC_FS_16; + } + else if (frame->sampling_frequency == 32000) + { + data[1] |= (SBC_FS_32 & 0x03) << 6; + sf = SBC_FS_32; + } + else if (frame->sampling_frequency == 44100) + { + data[1] |= (SBC_FS_44 & 0x03) << 6; + sf = SBC_FS_44; + } + else if (frame->sampling_frequency == 48000) + { + data[1] |= (SBC_FS_48 & 0x03) << 6; + sf = SBC_FS_48; + } + else + { + return -2; + } + + switch (frame->blocks) + { + case 4: + data[1] |= (SBC_NB_4 & 0x03) << 4; + break; + case 8: + data[1] |= (SBC_NB_8 & 0x03) << 4; + break; + case 12: + data[1] |= (SBC_NB_12 & 0x03) << 4; + break; + case 15: + data[1] |= (SBC_NB_16 & 0x03) << 4; + break; + default: + return -3; + break; + } + + data[1] |= (frame->channel_mode & 0x03) << 2; + + data[1] |= (frame->allocation_method & 0x01) << 1; + + switch (frame->subbands) { + case 4: + /* Nothing to do */ + break; + case 8: + data[1] |= 0x01; + break; + default: + return -4; + break; + } + + data[2] = frame->bitpool; + if (((frame->channel_mode == MONO || frame->channel_mode == DUAL_CHANNEL) + && frame->bitpool > 16 * frame->subbands) + || ((frame->channel_mode == STEREO || frame->channel_mode == JOINT_STEREO) + && frame->bitpool > 32 * frame->subbands)) { + return -5; + } + + /* Can't fill in crc yet */ + + produced = 32; + + // evan. + data[1] = 0x00; + data[2] = 0x00; + + crc_header[0] = data[1]; + crc_header[1] = data[2]; + crc_pos = 16; + + + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + frame->scale_factor[ch][sb] = 0; + scalefactor[ch][sb] = 2; + for (blk = 0; blk < frame->blocks; blk++) { + while (scalefactor[ch][sb] < (u_int32_t)fabs(frame->sb_sample_f[blk][ch][sb])) { + frame->scale_factor[ch][sb]++; + scalefactor[ch][sb] *= 2; + } + } + } + } + + if (frame->channel_mode == JOINT_STEREO) { + int32_t sb_sample_j[16][2][7]; /* like frame->sb_sample but joint stereo */ + u_int32_t scalefactor_j[2][7], scale_factor_j[2][7]; /* scalefactor and scale_factor in joint case */ + + /* Calculate joint stereo signal */ + for (sb = 0; sb < frame->subbands - 1; sb++) { + for (blk = 0; blk < frame->blocks; blk++) { + sb_sample_j[blk][0][sb] = (frame->sb_sample_f[blk][0][sb] + frame->sb_sample_f[blk][1][sb]) >> 1; + sb_sample_j[blk][1][sb] = (frame->sb_sample_f[blk][0][sb] - frame->sb_sample_f[blk][1][sb]) >> 1; + } + } + + /* calculate scale_factor_j and scalefactor_j for joint case */ + for (ch = 0; ch < 2; ch++) { + for (sb = 0; sb < frame->subbands - 1; sb++) { + scale_factor_j[ch][sb] = 0; + scalefactor_j[ch][sb] = 2; + for (blk = 0; blk < frame->blocks; blk++) { + while (scalefactor_j[ch][sb] < (u_int32_t)fabs(sb_sample_j[blk][ch][sb])) { + scale_factor_j[ch][sb]++; + scalefactor_j[ch][sb] *= 2; + } + } + } + } + + /* decide which subbands to join */ + frame->join = 0; + for (sb = 0; sb < frame->subbands - 1; sb++) { + if ((scalefactor[0][sb] + scalefactor[1][sb]) > + (scalefactor_j[0][sb] + scalefactor_j[1][sb]) ) { + /* use joint stereo for this subband */ + frame->join |= 1 << sb; + frame->scale_factor[0][sb] = scale_factor_j[0][sb]; + frame->scale_factor[1][sb] = scale_factor_j[1][sb]; + scalefactor[0][sb] = scalefactor_j[0][sb]; + scalefactor[1][sb] = scalefactor_j[1][sb]; + for (blk = 0; blk < frame->blocks; blk++) { + frame->sb_sample_f[blk][0][sb] = sb_sample_j[blk][0][sb]; + frame->sb_sample_f[blk][1][sb] = sb_sample_j[blk][1][sb]; + } + } + } + + if (len * 8 < produced + frame->subbands) + return -1; + + data[4] = 0; + for (sb = 0; sb < frame->subbands - 1; sb++) { + data[4] |= ((frame->join >> sb) & 0x01) << (7 - sb); + } + if (frame->subbands == 4) { + crc_header[crc_pos / 8] = data[4] & 0xf0; + } else { + crc_header[crc_pos / 8] = data[4]; + } + + produced += frame->subbands; + crc_pos += frame->subbands; + } + + if (len * 8 < produced + (4 * frame->subbands * frame->channels)) + return -1; + + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + if (produced % 8 == 0) + data[produced / 8] = 0; + data[produced / 8] |= ((frame->scale_factor[ch][sb] & 0x0F) << (4 - (produced % 8))); + crc_header[crc_pos / 8] |= ((frame->scale_factor[ch][sb] & 0x0F) << (4 - (crc_pos % 8))); + + produced += 4; + crc_pos += 4; + } + } + + data[3] = sbc_crc8(crc_header, crc_pos); + + + + sbc_calculate_bits(frame, bits, sf); + + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + levels[ch][sb] = (1 << bits[ch][sb]) - 1; + } + } + + for (blk = 0; blk < frame->blocks; blk++) { + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + if (levels[ch][sb] > 0) { + frame->audio_sample[blk][ch][sb] = + (uint16_t) ((((frame->sb_sample_f[blk][ch][sb]*levels[ch][sb]) >> (frame->scale_factor[ch][sb] + 1)) + + levels[ch][sb]) >> 1); + } else { + frame->audio_sample[blk][ch][sb] = 0; + } + } + } + } + + for (blk = 0; blk < frame->blocks; blk++) { + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + if (bits[ch][sb] != 0) { + for (bit = 0; bit < bits[ch][sb]; bit++) { + int b; /* A bit */ + if (produced > len * 8) { + return -1; + } + if (produced % 8 == 0) { + data[produced / 8] = 0; + } + b = ((frame->audio_sample[blk][ch][sb]) >> (bits[ch][sb] - bit - + 1)) & 0x01; + data[produced / 8] |= b << (7 - (produced % 8)); + produced++; + } + } + } + } + } + + if (produced % 8 != 0) { + produced += 8 - (produced % 8); + } + + return (int)(produced / 8); +} + +struct sbc_priv { + int init; + struct sbc_frame frame; + struct sbc_decoder_state dec_state; + struct sbc_encoder_state enc_state; +}; + +int sbc_init(sbc_t *sbc)//int sbc_init(sbc_t *sbc, unsigned long flags) +{ + if (!sbc) + return -EIO; + + //flags = flags; + + memset(sbc, 0, sizeof(sbc_t)); + + sbc->priv = malloc(sizeof(struct sbc_priv) + SBC_ALIGN_MASK); + if (!sbc->priv) + return -ENOMEM; + memset(sbc->priv, 0, sizeof(struct sbc_priv)); + + sbc->rate = 16000; + sbc->channels = 1; + sbc->joint = 0; + sbc->subbands = 8; + sbc->blocks = 15; + sbc->bitpool = 26; + + return 0; +} + +int sbc_reinit(sbc_t *sbc)//int sbc_reinit(sbc_t *sbc, unsigned long flags) +{ + struct sbc_priv *priv; + + if (!sbc || !sbc->priv) + return -EIO; + + //flags = flags; + priv = sbc->priv; + + if (priv->init == 1) + memset(sbc->priv, 0, sizeof(struct sbc_priv)); + + return 0; +} + + +int sbc_decode(sbc_t *sbc, void *input, int input_len, void *output, + int output_len, int *written) +{ + struct sbc_priv *priv; + char *ptr; + int i, ch, framelen, samples; + + if (!sbc) + { + //DbgPrint("Exit.when sbc is NULL.\n"); + return -EIO; + } + + if (!sbc && !input) + { + //DbgPrint("!sbc && !input\n"); + return -EIO; + } + + priv = sbc->priv; + if(!priv) + return -99; + + framelen = sbc_unpack_frame(input, &priv->frame, input_len); + + if (!priv->init) + { + sbc_decoder_init(&priv->dec_state, &priv->frame); + priv->init = 1; + + sbc->rate = priv->frame.sampling_frequency; + sbc->channels = priv->frame.channels; + sbc->subbands = priv->frame.subbands; + sbc->blocks = priv->frame.blocks; + sbc->bitpool = priv->frame.bitpool; + } + + if (!output) + { + //DbgPrint("!output\n"); + return framelen; + } + + if (written) + *written = 0; + + if (framelen <= 0) + { + //DbgPrint("Exit when framelen <= 0\n"); + return framelen; + } + + samples = sbc_synthesize_audio(&priv->dec_state, &priv->frame); + + ptr = output; + if (output_len < samples * priv->frame.channels * 2) + samples = output_len / (priv->frame.channels * 2); + +/* + if (!sbc->data) + { + sbc->size = samples * priv->frame.channels * 2; + sbc->data = malloc(sbc->size); + } + + + if (sbc->size < samples * priv->frame.channels * 2) + { + sbc->size = samples * priv->frame.channels * 2; + sbc->data = realloc(sbc->data, sbc->size); + } + + if (!sbc->data) + { + sbc->size = 0; + return -ENOMEM; + } +*/ + + for (i = 0; i < samples; i++) + { + for (ch = 0; ch < priv->frame.channels; ch++) + { + int16_t s; + s = priv->frame.pcm_sample[ch][i]; + /* + *ptr++ = (s & 0xff00) >> 8; + *ptr++ = (s & 0x00ff); + */ + *ptr++ = (s & 0x00ff); + *ptr++ = (s & 0xff00) >> 8; + } + } + + if (written) + *written = samples * priv->frame.channels * 2; + + return framelen; +} + +int sbc_encode(sbc_t *sbc, void *input, int input_len, void *output, + int output_len, int *written) +{ + struct sbc_priv *priv; + char *ptr; + int i, ch, framelen, samples; + + if (!sbc) + { + //DbgPrint("Exit, when !sbc.\n"); + return -EIO; + } + + + if (!sbc && !input) + { + //DbgPrint("Exit, when !sbc && !input.\n"); + return -EIO; + } + + /// make sure sbc has been initialized + priv = sbc->priv; + if(priv == NULL){ + //DbgPrint("priv == NULL\n"); + return -EIO; + } + + if (written) + *written = 0; + + if (!priv->init) + { + //DbgPrint("Initial priv->frame ,when priv->init is null\n"); + priv->frame.sampling_frequency = sbc->rate; + priv->frame.channels = sbc->channels; + priv->frame.channel_mode = MONO; + priv->frame.allocation_method = LOUDNESS; + priv->frame.subbands = sbc->subbands; + priv->frame.blocks = sbc->blocks; + priv->frame.bitpool = sbc->bitpool; + + sbc_encoder_init(&priv->enc_state, &priv->frame); + priv->init = 1; + } + + /* input must be large enough to encode a complete frame */ + if (input_len < 240) + { + //DbgPrint("Exit, when input_len < priv->frame.codesize..\n"); + return 0; + } + + /* output must be large enough to receive the encoded frame */ + if (!output || output_len < 57) + { + //DbgPrint("Exit, when !output || output_len < priv->frame.length\n"); + return -ENOSPC; + } + + ptr = input; + for (i = 0; i < priv->frame.subbands * priv->frame.blocks; i++) + { + for (ch = 0; ch < sbc->channels; ch++) + { + // int16_t s = (ptr[0] & 0xff) << 8 | (ptr[1] & 0xff); + int16_t s = (ptr[1] & 0xff) << 8 | (ptr[0] & 0xff); + ptr += 2; + priv->frame.pcm_sample[ch][i] = s; + } + } + + samples = 0; + samples = sbc_analyze_audio(&priv->enc_state, &priv->frame); + + if (!sbc->data) + { + sbc->size = 1024; +// sbc->data = malloc(sbc->size); + sbc->data = malloc(sbc->size); + if (!sbc->data) + { + //DbgPrint("sbc->data allocate failed!!!\n"); + return -ENOMEM; + } + memset(sbc->data, 0, sbc->size); + } + + if (!sbc->data) + { + sbc->size = 0; + //DbgPrint("sbc->data is null, so exit!!!\n"); + return -ENOMEM; + } + + framelen = sbc_pack_frame(output, &priv->frame, output_len); + if (written) + { + *written = (int)framelen;//in 64 bit os, it should be okay. + } + + sbc->len = framelen; + sbc->duration = (1000000 * priv->frame.subbands * priv->frame.blocks) / sbc->rate; + + return samples * sbc->channels * 2; +} + + +void sbc_finish(sbc_t *sbc) +{ + if (!sbc) + return; + + if (sbc->data) + free(sbc->data); + + + if (sbc->priv) + { + free(sbc->priv); + } + memset(sbc, 0, sizeof(sbc_t)); +} diff --git a/rtkbt/code/libbt-vendor/codec/msbc/sbc.h b/rtkbt/code/libbt-vendor/codec/msbc/sbc.h new file mode 100755 index 0000000..5e74751 --- /dev/null +++ b/rtkbt/code/libbt-vendor/codec/msbc/sbc.h @@ -0,0 +1,79 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2004-2006 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_H +#define __SBC_H + +#ifdef __cplusplus +extern "C" { +#endif + + +struct sbc_struct { + unsigned long flags; + unsigned short rate; + unsigned char channels; + unsigned char joint; + unsigned char blocks; + unsigned char subbands; + unsigned char bitpool; + + void *data; + int size; + int len; + + unsigned long duration; + + void *priv; +}; + +typedef struct sbc_struct sbc_t; + +int sbc_init(sbc_t *sbc);//int sbc_init(sbc_t *sbc, unsigned long flags); + +int sbc_reinit(sbc_t *sbc);//int sbc_reinit(sbc_t *sbc, unsigned long flags); + + +int sbc_encode(sbc_t *sbc, + void *input, + int input_len, + void *output, + int output_len, + int *written); + +int sbc_decode(sbc_t *sbc, + void *input, + int input_len, + void *output, + int output_len, + int *written); + +void sbc_finish(sbc_t *sbc); + +#ifdef __cplusplus +} +#endif + +#endif /* __SBC_H */ diff --git a/rtkbt/code/libbt-vendor/codec/msbc/sbc_math.h b/rtkbt/code/libbt-vendor/codec/msbc/sbc_math.h new file mode 100755 index 0000000..d620822 --- /dev/null +++ b/rtkbt/code/libbt-vendor/codec/msbc/sbc_math.h @@ -0,0 +1,70 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2004-2006 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#define fabs(x) ((x) < 0 ? -(x) : (x)) +/* C does not provide an explicit arithmetic shift right but this will + always be correct and every compiler *should* generate optimal code */ +#define ASR(val, bits) ((-2 >> 1 == -1) ? \ + ((int32_t)(val)) >> (bits) : ((int32_t) (val)) / (1 << (bits))) +#define ASR_64(val, bits) ((-2 >> 1 == -1) ? \ + ((long long)(val)) >> (bits) : ((long long) (val)) / (1 << (bits))) + +#define SCALE_PROTO4_TBL 15 +#define SCALE_ANA4_TBL 16 +#define SCALE_PROTO8_TBL 15 +#define SCALE_ANA8_TBL 16 +#define SCALE_SPROTO4_TBL 16 +#define SCALE_SPROTO8_TBL 16 +#define SCALE_NPROTO4_TBL 10 +#define SCALE_NPROTO8_TBL 12 +#define SCALE_SAMPLES 14 +#define SCALE4_STAGE1_BITS 10 +#define SCALE4_STAGE2_BITS 21 +#define SCALE4_STAGED1_BITS 18 +#define SCALE4_STAGED2_BITS 23 +#define SCALE8_STAGE1_BITS 8 +#define SCALE8_STAGE2_BITS 24 +#define SCALE8_STAGED1_BITS 18 +#define SCALE8_STAGED2_BITS 23 + +//typedef int int32_t; +//typedef int32_t sbc_fixed_t; +//typedef long long sbc_extended_t; + +#define SCALE4_STAGE1(src) ASR_64(src, SCALE4_STAGE1_BITS) +#define SCALE4_STAGE2(src) ASR_64(src, SCALE4_STAGE2_BITS) +#define SCALE4_STAGED1(src) ASR_64(src, SCALE4_STAGED1_BITS) +#define SCALE4_STAGED2(src) ASR_64(src, SCALE4_STAGED2_BITS) +#define SCALE8_STAGE1(src) ASR_64(src, SCALE8_STAGE1_BITS) +#define SCALE8_STAGE2(src) ASR_64(src, SCALE8_STAGE2_BITS) +#define SCALE8_STAGED1(src) ASR_64(src, SCALE8_STAGED1_BITS) +#define SCALE8_STAGED2(src) ASR_64(src, SCALE8_STAGED2_BITS) + +#define SBC_FIXED_0(val) { val = 0; } +#define ADD(dst, src) { dst += src; } +#define SUB(dst, src) { dst -= src; } +#define MUL(dst, a, b) { dst = (sbc_extended_t) (a) * (b); } +#define MULA(dst, a, b) { dst += (sbc_extended_t) (a) * (b); } +#define DIV2(dst, src) { dst = ASR(src, 1); } diff --git a/rtkbt/code/libbt-vendor/codec/msbc/sbc_tables.h b/rtkbt/code/libbt-vendor/codec/msbc/sbc_tables.h new file mode 100755 index 0000000..f532cec --- /dev/null +++ b/rtkbt/code/libbt-vendor/codec/msbc/sbc_tables.h @@ -0,0 +1,169 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2004-2006 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "sbc_math.h" + +/* A2DP specification: Appendix B, page 69 */ +static const int sbc_offset4[4][4] = { + { -1, 0, 0, 0 }, + { -2, 0, 0, 1 }, + { -2, 0, 0, 1 }, + { -2, 0, 0, 1 } +}; + +/* A2DP specification: Appendix B, page 69 */ +static const int sbc_offset8[4][8] = { + { -2, 0, 0, 0, 0, 0, 0, 1 }, + { -3, 0, 0, 0, 0, 0, 1, 2 }, + { -4, 0, 0, 0, 0, 0, 1, 2 }, + { -4, 0, 0, 0, 0, 0, 1, 2 } +}; + +#define SP4(val) ASR(val, SCALE_PROTO4_TBL) +#define SA4(val) ASR(val, SCALE_ANA4_TBL) +#define SP8(val) ASR(val, SCALE_PROTO8_TBL) +#define SA8(val) ASR(val, SCALE_ANA8_TBL) +#define SS4(val) ASR(val, SCALE_SPROTO4_TBL) +#define SS8(val) ASR(val, SCALE_SPROTO8_TBL) +#define SN4(val) ASR(val, SCALE_NPROTO4_TBL) +#define SN8(val) ASR(val, SCALE_NPROTO8_TBL) + +static const int32_t _sbc_proto_4[20] = { + SP4(0x02cb3e8c), SP4(0x22b63dc0), SP4(0x002329cc), SP4(0x053b7548), + SP4(0x31eab940), SP4(0xec1f5e60), SP4(0xff3773a8), SP4(0x0061c5a7), + SP4(0x07646680), SP4(0x3f239480), SP4(0xf89f23a8), SP4(0x007a4737), + SP4(0x00b32807), SP4(0x083ddc80), SP4(0x4825e480), SP4(0x0191e578), + SP4(0x00ff11ca), SP4(0x00fb7991), SP4(0x069fdc58), SP4(0x4b584000) +}; + +static const int32_t _anamatrix4[4] = { + SA4(0x2d413cc0), SA4(0x3b20d780), SA4(0x40000000), SA4(0x187de2a0) +}; + +static const int32_t _sbc_proto_8[40] = { + SP8(0x02e5cd20), SP8(0x22d0c200), SP8(0x006bfe27), SP8(0x07808930), + SP8(0x3f1c8800), SP8(0xf8810d70), SP8(0x002cfdc6), SP8(0x055acf28), + SP8(0x31f566c0), SP8(0xebfe57e0), SP8(0xff27c437), SP8(0x001485cc), + SP8(0x041c6e58), SP8(0x2a7cfa80), SP8(0xe4c4a240), SP8(0xfe359e4c), + SP8(0x0048b1f8), SP8(0x0686ce30), SP8(0x38eec5c0), SP8(0xf2a1b9f0), + SP8(0xffe8904a), SP8(0x0095698a), SP8(0x0824a480), SP8(0x443b3c00), + SP8(0xfd7badc8), SP8(0x00d3e2d9), SP8(0x00c183d2), SP8(0x084e1950), + SP8(0x4810d800), SP8(0x017f43fe), SP8(0x01056dd8), SP8(0x00e9cb9f), + SP8(0x07d7d090), SP8(0x4a708980), SP8(0x0488fae8), SP8(0x0113bd20), + SP8(0x0107b1a8), SP8(0x069fb3c0), SP8(0x4b3db200), SP8(0x00763f48) +}; + +static const int32_t sbc_proto_4_40m0[] = { + SS4(0x00000000), SS4(0xffa6982f), SS4(0xfba93848), SS4(0x0456c7b8), + SS4(0x005967d1), SS4(0xfffb9ac7), SS4(0xff589157), SS4(0xf9c2a8d8), + SS4(0x027c1434), SS4(0x0019118b), SS4(0xfff3c74c), SS4(0xff137330), + SS4(0xf81b8d70), SS4(0x00ec1b8b), SS4(0xfff0b71a), SS4(0xffe99b00), + SS4(0xfef84470), SS4(0xf6fb4370), SS4(0xffcdc351), SS4(0xffe01dc7) +}; + +static const int32_t sbc_proto_4_40m1[] = { + SS4(0xffe090ce), SS4(0xff2c0475), SS4(0xf694f800), SS4(0xff2c0475), + SS4(0xffe090ce), SS4(0xffe01dc7), SS4(0xffcdc351), SS4(0xf6fb4370), + SS4(0xfef84470), SS4(0xffe99b00), SS4(0xfff0b71a), SS4(0x00ec1b8b), + SS4(0xf81b8d70), SS4(0xff137330), SS4(0xfff3c74c), SS4(0x0019118b), + SS4(0x027c1434), SS4(0xf9c2a8d8), SS4(0xff589157), SS4(0xfffb9ac7) +}; + +static const int32_t sbc_proto_8_80m0[] = { + SS8(0x00000000), SS8(0xfe8d1970), SS8(0xee979f00), SS8(0x11686100), + SS8(0x0172e690), SS8(0xfff5bd1a), SS8(0xfdf1c8d4), SS8(0xeac182c0), + SS8(0x0d9daee0), SS8(0x00e530da), SS8(0xffe9811d), SS8(0xfd52986c), + SS8(0xe7054ca0), SS8(0x0a00d410), SS8(0x006c1de4), SS8(0xffdba705), + SS8(0xfcbc98e8), SS8(0xe3889d20), SS8(0x06af2308), SS8(0x000bb7db), + SS8(0xffca00ed), SS8(0xfc3fbb68), SS8(0xe071bc00), SS8(0x03bf7948), + SS8(0xffc4e05c), SS8(0xffb54b3b), SS8(0xfbedadc0), SS8(0xdde26200), + SS8(0x0142291c), SS8(0xff960e94), SS8(0xff9f3e17), SS8(0xfbd8f358), + SS8(0xdbf79400), SS8(0xff405e01), SS8(0xff7d4914), SS8(0xff8b1a31), + SS8(0xfc1417b8), SS8(0xdac7bb40), SS8(0xfdbb828c), SS8(0xff762170) +}; + +static const int32_t sbc_proto_8_80m1[] = { + SS8(0xff7c272c), SS8(0xfcb02620), SS8(0xda612700), SS8(0xfcb02620), + SS8(0xff7c272c), SS8(0xff762170), SS8(0xfdbb828c), SS8(0xdac7bb40), + SS8(0xfc1417b8), SS8(0xff8b1a31), SS8(0xff7d4914), SS8(0xff405e01), + SS8(0xdbf79400), SS8(0xfbd8f358), SS8(0xff9f3e17), SS8(0xff960e94), + SS8(0x0142291c), SS8(0xdde26200), SS8(0xfbedadc0), SS8(0xffb54b3b), + SS8(0xffc4e05c), SS8(0x03bf7948), SS8(0xe071bc00), SS8(0xfc3fbb68), + SS8(0xffca00ed), SS8(0x000bb7db), SS8(0x06af2308), SS8(0xe3889d20), + SS8(0xfcbc98e8), SS8(0xffdba705), SS8(0x006c1de4), SS8(0x0a00d410), + SS8(0xe7054ca0), SS8(0xfd52986c), SS8(0xffe9811d), SS8(0x00e530da), + SS8(0x0d9daee0), SS8(0xeac182c0), SS8(0xfdf1c8d4), SS8(0xfff5bd1a) +}; + +static const int32_t _anamatrix8[8] = { + SA8(0x3b20d780), SA8(0x187de2a0), SA8(0x3ec52f80), SA8(0x3536cc40), + SA8(0x238e7680), SA8(0x0c7c5c20), SA8(0x2d413cc0), SA8(0x40000000) +}; + +static const int32_t synmatrix4[8][4] = { + { SN4(0x05a82798), SN4(0xfa57d868), SN4(0xfa57d868), SN4(0x05a82798) }, + { SN4(0x030fbc54), SN4(0xf89be510), SN4(0x07641af0), SN4(0xfcf043ac) }, + { SN4(0x00000000), SN4(0x00000000), SN4(0x00000000), SN4(0x00000000) }, + { SN4(0xfcf043ac), SN4(0x07641af0), SN4(0xf89be510), SN4(0x030fbc54) }, + { SN4(0xfa57d868), SN4(0x05a82798), SN4(0x05a82798), SN4(0xfa57d868) }, + { SN4(0xf89be510), SN4(0xfcf043ac), SN4(0x030fbc54), SN4(0x07641af0) }, + { SN4(0xf8000000), SN4(0xf8000000), SN4(0xf8000000), SN4(0xf8000000) }, + { SN4(0xf89be510), SN4(0xfcf043ac), SN4(0x030fbc54), SN4(0x07641af0) } +}; + +static const int32_t synmatrix8[16][8] = { + { SN8(0x05a82798), SN8(0xfa57d868), SN8(0xfa57d868), SN8(0x05a82798), + SN8(0x05a82798), SN8(0xfa57d868), SN8(0xfa57d868), SN8(0x05a82798) }, + { SN8(0x0471ced0), SN8(0xf8275a10), SN8(0x018f8b84), SN8(0x06a6d988), + SN8(0xf9592678), SN8(0xfe70747c), SN8(0x07d8a5f0), SN8(0xfb8e3130) }, + { SN8(0x030fbc54), SN8(0xf89be510), SN8(0x07641af0), SN8(0xfcf043ac), + SN8(0xfcf043ac), SN8(0x07641af0), SN8(0xf89be510), SN8(0x030fbc54) }, + { SN8(0x018f8b84), SN8(0xfb8e3130), SN8(0x06a6d988), SN8(0xf8275a10), + SN8(0x07d8a5f0), SN8(0xf9592678), SN8(0x0471ced0), SN8(0xfe70747c) }, + { SN8(0x00000000), SN8(0x00000000), SN8(0x00000000), SN8(0x00000000), + SN8(0x00000000), SN8(0x00000000), SN8(0x00000000), SN8(0x00000000) }, + { SN8(0xfe70747c), SN8(0x0471ced0), SN8(0xf9592678), SN8(0x07d8a5f0), + SN8(0xf8275a10), SN8(0x06a6d988), SN8(0xfb8e3130), SN8(0x018f8b84) }, + { SN8(0xfcf043ac), SN8(0x07641af0), SN8(0xf89be510), SN8(0x030fbc54), + SN8(0x030fbc54), SN8(0xf89be510), SN8(0x07641af0), SN8(0xfcf043ac) }, + { SN8(0xfb8e3130), SN8(0x07d8a5f0), SN8(0xfe70747c), SN8(0xf9592678), + SN8(0x06a6d988), SN8(0x018f8b84), SN8(0xf8275a10), SN8(0x0471ced0) }, + { SN8(0xfa57d868), SN8(0x05a82798), SN8(0x05a82798), SN8(0xfa57d868), + SN8(0xfa57d868), SN8(0x05a82798), SN8(0x05a82798), SN8(0xfa57d868) }, + { SN8(0xf9592678), SN8(0x018f8b84), SN8(0x07d8a5f0), SN8(0x0471ced0), + SN8(0xfb8e3130), SN8(0xf8275a10), SN8(0xfe70747c), SN8(0x06a6d988) }, + { SN8(0xf89be510), SN8(0xfcf043ac), SN8(0x030fbc54), SN8(0x07641af0), + SN8(0x07641af0), SN8(0x030fbc54), SN8(0xfcf043ac), SN8(0xf89be510) }, + { SN8(0xf8275a10), SN8(0xf9592678), SN8(0xfb8e3130), SN8(0xfe70747c), + SN8(0x018f8b84), SN8(0x0471ced0), SN8(0x06a6d988), SN8(0x07d8a5f0) }, + { SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000), + SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000) }, + { SN8(0xf8275a10), SN8(0xf9592678), SN8(0xfb8e3130), SN8(0xfe70747c), + SN8(0x018f8b84), SN8(0x0471ced0), SN8(0x06a6d988), SN8(0x07d8a5f0) }, + { SN8(0xf89be510), SN8(0xfcf043ac), SN8(0x030fbc54), SN8(0x07641af0), + SN8(0x07641af0), SN8(0x030fbc54), SN8(0xfcf043ac), SN8(0xf89be510) }, + { SN8(0xf9592678), SN8(0x018f8b84), SN8(0x07d8a5f0), SN8(0x0471ced0), + SN8(0xfb8e3130), SN8(0xf8275a10), SN8(0xfe70747c), SN8(0x06a6d988) } +}; diff --git a/rtkbt/code/libbt-vendor/include/bt_list.h b/rtkbt/code/libbt-vendor/include/bt_list.h old mode 100644 new mode 100755 diff --git a/rtkbt/code/libbt-vendor/include/bt_skbuff.h b/rtkbt/code/libbt-vendor/include/bt_skbuff.h old mode 100644 new mode 100755 index d252976..3a3eca6 --- a/rtkbt/code/libbt-vendor/include/bt_skbuff.h +++ b/rtkbt/code/libbt-vendor/include/bt_skbuff.h @@ -41,6 +41,7 @@ #ifndef BT_SKBUFF_H #define BT_SKBUFF_H #include "bt_list.h" +#include #ifndef EXTERN #define EXTERN @@ -335,12 +336,11 @@ RtbQueueNextNode( /** check whether queue is empty */ -EXTERN unsigned char +EXTERN bool RtbQueueIsEmpty( IN RTB_QUEUE_HEAD* RtkQueueHead ); - //annie_tmp EXTERN unsigned char RtbCheckQueueLen( diff --git a/rtkbt/code/libbt-vendor/include/bt_vendor_rtk.h b/rtkbt/code/libbt-vendor/include/bt_vendor_rtk.h old mode 100644 new mode 100755 index 7146c7a..b027fd9 --- a/rtkbt/code/libbt-vendor/include/bt_vendor_rtk.h +++ b/rtkbt/code/libbt-vendor/include/bt_vendor_rtk.h @@ -78,10 +78,14 @@ #define BTVNDDBG(param, ...) {} #endif +#define DOWN_FW_CFG _IOW('H', 201, int) +#define SET_ISO_CFG _IOW('H', 202, int) +#define GET_USB_INFO _IOW('H', 203, int) +#define RESET_CONTROLLER _IOW('H', 204, int) /* Device port name where Bluetooth controller attached */ #ifndef BLUETOOTH_UART_DEVICE_PORT -#define BLUETOOTH_UART_DEVICE_PORT "/dev/ttyO1" /* maguro */ +#define BLUETOOTH_UART_DEVICE_PORT "/dev/ttyS1" /* maguro */ #endif /* Location of firmware patch files */ @@ -110,7 +114,7 @@ * firmware patchram (.hcd) file. */ #ifndef USE_CONTROLLER_BDADDR -#define USE_CONTROLLER_BDADDR FALSE +#define USE_CONTROLLER_BDADDR TRUE //FALSE #endif /* sleep mode diff --git a/rtkbt/code/libbt-vendor/include/hardware.h b/rtkbt/code/libbt-vendor/include/hardware.h new file mode 100755 index 0000000..016d15f --- /dev/null +++ b/rtkbt/code/libbt-vendor/include/hardware.h @@ -0,0 +1,197 @@ +#ifndef HARDWARE_H +#define HARDWARE_H + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define cpu_to_le16(d) (d) +#define cpu_to_le32(d) (d) +#define le16_to_cpu(d) (d) +#define le32_to_cpu(d) (d) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define cpu_to_le16(d) bswap_16(d) +#define cpu_to_le32(d) bswap_32(d) +#define le16_to_cpu(d) bswap_16(d) +#define le32_to_cpu(d) bswap_32(d) +#else +#error "Unknown byte order" +#endif + +#define FIRMWARE_DIRECTORY "/vendor//etc/firmware/%s" +#define BT_CONFIG_DIRECTORY "/vendor/etc/firmware/%s" +#define PATCH_DATA_FIELD_MAX_SIZE 252 +#define RTK_VENDOR_CONFIG_MAGIC 0x8723ab55 +#define MAX_PATCH_SIZE_24K (1024*24) //24K +#define MAX_PATCH_SIZE_40K (1024*40) //40K + +#define MAX_ORG_CONFIG_SIZE (0x100*14) +#define MAX_ALT_CONFIG_SIZE (0x100*2) + +#define STREAM_TO_UINT8(u8, p) \ + { \ + (u8) = (uint8_t)(*(p)); \ + (p) += 1; \ + } + +struct rtk_bt_vendor_config_entry{ + uint16_t offset; + uint8_t entry_len; + uint8_t entry_data[0]; +} __attribute__ ((packed)); + +struct rtk_bt_vendor_config{ + uint32_t signature; + uint16_t data_len; + struct rtk_bt_vendor_config_entry entry[0]; +} __attribute__ ((packed)); + +#define HCI_CMD_MAX_LEN 258 + +#define HCI_VERSION_MASK_10 (1<<0) //Bluetooth Core Spec 1.0b +#define HCI_VERSION_MASK_11 (1<<1) //Bluetooth Core Spec 1.1 +#define HCI_VERSION_MASK_12 (1<<2) //Bluetooth Core Spec 1.2 +#define HCI_VERSION_MASK_20 (1<<3) //Bluetooth Core Spec 2.0+EDR +#define HCI_VERSION_MASK_21 (1<<4) //Bluetooth Core Spec 2.1+EDR +#define HCI_VERSION_MASK_30 (1<<5) //Bluetooth Core Spec 3.0+HS +#define HCI_VERSION_MASK_40 (1<<6) //Bluetooth Core Spec 4.0 +#define HCI_VERSION_MASK_41 (1<<7) //Bluetooth Core Spec 4.1 +#define HCI_VERSION_MASK_42 (1<<8) //Bluetooth Core Spec 4.2 +#define HCI_VERSION_MASK_ALL (0xFFFFFFFF) + +#define HCI_REVISION_MASK_ALL (0xFFFFFFFF) + +#define LMP_SUBVERSION_NONE (0x0) +#define LMPSUBVERSION_8723a (0x1200) + +#define CHIPTYPE_NONE (0x1F) //Chip Type's range: 0x0 ~ 0xF +#define CHIP_TYPE_MASK_ALL (0xFFFFFFFF) + +#define PROJECT_ID_MASK_ALL (0xFFFFFFFF) // temp used for unknow project id for a new chip + +#define PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE (0x1) + +#define CONFIG_MAC_OFFSET_GEN_1_2 (0x3C) //MAC's OFFSET in config/efuse for realtek generation 1~2 bluetooth chip +#define CONFIG_MAC_OFFSET_GEN_3PLUS (0x44) //MAC's OFFSET in config/efuse for rtk generation 3+ bluetooth chip + +#define HCI_EVT_CMD_CMPL_OPCODE_OFFSET (3) //opcode's offset in COMMAND Completed Event +#define HCI_EVT_CMD_CMPL_STATUS_OFFSET (5) //status's offset in COMMAND Completed Event + +#define HCI_EVT_CMD_CMPL_OP1001_HCI_VERSION_OFFSET (6) //HCI_Version's offset in COMMAND Completed Event for OpCode 0x1001(Read Local Version Information Command) +#define HCI_EVT_CMD_CMPL_OP1001_HCI_REVISION_OFFSET (7) //HCI_Revision's offset in COMMAND Completed Event for OpCode 0x1001(Read Local Version Information Command) +#define HCI_EVT_CMD_CMPL_OP1001_LMP_SUBVERSION_OFFSET (12) //LMP Subversion's offset in COMMAND Completed Event for OpCode 0x1001(Read Local Version Information Command) +#define HCI_EVT_CMD_CMPL_OP0C14_LOCAL_NAME_OFFSET (6) //Local Name's offset in COMMAND Completed Event for OpCode 0x0C14(Read Local Name Command) +#define HCI_EVT_CMD_CMPL_OP1009_BDADDR_OFFSET (6) //BD_ADDR's offset in COMMAND Completed Event for OpCode 0x1009(Read BD_ADDR Command) +#define HCI_EVT_CMD_CMPL_OPFC6D_EVERSION_OFFSET (6) //eversion's offset in COMMAND Completed Event for OpCode 0xfc6d(Read eVERSION Vendor Command) +#define HCI_EVT_CMD_CMPL_OPFC61_CHIPTYPE_OFFSET (6) //chip type's offset in COMMAND Completed Event for OpCode 0xfc61(Read ChipType Vendor Command) + +//#define UPDATE_BAUDRATE_CMD_PARAM_SIZE (6) +#define HCI_CMD_PREAMBLE_SIZE (3) +#define HCI_CMD_READ_CHIP_TYPE_SIZE (5) +//#define HCD_REC_PAYLOAD_LEN_BYTE (2) +//#define BD_ADDR_LEN (6) +//#define LOCAL_NAME_BUFFER_LEN (32) +//#define LOCAL_BDADDR_PATH_BUFFER_LEN (256) + +#define H5_SYNC_REQ_SIZE (2) +#define H5_SYNC_RESP_SIZE (2) +#define H5_CONF_REQ_SIZE (3) +#define H5_CONF_RESP_SIZE (2) + +/****************************************************************************** +** Local type definitions +******************************************************************************/ + +/* Hardware Configuration State */ +enum { + HW_CFG_H5_INIT = 1, + HW_CFG_READ_LOCAL_VER, + HW_CFG_READ_ECO_VER, //eco version + HW_CFG_READ_CHIP_TYPE, + HW_CFG_START, + HW_CFG_SET_UART_BAUD_HOST,//change FW baudrate + HW_CFG_SET_UART_BAUD_CONTROLLER,//change Host baudrate + HW_CFG_SET_UART_HW_FLOW_CONTROL, + HW_CFG_RESET_CHANNEL_CONTROLLER, + HW_RESET_CONTROLLER, + HARDWARE_INIT_COMPLETE, + HW_CFG_DL_FW_PATCH +}; + +/* h/w config control block */ +typedef struct +{ + uint32_t max_patch_size; + uint32_t baudrate; + uint16_t lmp_subversion; + uint16_t lmp_subversion_default; + uint16_t lmp_sub_current; + uint8_t state; /* Hardware configuration state */ + uint8_t eversion; + uint32_t project_id_mask; + uint8_t hci_version; + uint8_t hci_revision; + uint8_t chip_type; + uint8_t dl_fw_flag; + int fw_len; /* FW patch file len */ + size_t config_len; /* Config patch file len */ + unsigned int total_len; /* FW & config extracted buf len */ + uint8_t *fw_buf; /* FW patch file buf */ + uint8_t *config_buf; /* Config patch file buf */ + uint8_t *total_buf; /* FW & config extracted buf */ + uint8_t patch_frag_cnt; /* Patch fragment count download */ + uint8_t patch_frag_idx; /* Current patch fragment index */ + uint8_t patch_frag_len; /* Patch fragment length */ + uint8_t patch_frag_tail; /* Last patch fragment length */ + uint8_t hw_flow_cntrl; /* Uart flow control, bit7:set, bit0:enable */ + uint16_t vid; /* usb vendor id */ + uint16_t pid; /* usb product id */ + uint8_t heartbeat; /*heartbeat*/ +} bt_hw_cfg_cb_t; + +/* low power mode parameters */ +typedef struct +{ + uint8_t sleep_mode; /* 0(disable),1(UART),9(H5) */ + uint8_t host_stack_idle_threshold; /* Unit scale 300ms/25ms */ + uint8_t host_controller_idle_threshold; /* Unit scale 300ms/25ms */ + uint8_t bt_wake_polarity; /* 0=Active Low, 1= Active High */ + uint8_t host_wake_polarity; /* 0=Active Low, 1= Active High */ + uint8_t allow_host_sleep_during_sco; + uint8_t combine_sleep_mode_and_lpm; + uint8_t enable_uart_txd_tri_state; /* UART_TXD Tri-State */ + uint8_t sleep_guard_time; /* sleep guard time in 12.5ms */ + uint8_t wakeup_guard_time; /* wakeup guard time in 12.5ms */ + uint8_t txd_config; /* TXD is high in sleep state */ + uint8_t pulsed_host_wake; /* pulsed host wake if mode = 1 */ +} bt_lpm_param_t; + +#define ROM_LMP_NONE 0x0000 +#define ROM_LMP_8723a 0x1200 +#define ROM_LMP_8723b 0x8723 +#define ROM_LMP_8821a 0X8821 +#define ROM_LMP_8761a 0X8761 +#define ROM_LMP_8703a 0x8723 +#define ROM_LMP_8763a 0x8763 +#define ROM_LMP_8703b 0x8703 +#define ROM_LMP_8723c 0x8703 +#define ROM_LMP_8822b 0x8822 +#define ROM_LMP_8723d 0x8723 +#define ROM_LMP_8821c 0x8821 + +struct rtk_epatch_entry{ + uint16_t chip_id; + uint16_t patch_length; + uint32_t patch_offset; + uint32_t svn_version; + uint32_t coex_version; +} __attribute__ ((packed)); + +struct rtk_epatch{ + uint8_t signature[8]; + uint32_t fw_version; + uint16_t number_of_patch; + struct rtk_epatch_entry entry[0]; +} __attribute__ ((packed)); + + + + +#endif diff --git a/rtkbt/code/libbt-vendor/include/hci_h5_int.h b/rtkbt/code/libbt-vendor/include/hci_h5_int.h old mode 100644 new mode 100755 index 99311c2..6d62c9b --- a/rtkbt/code/libbt-vendor/include/hci_h5_int.h +++ b/rtkbt/code/libbt-vendor/include/hci_h5_int.h @@ -43,6 +43,9 @@ #define HCI_VSC_SET_WAKE_UP_DEVICE 0xFC7B #define HCI_VSC_BT_OFF 0xFC28 #define HCI_READ_LMP_VERSION 0x1001 +#define HCI_VENDOR_RESET 0x0C03 +#define HCI_VENDOR_FORCE_RESET_AND_PATCHABLE 0xFC66 + #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);} diff --git a/rtkbt/code/libbt-vendor/include/rtk_btservice.h b/rtkbt/code/libbt-vendor/include/rtk_btservice.h new file mode 100755 index 0000000..f8529bb --- /dev/null +++ b/rtkbt/code/libbt-vendor/include/rtk_btservice.h @@ -0,0 +1,18 @@ +#ifndef RTK_BTSERVICE_H +#define RTK_BTSERVICE_H + +#include +#include + +#define HCI_RTKBT_AUTOPAIR_EVT 0x30 + +#define STREAM_TO_UINT8(u8, p) \ + { \ + (u8) = (uint8_t)(*(p)); \ + (p) += 1; \ + } + + +#endif + + diff --git a/rtkbt/code/libbt-vendor/include/rtk_btsnoop_net.h b/rtkbt/code/libbt-vendor/include/rtk_btsnoop_net.h old mode 100644 new mode 100755 diff --git a/rtkbt/code/libbt-vendor/include/rtk_hcidefs.h b/rtkbt/code/libbt-vendor/include/rtk_hcidefs.h old mode 100644 new mode 100755 diff --git a/rtkbt/code/libbt-vendor/include/rtk_parse.h b/rtkbt/code/libbt-vendor/include/rtk_parse.h old mode 100644 new mode 100755 index f2dcc27..4de047c --- a/rtkbt/code/libbt-vendor/include/rtk_parse.h +++ b/rtkbt/code/libbt-vendor/include/rtk_parse.h @@ -87,7 +87,7 @@ typedef struct rtk_parse_manager_t { }rtk_parse_manager_t; -const rtk_parse_manager_t *rtk_parse_manager_get_interface(); +rtk_parse_manager_t *rtk_parse_manager_get_interface(); #ifdef __LITTLE_ENDIAN struct sbc_frame_hdr { diff --git a/rtkbt/code/libbt-vendor/include/rtk_poll.h b/rtkbt/code/libbt-vendor/include/rtk_poll.h new file mode 100755 index 0000000..c449d24 --- /dev/null +++ b/rtkbt/code/libbt-vendor/include/rtk_poll.h @@ -0,0 +1,34 @@ +/****************************************************************************** + * + * Copyright (C) 2014 Realtek, Inc. + * + * 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. + * + ******************************************************************************/ + +#include +#include +#include +#include +#include "bt_vendor_lib.h" + +typedef void (*timed_out)(union sigval arg); + + +void poll_init(timed_out ptr_timeout,uint32_t timeout); + +void poll_cleanup(void); + +void poll_enable(uint8_t turn_on); + +void poll_timer_flush(void); diff --git a/rtkbt/code/libbt-vendor/include/rtk_socket.h b/rtkbt/code/libbt-vendor/include/rtk_socket.h new file mode 100755 index 0000000..b878559 --- /dev/null +++ b/rtkbt/code/libbt-vendor/include/rtk_socket.h @@ -0,0 +1,73 @@ +/****************************************************************************** + * + * Copyright (C) 2009-2012 Realtek 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. + * + ******************************************************************************/ + +/****************************************************************************** + * + * Filename: userial_vendor.h + * + * Description: Contains vendor-specific definitions used in serial port + * controls + * + ******************************************************************************/ + +#ifndef RTK_SOCKET_H +#define RTK_SOCKET_H + +#include "bt_vendor_rtk.h" +#include "userial.h" +#include +#include +#include +#include +#include +#include +#include + + +#ifdef CONFIG_SCO_OVER_HCI +#define SCO_CTRL_PATH "/data/misc/bluedroid/.sco_ctrl" +#define SCO_DATA_PATH "/data/misc/bluedroid/.sco_data" + +typedef enum { + SCO_CTRL_CMD_NONE, + SCO_CTRL_CMD_CHECK_READY, + SCO_CTRL_CMD_OUT_START, + SCO_CTRL_CMD_IN_START, + SCO_CTRL_CMD_OUT_STOP, + SCO_CTRL_CMD_IN_STOP, + SCO_CTRL_CMD_SUSPEND, + SCO_CTRL_GET_AUDIO_CONFIG, + SCO_CTRL_CMD_OFFLOAD_START, +} tSCO_CTRL_CMD; + +#define SCO_SAMPLE_RATE_8K 1 +#define SCO_SAMPLE_RATE_16K 2 + +#endif + +#define MAX(a,b) ((a)>(b)?(a):(b)) + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ + +uint32_t Skt_Read(int fd, uint8_t *p_buf, uint32_t len); +int Skt_Read_noblock(int fd, uint8_t *p_buf, uint32_t len); +bool Skt_Send(int fd, uint8_t *p_buf, uint16_t msglen); +int Skt_Send_noblock(int fd, uint8_t *p_buf, uint16_t msglen); +#endif diff --git a/rtkbt/code/libbt-vendor/include/unused.h b/rtkbt/code/libbt-vendor/include/unused.h new file mode 100755 index 0000000..d44033e --- /dev/null +++ b/rtkbt/code/libbt-vendor/include/unused.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2011 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. + * - 1 control system sysfs proc env & property + */ +#ifndef BT_UNUSED_H +#define BT_UNUSED_H +#ifdef __GNUC__ +# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) +#else +# define UNUSED(x) UNUSED_ ## x +#endif +#endif /*BT_UNUSED_H*/ diff --git a/rtkbt/code/libbt-vendor/include/upio.h b/rtkbt/code/libbt-vendor/include/upio.h old mode 100644 new mode 100755 index 20ed9bb..24427a9 --- a/rtkbt/code/libbt-vendor/include/upio.h +++ b/rtkbt/code/libbt-vendor/include/upio.h @@ -101,7 +101,7 @@ int upio_set_bluetooth_power(int on); ** Returns None ** *******************************************************************************/ -void upio_set(uint8_t pio, uint8_t action, uint8_t polarity); +void upio_set(uint8_t pio, uint8_t action);//void upio_set(uint8_t pio, uint8_t action, uint8_t polarity); /******************************************************************************* diff --git a/rtkbt/code/libbt-vendor/include/userial_vendor.h b/rtkbt/code/libbt-vendor/include/userial_vendor.h old mode 100644 new mode 100755 index 07bcf7d..573667b --- a/rtkbt/code/libbt-vendor/include/userial_vendor.h +++ b/rtkbt/code/libbt-vendor/include/userial_vendor.h @@ -39,6 +39,8 @@ /****************************************************************************** ** Constants & Macros ******************************************************************************/ +#define RTK_NO_INTR(fn) do {} while ((fn) == -1 && errno == EINTR) + #define RTK_GET_BOUNDARY_FLAG(handle) (((handle) >> 12) & 0x0003) #define RTK_START_PACKET_BOUNDARY 2 @@ -102,6 +104,20 @@ /****************************************************************************** ** Type definitions ******************************************************************************/ + // 2 bytes for opcode, 1 byte for parameter length (Volume 2, Part E, 5.4.1) +#define COMMAND_PREAMBLE_SIZE 3 + // 2 bytes for handle, 2 bytes for data length (Volume 2, Part E, 5.4.2) +#define ACL_PREAMBLE_SIZE 4 + // 2 bytes for handle, 1 byte for data length (Volume 2, Part E, 5.4.3) +#define SCO_PREAMBLE_SIZE 3 + // 1 byte for event code, 1 byte for parameter length (Volume 2, Part E, 5.4.4) +#define EVENT_PREAMBLE_SIZE 2 + +#define HCI_PACKET_TYPE_TO_INDEX(type) ((type) - 1) + +#define COMMON_DATA_LENGTH_INDEX 3 + +#define EVENT_DATA_LENGTH_INDEX 2 /* Structure used to configure serial port during open */ typedef struct @@ -195,8 +211,13 @@ void userial_vendor_set_hw_fctrl(uint8_t hw_fctrl); int userial_socket_open(void); -int userial_vendor_usb_ioctl(int operation); +int userial_vendor_usb_ioctl(int operation, void* param); int userial_vendor_usb_open(void); +void userial_recv_rawdata_hook(unsigned char *buffer, unsigned int total_length); + +#define RTK_HANDLE_EVENT +#define RTK_HANDLE_CMD +#define CONFIG_SCO_OVER_HCI #endif /* USERIAL_VENDOR_H */ diff --git a/rtkbt/code/libbt-vendor/include/vnd_buildcfg.h b/rtkbt/code/libbt-vendor/include/vnd_buildcfg.h old mode 100644 new mode 100755 diff --git a/rtkbt/code/libbt-vendor/src/bt_list.c b/rtkbt/code/libbt-vendor/src/bt_list.c old mode 100644 new mode 100755 diff --git a/rtkbt/code/libbt-vendor/src/bt_skbuff.c b/rtkbt/code/libbt-vendor/src/bt_skbuff.c old mode 100644 new mode 100755 index 2396949..8600d0e --- a/rtkbt/code/libbt-vendor/src/bt_skbuff.c +++ b/rtkbt/code/libbt-vendor/src/bt_skbuff.c @@ -77,7 +77,7 @@ typedef struct _RTB_QUEUE_HEAD{ uint32_t QueueLen; pthread_mutex_t Lock; uint8_t Id[RTB_QUEUE_ID_LENGTH]; -}RTB_QUEUE_HEAD, *PRTB_QUEUE_HEAD; +}*PRTB_QUEUE_HEAD; //**************************************************************************** // FUNCTION @@ -87,7 +87,7 @@ typedef struct _RTB_QUEUE_HEAD{ \return : FALSE Queue is not empty TRU Queue is empty */ -unsigned char +bool RtbQueueIsEmpty( IN RTB_QUEUE_HEAD* RtkQueueHead ) diff --git a/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c b/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c old mode 100644 new mode 100755 index 59a551e..78f78d6 --- a/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c +++ b/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c @@ -26,7 +26,7 @@ #undef NDEBUG #define LOG_TAG "libbt_vendor" -#define RTKBT_RELEASE_NAME "20171107_BT_ANDROID_8.x" +#define RTKBT_RELEASE_NAME "20180525_BT_ANDROID_8.1" #include #include "bt_vendor_rtk.h" #include "upio.h" @@ -44,6 +44,8 @@ extern bool rtk_btsnoop_save_log; extern char rtk_btsnoop_path[]; extern uint8_t coex_log_enable; extern void hw_config_start(char transtype); +extern void hw_usb_config_start(char transtype,uint32_t val); +extern void RTK_btservice_init(); #if (HW_END_WITH_HCI_RESET == TRUE) void hw_epilog_process(void); @@ -63,7 +65,6 @@ bool rtkbt_auto_restart = false; #define RTKBT_CONF_FILE "/vendor/etc/bluetooth/rtkbt.conf" #define USB_DEVICE_DIR "/sys/bus/usb/devices" #define DEBUG_SCAN_USB FALSE -#define DOWN_FW_CFG _IOW('H', 201, int) /****************************************************************************** ** Static Variables @@ -197,7 +198,7 @@ static void load_rtkbt_stack_conf() } int line_num = 0; char line[1024]; - char value[1024]; + //char value[1024]; while (fgets(line, sizeof(line), fp)) { char *line_ptr = rtk_trim(line); ++line_num; @@ -263,7 +264,7 @@ static void load_rtkbt_conf() FILE *fp = fopen(RTKBT_CONF_FILE, "rt"); if (!fp) { ALOGE("%s unable to open file '%s': %s", __func__, RTKBT_CONF_FILE, strerror(errno)); - strcpy(rtkbt_device_node,"/dev/rtk_btusb"); + strcpy(rtkbt_device_node,"/dev/rtkbt_dev"); return; } @@ -280,7 +281,7 @@ static void load_rtkbt_conf() split = strchr(line_ptr, '='); if (!split) { ALOGE("%s no key/value separator found on line %d.", __func__, line_num); - strcpy(rtkbt_device_node,"/dev/rtk_btusb"); + strcpy(rtkbt_device_node,"/dev/rtkbt_dev"); return; } @@ -296,7 +297,7 @@ static void load_rtkbt_conf() if(rtkbt_device_node[0]=='?'){ /*1.Scan_Usb_Device*/ if(Scan_Usb_Devices_For_RTK(USB_DEVICE_DIR) == 0x01) { - strcpy(rtkbt_device_node,"/dev/rtk_btusb"); + strcpy(rtkbt_device_node,"/dev/rtkbt_dev"); } else{ int i = 0; @@ -307,7 +308,7 @@ static void load_rtkbt_conf() } } - if(split = strchr(rtkbt_device_node, ':')) { + if((split = strchr(rtkbt_device_node, ':')) != NULL) { *split = '\0'; if(!strcmp(rtk_trim(split + 1), "H5")) { rtkbt_transtype |= RTKBT_TRANS_H5; @@ -316,12 +317,12 @@ static void load_rtkbt_conf() rtkbt_transtype |= RTKBT_TRANS_H4; } } - else if(strcmp(rtkbt_device_node, "/dev/rtk_btusb")) { + else if(strcmp(rtkbt_device_node, "/dev/rtkbt_dev")) { //default use h5 rtkbt_transtype |= RTKBT_TRANS_H5; } - if(strcmp(rtkbt_device_node, "/dev/rtk_btusb")) { + if(strcmp(rtkbt_device_node, "/dev/rtkbt_dev")) { rtkbt_transtype |= RTKBT_TRANS_UART; } else { @@ -410,20 +411,10 @@ static int op(bt_vendor_opcode_t opcode, void *param) hw_config_start(rtkbt_transtype); } else { - BTVNDDBG("usb op for %d", opcode); - ALOGE("Bt_vendor_rtk Op for BT_VND_OP_FW_CFG"); - retval = userial_vendor_usb_ioctl(DOWN_FW_CFG); - if(retval>0){ - ALOGE("Bt_vendor_rtk Download Fw Success"); - bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); - }else{ - ALOGE("Bt_vendor_rtk Download Fw failed: %s(%d)", strerror(errno), errno); - if(rtkbt_auto_restart) { - bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); - kill(getpid(), SIGKILL); - } - } + retval = userial_vendor_usb_ioctl(GET_USB_INFO, NULL); + hw_usb_config_start(RTKBT_TRANS_H4,retval); } + RTK_btservice_init(); } break; @@ -473,17 +464,16 @@ static int op(bt_vendor_opcode_t opcode, void *param) BTVNDDBG("USB op for %d", opcode); int fd, idx = 0; int (*fd_array)[] = (int (*)[]) param; - if(userial_vendor_usb_open() != -1){ - retval = 1; + for(idx = 0; idx < 10; idx++) { + if(userial_vendor_usb_open() != -1){ + retval = 1; + break; + } } - do { - idx++; - usleep(500000); - }while(userial_vendor_usb_open() == -1 && idx < 10); fd = userial_socket_open(); if (fd != -1) { - for (idx=0; idx < CH_MAX; idx++) + for (idx = 0; idx < CH_MAX; idx++) (*fd_array)[idx] = fd; } else diff --git a/rtkbt/code/libbt-vendor/src/hardware.c b/rtkbt/code/libbt-vendor/src/hardware.c old mode 100644 new mode 100755 index 28aac2a..7bcfee2 --- a/rtkbt/code/libbt-vendor/src/hardware.c +++ b/rtkbt/code/libbt-vendor/src/hardware.c @@ -27,7 +27,7 @@ ******************************************************************************/ #define LOG_TAG "bt_hwcfg" -#define RTKBT_RELEASE_NAME "20171107_BT_ANDROID_8.x" +#define RTKBT_RELEASE_NAME "20180525_BT_ANDROID_8.1" #include #include @@ -48,196 +48,32 @@ #include #include #include +#include #include "bt_vendor_lib.h" - +#include "hardware.h" /****************************************************************************** ** Constants & Macros ******************************************************************************/ #define RTK_VERSION "4.1.1" -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define cpu_to_le16(d) (d) -#define cpu_to_le32(d) (d) -#define le16_to_cpu(d) (d) -#define le32_to_cpu(d) (d) -#elif __BYTE_ORDER == __BIG_ENDIAN -#define cpu_to_le16(d) bswap_16(d) -#define cpu_to_le32(d) bswap_32(d) -#define le16_to_cpu(d) bswap_16(d) -#define le32_to_cpu(d) bswap_32(d) -#else -#error "Unknown byte order" -#endif - -#define FIRMWARE_DIRECTORY "/vendor/etc/firmware/%s" -#define BT_CONFIG_DIRECTORY "/vendor/etc/firmware/%s" -#define PATCH_DATA_FIELD_MAX_SIZE 252 -#define RTK_VENDOR_CONFIG_MAGIC 0x8723ab55 -#define MAX_PATCH_SIZE_24K (1024*24) //24K -#define MAX_PATCH_SIZE_40K (1024*40) //40K - -#define MAX_ORG_CONFIG_SIZE (0x100*14) -#define MAX_ALT_CONFIG_SIZE (0x100*2) - -struct rtk_bt_vendor_config_entry{ - uint16_t offset; - uint8_t entry_len; - uint8_t entry_data[0]; -} __attribute__ ((packed)); - -struct rtk_bt_vendor_config{ - uint32_t signature; - uint16_t data_len; - struct rtk_bt_vendor_config_entry entry[0]; -} __attribute__ ((packed)); - -#define HCI_CMD_MAX_LEN 258 - -#define HCI_VERSION_MASK_10 (1<<0) //Bluetooth Core Spec 1.0b -#define HCI_VERSION_MASK_11 (1<<1) //Bluetooth Core Spec 1.1 -#define HCI_VERSION_MASK_12 (1<<2) //Bluetooth Core Spec 1.2 -#define HCI_VERSION_MASK_20 (1<<3) //Bluetooth Core Spec 2.0+EDR -#define HCI_VERSION_MASK_21 (1<<4) //Bluetooth Core Spec 2.1+EDR -#define HCI_VERSION_MASK_30 (1<<5) //Bluetooth Core Spec 3.0+HS -#define HCI_VERSION_MASK_40 (1<<6) //Bluetooth Core Spec 4.0 -#define HCI_VERSION_MASK_41 (1<<7) //Bluetooth Core Spec 4.1 -#define HCI_VERSION_MASK_42 (1<<8) //Bluetooth Core Spec 4.2 -#define HCI_VERSION_MASK_ALL (0xFFFFFFFF) - -#define HCI_REVISION_MASK_ALL (0xFFFFFFFF) - -#define LMP_SUBVERSION_NONE (0x0) -#define LMPSUBVERSION_8723a (0x1200) - -#define CHIPTYPE_NONE (0x1F) //Chip Type's range: 0x0 ~ 0xF -#define CHIP_TYPE_MASK_ALL (0xFFFFFFFF) - -#define PROJECT_ID_MASK_ALL (0xFFFFFFFF) // temp used for unknow project id for a new chip - -#define PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE (0x1) - -#define CONFIG_MAC_OFFSET_GEN_1_2 (0x3C) //MAC's OFFSET in config/efuse for realtek generation 1~2 bluetooth chip -#define CONFIG_MAC_OFFSET_GEN_3PLUS (0x44) //MAC's OFFSET in config/efuse for rtk generation 3+ bluetooth chip - -#define HCI_EVT_CMD_CMPL_OPCODE_OFFSET (3) //opcode's offset in COMMAND Completed Event -#define HCI_EVT_CMD_CMPL_STATUS_OFFSET (5) //status's offset in COMMAND Completed Event - -#define HCI_EVT_CMD_CMPL_OP1001_HCI_VERSION_OFFSET (6) //HCI_Version's offset in COMMAND Completed Event for OpCode 0x1001(Read Local Version Information Command) -#define HCI_EVT_CMD_CMPL_OP1001_HCI_REVISION_OFFSET (7) //HCI_Revision's offset in COMMAND Completed Event for OpCode 0x1001(Read Local Version Information Command) -#define HCI_EVT_CMD_CMPL_OP1001_LMP_SUBVERSION_OFFSET (12) //LMP Subversion's offset in COMMAND Completed Event for OpCode 0x1001(Read Local Version Information Command) -#define HCI_EVT_CMD_CMPL_OP0C14_LOCAL_NAME_OFFSET (6) //Local Name's offset in COMMAND Completed Event for OpCode 0x0C14(Read Local Name Command) -#define HCI_EVT_CMD_CMPL_OP1009_BDADDR_OFFSET (6) //BD_ADDR's offset in COMMAND Completed Event for OpCode 0x1009(Read BD_ADDR Command) -#define HCI_EVT_CMD_CMPL_OPFC6D_EVERSION_OFFSET (6) //eversion's offset in COMMAND Completed Event for OpCode 0xfc6d(Read eVERSION Vendor Command) -#define HCI_EVT_CMD_CMPL_OPFC61_CHIPTYPE_OFFSET (6) //chip type's offset in COMMAND Completed Event for OpCode 0xfc61(Read ChipType Vendor Command) - -//#define UPDATE_BAUDRATE_CMD_PARAM_SIZE (6) -#define HCI_CMD_PREAMBLE_SIZE (3) -#define HCI_CMD_READ_CHIP_TYPE_SIZE (5) -//#define HCD_REC_PAYLOAD_LEN_BYTE (2) -//#define BD_ADDR_LEN (6) -//#define LOCAL_NAME_BUFFER_LEN (32) -//#define LOCAL_BDADDR_PATH_BUFFER_LEN (256) - -#define H5_SYNC_REQ_SIZE (2) -#define H5_SYNC_RESP_SIZE (2) -#define H5_CONF_REQ_SIZE (3) -#define H5_CONF_RESP_SIZE (2) - -/****************************************************************************** -** Local type definitions -******************************************************************************/ - -/* Hardware Configuration State */ -enum { - HW_CFG_H5_INIT = 1, - HW_CFG_READ_LOCAL_VER, - HW_CFG_READ_ECO_VER, //eco version - HW_CFG_READ_CHIP_TYPE, - HW_CFG_START, - HW_CFG_SET_UART_BAUD_HOST,//change FW baudrate - HW_CFG_SET_UART_BAUD_CONTROLLER,//change Host baudrate - HW_CFG_SET_UART_HW_FLOW_CONTROL, - HW_CFG_DL_FW_PATCH -}; - -/* h/w config control block */ -typedef struct -{ - uint32_t max_patch_size; - uint32_t baudrate; - uint16_t lmp_subversion; - uint8_t state; /* Hardware configuration state */ - uint8_t eversion; - uint32_t project_id_mask; - uint8_t hci_version; - uint8_t hci_revision; - uint8_t chip_type; - uint8_t dl_fw_flag; - int fw_len; /* FW patch file len */ - int config_len; /* Config patch file len */ - int total_len; /* FW & config extracted buf len */ - uint8_t *fw_buf; /* FW patch file buf */ - uint8_t *config_buf; /* Config patch file buf */ - uint8_t *total_buf; /* FW & config extracted buf */ - uint8_t patch_frag_cnt; /* Patch fragment count download */ - uint8_t patch_frag_idx; /* Current patch fragment index */ - uint8_t patch_frag_len; /* Patch fragment length */ - uint8_t patch_frag_tail; /* Last patch fragment length */ - uint8_t hw_flow_cntrl; /* Uart flow control, bit7:set, bit0:enable */ -} bt_hw_cfg_cb_t; - -/* low power mode parameters */ -typedef struct -{ - uint8_t sleep_mode; /* 0(disable),1(UART),9(H5) */ - uint8_t host_stack_idle_threshold; /* Unit scale 300ms/25ms */ - uint8_t host_controller_idle_threshold; /* Unit scale 300ms/25ms */ - uint8_t bt_wake_polarity; /* 0=Active Low, 1= Active High */ - uint8_t host_wake_polarity; /* 0=Active Low, 1= Active High */ - uint8_t allow_host_sleep_during_sco; - uint8_t combine_sleep_mode_and_lpm; - uint8_t enable_uart_txd_tri_state; /* UART_TXD Tri-State */ - uint8_t sleep_guard_time; /* sleep guard time in 12.5ms */ - uint8_t wakeup_guard_time; /* wakeup guard time in 12.5ms */ - uint8_t txd_config; /* TXD is high in sleep state */ - uint8_t pulsed_host_wake; /* pulsed host wake if mode = 1 */ -} bt_lpm_param_t; - /****************************************************************************** ** Externs ******************************************************************************/ -void hw_config_cback(void *p_evt_buf); +//void hw_config_cback(void *p_evt_buf); +//void hw_usb_config_cback(void *p_evt_buf); + extern uint8_t vnd_local_bd_addr[BD_ADDR_LEN]; extern bool rtkbt_auto_restart; /****************************************************************************** ** Static variables ******************************************************************************/ -static bt_hw_cfg_cb_t hw_cfg_cb; +bt_hw_cfg_cb_t hw_cfg_cb; -//#define BT_CHIP_PROBE_SIMULATION -#ifdef BT_CHIP_PROBE_SIMULATION -static bt_hw_cfg_cb_t hw_cfg_test; -struct bt_chip_char{ - uint16_t lmp_subversion; - uint8_t hci_version; - uint8_t hci_revision; - uint8_t chip_type; -}; -struct bt_chip_char bt_chip_chars[] = \ -{ - {0x8723, 0x4, 0xb, CHIPTYPE_NONE}, //8703as - {0x8723, 0x6, 0xb, CHIPTYPE_NONE}, //8723bs - {0x8703, 0x4, 0xd, 0x7}, //8703bs - {0x8703, 0x6, 0xb, 0x3}, //8723cs-cg - {0x8703, 0x6, 0xb, 0x4}, //8723cs-vf - {0x8703, 0x6, 0xb, 0x5}, //8723cs-xx - {0x8723, 0x6, 0xd, CHIPTYPE_NONE}, //8723ds -}; -#endif +/* static bt_lpm_param_t lpm_param = { LPM_SLEEP_MODE, @@ -247,291 +83,14 @@ static bt_lpm_param_t lpm_param = LPM_HOST_WAKE_POLARITY, LPM_ALLOW_HOST_SLEEP_DURING_SCO, LPM_COMBINE_SLEEP_MODE_AND_LPM, - LPM_ENABLE_UART_TXD_TRI_STATE, - 0, /* not applicable */ - 0, /* not applicable */ - 0, /* not applicable */ - LPM_PULSED_HOST_WAKE -}; - -//signature: realtech -const uint8_t RTK_EPATCH_SIGNATURE[8]={0x52,0x65,0x61,0x6C,0x74,0x65,0x63,0x68}; -//Extension Section IGNATURE:0x77FD0451 -const uint8_t EXTENSION_SECTION_SIGNATURE[4]={0x51,0x04,0xFD,0x77}; - -typedef struct { - uint16_t lmp_subversion; - uint32_t hci_version_mask; - uint32_t hci_revision_mask; - uint32_t chip_type_mask; - uint32_t project_id_mask; - char *patch_name; - char *config_name; - uint16_t mac_offset; - uint32_t max_patch_size; -} patch_info; - -static patch_info patch_table[] = { -/* lmp_subv hci_version_mask hci_revision_mask chip_type_mask project_id_mask fw name config name mac offset max_patch_size */ - {0x1200, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<0, "rtl8723as_fw", "rtl8723as_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8723AS - - {0x8723, ~(HCI_VERSION_MASK_21), ~(1<<0xd), CHIP_TYPE_MASK_ALL, 1<<1, "rtl8723bs_fw", "rtl8723bs_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8723BS -// {0x8723, ~(HCI_VERSION_MASK_21), ~(1<<0xd), CHIP_TYPE_MASK_ALL, 1<<1, "rtl8723bs_VQ0_fw", "rtl8723bs_VQ0_config", CONFIG_MAC_OFFSET_GEN_1_2}, //Rtl8723BS_VQ0 - {0x8821, HCI_VERSION_MASK_ALL, ~(1<<0xc), CHIP_TYPE_MASK_ALL, 1<<2, "rtl8821as_fw", "rtl8821as_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8821AS - {0x8761, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<3, "rtl8761at_fw", "rtl8761at_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8761AW - {0x8723, HCI_VERSION_MASK_21, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<4, "rtl8703as_fw", "rtl8703as_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8703AS - - {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<7, 1<<6, "rtl8703bs_fw", "rtl8703bs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //Rtl8703BS - {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<5, 1<<7, "rtl8723cs_xx_fw", "rtl8723cs_xx_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //rtl8723cs_xx - {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<3, 1<<7, "rtl8723cs_cg_fw", "rtl8723cs_cg_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //rtl8723cs_cg - {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<4, 1<<7, "rtl8723cs_vf_fw", "rtl8723cs_vf_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //rtl8723cs_vf - {0x8822, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<8, "rtl8822bs_fw", "rtl8822bs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //Rtl8822BS - - {0x8723, HCI_VERSION_MASK_ALL, (1<<0xd), ~(1<<7), 1<<9, "rtl8723ds_fw", "rtl8723ds_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, //Rtl8723ds - {0x8723, HCI_VERSION_MASK_ALL, (1<<0xd), 1<<7, 1<<9, "rtl8703cs_fw", "rtl8703cs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, //Rtl8703cs - {0x8821, HCI_VERSION_MASK_ALL, (1<<0xc), CHIP_TYPE_MASK_ALL, 1<<10, "rtl8821cs_fw", "rtl8821cs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, //RTL8821CS -/* todo: RTL8703CS */ - - {LMP_SUBVERSION_NONE,HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, PROJECT_ID_MASK_ALL, "rtl_none_fw", "rtl_none_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K} -}; - -struct rtk_epatch_entry{ - uint16_t chip_id; - uint16_t patch_length; - uint32_t patch_offset; - uint32_t svn_version; - uint32_t coex_version; -} __attribute__ ((packed)); - -struct rtk_epatch{ - uint8_t signature[8]; - uint32_t fw_version; - uint16_t number_of_patch; - struct rtk_epatch_entry entry[0]; -} __attribute__ ((packed)); - - -int check_match_state(bt_hw_cfg_cb_t *cfg,uint32_t mask) -{ - patch_info *patch_entry; - int res = 0; - - for(patch_entry = patch_table; patch_entry->lmp_subversion != LMP_SUBVERSION_NONE; patch_entry++) { - if(patch_entry->lmp_subversion != cfg->lmp_subversion) - continue; - if((patch_entry->hci_version_mask!=HCI_VERSION_MASK_ALL)&&((patch_entry->hci_version_mask&(1<hci_version))==0)) - continue; - if((patch_entry->hci_revision_mask!=HCI_REVISION_MASK_ALL)&&((patch_entry->hci_revision_mask&(1<hci_revision))==0)) - continue; - if((mask&PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE)&&(patch_entry->chip_type_mask != CHIP_TYPE_MASK_ALL)&&((patch_entry->chip_type_mask&(1<chip_type))==0)) - continue; - res++; - } - ALOGI( "check_match_state return %d(cfg->lmp_subversion:0x%x cfg->hci_vesion:0x%x cfg->hci_revision:0x%x cfg->chip_type:0x%x mask:%08x)\n", - res, cfg->lmp_subversion, cfg->hci_version, cfg->hci_revision, cfg->chip_type, mask); - return res; -} -patch_info* get_patch_entry(bt_hw_cfg_cb_t *cfg) -{ - patch_info *patch_entry; - - ALOGI("get_patch_entry(lmp_subversion:0x%x hci_vesion:0x%x cfg->hci_revision:0x%x chip_type:0x%x)\n", - cfg->lmp_subversion, cfg->hci_version, cfg->hci_revision, cfg->chip_type); - for(patch_entry = patch_table; patch_entry->lmp_subversion != LMP_SUBVERSION_NONE; patch_entry++) { - if(patch_entry->lmp_subversion != cfg->lmp_subversion) - continue; - if((patch_entry->hci_version_mask != HCI_VERSION_MASK_ALL)&&((patch_entry->hci_version_mask&(1<hci_version)) == 0)) - continue; - if((patch_entry->hci_revision_mask != HCI_REVISION_MASK_ALL)&&((patch_entry->hci_revision_mask&(1<hci_revision)) == 0)) - continue; - if((patch_entry->chip_type_mask != CHIP_TYPE_MASK_ALL)&&((patch_entry->chip_type_mask&(1<chip_type)) == 0)) - continue; - break; - } - ALOGI("get_patch_entry return(patch_name:%s config_name:%s mac_offset:0x%x)\n", - patch_entry->patch_name, patch_entry->config_name, patch_entry->mac_offset); - return patch_entry; -} - -/******************************************************************************* -** -** Function line_speed_to_userial_baud -** -** Description helper function converts line speed number into USERIAL baud -** rate symbol -** -** Returns unit8_t (USERIAL baud symbol) -** -*******************************************************************************/ -uint8_t line_speed_to_userial_baud(uint32_t line_speed) -{ - uint8_t baud; - - if (line_speed == 4000000) - baud = USERIAL_BAUD_4M; - else if (line_speed == 3000000) - baud = USERIAL_BAUD_3M; - else if (line_speed == 2000000) - baud = USERIAL_BAUD_2M; - else if (line_speed == 1500000) - baud = USERIAL_BAUD_1_5M; - else if (line_speed == 1000000) - baud = USERIAL_BAUD_1M; - else if (line_speed == 921600) - baud = USERIAL_BAUD_921600; - else if (line_speed == 460800) - baud = USERIAL_BAUD_460800; - else if (line_speed == 230400) - baud = USERIAL_BAUD_230400; - else if (line_speed == 115200) - baud = USERIAL_BAUD_115200; - else if (line_speed == 57600) - baud = USERIAL_BAUD_57600; - else if (line_speed == 19200) - baud = USERIAL_BAUD_19200; - else if (line_speed == 9600) - baud = USERIAL_BAUD_9600; - else if (line_speed == 1200) - baud = USERIAL_BAUD_1200; - else if (line_speed == 600) - baud = USERIAL_BAUD_600; - else - { - ALOGE( "userial vendor: unsupported baud speed %d", line_speed); - baud = USERIAL_BAUD_115200; - } - - return baud; -} - -typedef struct _baudrate_ex -{ - uint32_t rtk_speed; - uint32_t uart_speed; -}baudrate_ex; - -baudrate_ex baudrates[] = -{ - {0x00006004, 921600}, - {0x05F75004, 921600},//RTL8723BS - {0x00004003, 1500000}, - {0x04928002, 1500000},//RTL8723BS - {0x00005002, 2000000},//same as RTL8723AS - {0x00008001, 3000000}, - {0x04928001, 3000000},//RTL8723BS - {0x06B58001, 3000000},//add RTL8703as - {0x00007001, 3500000}, - {0x052A6001, 3500000},//RTL8723BS - {0x00005001, 4000000},//same as RTL8723AS - {0x0000701d, 115200}, - {0x0252C014, 115200}//RTL8723BS -}; - -/** -* Change realtek Bluetooth speed to uart speed. It is matching in the struct baudrates: -* -* @code -* baudrate_ex baudrates[] = -* { -* {0x7001, 3500000}, -* {0x6004, 921600}, -* {0x4003, 1500000}, -* {0x5001, 4000000}, -* {0x5002, 2000000}, -* {0x8001, 3000000}, -* {0x701d, 115200} -* }; -* @endcode -* -* If there is no match in baudrates, uart speed will be set as #115200. -* -* @param rtk_speed realtek Bluetooth speed -* @param uart_speed uart speed -* -*/ -static void rtk_speed_to_uart_speed(uint32_t rtk_speed, uint32_t* uart_speed) -{ - *uart_speed = 115200; - - uint8_t i; - for (i=0; i< sizeof(baudrates)/sizeof(baudrate_ex); i++) - { - if (baudrates[i].rtk_speed == rtk_speed) - { - *uart_speed = baudrates[i].uart_speed; - return; - } - } - return; -} - -/** -* Change uart speed to realtek Bluetooth speed. It is matching in the struct baudrates: -* -* @code -* baudrate_ex baudrates[] = -* { -* {0x7001, 3500000}, -* {0x6004, 921600}, -* {0x4003, 1500000}, -* {0x5001, 4000000}, -* {0x5002, 2000000}, -* {0x8001, 3000000}, -* {0x701d, 115200} -* }; -* @endcode -* -* If there is no match in baudrates, realtek Bluetooth speed will be set as #0x701D. -* -* @param uart_speed uart speed -* @param rtk_speed realtek Bluetooth speed -* -*/ -static inline void uart_speed_to_rtk_speed(uint32_t uart_speed, uint32_t* rtk_speed) -{ - *rtk_speed = 0x701D; - - unsigned int i; - for (i=0; i< sizeof(baudrates)/sizeof(baudrate_ex); i++) - { - if (baudrates[i].uart_speed == uart_speed) - { - *rtk_speed = baudrates[i].rtk_speed; - return; - } - } - return; -} - - -/******************************************************************************* -** -** Function hw_config_set_bdaddr -** -** Description Program controller's Bluetooth Device Address -** -** Returns TRUE, if valid address is sent -** FALSE, otherwise -** -*******************************************************************************/ -static uint8_t hw_config_set_controller_baudrate(HC_BT_HDR *p_buf, uint32_t baudrate) -{ - uint8_t retval = FALSE; - uint8_t *p = (uint8_t *) (p_buf + 1); - - UINT16_TO_STREAM(p, HCI_VSC_UPDATE_BAUDRATE); - *p++ = 4; /* parameter length */ - UINT32_TO_STREAM(p, baudrate); - - p_buf->len = HCI_CMD_PREAMBLE_SIZE + 4; - - retval = bt_vendor_cbacks->xmit_cb(HCI_VSC_UPDATE_BAUDRATE, p_buf, \ - hw_config_cback); - - return (retval); -} - -static int getmacaddr(unsigned char * addr) + LPM_ENABLE_UART_TXD_TRI_STATE,*/ + //0, /* not applicable */ + // 0, /* not applicable */ + // 0, /* not applicable */ + /*LPM_PULSED_HOST_WAKE +};*/ + +int getmacaddr(unsigned char * addr) { int i = 0; char data[256], *str; @@ -551,246 +110,6 @@ static int getmacaddr(unsigned char * addr) return -1; } -static inline int getAltSettings(patch_info *patch_entry, unsigned short *offset, int max_group_cnt) -{ - int n = 0; - if(patch_entry) - offset[n++] = patch_entry->mac_offset; -/* -//sample code, add special settings - - offset[n++] = 0x15B; -*/ - return n; -} -static inline int getAltSettingVal(patch_info *patch_entry, unsigned short offset, unsigned char * val) -{ - int res = 0; - - switch(offset) - { -/* -//sample code, add special settings - case 0x15B: - val[0] = 0x0B; - val[1] = 0x0B; - val[2] = 0x0B; - val[3] = 0x0B; - res = 4; - break; -*/ - default: - res = 0; - break; - } - if((patch_entry)&&(offset == patch_entry->mac_offset)&&(res == 0)) - { - if(getmacaddr(val) == 0){ - ALOGI("MAC: %02x:%02x:%02x:%02x:%02x:%02x", val[5], val[4], val[3], val[2], val[1], val[0]); - res = 6; - } - } - return res; -} - -void rtk_update_altsettings(patch_info *patch_entry, unsigned char* config_buf_ptr, size_t *config_len_ptr) -{ - unsigned short offset[256], data_len; - unsigned char val[256]; - - struct rtk_bt_vendor_config* config = (struct rtk_bt_vendor_config*) config_buf_ptr; - struct rtk_bt_vendor_config_entry* entry = config->entry; - size_t config_len = *config_len_ptr; - int count = 0,temp = 0, i = 0, j; - - ALOGI("ORG Config len=%08x:\n", config_len); - for(i=0;i<=config_len;i+=0x10) - { - ALOGI("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \ - config_buf_ptr[i], config_buf_ptr[i+1], config_buf_ptr[i+2], config_buf_ptr[i+3], config_buf_ptr[i+4], config_buf_ptr[i+5], config_buf_ptr[i+6], config_buf_ptr[i+7], \ - config_buf_ptr[i+8], config_buf_ptr[i+9], config_buf_ptr[i+10], config_buf_ptr[i+11], config_buf_ptr[i+12], config_buf_ptr[i+13], config_buf_ptr[i+14], config_buf_ptr[i+15]); - } - - memset(offset, 0, sizeof(offset)); - memset(val, 0, sizeof(val)); - data_len = le16_to_cpu(config->data_len); - - count = getAltSettings(patch_entry, offset, sizeof(offset)/sizeof(unsigned short)); - if(count <= 0){ - ALOGI("rtk_update_altsettings: No AltSettings"); - return; - }else{ - ALOGI("rtk_update_altsettings: %d AltSettings", count); - } - - if (data_len != config_len - sizeof(struct rtk_bt_vendor_config)) - { - ALOGE("rtk_update_altsettings: config len(%x) is not right(%x)", data_len, config_len-sizeof(struct rtk_bt_vendor_config)); - return; - } - - for (i=0; ioffset) == offset[j]) - offset[j] = 0; - } - if(getAltSettingVal(patch_entry, le16_to_cpu(entry->offset), val) == entry->entry_len){ - ALOGI("rtk_update_altsettings: replace %04x[%02x]", le16_to_cpu(entry->offset), entry->entry_len); - memcpy(entry->entry_data, val, entry->entry_len); - } - temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); - i += temp; - entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); - } - for(j = 0; j < count;j++){ - if(offset[j] == 0) - continue; - entry->entry_len = getAltSettingVal(patch_entry, offset[j], val); - if(entry->entry_len <= 0) - continue; - entry->offset = cpu_to_le16(offset[j]); - memcpy(entry->entry_data, val, entry->entry_len); - ALOGI("rtk_update_altsettings: add %04x[%02x]", le16_to_cpu(entry->offset), entry->entry_len); - temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); - i += temp; - entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); - } - config->data_len = cpu_to_le16(i); - *config_len_ptr = i+sizeof(struct rtk_bt_vendor_config); - - ALOGI("NEW Config len=%08x:\n", *config_len_ptr); - for(i=0;i<=(*config_len_ptr);i+=0x10) - { - ALOGI("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \ - config_buf_ptr[i], config_buf_ptr[i+1], config_buf_ptr[i+2], config_buf_ptr[i+3], config_buf_ptr[i+4], config_buf_ptr[i+5], config_buf_ptr[i+6], config_buf_ptr[i+7], \ - config_buf_ptr[i+8], config_buf_ptr[i+9], config_buf_ptr[i+10], config_buf_ptr[i+11], config_buf_ptr[i+12], config_buf_ptr[i+13], config_buf_ptr[i+14], config_buf_ptr[i+15]); - } - return; -} - -uint32_t rtk_parse_config_file(unsigned char** config_buf, size_t* filelen, uint8_t bt_addr[6], uint16_t mac_offset) -{ - struct rtk_bt_vendor_config* config = (struct rtk_bt_vendor_config*) *config_buf; - uint16_t config_len = le16_to_cpu(config->data_len), temp = 0; - struct rtk_bt_vendor_config_entry* entry = config->entry; - unsigned int i = 0; - uint32_t baudrate = 0; - uint32_t config_has_bdaddr = 0; - uint8_t *p; - - if (le32_to_cpu(config->signature) != RTK_VENDOR_CONFIG_MAGIC) - { - ALOGE("config signature magic number(0x%x) is not set to RTK_VENDOR_CONFIG_MAGIC", config->signature); - return 0; - } - - if (config_len != *filelen - sizeof(struct rtk_bt_vendor_config)) - { - ALOGE("config len(0x%x) is not right(0x%x)", config_len, *filelen-sizeof(struct rtk_bt_vendor_config)); - return 0; - } - - for (i=0; ioffset)) - { - case 0xc: - { - p = (uint8_t *)entry->entry_data; - STREAM_TO_UINT32(baudrate, p); - if (entry->entry_len >= 12) - { - hw_cfg_cb.hw_flow_cntrl |= 0x80; /* bit7 set hw flow control */ - if (entry->entry_data[12] & 0x04) /* offset 0x18, bit2 */ - hw_cfg_cb.hw_flow_cntrl |= 1; /* bit0 enable hw flow control */ - } - - ALOGI("config baud rate to :0x%08x, hwflowcontrol:0x%x, 0x%x", baudrate, entry->entry_data[12], hw_cfg_cb.hw_flow_cntrl); - break; - } -#if (USE_CONTROLLER_BDADDR == FALSE) - case 0x44: - case 0x3c: - { - config_has_bdaddr = 1; - int j=0; - for (j=0; jentry_len; j++) - entry->entry_data[j] = bt_addr[entry->entry_len - 1- j]; - ALOGI("rtk_parse_config_file: DO NOT USE_CONTROLLER_BDADDR, config has bdaddr"); - ALOGI("rtk_parse_config_file : CONFIG_ADDR is: %02X:%02X:%02X:%02X:%02X:%02X", - bt_addr[0], bt_addr[1], - bt_addr[2], bt_addr[3], - bt_addr[4], bt_addr[5]); - break; - } -#endif - default: - ALOGI("config offset(0x%x),length(0x%x)", entry->offset, entry->entry_len); - break; - } - temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); - i += temp; - entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); - } - - return baudrate; -} - -uint32_t rtk_get_bt_config(unsigned char** config_buf, - uint32_t* config_baud_rate, char * config_file_short_name, uint16_t mac_offset) -{ - char bt_config_file_name[PATH_MAX] = {0}; - struct stat st; - size_t filelen; - int fd; - FILE* file = NULL; - - sprintf(bt_config_file_name, BT_CONFIG_DIRECTORY, config_file_short_name); - ALOGI("BT config file: %s", bt_config_file_name); - - if (stat(bt_config_file_name, &st) < 0) - { - ALOGE("can't access bt config file:%s, errno:%d\n", bt_config_file_name, errno); - return -1; - } - - filelen = st.st_size; - if(filelen > MAX_ORG_CONFIG_SIZE) - { - ALOGE("bt config file is too large(>0x%04x)", MAX_ORG_CONFIG_SIZE); - return -1; - } - - if ((fd = open(bt_config_file_name, O_RDONLY)) < 0) - { - ALOGE("Can't open bt config file"); - return -1; - } - - if ((*config_buf = malloc(MAX_ORG_CONFIG_SIZE+MAX_ALT_CONFIG_SIZE)) == NULL) - { - ALOGE("malloc buffer for config file fail(0x%x)\n", filelen); - close(fd); - return -1; - } - - if (read(fd, *config_buf, filelen) < (ssize_t)filelen) - { - ALOGE("Can't load bt config file"); - free(*config_buf); - close(fd); - return -1; - } - - *config_baud_rate = rtk_parse_config_file(config_buf, &filelen, vnd_local_bd_addr, mac_offset); - ALOGI("Get config baud rate from config file:0x%x", *config_baud_rate); - - close(fd); - return filelen; -} - int rtk_get_bt_firmware(uint8_t** fw_buf, char* fw_short_name) { char filename[PATH_MAX] = {0}; @@ -869,6 +188,11 @@ uint8_t rtk_get_fw_project_id(uint8_t *p_buf) return data; } +uint8_t get_heartbeat_from_hardware() +{ + return hw_cfg_cb.heartbeat; +} + struct rtk_epatch_entry *rtk_get_patch_entry(bt_hw_cfg_cb_t *cfg_cb) { uint16_t i; @@ -917,523 +241,6 @@ struct rtk_epatch_entry *rtk_get_patch_entry(bt_hw_cfg_cb_t *cfg_cb) return entry; } -void rtk_get_bt_final_patch(bt_hw_cfg_cb_t* cfg_cb) -{ - uint8_t proj_id = 0; - struct rtk_epatch_entry* entry = NULL; - struct rtk_epatch *patch = (struct rtk_epatch *)cfg_cb->fw_buf; - int iBtCalLen = 0; - - if(cfg_cb->lmp_subversion == LMPSUBVERSION_8723a) - { - if(memcmp(cfg_cb->fw_buf, RTK_EPATCH_SIGNATURE, 8) == 0) - { - ALOGE("8723as check signature error!"); - cfg_cb->dl_fw_flag = 0; - goto free_buf; - } - else - { - cfg_cb->total_len = cfg_cb->fw_len + cfg_cb->config_len; - if (!(cfg_cb->total_buf = malloc(cfg_cb->total_len))) - { - ALOGE("can't alloc memory for fw&config, errno:%d", errno); - cfg_cb->dl_fw_flag = 0; - goto free_buf; - } - else - { - ALOGI("8723as, fw copy direct"); - memcpy(cfg_cb->total_buf, cfg_cb->fw_buf, cfg_cb->fw_len); - memcpy(cfg_cb->total_buf+cfg_cb->fw_len, cfg_cb->config_buf, cfg_cb->config_len); - cfg_cb->dl_fw_flag = 1; - goto free_buf; - } - } - } - - if (memcmp(cfg_cb->fw_buf, RTK_EPATCH_SIGNATURE, 8)) - { - ALOGE("check signature error"); - cfg_cb->dl_fw_flag = 0; - goto free_buf; - } - - /* check the extension section signature */ - if (memcmp(cfg_cb->fw_buf + cfg_cb->fw_len - 4, EXTENSION_SECTION_SIGNATURE, 4)) - { - ALOGE("check extension section signature error"); - cfg_cb->dl_fw_flag = 0; - goto free_buf; - } - - proj_id = rtk_get_fw_project_id(cfg_cb->fw_buf + cfg_cb->fw_len - 5); - - if((hw_cfg_cb.project_id_mask != PROJECT_ID_MASK_ALL)&& ((hw_cfg_cb.project_id_mask&(1<dl_fw_flag = 0; - goto free_buf; - } - - entry = rtk_get_patch_entry(cfg_cb); - if (entry) - { - cfg_cb->total_len = entry->patch_length + cfg_cb->config_len; - } - else - { - cfg_cb->dl_fw_flag = 0; - goto free_buf; - } - - ALOGI("total_len = 0x%x", cfg_cb->total_len); - - if (!(cfg_cb->total_buf = malloc(cfg_cb->total_len))) - { - ALOGE("Can't alloc memory for multi fw&config, errno:%d", errno); - cfg_cb->dl_fw_flag = 0; - goto free_buf; - } - else - { - memcpy(cfg_cb->total_buf, cfg_cb->fw_buf + entry->patch_offset, entry->patch_length); - memcpy(cfg_cb->total_buf + entry->patch_length - 4, &patch->fw_version, 4); - memcpy(&entry->svn_version, cfg_cb->total_buf + entry->patch_length - 8, 4); - memcpy(&entry->coex_version, cfg_cb->total_buf + entry->patch_length - 12, 4); - ALOGI("BTCOEX:20%06d-%04x svn_version:%d lmp_subversion:0x%x hci_version:0x%x hci_revision:0x%x chip_type:%d Cut:%d libbt-vendor_uart version:%s\n", - ((entry->coex_version >> 16) & 0x7ff) + ((entry->coex_version >> 27) * 10000), - (entry->coex_version & 0xffff), entry->svn_version, cfg_cb->lmp_subversion, cfg_cb->hci_version, cfg_cb->hci_revision, cfg_cb->chip_type, cfg_cb->eversion+1, RTK_VERSION); - } - - if (cfg_cb->config_len) - { - memcpy(cfg_cb->total_buf+entry->patch_length, cfg_cb->config_buf, cfg_cb->config_len); - } - - cfg_cb->dl_fw_flag = 1; - ALOGI("Fw:%s exists, config file:%s exists", (cfg_cb->fw_len>0)?"":"not", (cfg_cb->config_len>0)?"":"not"); - -free_buf: - if (cfg_cb->fw_len > 0) - { - free(cfg_cb->fw_buf); - cfg_cb->fw_len = 0; - } - - if (cfg_cb->config_len > 0) - { - free(cfg_cb->config_buf); - cfg_cb->config_len = 0; - } - - if(entry) - { - free(entry); - } -} - -static int hci_download_patch_h4(HC_BT_HDR *p_buf, int index, uint8_t *data, int len) -{ - uint8_t retval = FALSE; - uint8_t *p = (uint8_t *) (p_buf + 1); - - UINT16_TO_STREAM(p, HCI_VSC_DOWNLOAD_FW_PATCH); - *p++ = 1 + len; /* parameter length */ - *p++ = index; - memcpy(p, data, len); - p_buf->len = HCI_CMD_PREAMBLE_SIZE + 1+len; - - hw_cfg_cb.state = HW_CFG_DL_FW_PATCH; - - retval = bt_vendor_cbacks->xmit_cb(HCI_VSC_DOWNLOAD_FW_PATCH, p_buf, hw_config_cback); - return retval; -} - -/******************************************************************************* -** -** Function hw_config_cback -** -** Description Callback function for controller configuration -** -** Returns None -** -*******************************************************************************/ -void hw_config_cback(void *p_mem) -{ - HC_BT_HDR *p_evt_buf = NULL; - uint8_t *p = NULL, *pp=NULL; - uint8_t status = 0; - uint16_t opcode = 0; - HC_BT_HDR *p_buf = NULL; - uint8_t is_proceeding = FALSE; - int i = 0; - uint8_t iIndexRx = 0; - patch_info* prtk_patch_file_info = NULL; - uint32_t host_baudrate = 0; - -#if (USE_CONTROLLER_BDADDR == TRUE) - const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0}; -#endif - - if(p_mem != NULL) - { - p_evt_buf = (HC_BT_HDR *) p_mem; - status = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_OFFSET); - p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE_OFFSET; - STREAM_TO_UINT16(opcode,p); - } - - if(opcode == HCI_VSC_H5_INIT) { - if(status != 0) { - ALOGE("%s, status = %d", __func__, status); - if ((bt_vendor_cbacks) && (p_evt_buf != NULL)) - bt_vendor_cbacks->dealloc(p_evt_buf); - if(rtkbt_auto_restart) { - bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); - kill(getpid(), SIGKILL); - } - return; - } - } - - /* Ask a new buffer big enough to hold any HCI commands sent in here */ - /*a cut fc6d status==1*/ - if (((status == 0) ||(opcode == HCI_VSC_READ_ROM_VERSION)) && bt_vendor_cbacks) - p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + HCI_CMD_MAX_LEN); - - if (p_buf != NULL) - { - p_buf->event = MSG_STACK_TO_HC_HCI_CMD; - p_buf->offset = 0; - p_buf->len = 0; - p_buf->layer_specific = 0; - - BTVNDDBG("hw_cfg_cb.state = %i", hw_cfg_cb.state); - switch (hw_cfg_cb.state) - { - case HW_CFG_H5_INIT: - { - p = (uint8_t *)(p_buf + 1); - UINT16_TO_STREAM(p, HCI_READ_LMP_VERSION); - *p++ = 0; - p_buf->len = HCI_CMD_PREAMBLE_SIZE; - - hw_cfg_cb.state = HW_CFG_READ_LOCAL_VER; - is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_READ_LMP_VERSION, p_buf, hw_config_cback); - break; - } - case HW_CFG_READ_LOCAL_VER: - { - if (status == 0) - { - p = ((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_HCI_VERSION_OFFSET); - STREAM_TO_UINT16(hw_cfg_cb.hci_version, p); - p = ((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_HCI_REVISION_OFFSET); - STREAM_TO_UINT16(hw_cfg_cb.hci_revision, p); - p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_LMP_SUBVERSION_OFFSET; - STREAM_TO_UINT16(hw_cfg_cb.lmp_subversion, p); - BTVNDDBG("lmp_subversion = 0x%x hw_cfg_cb.hci_version = 0x%x hw_cfg_cb.hci_revision = 0x%x", hw_cfg_cb.lmp_subversion, hw_cfg_cb.hci_version, hw_cfg_cb.hci_revision); - if(hw_cfg_cb.lmp_subversion == LMPSUBVERSION_8723a) - { - hw_cfg_cb.state = HW_CFG_START; - goto CFG_START; - } - else - { - hw_cfg_cb.state = HW_CFG_READ_ECO_VER; - p = (uint8_t *) (p_buf + 1); - UINT16_TO_STREAM(p, HCI_VSC_READ_ROM_VERSION); - *p++ = 0; - p_buf->len = HCI_CMD_PREAMBLE_SIZE; - is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_ROM_VERSION, p_buf, hw_config_cback); - } - } - break; - } - case HW_CFG_READ_ECO_VER: - { - if(status == 0) - { - hw_cfg_cb.eversion = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPFC6D_EVERSION_OFFSET); - BTVNDDBG("hw_config_cback chip_id of the IC:%d", hw_cfg_cb.eversion+1); - } - else if(1 == status) - { - hw_cfg_cb.eversion = 0; - } - else - { - is_proceeding = FALSE; - break; - } - - if(check_match_state(&hw_cfg_cb, 0) > 1) // check if have multiple matched patch_entry by lmp_subversion,hci_version, hci_revision - { - hw_cfg_cb.state = HW_CFG_READ_CHIP_TYPE; - p = (uint8_t *) (p_buf + 1); - UINT16_TO_STREAM(p, HCI_VSC_READ_CHIP_TYPE); - *p++ = 5; - UINT8_TO_STREAM(p, 0x00); - UINT32_TO_STREAM(p, 0xB000A094); - p_buf->len = HCI_CMD_PREAMBLE_SIZE + HCI_CMD_READ_CHIP_TYPE_SIZE; - - pp = (uint8_t *) (p_buf + 1); - for (i = 0; i < p_buf->len; i++) - BTVNDDBG("get chip type command data[%d]= 0x%x", i, *(pp+i)); - - is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_CHIP_TYPE, p_buf, hw_config_cback); - break; - } - else - { - hw_cfg_cb.state = HW_CFG_START; - goto CFG_START; - } - } - case HW_CFG_READ_CHIP_TYPE: - { - BTVNDDBG("READ_CHIP_TYPE status = %d, length = %d", status, p_evt_buf->len); - p = (uint8_t *)(p_evt_buf + 1) ; - for (i = 0; i < p_evt_buf->len; i++) - BTVNDDBG("READ_CHIP_TYPE event data[%d]= 0x%x", i, *(p+i)); - if(status == 0) - { - hw_cfg_cb.chip_type = ((*((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPFC61_CHIPTYPE_OFFSET))&0x0F); - BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.lmp_subversion = 0x%x", hw_cfg_cb.lmp_subversion); - BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.hci_version = 0x%x", hw_cfg_cb.hci_version); - BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.hci_revision = 0x%x", hw_cfg_cb.hci_revision); - BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.chip_type = 0x%x", hw_cfg_cb.chip_type); - } - else - { - is_proceeding = FALSE; - break; - } - if(check_match_state(&hw_cfg_cb, PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE) > 1) // check if have multiple matched patch_entry by lmp_subversion,hci_version, hci_revision and chiptype - { - BTVNDDBG("check_match_state(lmp_subversion:0x%04x, hci_version:%d, hci_revision:%d chip_type:%d): Multi Matched Patch\n", hw_cfg_cb.lmp_subversion, hw_cfg_cb.hci_version, hw_cfg_cb.hci_revision, hw_cfg_cb.chip_type); - is_proceeding = FALSE; - break; - } - hw_cfg_cb.state = HW_CFG_START; - } -CFG_START: - case HW_CFG_START: - { -#ifdef BT_CHIP_PROBE_SIMULATION - { - int ii; - memcpy(&hw_cfg_test, &hw_cfg_cb, sizeof(hw_cfg_test)); - for(i=0;i 1){ - BTVNDDBG("check_match_state hw_cfg_test(lmp_subversion:0x%04x, hci_version:%d, hci_revision:%d chip_type:%d): Multi Matched Patch\n", hw_cfg_test.lmp_subversion, hw_cfg_test.hci_version, hw_cfg_test.hci_revision, hw_cfg_test.chip_type); - if(bt_chip_chars[i].chip_type != CHIPTYPE_NONE){ - BTVNDDBG("BT_CHIP_PROBE_SIMULATION loop:%d *** Include ChipType ***\n", i); - hw_cfg_test.chip_type = bt_chip_chars[i].chip_type; - if(check_match_state(&hw_cfg_test, PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE) > 1){ - BTVNDDBG("check_match_state hw_cfg_test(lmp_subversion:0x%04x, hci_version:%d, hci_revision:%d chip_type:%d): Multi Matched Patch\n", hw_cfg_test.lmp_subversion, hw_cfg_test.hci_version, hw_cfg_test.hci_revision, hw_cfg_test.chip_type); - }else{ - prtk_patch_file_info = get_patch_entry(&hw_cfg_test); - } - } - }else{ - prtk_patch_file_info = get_patch_entry(&hw_cfg_test); - } - BTVNDDBG("BT_CHIP_PROBE_SIMULATION loop:%d $$$ END $$$\n", i); - } - } -#endif - //get efuse config file and patch code file - prtk_patch_file_info = get_patch_entry(&hw_cfg_cb); - - - if((prtk_patch_file_info == NULL) || (prtk_patch_file_info->lmp_subversion == 0)) - { - ALOGE("get patch entry error"); - is_proceeding = FALSE; - break; - } - hw_cfg_cb.max_patch_size = prtk_patch_file_info->max_patch_size; - hw_cfg_cb.config_len = rtk_get_bt_config(&hw_cfg_cb.config_buf, &hw_cfg_cb.baudrate, prtk_patch_file_info->config_name, prtk_patch_file_info->mac_offset); - if (hw_cfg_cb.config_len < 0) - { - ALOGE("Get Config file fail, just use efuse settings"); - hw_cfg_cb.config_len = 0; - } - rtk_update_altsettings(prtk_patch_file_info, hw_cfg_cb.config_buf, &(hw_cfg_cb.config_len)); - - hw_cfg_cb.fw_len = rtk_get_bt_firmware(&hw_cfg_cb.fw_buf, prtk_patch_file_info->patch_name); - if (hw_cfg_cb.fw_len < 0) - { - ALOGE("Get BT firmware fail"); - hw_cfg_cb.fw_len = 0; - } - else{ - hw_cfg_cb.project_id_mask = prtk_patch_file_info->project_id_mask; - rtk_get_bt_final_patch(&hw_cfg_cb); - } - BTVNDDBG("Check total_len(0x%08x) max_patch_size(0x%08x)", hw_cfg_cb.total_len, hw_cfg_cb.max_patch_size); - if (hw_cfg_cb.total_len > hw_cfg_cb.max_patch_size) - { - ALOGE("total length of fw&config(0x%08x) larger than max_patch_size(0x%08x)", hw_cfg_cb.total_len, hw_cfg_cb.max_patch_size); - is_proceeding = FALSE; - break; - } - - if ((hw_cfg_cb.total_len > 0) && hw_cfg_cb.dl_fw_flag) - { - hw_cfg_cb.patch_frag_cnt = hw_cfg_cb.total_len / PATCH_DATA_FIELD_MAX_SIZE; - hw_cfg_cb.patch_frag_tail = hw_cfg_cb.total_len % PATCH_DATA_FIELD_MAX_SIZE; - if (hw_cfg_cb.patch_frag_tail) - hw_cfg_cb.patch_frag_cnt += 1; - else - hw_cfg_cb.patch_frag_tail = PATCH_DATA_FIELD_MAX_SIZE; - BTVNDDBG("patch fragment count %d, tail len %d", hw_cfg_cb.patch_frag_cnt, hw_cfg_cb.patch_frag_tail); - } - else - { - is_proceeding = FALSE; - break; - } - - if ((hw_cfg_cb.baudrate == 0) && ((hw_cfg_cb.hw_flow_cntrl & 0x80) == 0)) - { - BTVNDDBG("no baudrate to set and no need to set hw flow control"); - goto DOWNLOAD_FW; - } - - if ((hw_cfg_cb.baudrate == 0) && (hw_cfg_cb.hw_flow_cntrl & 0x80)) - { - BTVNDDBG("no baudrate to set but set hw flow control is needed"); - goto SET_HW_FLCNTRL; - } - } - /* fall through intentionally */ - case HW_CFG_SET_UART_BAUD_CONTROLLER: - BTVNDDBG("bt vendor lib: set CONTROLLER UART baud 0x%x", hw_cfg_cb.baudrate); - hw_cfg_cb.state = HW_CFG_SET_UART_BAUD_HOST; - is_proceeding = hw_config_set_controller_baudrate(p_buf, hw_cfg_cb.baudrate); - break; - - case HW_CFG_SET_UART_BAUD_HOST: - /* update baud rate of host's UART port */ - rtk_speed_to_uart_speed(hw_cfg_cb.baudrate, &host_baudrate); - BTVNDDBG("bt vendor lib: set HOST UART baud %i", host_baudrate); - userial_vendor_set_baud(line_speed_to_userial_baud(host_baudrate)); - - if((hw_cfg_cb.hw_flow_cntrl & 0x80) == 0) - goto DOWNLOAD_FW; - -SET_HW_FLCNTRL: - case HW_CFG_SET_UART_HW_FLOW_CONTROL: - BTVNDDBG("Change HW flowcontrol setting"); - if(hw_cfg_cb.hw_flow_cntrl & 0x01) - { - userial_vendor_set_hw_fctrl(1); - } - else - { - userial_vendor_set_hw_fctrl(0); - } - ms_delay(100); - hw_cfg_cb.state = HW_CFG_DL_FW_PATCH; - -DOWNLOAD_FW: - case HW_CFG_DL_FW_PATCH: - BTVNDDBG("bt vendor lib: HW_CFG_DL_FW_PATCH status:%i, opcode:0x%x", status, opcode); - - //recv command complete event for patch code download command - if(opcode == HCI_VSC_DOWNLOAD_FW_PATCH) - { - iIndexRx = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_OFFSET + 1); - BTVNDDBG("bt vendor lib: HW_CFG_DL_FW_PATCH status:%i, iIndexRx:%i", status, iIndexRx); - hw_cfg_cb.patch_frag_idx++; - - if(iIndexRx&0x80) - { - BTVNDDBG("vendor lib fwcfg completed"); - free(hw_cfg_cb.total_buf); - hw_cfg_cb.total_len = 0; - - bt_vendor_cbacks->dealloc(p_buf); - bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); - - hw_cfg_cb.state = 0; - is_proceeding = TRUE; - break; - } - } - - if (hw_cfg_cb.patch_frag_idx < hw_cfg_cb.patch_frag_cnt) - { - iIndexRx = hw_cfg_cb.patch_frag_idx?((hw_cfg_cb.patch_frag_idx-1)%0x7f+1):0; - if (hw_cfg_cb.patch_frag_idx == hw_cfg_cb.patch_frag_cnt - 1) - { - BTVNDDBG("HW_CFG_DL_FW_PATCH: send last fw fragment"); - iIndexRx |= 0x80; - hw_cfg_cb.patch_frag_len = hw_cfg_cb.patch_frag_tail; - } - else - { - iIndexRx &= 0x7F; - hw_cfg_cb.patch_frag_len = PATCH_DATA_FIELD_MAX_SIZE; - } - } - - is_proceeding = hci_download_patch_h4(p_buf, iIndexRx, - hw_cfg_cb.total_buf+(hw_cfg_cb.patch_frag_idx*PATCH_DATA_FIELD_MAX_SIZE), - hw_cfg_cb.patch_frag_len); - break; - - default: - break; - } // switch(hw_cfg_cb.state) - } // if (p_buf != NULL) - - /* Free the RX event buffer */ - if ((bt_vendor_cbacks) && (p_evt_buf != NULL)) - bt_vendor_cbacks->dealloc(p_evt_buf); - - if (is_proceeding == FALSE) - { - ALOGE("vendor lib fwcfg aborted!!!"); - if (bt_vendor_cbacks) - { - if (p_buf != NULL) - bt_vendor_cbacks->dealloc(p_buf); - - bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); - } - - if(hw_cfg_cb.config_len) - { - free(hw_cfg_cb.config_buf); - hw_cfg_cb.config_len = 0; - } - - if(hw_cfg_cb.fw_len) - { - free(hw_cfg_cb.fw_buf); - hw_cfg_cb.fw_len= 0; - } - - if(hw_cfg_cb.total_len) - { - free(hw_cfg_cb.total_buf); - hw_cfg_cb.total_len = 0; - } - hw_cfg_cb.state = 0; - } -} - /****************************************************************************** ** LPM Static Functions ******************************************************************************/ @@ -1465,71 +272,6 @@ void hw_lpm_ctrl_cback(void *p_mem) } -/***************************************************************************** -** Hardware Configuration Interface Functions -*****************************************************************************/ - - -/******************************************************************************* -** -** Function hw_config_start -** -** Description Kick off controller initialization process -** -** Returns None -** -*******************************************************************************/ -void hw_config_start(char transtype) -{ - memset(&hw_cfg_cb, 0, sizeof(bt_hw_cfg_cb_t)); - hw_cfg_cb.dl_fw_flag = 1; - hw_cfg_cb.chip_type = CHIPTYPE_NONE; - BTVNDDBG("RTKBT_RELEASE_NAME: %s",RTKBT_RELEASE_NAME); - BTVNDDBG("\nRealtek libbt-vendor_uart Version %s \n",RTK_VERSION); - HC_BT_HDR *p_buf = NULL; - uint8_t *p; - - BTVNDDBG("hw_config_start, transtype = 0x%x \n", transtype); - /* Start from sending H5 INIT */ - if (bt_vendor_cbacks) - { - /* Must allocate command buffer via HC's alloc API */ - p_buf = (HC_BT_HDR *) bt_vendor_cbacks->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); - - if(transtype & RTKBT_TRANS_H4) { - p = (uint8_t *)(p_buf + 1); - UINT16_TO_STREAM(p, HCI_READ_LMP_VERSION); - *p++ = 0; - p_buf->len = HCI_CMD_PREAMBLE_SIZE; - - hw_cfg_cb.state = HW_CFG_READ_LOCAL_VER; - bt_vendor_cbacks->xmit_cb(HCI_READ_LMP_VERSION, p_buf, hw_config_cback); - } - else { - UINT16_TO_STREAM(p, HCI_VSC_H5_INIT); - *p = 0; /* parameter length */ - hw_cfg_cb.state = HW_CFG_H5_INIT; - - bt_vendor_cbacks->xmit_cb(HCI_VSC_H5_INIT, p_buf, hw_config_cback); - } - } - else { - ALOGE("%s buffer alloc fail!", __func__); - } - } - else - ALOGE("%s call back is null", __func__); -} - #if (HW_END_WITH_HCI_RESET == TRUE) /****************************************************************************** * diff --git a/rtkbt/code/libbt-vendor/src/hardware_uart.c b/rtkbt/code/libbt-vendor/src/hardware_uart.c new file mode 100755 index 0000000..d92630b --- /dev/null +++ b/rtkbt/code/libbt-vendor/src/hardware_uart.c @@ -0,0 +1,1233 @@ +#define LOG_TAG "bt_hwcfg_uart" +#define RTKBT_RELEASE_NAME "20180525_BT_ANDROID_8.1" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bt_hci_bdroid.h" +#include "bt_vendor_rtk.h" +#include "userial.h" +#include "userial_vendor.h" +#include "upio.h" +#include +#include +#include +#include + +#include "bt_vendor_lib.h" +#include "hardware.h" + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ +#define RTK_VERSION "4.1.1" + +extern uint8_t vnd_local_bd_addr[BD_ADDR_LEN]; +extern bool rtkbt_auto_restart; +extern bt_hw_cfg_cb_t hw_cfg_cb; +void hw_config_cback(void *p_evt_buf); +extern int getmacaddr(unsigned char * addr); +extern uint8_t rtk_get_fw_project_id(uint8_t *p_buf); +extern struct rtk_epatch_entry *rtk_get_patch_entry(bt_hw_cfg_cb_t *cfg_cb); +extern int rtk_get_bt_firmware(uint8_t** fw_buf, char* fw_short_name); + + + + +/****************************************************************************** +** Static variables +******************************************************************************/ +//static bt_hw_cfg_cb_t hw_cfg_cb; + +//#define BT_CHIP_PROBE_SIMULATION +#ifdef BT_CHIP_PROBE_SIMULATION +static bt_hw_cfg_cb_t hw_cfg_test; +struct bt_chip_char{ + uint16_t lmp_subversion; + uint8_t hci_version; + uint8_t hci_revision; + uint8_t chip_type; +}; +struct bt_chip_char bt_chip_chars[] = \ +{ + {0x8723, 0x4, 0xb, CHIPTYPE_NONE}, //8703as + {0x8723, 0x6, 0xb, CHIPTYPE_NONE}, //8723bs + {0x8703, 0x4, 0xd, 0x7}, //8703bs + {0x8703, 0x6, 0xb, 0x3}, //8723cs-cg + {0x8703, 0x6, 0xb, 0x4}, //8723cs-vf + {0x8703, 0x6, 0xb, 0x5}, //8723cs-xx + {0x8723, 0x6, 0xd, CHIPTYPE_NONE}, //8723ds +}; +#endif + +typedef struct { + uint16_t lmp_subversion; + uint32_t hci_version_mask; + uint32_t hci_revision_mask; + uint32_t chip_type_mask; + uint32_t project_id_mask; + char *patch_name; + char *config_name; + uint16_t mac_offset; + uint32_t max_patch_size; +} patch_info; + +static patch_info patch_table[] = { +/* lmp_subv hci_version_mask hci_revision_mask chip_type_mask project_id_mask fw name config name mac offset max_patch_size */ + {0x1200, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<0, "rtl8723as_fw", "rtl8723as_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8723AS + + {0x8723, ~(HCI_VERSION_MASK_21), ~(1<<0xd), CHIP_TYPE_MASK_ALL, 1<<1, "rtl8723bs_fw", "rtl8723bs_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8723BS +// {0x8723, ~(HCI_VERSION_MASK_21), ~(1<<0xd), CHIP_TYPE_MASK_ALL, 1<<1, "rtl8723bs_VQ0_fw", "rtl8723bs_VQ0_config", CONFIG_MAC_OFFSET_GEN_1_2}, //Rtl8723BS_VQ0 + {0x8821, HCI_VERSION_MASK_ALL, ~(1<<0xc), CHIP_TYPE_MASK_ALL, 1<<2, "rtl8821as_fw", "rtl8821as_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8821AS + {0x8761, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<3, "rtl8761at_fw", "rtl8761at_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8761AW + {0x8723, HCI_VERSION_MASK_21, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<4, "rtl8703as_fw", "rtl8703as_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, //Rtl8703AS + + {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<7, 1<<6, "rtl8703bs_fw", "rtl8703bs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //Rtl8703BS + {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<5, 1<<7, "rtl8723cs_xx_fw", "rtl8723cs_xx_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //rtl8723cs_xx + {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<3, 1<<7, "rtl8723cs_cg_fw", "rtl8723cs_cg_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //rtl8723cs_cg + {0x8703, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, 1<<4, 1<<7, "rtl8723cs_vf_fw", "rtl8723cs_vf_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //rtl8723cs_vf + {0x8822, HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, 1<<8, "rtl8822bs_fw", "rtl8822bs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, //Rtl8822BS + + {0x8723, HCI_VERSION_MASK_ALL, (1<<0xd), ~(1<<7), 1<<9, "rtl8723ds_fw", "rtl8723ds_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, //Rtl8723ds + {0x8723, HCI_VERSION_MASK_ALL, (1<<0xd), 1<<7, 1<<9, "rtl8703cs_fw", "rtl8703cs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, //Rtl8703cs + {0x8821, HCI_VERSION_MASK_ALL, (1<<0xc), CHIP_TYPE_MASK_ALL, 1<<10, "rtl8821cs_fw", "rtl8821cs_config", CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, //RTL8821CS +/* todo: RTL8703CS */ + + {LMP_SUBVERSION_NONE,HCI_VERSION_MASK_ALL, HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL, PROJECT_ID_MASK_ALL, "rtl_none_fw", "rtl_none_config", CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K} +}; + +/* +static bt_lpm_param_t lpm_param = +{ + LPM_SLEEP_MODE, + LPM_IDLE_THRESHOLD, + LPM_HC_IDLE_THRESHOLD, + LPM_BT_WAKE_POLARITY, + LPM_HOST_WAKE_POLARITY, + LPM_ALLOW_HOST_SLEEP_DURING_SCO, + LPM_COMBINE_SLEEP_MODE_AND_LPM, + LPM_ENABLE_UART_TXD_TRI_STATE,*/ + //0, /* not applicable */ + // 0, /* not applicable */ + // 0, /* not applicable */ + /*LPM_PULSED_HOST_WAKE +};*/ +//signature: realtech +static const uint8_t RTK_EPATCH_SIGNATURE[8]={0x52,0x65,0x61,0x6C,0x74,0x65,0x63,0x68}; +//Extension Section IGNATURE:0x77FD0451 +static const uint8_t EXTENSION_SECTION_SIGNATURE[4]={0x51,0x04,0xFD,0x77}; + +static int check_match_state(bt_hw_cfg_cb_t *cfg,uint32_t mask) +{ + patch_info *patch_entry; + int res = 0; + + for(patch_entry = patch_table; patch_entry->lmp_subversion != LMP_SUBVERSION_NONE; patch_entry++) { + if(patch_entry->lmp_subversion != cfg->lmp_subversion) + continue; + if((patch_entry->hci_version_mask!=HCI_VERSION_MASK_ALL)&&((patch_entry->hci_version_mask&(1<hci_version))==0)) + continue; + if((patch_entry->hci_revision_mask!=HCI_REVISION_MASK_ALL)&&((patch_entry->hci_revision_mask&(1<hci_revision))==0)) + continue; + if((mask&PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE)&&(patch_entry->chip_type_mask != CHIP_TYPE_MASK_ALL)&&((patch_entry->chip_type_mask&(1<chip_type))==0)) + continue; + res++; + } + ALOGI( "check_match_state return %d(cfg->lmp_subversion:0x%x cfg->hci_vesion:0x%x cfg->hci_revision:0x%x cfg->chip_type:0x%x mask:%08x)\n", + res, cfg->lmp_subversion, cfg->hci_version, cfg->hci_revision, cfg->chip_type, mask); + return res; +} + +static patch_info* get_patch_entry(bt_hw_cfg_cb_t *cfg) +{ + patch_info *patch_entry; + + ALOGI("get_patch_entry(lmp_subversion:0x%x hci_vesion:0x%x cfg->hci_revision:0x%x chip_type:0x%x)\n", + cfg->lmp_subversion, cfg->hci_version, cfg->hci_revision, cfg->chip_type); + for(patch_entry = patch_table; patch_entry->lmp_subversion != LMP_SUBVERSION_NONE; patch_entry++) { + if(patch_entry->lmp_subversion != cfg->lmp_subversion) + continue; + if((patch_entry->hci_version_mask != HCI_VERSION_MASK_ALL)&&((patch_entry->hci_version_mask&(1<hci_version)) == 0)) + continue; + if((patch_entry->hci_revision_mask != HCI_REVISION_MASK_ALL)&&((patch_entry->hci_revision_mask&(1<hci_revision)) == 0)) + continue; + if((patch_entry->chip_type_mask != CHIP_TYPE_MASK_ALL)&&((patch_entry->chip_type_mask&(1<chip_type)) == 0)) + continue; + break; + } + ALOGI("get_patch_entry return(patch_name:%s config_name:%s mac_offset:0x%x)\n", + patch_entry->patch_name, patch_entry->config_name, patch_entry->mac_offset); + return patch_entry; +} + +typedef struct _baudrate_ex +{ + uint32_t rtk_speed; + uint32_t uart_speed; +}baudrate_ex; + +baudrate_ex baudrates[] = +{ + {0x00006004, 921600}, + {0x05F75004, 921600},//RTL8723BS + {0x00004003, 1500000}, + {0x04928002, 1500000},//RTL8723BS + {0x00005002, 2000000},//same as RTL8723AS + {0x00008001, 3000000}, + {0x04928001, 3000000},//RTL8723BS + {0x06B58001, 3000000},//add RTL8703as + {0x00007001, 3500000}, + {0x052A6001, 3500000},//RTL8723BS + {0x00005001, 4000000},//same as RTL8723AS + {0x0000701d, 115200}, + {0x0252C014, 115200}//RTL8723BS +}; + +/** +* Change realtek Bluetooth speed to uart speed. It is matching in the struct baudrates: +* +* @code +* baudrate_ex baudrates[] = +* { +* {0x7001, 3500000}, +* {0x6004, 921600}, +* {0x4003, 1500000}, +* {0x5001, 4000000}, +* {0x5002, 2000000}, +* {0x8001, 3000000}, +* {0x701d, 115200} +* }; +* @endcode +* +* If there is no match in baudrates, uart speed will be set as #115200. +* +* @param rtk_speed realtek Bluetooth speed +* @param uart_speed uart speed +* +*/ +static void rtk_speed_to_uart_speed(uint32_t rtk_speed, uint32_t* uart_speed) +{ + *uart_speed = 115200; + + uint8_t i; + for (i=0; i< sizeof(baudrates)/sizeof(baudrate_ex); i++) + { + if (baudrates[i].rtk_speed == rtk_speed) + { + *uart_speed = baudrates[i].uart_speed; + return; + } + } + return; +} + +/** +* Change uart speed to realtek Bluetooth speed. It is matching in the struct baudrates: +* +* @code +* baudrate_ex baudrates[] = +* { +* {0x7001, 3500000}, +* {0x6004, 921600}, +* {0x4003, 1500000}, +* {0x5001, 4000000}, +* {0x5002, 2000000}, +* {0x8001, 3000000}, +* {0x701d, 115200} +* }; +* @endcode +* +* If there is no match in baudrates, realtek Bluetooth speed will be set as #0x701D. +* +* @param uart_speed uart speed +* @param rtk_speed realtek Bluetooth speed +* +*//* +static inline void uart_speed_to_rtk_speed(uint32_t uart_speed, uint32_t* rtk_speed) +{ + *rtk_speed = 0x701D; + + unsigned int i; + for (i=0; i< sizeof(baudrates)/sizeof(baudrate_ex); i++) + { + if (baudrates[i].uart_speed == uart_speed) + { + *rtk_speed = baudrates[i].rtk_speed; + return; + } + } + return; +} +*/ + +/******************************************************************************* +** +** Function hw_config_set_bdaddr +** +** Description Program controller's Bluetooth Device Address +** +** Returns TRUE, if valid address is sent +** FALSE, otherwise +** +*******************************************************************************/ +static uint8_t hw_config_set_controller_baudrate(HC_BT_HDR *p_buf, uint32_t baudrate) +{ + uint8_t retval = FALSE; + uint8_t *p = (uint8_t *) (p_buf + 1); + + UINT16_TO_STREAM(p, HCI_VSC_UPDATE_BAUDRATE); + *p++ = 4; /* parameter length */ + UINT32_TO_STREAM(p, baudrate); + + p_buf->len = HCI_CMD_PREAMBLE_SIZE + 4; + + retval = bt_vendor_cbacks->xmit_cb(HCI_VSC_UPDATE_BAUDRATE, p_buf, \ + hw_config_cback); + + return (retval); +} + +/******************************************************************************* +** +** Function line_speed_to_userial_baud +** +** Description helper function converts line speed number into USERIAL baud +** rate symbol +** +** Returns unit8_t (USERIAL baud symbol) +** +*******************************************************************************/ +static uint8_t line_speed_to_userial_baud(uint32_t line_speed) +{ + uint8_t baud; + + if (line_speed == 4000000) + baud = USERIAL_BAUD_4M; + else if (line_speed == 3000000) + baud = USERIAL_BAUD_3M; + else if (line_speed == 2000000) + baud = USERIAL_BAUD_2M; + else if (line_speed == 1500000) + baud = USERIAL_BAUD_1_5M; + else if (line_speed == 1000000) + baud = USERIAL_BAUD_1M; + else if (line_speed == 921600) + baud = USERIAL_BAUD_921600; + else if (line_speed == 460800) + baud = USERIAL_BAUD_460800; + else if (line_speed == 230400) + baud = USERIAL_BAUD_230400; + else if (line_speed == 115200) + baud = USERIAL_BAUD_115200; + else if (line_speed == 57600) + baud = USERIAL_BAUD_57600; + else if (line_speed == 19200) + baud = USERIAL_BAUD_19200; + else if (line_speed == 9600) + baud = USERIAL_BAUD_9600; + else if (line_speed == 1200) + baud = USERIAL_BAUD_1200; + else if (line_speed == 600) + baud = USERIAL_BAUD_600; + else + { + ALOGE( "userial vendor: unsupported baud speed %d", line_speed); + baud = USERIAL_BAUD_115200; + } + + return baud; +} + + + +/** +* Change uart speed to realtek Bluetooth speed. It is matching in the struct baudrates: +* +* @code +* baudrate_ex baudrates[] = +* { +* {0x7001, 3500000}, +* {0x6004, 921600}, +* {0x4003, 1500000}, +* {0x5001, 4000000}, +* {0x5002, 2000000}, +* {0x8001, 3000000}, +* {0x701d, 115200} +* }; +* @endcode +* +* If there is no match in baudrates, realtek Bluetooth speed will be set as #0x701D. +* +* @param uart_speed uart speed +* @param rtk_speed realtek Bluetooth speed +* +*//* +static inline void uart_speed_to_rtk_speed(uint32_t uart_speed, uint32_t* rtk_speed) +{ + *rtk_speed = 0x701D; + + unsigned int i; + for (i=0; i< sizeof(baudrates)/sizeof(baudrate_ex); i++) + { + if (baudrates[i].uart_speed == uart_speed) + { + *rtk_speed = baudrates[i].rtk_speed; + return; + } + } + return; +} +*/ + + +static inline int getAltSettings(patch_info *patch_entry, unsigned short *offset)//(patch_info *patch_entry, unsigned short *offset, int max_group_cnt) +{ + int n = 0; + if(patch_entry) + offset[n++] = patch_entry->mac_offset; +/* +//sample code, add special settings + + offset[n++] = 0x15B; +*/ + return n; +} +static inline int getAltSettingVal(patch_info *patch_entry, unsigned short offset, unsigned char * val) +{ + int res = 0; + + switch(offset) + { +/* +//sample code, add special settings + case 0x15B: + val[0] = 0x0B; + val[1] = 0x0B; + val[2] = 0x0B; + val[3] = 0x0B; + res = 4; + break; +*/ + default: + res = 0; + break; + } + if((patch_entry)&&(offset == patch_entry->mac_offset)&&(res == 0)) + { + if(getmacaddr(val) == 0){ + ALOGI("MAC: %02x:%02x:%02x:%02x:%02x:%02x", val[5], val[4], val[3], val[2], val[1], val[0]); + res = 6; + } + } + return res; +} + + +static void rtk_update_altsettings(patch_info *patch_entry, unsigned char* config_buf_ptr, size_t *config_len_ptr) +{ + unsigned short offset[256], data_len; + unsigned char val[256]; + + struct rtk_bt_vendor_config* config = (struct rtk_bt_vendor_config*) config_buf_ptr; + struct rtk_bt_vendor_config_entry* entry = config->entry; + size_t config_len = *config_len_ptr; + unsigned int i = 0; + int count = 0,temp = 0, j; + + ALOGI("ORG Config len=%08zx:\n", config_len); + for(i=0;i<=config_len;i+=0x10) + { + ALOGI("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \ + config_buf_ptr[i], config_buf_ptr[i+1], config_buf_ptr[i+2], config_buf_ptr[i+3], config_buf_ptr[i+4], config_buf_ptr[i+5], config_buf_ptr[i+6], config_buf_ptr[i+7], \ + config_buf_ptr[i+8], config_buf_ptr[i+9], config_buf_ptr[i+10], config_buf_ptr[i+11], config_buf_ptr[i+12], config_buf_ptr[i+13], config_buf_ptr[i+14], config_buf_ptr[i+15]); + } + + memset(offset, 0, sizeof(offset)); + memset(val, 0, sizeof(val)); + data_len = le16_to_cpu(config->data_len); + + count = getAltSettings(patch_entry, offset);//getAltSettings(patch_entry, offset, sizeof(offset)/sizeof(unsigned short)); + if(count <= 0){ + ALOGI("rtk_update_altsettings: No AltSettings"); + return; + }else{ + ALOGI("rtk_update_altsettings: %d AltSettings", count); + } + + if (data_len != config_len - sizeof(struct rtk_bt_vendor_config)) + { + ALOGE("rtk_update_altsettings: config len(%x) is not right(%lx)", data_len, (unsigned long)(config_len-sizeof(struct rtk_bt_vendor_config))); + return; + } + + for (i=0; ioffset) == offset[j]) + offset[j] = 0; + } + if(getAltSettingVal(patch_entry, le16_to_cpu(entry->offset), val) == entry->entry_len){ + ALOGI("rtk_update_altsettings: replace %04x[%02x]", le16_to_cpu(entry->offset), entry->entry_len); + memcpy(entry->entry_data, val, entry->entry_len); + } + temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); + i += temp; + entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); + } + for(j = 0; j < count;j++){ + if(offset[j] == 0) + continue; + entry->entry_len = getAltSettingVal(patch_entry, offset[j], val); + if(entry->entry_len <= 0) + continue; + entry->offset = cpu_to_le16(offset[j]); + memcpy(entry->entry_data, val, entry->entry_len); + ALOGI("rtk_update_altsettings: add %04x[%02x]", le16_to_cpu(entry->offset), entry->entry_len); + temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); + i += temp; + entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); + } + config->data_len = cpu_to_le16(i); + *config_len_ptr = i+sizeof(struct rtk_bt_vendor_config); + + ALOGI("NEW Config len=%08zx:\n", *config_len_ptr); + for(i=0;i<=(*config_len_ptr);i+=0x10) + { + ALOGI("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \ + config_buf_ptr[i], config_buf_ptr[i+1], config_buf_ptr[i+2], config_buf_ptr[i+3], config_buf_ptr[i+4], config_buf_ptr[i+5], config_buf_ptr[i+6], config_buf_ptr[i+7], \ + config_buf_ptr[i+8], config_buf_ptr[i+9], config_buf_ptr[i+10], config_buf_ptr[i+11], config_buf_ptr[i+12], config_buf_ptr[i+13], config_buf_ptr[i+14], config_buf_ptr[i+15]); + } + return; +} + + +static uint32_t rtk_parse_config_file(unsigned char** config_buf, size_t* filelen, uint8_t bt_addr[6], uint16_t mac_offset) +{ + struct rtk_bt_vendor_config* config = (struct rtk_bt_vendor_config*) *config_buf; + uint16_t config_len = le16_to_cpu(config->data_len), temp = 0; + struct rtk_bt_vendor_config_entry* entry = config->entry; + unsigned int i = 0; + uint32_t baudrate = 0; + uint8_t heartbeat_buf = 0; + //uint32_t config_has_bdaddr = 0; + uint8_t *p; + + ALOGD("bt_addr = %x", bt_addr[0]); + if (le32_to_cpu(config->signature) != RTK_VENDOR_CONFIG_MAGIC) + { + ALOGE("config signature magic number(0x%x) is not set to RTK_VENDOR_CONFIG_MAGIC", config->signature); + return 0; + } + + if (config_len != *filelen - sizeof(struct rtk_bt_vendor_config)) + { + ALOGE("config len(0x%x) is not right(0x%lx)", config_len, (unsigned long)(*filelen-sizeof(struct rtk_bt_vendor_config))); + return 0; + } + + hw_cfg_cb.heartbeat = 0; + for (i=0; ioffset)) + { + case 0xc: + { + p = (uint8_t *)entry->entry_data; + STREAM_TO_UINT32(baudrate, p); + if (entry->entry_len >= 12) + { + hw_cfg_cb.hw_flow_cntrl |= 0x80; /* bit7 set hw flow control */ + if (entry->entry_data[12] & 0x04) /* offset 0x18, bit2 */ + hw_cfg_cb.hw_flow_cntrl |= 1; /* bit0 enable hw flow control */ + } + + ALOGI("config baud rate to :0x%08x, hwflowcontrol:0x%x, 0x%x", baudrate, entry->entry_data[12], hw_cfg_cb.hw_flow_cntrl); + break; + } + case 0x017a: + { + if(mac_offset == CONFIG_MAC_OFFSET_GEN_1_2) + { + p = (uint8_t *)entry->entry_data; + STREAM_TO_UINT8(heartbeat_buf, p); + if((heartbeat_buf & 0x02) && (heartbeat_buf & 0x10)) + hw_cfg_cb.heartbeat = 1; + else + hw_cfg_cb.heartbeat = 0; + + ALOGI("config 0x017a heartbeat = %d",hw_cfg_cb.heartbeat); + } + break; + } + case 0x01be: + { + if(mac_offset == CONFIG_MAC_OFFSET_GEN_3PLUS) + { + p = (uint8_t *)entry->entry_data; + STREAM_TO_UINT8(heartbeat_buf, p); + if((heartbeat_buf & 0x02) && (heartbeat_buf & 0x10)) + hw_cfg_cb.heartbeat = 1; + else + hw_cfg_cb.heartbeat = 0; + + ALOGI("config 0x01be heartbeat = %d",hw_cfg_cb.heartbeat); + } + break; + } + default: + ALOGI("config offset(0x%x),length(0x%x)", entry->offset, entry->entry_len); + break; + } + temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); + i += temp; + entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); + } + + return baudrate; +} + +static void rtk_get_bt_final_patch(bt_hw_cfg_cb_t* cfg_cb) +{ + uint8_t proj_id = 0; + struct rtk_epatch_entry* entry = NULL; + struct rtk_epatch *patch = (struct rtk_epatch *)cfg_cb->fw_buf; + //int iBtCalLen = 0; + + if(cfg_cb->lmp_subversion == LMPSUBVERSION_8723a) + { + if(memcmp(cfg_cb->fw_buf, RTK_EPATCH_SIGNATURE, 8) == 0) + { + ALOGE("8723as check signature error!"); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + else + { + cfg_cb->total_len = cfg_cb->fw_len + cfg_cb->config_len; + if (!(cfg_cb->total_buf = malloc(cfg_cb->total_len))) + { + ALOGE("can't alloc memory for fw&config, errno:%d", errno); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + else + { + ALOGI("8723as, fw copy direct"); + memcpy(cfg_cb->total_buf, cfg_cb->fw_buf, cfg_cb->fw_len); + memcpy(cfg_cb->total_buf+cfg_cb->fw_len, cfg_cb->config_buf, cfg_cb->config_len); + cfg_cb->dl_fw_flag = 1; + goto free_buf; + } + } + } + + if (memcmp(cfg_cb->fw_buf, RTK_EPATCH_SIGNATURE, 8)) + { + ALOGE("check signature error"); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + /* check the extension section signature */ + if (memcmp(cfg_cb->fw_buf + cfg_cb->fw_len - 4, EXTENSION_SECTION_SIGNATURE, 4)) + { + ALOGE("check extension section signature error"); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + proj_id = rtk_get_fw_project_id(cfg_cb->fw_buf + cfg_cb->fw_len - 5); + + if((hw_cfg_cb.project_id_mask != PROJECT_ID_MASK_ALL)&& ((hw_cfg_cb.project_id_mask&(1<dl_fw_flag = 0; + goto free_buf; + } + + entry = rtk_get_patch_entry(cfg_cb); + if (entry) + { + cfg_cb->total_len = entry->patch_length + cfg_cb->config_len; + } + else + { + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + ALOGI("total_len = 0x%x", cfg_cb->total_len); + + if (!(cfg_cb->total_buf = malloc(cfg_cb->total_len))) + { + ALOGE("Can't alloc memory for multi fw&config, errno:%d", errno); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + else + { + memcpy(cfg_cb->total_buf, cfg_cb->fw_buf + entry->patch_offset, entry->patch_length); + memcpy(cfg_cb->total_buf + entry->patch_length - 4, &patch->fw_version, 4); + memcpy(&entry->svn_version, cfg_cb->total_buf + entry->patch_length - 8, 4); + memcpy(&entry->coex_version, cfg_cb->total_buf + entry->patch_length - 12, 4); + ALOGI("BTCOEX:20%06d-%04x svn_version:%d lmp_subversion:0x%x hci_version:0x%x hci_revision:0x%x chip_type:%d Cut:%d libbt-vendor_uart version:%s\n", + ((entry->coex_version >> 16) & 0x7ff) + ((entry->coex_version >> 27) * 10000), + (entry->coex_version & 0xffff), entry->svn_version, cfg_cb->lmp_subversion, cfg_cb->hci_version, cfg_cb->hci_revision, cfg_cb->chip_type, cfg_cb->eversion+1, RTK_VERSION); + } + + if (cfg_cb->config_len) + { + memcpy(cfg_cb->total_buf+entry->patch_length, cfg_cb->config_buf, cfg_cb->config_len); + } + + cfg_cb->dl_fw_flag = 1; + ALOGI("Fw:%s exists, config file:%s exists", (cfg_cb->fw_len>0)?"":"not", (cfg_cb->config_len>0)?"":"not"); + +free_buf: + if (cfg_cb->fw_len > 0) + { + free(cfg_cb->fw_buf); + cfg_cb->fw_len = 0; + } + + if (cfg_cb->config_len > 0) + { + free(cfg_cb->config_buf); + cfg_cb->config_len = 0; + } + + if(entry) + { + free(entry); + } +} + +static uint32_t rtk_get_bt_config(unsigned char** config_buf, + uint32_t* config_baud_rate, char * config_file_short_name, uint16_t mac_offset) +{ + char bt_config_file_name[PATH_MAX] = {0}; + struct stat st; + size_t filelen; + int fd; + //FILE* file = NULL; + + sprintf(bt_config_file_name, BT_CONFIG_DIRECTORY, config_file_short_name); + ALOGI("BT config file: %s", bt_config_file_name); + + if (stat(bt_config_file_name, &st) < 0) + { + ALOGE("can't access bt config file:%s, errno:%d\n", bt_config_file_name, errno); + return -1; + } + + filelen = st.st_size; + if(filelen > MAX_ORG_CONFIG_SIZE) + { + ALOGE("bt config file is too large(>0x%04x)", MAX_ORG_CONFIG_SIZE); + return -1; + } + + if ((fd = open(bt_config_file_name, O_RDONLY)) < 0) + { + ALOGE("Can't open bt config file"); + return -1; + } + + if ((*config_buf = malloc(MAX_ORG_CONFIG_SIZE+MAX_ALT_CONFIG_SIZE)) == NULL) + { + ALOGE("malloc buffer for config file fail(0x%zx)\n", filelen); + close(fd); + return -1; + } + + if (read(fd, *config_buf, filelen) < (ssize_t)filelen) + { + ALOGE("Can't load bt config file"); + free(*config_buf); + close(fd); + return -1; + } + + *config_baud_rate = rtk_parse_config_file(config_buf, &filelen, vnd_local_bd_addr, mac_offset); + ALOGI("Get config baud rate from config file:0x%x", *config_baud_rate); + + close(fd); + return filelen; +} + + +static int hci_download_patch_h4(HC_BT_HDR *p_buf, int index, uint8_t *data, int len) +{ + uint8_t retval = FALSE; + uint8_t *p = (uint8_t *) (p_buf + 1); + + UINT16_TO_STREAM(p, HCI_VSC_DOWNLOAD_FW_PATCH); + *p++ = 1 + len; /* parameter length */ + *p++ = index; + memcpy(p, data, len); + p_buf->len = HCI_CMD_PREAMBLE_SIZE + 1+len; + + hw_cfg_cb.state = HW_CFG_DL_FW_PATCH; + + retval = bt_vendor_cbacks->xmit_cb(HCI_VSC_DOWNLOAD_FW_PATCH, p_buf, hw_config_cback); + return retval; +} + +/******************************************************************************* +** +** Function hw_config_cback +** +** Description Callback function for controller configuration +** +** Returns None +** +*******************************************************************************/ +void hw_config_cback(void *p_mem) +{ + HC_BT_HDR *p_evt_buf = NULL; + uint8_t *p = NULL, *pp=NULL; + uint8_t status = 0; + uint16_t opcode = 0; + HC_BT_HDR *p_buf = NULL; + uint8_t is_proceeding = FALSE; + int i = 0; + uint8_t iIndexRx = 0; + patch_info* prtk_patch_file_info = NULL; + uint32_t host_baudrate = 0; + +#if (USE_CONTROLLER_BDADDR == TRUE) + //const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0}; +#endif + + if(p_mem != NULL) + { + p_evt_buf = (HC_BT_HDR *) p_mem; + status = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_OFFSET); + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE_OFFSET; + STREAM_TO_UINT16(opcode,p); + } + + if(opcode == HCI_VSC_H5_INIT) { + if(status != 0) { + ALOGE("%s, status = %d", __func__, status); + if ((bt_vendor_cbacks) && (p_evt_buf != NULL)) + bt_vendor_cbacks->dealloc(p_evt_buf); + if(rtkbt_auto_restart) { + bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); + kill(getpid(), SIGKILL); + } + return; + } + } + + /* Ask a new buffer big enough to hold any HCI commands sent in here */ + /*a cut fc6d status==1*/ + if (((status == 0) ||(opcode == HCI_VSC_READ_ROM_VERSION)) && bt_vendor_cbacks) + p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + HCI_CMD_MAX_LEN); + + if (p_buf != NULL) + { + p_buf->event = MSG_STACK_TO_HC_HCI_CMD; + p_buf->offset = 0; + p_buf->len = 0; + p_buf->layer_specific = 0; + + BTVNDDBG("hw_cfg_cb.state = %i", hw_cfg_cb.state); + switch (hw_cfg_cb.state) + { + case HW_CFG_H5_INIT: + { + p = (uint8_t *)(p_buf + 1); + UINT16_TO_STREAM(p, HCI_READ_LMP_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + + hw_cfg_cb.state = HW_CFG_READ_LOCAL_VER; + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_READ_LMP_VERSION, p_buf, hw_config_cback); + break; + } + case HW_CFG_READ_LOCAL_VER: + { + if (status == 0) + { + p = ((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_HCI_VERSION_OFFSET); + STREAM_TO_UINT16(hw_cfg_cb.hci_version, p); + p = ((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_HCI_REVISION_OFFSET); + STREAM_TO_UINT16(hw_cfg_cb.hci_revision, p); + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_LMP_SUBVERSION_OFFSET; + STREAM_TO_UINT16(hw_cfg_cb.lmp_subversion, p); + BTVNDDBG("lmp_subversion = 0x%x hw_cfg_cb.hci_version = 0x%x hw_cfg_cb.hci_revision = 0x%x", hw_cfg_cb.lmp_subversion, hw_cfg_cb.hci_version, hw_cfg_cb.hci_revision); + if(hw_cfg_cb.lmp_subversion == LMPSUBVERSION_8723a) + { + hw_cfg_cb.state = HW_CFG_START; + goto CFG_START; + } + else + { + hw_cfg_cb.state = HW_CFG_READ_ECO_VER; + p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, HCI_VSC_READ_ROM_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_ROM_VERSION, p_buf, hw_config_cback); + } + } + break; + } + case HW_CFG_READ_ECO_VER: + { + if(status == 0) + { + hw_cfg_cb.eversion = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPFC6D_EVERSION_OFFSET); + BTVNDDBG("hw_config_cback chip_id of the IC:%d", hw_cfg_cb.eversion+1); + } + else if(1 == status) + { + hw_cfg_cb.eversion = 0; + } + else + { + is_proceeding = FALSE; + break; + } + + if(check_match_state(&hw_cfg_cb, 0) > 1) // check if have multiple matched patch_entry by lmp_subversion,hci_version, hci_revision + { + hw_cfg_cb.state = HW_CFG_READ_CHIP_TYPE; + p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, HCI_VSC_READ_CHIP_TYPE); + *p++ = 5; + UINT8_TO_STREAM(p, 0x00); + UINT32_TO_STREAM(p, 0xB000A094); + p_buf->len = HCI_CMD_PREAMBLE_SIZE + HCI_CMD_READ_CHIP_TYPE_SIZE; + + pp = (uint8_t *) (p_buf + 1); + for (i = 0; i < p_buf->len; i++) + BTVNDDBG("get chip type command data[%d]= 0x%x", i, *(pp+i)); + + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_CHIP_TYPE, p_buf, hw_config_cback); + break; + } + else + { + hw_cfg_cb.state = HW_CFG_START; + goto CFG_START; + } + } + case HW_CFG_READ_CHIP_TYPE: + { + BTVNDDBG("READ_CHIP_TYPE status = %d, length = %d", status, p_evt_buf->len); + p = (uint8_t *)(p_evt_buf + 1) ; + for (i = 0; i < p_evt_buf->len; i++) + BTVNDDBG("READ_CHIP_TYPE event data[%d]= 0x%x", i, *(p+i)); + if(status == 0) + { + hw_cfg_cb.chip_type = ((*((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPFC61_CHIPTYPE_OFFSET))&0x0F); + BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.lmp_subversion = 0x%x", hw_cfg_cb.lmp_subversion); + BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.hci_version = 0x%x", hw_cfg_cb.hci_version); + BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.hci_revision = 0x%x", hw_cfg_cb.hci_revision); + BTVNDDBG("READ_CHIP_TYPE hw_cfg_cb.chip_type = 0x%x", hw_cfg_cb.chip_type); + } + else + { + is_proceeding = FALSE; + break; + } + if(check_match_state(&hw_cfg_cb, PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE) > 1) // check if have multiple matched patch_entry by lmp_subversion,hci_version, hci_revision and chiptype + { + BTVNDDBG("check_match_state(lmp_subversion:0x%04x, hci_version:%d, hci_revision:%d chip_type:%d): Multi Matched Patch\n", hw_cfg_cb.lmp_subversion, hw_cfg_cb.hci_version, hw_cfg_cb.hci_revision, hw_cfg_cb.chip_type); + is_proceeding = FALSE; + break; + } + hw_cfg_cb.state = HW_CFG_START; + } +CFG_START: + case HW_CFG_START: + { +#ifdef BT_CHIP_PROBE_SIMULATION + { + int ii; + memcpy(&hw_cfg_test, &hw_cfg_cb, sizeof(hw_cfg_test)); + for(i=0;i 1){ + BTVNDDBG("check_match_state hw_cfg_test(lmp_subversion:0x%04x, hci_version:%d, hci_revision:%d chip_type:%d): Multi Matched Patch\n", hw_cfg_test.lmp_subversion, hw_cfg_test.hci_version, hw_cfg_test.hci_revision, hw_cfg_test.chip_type); + if(bt_chip_chars[i].chip_type != CHIPTYPE_NONE){ + BTVNDDBG("BT_CHIP_PROBE_SIMULATION loop:%d *** Include ChipType ***\n", i); + hw_cfg_test.chip_type = bt_chip_chars[i].chip_type; + if(check_match_state(&hw_cfg_test, PATCH_OPTIONAL_MATCH_FLAG_CHIPTYPE) > 1){ + BTVNDDBG("check_match_state hw_cfg_test(lmp_subversion:0x%04x, hci_version:%d, hci_revision:%d chip_type:%d): Multi Matched Patch\n", hw_cfg_test.lmp_subversion, hw_cfg_test.hci_version, hw_cfg_test.hci_revision, hw_cfg_test.chip_type); + }else{ + prtk_patch_file_info = get_patch_entry(&hw_cfg_test); + } + } + }else{ + prtk_patch_file_info = get_patch_entry(&hw_cfg_test); + } + BTVNDDBG("BT_CHIP_PROBE_SIMULATION loop:%d $$$ END $$$\n", i); + } + } +#endif + //get efuse config file and patch code file + prtk_patch_file_info = get_patch_entry(&hw_cfg_cb); + + + if((prtk_patch_file_info == NULL) || (prtk_patch_file_info->lmp_subversion == 0)) + { + ALOGE("get patch entry error"); + is_proceeding = FALSE; + break; + } + hw_cfg_cb.max_patch_size = prtk_patch_file_info->max_patch_size; + hw_cfg_cb.config_len = rtk_get_bt_config(&hw_cfg_cb.config_buf, &hw_cfg_cb.baudrate, prtk_patch_file_info->config_name, prtk_patch_file_info->mac_offset); + if (hw_cfg_cb.config_len < 0) + { + ALOGE("Get Config file fail, just use efuse settings"); + hw_cfg_cb.config_len = 0; + } + rtk_update_altsettings(prtk_patch_file_info, hw_cfg_cb.config_buf, &(hw_cfg_cb.config_len)); + + hw_cfg_cb.fw_len = rtk_get_bt_firmware(&hw_cfg_cb.fw_buf, prtk_patch_file_info->patch_name); + if (hw_cfg_cb.fw_len < 0) + { + ALOGE("Get BT firmware fail"); + hw_cfg_cb.fw_len = 0; + } + else{ + hw_cfg_cb.project_id_mask = prtk_patch_file_info->project_id_mask; + rtk_get_bt_final_patch(&hw_cfg_cb); + } + BTVNDDBG("Check total_len(0x%08x) max_patch_size(0x%08x)", hw_cfg_cb.total_len, hw_cfg_cb.max_patch_size); + if (hw_cfg_cb.total_len > hw_cfg_cb.max_patch_size) + { + ALOGE("total length of fw&config(0x%08x) larger than max_patch_size(0x%08x)", hw_cfg_cb.total_len, hw_cfg_cb.max_patch_size); + is_proceeding = FALSE; + break; + } + + if ((hw_cfg_cb.total_len > 0) && hw_cfg_cb.dl_fw_flag) + { + hw_cfg_cb.patch_frag_cnt = hw_cfg_cb.total_len / PATCH_DATA_FIELD_MAX_SIZE; + hw_cfg_cb.patch_frag_tail = hw_cfg_cb.total_len % PATCH_DATA_FIELD_MAX_SIZE; + if (hw_cfg_cb.patch_frag_tail) + hw_cfg_cb.patch_frag_cnt += 1; + else + hw_cfg_cb.patch_frag_tail = PATCH_DATA_FIELD_MAX_SIZE; + BTVNDDBG("patch fragment count %d, tail len %d", hw_cfg_cb.patch_frag_cnt, hw_cfg_cb.patch_frag_tail); + } + else + { + is_proceeding = FALSE; + break; + } + + if ((hw_cfg_cb.baudrate == 0) && ((hw_cfg_cb.hw_flow_cntrl & 0x80) == 0)) + { + BTVNDDBG("no baudrate to set and no need to set hw flow control"); + goto DOWNLOAD_FW; + } + + if ((hw_cfg_cb.baudrate == 0) && (hw_cfg_cb.hw_flow_cntrl & 0x80)) + { + BTVNDDBG("no baudrate to set but set hw flow control is needed"); + goto SET_HW_FLCNTRL; + } + } + /* fall through intentionally */ + case HW_CFG_SET_UART_BAUD_CONTROLLER: + BTVNDDBG("bt vendor lib: set CONTROLLER UART baud 0x%x", hw_cfg_cb.baudrate); + hw_cfg_cb.state = HW_CFG_SET_UART_BAUD_HOST; + is_proceeding = hw_config_set_controller_baudrate(p_buf, hw_cfg_cb.baudrate); + break; + + case HW_CFG_SET_UART_BAUD_HOST: + /* update baud rate of host's UART port */ + rtk_speed_to_uart_speed(hw_cfg_cb.baudrate, &host_baudrate); + BTVNDDBG("bt vendor lib: set HOST UART baud %i", host_baudrate); + userial_vendor_set_baud(line_speed_to_userial_baud(host_baudrate)); + + if((hw_cfg_cb.hw_flow_cntrl & 0x80) == 0) + goto DOWNLOAD_FW; + +SET_HW_FLCNTRL: + case HW_CFG_SET_UART_HW_FLOW_CONTROL: + BTVNDDBG("Change HW flowcontrol setting"); + if(hw_cfg_cb.hw_flow_cntrl & 0x01) + { + userial_vendor_set_hw_fctrl(1); + } + else + { + userial_vendor_set_hw_fctrl(0); + } + ms_delay(100); + hw_cfg_cb.state = HW_CFG_DL_FW_PATCH; + +DOWNLOAD_FW: + case HW_CFG_DL_FW_PATCH: + BTVNDDBG("bt vendor lib: HW_CFG_DL_FW_PATCH status:%i, opcode:0x%x", status, opcode); + + //recv command complete event for patch code download command + if(opcode == HCI_VSC_DOWNLOAD_FW_PATCH) + { + iIndexRx = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_OFFSET + 1); + BTVNDDBG("bt vendor lib: HW_CFG_DL_FW_PATCH status:%i, iIndexRx:%i", status, iIndexRx); + hw_cfg_cb.patch_frag_idx++; + + if(iIndexRx&0x80) + { + BTVNDDBG("vendor lib fwcfg completed"); + free(hw_cfg_cb.total_buf); + hw_cfg_cb.total_len = 0; + + bt_vendor_cbacks->dealloc(p_buf); + bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); + + hw_cfg_cb.state = 0; + is_proceeding = TRUE; + break; + } + } + + if (hw_cfg_cb.patch_frag_idx < hw_cfg_cb.patch_frag_cnt) + { + iIndexRx = hw_cfg_cb.patch_frag_idx?((hw_cfg_cb.patch_frag_idx-1)%0x7f+1):0; + if (hw_cfg_cb.patch_frag_idx == hw_cfg_cb.patch_frag_cnt - 1) + { + BTVNDDBG("HW_CFG_DL_FW_PATCH: send last fw fragment"); + iIndexRx |= 0x80; + hw_cfg_cb.patch_frag_len = hw_cfg_cb.patch_frag_tail; + } + else + { + iIndexRx &= 0x7F; + hw_cfg_cb.patch_frag_len = PATCH_DATA_FIELD_MAX_SIZE; + } + } + + is_proceeding = hci_download_patch_h4(p_buf, iIndexRx, + hw_cfg_cb.total_buf+(hw_cfg_cb.patch_frag_idx*PATCH_DATA_FIELD_MAX_SIZE), + hw_cfg_cb.patch_frag_len); + break; + + default: + break; + } // switch(hw_cfg_cb.state) + } // if (p_buf != NULL) + + /* Free the RX event buffer */ + if ((bt_vendor_cbacks) && (p_evt_buf != NULL)) + bt_vendor_cbacks->dealloc(p_evt_buf); + + if (is_proceeding == FALSE) + { + ALOGE("vendor lib fwcfg aborted!!!"); + if (bt_vendor_cbacks) + { + if (p_buf != NULL) + bt_vendor_cbacks->dealloc(p_buf); + + bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); + } + + if(hw_cfg_cb.config_len) + { + free(hw_cfg_cb.config_buf); + hw_cfg_cb.config_len = 0; + } + + if(hw_cfg_cb.fw_len) + { + free(hw_cfg_cb.fw_buf); + hw_cfg_cb.fw_len= 0; + } + + if(hw_cfg_cb.total_len) + { + free(hw_cfg_cb.total_buf); + hw_cfg_cb.total_len = 0; + } + hw_cfg_cb.state = 0; + } +} + +/***************************************************************************** +** Hardware Configuration Interface Functions +*****************************************************************************/ + + +/******************************************************************************* +** +** Function hw_config_start +** +** Description Kick off controller initialization process +** +** Returns None +** +*******************************************************************************/ +void hw_config_start(char transtype) +{ + memset(&hw_cfg_cb, 0, sizeof(bt_hw_cfg_cb_t)); + hw_cfg_cb.dl_fw_flag = 1; + hw_cfg_cb.chip_type = CHIPTYPE_NONE; + BTVNDDBG("RTKBT_RELEASE_NAME: %s",RTKBT_RELEASE_NAME); + BTVNDDBG("\nRealtek libbt-vendor_uart Version %s \n",RTK_VERSION); + HC_BT_HDR *p_buf = NULL; + uint8_t *p; + + BTVNDDBG("hw_config_start, transtype = 0x%x \n", transtype); + /* Start from sending H5 INIT */ + if (bt_vendor_cbacks) + { + /* Must allocate command buffer via HC's alloc API */ + p_buf = (HC_BT_HDR *) bt_vendor_cbacks->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); + + if(transtype & RTKBT_TRANS_H4) { + p = (uint8_t *)(p_buf + 1); + UINT16_TO_STREAM(p, HCI_READ_LMP_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + + hw_cfg_cb.state = HW_CFG_READ_LOCAL_VER; + bt_vendor_cbacks->xmit_cb(HCI_READ_LMP_VERSION, p_buf, hw_config_cback); + } + else { + UINT16_TO_STREAM(p, HCI_VSC_H5_INIT); + *p = 0; /* parameter length */ + hw_cfg_cb.state = HW_CFG_H5_INIT; + + bt_vendor_cbacks->xmit_cb(HCI_VSC_H5_INIT, p_buf, hw_config_cback); + } + } + else { + ALOGE("%s buffer alloc fail!", __func__); + } + } + else + ALOGE("%s call back is null", __func__); +} + diff --git a/rtkbt/code/libbt-vendor/src/hardware_usb.c b/rtkbt/code/libbt-vendor/src/hardware_usb.c new file mode 100755 index 0000000..cf8aa77 --- /dev/null +++ b/rtkbt/code/libbt-vendor/src/hardware_usb.c @@ -0,0 +1,930 @@ +#define LOG_TAG "bt_hwcfg_usb" +#define RTKBT_RELEASE_NAME "Test" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bt_hci_bdroid.h" +#include "bt_vendor_rtk.h" +#include "userial.h" +#include "userial_vendor.h" +#include "upio.h" +#include +#include +#include +#include + +#include "bt_vendor_lib.h" +#include "hardware.h" + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ +#define RTK_VERSION "4.1.1" + +extern uint8_t vnd_local_bd_addr[BD_ADDR_LEN]; +extern bool rtkbt_auto_restart; +void hw_usb_config_cback(void *p_evt_buf); +extern bt_hw_cfg_cb_t hw_cfg_cb; +extern int getmacaddr(unsigned char * addr); +extern struct rtk_epatch_entry *rtk_get_patch_entry(bt_hw_cfg_cb_t *cfg_cb); +extern int rtk_get_bt_firmware(uint8_t** fw_buf, char* fw_short_name); +extern uint8_t rtk_get_fw_project_id(uint8_t *p_buf); + + +/****************************************************************************** +** Static variables +******************************************************************************/ +//static bt_hw_cfg_cb_t hw_cfg_cb; + +typedef struct { + uint16_t vid; + uint16_t pid; + uint16_t lmp_sub_default; + uint16_t lmp_sub; + uint16_t eversion; + char *mp_patch_name; + char *patch_name; + char *config_name; + uint8_t *fw_cache; + int fw_len; + uint16_t mac_offset; + uint32_t max_patch_size; +} usb_patch_info; + +static usb_patch_info usb_fw_patch_table[] = { +/* { vid, pid, lmp_sub_default, lmp_sub, everion, mp_fw_name, fw_name, config_name, fw_cache, fw_len, mac_offset } */ +{ 0x0BDA, 0x1724, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723A */ +{ 0x0BDA, 0x8723, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AE */ +{ 0x0BDA, 0xA723, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AE for LI */ +{ 0x0BDA, 0x0723, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AE */ +{ 0x13D3, 0x3394, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AE for Azurewave*/ + +{ 0x0BDA, 0x0724, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AU */ +{ 0x0BDA, 0x8725, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AU */ +{ 0x0BDA, 0x872A, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AU */ +{ 0x0BDA, 0x872B, 0x1200, 0, 0, "mp_rtl8723a_fw", "rtl8723a_fw", "rtl8723a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* 8723AU */ + +{ 0x0BDA, 0xb720, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723bu_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BU */ +{ 0x0BDA, 0xb72A, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723bu_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BU */ +{ 0x0BDA, 0xb728, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for LC */ +{ 0x0BDA, 0xb723, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE */ +{ 0x0BDA, 0xb72B, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE */ +{ 0x0BDA, 0xb001, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for HP */ +{ 0x0BDA, 0xb002, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE */ +{ 0x0BDA, 0xb003, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE */ +{ 0x0BDA, 0xb004, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE */ +{ 0x0BDA, 0xb005, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE */ + +{ 0x13D3, 0x3410, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for Azurewave */ +{ 0x13D3, 0x3416, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for Azurewave */ +{ 0x13D3, 0x3459, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for Azurewave */ +{ 0x0489, 0xE085, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for Foxconn */ +{ 0x0489, 0xE08B, 0x8723, 0, 0, "mp_rtl8723b_fw", "rtl8723b_fw", "rtl8723b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8723BE for Foxconn */ + +{ 0x0BDA, 0x2850, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU */ +{ 0x0BDA, 0xA761, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU only */ +{ 0x0BDA, 0x818B, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761aw8192eu_fw", "rtl8761aw8192eu_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AW + 8192EU */ +{ 0x0BDA, 0x818C, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761aw8192eu_fw", "rtl8761aw8192eu_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AW + 8192EU */ +{ 0x0BDA, 0x8760, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au8192ee_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU + 8192EE */ +{ 0x0BDA, 0xB761, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AUV only */ +{ 0x0BDA, 0x8761, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au8192ee_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU + 8192EE for LI */ +{ 0x0BDA, 0x8A60, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au8812ae_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU + 8812AE */ + +{ 0x0BDA, 0x8821, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */ +{ 0x0BDA, 0x0821, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */ +{ 0x0BDA, 0x0823, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AU */ +{ 0x13D3, 0x3414, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */ +{ 0x13D3, 0x3458, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */ +{ 0x13D3, 0x3461, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */ +{ 0x13D3, 0x3462, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */ + +{ 0x0BDA, 0xB822, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8822BE */ +{ 0x0BDA, 0xB82C, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8822BU */ +{ 0x0BDA, 0xB023, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8822BE */ +{ 0x0BDA, 0xB703, 0x8703, 0, 0, "mp_rtl8723c_fw", "rtl8723c_fw", "rtl8723c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8723CU */ +/* todo: RTL8703BU */ + +{ 0x0BDA, 0xD723, 0x8723, 0, 0, "mp_rtl8723d_fw", "rtl8723d_fw", "rtl8723d_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723DU */ +{ 0x0BDA, 0xD720, 0x8723, 0, 0, "mp_rtl8723d_fw", "rtl8723d_fw", "rtl8723d_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723DE */ +{ 0x0BDA, 0xB820, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CU */ +{ 0x0BDA, 0xC820, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CU */ +{ 0x0BDA, 0xC821, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CE */ +/* todo: RTL8703CU */ + +/* NOTE: must append patch entries above the null entry */ +{ 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0 } +}; + + +uint16_t usb_project_id[] = { + ROM_LMP_8723a, + ROM_LMP_8723b, + ROM_LMP_8821a, + ROM_LMP_8761a, + ROM_LMP_8703a, + ROM_LMP_8763a, + ROM_LMP_8703b, + ROM_LMP_8723c, + ROM_LMP_8822b, + ROM_LMP_8723d, + ROM_LMP_8821c, + ROM_LMP_NONE +}; +//signature: realtech +static const uint8_t RTK_EPATCH_SIGNATURE[8]={0x52,0x65,0x61,0x6C,0x74,0x65,0x63,0x68}; +//Extension Section IGNATURE:0x77FD0451 +static const uint8_t EXTENSION_SECTION_SIGNATURE[4]={0x51,0x04,0xFD,0x77}; + +static inline int getUsbAltSettings(usb_patch_info *patch_entry, unsigned short *offset)//(patch_info *patch_entry, unsigned short *offset, int max_group_cnt) +{ + int n = 0; + if(patch_entry) + offset[n++] = patch_entry->mac_offset; +/* +//sample code, add special settings + + offset[n++] = 0x15B; +*/ + return n; +} + +static inline int getUsbAltSettingVal(usb_patch_info *patch_entry, unsigned short offset, unsigned char * val) +{ + int res = 0; + + switch(offset) + { +/* +//sample code, add special settings + case 0x15B: + val[0] = 0x0B; + val[1] = 0x0B; + val[2] = 0x0B; + val[3] = 0x0B; + res = 4; + break; +*/ + default: + res = 0; + break; + } + if((patch_entry)&&(offset == patch_entry->mac_offset)&&(res == 0)) + { + if(getmacaddr(val) == 0){ + ALOGI("MAC: %02x:%02x:%02x:%02x:%02x:%02x", val[5], val[4], val[3], val[2], val[1], val[0]); + res = 6; + } + } + return res; +} + +static void rtk_usb_update_altsettings(usb_patch_info *patch_entry, unsigned char* config_buf_ptr, size_t *config_len_ptr) +{ + unsigned short offset[256], data_len; + unsigned char val[256]; + + struct rtk_bt_vendor_config* config = (struct rtk_bt_vendor_config*) config_buf_ptr; + struct rtk_bt_vendor_config_entry* entry = config->entry; + size_t config_len = *config_len_ptr; + unsigned int i = 0; + int count = 0,temp = 0, j; + + ALOGI("ORG Config len=%08zx:\n", config_len); + for(i=0;i<=config_len;i+=0x10) + { + ALOGI("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \ + config_buf_ptr[i], config_buf_ptr[i+1], config_buf_ptr[i+2], config_buf_ptr[i+3], config_buf_ptr[i+4], config_buf_ptr[i+5], config_buf_ptr[i+6], config_buf_ptr[i+7], \ + config_buf_ptr[i+8], config_buf_ptr[i+9], config_buf_ptr[i+10], config_buf_ptr[i+11], config_buf_ptr[i+12], config_buf_ptr[i+13], config_buf_ptr[i+14], config_buf_ptr[i+15]); + } + + memset(offset, 0, sizeof(offset)); + memset(val, 0, sizeof(val)); + data_len = le16_to_cpu(config->data_len); + + count = getUsbAltSettings(patch_entry, offset);//getAltSettings(patch_entry, offset, sizeof(offset)/sizeof(unsigned short)); + if(count <= 0){ + ALOGI("rtk_update_altsettings: No AltSettings"); + return; + }else{ + ALOGI("rtk_update_altsettings: %d AltSettings", count); + } + + if (data_len != config_len - sizeof(struct rtk_bt_vendor_config)) + { + ALOGE("rtk_update_altsettings: config len(%x) is not right(%lx)", data_len, (unsigned long)(config_len-sizeof(struct rtk_bt_vendor_config))); + return; + } + + for (i=0; ioffset) == offset[j]) + offset[j] = 0; + } + if(getUsbAltSettingVal(patch_entry, le16_to_cpu(entry->offset), val) == entry->entry_len){ + ALOGI("rtk_update_altsettings: replace %04x[%02x]", le16_to_cpu(entry->offset), entry->entry_len); + memcpy(entry->entry_data, val, entry->entry_len); + } + temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); + i += temp; + entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); + } + for(j = 0; j < count;j++){ + if(offset[j] == 0) + continue; + entry->entry_len = getUsbAltSettingVal(patch_entry, offset[j], val); + if(entry->entry_len <= 0) + continue; + entry->offset = cpu_to_le16(offset[j]); + memcpy(entry->entry_data, val, entry->entry_len); + ALOGI("rtk_update_altsettings: add %04x[%02x]", le16_to_cpu(entry->offset), entry->entry_len); + temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); + i += temp; + entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); + } + config->data_len = cpu_to_le16(i); + *config_len_ptr = i+sizeof(struct rtk_bt_vendor_config); + + ALOGI("NEW Config len=%08zx:\n", *config_len_ptr); + for(i=0;i<=(*config_len_ptr);i+=0x10) + { + ALOGI("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \ + config_buf_ptr[i], config_buf_ptr[i+1], config_buf_ptr[i+2], config_buf_ptr[i+3], config_buf_ptr[i+4], config_buf_ptr[i+5], config_buf_ptr[i+6], config_buf_ptr[i+7], \ + config_buf_ptr[i+8], config_buf_ptr[i+9], config_buf_ptr[i+10], config_buf_ptr[i+11], config_buf_ptr[i+12], config_buf_ptr[i+13], config_buf_ptr[i+14], config_buf_ptr[i+15]); + } + return; +} + + +static void rtk_usb_parse_config_file(unsigned char** config_buf, size_t* filelen, uint8_t bt_addr[6], uint16_t mac_offset) +{ + struct rtk_bt_vendor_config* config = (struct rtk_bt_vendor_config*) *config_buf; + uint16_t config_len = le16_to_cpu(config->data_len), temp = 0; + struct rtk_bt_vendor_config_entry* entry = config->entry; + unsigned int i = 0; + uint8_t heartbeat_buf = 0; + //uint32_t config_has_bdaddr = 0; + uint8_t *p; + + ALOGD("bt_addr = %x", bt_addr[0]); + if (le32_to_cpu(config->signature) != RTK_VENDOR_CONFIG_MAGIC) + { + ALOGE("config signature magic number(0x%x) is not set to RTK_VENDOR_CONFIG_MAGIC", config->signature); + return; + } + + if (config_len != *filelen - sizeof(struct rtk_bt_vendor_config)) + { + ALOGE("config len(0x%x) is not right(0x%zx)", config_len, *filelen-sizeof(struct rtk_bt_vendor_config)); + return; + } + + hw_cfg_cb.heartbeat = 0; + for (i=0; ioffset)) + { + case 0x017a: + { + if(mac_offset == CONFIG_MAC_OFFSET_GEN_1_2) + { + p = (uint8_t *)entry->entry_data; + STREAM_TO_UINT8(heartbeat_buf, p); + if((heartbeat_buf & 0x02) && (heartbeat_buf & 0x10)) + hw_cfg_cb.heartbeat = 1; + else + hw_cfg_cb.heartbeat = 0; + + ALOGI("config 0x017a heartbeat = %d",hw_cfg_cb.heartbeat); + } + break; + } + case 0x01be: + { + if(mac_offset == CONFIG_MAC_OFFSET_GEN_3PLUS) + { + p = (uint8_t *)entry->entry_data; + STREAM_TO_UINT8(heartbeat_buf, p); + if((heartbeat_buf & 0x02) && (heartbeat_buf & 0x10)) + hw_cfg_cb.heartbeat = 1; + else + hw_cfg_cb.heartbeat = 0; + + ALOGI("config 0x01be heartbeat = %d",hw_cfg_cb.heartbeat); + } + break; + } + default: + ALOGI("config offset(0x%x),length(0x%x)", entry->offset, entry->entry_len); + break; + } + temp = entry->entry_len + sizeof(struct rtk_bt_vendor_config_entry); + i += temp; + entry = (struct rtk_bt_vendor_config_entry*)((uint8_t*)entry + temp); + } + + return; +} + +static uint32_t rtk_usb_get_bt_config(unsigned char** config_buf, + char * config_file_short_name, uint16_t mac_offset) +{ + char bt_config_file_name[PATH_MAX] = {0}; + struct stat st; + size_t filelen; + int fd; + //FILE* file = NULL; + + sprintf(bt_config_file_name, BT_CONFIG_DIRECTORY, config_file_short_name); + ALOGI("BT config file: %s", bt_config_file_name); + + if (stat(bt_config_file_name, &st) < 0) + { + ALOGE("can't access bt config file:%s, errno:%d\n", bt_config_file_name, errno); + return -1; + } + + filelen = st.st_size; + if(filelen > MAX_ORG_CONFIG_SIZE) + { + ALOGE("bt config file is too large(>0x%04x)", MAX_ORG_CONFIG_SIZE); + return -1; + } + + if ((fd = open(bt_config_file_name, O_RDONLY)) < 0) + { + ALOGE("Can't open bt config file"); + return -1; + } + + if ((*config_buf = malloc(MAX_ORG_CONFIG_SIZE+MAX_ALT_CONFIG_SIZE)) == NULL) + { + ALOGE("malloc buffer for config file fail(0x%zx)\n", filelen); + close(fd); + return -1; + } + + if (read(fd, *config_buf, filelen) < (ssize_t)filelen) + { + ALOGE("Can't load bt config file"); + free(*config_buf); + close(fd); + return -1; + } + + rtk_usb_parse_config_file(config_buf, &filelen, vnd_local_bd_addr, mac_offset); + + close(fd); + return filelen; +} + +static usb_patch_info *rtk_usb_get_fw_table_entry(uint16_t vid, uint16_t pid) +{ + usb_patch_info *patch_entry = usb_fw_patch_table; + + uint32_t entry_size = sizeof(usb_fw_patch_table) / sizeof(usb_fw_patch_table[0]); + uint32_t i; + + for (i = 0; i < entry_size; i++, patch_entry++) { + if ((vid == patch_entry->vid)&&(pid == patch_entry->pid)) + break; + } + + if (i == entry_size) { + ALOGE("%s: No fw table entry found", __func__); + return NULL; + } + + return patch_entry; +} + +static void rtk_usb_get_bt_final_patch(bt_hw_cfg_cb_t* cfg_cb) +{ + uint8_t proj_id = 0; + struct rtk_epatch_entry* entry = NULL; + struct rtk_epatch *patch = (struct rtk_epatch *)cfg_cb->fw_buf; + //int iBtCalLen = 0; + + if(cfg_cb->lmp_subversion == LMPSUBVERSION_8723a) + { + if(memcmp(cfg_cb->fw_buf, RTK_EPATCH_SIGNATURE, 8) == 0) + { + ALOGE("8723as check signature error!"); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + else + { + cfg_cb->total_len = cfg_cb->fw_len + cfg_cb->config_len; + if (!(cfg_cb->total_buf = malloc(cfg_cb->total_len))) + { + ALOGE("can't alloc memory for fw&config, errno:%d", errno); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + else + { + ALOGI("8723as, fw copy direct"); + memcpy(cfg_cb->total_buf, cfg_cb->fw_buf, cfg_cb->fw_len); + memcpy(cfg_cb->total_buf+cfg_cb->fw_len, cfg_cb->config_buf, cfg_cb->config_len); + //cfg_cb->lmp_sub_current = *(uint16_t *)(cfg_cb->total_buf + cfg_cb->total_len - cfg_cb->config_len - 4); + cfg_cb->dl_fw_flag = 1; + goto free_buf; + } + } + } + + if (memcmp(cfg_cb->fw_buf, RTK_EPATCH_SIGNATURE, 8)) + { + ALOGE("check signature error"); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + /* check the extension section signature */ + if (memcmp(cfg_cb->fw_buf + cfg_cb->fw_len - 4, EXTENSION_SECTION_SIGNATURE, 4)) + { + ALOGE("check extension section signature error"); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + proj_id = rtk_get_fw_project_id(cfg_cb->fw_buf + cfg_cb->fw_len - 5); + if(usb_project_id[proj_id] != hw_cfg_cb.lmp_subversion_default) + { + ALOGE("usb_project_id is 0x%08x, fw project_id is %d, does not match!!!", + usb_project_id[proj_id], hw_cfg_cb.lmp_subversion); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + entry = rtk_get_patch_entry(cfg_cb); + if (entry) + { + cfg_cb->total_len = entry->patch_length + cfg_cb->config_len; + } + else + { + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + + ALOGI("total_len = 0x%x", cfg_cb->total_len); + + if (!(cfg_cb->total_buf = malloc(cfg_cb->total_len))) + { + ALOGE("Can't alloc memory for multi fw&config, errno:%d", errno); + cfg_cb->dl_fw_flag = 0; + goto free_buf; + } + else + { + memcpy(cfg_cb->total_buf, cfg_cb->fw_buf + entry->patch_offset, entry->patch_length); + memcpy(cfg_cb->total_buf + entry->patch_length - 4, &patch->fw_version, 4); + memcpy(&entry->svn_version, cfg_cb->total_buf + entry->patch_length - 8, 4); + memcpy(&entry->coex_version, cfg_cb->total_buf + entry->patch_length - 12, 4); + + ALOGI("BTCOEX:20%06d-%04x svn_version:%d lmp_subversion:0x%x hci_version:0x%x hci_revision:0x%x chip_type:%d Cut:%d libbt-vendor_uart version:%s, patch->fw_version = %x\n", + ((entry->coex_version >> 16) & 0x7ff) + ((entry->coex_version >> 27) * 10000), + (entry->coex_version & 0xffff), entry->svn_version, cfg_cb->lmp_subversion, cfg_cb->hci_version, cfg_cb->hci_revision, cfg_cb->chip_type, cfg_cb->eversion+1, RTK_VERSION, patch->fw_version); + } + + if (cfg_cb->config_len) + { + memcpy(cfg_cb->total_buf+entry->patch_length, cfg_cb->config_buf, cfg_cb->config_len); + } + + cfg_cb->dl_fw_flag = 1; + ALOGI("Fw:%s exists, config file:%s exists", (cfg_cb->fw_len>0)?"":"not", (cfg_cb->config_len>0)?"":"not"); + +free_buf: + if (cfg_cb->fw_len > 0) + { + free(cfg_cb->fw_buf); + cfg_cb->fw_len = 0; + } + + if (cfg_cb->config_len > 0) + { + free(cfg_cb->config_buf); + cfg_cb->config_len = 0; + } + + if(entry) + { + free(entry); + } +} + +static int usb_hci_download_patch_h4(HC_BT_HDR *p_buf, int index, uint8_t *data, int len) +{ + uint8_t retval = FALSE; + uint8_t *p = (uint8_t *) (p_buf + 1); + + UINT16_TO_STREAM(p, HCI_VSC_DOWNLOAD_FW_PATCH); + *p++ = 1 + len; /* parameter length */ + *p++ = index; + memcpy(p, data, len); + p_buf->len = HCI_CMD_PREAMBLE_SIZE + 1+len; + + hw_cfg_cb.state = HW_CFG_DL_FW_PATCH; + + retval = bt_vendor_cbacks->xmit_cb(HCI_VSC_DOWNLOAD_FW_PATCH, p_buf, hw_usb_config_cback); + return retval; +} + +static void rtk_usb_get_fw_version(bt_hw_cfg_cb_t* cfg_cb) +{ + struct rtk_epatch *patch = (struct rtk_epatch *)cfg_cb->fw_buf; + + if(cfg_cb->lmp_subversion == LMPSUBVERSION_8723a) + { + cfg_cb->lmp_sub_current = 0; + } + else + { + cfg_cb->lmp_sub_current = (uint16_t)patch->fw_version; + } + +} +/******************************************************************************* +** +** Function hw_usb_config_cback +** +** Description Callback function for controller configuration +** +** Returns None +** +*******************************************************************************/ +void hw_usb_config_cback(void *p_mem) +{ + HC_BT_HDR *p_evt_buf = NULL; + uint8_t *p = NULL;//, *pp=NULL; + uint8_t status = 0; + uint16_t opcode = 0; + HC_BT_HDR *p_buf = NULL; + uint8_t is_proceeding = FALSE; + //int i = 0; + uint8_t iIndexRx = 0; + //patch_info* prtk_patch_file_info = NULL; + usb_patch_info* prtk_usb_patch_file_info = NULL; + //uint32_t host_baudrate = 0; + +#if (USE_CONTROLLER_BDADDR == TRUE) + //const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0}; +#endif + + if(p_mem != NULL) + { + p_evt_buf = (HC_BT_HDR *) p_mem; + status = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_OFFSET); + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE_OFFSET; + STREAM_TO_UINT16(opcode,p); + } + + /* Ask a new buffer big enough to hold any HCI commands sent in here */ + /*a cut fc6d status==1*/ + if (((status == 0) ||(opcode == HCI_VSC_READ_ROM_VERSION)) && bt_vendor_cbacks) + p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + HCI_CMD_MAX_LEN); + + if (p_buf != NULL) + { + p_buf->event = MSG_STACK_TO_HC_HCI_CMD; + p_buf->offset = 0; + p_buf->len = 0; + p_buf->layer_specific = 0; + + BTVNDDBG("hw_cfg_cb.state = %i", hw_cfg_cb.state); + switch (hw_cfg_cb.state) + { + case HW_CFG_RESET_CHANNEL_CONTROLLER: + { + usleep(300000); + hw_cfg_cb.state = HW_CFG_READ_LOCAL_VER; + p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, HCI_READ_LMP_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_READ_LMP_VERSION, p_buf, hw_usb_config_cback); + break; + } + case HW_CFG_READ_LOCAL_VER: + { + if (status == 0) + { + p = ((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_HCI_VERSION_OFFSET); + STREAM_TO_UINT16(hw_cfg_cb.hci_version, p); + p = ((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_HCI_REVISION_OFFSET); + STREAM_TO_UINT16(hw_cfg_cb.hci_revision, p); + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OP1001_LMP_SUBVERSION_OFFSET; + STREAM_TO_UINT16(hw_cfg_cb.lmp_subversion, p); + + prtk_usb_patch_file_info = rtk_usb_get_fw_table_entry(hw_cfg_cb.vid, hw_cfg_cb.pid); + if((prtk_usb_patch_file_info == NULL) || (prtk_usb_patch_file_info->lmp_sub_default == 0)) + { + ALOGE("get patch entry error"); + is_proceeding = FALSE; + break; + } + hw_cfg_cb.config_len = rtk_usb_get_bt_config(&hw_cfg_cb.config_buf, prtk_usb_patch_file_info->config_name, prtk_usb_patch_file_info->mac_offset); + hw_cfg_cb.fw_len = rtk_get_bt_firmware(&hw_cfg_cb.fw_buf, prtk_usb_patch_file_info->patch_name); + rtk_usb_get_fw_version(&hw_cfg_cb); + + hw_cfg_cb.lmp_subversion_default = prtk_usb_patch_file_info->lmp_sub_default; + BTVNDDBG("lmp_subversion = 0x%x hw_cfg_cb.hci_version = 0x%x hw_cfg_cb.hci_revision = 0x%x, hw_cfg_cb.lmp_sub_current = 0x%x", hw_cfg_cb.lmp_subversion, hw_cfg_cb.hci_version, hw_cfg_cb.hci_revision, hw_cfg_cb.lmp_sub_current); + + if(prtk_usb_patch_file_info->lmp_sub_default == hw_cfg_cb.lmp_subversion) + { + BTVNDDBG("%s: Cold BT controller startup", __func__); + //hw_cfg_cb.state = HW_CFG_START; + //goto CFG_USB_START; + hw_cfg_cb.state = HW_CFG_READ_ECO_VER; + p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, HCI_VSC_READ_ROM_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_ROM_VERSION, p_buf, hw_usb_config_cback); + } + else if (hw_cfg_cb.lmp_subversion != hw_cfg_cb.lmp_sub_current) + { + BTVNDDBG("%s: Warm BT controller startup with updated lmp", __func__); + goto RESET_HW_CONTROLLER; + } + else + { + BTVNDDBG("%s: Warm BT controller startup with same lmp", __func__); + free(hw_cfg_cb.total_buf); + hw_cfg_cb.total_len = 0; + + bt_vendor_cbacks->dealloc(p_buf); + bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); + + hw_cfg_cb.state = 0; + is_proceeding = TRUE; + } + + /* if(hw_cfg_cb.lmp_subversion == LMPSUBVERSION_8723a) + { + hw_cfg_cb.state = HW_CFG_START; + goto CFG_USB_START; + } + else + { + hw_cfg_cb.state = HW_CFG_READ_ECO_VER; + p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, HCI_VSC_READ_ROM_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_ROM_VERSION, p_buf, hw_usb_config_cback); + }*/ + } + break; + } +RESET_HW_CONTROLLER: + case HW_RESET_CONTROLLER: + { + if (status == 0) + { + //usleep(300000);//300ms + userial_vendor_usb_ioctl(RESET_CONTROLLER, NULL);//reset controller + hw_cfg_cb.state = HW_CFG_READ_ECO_VER; + p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, HCI_VSC_READ_ROM_VERSION); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_READ_ROM_VERSION, p_buf, hw_usb_config_cback); + } + break; + } + case HW_CFG_READ_ECO_VER: + { + if(status == 0) + { + hw_cfg_cb.eversion = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPFC6D_EVERSION_OFFSET); + BTVNDDBG("hw_usb_config_cback chip_id of the IC:%d", hw_cfg_cb.eversion+1); + } + else if(1 == status) + { + hw_cfg_cb.eversion = 0; + } + else + { + is_proceeding = FALSE; + break; + } + + hw_cfg_cb.state = HW_CFG_START; + goto CFG_USB_START; + + } +CFG_USB_START: + case HW_CFG_START: + { + //get efuse config file and patch code file + prtk_usb_patch_file_info = rtk_usb_get_fw_table_entry(hw_cfg_cb.vid, hw_cfg_cb.pid); + + if((prtk_usb_patch_file_info == NULL) || (prtk_usb_patch_file_info->lmp_sub_default == 0)) + { + ALOGE("get patch entry error"); + is_proceeding = FALSE; + break; + } + hw_cfg_cb.max_patch_size = prtk_usb_patch_file_info->max_patch_size; + hw_cfg_cb.config_len = rtk_usb_get_bt_config(&hw_cfg_cb.config_buf, prtk_usb_patch_file_info->config_name, prtk_usb_patch_file_info->mac_offset); + if (hw_cfg_cb.config_len < 0) + { + ALOGE("Get Config file fail, just use efuse settings"); + hw_cfg_cb.config_len = 0; + } + rtk_usb_update_altsettings(prtk_usb_patch_file_info, hw_cfg_cb.config_buf, &(hw_cfg_cb.config_len)); + + hw_cfg_cb.fw_len = rtk_get_bt_firmware(&hw_cfg_cb.fw_buf, prtk_usb_patch_file_info->patch_name); + if (hw_cfg_cb.fw_len < 0) + { + ALOGE("Get BT firmware fail"); + hw_cfg_cb.fw_len = 0; + } + else{ + //hw_cfg_cb.project_id_mask = prtk_usb_patch_file_info->project_id_mask; + rtk_usb_get_bt_final_patch(&hw_cfg_cb); + } + + BTVNDDBG("Check total_len(0x%08x) max_patch_size(0x%08x)", hw_cfg_cb.total_len, hw_cfg_cb.max_patch_size); + if (hw_cfg_cb.total_len > hw_cfg_cb.max_patch_size) + { + ALOGE("total length of fw&config(0x%08x) larger than max_patch_size(0x%08x)", hw_cfg_cb.total_len, hw_cfg_cb.max_patch_size); + is_proceeding = FALSE; + break; + } + + if ((hw_cfg_cb.total_len > 0) && hw_cfg_cb.dl_fw_flag) + { + hw_cfg_cb.patch_frag_cnt = hw_cfg_cb.total_len / PATCH_DATA_FIELD_MAX_SIZE; + hw_cfg_cb.patch_frag_tail = hw_cfg_cb.total_len % PATCH_DATA_FIELD_MAX_SIZE; + if (hw_cfg_cb.patch_frag_tail) + hw_cfg_cb.patch_frag_cnt += 1; + else + hw_cfg_cb.patch_frag_tail = PATCH_DATA_FIELD_MAX_SIZE; + BTVNDDBG("patch fragment count %d, tail len %d", hw_cfg_cb.patch_frag_cnt, hw_cfg_cb.patch_frag_tail); + } + else + { + is_proceeding = FALSE; + break; + } + + goto DOWNLOAD_USB_FW; + + } + /* fall through intentionally */ + +DOWNLOAD_USB_FW: + case HW_CFG_DL_FW_PATCH: + BTVNDDBG("bt vendor lib: HW_CFG_DL_FW_PATCH status:%i, opcode:0x%x", status, opcode); + + //recv command complete event for patch code download command + if(opcode == HCI_VSC_DOWNLOAD_FW_PATCH) + { + iIndexRx = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_OFFSET + 1); + BTVNDDBG("bt vendor lib: HW_CFG_DL_FW_PATCH status:%i, iIndexRx:%i", status, iIndexRx); + hw_cfg_cb.patch_frag_idx++; + + if(iIndexRx&0x80) + { + BTVNDDBG("vendor lib fwcfg completed"); + free(hw_cfg_cb.total_buf); + hw_cfg_cb.total_len = 0; + + bt_vendor_cbacks->dealloc(p_buf); + bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); + + hw_cfg_cb.state = 0; + is_proceeding = TRUE; + break; + } + } + + if (hw_cfg_cb.patch_frag_idx < hw_cfg_cb.patch_frag_cnt) + { + iIndexRx = hw_cfg_cb.patch_frag_idx?((hw_cfg_cb.patch_frag_idx-1)%0x7f+1):0; + if (hw_cfg_cb.patch_frag_idx == hw_cfg_cb.patch_frag_cnt - 1) + { + BTVNDDBG("HW_CFG_DL_FW_PATCH: send last fw fragment"); + iIndexRx |= 0x80; + hw_cfg_cb.patch_frag_len = hw_cfg_cb.patch_frag_tail; + } + else + { + iIndexRx &= 0x7F; + hw_cfg_cb.patch_frag_len = PATCH_DATA_FIELD_MAX_SIZE; + } + } + + is_proceeding = usb_hci_download_patch_h4(p_buf, iIndexRx, + hw_cfg_cb.total_buf+(hw_cfg_cb.patch_frag_idx*PATCH_DATA_FIELD_MAX_SIZE), + hw_cfg_cb.patch_frag_len); + break; + default: + break; + } // switch(hw_cfg_cb.state) + } // if (p_buf != NULL) + + /* Free the RX event buffer */ + if ((bt_vendor_cbacks) && (p_evt_buf != NULL)) + bt_vendor_cbacks->dealloc(p_evt_buf); + + if (is_proceeding == FALSE) + { + ALOGE("vendor lib fwcfg aborted!!!"); + if (bt_vendor_cbacks) + { + if (p_buf != NULL) + bt_vendor_cbacks->dealloc(p_buf); + + bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); + } + + if(hw_cfg_cb.config_len) + { + free(hw_cfg_cb.config_buf); + hw_cfg_cb.config_len = 0; + } + + if(hw_cfg_cb.fw_len) + { + free(hw_cfg_cb.fw_buf); + hw_cfg_cb.fw_len= 0; + } + + if(hw_cfg_cb.total_len) + { + free(hw_cfg_cb.total_buf); + hw_cfg_cb.total_len = 0; + } + hw_cfg_cb.state = 0; + } +} + +/******************************************************************************* +** +** Function hw__usb_config_start +** +** Description Kick off controller initialization process +** +** Returns None +** +*******************************************************************************/ +void hw_usb_config_start(char transtype, uint32_t usb_id) +{ + memset(&hw_cfg_cb, 0, sizeof(bt_hw_cfg_cb_t)); + hw_cfg_cb.dl_fw_flag = 1; + hw_cfg_cb.chip_type = CHIPTYPE_NONE; + hw_cfg_cb.pid = usb_id & 0x0000ffff; + hw_cfg_cb.vid = (usb_id>>16) & 0x0000ffff; + BTVNDDBG("RTKBT_RELEASE_NAME: %s",RTKBT_RELEASE_NAME); + BTVNDDBG("\nRealtek libbt-vendor_usb Version %s \n",RTK_VERSION); + HC_BT_HDR *p_buf = NULL; + uint8_t *p; + + BTVNDDBG("hw_usb_config_start, transtype = 0x%x, pid = 0x%04x, vid = 0x%04x \n", transtype, hw_cfg_cb.pid, hw_cfg_cb.vid); + + if (bt_vendor_cbacks) + { + /* Must allocate command buffer via HC's alloc API */ + p_buf = (HC_BT_HDR *) bt_vendor_cbacks->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); + + p = (uint8_t *)(p_buf + 1); + UINT16_TO_STREAM(p, HCI_VENDOR_RESET); + *p++ = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE; + + hw_cfg_cb.state = HW_CFG_RESET_CHANNEL_CONTROLLER; + bt_vendor_cbacks->xmit_cb(HCI_VENDOR_RESET, p_buf, hw_usb_config_cback); + } + else { + ALOGE("%s buffer alloc fail!", __func__); + } + } + else + ALOGE("%s call back is null", __func__); +} + diff --git a/rtkbt/code/libbt-vendor/src/hci_h5.c b/rtkbt/code/libbt-vendor/src/hci_h5.c old mode 100644 new mode 100755 index aae2bb6..d8e5bd8 --- a/rtkbt/code/libbt-vendor/src/hci_h5.c +++ b/rtkbt/code/libbt-vendor/src/hci_h5.c @@ -61,8 +61,6 @@ #define H5_TRACE_DATA_ENABLE 0//if you want to see data tx and rx, set H5_TRACE_DATA_ENABLE 1 #define H5_LOG_VERBOSE 0 -#define ENABLE_BLEADV_DISCONNECT 1 - unsigned int h5_log_enable = 1; #ifndef H5_LOG_BUF_SIZE @@ -140,14 +138,14 @@ unsigned int h5_log_enable = 1; /****************************************************************************** ** Local type definitions ******************************************************************************/ - -static const uint16_t msg_evt_table[] = -{ - MSG_HC_TO_STACK_HCI_ERR, /* H4_TYPE_COMMAND */ - MSG_HC_TO_STACK_HCI_ACL, /* H4_TYPE_ACL_DATA */ - MSG_HC_TO_STACK_HCI_SCO, /* H4_TYPE_SCO_DATA */ - MSG_HC_TO_STACK_HCI_EVT /* H4_TYPE_EVENT */ -}; +// +//static const uint16_t msg_evt_table[] = +//{ +// MSG_HC_TO_STACK_HCI_ERR, /* H4_TYPE_COMMAND */ +// MSG_HC_TO_STACK_HCI_ACL, /* H4_TYPE_ACL_DATA */ +// MSG_HC_TO_STACK_HCI_SCO, /* H4_TYPE_SCO_DATA */ +// MSG_HC_TO_STACK_HCI_EVT /* H4_TYPE_EVENT */ +//}; /* Callback function for the returned event of internal issued command */ typedef void (*tTIMER_HANDLE_CBACK)(union sigval sigval_value); @@ -276,7 +274,7 @@ struct patch_struct { int nRxIndex; // ack index from board int nNeedRetry; // if no response from board }; -static struct patch_struct rtk_patch; +//static struct patch_struct rtk_patch; /****************************************************************************** ** Static function @@ -387,11 +385,11 @@ static void H5LogMsg(const char *fmt_str, ...) return; } } - +/* static void H5LogMsgVerbose(const char *fmt_str, ...) { - static char buffer[H5_LOG_BUF_SIZE]; #if H5_LOG_VERBOSE + static char buffer[H5_LOG_BUF_SIZE]; va_list ap; va_start(ap, fmt_str); vsnprintf(&buffer[0], H5_LOG_MAX_SIZE, fmt_str, ap); @@ -399,9 +397,12 @@ static void H5LogMsgVerbose(const char *fmt_str, ...) LOGI0("H5: ", buffer); #else + va_list ap; + va_start(ap, fmt_str); + va_end(ap); return; #endif -} +}*/ // reverse bit static __inline uint8_t bit_rev8(uint8_t byte) @@ -581,17 +582,17 @@ static void h5_crc_update(uint16_t *crc, uint8_t d) } struct __una_u16 { uint16_t x; }; -static __inline uint16_t __get_unaligned_cpu16(const void *p) +/*static __inline uint16_t __get_unaligned_cpu16(const void *p) { const struct __una_u16 *ptr = (const struct __una_u16 *)p; return ptr->x; -} - +}*/ +/* static __inline uint16_t get_unaligned_be16(const void *p) { return __get_unaligned_cpu16((const uint8_t *)p); -} +}*/ /** * Get crc data. * @@ -933,7 +934,7 @@ static void h5_remove_acked_pkt(tHCI_H5_CB *h5) * @param fd uart file descriptor * */ - +/* static void hci_h5_send_pure_ack(void) { //uint16_t bytes_sent = 0; @@ -985,7 +986,7 @@ static void hci_h5_send_pure_ack(void) #endif return; -} +}*/ static void hci_h5_send_sync_req() { @@ -1198,33 +1199,7 @@ static void rtk_notify_hw_h5_init_result(uint8_t status) pthread_cond_signal(&rtk_h5.data_cond); pthread_mutex_unlock(&rtk_h5.data_mutex); } -static uint8_t *acl_pack = NULL; -static uint32_t acl_len=0; -int loopbackmode = 0; - -static timer_t loopacltimer=0; - -static void loop_acl_cb() -{ - sk_buff *rx_skb; - rx_skb = skb_alloc_and_init(HCI_ACLDATA_PKT, acl_pack, acl_len); - pthread_mutex_lock(&rtk_h5.data_mutex); - skb_queue_tail(rtk_h5.recv_data, rx_skb); - pthread_cond_signal(&rtk_h5.data_cond); - pthread_mutex_unlock(&rtk_h5.data_mutex); -} -static void loopacl_timer_handler(union sigval sigev_value) -{ - loop_acl_cb(); -} -static void start_loopacktimer() -{ - if(loopacltimer == 0) - loopacltimer = OsAllocateTimer(loopacl_timer_handler); - OsStartTimer(loopacltimer, 10, 0); - -} static sk_buff * h5_dequeue() { @@ -1361,17 +1336,17 @@ static uint16_t h5_wake_up() void h5_process_ctl_pkts(void) { //process h5 link establish - int len; + //int len; uint8_t cfg; - tHCI_H5_CB *p_cb = &rtk_h5; + //tHCI_H5_CB *p_cb = &rtk_h5; sk_buff * skb = rtk_h5.rx_skb; unsigned char h5sync[2] = {0x01, 0x7E}, h5syncresp[2] = {0x02, 0x7D}, h5conf[3] = {0x03, 0xFC, 0x14}, - h5confresp[2] = {0x04, 0x7B}, - h5InitOk[2] = {0xF1, 0xF1}; + h5confresp[2] = {0x04, 0x7B}; + //h5InitOk[2] = {0xF1, 0xF1}; //uint8_t *ph5_payload = NULL; //ph5_payload = (uint8_t *)(p_cb->p_rcv_msg + 1); @@ -1562,54 +1537,13 @@ uint8_t internal_event_intercept_h5(void) * @param skb socket buffer * */ -#if ENABLE_BLEADV_DISCONNECT -uint16_t rk_h5_send_cmd(serial_data_type_t type, uint8_t *data, uint16_t length) -{ - sk_buff * skb = NULL; - uint16_t bytes_to_send, opcode; - - - skb = skb_alloc_and_init(type, data, length); - if(!skb) { - ALOGE("send cmd skb_alloc_and_init fail!"); - return -1; - } - - h5_enqueue(skb); - - num_hci_cmd_pkts--; - - - STREAM_TO_UINT16(opcode, data); - ALOGE("HCI Command opcode(0x%04X)", opcode); - - bytes_to_send = h5_wake_up(); - return length; -} - -static void adv_timer_handler(union sigval sigev_value) -{ - uint8_t sendData[4]={0x0a,0x20,0x01,0x01}; - rk_h5_send_cmd(1, sendData, 4); -} -static void start_enableAdvtimer() -{ - if(loopacltimer == 0) - loopacltimer = OsAllocateTimer(adv_timer_handler); - OsStartTimer(loopacltimer, 100, 0); - -} - - -static uint16_t bleConHandle = 0x0000; -static uint8_t bleConnected = 0x00; -static uint8_t bleAdvEnable = 0x00; -#endif static uint8_t hci_recv_frame(sk_buff *skb, uint8_t pkt_type) { uint8_t intercepted = 0; - uint32_t i = 0 ; + //uint32_t i = 0 ; +#if H5_TRACE_DATA_ENABLE uint8_t *data = skb_get_data(skb); +#endif uint32_t data_len = skb_get_data_length(skb); H5LogMsg("UART H5 RX: length = %d", data_len); @@ -1636,34 +1570,10 @@ static uint8_t hci_recv_frame(sk_buff *skb, uint8_t pkt_type) uint8_t event_code; uint16_t opcode, len; p = (uint8_t *)skb_get_data(skb); -#if ENABLE_BLEADV_DISCONNECT - if(p[0]==0x3e //ble meta - && p[2]==0x01 //le connect complete - && p[3]==0x00)//success - { - bleConHandle = (uint16_t)p[4] + ((uint16_t)p[5] << 8); - ALOGE("bleConHandle 0x%x", bleConHandle); - bleConnected = 0x01; - } - - if(p[0]==0x05 //discon complete - && p[2]==0x00 //success - ) - { - if( bleConnected && bleAdvEnable && bleConHandle == ((uint16_t)p[3] + ((uint16_t)p[4] << 8)) ){ - ALOGE("blediscon restart ble adv"); - bleConnected = 0x00; - bleConHandle = 0x0000; - start_enableAdvtimer(); - } - } -#endif event_code = *p++; len = *p++; H5LogMsg("hci_recv_frame event_code(0x%x), len = %d", event_code, len); - if(event_code == HCI_COMMAND_STATUS_EVT && len==0x04 && p[0]==0x01&&p[1]==0x02&&p[2]==0xff&&p[3]==0x3b) - { *( p-2)=HCI_COMMAND_COMPLETE_EVT ;p[0]=0x02;p[1]=0xff;p[2]=0x3b;p[3]=0x01;} if (event_code == HCI_COMMAND_COMPLETE_EVT) { num_hci_cmd_pkts = *p++; @@ -1676,10 +1586,7 @@ static uint8_t hci_recv_frame(sk_buff *skb, uint8_t pkt_type) H5LogMsg("CommandCompleteEvent for command h5_start_wait_controller_baudrate_ready_timer (0x%04X)", opcode); h5_start_wait_controller_baudrate_ready_timer(); } - }else if(event_code == 0xff){ - intercepted = 1; - skb_free(&skb); -} + } } @@ -1704,9 +1611,9 @@ static uint8_t h5_complete_rx_pkt(tHCI_H5_CB *h5) int pass_up = 1; uint16_t eventtype = 0; uint8_t *h5_hdr = NULL; - uint8_t complete_pkt = true; + //uint8_t complete_pkt = true; uint8_t pkt_type = 0; - tHCI_H5_CB *p_cb=&rtk_h5; + //tHCI_H5_CB *p_cb=&rtk_h5; uint8_t status = 0; //H5LogMsg("HCI 3wire h5_complete_rx_pkt"); @@ -1987,16 +1894,7 @@ static bool h5_recv(tHCI_H5_CB *h5, uint8_t *data, int count) /****************************************************************************** ** Static functions ******************************************************************************/ -static void h5_data_ready_cb_signal_exit() -{ - - pthread_mutex_lock(&rtk_h5.data_mutex); - pthread_cond_signal(&rtk_h5.data_cond); - pthread_mutex_unlock(&rtk_h5.data_mutex); -} - - -static void data_ready_cb_thread(void *arg) +static void data_ready_cb_thread() { sk_buff *skb; uint8_t pkt_type = 0; @@ -2009,15 +1907,12 @@ static void data_ready_cb_thread(void *arg) while (h5_data_ready_running) { pthread_mutex_lock(&rtk_h5.data_mutex); - while ((skb_queue_get_length(rtk_h5.recv_data) == 0) && h5_retransfer_running) + while ((skb_queue_get_length(rtk_h5.recv_data) == 0)) { pthread_cond_wait(&rtk_h5.data_cond, &rtk_h5.data_mutex); } pthread_mutex_unlock(&rtk_h5.data_mutex); - if(!h5_retransfer_running) - break; - if((skb = skb_dequeue_head(rtk_h5.recv_data)) != NULL) { rtk_h5.data_skb = skb; } @@ -2027,15 +1922,15 @@ static void data_ready_cb_thread(void *arg) h5_int_hal_callbacks->h5_data_ready_cb(pkt_type, total_length); } - ALOGE("data_ready_cb_thread exiting"); + H5LogMsg("data_ready_cb_thread exiting"); pthread_exit(NULL); } -static void data_retransfer_thread(void *arg) +static void data_retransfer_thread()//(void *arg) { uint16_t events; - uint32_t i = 0; + //uint32_t i = 0; H5LogMsg("data_retransfer_thread started"); @@ -2093,7 +1988,7 @@ static void data_retransfer_thread(void *arg) } - ALOGE("data_retransfer_thread exiting"); + H5LogMsg("data_retransfer_thread exiting"); pthread_exit(NULL); } @@ -2108,8 +2003,8 @@ void h5_retransfer_signal_event(uint16_t event) static int create_data_retransfer_thread() { - struct sched_param param; - int policy; + //struct sched_param param; + //int policy; pthread_attr_t thread_attr; @@ -2156,8 +2051,8 @@ static int create_data_retransfer_thread() static int create_data_ready_cb_thread() { - struct sched_param param; - int policy; + //struct sched_param param; + //int policy; pthread_attr_t thread_attr; @@ -2246,12 +2141,11 @@ void hci_h5_int_init(hci_h5_callbacks_t* h5_callbacks) *******************************************************************************/ void hci_h5_cleanup(void) { - ALOGE("hci_h5_cleanup"); - uint8_t try_cnt=10; + H5LogMsg("hci_h5_cleanup"); + //uint8_t try_cnt=10; int result; rtk_h5.cleanuping = 1; - ms_delay(200); //btsnoop_cleanup(); @@ -2266,10 +2160,6 @@ void hci_h5_cleanup(void) if (h5_retransfer_running) { h5_retransfer_running = 0; - h5_data_ready_cb_signal_exit(); - if ((result = pthread_join(rtk_h5.thread_data_ready_cb, NULL)) < 0) - ALOGE("H5 thread_data_ready_cb pthread_join() FAILED result:%d", result); - h5_retransfer_signal_event(H5_EVENT_EXIT); if ((result = pthread_join(rtk_h5.thread_data_retrans, NULL)) < 0) ALOGE("H5 pthread_join() FAILED result:%d", result); @@ -2277,10 +2167,6 @@ void hci_h5_cleanup(void) ms_delay(200); - - pthread_mutex_destroy(&rtk_h5.data_mutex); - pthread_cond_destroy(&rtk_h5.data_cond); - pthread_mutex_destroy(&rtk_h5.mutex); pthread_cond_destroy(&rtk_h5.cond); @@ -2305,7 +2191,7 @@ void hci_h5_cleanup(void) *******************************************************************************/ uint16_t hci_h5_parse_msg(uint8_t *byte, uint16_t count) { - uint16_t bytes_needed = 0; + //uint16_t bytes_needed = 0; uint8_t h5_byte; h5_byte = *byte; //H5LogMsg("hci_h5_receive_msg byte:%d",h5_byte); @@ -2374,7 +2260,6 @@ uint16_t hci_h5_send_cmd(serial_data_type_t type, uint8_t *data, uint16_t length sk_buff * skb = NULL; uint16_t bytes_to_send, opcode; - skb = skb_alloc_and_init(type, data, length); if(!skb) { ALOGE("send cmd skb_alloc_and_init fail!"); @@ -2396,15 +2281,6 @@ uint16_t hci_h5_send_cmd(serial_data_type_t type, uint8_t *data, uint16_t length H5LogMsg("RX HCI RESET Command, stop hw init timer"); h5_stop_hw_init_ready_timer(); } - if(opcode == 0x1802) - loopbackmode =1; -#if ENABLE_BLEADV_DISCONNECT - if(opcode == 0x200a)//adv enalbe - { - ALOGE("setbleAdvEnable %x", data[1]); - bleAdvEnable = data[1]; - } -#endif bytes_to_send = h5_wake_up(); return length; } @@ -2421,20 +2297,9 @@ uint16_t hci_h5_send_cmd(serial_data_type_t type, uint8_t *data, uint16_t length *******************************************************************************/ uint16_t hci_h5_send_acl_data(serial_data_type_t type, uint8_t *data, uint16_t length) { - uint16_t bytes_to_send, lay_spec; + uint16_t bytes_to_send;//, lay_spec; sk_buff * skb = NULL; - if(loopbackmode == 1){ - acl_len = length; - if(!acl_pack) - acl_pack = malloc(2050); - if(acl_len>2050) - acl_len = 2050; - memcpy(acl_pack,data,acl_len); - start_loopacktimer(); - return length; - } - skb = skb_alloc_and_init(type, data, length); if(!skb) { ALOGE("hci_h5_send_acl_data, alloc skb buffer fail!"); @@ -2460,7 +2325,7 @@ uint16_t hci_h5_send_acl_data(serial_data_type_t type, uint8_t *data, uint16_t l uint16_t hci_h5_send_sco_data(serial_data_type_t type, uint8_t *data, uint16_t length) { sk_buff * skb = NULL; - uint16_t bytes_to_send, lay_spec; + uint16_t bytes_to_send;//, lay_spec; skb = skb_alloc_and_init(type, data, length); if(!skb) { @@ -2487,6 +2352,10 @@ uint16_t hci_h5_send_sco_data(serial_data_type_t type, uint8_t *data, uint16_t l *******************************************************************************/ uint8_t hci_h5_send_sync_cmd(uint16_t opcode, uint8_t *p_buf, uint16_t length) { + if(p_buf != NULL) + { + H5LogMsg("hci_h5_send_sync_cmd buf is not null"); + } if(rtk_h5.link_estab_state == H5_UNINITIALIZED) { if(opcode == HCI_VSC_H5_INIT) @@ -2498,7 +2367,7 @@ uint8_t hci_h5_send_sync_cmd(uint16_t opcode, uint8_t *p_buf, uint16_t length) } else if(rtk_h5.link_estab_state == H5_ACTIVE) { - H5LogMsg("hci_h5_send_sync_cmd(0x%x), link_estab_state = %d", opcode, rtk_h5.link_estab_state); + H5LogMsg("hci_h5_send_sync_cmd(0x%x), link_estab_state = %d, length = %d", opcode, rtk_h5.link_estab_state, length); return false; } @@ -2581,7 +2450,7 @@ static timer_t OsAllocateTimer(tTIMER_HANDLE_CBACK timer_callback) return OsStartTimer(timerid, 0, 0); } -static void h5_retransfer_timeout_handler(union sigval sigev_value) { +static void h5_retransfer_timeout_handler(){//(union sigval sigev_value) { H5LogMsg("h5_retransfer_timeout_handler"); if(rtk_h5.cleanuping) { @@ -2591,7 +2460,7 @@ static void h5_retransfer_timeout_handler(union sigval sigev_value) { h5_retransfer_signal_event(H5_EVENT_RX); } -static void h5_sync_retrans_timeout_handler(union sigval sigev_value) { +static void h5_sync_retrans_timeout_handler(){//(union sigval sigev_value) { H5LogMsg("h5_sync_retrans_timeout_handler"); if(rtk_h5.cleanuping) { @@ -2613,7 +2482,7 @@ static void h5_sync_retrans_timeout_handler(union sigval sigev_value) { } -static void h5_conf_retrans_timeout_handler(union sigval sigev_value) { +static void h5_conf_retrans_timeout_handler(){//(union sigval sigev_value) { H5LogMsg("h5_conf_retrans_timeout_handler"); if(rtk_h5.cleanuping) { @@ -2637,7 +2506,7 @@ static void h5_conf_retrans_timeout_handler(union sigval sigev_value) { } -static void h5_wait_controller_baudrate_ready_timeout_handler(union sigval sigev_value) { +static void h5_wait_controller_baudrate_ready_timeout_handler(){//(union sigval sigev_value) { H5LogMsg("h5_wait_ct_baundrate_ready_timeout_handler"); if(rtk_h5.cleanuping) { @@ -2655,7 +2524,7 @@ static void h5_wait_controller_baudrate_ready_timeout_handler(union sigval sigev rtk_h5.internal_skb = NULL; } -static void h5_hw_init_ready_timeout_handler(union sigval sigev_value) { +static void h5_hw_init_ready_timeout_handler(){//(union sigval sigev_value) { H5LogMsg("h5_hw_init_ready_timeout_handler"); if(rtk_h5.cleanuping) { diff --git a/rtkbt/code/libbt-vendor/src/rtk_btservice.c b/rtkbt/code/libbt-vendor/src/rtk_btservice.c new file mode 100755 index 0000000..814427d --- /dev/null +++ b/rtkbt/code/libbt-vendor/src/rtk_btservice.c @@ -0,0 +1,765 @@ +/****************************************************************************** + * + * Copyright (C) 2009-2012 Realtek 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. + * + ******************************************************************************/ + +/****************************************************************************** + * + * Filename: rtk_btservice.c + * + * Description: start unix socketc + * + ******************************************************************************/ + +#define LOG_TAG "bt_service" +#define RTKBT_RELEASE_NAME "20180525_BT_ANDROID_8.1" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bt_hci_bdroid.h" +#include "bt_vendor_rtk.h" +#include "userial.h" +#include "userial_vendor.h" +#include "rtk_btservice.h" +#include "upio.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bt_vendor_lib.h" + + +//HCI VENDOR Command opcode +#define HCI_VSC_READ_REGISTER 0xFFFF + +#define RTKBTSERVICE_SOCKETPATH "@/data/misc/bluedroid/rtkbt_service.sock" +#define MAX_CONNECTION_NUMBER 10 + +#define RTK_HCICMD 0x01 +#define RTK_CLOSESOCRET 0x02 +#define RTK_INNER 0x03 +#define OTHER 0xff + +#define Rtk_Service_Data_SIZE 259 +#define Rtk_Service_Send_Data_SIZE 259 + +#define HCICMD_REPLY_TIMEOUT_VALUE 8000 //ms +#define HCI_CMD_PREAMBLE_SIZE 3 + +typedef void (*tTIMER_HANDLE_CBACK)(union sigval sigval_value); + + + +typedef struct Rtk_Btservice_Info +{ + int socketfd; + pthread_t cmdreadythd; + pthread_t epollthd; + int current_client_sock; + int epoll_fd; + int autopair_fd; + sem_t cmdqueue_sem; + sem_t cmdsend_sem; + timer_t timer_hcicmd_reply; + RT_LIST_HEAD cmdqueue_list; + pthread_mutex_t cmdqueue_mutex; + volatile uint8_t cmdqueue_thread_running; + volatile uint8_t epoll_thread_running; + void (*current_complete_cback)(void *); +}Rtk_Btservice_Info; + +typedef struct Rtk_Service_Data +{ + uint16_t opcode; + uint8_t parameter_len; + uint8_t *parameter; + void (*complete_cback)(void *); +}Rtk_Service_Data; + +/* +typedef struct Rtk_Socket_Data +{ + char type; //hci,other,inner + uint8_t opcodeh; + uint8_t opcodel; + uint8_t parameter_len; + uint8_t parameter[0]; +}Rtk_Socket_Data; +*/ + +typedef struct Rtk_Queue_Data +{ + RT_LIST_ENTRY list; + int client_sock; + uint16_t opcode; + uint8_t parameter_len; + uint8_t *parameter; + void (*complete_cback)(void *); +}Rtkqueuedata; + +static Rtk_Btservice_Info *rtk_btservice; +static void Rtk_Service_Send_Hwerror_Event(); +//extern void userial_recv_rawdata_hook(unsigned char *, unsigned int); +static timer_t OsAllocateTimer(tTIMER_HANDLE_CBACK timer_callback) +{ + struct sigevent sigev; + timer_t timerid; + + memset(&sigev, 0, sizeof(struct sigevent)); + // Create the POSIX timer to generate signo + sigev.sigev_notify = SIGEV_THREAD; + //sigev.sigev_notify_thread_id = syscall(__NR_gettid); + sigev.sigev_notify_function = timer_callback; + sigev.sigev_value.sival_ptr = &timerid; + + ALOGD("OsAllocateTimer bt_service sigev.sigev_notify_thread_id = syscall(__NR_gettid)!"); + //Create the Timer using timer_create signal + + if (timer_create(CLOCK_REALTIME, &sigev, &timerid) == 0) + { + return timerid; + } + else + { + ALOGE("timer_create error!"); + return (timer_t)-1; + } +} + +static int OsFreeTimer(timer_t timerid) +{ + int ret = 0; + ret = timer_delete(timerid); + if(ret != 0) + ALOGE("timer_delete fail with errno(%d)", errno); + + return ret; +} + + + static int OsStartTimer(timer_t timerid, int msec, int mode) + { + struct itimerspec itval; + + itval.it_value.tv_sec = msec / 1000; + itval.it_value.tv_nsec = (long)(msec % 1000) * (1000000L); + + if (mode == 1) + + { + itval.it_interval.tv_sec = itval.it_value.tv_sec; + itval.it_interval.tv_nsec = itval.it_value.tv_nsec; + } + else + { + itval.it_interval.tv_sec = 0; + itval.it_interval.tv_nsec = 0; + } + + //Set the Timer when to expire through timer_settime + + if (timer_settime(timerid, 0, &itval, NULL) != 0) + { + ALOGE("time_settime error!"); + return -1; + } + + return 0; + +} + + static int OsStopTimer(timer_t timerid) + { + return OsStartTimer(timerid, 0, 0); + } + +static void init_cmdqueue_hash(Rtk_Btservice_Info* rtk_info) +{ + RT_LIST_HEAD* head = &rtk_info->cmdqueue_list; + ListInitializeHeader(head); +} + +static void delete_cmdqueue_from_hash(Rtkqueuedata* desc) +{ + if (desc) + { + ListDeleteNode(&desc->list); + free(desc); + desc = NULL; + } +} + +static void flush_cmdqueue_hash(Rtk_Btservice_Info* rtk_info) +{ + RT_LIST_HEAD* head = &rtk_info->cmdqueue_list; + RT_LIST_ENTRY* iter = NULL, *temp = NULL; + Rtkqueuedata* desc = NULL; + + pthread_mutex_lock(&rtk_info->cmdqueue_mutex); + LIST_FOR_EACH_SAFELY(iter, temp, head) + { + desc = LIST_ENTRY(iter, Rtkqueuedata, list); + delete_cmdqueue_from_hash(desc); + } + //ListInitializeHeader(head); + pthread_mutex_unlock(&rtk_info->cmdqueue_mutex); +} + +static void hcicmd_reply_timeout_handler()//(union sigval sigev_value) +{ + Rtk_Service_Send_Hwerror_Event(); + //return; +} + +static int hcicmd_alloc_reply_timer() + { + // Create and set the timer when to expire + rtk_btservice->timer_hcicmd_reply = OsAllocateTimer(hcicmd_reply_timeout_handler); + + return 0; + + } + +static int hcicmd_free_reply_timer() +{ + return OsFreeTimer(rtk_btservice->timer_hcicmd_reply); +} + + +static int hcicmd_start_reply_timer() +{ + return OsStartTimer(rtk_btservice->timer_hcicmd_reply, HCICMD_REPLY_TIMEOUT_VALUE, 1); +} + +static int hcicmd_stop_reply_timer() +{ + return OsStopTimer(rtk_btservice->timer_hcicmd_reply); +} + +static void Rtk_Client_Cmd_Cback(void *p_mem) +{ + HC_BT_HDR *p_evt_buf = (HC_BT_HDR *) p_mem; + unsigned char *sendbuf=NULL; + int len; + //ALOGE("%s p_evt_buf = %x,%x,%x,%x,%x!", __func__,p_evt_buf->event,p_evt_buf->len,p_evt_buf->offset,p_evt_buf->layer_specific,p_evt_buf->data[0]); + len=8+p_evt_buf->len; + if(p_evt_buf != NULL) + { + sendbuf = (unsigned char *)malloc(sizeof(char)*len); + sendbuf = p_mem; + if(rtk_btservice->current_client_sock != -1) + { + write(rtk_btservice->current_client_sock,sendbuf,len); + } + else + { + ALOGE("%s current_client_sock is not exist!", __func__); + } + free(sendbuf); + } +} + +void Rtk_Service_Vendorcmd_Hook(Rtk_Service_Data *RtkData, int client_sock) +{ + Rtkqueuedata* rtkqueue_data = NULL; + pthread_mutex_lock(&rtk_btservice->cmdqueue_mutex); + rtkqueue_data = (Rtkqueuedata *)malloc(sizeof(Rtkqueuedata)); + if (NULL == rtkqueue_data) + { + ALOGE("rtkqueue_data: allocate error"); + return; + } + + rtkqueue_data->opcode = RtkData->opcode; + rtkqueue_data->parameter = RtkData->parameter; + rtkqueue_data->parameter_len = RtkData->parameter_len; + rtkqueue_data->client_sock = client_sock; + rtkqueue_data->complete_cback = RtkData->complete_cback; + + ListAddToTail(&(rtkqueue_data->list), &(rtk_btservice->cmdqueue_list)); + sem_post(&rtk_btservice->cmdqueue_sem); + pthread_mutex_unlock(&rtk_btservice->cmdqueue_mutex); +} + +static void Rtk_Service_Cmd_Event_Cback(void *p_mem) +{ + //int i; + //unsigned char *a=p_mem; + //ALOGE("%s p_mem = %x,%x,%x,%x,%x,%x!", __func__,a[0],a[1],a[2],a[3],a[4],a[5]); + if(p_mem != NULL) + { + if(rtk_btservice->current_complete_cback!=NULL) + { + rtk_btservice->current_complete_cback(p_mem); + } + else + { + ALOGE("%s current_complete_cback is not exist!", __func__); + } + rtk_btservice->current_complete_cback=NULL; + hcicmd_stop_reply_timer(); + sem_post(&rtk_btservice->cmdsend_sem); + } +} + +static void Rtk_Service_Send_Hwerror_Event() +{ + unsigned char *p_buf=(unsigned char *)malloc(sizeof(char)*4); + int length=4; + p_buf[0]=0x04;//event + p_buf[1]=0x10;//hardware error + p_buf[2]=0x01;//len + p_buf[3]=0xfd;//error code + userial_recv_rawdata_hook(p_buf,length); + free(p_buf); +} + +static void *cmdready_thread() +{ + //Rtkqueuedata* rtk_data; + + while(rtk_btservice->cmdqueue_thread_running) + { + sem_wait(&rtk_btservice->cmdqueue_sem); + sem_wait(&rtk_btservice->cmdsend_sem); + if(rtk_btservice->cmdqueue_thread_running != 0) + { + pthread_mutex_lock(&rtk_btservice->cmdqueue_mutex); + RT_LIST_ENTRY* iter = ListGetTop(&(rtk_btservice->cmdqueue_list)); + Rtkqueuedata* desc = NULL; + if (iter) { + desc = LIST_ENTRY(iter, Rtkqueuedata, list); + if (desc) + { + ListDeleteNode(&desc->list); + } + } + + pthread_mutex_unlock(&rtk_btservice->cmdqueue_mutex); + + if(desc) { + HC_BT_HDR *p_buf = NULL; + p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + HCI_CMD_PREAMBLE_SIZE + desc->parameter_len); + + if(NULL == p_buf) + { + ALOGE("rtk_vendor_cmd_to_fw: HC_BT_HDR alloc error"); + pthread_exit(0); + } + p_buf->event = MSG_STACK_TO_HC_HCI_CMD; + p_buf->offset = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE + desc->parameter_len; + p_buf->layer_specific = 0; + + uint8_t *p = (uint8_t *) (p_buf + 1); + UINT16_TO_STREAM(p, desc->opcode); + *p++ = desc->parameter_len; + + if(desc->opcode == 0xfc77) + { + rtk_btservice->autopair_fd = desc->client_sock; + } + + if(desc->parameter_len > 0) + { + memcpy(p, desc->parameter, desc->parameter_len); + } + if(desc->opcode != 0xfc94 ) + ALOGD("%s, transmit_command Opcode:%x",__func__, desc->opcode); + rtk_btservice->current_client_sock = desc->client_sock; + rtk_btservice->current_complete_cback = desc->complete_cback; + //bt_vendor_cbacks->xmit_cb(desc->opcode, p_buf, desc->complete_cback); + if(bt_vendor_cbacks != NULL) + { + bt_vendor_cbacks->xmit_cb(desc->opcode, p_buf, Rtk_Service_Cmd_Event_Cback); + hcicmd_start_reply_timer(); + } + if(desc->parameter_len > 0) + free(desc->parameter); + } + + free(desc); + } + } + pthread_exit(0); +} + + +static void Getpacket(int client_sock) +{ + + //unsigned char recvbuf[Rtk_Service_Data_SIZE]; + unsigned char type=0; + unsigned char opcodeh=0; + unsigned char opcodel=0; + unsigned char parameter_length=0; + unsigned char *parameter = NULL; + int recvlen=0; + Rtk_Service_Data *p_buf; + //int i; + + + recvlen = read(client_sock,&type,1); + ALOGD("%s recvlen=%d,type=%d",__func__,recvlen, type); + if(recvlen<=0) + { + close(client_sock); + if(client_sock == rtk_btservice->autopair_fd) + { + rtk_btservice->autopair_fd = -1; + } + return; + } + + switch (type) + { + case RTK_HCICMD: + { + recvlen = read(client_sock,&opcodeh,1); + if(recvlen<=0) + { + ALOGE("read opcode high char error"); + break; + } + recvlen = read(client_sock,&opcodel,1); + if(recvlen<=0) + { + ALOGE("read opcode low char error"); + break; + } + recvlen = read(client_sock,¶meter_length,1); + if(recvlen<=0) + { + ALOGE("read parameter_length char error"); + break; + } + + if(parameter_length>0) + { + parameter = (unsigned char *)malloc(sizeof(char)*parameter_length); + recvlen = read(client_sock,parameter,parameter_length); + ALOGD("%s parameter_length=%d,recvlen=%d",__func__,parameter_length, recvlen); + if(recvlen<=0 || recvlen!=parameter_length) + { + ALOGE("read parameter_length char error recvlen=%d,parameter_length=%d\n",recvlen,parameter_length); + break; + } + } + p_buf = (Rtk_Service_Data *)malloc(sizeof(Rtk_Service_Data)); + if (NULL == p_buf) + { + ALOGE("p_buf: allocate error"); + return; + } + p_buf->opcode = ((unsigned short)opcodeh)<<8 | opcodel; + p_buf->parameter = parameter; + p_buf->parameter_len = parameter_length; + p_buf->complete_cback = Rtk_Client_Cmd_Cback; + //ALOGE("p_buf->parameter_len: %d",p_buf->parameter_len); + //ALOGE("p_buf->opcode: %x",p_buf->opcode); + //ALOGE("opcodeh: %x,opcodel: %x",opcodeh,opcodel); + //for(i=0;iparameter_len;i++) + //{ + // ALOGE("i=%d,p_buf->parameter: %x",i,p_buf->parameter[i]); + //} + Rtk_Service_Vendorcmd_Hook(p_buf,client_sock); + free(p_buf); + break; + } + case RTK_CLOSESOCRET: + { + close(client_sock); + //pthread_exit(0); + break; + } + default: + { + ALOGE("%s The RtkSockData type is not found!", __func__); + break; + } + } + +} + +void rtk_btservice_internal_event_intercept(uint8_t *p_full_msg,uint8_t *p_msg) +{ + uint8_t *p = p_msg; + uint8_t event_code = *p++; + //uint8_t len = *p++; + uint8_t subcode; + HC_BT_HDR *p_evt_buf = (HC_BT_HDR *) p_full_msg; + if(event_code == 0xff) + ALOGD("rtk_btservice_internal_event_intercept event_code=0x%x",event_code); + switch (event_code) + { + case HCI_VENDOR_SPECIFIC_EVT: + { + STREAM_TO_UINT8(subcode, p); + switch(subcode) + { + case HCI_RTKBT_AUTOPAIR_EVT: + { + + ALOGD("p_evt_buf_len=%d",p_evt_buf->len); + //for(int i=0;ilen;i++) + //ALOGE("@jason buf[%d]=0x%x",i,p_evt_buf->data[i]); + // + if(rtk_btservice->autopair_fd != -1) + { + write(rtk_btservice->autopair_fd, p_evt_buf, p_evt_buf->len+8); + uint8_t p_bluedroid_len = p_evt_buf->len+1; + uint8_t *p_bluedroid = malloc(p_bluedroid_len); + p_bluedroid[0]=DATA_TYPE_EVENT; + memcpy((uint8_t *)(p_bluedroid + 1), p_msg, p_evt_buf->len); + p_bluedroid[1]=0x3e; //event_code + p_bluedroid[3]=0x02; //subcode + userial_recv_rawdata_hook(p_bluedroid, p_bluedroid_len); + } + } + + default: + break; + } + break; + } + //case HCI_COMMAND_COMPLETE_EVT: + //{ + //rtkservice_handle_cmd_complete_evt(); + //} + default: + break; + } +} + + +static int socket_accept(socketfd) +{ + struct sockaddr_un un; + socklen_t len; + int client_sock=0; + len = sizeof(un); + struct epoll_event event; + + client_sock=accept(socketfd, (struct sockaddr *)&un, &len); + if(client_sock<0) + { + printf("accept failed\n"); + return -1; + } + //pthread_create(&connectthread,NULL,(void *)accept_request_thread,&client_sock); + + event.data.fd=client_sock; + event.events=EPOLLIN | EPOLLHUP | EPOLLRDHUP | EPOLLERR; + //list_add(client_sock); + if(epoll_ctl(rtk_btservice->epoll_fd,EPOLL_CTL_ADD,client_sock,&event)==-1) + { + ALOGE("%s unable to register fd %d to epoll set: %s", __func__, client_sock, strerror(errno)); + close(client_sock); + return -1; + } + return 0; +} + +static void *epoll_thread() +{ + struct epoll_event events[64]; + int nfds=0; + int i=0; + + while(rtk_btservice->epoll_thread_running) + { + nfds=epoll_wait(rtk_btservice->epoll_fd,events,32,500); + if(rtk_btservice->epoll_thread_running != 0) + { + if(nfds>0) + { + for(i=0;isocketfd && events[i].events&EPOLLIN) + { + if(socket_accept(events[i].data.fd)<0) + { + pthread_exit(0); + } + } + else if(events[i].events&(EPOLLIN | EPOLLHUP | EPOLLRDHUP | EPOLLERR)) + { + ALOGD("%s events[i].data.fd = %d ", __func__, events[i].data.fd); + Getpacket(events[i].data.fd); + } + } + } + } + } + pthread_exit(0); +} + +static int unix_socket_start(const char *servername) +{ + int len; + struct sockaddr_un un; + struct epoll_event event; + + if ((rtk_btservice->socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + { + ALOGE("%s create AF_UNIX socket fail!", __func__); + return -1; + } + + memset(&un, 0, sizeof(un)); + un.sun_family = AF_UNIX; + strcpy(un.sun_path, servername); + un.sun_path[0]=0; + len = offsetof(struct sockaddr_un, sun_path) + strlen(servername); + + if (bind(rtk_btservice->socketfd, (struct sockaddr *)&un, len) < 0) + { + ALOGE("%s bind socket fail!", __func__); + return -1; + } + + if (listen(rtk_btservice->socketfd, MAX_CONNECTION_NUMBER) < 0) + { + ALOGE("%s listen socket fail!", __func__); + return -1; + } + /* + if(chmod(RTKBTSERVICE_SOCKETPATH,0666) != 0) + { + ALOGE("%s chmod failed"); + } + */ + event.data.fd=rtk_btservice->socketfd; + event.events=EPOLLIN; + if(epoll_ctl(rtk_btservice->epoll_fd,EPOLL_CTL_ADD,rtk_btservice->socketfd,&event)==-1) + { + ALOGE("%s unable to register fd %d to epoll set: %s", __func__, rtk_btservice->socketfd, strerror(errno)); + return -1; + } + + return 0; +} + +int RTK_btservice_thread_start() +{ + rtk_btservice->epoll_thread_running=1; + if (pthread_create(&rtk_btservice->epollthd, NULL, epoll_thread, NULL)!=0) + { + ALOGE("pthread_create epoll_thread: %s", strerror(errno)); + return -1; + } + + rtk_btservice->cmdqueue_thread_running=1; + if (pthread_create(&rtk_btservice->cmdreadythd, NULL, cmdready_thread, NULL)!=0) + { + ALOGE("pthread_create cmdready_thread: %s", strerror(errno)); + return -1; + } + + return 0; +} + +void RTK_btservice_thread_stop() +{ + ALOGD("%s !", __func__); + rtk_btservice->epoll_thread_running=0; + rtk_btservice->cmdqueue_thread_running=0; + sem_post(&rtk_btservice->cmdqueue_sem); + sem_post(&rtk_btservice->cmdsend_sem); + pthread_join(rtk_btservice->cmdreadythd, NULL); + pthread_join(rtk_btservice->epollthd, NULL); + close(rtk_btservice->epoll_fd); + ALOGD("%s end!", __func__); +} + +int RTK_btservice_init() +{ + int ret; + rtk_btservice=(Rtk_Btservice_Info *)malloc(sizeof(Rtk_Btservice_Info)); + + rtk_btservice->current_client_sock = -1; + rtk_btservice->current_complete_cback=NULL; + rtk_btservice->autopair_fd = -1; + ALOGD("%s init start!", __func__); + hcicmd_alloc_reply_timer(); + + sem_init(&rtk_btservice->cmdqueue_sem, 0, 0); + sem_init(&rtk_btservice->cmdsend_sem, 0, 1); + + pthread_mutex_init(&rtk_btservice->cmdqueue_mutex, NULL); + init_cmdqueue_hash(rtk_btservice); + if(bt_vendor_cbacks == NULL) + { + ALOGE("%s bt_vendor_cbacks is NULL!", __func__); + return -1; + } + + rtk_btservice->epoll_fd = epoll_create(64); + if (rtk_btservice->epoll_fd == -1) { + ALOGE("%s unable to create epoll instance: %s", __func__, strerror(errno)); + return -1; + } + + if(unix_socket_start(RTKBTSERVICE_SOCKETPATH) < 0) + { + ALOGE("%s unix_socket_start fail!", __func__); + return -1; + } + + ret = RTK_btservice_thread_start(); + if(ret<0) + { + ALOGE("%s RTK_btservice_thread_start fail!", __func__); + return -1; + } + ALOGD("%s init done!", __func__); + return 0; +} + +void RTK_btservice_destroyed() +{ + ALOGD("%s destroyed start!", __func__); + RTK_btservice_thread_stop(); + close(rtk_btservice->socketfd); + sem_destroy(&rtk_btservice->cmdqueue_sem); + sem_destroy(&rtk_btservice->cmdsend_sem); + flush_cmdqueue_hash(rtk_btservice); + hcicmd_free_reply_timer(); + pthread_mutex_destroy(&rtk_btservice->cmdqueue_mutex); + rtk_btservice->autopair_fd = -1; + rtk_btservice->current_client_sock = -1; + free(rtk_btservice); + ALOGD("%s destroyed done!", __func__); +} + + diff --git a/rtkbt/code/libbt-vendor/src/rtk_btsnoop_net.c b/rtkbt/code/libbt-vendor/src/rtk_btsnoop_net.c old mode 100644 new mode 100755 index dcf4636..2de4618 --- a/rtkbt/code/libbt-vendor/src/rtk_btsnoop_net.c +++ b/rtkbt/code/libbt-vendor/src/rtk_btsnoop_net.c @@ -44,7 +44,7 @@ static pthread_mutex_t btsnoop_log_lock; static void rtk_safe_close_(int *fd); -static void *rtk_listen_fn_(void *context); +static void *rtk_listen_fn_(); static const char *RTK_LISTEN_THREAD_NAME_ = "rtk_btsnoop_net"; static const int RTK_LOCALHOST_ = 0xC0A80AE2; // 192.168.10.226 @@ -79,14 +79,36 @@ static uint64_t rtk_btsnoop_timestamp(void) { void rtk_btsnoop_open() { pthread_mutex_init(&btsnoop_log_lock, NULL); + char last_log_path[PATH_MAX]; + uint64_t timestamp; + uint32_t usec; + uint8_t sec,hour, minus,day; + if (hci_btsnoop_fd != -1) { ALOGE("%s btsnoop log file is already open.", __func__); return; } if(rtk_btsnoop_save_log) { - char last_log_path[PATH_MAX]; - snprintf(last_log_path, PATH_MAX, "%s.%llu", rtk_btsnoop_path, rtk_btsnoop_timestamp()); + timestamp = rtk_btsnoop_timestamp() - BTSNOOP_EPOCH_DELTA; + usec = (uint32_t)(timestamp % 1000000LL); + timestamp /= 1000000LL; + sec = (uint8_t)(timestamp % 60LL); + timestamp /= 60LL; + minus = (uint8_t)(timestamp % 60LL); + timestamp /= 60LL; + hour = (uint8_t)(timestamp % 24LL); + timestamp /= 24LL; + day = (uint8_t)(timestamp % 30LL); + timestamp /= 30LL; + //snprintf(last_log_path, PATH_MAX, "%s.%llu", rtk_btsnoop_path, rtk_btsnoop_timestamp()); + snprintf(last_log_path, PATH_MAX, "%s.%uY-%dD-%dH-%dM-%dS-%dUS", rtk_btsnoop_path, + (uint32_t)timestamp, day, hour, minus, sec, usec); + if (!rename(rtk_btsnoop_path, last_log_path) && errno != ENOENT) + ALOGE("%s unable to rename '%s' to '%s': %s", __func__, rtk_btsnoop_path, last_log_path, strerror(errno)); + } + else { + snprintf(last_log_path, PATH_MAX, "%s.last", rtk_btsnoop_path); if (!rename(rtk_btsnoop_path, last_log_path) && errno != ENOENT) ALOGE("%s unable to rename '%s' to '%s': %s", __func__, rtk_btsnoop_path, last_log_path, strerror(errno)); } @@ -327,7 +349,7 @@ void rtk_btsnoop_net_write(serial_data_type_t type, uint8_t *data, bool is_recei pthread_mutex_unlock(&rtk_client_socket_lock_); } -static void *rtk_listen_fn_(void *context) { +static void *rtk_listen_fn_() { prctl(PR_SET_NAME, (unsigned long)RTK_LISTEN_THREAD_NAME_, 0, 0, 0); rtk_listen_socket_ = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); diff --git a/rtkbt/code/libbt-vendor/src/rtk_heartbeat.c b/rtkbt/code/libbt-vendor/src/rtk_heartbeat.c new file mode 100755 index 0000000..4ace262 --- /dev/null +++ b/rtkbt/code/libbt-vendor/src/rtk_heartbeat.c @@ -0,0 +1,245 @@ +#define LOG_TAG "rtk_heartbeat" +#define RTKBT_RELEASE_NAME "20180525_BT_ANDROID_8.1" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bt_hci_bdroid.h" +#include "bt_vendor_rtk.h" +#include "userial.h" +#include "userial_vendor.h" +#include "rtk_btservice.h" +#include "rtk_poll.h" +#include "upio.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bt_vendor_lib.h" + +#define RTKBT_HEARTBEAT_CONF_FILE "/vendor/etc/bluetooth/rtkbt_heartbeat.conf" + +#define HCI_EVT_HEARTBEAT_STATUS_OFFSET (5) +#define HCI_EVT_HEARTBEAT_SEQNUM_OFFSET_L (6) +#define HCI_EVT_HEARTBEAT_SEQNUM_OFFSET_H (7) + +static const uint32_t DEFALUT_HEARTBEAT_TIMEOUT_MS = 1000; //send a per sercond +int heartBeatLog = -1; +static int heartBeatTimeout= -1; +static bool heartbeatFlag = false; +static int heartbeatCount= 0; +static uint16_t nextSeqNum= 1; +static uint16_t cleanupFlag = 0; + +typedef struct Rtk_Service_Data +{ + uint16_t opcode; + uint8_t parameter_len; + uint8_t *parameter; + void (*complete_cback)(void *); +}Rtk_Service_Data; + +#define HCI_CMD_VNDR_HEARTBEAT 0xFC94 + +extern void Rtk_Service_Vendorcmd_Hook(Rtk_Service_Data *RtkData, int client_sock); +extern uint8_t get_heartbeat_from_hardware(); + +static char *rtk_trim(char *str) { + while (isspace(*str)) + ++str; + + if (!*str) + return str; + + char *end_str = str + strlen(str) - 1; + while (end_str > str && isspace(*end_str)) + --end_str; + + end_str[1] = '\0'; + return str; +} + + +static void load_rtkbt_heartbeat_conf() +{ + char *split; + FILE *fp = fopen(RTKBT_HEARTBEAT_CONF_FILE, "rt"); + if (!fp) { + ALOGE("%s unable to open file '%s': %s", __func__, RTKBT_HEARTBEAT_CONF_FILE, strerror(errno)); + return; + } + int line_num = 0; + char line[1024]; + //char value[1024]; + while (fgets(line, sizeof(line), fp)) { + char *line_ptr = rtk_trim(line); + ++line_num; + + // Skip blank and comment lines. + if (*line_ptr == '\0' || *line_ptr == '#' || *line_ptr == '[') + continue; + + split = strchr(line_ptr, '='); + if (!split) { + ALOGE("%s no key/value separator found on line %d.", __func__, line_num); + continue; + } + + *split = '\0'; + char *endptr; + if(!strcmp(rtk_trim(line_ptr), "HeartBeatTimeOut")) { + heartBeatTimeout = strtol(rtk_trim(split+1), &endptr, 0); + } + else if(!strcmp(rtk_trim(line_ptr), "HeartBeatLog")) { + heartBeatLog = strtol(rtk_trim(split+1), &endptr, 0); + } + } + + fclose(fp); + +} + +static void rtkbt_heartbeat_cmpl_cback (void *p_params) +{ + uint8_t status = 0; + uint16_t seqnum; + HC_BT_HDR *p_evt_buf = p_params; + //uint8_t *p = NULL; + if(p_params != NULL) + { + p_evt_buf = (HC_BT_HDR *) p_params; + status = p_evt_buf->data[HCI_EVT_HEARTBEAT_STATUS_OFFSET]; + seqnum = p_evt_buf->data[HCI_EVT_HEARTBEAT_SEQNUM_OFFSET_H]<<8 | p_evt_buf->data[HCI_EVT_HEARTBEAT_SEQNUM_OFFSET_L]; + } + + if(status == 0 && seqnum == nextSeqNum) + { + nextSeqNum = (seqnum+1); + heartbeatCount = 0; + } + else + { + ALOGE("rtkbt_heartbeat_cmpl_cback: Current SeqNum = %d,should SeqNum=%d, status = %d", seqnum, nextSeqNum, status); + ALOGE("heartbeat event missing: restart bluedroid stack\n"); + usleep(1000); + kill(getpid(), SIGKILL); + } + +} + + +static void heartbeat_timed_out()//(union sigval arg) +{ + Rtk_Service_Data *p_buf; + + heartbeatCount++; + if(heartbeatCount >= 3) + { + if(cleanupFlag == 1) + { + ALOGW("Already cleanup, ignore."); + return; + } + ALOGE("heartbeat_timed_out: heartbeatCount = %d, expected nextSeqNum = %d",heartbeatCount, nextSeqNum); + ALOGE("heartbeat_timed_out,controller may be suspend! Now restart bluedroid stack\n"); + usleep(1000); + kill(getpid(), SIGKILL); + return; + } + if(heartbeatFlag) + { + p_buf = (Rtk_Service_Data *)malloc(sizeof(Rtk_Service_Data)); + if (NULL == p_buf) + { + ALOGE("p_buf: allocate error"); + return; + } + p_buf->opcode = HCI_CMD_VNDR_HEARTBEAT; + p_buf->parameter = NULL; + p_buf->parameter_len = 0; + p_buf->complete_cback = rtkbt_heartbeat_cmpl_cback; + + Rtk_Service_Vendorcmd_Hook(p_buf,-1); + free(p_buf); + poll_timer_flush(); + } +} + + +static void rtkbt_heartbeat_beginTimer_func(void) +{ + Rtk_Service_Data *p_buf; + + if((heartBeatTimeout != -1) && (heartBeatLog != -1)) + { + poll_init(heartbeat_timed_out,heartBeatTimeout); + } + else + { + heartBeatLog = 0; + poll_init(heartbeat_timed_out,DEFALUT_HEARTBEAT_TIMEOUT_MS); + } + poll_enable(TRUE); + + p_buf = (Rtk_Service_Data *)malloc(sizeof(Rtk_Service_Data)); + if (NULL == p_buf) + { + ALOGE("p_buf: allocate error"); + return; + } + p_buf->opcode = HCI_CMD_VNDR_HEARTBEAT; + p_buf->parameter = NULL; + p_buf->parameter_len = 0; + p_buf->complete_cback = rtkbt_heartbeat_cmpl_cback; + + Rtk_Service_Vendorcmd_Hook(p_buf,-1); + free(p_buf); + + //rtkbt_api_callbacks->BTM_VendorSpecificCommand(HCI_CMD_VNDR_HEARTBEAT,0,NULL,rtkbt_heartbeat_cmpl_cback); + poll_timer_flush(); +} + +void Heartbeat_cleanup() +{ + heartbeatFlag = false; + nextSeqNum = 1; + heartbeatCount = 0; + cleanupFlag = 1; + poll_enable(FALSE); + poll_cleanup(); +} + +void Heartbeat_init() +{ + int res; + ALOGD("Heartbeat_init start"); + Heartbeat_cleanup(); + load_rtkbt_heartbeat_conf(); + heartbeatFlag = true; + heartbeatCount = 0; + cleanupFlag = 0; + res = get_heartbeat_from_hardware(); + ALOGD("Heartbeat_init res = %x",res); + if(res == 1) + rtkbt_heartbeat_beginTimer_func(); + else + Heartbeat_cleanup(); + ALOGD("Heartbeat_init end"); +} + diff --git a/rtkbt/code/libbt-vendor/src/rtk_parse.c b/rtkbt/code/libbt-vendor/src/rtk_parse.c old mode 100644 new mode 100755 index cc9796f..d170472 --- a/rtkbt/code/libbt-vendor/src/rtk_parse.c +++ b/rtkbt/code/libbt-vendor/src/rtk_parse.c @@ -33,7 +33,7 @@ * ******************************************************************************/ #define LOG_TAG "rtk_parse" -#define RTKBT_RELEASE_NAME "Test" +#define RTKBT_RELEASE_NAME "20180525_BT_ANDROID_8.1" #include #include @@ -191,6 +191,12 @@ enum { profile_max = 8 }; +typedef struct RTK_COEX_INFO { + RT_LIST_ENTRY list; + HC_BT_HDR * p_buf; + uint16_t opcode; +}tRTK_COEX_INFO; + //profile info data typedef struct RTK_PROF_INFO { RT_LIST_ENTRY list; @@ -214,7 +220,9 @@ typedef struct RTK_CONN_PROF { typedef struct RTK_PROF { RT_LIST_HEAD conn_hash; //hash for connections RT_LIST_HEAD profile_list; //hash for profile info + RT_LIST_HEAD coex_list; pthread_mutex_t profile_mutex; + pthread_mutex_t coex_mutex; pthread_mutex_t udpsocket_mutex; pthread_t thread_monitor; pthread_t thread_data; @@ -263,9 +271,12 @@ typedef struct HCI_EVENT_BT_INFO_CONTROL { uint8_t autoreport_enable; }tHCI_EVENT_BT_INFO_CONTROL; +extern void Heartbeat_init(); + tRTK_PROF rtk_prof; volatile int poweroff_allowed = 0; uint8_t coex_log_enable = 0; +static volatile bool coex_cmd_send = false; #define BIT(_I) (uint16_t)(1<<(_I)) #define is_profile_connected(profile) ((rtk_prof.profile_bitmap & BIT(profile)) >0) @@ -759,17 +770,70 @@ tRTK_PROF_INFO* find_profile_by_handle_dcid_scid(tRTK_PROF* h5, uint16_t handle, return NULL; } +void init_coex_hash(tRTK_PROF* h5) +{ + RT_LIST_HEAD* head = &h5->coex_list; + ListInitializeHeader(head); +} + +void delete_coex_from_hash(tRTK_COEX_INFO* desc) +{ + if (desc) + { + ListDeleteNode(&desc->list); + free(desc); + desc = NULL; + } +} + +void flush_coex_hash(tRTK_PROF* h5) +{ + RT_LIST_HEAD* head = &h5->coex_list; + RT_LIST_ENTRY* iter = NULL, *temp = NULL; + tRTK_COEX_INFO* desc = NULL; + + pthread_mutex_lock(&rtk_prof.coex_mutex); + LIST_FOR_EACH_SAFELY(iter, temp, head) + { + desc = LIST_ENTRY(iter, tRTK_COEX_INFO, list); + delete_coex_from_hash(desc); + } + //ListInitializeHeader(head); + pthread_mutex_unlock(&rtk_prof.coex_mutex); +} + static void rtk_cmd_complete_cback(void *p_mem) { if(p_mem) bt_vendor_cbacks->dealloc(p_mem); + pthread_mutex_lock(&rtk_prof.coex_mutex); + RT_LIST_ENTRY* iter = ListGetTop(&(rtk_prof.coex_list)); + tRTK_COEX_INFO* desc = NULL; + if (iter) { + desc = LIST_ENTRY(iter, tRTK_COEX_INFO, list); + if (desc) + { + ListDeleteNode(&desc->list); + } + } + else { + coex_cmd_send = false; + } + pthread_mutex_unlock(&rtk_prof.coex_mutex); + + if(desc) { + ALOGE("%s, transmit_command Opcode:%x",__func__, desc->opcode); + bt_vendor_cbacks->xmit_cb(desc->opcode, desc->p_buf, rtk_cmd_complete_cback); + } + + free(desc); return; } void rtk_vendor_cmd_to_fw(uint16_t opcode, uint8_t parameter_len, uint8_t* parameter) { - uint8_t temp = 0; - HC_BT_HDR *p_buf=NULL; + //uint8_t temp = 0; + HC_BT_HDR *p_buf = NULL; if(bt_vendor_cbacks) p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + HCI_CMD_PREAMBLE_SIZE + parameter_len); @@ -795,8 +859,29 @@ void rtk_vendor_cmd_to_fw(uint16_t opcode, uint8_t parameter_len, uint8_t* param } if(bt_vendor_cbacks) { - ALOGE("transmit_command Opcode:%x",opcode); + RtkLogMsg("begin transmit_command Opcode:%x",opcode); + pthread_mutex_lock(&rtk_prof.coex_mutex); + if(!coex_cmd_send) { + coex_cmd_send = true; + pthread_mutex_unlock(&rtk_prof.coex_mutex); bt_vendor_cbacks->xmit_cb(opcode, p_buf, rtk_cmd_complete_cback); + } + else { + tRTK_COEX_INFO* pcoex_info = NULL; + pcoex_info = malloc(sizeof(tRTK_COEX_INFO)); + if (NULL == pcoex_info) + { + ALOGE("rtk_vendor_cmd_to_fw: allocate error"); + return; + } + + pcoex_info->p_buf = p_buf; + pcoex_info->opcode = opcode; + + ListAddToTail(&(pcoex_info->list), &(rtk_prof.coex_list)); + pthread_mutex_unlock(&rtk_prof.coex_mutex); + } + } return ; } @@ -1162,7 +1247,7 @@ uint8_t handle_l2cap_discon_req(uint16_t handle, uint16_t dcid, uint16_t scid, u void packets_count(uint16_t handle, uint16_t scid, uint16_t length, uint8_t direction, uint8_t *user_data) { tRTK_PROF_INFO* prof_info = NULL; - uint8_t profile_type; + //uint8_t profile_type; tRTK_CONN_PROF* hci_conn = find_connection_by_handle(&rtk_prof, handle); if(NULL == hci_conn) @@ -1214,6 +1299,14 @@ void packets_count(uint16_t handle, uint16_t scid, uint16_t length, uint8_t dire static void timeout_handler(int signo, siginfo_t * info, void *context) { + if(info == NULL) + { + RtkLogMsg("info null"); + } + if(context == NULL) + { + RtkLogMsg("context null"); + } if (signo == TIMER_POLLING) { RtkLogMsg("polling timeout"); @@ -1346,9 +1439,9 @@ int udpsocket_send(char *tx_msg, int msg_size) int udpsocket_recv(uint8_t *recv_msg, uint8_t *msg_size) { - struct hostent *hostp; /* client host info */ + //struct hostent *hostp; /* client host info */ char buf[MAX_PAYLOAD]; /* message buf */ - char *hostaddrp; /* dotted decimal host addr string */ + //char *hostaddrp; /* dotted decimal host addr string */ int n; /* message byte size */ struct sockaddr_in recv_addr; socklen_t clientlen = sizeof(recv_addr); @@ -1575,6 +1668,7 @@ static void rtk_handle_bt_info_control(uint8_t* p) static void rtk_handle_bt_coex_control(uint8_t* p) { uint8_t opcode = *p++; + uint8_t op_len = 0; RtkLogMsg("receive bt coex control event from wifi, opration is 0x%x", opcode); switch (opcode) { @@ -1589,6 +1683,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) uint8_t opcode_len = *p++; uint8_t value = *p++; uint8_t temp_cmd[3]; + op_len = opcode_len; temp_cmd[0] = HCI_VENDOR_SUB_CMD_BT_ENABLE_IGNORE_WLAN_ACT_CMD; temp_cmd[1] = 1; temp_cmd[2] = value; @@ -1601,6 +1696,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) uint8_t opcode_len = *p++; uint8_t value = *p++; uint8_t temp_cmd[3]; + op_len = opcode_len; temp_cmd[0] = HCI_VENDOR_SUB_CMD_SET_BT_LNA_CONSTRAINT; temp_cmd[1] = 1; temp_cmd[2] = value; @@ -1613,6 +1709,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) uint8_t opcode_len = *p++; uint8_t power_decrease = *p++; uint8_t temp_cmd[3]; + op_len = opcode_len; temp_cmd[0] = HCI_VENDOR_SUB_CMD_WIFI_FORCE_TX_POWER_CMD; temp_cmd[1] = 1; temp_cmd[2] = power_decrease; @@ -1625,6 +1722,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) uint8_t opcode_len = *p++; uint8_t psd_mode = *p++; uint8_t temp_cmd[3]; + op_len = opcode_len; temp_cmd[0] = HCI_VENDOR_SUB_CMD_SET_BT_PSD_MODE; temp_cmd[1] = 1; temp_cmd[2] = psd_mode; @@ -1636,6 +1734,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) { uint8_t opcode_len = *p++; uint8_t temp_cmd[5]; + op_len = opcode_len; temp_cmd[0] = HCI_VENDOR_SUB_CMD_WIFI_CHANNEL_AND_BANDWIDTH_CMD; temp_cmd[1] = 3; memcpy(temp_cmd+2, p, 3);//wifi_state, wifi_centralchannel, chnnels_btnotuse @@ -1649,6 +1748,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) rtk_prof.piconet_id = *p++; rtk_prof.mode = *p++; uint8_t temp_cmd[4]; + op_len = opcode_len; temp_cmd[0] = HCI_VENDOR_SUB_CMD_GET_AFH_MAP_L; temp_cmd[1] = 2; temp_cmd[2] = rtk_prof.piconet_id; @@ -1661,6 +1761,7 @@ static void rtk_handle_bt_coex_control(uint8_t* p) { uint8_t opcode_len = *p++; uint8_t access_type = *p++; + op_len = opcode_len; if(access_type == 0) //read { uint8_t temp_cmd[7]; @@ -1691,7 +1792,7 @@ void rtk_handle_event_from_wifi(uint8_t* msg) { uint8_t *p = msg; uint8_t event_code = *p++; - + uint8_t total_length = 0; if(memcmp(msg, invite_rsp, sizeof(invite_rsp)) == 0) { #if 0 @@ -1734,7 +1835,7 @@ void rtk_handle_event_from_wifi(uint8_t* msg) if(event_code == 0xFE) { - uint8_t total_length = *p++; + total_length = *p++; uint8_t extension_event = *p++; switch(extension_event) { @@ -1780,7 +1881,7 @@ static void udpsocket_receive_thread_exit_handler(int sig) pthread_exit(0); } -static void udpsocket_receive_thread(void *arg) +static void udpsocket_receive_thread()//(void *arg) { uint8_t msg_recv[MAX_PAYLOAD]; uint8_t recv_length; @@ -1791,7 +1892,7 @@ static void udpsocket_receive_thread(void *arg) actions.sa_flags = 0; actions.sa_handler = udpsocket_receive_thread_exit_handler; - int rc = sigaction(SIGUSR2,&actions,NULL); + sigaction(SIGUSR2,&actions,NULL);//int rc = sigaction(SIGUSR2,&actions,NULL); RtkLogMsg("udpsocket_receive_thread started"); prctl(PR_SET_NAME, (unsigned long)"udpsocket_receive_thread", 0, 0, 0); @@ -1947,6 +2048,7 @@ void rtk_parse_init(void) RtkLogMsg("rtk_profile_init, version: %s", RTK_VERSION); pthread_mutex_init(&rtk_prof.profile_mutex, NULL); + pthread_mutex_init(&rtk_prof.coex_mutex, NULL); pthread_mutex_init(&rtk_prof.udpsocket_mutex, NULL); alloc_a2dp_packet_count_timer(); alloc_pan_packet_count_timer(); @@ -1955,6 +2057,7 @@ void rtk_parse_init(void) init_profile_hash(&rtk_prof); init_connection_hash(&rtk_prof); + init_coex_hash(&rtk_prof); create_udpsocket_socket(); } @@ -1971,6 +2074,8 @@ void rtk_parse_cleanup() flush_connection_hash(&rtk_prof); flush_profile_hash(&rtk_prof); pthread_mutex_destroy(&rtk_prof.profile_mutex); + flush_coex_hash(&rtk_prof); + pthread_mutex_destroy(&rtk_prof.coex_mutex); stop_udpsocket_receive_thread(); pthread_mutex_destroy(&rtk_prof.udpsocket_mutex); @@ -2161,6 +2266,10 @@ static void rtk_handle_cmd_complete_evt(uint8_t*p, uint8_t len) rtk_handle_vender_mailbox_cmp_evt(p, len); break; + case HCI_SET_EVENT_MASK: + Heartbeat_init(); + break; + case HCI_VENDOR_ADD_BITPOOL_FW: status = *p++; RtkLogMsg("received cmd complete event for HCI_VENDOR_ADD_BITPOOL_FW status:%d",status); @@ -2304,7 +2413,7 @@ static void rtk_handle_disconnect_complete_evt(uint8_t* p) } } -static void rtk_handle_le_connection_complete_evt(uint8_t* p) +static void rtk_handle_le_connection_complete_evt(uint8_t* p, bool enhanced) { uint16_t handle, interval; uint8_t status; @@ -2313,6 +2422,9 @@ static void rtk_handle_le_connection_complete_evt(uint8_t* p) status = *p++; STREAM_TO_UINT16 (handle, p); p += 8; //role, address type, address + if(enhanced) { + p += 12; + } STREAM_TO_UINT16 (interval, p); if(status == 0) { @@ -2366,9 +2478,11 @@ static void rtk_handle_le_meta_evt(uint8_t* p) uint8_t sub_event = *p++; switch (sub_event) { case HCI_BLE_CONN_COMPLETE_EVT: - rtk_handle_le_connection_complete_evt(p); + rtk_handle_le_connection_complete_evt(p, false); + break; + case HCI_BLE_ENHANCED_CONN_COMPLETE_EVT: + rtk_handle_le_connection_complete_evt(p, true); break; - case HCI_BLE_LL_CONN_PARAM_UPD_EVT: rtk_handle_le_connection_update_complete_evt(p); break; @@ -2627,7 +2741,7 @@ void rtk_parse_l2cap_data(uint8_t *pp, uint8_t direction) void rtk_add_le_profile(BD_ADDR bdaddr, uint16_t handle, uint8_t profile_map) { RtkLogMsg("rtk_add_le_profile, handle is %x, profile_map is %x", handle, profile_map); - + RtkLogMsg("bdaddr[0] = %d", bdaddr[0]); tRTK_CONN_PROF* hci_conn = find_connection_by_handle(&rtk_prof, handle); if(hci_conn) { @@ -2646,7 +2760,7 @@ void rtk_add_le_profile(BD_ADDR bdaddr, uint16_t handle, uint8_t profile_map) void rtk_delete_le_profile(BD_ADDR bdaddr, uint16_t handle, uint8_t profile_map) { RtkLogMsg("rtk_delete_le_profile, handle is %x, profile_map is %x", handle, profile_map); - + RtkLogMsg("bdaddr[0] = %d", bdaddr[0]); pthread_mutex_lock(&rtk_prof.profile_mutex); tRTK_CONN_PROF* hci_conn = find_connection_by_handle(&rtk_prof, handle); if(hci_conn == NULL) @@ -2689,7 +2803,7 @@ void rtk_add_le_data_count(uint8_t data_type) } } -static const rtk_parse_manager_t parse_interface = { +static rtk_parse_manager_t parse_interface = { rtk_parse_internal_event_intercept, rtk_parse_l2cap_data, rtk_parse_init, @@ -2700,7 +2814,7 @@ static const rtk_parse_manager_t parse_interface = { rtk_add_le_data_count, }; -const rtk_parse_manager_t *rtk_parse_manager_get_interface() { +rtk_parse_manager_t *rtk_parse_manager_get_interface() { return &parse_interface; } diff --git a/rtkbt/code/libbt-vendor/src/rtk_poll.c b/rtkbt/code/libbt-vendor/src/rtk_poll.c new file mode 100755 index 0000000..2ed91c9 --- /dev/null +++ b/rtkbt/code/libbt-vendor/src/rtk_poll.c @@ -0,0 +1,248 @@ +/****************************************************************************** + * + * Copyright (C) 2014-2016 Realtek 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. + * + ******************************************************************************/ + +/****************************************************************************** + * + * Filename: poll.c + * + * Description: Contains host & controller handshake implementation + * + ******************************************************************************/ + +#define LOG_TAG "bt_poll" + +#include +#include +#include +#include +#include "bt_hci_bdroid.h" +//#include "bt_utils.h" +#include "rtk_poll.h" + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ +#ifndef BTPOLL_DBG +#define BTPOLL_DBG false +#endif + +#if (BTPOLL_DBG == true) +#define BTPOLLDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);} +#else +#define BTPOLLDBG(param, ...) {} +#endif + +#ifndef ENABLE_BT_POLL_IN_ACTIVE_MODE +#define ENABLE_BT_POLL_IN_ACTIVE_MODE false +#endif + +#ifndef DEFAULT_POLL_IDLE_TIMEOUT +#define DEFAULT_POLL_IDLE_TIMEOUT 2500 +#endif + +volatile uint32_t rtkbt_heartbeat_noack_num = 0; +volatile uint32_t rtkbt_heartbeat_evt_seqno = 0xffffffff; + +timed_out poll_idle_timeout; + + +/****************************************************************************** +** Externs +******************************************************************************/ + +/****************************************************************************** +** Local type definitions +******************************************************************************/ + +/* Poll state */ +enum { + POLL_DISABLED = 0, /* initial state */ + POLL_ENABLED, +}; + +/* poll control block */ +typedef struct +{ + uint8_t state; /* poll state */ + uint8_t timer_created; + timer_t timer_id; + uint32_t timeout_ms; +} bt_poll_cb_t; + +extern int timer_create(clockid_t clockid, struct sigevent *sevp, + timer_t *timerid); +extern int timer_delete(timer_t timerid); + +int timer_settime(timer_t timerid, int flags, + const struct itimerspec *new_value, + struct itimerspec * old_value); +/****************************************************************************** +** Static variables +******************************************************************************/ + +static bt_poll_cb_t bt_poll_cb; + +/****************************************************************************** +** Poll Static Functions +******************************************************************************/ + +/******************************************************************************* +** +** Function poll_timer_stop +** +** Description stop timer if allowed +** +** Returns None +** +*******************************************************************************/ +static void poll_timer_stop(void) +{ + int status; + struct itimerspec ts; + + ALOGI("poll_timer_stop: timer_created %d", bt_poll_cb.timer_created); + + if (bt_poll_cb.timer_created == true) { + ts.it_value.tv_sec = 0; + ts.it_value.tv_nsec = 0; + ts.it_interval.tv_sec = 0; + ts.it_interval.tv_nsec = 0; + + status = timer_settime(bt_poll_cb.timer_id, 0, &ts, 0); + if (status == -1) + ALOGE("[STOP] Failed to set poll idle timeout"); + } +} + +/***************************************************************************** +** POLL Interface Functions +*****************************************************************************/ + +/******************************************************************************* +** +** Function poll_init +** +** Description Init bt poll +** +** Returns None +** +*******************************************************************************/ +void poll_init(timed_out ptr_timeout,uint32_t timeout) +{ + memset((void*)&bt_poll_cb, 0, sizeof(bt_poll_cb_t)); + poll_idle_timeout = ptr_timeout; + bt_poll_cb.state = POLL_DISABLED; + bt_poll_cb.timeout_ms = timeout; + + ALOGI("poll_init: state %d, timeout %d ms,timeout=%d", bt_poll_cb.state, bt_poll_cb.timeout_ms,timeout); +} + +/******************************************************************************* +** +** Function poll_cleanup +** +** Description Poll clean up +** +** Returns None +** +*******************************************************************************/ +void poll_cleanup(void) +{ + ALOGI("poll_cleanup: timer_created %d", bt_poll_cb.timer_created); + + if (bt_poll_cb.timer_created == true) { + timer_delete(bt_poll_cb.timer_id); + } +} + +/******************************************************************************* +** +** Function poll_enable +** +** Description Enalbe/Disable poll +** +** Returns None +** +*******************************************************************************/ +void poll_enable(uint8_t turn_on) +{ + ALOGI("poll_enable: turn_on %d, state %d", turn_on, bt_poll_cb.state); + + if ((turn_on == true) && (bt_poll_cb.state == POLL_ENABLED)) { + ALOGI("poll_enable: poll is already on!!!"); + return; + } else if ((turn_on == false) && (bt_poll_cb.state == POLL_DISABLED)) { + ALOGI("poll_enable: poll is already off!!!"); + return; + } + + if (turn_on == false) { + poll_timer_stop(); + bt_poll_cb.state = POLL_DISABLED; + } else { + /* start poll timer when poll_timer_flush invoked first time */ + bt_poll_cb.state = POLL_ENABLED; + } +} + +/******************************************************************************* +** +** Function poll_timer_flush +** +** Description Called to delay notifying Bluetooth chip. +** Normally this is called when there is data to be sent +** over HCI. +** +** Returns None +** +*******************************************************************************/ +void poll_timer_flush(void) +{ + int status; + struct itimerspec ts; + struct sigevent se; + + BTPOLLDBG("poll_timer_flush: state %d", bt_poll_cb.state); + + if (bt_poll_cb.state != POLL_ENABLED) + return; + + if (bt_poll_cb.timer_created == false) { + se.sigev_notify = SIGEV_THREAD; + se.sigev_value.sival_ptr = &bt_poll_cb.timer_id; + se.sigev_notify_function = poll_idle_timeout; + se.sigev_notify_attributes = NULL; + + status = timer_create(CLOCK_MONOTONIC, &se, &bt_poll_cb.timer_id); + + if (status == 0) + bt_poll_cb.timer_created = true; + } +#if (defined(ENABLE_BT_POLL_IN_ACTIVE_MODE) && (ENABLE_BT_POLL_IN_ACTIVE_MODE == false)) + if (bt_poll_cb.timer_created == true) { + ts.it_value.tv_sec = bt_poll_cb.timeout_ms / 1000; + ts.it_value.tv_nsec = 1000 * 1000 * (bt_poll_cb.timeout_ms % 1000); + ts.it_interval.tv_sec = 0; + ts.it_interval.tv_nsec = 0; + + status = timer_settime(bt_poll_cb.timer_id, 0, &ts, 0); + if (status == -1) + ALOGE("[Flush] Failed to set poll idle timeout"); + } +#endif +} diff --git a/rtkbt/code/libbt-vendor/src/rtk_socket.c b/rtkbt/code/libbt-vendor/src/rtk_socket.c new file mode 100755 index 0000000..18aa689 --- /dev/null +++ b/rtkbt/code/libbt-vendor/src/rtk_socket.c @@ -0,0 +1,191 @@ +/****************************************************************************** + * + * Copyright (C) 2009-2012 Realtek 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. + * + ******************************************************************************/ + +/****************************************************************************** + * + * Filename: userial_vendor.c + * + * Description: Contains vendor-specific userial functions + * + ******************************************************************************/ +#undef NDEBUG +#define LOG_TAG "rtk_socket" + +#include +#include +#include +#include +#include +#include +#include "userial.h" +#include "userial_vendor.h" +#include "rtk_socket.h" + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ + +/****************************************************************************** +** Extern functions +******************************************************************************/ + + +/****************************************************************************** +** Local type definitions +******************************************************************************/ + +/****************************************************************************** +** Static functions +******************************************************************************/ + +/****************************************************************************** +** functions +******************************************************************************/ +uint32_t Skt_Read(int fd, uint8_t *p_buf, uint32_t len) +{ + int n_read = 0; + struct pollfd pfd; + + if (fd == -1) + { + return 0; + } + + while (n_read < (int)len) + { + pfd.fd = fd; + pfd.events = POLLIN|POLLHUP; + + /* make sure there is data prior to attempting read to avoid blocking + a read for more than poll timeout */ + + int poll_ret; + RTK_NO_INTR(poll_ret = poll(&pfd, 1, 100)); + if (poll_ret == 0) + { + continue; + } + if (poll_ret < 0) { + ALOGE("%s(): poll() failed: return %d errno %d (%s)", + __func__, poll_ret, errno, strerror(errno)); + break; + } + + if (pfd.revents & (POLLHUP|POLLNVAL) ) + { + return 0; + } + + ssize_t n; + RTK_NO_INTR(n = recv(fd, p_buf + n_read, len - n_read, 0)); + + if (n == 0) + { + ALOGE("Skt_Read : channel detached remotely"); + return 0; + } + + if (n < 0) + { + ALOGE("Skt_Read : read failed (%s)", strerror(errno)); + return 0; + } + + n_read += n; + + } + + return n_read; +} + +int Skt_Read_noblock(int fd, uint8_t *p_buf, uint32_t len) +{ + int n_read = 0; + struct pollfd pfd; + + if (fd == -1) + { + ALOGE("UIPC_Read_noblock closed"); + return 0; + } + + pfd.fd = fd; + pfd.events = POLLIN|POLLHUP; + + if (poll(&pfd, 1, 0) == 0) + { + return 0; + } + + if (pfd.revents & (POLLHUP|POLLNVAL) ) + { + return 0; + } + + n_read = recv(fd, p_buf, len, MSG_DONTWAIT|MSG_NOSIGNAL); + + return n_read; +} + +bool Skt_Send(int fd, uint8_t *p_buf, uint16_t msglen) +{ + ssize_t ret; + RTK_NO_INTR(ret = write(fd, p_buf, msglen)); + if (ret < 0) { + ALOGE("failed to write (%s)", strerror(errno)); + } + + return false; +} + +int Skt_Send_noblock(int fd, uint8_t *p_buf, uint16_t msglen) +{ + int res = 0; + struct pollfd pfd; + + pfd.fd = fd; + pfd.events = POLLOUT|POLLHUP; + if (poll(&pfd, 1, 0) == 0) + { + return 0; + } + + if (pfd.revents & (POLLHUP|POLLNVAL) ) + { + ALOGE("poll : channel detached remotely"); + return 0; + } + + res = send(fd, p_buf, msglen, MSG_DONTWAIT); + if (res < 0) + { + ALOGE("failed to write (%s)", strerror(errno)); + } + + return res; +} + +/****************************************************************************** +** Static variables +******************************************************************************/ + +/***************************************************************************** +** Helper Functions +*****************************************************************************/ + + diff --git a/rtkbt/code/libbt-vendor/src/upio.c b/rtkbt/code/libbt-vendor/src/upio.c old mode 100644 new mode 100755 index b7a54a9..9291114 --- a/rtkbt/code/libbt-vendor/src/upio.c +++ b/rtkbt/code/libbt-vendor/src/upio.c @@ -369,9 +369,9 @@ int upio_set_bluetooth_power(int on) ** Returns None ** *******************************************************************************/ -void upio_set(uint8_t pio, uint8_t action, uint8_t polarity) +void upio_set(uint8_t pio, uint8_t action)//(uint8_t pio, uint8_t action, uint8_t polarity) { - int rc; + //int rc; #if (BT_WAKE_VIA_PROC == TRUE) int fd = -1; char buffer; diff --git a/rtkbt/code/libbt-vendor/src/userial_vendor.c b/rtkbt/code/libbt-vendor/src/userial_vendor.c old mode 100644 new mode 100755 index 9b62d2f..6283c44 --- a/rtkbt/code/libbt-vendor/src/userial_vendor.c +++ b/rtkbt/code/libbt-vendor/src/userial_vendor.c @@ -34,8 +34,11 @@ #include #include "userial.h" #include "userial_vendor.h" +#include "rtk_socket.h" -#define RTK_SINGLE_CMD_EVENT +#ifdef CONFIG_SCO_OVER_HCI +#include "sbc.h" +#endif /****************************************************************************** ** Constants & Macros ******************************************************************************/ @@ -60,6 +63,7 @@ ** Extern functions ******************************************************************************/ extern char rtkbt_transtype; +extern void Heartbeat_cleanup(); /****************************************************************************** ** Local type definitions @@ -97,19 +101,45 @@ typedef struct RTB_QUEUE_HEAD *recv_data; RTB_QUEUE_HEAD *send_data; RTB_QUEUE_HEAD *data_order; + volatile bool btdriver_state; } vnd_userial_cb_t; -#define RTK_NO_INTR(fn) do {} while ((fn) == -1 && errno == EINTR) +#ifdef CONFIG_SCO_OVER_HCI +uint16_t btui_msbc_h2[] = {0x0801,0x3801,0xc801,0xf801}; +typedef struct +{ + pthread_mutex_t sco_mutex; + pthread_cond_t sco_cond; + pthread_t thread_socket_sco_id; + pthread_t thread_recv_sco_id; + pthread_t thread_send_sco_id; + uint16_t sco_handle; + bool thread_sco_running; + uint16_t voice_settings; + RTB_QUEUE_HEAD *recv_sco_data; + RTB_QUEUE_HEAD *send_sco_data; + unsigned char enc_data[480]; + unsigned int current_pos; + uint16_t sco_packet_len; + bool msbc_used; + int ctrl_fd, data_fd; + sbc_t sbc_dec, sbc_enc; + uint32_t pcm_enc_seq; +}sco_cb_t; +#endif /****************************************************************************** ** Static functions ******************************************************************************/ static void h5_data_ready_cb(serial_data_type_t type, unsigned int total_length); static uint16_t h5_int_transmit_data_cb(serial_data_type_t type, uint8_t *data, uint16_t length) ; - +extern void RTK_btservice_destroyed(); /****************************************************************************** ** Static variables ******************************************************************************/ +#ifdef CONFIG_SCO_OVER_HCI +static sco_cb_t sco_cb; +#endif static vnd_userial_cb_t vnd_userial; static const hci_h5_t* h5_int_interface; static int packet_recv_state = RTKBT_PACKET_IDLE; @@ -126,12 +156,12 @@ static serial_data_type_t coex_current_type = 0; static unsigned char coex_resvered_buffer[2048] = {0}; static int coex_resvered_length = 0; -#ifdef RTK_SINGLE_CMD_EVENT -static int cmd_packet_recv_state = RTKBT_PACKET_IDLE; -static int cmd_packet_bytes_need = 0; -static serial_data_type_t cmd_current_type = 0; -static unsigned char cmd_resvered_header[10] = {0}; -static int cmd_resvered_length = 0; +#ifdef RTK_HANDLE_EVENT +static int received_packet_state = RTKBT_PACKET_IDLE; +static int received_packet_bytes_need = 0; +static serial_data_type_t recv_packet_current_type = 0; +static unsigned char received_resvered_header[2048] = {0}; +static int received_resvered_length = 0; #endif static rtk_parse_manager_t * rtk_parse_manager = NULL; @@ -141,6 +171,13 @@ static hci_h5_callbacks_t h5_int_callbacks = { .h5_data_ready_cb = h5_data_ready_cb, }; +static const uint8_t hci_preamble_sizes[] = { + COMMAND_PREAMBLE_SIZE, + ACL_PREAMBLE_SIZE, + SCO_PREAMBLE_SIZE, + EVENT_PREAMBLE_SIZE +}; + /***************************************************************************** ** Helper Functions *****************************************************************************/ @@ -252,6 +289,16 @@ void userial_vendor_init(char *bt_device_node) vnd_userial.data_order = RtbQueueInit(); vnd_userial.recv_data = RtbQueueInit(); vnd_userial.send_data = RtbQueueInit(); +#ifdef CONFIG_SCO_OVER_HCI + sco_cb.recv_sco_data = RtbQueueInit(); + sco_cb.send_sco_data = RtbQueueInit(); + pthread_mutex_init(&sco_cb.sco_mutex, NULL); + pthread_cond_init(&sco_cb.sco_cond, NULL); + memset(&sco_cb.sbc_enc, 0, sizeof(sbc_t)); + sbc_init(&sco_cb.sbc_enc);//sbc_init(&sco_cb.sbc_enc, 0); + memset(&sco_cb.sbc_dec, 0, sizeof(sbc_t)); + sbc_init(&sco_cb.sbc_dec);//sbc_init(&sco_cb.sbc_enc, 0); +#endif } @@ -357,6 +404,7 @@ int userial_vendor_open(tUSERIAL_CFG *p_cfg) userial_ioctl_init_bt_wake(vnd_userial.fd); #endif + vnd_userial.btdriver_state = true; ALOGI("device fd = %d open", vnd_userial.fd); return vnd_userial.fd; @@ -418,34 +466,37 @@ static void userial_coex_close(void) *******************************************************************************/ void userial_vendor_close(void) { - int result; - + //int result; + RTK_btservice_destroyed(); if (vnd_userial.fd == -1) return; + if((rtkbt_transtype & RTKBT_TRANS_UART) && (rtkbt_transtype & RTKBT_TRANS_H5)) { +#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 + h5_int_interface->h5_int_cleanup(); + } vnd_userial.thread_running = false; userial_socket_close(); userial_uart_close(); userial_coex_close(); + Heartbeat_cleanup(); vnd_userial.fd = -1; + vnd_userial.btdriver_state = false; if(rtk_parse_manager) { rtk_parse_manager->rtk_parse_cleanup(); } rtk_parse_manager = NULL; - - - if((rtkbt_transtype & RTKBT_TRANS_UART) && (rtkbt_transtype & RTKBT_TRANS_H5)) { -#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) - /* de-assert bt_wake BEFORE closing port */ - ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); +#ifdef CONFIG_SCO_OVER_HCI + sbc_finish(&sco_cb.sbc_enc); + sbc_finish(&sco_cb.sbc_dec); #endif - h5_int_interface->h5_int_cleanup(); - - } } /******************************************************************************* @@ -486,6 +537,10 @@ void userial_vendor_set_baud(uint8_t userial_baud) *******************************************************************************/ void userial_vendor_ioctl(userial_vendor_ioctl_op_t op, void *p_data) { + if(p_data == NULL) + { + VNDUSERIALDBG("p_data is null"); + } switch(op) { #if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) @@ -521,6 +576,10 @@ void userial_vendor_ioctl(userial_vendor_ioctl_op_t op, void *p_data) *******************************************************************************/ int userial_set_port(char *p_conf_name, char *p_conf_value, int param) { + if(p_conf_name == NULL || param == 0) + { + VNDUSERIALDBG("p_conf_name is null"); + } strcpy(vnd_userial.port_name, p_conf_value); return 0; @@ -582,7 +641,7 @@ static uint16_t h4_int_transmit_data(uint8_t *data, uint16_t total_length) { uint16_t length = total_length; uint16_t transmitted_length = 0; - while (length > 0) { + while (length > 0 && vnd_userial.btdriver_state) { ssize_t ret = write(vnd_userial.fd, data + transmitted_length, length); switch (ret) { case -1: @@ -591,7 +650,7 @@ static uint16_t h4_int_transmit_data(uint8_t *data, uint16_t total_length) { case 0: // If we wrote nothing, don't loop more because we // can't go to infinity or beyond, ohterwise H5 can resend data - ALOGE("%s, ret %d", __func__, ret); + ALOGE("%s, ret %zd", __func__, ret); goto done; default: transmitted_length += ret; @@ -815,12 +874,12 @@ static void userial_coex_send_data_handler(unsigned char * send_buffer, int tota free(p_buf); } -static void userial_coex_handler(void *context) +static void userial_coex_handler()//(void *context) { RTK_BUFFER* skb_data; RTK_BUFFER* skb_type; eventfd_t value; - int read_length = 0; + unsigned int read_length = 0; eventfd_read(vnd_userial.event_fd, &value); if(!value && !vnd_userial.thread_running) { return; @@ -853,13 +912,370 @@ static void userial_coex_handler(void *context) } } -static void userial_recv_H4_rawdata(void *context) +#ifdef CONFIG_SCO_OVER_HCI +//receive sco encode data over hci, we need to decode msbc data to pcm, and send it to sco audio hal +static void* userial_recv_sco_thread()//(void *arg) +{ + RTK_BUFFER* skb_sco_data; + unsigned char dec_data[480]; + unsigned char pcm_data[960]; + int index = 0; + //uint16_t sco_packet_len = 60; + uint8_t * p_data = NULL; + int res = 0, writen = 0; + prctl(PR_SET_NAME, (unsigned long)"userial_recv_sco_thread", 0, 0, 0); + /* + FILE *file; + unsigned char enc_data[60]; + file = fopen("/data/misc/bluedroid/sco_capture.raw", "rb"); + FILE *file2; + file2 = fopen("/data/misc/bluedroid/sco_capture.pcm", "wb"); + if (!file) { + ALOGE("Unable to create file"); + return NULL; + } + */ + RtbEmptyQueue(sco_cb.recv_sco_data); + ALOGE("userial_recv_sco_thread start"); + while(sco_cb.thread_sco_running) { + pthread_mutex_lock(&sco_cb.sco_mutex); + while(RtbQueueIsEmpty(sco_cb.recv_sco_data) && sco_cb.thread_sco_running) { + pthread_cond_wait(&sco_cb.sco_cond, &sco_cb.sco_mutex); + } + pthread_mutex_unlock(&sco_cb.sco_mutex); + skb_sco_data = RtbDequeueHead(sco_cb.recv_sco_data); + if(!skb_sco_data) + continue; + p_data = skb_sco_data->Data; + //if (fwrite(skb_sco_data->Data, 1, 60, file) != 60) { + //ALOGE("Error capturing sample"); + //} + /* + if(fread(enc_data, 1, 60, file) > 0) { + ALOGE("userial_recv_sco_thread, fread data"); + res = sbc_decode(&sco_cb.sbc_dec, &enc_data[2], 58, dec_data, 240, &writen); + } + else { + fseek(file, 0L, SEEK_SET); + if(fread(enc_data, 1, 60, file) > 0) { + res = sbc_decode(&sco_cb.sbc_dec, &enc_data[2], 58, dec_data, 240, &writen); + } + } + */ + res = sbc_decode(&sco_cb.sbc_dec, (p_data+2), 58, dec_data, 240, &writen); + if(res > 0) { + memcpy(&pcm_data[240 * index], dec_data, 240); + //if (fwrite(dec_data, 240, 1, file2) != 240) { + //ALOGE("Error capturing sample"); + //} + index = (index + 1) % 4; + if(index == 0) { + Skt_Send_noblock(sco_cb.data_fd, pcm_data, 960); + } + } + else { + ALOGE("msbc decode fail!"); + } + RtbFree(skb_sco_data); + } + ALOGE("userial_recv_sco_thread exit"); + RtbEmptyQueue(sco_cb.recv_sco_data); + return NULL; +} + +static void* userial_send_sco_thread()//(void *arg) +{ + unsigned char enc_data[240]; + unsigned char pcm_data[960]; + unsigned char send_data[100]; + int writen = 0; + int num_read; + prctl(PR_SET_NAME, (unsigned long)"userial_send_sco_thread", 0, 0, 0); + sco_cb.pcm_enc_seq = 0; + int i; + + /* + FILE *file; + file = fopen("/data/misc/bluedroid/sco_playback.raw", "rb"); + if (!file) { + ALOGE("Unable to create file"); + return NULL; + } + */ + ALOGE("userial_send_sco_thread start"); + while(sco_cb.thread_sco_running) { + num_read = Skt_Read(sco_cb.data_fd, pcm_data, 960 * 2); + /* + for(i = 0; i < 5; i ++) { + if(fread(&enc_data[4], 1, 48, file) > 0) { + enc_data[0] = DATA_TYPE_SCO; + enc_data[3] = 48; + *(uint16_t *)&enc_data[1] = sco_cb.sco_handle; + h4_int_transmit_data(enc_data, 52); + } + else { + fseek(file, 0L, SEEK_SET); + } + } + userial_enqueue_coex_rawdata(enc_data,52, false); + //usleep(7500); + continue; + */ + for(i = 0; i < 4; i++) { + if(sbc_encode(&sco_cb.sbc_enc, &pcm_data[240*i], 240, &enc_data[i*60 +2], 58, &writen) <= 0) { + ALOGE("sbc encode error!"); + } + else { + *(uint16_t*)(&(enc_data[i*60])) = btui_msbc_h2[sco_cb.pcm_enc_seq % 4]; + sco_cb.pcm_enc_seq++; + enc_data[i*60 + 59] = 0x00; //padding + } + } + for(i = 0; i < 5; i++) { + send_data[0] = DATA_TYPE_SCO; + send_data[3] = 48; + *(uint16_t *)&send_data[1] = sco_cb.sco_handle; + memcpy(&send_data[4], &enc_data[i*48], 48); + h4_int_transmit_data(send_data, 52); + userial_enqueue_coex_rawdata(enc_data, 52, false); + } + } + ALOGE("userial_send_sco_thread exit"); + return NULL; +} + +static void userial_sco_socket_stop() +{ + sco_cb.thread_sco_running = false; + pthread_mutex_lock(&sco_cb.sco_mutex); + pthread_cond_signal(&sco_cb.sco_cond); + pthread_mutex_unlock(&sco_cb.sco_mutex); + pthread_join(sco_cb.thread_socket_sco_id, NULL); + pthread_join(sco_cb.thread_recv_sco_id, NULL); + pthread_join(sco_cb.thread_send_sco_id, NULL); +} + +static void userial_sco_ctrl_skt_handle() +{ + uint8_t cmd = 0, ack = 0;; + int result = Skt_Read(sco_cb.ctrl_fd, &cmd, 1); + + if(result == 0) { + userial_sco_socket_stop(); + return; + } + + ALOGE("%s, cmd = %d, msbc_used = %d", __func__, cmd, sco_cb.msbc_used); + switch (cmd) { + case SCO_CTRL_CMD_CHECK_READY: + + break; + + case SCO_CTRL_CMD_OUT_START: + { + pthread_attr_t thread_attr; + pthread_attr_init(&thread_attr); + pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE); + if(pthread_create(&sco_cb.thread_send_sco_id, &thread_attr, userial_send_sco_thread, NULL)!= 0 ) + { + ALOGE("pthread_create : %s", strerror(errno)); + } + } + break; + + case SCO_CTRL_CMD_IN_START: + { + pthread_attr_t thread_attr; + pthread_attr_init(&thread_attr); + pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE); + if(pthread_create(&sco_cb.thread_recv_sco_id, &thread_attr, userial_recv_sco_thread, NULL)!= 0 ) + { + ALOGE("pthread_create : %s", strerror(errno)); + } + } + break; + + case SCO_CTRL_CMD_OUT_STOP: + + break; + + case SCO_CTRL_CMD_SUSPEND: + + break; + + case SCO_CTRL_GET_AUDIO_CONFIG: + if(sco_cb.msbc_used) { + ack = 2; + Skt_Send(sco_cb.ctrl_fd, &ack, 1); + } + else { + ack = 1; + Skt_Send(sco_cb.ctrl_fd, &ack, 1); + } + break; + + default: + + break; + } +} + +static void* userial_socket_sco_thread()//(void *arg) +{ + struct sockaddr_un addr, remote; + socklen_t alen, len = sizeof(struct sockaddr_un); + fd_set read_set, active_set; + int result, max_fd; + int s_ctrl = socket(AF_LOCAL, SOCK_STREAM, 0); + int s_data = socket(AF_LOCAL, SOCK_STREAM, 0); + prctl(PR_SET_NAME, (unsigned long)"userial_socket_sco_thread", 0, 0, 0); + + //bind sco ctrl socket + unlink(SCO_CTRL_PATH); + memset(&addr, 0, sizeof(addr)); + strcpy(addr.sun_path, SCO_CTRL_PATH); + addr.sun_family = AF_LOCAL; + alen = strlen(addr.sun_path) + offsetof(struct sockaddr_un, sun_path); + if (bind(s_ctrl, (struct sockaddr *)&addr, alen) < 0) { + ALOGE("userial_socket_sco_thread, bind ctrl socket error : %s", strerror(errno)); + return NULL; + } + + if(listen(s_ctrl, 5) < 0) { + ALOGE("userial_socket_sco_thread, listen ctrl socket error : %s", strerror(errno)); + return NULL; + } + + chmod(SCO_CTRL_PATH, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); + //bind sco data socket + unlink(SCO_DATA_PATH); + memset(&addr, 0, sizeof(addr)); + strcpy(addr.sun_path, SCO_DATA_PATH); + addr.sun_family = AF_LOCAL; + alen = strlen(addr.sun_path) + offsetof(struct sockaddr_un, sun_path); + if (bind(s_data, (struct sockaddr *)&addr, alen) < 0) { + ALOGE("userial_socket_sco_thread, bind data socket error : %s", strerror(errno)); + return NULL; + } + + if(listen(s_data, 5) < 0) { + ALOGE("userial_socket_sco_thread, listen data socket error : %s", strerror(errno)); + return NULL; + } + chmod(SCO_DATA_PATH, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); + + ALOGE("userial_socket_sco_thread"); + FD_ZERO(&read_set); + FD_ZERO(&active_set); + FD_SET(s_ctrl, &active_set); + FD_SET(s_data, &active_set); + max_fd = (MAX(s_ctrl, s_data)) + 1; + + while(sco_cb.thread_sco_running) { + read_set = active_set; + result = select(max_fd, &read_set, NULL, NULL, NULL); + if (result == 0) { + ALOGE("select timeout"); + continue; + } + if (result < 0) { + if (errno != EINTR) + ALOGE("select failed %s", strerror(errno)); + continue; + } + if(FD_ISSET(s_ctrl, &read_set)) { + RTK_NO_INTR(sco_cb.ctrl_fd = accept(s_ctrl, (struct sockaddr *)&remote, &len)); + if (sco_cb.ctrl_fd == -1) { + ALOGE("sock accept failed (%s)", strerror(errno)); + return NULL; + } + const int size = (512); + setsockopt(sco_cb.ctrl_fd, SOL_SOCKET, SO_RCVBUF, (char*)&size, (int)sizeof(size)); + FD_SET(sco_cb.ctrl_fd, &active_set); + max_fd = (MAX(max_fd, sco_cb.ctrl_fd)) + 1; + } + + if(FD_ISSET(s_data, &read_set)) { + RTK_NO_INTR(sco_cb.data_fd = accept(s_data, (struct sockaddr *)&remote, &len)); + if (sco_cb.data_fd == -1) { + ALOGE("sock accept failed (%s)", strerror(errno)); + return NULL; + } + const int size = (30 * 960); + int ret = setsockopt(sco_cb.data_fd, SOL_SOCKET, SO_RCVBUF, (char*)&size, (int)sizeof(size)); + ret = setsockopt(sco_cb.data_fd, SOL_SOCKET, SO_SNDBUF, (char*)&size, (int)sizeof(size)); + } + + if(FD_ISSET(sco_cb.ctrl_fd, &read_set)) { + userial_sco_ctrl_skt_handle(); + } + } + close(s_ctrl); + close(s_data); + return NULL; +} + +#endif + +#ifdef RTK_HANDLE_CMD +static void userial_handle_cmd(unsigned char * recv_buffer, int total_length) +{ + uint16_t opcode = *(uint16_t*)recv_buffer; + uint16_t scan_int, scan_win; + static uint16_t voice_settings; + if(total_length == 0) + { + ALOGE("total_length = %d", total_length); + } + ALOGE("opcode = 0x%x",opcode); + switch (opcode) { + case HCI_BLE_WRITE_SCAN_PARAMS : + scan_int = *(uint16_t*)&recv_buffer[4]; + scan_win = *(uint16_t*)&recv_buffer[6]; + ALOGE("scan_int = %d, scan_win = %d",scan_int,scan_win); + if(scan_win > 0x10){ + *(uint16_t*)&recv_buffer[4] = (scan_int * 0x10) / scan_win; + *(uint16_t*)&recv_buffer[6] = 0x10; + } + break; + + + case HCI_WRITE_VOICE_SETTINGS : + voice_settings = *(uint16_t*)&recv_buffer[3]; + userial_vendor_usb_ioctl(SET_ISO_CFG, &voice_settings); +#ifdef CONFIG_SCO_OVER_HCI + sco_cb.voice_settings = voice_settings; +#endif + break; +#ifdef CONFIG_SCO_OVER_HCI + case HCI_SETUP_ESCO_CONNECTION : + sco_cb.voice_settings = *(uint16_t*)&recv_buffer[15]; + pthread_attr_t thread_attr; + pthread_attr_init(&thread_attr); + pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE); + sco_cb.thread_sco_running = true; + if(pthread_create(&sco_cb.thread_socket_sco_id, &thread_attr, userial_socket_sco_thread, NULL)!= 0 ) + { + ALOGE("pthread_create : %s", strerror(errno)); + } + break; +#endif + default: + break; + } +} +#endif + + +//This recv data from bt process. The data type only have ACL/SCO/COMMAND +// direction BT HOST ----> CONTROLLER +static void userial_recv_H4_rawdata()//(void *context) { serial_data_type_t type = 0; ssize_t bytes_read; uint16_t opcode; uint16_t transmitted_length = 0; - unsigned char *buffer = NULL; + //unsigned char *buffer = NULL; switch (packet_recv_state) { case RTKBT_PACKET_IDLE: @@ -874,9 +1290,10 @@ static void userial_recv_H4_rawdata(void *context) ALOGE("%s, state = %d, bytes_read 0", __func__, packet_recv_state); return; } - assert((type >= DATA_TYPE_COMMAND) && (type <= DATA_TYPE_SCO)); + if (type < DATA_TYPE_COMMAND || type > DATA_TYPE_SCO) { ALOGE("%s invalid data type: %d", __func__, type); + assert((type >= DATA_TYPE_COMMAND) && (type <= DATA_TYPE_SCO)); } else { packet_bytes_need -= bytes_read; @@ -888,12 +1305,7 @@ static void userial_recv_H4_rawdata(void *context) //fall through case RTKBT_PACKET_TYPE: - if(current_type == DATA_TYPE_ACL) { - packet_bytes_need = 4; - } - else { - packet_bytes_need = 3; - } + packet_bytes_need = hci_preamble_sizes[HCI_PACKET_TYPE_TO_INDEX(current_type)]; h4_read_length = 0; packet_recv_state = RTKBT_PACKET_HEADER; //fall through @@ -906,7 +1318,7 @@ static void userial_recv_H4_rawdata(void *context) return; } if(!bytes_read && packet_bytes_need) { - ALOGE("%s, state = %d, bytes_read 0", __func__, packet_recv_state); + ALOGE("%s, state = %d, bytes_read 0, type : %d", __func__, packet_recv_state, current_type); return; } packet_bytes_need -= bytes_read; @@ -915,9 +1327,11 @@ static void userial_recv_H4_rawdata(void *context) packet_recv_state = RTKBT_PACKET_CONTENT; if(current_type == DATA_TYPE_ACL) { - packet_bytes_need = *(uint16_t *)&h4_read_buffer[3]; + packet_bytes_need = *(uint16_t *)&h4_read_buffer[COMMON_DATA_LENGTH_INDEX]; + } else if(current_type == DATA_TYPE_EVENT) { + packet_bytes_need = h4_read_buffer[EVENT_DATA_LENGTH_INDEX]; } else { - packet_bytes_need = h4_read_buffer[3]; + packet_bytes_need = h4_read_buffer[COMMON_DATA_LENGTH_INDEX]; } //fall through @@ -942,10 +1356,13 @@ static void userial_recv_H4_rawdata(void *context) case RTKBT_PACKET_END: switch (current_type) { case DATA_TYPE_COMMAND: +#ifdef RTK_HANDLE_CMD + userial_handle_cmd(&h4_read_buffer[1], h4_read_length); +#endif if(rtkbt_transtype & RTKBT_TRANS_H4) { h4_int_transmit_data(h4_read_buffer, (h4_read_length + 1)); } - else { + else { opcode = *(uint16_t *)&h4_read_buffer[1]; if(opcode == HCI_VSC_H5_INIT) { h5_int_interface->h5_send_sync_cmd(opcode, NULL, h4_read_length); @@ -1002,7 +1419,7 @@ static uint16_t h5_int_transmit_data_cb(serial_data_type_t type, uint8_t *data, } uint16_t transmitted_length = 0; - while (length > 0) { + while (length > 0 && vnd_userial.btdriver_state) { ssize_t ret = write(vnd_userial.fd, data + transmitted_length, length); switch (ret) { case -1: @@ -1011,7 +1428,7 @@ static uint16_t h5_int_transmit_data_cb(serial_data_type_t type, uint8_t *data, case 0: // If we wrote nothing, don't loop more because we // can't go to infinity or beyond, ohterwise H5 can resend data - ALOGE("%s, ret %d", __func__, ret); + ALOGE("%s, ret %zd", __func__, ret); goto done; default: transmitted_length += ret; @@ -1025,53 +1442,148 @@ done:; } -static void h5_data_ready_cb(serial_data_type_t type, unsigned int total_length) +#ifdef RTK_HANDLE_EVENT +static void userial_handle_event(unsigned char * recv_buffer, int total_length) { - unsigned char buffer[1028] = {0}; - unsigned length = 0; - length = h5_int_interface->h5_int_read_data(&buffer[1], total_length); - buffer[0] = type; - length++; - uint16_t transmitted_length = 0; - while (length > 0) { - ssize_t ret; - RTK_NO_INTR(ret = write(vnd_userial.uart_fd[1], buffer + transmitted_length, length)); - switch (ret) { - case -1: - ALOGE("In %s, error writing to the uart serial port: %s", __func__, strerror(errno)); - goto done; - case 0: - // If we wrote nothing, don't loop more because we - // can't go to infinity or beyond - goto done; - default: - transmitted_length += ret; - length -= ret; - break; + uint8_t event; + uint8_t *p_data = recv_buffer; + event = p_data[0]; + if(total_length == 0) + { + ALOGD("total_length %d",total_length); + } +#ifdef CONFIG_SCO_OVER_HCI + if(event == HCI_ESCO_CONNECTION_COMP_EVT) { + if(p_data[2] != 0) { + sco_cb.thread_sco_running = false; + pthread_join(sco_cb.thread_recv_sco_id, NULL); + pthread_join(sco_cb.thread_send_sco_id, NULL); } + else { + sco_cb.sco_handle = *((uint16_t *)&p_data[3]); + if(!(sco_cb.voice_settings & 0x0003)) { + sco_cb.sco_packet_len = 240; + sco_cb.msbc_used = false; + } + else { + sco_cb.sco_packet_len = 60; + sco_cb.msbc_used = true; + } + sco_cb.current_pos = 0; + } + + ALOGE("userial_handle_event sco_handle: %d",sco_cb.sco_handle); } -done:; - return; + if(event == HCI_DISCONNECTION_COMP_EVT) { + if((*((uint16_t *)&p_data[3])) == sco_cb.sco_handle) { + sco_cb.sco_handle = 0; + sco_cb.msbc_used = false; + } + } +#endif } +#ifdef CONFIG_SCO_OVER_HCI +static void userial_enqueue_sco_data(unsigned char * recv_buffer, int total_length) +{ + uint16_t sco_handle; + uint8_t sco_length; + uint8_t *p_data = recv_buffer; + RTK_BUFFER* skb_sco_data; + int i; + sco_handle = *((uint16_t *)p_data); + uint16_t current_pos = sco_cb.current_pos; + uint16_t sco_packet_len = sco_cb.sco_packet_len; + if(total_length == 0) + { + ALOGD("total_length %d",total_length); + } + if(sco_handle == sco_cb.sco_handle) { + sco_length = p_data[SCO_PREAMBLE_SIZE - 1]; + p_data += SCO_PREAMBLE_SIZE; + if(current_pos) { + if((sco_packet_len - current_pos) <= sco_length) { + memcpy(&sco_cb.enc_data[current_pos], p_data, (sco_packet_len - current_pos)); + skb_sco_data = RtbAllocate(sco_packet_len, 0); + memcpy(skb_sco_data->Data, sco_cb.enc_data, sco_packet_len); + pthread_mutex_lock(&sco_cb.sco_mutex); + RtbQueueTail(sco_cb.recv_sco_data, skb_sco_data); + pthread_cond_signal(&sco_cb.sco_cond); + pthread_mutex_unlock(&sco_cb.sco_mutex); + + sco_cb.current_pos = 0; + p_data += (sco_packet_len - current_pos); + sco_length -= (sco_packet_len - current_pos); + } + else { + memcpy(&sco_cb.enc_data[current_pos], p_data, sco_length); + sco_cb.current_pos += sco_length; + return; + } + } + + if(!sco_cb.msbc_used) { + for(i = 0; i < (sco_length/sco_packet_len); i++) { + skb_sco_data = RtbAllocate(sco_packet_len, 0); + memcpy(skb_sco_data->Data, p_data + i*sco_packet_len, sco_packet_len); + RtbQueueTail(sco_cb.recv_sco_data, skb_sco_data); + } + if((sco_length/sco_packet_len)) { + pthread_mutex_lock(&sco_cb.sco_mutex); + pthread_cond_signal(&sco_cb.sco_cond); + pthread_mutex_unlock(&sco_cb.sco_mutex); + } + + i = (sco_length % sco_packet_len); + current_pos = sco_length - i; + if(i) { + memcpy(sco_cb.enc_data, p_data + current_pos, i); + sco_cb.current_pos = i; + } + return; + } + for(i = 0; i < sco_length; i++) { + if((p_data[i] == 0x01) && ((p_data[i+1] & 0x0f) == 0x08) && (p_data[i+2] == 0xAD)) { + if((sco_length - i) < sco_packet_len) { + memcpy(sco_cb.enc_data, &p_data[i], (sco_length - i)); + sco_cb.current_pos = sco_length - i; + return; + } + else { + memcpy(sco_cb.enc_data, &p_data[i], sco_packet_len); //complete msbc data + skb_sco_data = RtbAllocate(sco_packet_len, 0); + memcpy(skb_sco_data->Data, sco_cb.enc_data, sco_packet_len); + pthread_mutex_lock(&sco_cb.sco_mutex); + RtbQueueTail(sco_cb.recv_sco_data, skb_sco_data); + pthread_cond_signal(&sco_cb.sco_cond); + pthread_mutex_unlock(&sco_cb.sco_mutex); + + sco_cb.current_pos = 0; + i += (sco_packet_len - 1); + } + } + } + } +} +#endif -#ifdef RTK_SINGLE_CMD_EVENT -static int userial_handle_cmd_event(unsigned char * recv_buffer, int total_length) +static int userial_handle_recv_data(unsigned char * recv_buffer, int total_length) { serial_data_type_t type = 0; unsigned char * p_data = recv_buffer; int length = total_length; uint8_t event; - switch (cmd_packet_recv_state) { + + switch (received_packet_state) { case RTKBT_PACKET_IDLE: - cmd_packet_bytes_need = 1; + received_packet_bytes_need = 1; while(length) { type = p_data[0]; length--; p_data++; - assert((type > DATA_TYPE_COMMAND) && (type <= DATA_TYPE_EVENT)); if (type < DATA_TYPE_ACL || type > DATA_TYPE_EVENT) { ALOGE("%s invalid data type: %d", __func__, type); + assert((type > DATA_TYPE_COMMAND) && (type <= DATA_TYPE_EVENT)); if(!length) return total_length; @@ -1079,92 +1591,90 @@ static int userial_handle_cmd_event(unsigned char * recv_buffer, int total_lengt } break; } - cmd_current_type = type; - cmd_packet_recv_state = RTKBT_PACKET_TYPE; + recv_packet_current_type = type; + received_packet_state = RTKBT_PACKET_TYPE; //fall through case RTKBT_PACKET_TYPE: - if(cmd_current_type == DATA_TYPE_ACL) { - cmd_packet_bytes_need = 4; - } - else if(cmd_current_type == DATA_TYPE_EVENT) { - cmd_packet_bytes_need = 2; - } - else { - cmd_packet_bytes_need = 3; - } - cmd_resvered_length = 0; - cmd_packet_recv_state = RTKBT_PACKET_HEADER; + received_packet_bytes_need = hci_preamble_sizes[HCI_PACKET_TYPE_TO_INDEX(recv_packet_current_type)]; + received_resvered_length = 0; + received_packet_state = RTKBT_PACKET_HEADER; //fall through case RTKBT_PACKET_HEADER: - if(length >= cmd_packet_bytes_need) { - memcpy(&cmd_resvered_header[cmd_resvered_length], p_data, cmd_packet_bytes_need); - cmd_resvered_length += cmd_packet_bytes_need; - length -= cmd_packet_bytes_need; - p_data += cmd_packet_bytes_need; + if(length >= received_packet_bytes_need) { + memcpy(&received_resvered_header[received_resvered_length], p_data, received_packet_bytes_need); + received_resvered_length += received_packet_bytes_need; + length -= received_packet_bytes_need; + p_data += received_packet_bytes_need; } else { - memcpy(&cmd_resvered_header[cmd_resvered_length], p_data, length); - cmd_resvered_length += length; - cmd_packet_bytes_need -= length; + memcpy(&received_resvered_header[received_resvered_length], p_data, length); + received_resvered_length += length; + received_packet_bytes_need -= length; length = 0; return total_length; } - cmd_packet_recv_state = RTKBT_PACKET_CONTENT; + received_packet_state = RTKBT_PACKET_CONTENT; - if(cmd_current_type == DATA_TYPE_ACL) { - cmd_packet_bytes_need = *(uint16_t *)&cmd_resvered_header[2]; + if(recv_packet_current_type == DATA_TYPE_ACL) { + received_packet_bytes_need = *(uint16_t *)&received_resvered_header[2]; } - else if(cmd_current_type == DATA_TYPE_EVENT){ - cmd_packet_bytes_need = cmd_resvered_header[1]; + else if(recv_packet_current_type == DATA_TYPE_EVENT){ + received_packet_bytes_need = received_resvered_header[1]; } else { - cmd_packet_bytes_need = cmd_resvered_header[2]; + received_packet_bytes_need = received_resvered_header[2]; } //fall through case RTKBT_PACKET_CONTENT: - if(cmd_current_type == DATA_TYPE_EVENT) { - event = cmd_resvered_header[0]; - if(cmd_resvered_length == 2) { - if(event == HCI_COMMAND_COMPLETE_EVT) { - if(length > 1) { - *p_data = 1; - } - } - else if(event == HCI_COMMAND_STATUS_EVT) { - if(length > 2) { - *(p_data + 1) = 1; - } + if(recv_packet_current_type == DATA_TYPE_EVENT) { + event = received_resvered_header[0]; + if(event == HCI_COMMAND_COMPLETE_EVT) { + if(length >= 1) { + *p_data = 1; } } - else if(cmd_resvered_length == 3) { - if(event == HCI_COMMAND_STATUS_EVT) { - if(length > 1) { - *p_data = 1; - } + else if(event == HCI_COMMAND_STATUS_EVT) { + if(length >= 2) { + *(p_data + 1) = 1; } - } } - if(length >= cmd_packet_bytes_need) { - length -= cmd_packet_bytes_need; - p_data += cmd_packet_bytes_need; - cmd_resvered_length += cmd_packet_bytes_need; - cmd_packet_bytes_need = 0; + if(length >= received_packet_bytes_need) { + memcpy(&received_resvered_header[received_resvered_length], p_data, received_packet_bytes_need); + length -= received_packet_bytes_need; + p_data += received_packet_bytes_need; + received_resvered_length += received_packet_bytes_need; + received_packet_bytes_need = 0; } else { - cmd_resvered_length += length; - cmd_packet_bytes_need -= length; + memcpy(&received_resvered_header[received_resvered_length], p_data, length); + received_resvered_length += length; + received_packet_bytes_need -= length; length = 0; return total_length; } - cmd_packet_recv_state = RTKBT_PACKET_END; + received_packet_state = RTKBT_PACKET_END; //fall through case RTKBT_PACKET_END: +#ifdef CONFIG_SCO_OVER_HCI + switch (recv_packet_current_type) { + case DATA_TYPE_EVENT : + userial_handle_event(received_resvered_header, received_resvered_length); + break; + + case DATA_TYPE_SCO : + userial_enqueue_sco_data(received_resvered_header, received_resvered_length); + break; + + default : + break; + } +#endif break; default: @@ -1172,23 +1682,64 @@ static int userial_handle_cmd_event(unsigned char * recv_buffer, int total_lengt break; } - cmd_packet_recv_state = RTKBT_PACKET_IDLE; - cmd_packet_bytes_need = 0; - cmd_current_type = 0; - cmd_resvered_length = 0; + received_packet_state = RTKBT_PACKET_IDLE; + received_packet_bytes_need = 0; + recv_packet_current_type = 0; + received_resvered_length = 0; return (total_length - length); } #endif +static void h5_data_ready_cb(serial_data_type_t type, unsigned int total_length) +{ + unsigned char buffer[1028] = {0}; + unsigned int length = 0; + length = h5_int_interface->h5_int_read_data(&buffer[1], total_length); + buffer[0] = type; + length++; + uint16_t transmitted_length = 0; + unsigned int real_length = length; +#ifdef RTK_HANDLE_EVENT + unsigned int read_length = 0; + do { + read_length += userial_handle_recv_data(buffer + read_length, real_length - read_length); + }while(read_length < total_length); +#endif + + while (length > 0) { + ssize_t ret; + RTK_NO_INTR(ret = write(vnd_userial.uart_fd[1], buffer + transmitted_length, length)); + switch (ret) { + case -1: + ALOGE("In %s, error writing to the uart serial port: %s", __func__, strerror(errno)); + goto done; + case 0: + // If we wrote nothing, don't loop more because we + // can't go to infinity or beyond + goto done; + default: + transmitted_length += ret; + length -= ret; + break; + } + } +done:; + if(real_length) + userial_enqueue_coex_rawdata(buffer, real_length, true); + return; +} + +//This recv data from driver which is sent or recv by the controller. The data type have ACL/SCO/EVENT +// direction CONTROLLER -----> BT HOST static void userial_recv_uart_rawdata(unsigned char *buffer, unsigned int total_length) { unsigned int length = total_length; uint16_t transmitted_length = 0; -#ifdef RTK_SINGLE_CMD_EVENT - int read_length = 0; +#ifdef RTK_HANDLE_EVENT + unsigned int read_length = 0; do { - read_length += userial_handle_cmd_event(buffer + read_length, total_length - read_length); + read_length += userial_handle_recv_data(buffer + read_length, total_length - read_length); }while(read_length < total_length); #endif @@ -1215,7 +1766,17 @@ done:; return; } -static void* userial_recv_socket_thread(void *arg) +void userial_recv_rawdata_hook(unsigned char *buffer, unsigned int total_length) +{ + if(rtkbt_transtype & RTKBT_TRANS_H5) { + h5_int_interface->h5_recv_msg(buffer, total_length); + } + else { + userial_recv_uart_rawdata(buffer, total_length); + } +} + +static void* userial_recv_socket_thread()//(void *arg) { struct epoll_event events[64]; int j; @@ -1243,7 +1804,7 @@ static void* userial_recv_socket_thread(void *arg) return NULL; } -static void* userial_recv_uart_thread(void *arg) +static void* userial_recv_uart_thread()//(void *arg) { struct pollfd pfd; pfd.events = POLLIN|POLLHUP|POLLERR|POLLRDHUP; @@ -1271,7 +1832,9 @@ static void* userial_recv_uart_thread(void *arg) if (pfd.revents & (POLLERR|POLLHUP)) { ALOGE("%s poll error, fd : %d", __func__, vnd_userial.fd); - continue; + vnd_userial.btdriver_state = false; + close(vnd_userial.fd); + return NULL; } if (ret < 0) { @@ -1283,7 +1846,7 @@ static void* userial_recv_uart_thread(void *arg) return NULL; } -static void* userial_coex_thread(void *arg) +static void* userial_coex_thread()//(void *arg) { struct epoll_event events[64]; int j; @@ -1361,7 +1924,7 @@ int userial_socket_open() vnd_userial.cpoll_fd = epoll_create(64); assert (vnd_userial.cpoll_fd != -1); - vnd_userial.event_fd = eventfd(SIZE_MAX, EFD_NONBLOCK); + vnd_userial.event_fd = eventfd(10, EFD_NONBLOCK); assert(vnd_userial.event_fd != -1); if(vnd_userial.event_fd != -1) { rtk_coex_object.fd = vnd_userial.event_fd; @@ -1384,23 +1947,24 @@ int userial_socket_open() return ret; } -int userial_vendor_usb_ioctl(int operation) +int userial_vendor_usb_ioctl(int operation, void* param) { int retval; - retval = ioctl(vnd_userial.fd, operation, NULL); + retval = ioctl(vnd_userial.fd, operation, param); return retval; } int userial_vendor_usb_open(void) { - if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1) - { - ALOGE("%s: unable to open %s: %s", __func__, vnd_userial.port_name, strerror(errno)); - return -1; - } + if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1) + { + ALOGE("%s: unable to open %s: %s", __func__, vnd_userial.port_name, strerror(errno)); + return -1; + } - ALOGI("device fd = %d open", vnd_userial.fd); + vnd_userial.btdriver_state = true; + ALOGI("device fd = %d open", vnd_userial.fd); - return vnd_userial.fd; + return vnd_userial.fd; } diff --git a/rtkbt/code/rtkcmd/Android.mk b/rtkbt/code/rtkcmd/Android.mk new file mode 100755 index 0000000..d4a3905 --- /dev/null +++ b/rtkbt/code/rtkcmd/Android.mk @@ -0,0 +1,12 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES += \ + rtkcmd.c + + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := rtkcmd +LOCAL_PROPRIETARY_MODULE := true +include $(BUILD_EXECUTABLE) + diff --git a/rtkbt/code/rtkcmd/rtkcmd.c b/rtkbt/code/rtkcmd/rtkcmd.c new file mode 100755 index 0000000..552c5d7 --- /dev/null +++ b/rtkbt/code/rtkcmd/rtkcmd.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define UNIX_DOMAIN "@/data/misc/bluedroid/rtkbt_service.sock" + +typedef struct Rtk_Socket_Data +{ + unsigned char type; //hci,other,inner + unsigned char opcodeh; + unsigned char opcodel; + unsigned char parameter_len; + unsigned char parameter[0]; +}Rtk_Socket_Data; + +/*typedef struct +{ + unsigned short event; + unsigned short len; + unsigned short offset; + unsigned short layer_specific; + unsigned char data[]; +} HC_BT_HDR; +*/ +const char shortOptions[] = "f:r:h"; +const struct option longOptions[] = { + {"fullhcicmd", required_argument, NULL, 'f'}, + {"read", required_argument, NULL, 'r'}, + {"help", no_argument, NULL, 'h'}, + {0, 0, 0, 0} +}; + +static void usage(void) +{ + fprintf(stderr, "Usage: rtkcmd [options]\n\n" + "Options:\n" + "-f | --fullhcicmd [opcode,parameter_len,parameter] send hci cmd\n" + "-r | --read [address] read register address \n" + "-h | --help Print this message\n\n"); +} + +int Rtkbt_Sendcmd(int socketfd,char *p) +{ + char *token = NULL; + int i=0; + unsigned short OpCode = 0; + unsigned char ParamLen = 0; + unsigned char ParamLen_1 = 0; + int sendlen = 0; + int params_count=0; + int ret=0; + Rtk_Socket_Data *p_buf = NULL; + + token = strtok(p,","); + if (token != NULL) { + OpCode = strtol(token, NULL, 0); + //printf("OpCode = %x\n",OpCode); + params_count++; + } else { + //ret = FUNCTION_PARAMETER_ERROR; + printf("parameter error\n"); + return -1; + } + + token = strtok(NULL, ","); + if (token != NULL) { + ParamLen = strtol(token, NULL, 0); + //printf("ParamLen = %d\n",ParamLen); + params_count++; + } else { + printf("parameter error\n"); + return -1; + } + + p_buf=(Rtk_Socket_Data *)malloc(sizeof(Rtk_Socket_Data) + sizeof(char)*ParamLen); + p_buf->type = 0x01; + p_buf->opcodeh = OpCode>>8; + p_buf->opcodel = OpCode&0xff; + p_buf->parameter_len = ParamLen; + + ParamLen_1 = ParamLen; + while (ParamLen_1--) { + token = strtok(NULL, ","); + if (token != NULL) { + p_buf->parameter[i++] = strtol(token, NULL, 0); + params_count++; + } else { + printf("parameter error\n"); + return -1; + } + } + + if (params_count != ParamLen + 2) { + printf("parameter error\n"); + return -1; + } + + sendlen=sizeof(Rtk_Socket_Data)+sizeof(char)*p_buf->parameter_len; + ret=write(socketfd,p_buf,sendlen); + if(ret!=sendlen) + return -1; + + free(p_buf); + return 0; +} + +int Rtkbt_Getevent(int sock_fd) +{ + unsigned short event=0; + unsigned short event_len=0; + unsigned short offset=0; + unsigned short layer_specific=0; + unsigned char *recvbuf = NULL; + int ret=0; + int i; + + ret = read(sock_fd,&event,2); + if(ret<=0) + return -1; + //printf("event = %x\n",event); + + ret = read(sock_fd,&event_len,2); + if(ret<=0) + return -1; + //printf("event_len = %x\n",event_len); + + ret = read(sock_fd,&offset,2); + if(ret<=0) + return -1; + //printf("offset = %x\n",offset); + + ret = read(sock_fd,&layer_specific,2); + if(ret<=0) + return -1; + //printf("layer_specific = %x\n",layer_specific); + + recvbuf=(unsigned char *)malloc(sizeof(char)*event_len); + ret = read(sock_fd,recvbuf,event_len); + if(ret < event_len) + return -1; + + printf("Event: "); + for(i=0;i=0) + { + if(Rtkbt_Getevent(socketfd)<0) + printf("Getevent fail\n"); + } + break; + } + case 'r': + { + printf("read register %s\n",optarg); + //Rtkbt_Readreg(socketfd,optarg); + break; + } + case 'h': + { + usage(); + break; + } + } + } + + close(socketfd); + +} \ No newline at end of file diff --git a/rtkbt/rtkbt.mk b/rtkbt/rtkbt.mk old mode 100644 new mode 100755 index 41d258c..88c7fe1 --- a/rtkbt/rtkbt.mk +++ b/rtkbt/rtkbt.mk @@ -1,84 +1,31 @@ -# RELEASE NAME: 20171107_BT_ANDROID_8.x +# RELEASE NAME: 20180525_BT_ANDROID_8.1 +# RTKBT_API_VERSION=2.1.1.0 + +CUR_PATH := hardware/realtek/rtkbt BOARD_HAVE_BLUETOOTH := true BOARD_HAVE_BLUETOOTH_RTK := true BOARD_HAVE_BLUETOOTH_RTK_COEX := true +ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), box) +BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(CUR_PATH)/bluetooth +endif -BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(LOCAL_PATH)/bluetooth - - -#PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/vendor/etc/bluetooth/rtkbt.conf:vendor/etc/bluetooth/rtkbt.conf \ - $(LOCAL_PATH)/vendor/firmware/rtl8703as_config:vendor/firmware/rtl8703as_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8703as_fw:vendor/firmware/rtl8703as_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8703bs_config:vendor/firmware/rtl8703bs_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8703bs_fw:vendor/firmware/rtl8703bs_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8703cs_config:vendor/firmware/rtl8703cs_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8703cs_fw:vendor/firmware/rtl8703cs_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723a_config:vendor/firmware/rtl8723a_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723a_config_addr:vendor/firmware/rtl8723a_config_addr \ - $(LOCAL_PATH)/vendor/firmware/rtl8723a_fw:vendor/firmware/rtl8723a_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723as_config:vendor/firmware/rtl8723as_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723as_fw:vendor/firmware/rtl8723as_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723b_config:vendor/firmware/rtl8723b_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723b_config_2Ant_S0:vendor/firmware/rtl8723b_config_2Ant_S0 \ - $(LOCAL_PATH)/vendor/firmware/rtl8723b_fw:vendor/firmware/rtl8723b_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723bs_config:vendor/firmware/rtl8723bs_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723bs_fw:vendor/firmware/rtl8723bs_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723bs_VQ0_config:vendor/firmware/rtl8723bs_VQ0_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723bs_VQ0_fw:vendor/firmware/rtl8723bs_VQ0_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723bu_config:vendor/firmware/rtl8723bu_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723c_fw:vendor/firmware/rtl8723c_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723cs_cg_config:vendor/firmware/rtl8723cs_cg_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723cs_cg_fw:vendor/firmware/rtl8723cs_cg_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723cs_vf_config:vendor/firmware/rtl8723cs_vf_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723cs_vf_fw:vendor/firmware/rtl8723cs_vf_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723cs_xx_config:vendor/firmware/rtl8723cs_xx_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723cs_xx_fw:vendor/firmware/rtl8723cs_xx_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723d_config:vendor/firmware/rtl8723d_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723d_fw:vendor/firmware/rtl8723d_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8723ds_config:vendor/firmware/rtl8723ds_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8723ds_fw:vendor/firmware/rtl8723ds_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8761a_config:vendor/firmware/rtl8761a_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8761at8192ee_fw:vendor/firmware/rtl8761at8192ee_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8761at_config:vendor/firmware/rtl8761at_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8761at_fw:vendor/firmware/rtl8761at_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8761au8192ee_fw:vendor/firmware/rtl8761au8192ee_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8761au8812ae_fw:vendor/firmware/rtl8761au8812ae_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8761au_fw:vendor/firmware/rtl8761au_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8761aw8192eu_config:vendor/firmware/rtl8761aw8192eu_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8761aw8192eu_fw:vendor/firmware/rtl8761aw8192eu_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8821a_config:vendor/firmware/rtl8821a_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8821a_fw:vendor/firmware/rtl8821a_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8821as_config:vendor/firmware/rtl8821as_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8821as_fw:vendor/firmware/rtl8821as_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8821c_config:vendor/firmware/rtl8821c_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8821c_fw:vendor/firmware/rtl8821c_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8821cs_config:vendor/firmware/rtl8821cs_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8821cs_fw:vendor/firmware/rtl8821cs_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8822b_config:vendor/firmware/rtl8822b_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8822b_fw:vendor/firmware/rtl8822b_fw \ - $(LOCAL_PATH)/vendor/firmware/rtl8822bs_config:vendor/firmware/rtl8822bs_config \ - $(LOCAL_PATH)/vendor/firmware/rtl8822bs_fw:vendor/firmware/rtl8822bs_fw \ - -CUR_PATH := hardware/realtek/rtkbt PRODUCT_COPY_FILES += \ $(CUR_PATH)/vendor/etc/bluetooth/rtkbt.conf:vendor/etc/bluetooth/rtkbt.conf +ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), tablet) BT_FIRMWARE_FILES := $(shell ls $(CUR_PATH)/vendor/firmware) PRODUCT_COPY_FILES += \ $(foreach file, $(BT_FIRMWARE_FILES), $(CUR_PATH)/vendor/firmware/$(file):$(TARGET_COPY_OUT_VENDOR)/etc/firmware/$(file)) +else +BT_FIRMWARE_FILES := $(shell ls $(CUR_PATH)/vendor/firmware_box) +PRODUCT_COPY_FILES += \ + $(foreach file, $(BT_FIRMWARE_FILES), $(CUR_PATH)/vendor/firmware_box/$(file):$(TARGET_COPY_OUT_VENDOR)/etc/firmware/$(file)) +endif PRODUCT_PACKAGES += \ - Bluetooth \ - libbt-vendor \ - android.hardware.bluetooth@1.0-impl \ - android.hidl.memory@1.0-impl \ - android.hardware.bluetooth@1.0-service \ - android.hardware.bluetooth@1.0-service.rc \ - audio.a2dp.default - + libbt-vendor-realtek PRODUCT_PROPERTY_OVERRIDES += \ persist.bluetooth.btsnoopenable=false \ diff --git a/rtkbt/vendor/firmware_box/fw_info.txt b/rtkbt/vendor/firmware_box/fw_info.txt new file mode 100755 index 0000000..6305bae --- /dev/null +++ b/rtkbt/vendor/firmware_box/fw_info.txt @@ -0,0 +1,18 @@ + FW CUT SVN Coex +rtl8761au8192ee_fw D 13328 3736 +rtl8761a_fw D 13328 3736 +rtl8761au_fw D 19884 0006 +rtl8761aw8192eu_fw D 19884 0006 +rtl8723ds_fw C 19875 2020 +rtl8822b_fw C 19903 5656 +rtl8821cs_fw B 19894 1d1d +rtl8761at_fw D 19884 0006 +rtl8761au8812ae_fw D 19648 0006 +rtl8821as_fw B 19292 635d +rtl8821a_fw B 19292 635d +rtl8723bs_fw B 19587 6b4e +rtl8723b_fw B 19587 6b4e +rtl8821c_fw B 19894 1d1d +rtl8822bs_fw C 19903 5656 +rtl8723d_fw C 19875 2020 +rtl8723bs_VQ0_fw B 14422 5844 diff --git a/rtkbt/vendor/firmware_box/rtl8723b_config b/rtkbt/vendor/firmware_box/rtl8723b_config new file mode 100755 index 0000000000000000000000000000000000000000..23fae05fdc0e5a5f0c399f0fed1a5dbf73f4a043 GIT binary patch literal 44 zcmWGtt=z80@P&bck%57MHGqL3nvsQ@o13eOkx59hoRQIH8zYMV!v=;s42&EAu%icS literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8723b_fw b/rtkbt/vendor/firmware_box/rtl8723b_fw new file mode 100755 index 0000000000000000000000000000000000000000..5a1755d7c249df1e300cd251de030b1591dd7c95 GIT binary patch literal 46740 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 YCc~^g!K-Q8f9Ic9B4IYj{_*4g2iZNpXaE2J literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8723bs_VQ0_config b/rtkbt/vendor/firmware_box/rtl8723bs_VQ0_config new file mode 100755 index 0000000000000000000000000000000000000000..6f3b6a86586f77ecc88483f8ce1bb341f39fecfc GIT binary patch literal 117 zcmWGtt=yi^@P&bck%57MHGqMEhe3d;VG>Kg(N~fWrT?yvXI#Rq&cK-bkAac#F(V_# zeMUydM~sXCw;33nq8VAZxw*Nj7@345%NZGMwlT5@Fl=DB!@$VFAi&G;pEZ_&nSt>? Q2sj9EYj7ACFn~G#0p1%T1poj5 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8723bs_VQ0_fw b/rtkbt/vendor/firmware_box/rtl8723bs_VQ0_fw new file mode 100755 index 0000000000000000000000000000000000000000..d29f16403376f54fb8714e879174c0920627e945 GIT binary patch literal 46236 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 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8723bs_config b/rtkbt/vendor/firmware_box/rtl8723bs_config new file mode 100755 index 0000000000000000000000000000000000000000..c0f57e7a7e83a8a09c62aedfe76a6147862750f2 GIT binary patch literal 105 zcmWGtt=yi>@P&bck%57MHGqMEhe3d;VG>Kg(N~fWrT?yvXI#Rq&cK-bkAac#F(V^G zG$RW)H#b)mBa@J1IU}RZHbxc!h7AmN7#KMi1b7+#v&J$oGcf)K0S5tY4GseX1~BJ8 E0A8sceE2 zooPE_k6aXscD@*}wTK;?pwpRedQJrGSfw)<&~~hI4k}s<0fX00&$Rh|Ylo<3&Ybgo z&+~u&_^f?dS$kdH^}g?VZ)>^CW))trm6b1eUl=PR43UwWE0(UAMhFp~!sWmG{jE%0 zs_J~jYi@YO7jexg+*Bx@`mxV^ir8`eiY7*Q$!Big8hXhmw!h?isWsx1FCm8P0(1Kd zz8AgRxfh48FX0)#OV=Oc`eR@8`ZAth_C>F+;Q19_^!gJ#XWtoPf925PAQ_r}f($J@ zVZ5cclc6OiiiVPLUwUHR4K41=PMC+1a9@7HA6~gj6J{Kaej$kGFC9LIS2R32nLB64 z6L*fj)2o2182+i-YFy=Q2S-|DlXgwqTuVE1t)F=m;ymFh(!_{C!p|!uz~` zWyMalUi|!jvtl0Jx8a_J`-_dN`1?_M@fO}mx?cQlKP#@r{VzUN{2T6Ow0Q<~rE2t| z?K~@fiLzrZvEnxdy?C?14hOlI6a z`HU4G#XTLrXW+iEofTV9?z=y*qJ{pBc9-IQ_&6(mjC>pVdkFW}aeou{p<}Fg4EN9Q zT`I~kxG%^3-8NR7g!}8i#&>{`0r1X1nvSIK_S_lgFgFN6xzE^VK2_LA4oyWqvCBbu z(Y!f$|0kq)Z$c~A&F}*k9Ej5vux$U6E<*W9&+=*<n$eR9?=bMxJ8XN}h2T`&>afN3@T`uJ>`f zEz={y!AtFpBE{&zs=?H$@kji>`t6nW_vl-~R2|+9UuoRef_|uSnc}LTe$^!_?Frhn zcK~Oakj{^#ePHagH3qFIP3Ap%iAK!lX*t@@1oT{EN2iUG$UyXvNu8`|5L@FL44*;|6Yo>MiT zT%+Vzp(Ml&z1}WoN7%Wc+3k#=7=9u`xz{}O6HjD=+?wFPQ`=hUU9%y6_&pxEueO1S=vc!@&{Z*0p7vkq>k^rY%eI__&v#$BiH>rN)#(&1iyQgMp_O5BkBBysrh z?#GjVNI-I(G!MNdwaK9N*V-0%xgkz^r(beybG_nFsr0UN;Hhnvm%*KD6NjE}Q|F08 zR!;`{n}j@T+e2O%?q&F`vW?iMw?5G;HWm0vE{Q{1+5r_h4}c1>PeUHp7!i6F1K)0Q zh2-|;Lb6=RiHl=z+0s|FcfY!VuQH|j#^D$Lkk~$6dh-u$YNt8>b8X4eH(T0A{$ER~ zrINoGZdbPII53dXK=>wT8~9AX^9)EVQYz9Uq&%dE-7;tiSq4JEA6_Q6-P6hK#_1mq zboG+kqBJ^Sk|TLwS1393)@5U#5L9Dzw9ZjyW;tFCDt*bpMVFMmvUAb4wkY)Cb6fS| zTYmvx@&2@UMS~2GOET$vt&NP`GN76Q`fC(|6rKtbv73*@sD#*PA6GxB7b)g;1pU|J zQGc9Ne@}R$#~&{7$SUKkl=3w>T+4sl8eJ>|WkWKoFXj$P2Vbtxi~mukE!CV>cM?Y? zD1Bp_ttpGwW|lXJ8&uX8oAzL~LEp$9eaIMI7!H zwKn3=)@!QO+voD+nzHO>onDN}6$Vf@Q#sL^cF62zDl@GkQPYc_ahdhav}J{IRL&Z{ zycr|6uk2@sNB*{_C*0^Eh6BGRHictt5YTaoL##jy-#;u2$n0i+Y*m{A_^kympzTpu zNNt{0cH)cmRaZ&5qL5rqw$SfB;+ch*^*+VQTULBst&~Uz4W_CA5RBP7BQ!i;6eky!h4G0Ght;xLCx z+s0)1n(LZB49WA1;h%Vz#kjUTg1K1bPF4M>?8LgDsZnX;7i5&NKE{wm3*cGB^izasVoU-7Mx!q$*@3OooiAq2@y z0zRbj%F%)X{ER!N1oY*QX;`eAMx-zyNB&xtP#S+auJaM^T7I*%mQ)2J&X(X9(?g(M z@y?uld1Wd$qt)HS2vq|~*^2JMR%Q3MPMMH(Gu^f6j=n+_Fd7o4X}XBLn9Xf9pI^l0 zdClmFxnWNJocxxcB_z*c1xrYlMeL8VnZRh-`n+I|-!oS$D6+;Wp~DTJmQ z2^EUd>f!#F-6dCzez{#!%dm{y+@4S$UmXYhRhPZ_h+foSy)Oa}+10BMSL4}@)Pxj? zB$1W$9c3twNTVz49!=&*uUmpnOB6aej8pG*wzdewlD zLNEbFv{w{Ds(_4DU?tYp6Fa4LV!MAmru~>TCyCrHODRo0t?!)IgfW)4^ffgl2FkqV zO?nqu<_?eIK=bP#>fhDrBqW)-5x^1+Ho965M|Zs&HMIFq`Jh9i>{f%rgt9Uc3l82iIsRk!wH zLcr`%V0I?lWL<4{MoAD*2jXjzYI95pb;RBdX)4W0?A!T_3I%4YVq#KYBmc(SYzx=& zE-!|E_8DK4zF0i4k#~nTefGxOF;c!eybk%}k?#(RpC#3h>uZjZ>(3sY!p7BT>JoP- z0=jx_jk3Fw-^|m#ZO>H&7*|s5SW`QHk&i(kDUehnhQI&d5Wk5hhIvoOT-$l0!IrI% z_z1ba{4>nZ^{0*+4P+9rF|L&Q7!JOQ$}@^VScQcub1?ZHy^vFlf>4yRPUT- zu7z3ucu;_LweVCapVzP8Q!|O7GX=F7{@DOLG*so%=gsNF_AdWi)4~?v>H}9TSB)na z*4z_Z}*SSl{Kdw9>b=!&Y3qiG|KAt0Ea8)&Y#AZ2=eIqALCo|!HbJLiQS}Jo&zdB_EUE5M+p~-8X53~mY~zLod;(!>tS9PV@=vHnoHe~&LwY1wnC@&B;{nHFT5u%m-a}uN^PZ*#Zw-+ z$%GkJqV|u_>Zv})#Vi61UDZAPxs^CZV0AYE%G%bdNB`)rMSElIsu-` z@tlEsY;KbdnRi*|Xe8M!L6R^MAiE{7n{H^7>pG_=PqQ zgTfQ{K|y~P3i0;I>n%jxNpgu4_zc=K>)owmOp({yr zHkPI9$r!99%0N$eiCc!XY?7;P;mu3z_zrfaiRU(Z%20k^agZrwjOO|U!AbvVk?xuFHnu%W|%c16SPJR&gm zdvinSYd`4eo3fr==?b7XiXkC+AvIp#C;FgdiU+!=deW_CAKem6K%pkQPxR*&eSsBV%zlW_53Nmyr6T&t5>GlLNl)N zUwy5s_=ai`4q-6J%b!l}-}trvPbzCUpV=?x9=IeFXjoce`ETei<@^Jeo-26uivLeK z*O$S^eaVA=xs-^fVm$r%(x)H(ZjhOBxi5LJ?N2(EmN-#C^D#24W*7g+{n76(`puue zKK5Rst(<3E!r<(wx}EJIEvFN91s^#AC|vQk{QK?HB_mm7ZP{@C^x=GQNzW1;t3bX+ zD*wQ6{-GuQjxpJ^hFmG9tws5)g7de$wq(%~meoF+WKEIY$K8%!qG1c3^|#2m$W5|D z#*Vvbz_+4%+>z=l#~}H3gvMq?YcfcX_OvM1C^&b^YbA?HRBYUuBx`~6zNf_9p=E7r zXieghk7-S)+us2mBvb|CYRiJ-?r5w@^@-I9+bO5kl&u6FQJ&ngP%jpN|28509z2=y zZi}T{rKyTaL(polS|g0Qs-tPTMoLFgN9ua;s=~XNn}hpqEr<_`2-D(rKq3pgJP# zJo(+Gfd9i8H3^EzXM27fab~$De8Dx(tT8u_4?KixF4o-a0%KsLg3@z#L6*x@XEbDG zPu`(gl^w{f&9WPZ^c*P<^O;>oA#I97c^+}-Q%~f1Gsixy;ojq``P{Qc!=g!fU*y&2 z?)+FP<3*WW9yeCkse=i&92+x%shBV&%av%$WEb&^dVgsXcuMD6ZAE+vt5IdGT4Gaj zPhTng)ENHwQ#E^HPVW*s|M{iDcDxT;KRWpKV9>gdf1(#(hO$e$RF_%H zu7;(rau+|bo7mNPraExV;+3Htt;xZ+E>5U6?Tp+RD_}i$R$Xlw{O8$#4rnrSb=Fx8 zrxJEwW%4ffvCx0iPczo6^_l$|PMyij{T{NOYNgz&C}&t%`Gi_>ojk)>W#tp=(zC|b z8f&CF7sEQ(UlrVN(G*JK9_eQ$U+#-I*pLt!-~C9CzR_o6cOurJ1s+vSwAad&j8$G9 zapnyWm+{Q_vy!!??3?P{B3!%eb<^dDidv^$)LV9#qo%13&+ExYDBUe3Q(yrQ@${|S^^xS*$bV$Fq) zq#RS-gdL}Of;A{*Qf^mnt@Gl;(Ydj+eU`rL+63>r{Q8UH(Ac(e`|^%NNXF1ic4&7} z%_P1CT0w>~kiUZ*f3SX9^#c+QNSEv(R8F944_)t<{vt|?BxBuZV$;H|{Q6vVRu<$M zwX~wES~q`1GMu9~@lm=?9hSGgyTaa;-yZa8!bIR2rg?k9E1Ro=%X1#^KG14z7F(8t zCg)9U6!GdCyKYaCkI3@cUTV^-R>tbCGhP;eihYk(pk3?vND zHB}f;)I?h+M<=tBsMLKln;qdD?W30Y^qgp~W&9|toH9sE(4g8L&}Mo;3~j?mQ%F>(56b zS^>G$fpWmW&BY^+?kY+UKs(_=ct z7AiZndkrB&w|igmnWzM{z?~9shq?XfUC>zJJNw!Gv~G9!z5OH4Q29kK$!$e`|MhwP zo^YmHUpE>&^1$yu;_3R78aU)l4lU{(0a>TfO$^^Ws;^6~8C@H1N~vRB&{{{-K(Y~{ z(vf{>L%))$DB@T{}OY`V@2l_w`@xXS>yT$vc=A6_`us=uveO z^eU4w^VJ}e3(CFS}u3&o5;5GaP?`mX~pC*GP7o&wagWS5^Pqe*U7| zy7eRe!n_OYj>VULcU4-)uQH21zM6bB`{HJ=<*L4x_F5*qknf%zaR|Yd=_LbnouJra z8PL@}e?i}^Wc54PniZGzXXahdJpETl-3uNb-32JrR`jkda9(`wOLhk>zeLdQpx-VO zECcChXwK+BN^NrPNaQFr+J6SH)9kPeI0q~PBiSIpf-neeDA+d(t5f8qTP!Bta#CPO&78a5*=MeJ zCHgw=RuWc#u@y0^S!!KE)>=NYxV&IQ>+`+PE6=CmZa$yV>g+XtW!RAnYvuQ!mDf3W1G#2YHwKkWvY3%Xvl))yV zB{o^?SxsfBX#N8!L@*9N-%`T9KKwjQkMihEd{B$8EqE(L&uLB1dtgzyO@C3ErqS`O zr@9kX`r$7xC0FyX(Bf?bN@t{0^WQ^uAcn+$c~%$?p1oYEW#R$!!7(0Ok!m1}KrwGA z-vW;&F(^`$XOy4@iigAj8;s$ZJV=Fhra0Q?1?Z%V}1 zR>BXn1#3<^=42Gov4`~{wSCh0qjsfE>~ncf&ay3?w>b#1f&lJx?kMt5#6wkNvqi=e!`bYZ0vc#E?H%+HLWHw zXJl=8{(R`dT!SK4s>${myKYx%7p&Io{9S3a^S_$ED>cB_7kmj0j+W+sId_-bBzlqv$V)|)O%L(|U zMZ;s$#1=VgH2m+vn6;7EVsxc)W$~%78%{4!@)@uJ6T_qn3T4FM3d(cLM;Utxd(Vp$ z=S}V}x#SKv95BPmpft^v^bL1-)hT#|B_CDPX5BP1YXAJUEUr{{TH6^Z&qBRV7Pj;; zl?qO_Qe~B)U%&$2Q>Tn9rG$L+Ecwt=`#}Q^>M7H$dg??nd@71AnULW7)@d8ky5wO} zp&XX-i2bP(RNG`;O-7EoEPdq9!`>CF|1_?H`p^ksNo*XCeniTNVO9b8bF{~ZcW|1Uf8f;~ z0(_rDI@aHscfq*zCf??tKZ_1wLw_P!6fUP35p?$3`=c zg*P)aCrbexa#j}QMUQ4qhL4GBtm@a~PV&_?T0#o=xTvr50YK~1T1JR7rF*w}T0AE` z#_(cKRt{PLf3+g$>zUU9euo-Fb`|JOG z>-#P5pL}0MzwKgRsSEESw!ep^0J^5}0KJF@=mXtTnwKF_7*qQOwe^kxoQy~mPE!DZ zNjXGl!i+y&3p-}zcI`-W2KUws*H|}jwMDnV~S+cg`n?dnF#0k4aDA@{0qras;B~vZklQKnvVlueAz~nGkyQgJ=0$Ii) zo|0kC?^%kX{%YC>ioY~gBo&FuoXPMhneE&j_>_bMlNx$8?0cpvv_Ks3R31j1j1bR8 zfYn+PWMj`*JgGpxvK$q3{FpQwt22bS5gNZj>!z_IG*X39AbKW5H3ed$Wn(yRrrzcC z5l3E77<|n1PhR45pHl%})ZN68G+l94RrBy+_qm6?%35`uyTR;M?3|yEvOz@C6y)_U z=~v_y`rNyj68BdHK6j%UR?<s$ZL#>UcR= zDCuWwcgr%9>_22Du1DO52+kwVr2JKVx2!@cYxYx{JGDwtdk-Dw z`8V|MNHi|#(99@I==g~}=O6TA?%(y*^bg8B_;+PS{ev>G@r=IP$9v;R8Xk`_ zH(_`@n!7bBRt*A*3@9ds@Bdx@6`iTWQ75q3!hfsx)_E95#3_W5!Hu_jgiuQ;A&(4g z_f&!A<(Xt?xks5J8fN8#;vJwW#8WU13NaeHAuppiLir_yjRDwarj!brzDI$v6)E{} za%+lDYn=?~(EJyFc=aA3xWJ*!Nn{hfv3HGW`K=@eq6N;ulbF#=tpMOo-{wR|MRD|H z;45vD5Ct(V*~ff5?6an8Bc-b>?_F=c0L!BZGNcqsHr-_O8C%V}tAggQ9$*z+8~J68 zEcn^v+;pGVC_{WodZxx%%D427$W3cK7&JN$20!7sJ#P?HtvvxP&pQ8?F1F7tfy`>GCQGOi~FMR{wjZ1x2i?6`91=#ljTGTGU zn=2e5E?vMFUf~{Ts^1@txnW!^W*vEcDXIpt`u7hfpqGyRAD>95vHFP1-2N;gR9>5}Wwcv-} zZBoI4D9c&|&8Hat!&Xm;S8PtQC#{xo6fR6facj@9xVnTuVpsebD#0e5)zz!&pi7j; z@7UJY9~ubx?`$f3v+(!Rw+&n=WGX@-O}$uHSGa8;RH&`rHjuQlw@_U_WgxM3+dvq( z-7{V;_#7H^LXCU68!=tx{DXZZeGkGWqpHcQghd=UEMupFV`uq{jm8H{u4X}l+Te-H zq^q>^D%GGiv|YF}N)QbNus>%X$)H+?)BoX?23teNfblwU{c(U<^D*!29d~40tNT;2 z$sF$RxC+EV|BN>aJ7>73ZyRix&J}P42L~Cub1)5S+uh`yGDyy)c@OdabMRJAl?hRA zJoUxX*ci&Asc(}+NQB1AP&--?=wm+8qeu@Sy@wd1Jn(cIe!t)59gF9^UN*XP)amrj zoq+exJfkwJn=6~&#_DDcgJu?ECC3Q4wtvQ`IZx6vIxBF+u{DI5ZrgPdU$oI*-|#-) z{6;GscjZa=+ZVUM+r)LGTVHIJ=Wc>dt2Hsg>t3<#buU4L#p_tzW$bH+TKyT|jEL@& zG;Vx_6hZ!~Z}#q2TV*-s-Ab0*9ks+J2hANXp_U}mi$3mvO41J;`-%gK{6in5UX10<+HKr*);(#zPW(2$G<>OLbb)nd5bX3mm;U(xtqk zt*E}N?e>7et1s)iC&0e>tuqdN-QkJHb*Co**X16WkO&pQ@$(ifb~kRs^P6o^tB^UYz|3bN z*^xeIgRQqY(I=iF4n!Vza3@FCkE%|G{+1}k_0gDQikD_2ikmb}nZVZ*!_kNF9+Oig z{jIZz7x&C^L|j$<#tn(qH+-)*AdYlMmivoV?mSJ_hM%`?>$jf!D?4q&E7np(wC$f8 zERhL~p`LJ(RRQesA3*FE+vM5oQLb6VDH5BeAHL$=_S-9Dkl2#QXG|Pg#OeMwW^n`(obH*RHJ`O( z-F_g;d|hLKAJFk~i1#Ijp6`{h>slE$Gpp1y7Lj(PO-Gw3UHfM^2e~HaU|CZfI}W2+ z*L3`D{#xYoP2@IL;2cyqH0)%hGP-%uBy$2)f;$+`PhQ=bEID&y@B*5(pyNsMB0id|Hn}Ng|Sa;Zf`2c zfsIDSP6p?qvTei>DTZenB_Y{Duk_v^ZCPH@7R6+0R~pBT-jIR*Zz}9Sj3YQ{xr_y; zEO!s7B-`X6o&l~agf#EB&fe=|U3-U8E0hw}syff7Njf=jOIgOY7N;SUlF%5Lh_7G5SrAe|HRrBk;Jws)Pzs}`kc1!=HOm07Oa}>B# zX0GicM(__UI_e)^PrPyAH82Kg68KDwC~GQ62@Kgn7U5rUteFnPVB|jlOB6x5uTo$SoESnCrGk zI=%BEw_DL&46l?5d`BT{fsUWSMsDdVv#bl;>)e~&=6q++hU>RZXK*deJ_i-m)PeYcOZSw%RZ5)>#|$V~h+ib0hL9OHPv8*y=MQ(F%~ z2y{ek0aF?T}6QxnbA^r^Sz#ckoXno6K5epp3F&h%BV-OL`Y|vWq zhEne36h=}h*lCjL0H$Xbcfu9|<8wy61(;n$#adeJ_+xIgzN%fcjr7&->mg=4 zFW^@VZ5Qub@xC@^Hgt=XQbfDKRPGkR4TRFl<&n3 zEYBJqHla4!rrNa5{TlA$!2yNfe18t4lvkzSUudIsDDnGv>D&4Kb+NVp$FU}(ceY3F zEJhq0rV?9%R5K$8LI14`r_nHD>U_VPrESgkW85>hn3do` z)be896}7v}-F4|s9C*6A|5_zmdmH;90tF#(fYGRI-OANCz?J#xgndmA*8()U_hf77CsM#DG`_W!tpbGXB$ z9fuD0?4yw)p?+D#KtFdp;;??+@*DU23Y5_}5B76^pu5NBd@2Nc!k-*dncnk>2dL!< zb)IVUx)C)GzooDjd_s@90S#eW@Nbr?;P*)8_C3CLy|bKTx3QtdD~C-fwZhz>?^1QL z0WHQ~kMXlL>eH|<-If8C+JG#78MwBtdljy6-E#^Nh0~oRSVE@!gzh={6jGaSr!S!r z2BZyX1&IiZB|f+<_}AOx&?2HaEZc$xcrLaD#a4Z76|VH@-rf8a^Q=DyO5aL-;3rP= zR~B&Lah_yH52Ex-A@6kZ_+s$o=05^9OJ`E}3c)}@OaDNSD~Q}0Te4PaN9~Bm`mK0U zVO66QOTU_x!*8>tKn;#<32p12;eGjJ1pXK`JR8zj1^r!j#ui-I$PRFD{kp zFe3l2(2r$=+G!(^?;|fDKN9&50)SgIfS?9;;#gCEbUbz`avAu9He?TIj zXKf-*U`e@&2Zp)gubvv5G8jKdf06Ga&aB}Qr+MUnO6B_?gVfM{E82QX|6D#kNO!AH zxg%ynq!?!zvzbv^#`iV_X(n$rGM@n%0A+eHKLVO6i1*@!;0d?_8(?{bM=dACi=7^LVsrFfh4d7c!+K};7*D|Jg?xqN z4Wav66m@h2G(u6)t*B8ULd$KvXCZ{GN16w67~qy-H(~cHH?%4+Iw`7QLn1fZT!c4& z^DN+V6pAtlFUPKg)vrA9|Ea7AWn&Sq#P-}x?4?AKVBGlwpMPlkuzd3_Rt57h|IkuI zPX6nA#8v=aDjNJVo^?Gq{8Z=?4F_hxD=Ep3G9eH0W7(}V*RdNT?#hp^J~yeA;U*1# zVRB6ve#&!YBVHvNyD>6`BUJmqB3bW z?%R6_YL8L!$&XoCF-9{(U30Ka|7k*(aMe3!1QM+8FHb zvwEf)%X&t`_fpvi&+IgETRts0SA^dImV8K`@?1vR*O!d4b3Lp2Xap27EZdhHN^>&Fy0f_{dn9!q5kG5_Mc9>*W;Le5h*7w##se;$@iIsRZ{O5 z=W1z;)+Q5=F*t;)@XNb|;40+i4N{+ue4n;UQ=_ewyGjP(aT}yLtA&zQ(eU9+@Lhu& zSIsJ=6?-q7V{Q|df~8OCc%mhVt!TKU%1Aw+Gcri|b9@%dIH`mKO62F^fK5+W$?$uNgPH;*Br|6`VhIgG6cKJ6sdM?7ws>t?=-L3xf);7*}K<9 ztUhTzrM5HyZLKzQyr6+~OzNkE32Juy@SIV+uv|^^K@P=g)OaHd{f_-cGsg+RnN`=cUpzIvY9MZ>woY>6uTA2==l1XOP?NGrk<$&nFMkHhz00 zafdLde>QSCVF$V0Gn3rDG;<=#8He|~CJ%gbE&1B5%ff(`Yad9!YH_(&S4aEtdQUv7 zUjy&Apf6|FYgsM&813QF9`!V#j}gWJn>1Nb*-oNaXuJ9-E=o9~@0vf1N5G2Vr(?Xn z*7)G02UDj_>2vmx8U7jVGw6)B&#(+qY@zFRY-Ptgu#nCl)jJtM3;(+O)(A*42^Ff& zs83oQxLMKcyK198hX^3V~Ooqf&&gKxqlIg@2&o(wCgBn_b{>G)#sg&6fJP27%$7*X( z4v_+|-{0M#Dz*^APu`~cLT{x-ef_Pld&GQuR0fOM*hU`W+_c^CQoD#iax;!pNQ~f? zhCgR*2_nLvAq%v%vY$pOcy464m~ear-N~%ODn<}#eb3X6C<#e2iuzb5f&bGzFzcF&)TO5-EhdDs~`&#Qpf z*W94Zg#29aUcM{HV7-YT$=F%Y^QjM-&LOp4XzSP-Mdg!Lv-_W5xtN1}Bk{1b=!R`V zTik`dutjXAB{%WFG}u_8?N3EJrF^eD@?yI?4QCC6g690sgW+O~+0_yJ5Vm4!sWTtT zMntRHlr8O+(_v4l`KS)DlFreaQJcI{!zERYu+D)!L|Lgv>q(}2ev5R>PCD#d0_LOgr?!UsZ6Va2 z0{Q;msXZl1bJ4NMct}GHdUyt?XP<=(CPnt2OY~9upm{gO=oAZEf?^@G7f4!{vxz{* zv>oxk3g8^|*HSx1e*G(%YjK|j{D{f?MX>1g+|X5yvcA!>sgM|Ucz#)!3vjjWjW}oNI%dzHtf*6haP|R+FAH!Z$*) z)r`R2;rmnc_j|S+y-yFnr33+tz52fWW;FiUKw-_1Lv&7Jww(LzJk-WxmSjnhP}md0 zZ+<{*iLj-t@PMBU?~^A^-F@<^Mv_-Gpmfo&3-*$jPnp_L@0UYk@Q9RG^^Nh4Z6$5y zJxnphdTH$I6R##sCWf6f4$4G?k%xQvkw>C?=Tb1&Yn^G>>$IdVZBn$1GA9W#weKNw zdm>8&9ZKt>r90Iq9dS+pS3U%o-kX&tfltekKIvmc%7^LrM1%ZcMoH}d@bO>eaOY-vX99{deU(TrBCSUfkSdVYA-#%(QW*D)yqC|-@XZ89%*2(H z({IU1#xcX|=qD#4?{`d3^)~3^VZ+h;@xzF{X6`yxd=H7@IE|Z$ z*^`Q}w}P$wftAKUuk}!?dVz^+8i)G>Ie_(^_~2AihF3OCHw~wfOrz~v`qDpI!{?p+ zgx_|M+I;C5QHz7HHV)fOOFp;sYwe{4RGNC`IHXy-O5x$J05*f7B2bNW-T25MX~+Jv zzl+64QmX{wR?siU*;n>WkyaIJb7aE;j;@~xUGag*(uoTRwM^y1@aDL~3!5jj zBKD(c{)4A^CVQUxo@Fnx{q899trGC0Su+C6Fax)~h4Jzv#!~ltg zw;qA5u8tUlXNWBpV?_J37JdDn_O?^|Y;^6fu8PePeaD;*#aAYvHFGoF{iv~OeEx7V zc3l$t!64mpNelyMD>ko`POp`XFEySX*ICq(gMqS0 z)!E;=kMX*I_6$5DgK=k1?TpF|dHLZBwEt-vl-5x@ppE2i=UFyIdNUfHlW*s> ztYL%NnruhCM@Q{28rsQre(c@4)7VU`x}$2rL9kOUP2xh_br-zuYAbi$IehvVa@vfB z4>POz@%6^)anLUGWt0!nvqdPsrhJ?7grB|uxd(~*J+>gN#{M44%jv#lN{h?!uEb*Y z!fb|ZfpnxZmCBZw8dOV>3di4y%orc}-e62xUuaxmddRrnpG`>R1f<6Z`F<+d@qRv% ziI6Q5iQ7I2X)=+UatLG0C7&I90I7fw|4gJu;b(zPg;RS(l1MI|o<=f_50V^BK3S_M zAal%xq+{ZA(z$R3*43GWRX#-G$q&eLG80kwbIDwihlKB*_^)*o57)8fn?mw4J?i*o zCfSbfHH6mn-_=2gik*c%5so1lWIXOVsbBbh32i4!`i(HOue4t@4-OyvsmMrNk+R^~ zVf8RjC&R%L>st!hy)lI(aw+6jt5b+>S_=8*ffRClTngC^@5%0s>G&-jzop~1bo`c% z-_r3L9oGnACL@U7h%_6i9O*5jLrABQZj8e3qwqV@Y@~9ew~!7YVZ)UF2CYMbzqm=c zQys3YZ~t*{aPZEZzpB(4U0gz%Aw3=azH^5V`e3~KN5@3pr5gbx+VHd#kV&KUQ5Z?% z=58{?i1SuyIV7`@ESzH`OcCz$jpX%($SXFIZ!EYkF@8yw8n<^WGZMpcBU|;9k@T!I zlBKJRL|kno#%EE6)|H4PGje_kdzsNF-D#Wm|3%w0l6WJF@<1N?E&lE=L!ZryT+g|u z67uop$HqoW{Qq-}+006zf0p{l`Z>~xvQ~H*sa=DEY{vPFr;u>Rb1UZ)zmncsaaQUf z@vEL2W8f)&?!=Gq>+JS9?Q`45*^AoO_|`yUik|4Y8ouNIe5R{<_)OQQd{3Q-YSt@! zD^Pxg?j1LRn`I7c@`{V6P z8=3NiplEnAcWJw5_#w1<(eMX&z(hkPc4yGIu#~n%zD1~gk*^rn;^FIJJTLZ1*H+76 zVn`^^-REVoe8-COvCbDEX&`g!kea~z(r|z0I4kx+&)tXjy{$Mu6@DlS%6$VqnEf$S zM!Zx1?`qf^4z{zRh&_<>TvH?Rm6vg*BECI*CVFnF^)T}B`}jYyVh`l}zjUB(+&{tl zLYn_q_`*=$it}0Nxvh`kJlOKlIR6vp!G44KX5Rr%#{1Y^IHMK6J%n$luK5DKnRkwr z_BWitw=41OHh=Vd+JR4SMk{1+8GLRZGl)Ulp%-7lw*>VZ{}bv!*=qEw2lem8o#6fv z?i$>)!2A1d!fy>bj}dmB36|o>@CBjk40&lo3ZqKfGY< zXT29Zu4}4^h~p}L`by*A9oRK#iAWjKiQSa!?8_y+#LYD(_RqdT-0{?RV}}R0_)_q? z75hK7qxCX{S3FnR^n9<}V(feU9I@45-gMqg=himq4!a5tUurzp)U>&2$7OYiMratI z9=_yIMX#~%Ip{L9?3dgmMM?x zQ}plWq0_m>;OiBakN2*(jo&xLmNd|ERcq6%|M7)MeAd7RynCP47Fi!Zu*mj)|0Mq4 z)dRfoI8&U%GfVPinR7z+~4IG`_=+(dBCB+9Aw4gNC%O2Aaw&iZykdD z1J6(6o{lq(C0(^M!<&I<4AR_lV6-o)xA_l@@>#A~2HgiN12obm4H94)tW7u@x69hB z?ka88ba9?kuM4L-X}dV=3{nZYfFeIG(3>A0IF_FfFy4{5n)0*njI7w^G#VNaZv#CO zGK;n>AA8$i2R(wd`bZ(tiLVvncHnv5vU@fOZlC!*6>sZR3$VgVr}SLrH_bL5o&BC? zzRETGr~-DBgaYLk3*B$be&4+C=n1#XLUUv#3*GZB7{iO)i;gaID{7VXx?-Hp`iFa3 zJ*-clk-K(zoT_Q?PD9+cjh6|Zz=tm$N3=eh(%Q~zl)3SMb}Mh(NrVSWmQG!Z?kT%x8N?n%&j&f7G`eR|gZ`?zqWx6|X74rM)S$(&Qj40vximUob3iXo zA{8N7kd`4WM|uHi9@Z8*pQ51|^P;Se?ajJTmR@Q&o!0rpA(F9SbV|2AU<@zCPQH}7 z;^}zBM$s1fYJ>hKLz*934&m^Dy?f!H7=NGVNlFquDgh59F^p zky7{R_0gb8bCdt}IM)<#7Zo5f0T7{mT~?SEQgzSARo(s0eoc47er@+tg~j>0?z~_% zPw^&BDwkR-7vgtp4XrJ}o@7@-oili9aDPEZQ0q+G=?oqis6uR+9;Y`rgIhzLC^HUm zw;jRO0;e>xH9SA(2aC-(L-LKe({X;JzV2!4`Toi1pPWdqH&myAPb8EzLARmv5VJqY zi_GrmIYO>reoi^0DLKxXV9K{S{fK=0^!iBbQ&zzK)rj+GM8i?+2D3sdr{~yL!5jG_ zFGlBqWy(mQKrQLdcwLeeOJ!OG%wVuuis3QV<*lM24tr&Yy`F7qn(r=kC)iqe*_urE zF?U~+-6n>099OWAFF_<9^NbjlbN>7()FZz>k46u!dKIVfykeF8=*QdveDwm?)f{4-C2brEN>4wrZUb)T3fF9n|fzHV3WfhlVIz(_8I^AwFCSKz5_Guv?*b;YPog_ zd0OB^$F&yem%$~6rgvOBc+H4k4_;F|({oI2wRYrTM}q=;tS0#8NRe+jt?!#DCseuK zH&1F+!6QMR+3^#+#B0KQzQx;j~%=e zqKZzH1W{!mX&8R$Nm1D9VsJ9l-y*j1v}F7Jv00RMVtk#>Bb8+Wke#TG>OqRp6s52G z=_)2`Q|eLhv?UYI4gX&RWP&E3OthF$Z*K^4Yc!w^xr{0gAvVe3=A0uzL6# zJ-%Uw`Ttm)6(9r`<|j+1DJo3W{D=$YV2X44L3ytvsSK!Gq9G@jsfbzt|L^(n|4-#(zL9k}H!vG`IPISl zU5eW6{6~0hp4>j{;iOz&Sw>HhPHg26gIaptc7EM?qwr>1TBq zN&Ci0#A*uVC*L}0KWXgSdXm^$FqT6|ok+CbalW5_6?d38ig@n0u9Y~f=S$C*onI@} zSvtr17tzo%X|E?b&N_S(`(C1fPV>G<`EkCgFD)n8XKqZzzIU-*k9|Pj@#4*7hbHjc zpEUJ}hZRe-0bM|KMtxQR`}4U1_z=8v8W4+~!#Hrx6JqB`8&*v4Uv*gr+Hfz_i+Zee zw7r?|b$yO|jOI)q$=)gAA2x1rx4FZ6)sCwESFeO-MnH2)1*Gn4q9HU%6KH&A`(EPE z)Worm@f$C{a-rw_?)L@ZFX!H>9+mrP-zYq2|6=RK1TSewJo^KqyNPpCjCKVJa%MNp za$4O~8qruJS)}(U&SSn`78%bPhh>p8i4(eSrQauu=&>(v)9g|=;!D^yy-)Y_yx)$| zthwBS(I}=;Nd)J5v*bQrC>oAoB++wV8T$>yyiizDT)q#-x+t#;{Vg{W?NdI$D6Abvmy{%x@k{03=gu@mw{s@K|V z?Jzf|_~vvV&f^p?@>Ftcwapn`UnL#~-y%-$1iYYs(EpJ~2Y;RpD|-~niH-6+std=~ z4cdMT4`*P`>A0|~9KQItBNxFl{+t0RGDq!I++pF7{g(`}K{OQQ-Sb6+0sFt;Oo15e zBjp`^MWArmq^~@H-#YlIr}-c) zb%Fc=$hZv zXByIYyg44mLvcL(TeBf2H zH5BsV;Y7AwE+8(bGYwf*$bBmIg9l(|Q9!|}rElK|7sq)2_Rw<4KNYmEvg^N1NwMm^ zm5?xKA1u!9a3byL`NZ8k3&wcBdb9P}F9wQsI2&B&c^B@+;lvPlG3gi+ag2}yMr&yK zKyd)J?JW8UjuIhq?4hr8jKa)J`-x%I<>Fa>X103Hu@JxS7=dU3-*e3OIY;RXgZFOj z`qZS^H#}aw2QtqU`Zavrn8VbV!;IkH(iQG3S}*>R`1y3)p{P9SxAeRf=M;QR?e+%g zS(>%S6L;~8EEEm)Ypj7nfU(r8r_ng-eSUGgxjMAqG4wg(DQNwIl3$A)huQ`0gp0D86t6yAYMwHd6szdOk$-p0_IvP(_1&ZHajjjGf{}H!7RYli8 z_8YQ6F|e)q`^4YeS~Fx9SXC$C6aUMnKfV^pkF9qjzvX)UZuzXZ<+E3&91eSsb_eJ8n2b+SS(W>+sTjoJclhFZ*@RSUrof7xOR|Z|SaF}R&JO@9F z7Wb(Z_kv;o>4}hx(&m6)2egkLQwK%28g?v5XR{w~bNHK7hRA}Y*JY1>%gb$-#d<-x zc%B1@O$=#_6*5ISc`zh~l^D4#eNVlZk*X*@`q^`pZLYgO@;G;x1$oIYE=8x> zkj%YZsSwhW-*Y|Jx+5*xwxw^)L6TofGMcX(ewopJ^hd#^W4-$=<=^4S0(7!nc@dUQ zSb10z$RLL)decv@!T!{orBWum!@rTrXd^qydgPdssn*0$uVHe%awJH-2T`SiwbYY@ z23mRZ$)i-=1pF5PIgkB0FWpE`8vMn0t!l*FdgrEZVaKJuakos0+sbPg*c8V_qW7Gz z>f-Utk+BV;h_mS0$vW=F>iT2IekrIzoPm>S2q4D>`a^aVWpMMx=b8?@`2v zQmOw@doa!#X5K`$WE{`?T$lo?%eK6AMe75tD_c>;1Kbs=MFg$fITP$Ru2LPlbeclx zFFbyYa@P37fPQOh|-zjXd*e|>P%Rbq} z^o_u$Z?Rm&astafL;}nCs79u*gt$CiWzHy&Tl_OBy28cmbhUwV*H(o>V^JnB+7~~O zEry?&rENN75_0am(=@vYT>)!8_LXG&_oK^)qK+*@&fv)}b$NMsAZC%QN`A44+qG zF=PD+Y!Er^lIerqHf z)BG`SIa=0J`@YZ(#H8s2>Q=z1PpE{hdU&0c!u z(=&lMH^h(&vL$6stYLpyR@oA~+K*5siYQys82Uc0=WFEW5c`m>S%G&ImNQsy!y?VQ zg~z!*lcm5`2#pJwLs%Vw4a2ag={5lWLr`JZwW< zGtr+eRX9WTIXv z6>&I<0$J>ZPORJKAScPUirL+Wbu?o;RWZX=SpPm)!))4ddBI&xcQqr^2{fA(Ep%nU z#esz*3JRSqsK3~P?Ja#A7E=pTFxk`J?_9}@s*{=fZmDGUPk%)`suomD8}U!Sd27Y8 z^Ml!PWS^k8gy$f$6Vo95J1jc%QG8yBbpgvWSj`F*SEupxUaF!}BnO{O1?T;pH_x*qan&xx7 zN83H8XlJx9ASQCiDld)ya3eD^{AVz>=EC;0u}$kg=K% z>%=z^>xn8%HdFA|+L^v(mHr z9LL>n<1Y4`ThP+t9@k>lJ~Vk3Kg95%v6RMCl6ePX8WBgmj-slBU1tLKL^t~vM!#x) zQR7s!`|qdN)6LU_9!-bpf^@fuzGGqd4Y|0|y0tfD)J^hT| zb=H5s`NaT4H6o(X^V^}Q!~wtW2FMOU?WqiYP-z?p!;FbB4d)|Y>t`DHG7`~-sEr1R z;}OIRGB+Xy*M<+SX+3LR$(+e8!F=kK4`F*KM8p`XpN9l8N^fLXA1OU8oMUoo#tgm`w22a!o|u%qfB8K=ih`yq~JYMU0R(& zX=+1!`KM`Z10|u{5aTmYlsXX!XhkF-Y=^7oP!zeu^(4QTYX)RA$N*m3%R-DW6!G+r zYwOH+{;;;r<6kOnTU&>G>|aJfYAIOrzffD}vF`srwRPxTb)qkmADr$N$!8QB@XzGk zA)66BabsN;uW>Tk>Y1vJ*jF>UQ9Y>64|9qU9AntcFm@L@jdjWncoX&nJ21B7srJYU z7j+4aG5XNLr@BD)?+9}t@Ai)wF8^}amp6r*A{tjDzlu>U91_qjk><8IMV6pIzgN^l zrYz5P$T%=L#r))eH5X0FJ-+tzcC;@-IDdfmPH|nvP~RMs197f#{H(^8d9FUMZDu3a z_j2WkIFjuAA<-&VhJ)(ga2QV)JhN#c&y2aTr%JZ@0j~5ViY}ycKxUfg;Z77~7@FUa zSr4{efS%@4PR0t7+CP9lOX5Y=7% zejvS%CTH9g}MxF2*cNcW|_Ocfbd!$u!vibOA2XARd!h*$KFDj+^GtF}JC^E-c2 zpm^PsB_d#k@y4-ITcTsqv3>9TN^$QJBYOqLI7K^NVWm_UmV*>W3zPpmyA0a%5Fb0> zj(lw8A>w08OzcmhncVp#+1-JO{azrR26E=l1Q{`ive(ksTFdA`%H z9O7fozlo3iC_YWZS<{|QRN{9YK6X4^+bw+TuLt?qYJ7V#_}HTmS1VDmUneTI8@^ic zoT5<2Y>0Zj5JwLjY+Dlb`q^*74Q8!?^BvO6NdEgdbm%tp<5`Gn(NKTJLNcNopNV-* zbHPX1i?SA;Ux50E#)G5#sZVA)k?Vv$X8dRdwkZts%H*q1-)mYk$x#EvvV6|+47Fzc z)W)fhTd&=X8jlvro}(*&Q4XJ>NRuH;j%q4>B7Go4KOS5P%8rtws#HArqmhwLQs-qq z`c6PWhEp9oqR}MI>x{OAp*#OMvY$;BvpAOzK*OLT92JkC^BgY;pWt;vZAzw)(XNF* zjwwX0r(HSLzX_wXc*ctkEZn_d7kL`u5cl2>nHx!SsZ11^fD_e`p+xUDC{nbET$Zq94^BeIQ@fntSiI*&ch zXY@26+kNb~8Q>{%lV+S4#kU+g_pZ);%Ce;|^hi5$TNm;nj!?0pqUwVwHezyoaU-T! ze#QVM(YO;^P|4$&r62xA0a|)nk0PGN7x~&G zZX~|bU=2vx(zp4bITb$8t5~}f#tsw(W>Yg1)~E0c?Q zGJ9GOkMuKs_1RFw(`xpp_Xk0a2;LL;13BXN7$<(}87szM-d~1wl5Ipk8rqknH*O-L zr%$$tzc?mIbv=GMSl2@bJ&f#Klxt+p9?1Ip`R~sWC-DE?&}JK3sn3*kV_tw4Q`tVY z4-wRj6O!-!3{Uys*gmG?09$OE-(_}3nu?mX;(ZvmJo1Zm3m?GBO=RnoUnFeY)@_zx&#@Lu2~_I%UE(2j2I{`m~*8jy%Ks z+T{iuYhOargya=seu)a75t|PmDwF#HJHJA!CuaM7ubGd;6&&Z+xKxU`;<0^f$Jjp2 z#V`l8zU5c3e!zG{cAxPb{H5I3gsZsvT!s14=)vF5{1LxjSb;OzyYQoh6^!uQhjOqz ziS>?c=TsGRT`%*pCAByLu3;apW$#hfwo3!(ThD&uKVk6P^AlOrTj^H#Q8hUEOU7km zxr(mnW|d<3RjqjbVO@tWGuma-j`MWRVTSyd7F85GLJadO%!5pNf00SA5SjEpO|e!; zb^l=Dw9fB7XEJ^jkUenV@4LU>#q=}T%ylL=685~4V7=2bKZ!gGYAasOdqA?pdH)6S zXuZ0;SD#_>huc)>AF6&iGIV69fr=;#@}r&~27f$qORW*HY_sJkd;ICz*WabJgSCil z?+EB*v>VR9@or!_>b>oG`rU)?>g>L{3$paBUZ+N;GUQdY z4rA4+;KtYMgPSaE2kSK;11VYBKU(N11uDi+yB->Uz5Ato(!OcGUKv><#ZUY0z>RPF6lazJOm-ca^lk3Y#zzX(swpI+A15>#=Dsu+Jj=>oWMHED`qbNpJ{7Vev z8YTF>(%%DE?>UFx=A6TE&d>FSctrj%@|BU# zjGi6&$|z2Nd}q{Ne0{h%BZrA`7?Sgr zv$okzGxwb+Yh#fO=u24}&K-j$9RbR$bZ$Ju|OARY8?I z@=o&_a3dPJ7;R<^2niwwC9{S&C`2&HtkD%q42sMews?_e8&iCapAUUCv&PG$!Ea%s zR=}?2mo1J5=csMRqSY`3dh)~y`o_!d(pH%;w$bP=Z`Gmo-`}sy8-w?Ae4@B7rsy0$ z#j`fBc(%x{z!7k)AO0PG)z*V_LHW9&@W6$N+yd2?ffCz7Y`5Sy4>B0MG23(xNv76g zd?8;Iwb9v+ts1m#Q>+Z_m+p-I2TUxwL&U_QZ+MwlnKk6Oy&V&a+PSexSuz*RPC10evO*#afYAq&)1U<5?l0?E3B!$hia5wMvfed3Okn5^lCgE>hl^Ru1l}M z;(9Pu;c11gAhr{d(MUJ>XL{$5y{Qbfpt zufKP_<(n%rx@P==?{R!M<6XRdG^5Ay=xdjc1nocCb$NyxpBk`e4g@=NQ?I5Tb)3VJ z4{bF0!t#P7du@iO5__ z9oh~&Q9FB>8zVBvGL+F1TE3KY5Mk*FOC3B6d1XB(QZsriZ!bAv99nEl@uXa1U76!$ zenneG*J7N3T)*hG$+>so9;~v)f)$X?Pd)MS=Sy?VeQieuo(SVCeOHeti$A=6&V4og z>Wnk|Uq1izSXl3sUio?%CtKg+@GDVq$i!Rka;YAtOFJKZm$xSTZJ6`dIcPyVp$gKN`Pit{_IY3}X`YM{2j@ z(I3gj7>^|uOEl_6)j;pP3uD&ZG00ayd^xdfNf#!c6iQ1moAEBkKFC*0eOa>8LGQIH zkS`f#!n_X8l#R8V zPz%vsi%vSyJoMw5YT4s@Q+n#$6V0Dnj*g1I=e5Pt|MbP>-{7eh|Mt3A1MRx2w-s80 zjH?vMRSnL`s00&`lp=o9^2yZK((wz+`|yH+-_d~cdEYd!3H~W=0HbvRj&8u5Z?Lsk z|NL3YH?671dSCn8ZxwOu$2GUSg$i3f9Penf!W?UelT9$X=UbPe>MQ)r)<8oHUR6}b z#5xjd#pqvVZB)v5fyMljQ>nqP6y#a4N8lT<5km6=(Z;SIS!2mi>;U=gX>6qDLeGSr z7d@Y4Sf7B!`+VZC{&&pv^vr0ilcHXj0$j_V=lxkH7!X%uXfn1T7fG0iIm+VRb!Gxu z3}^q9Ydm`WK=F7SeY{w&)QEbevVwTr1@AJtFb;o>gEsBu#py*4rXJ)7z0cNB;?~jF zI=XRtCB+AoITo~nIWM3_yx13|O6O_G0kBuE<2OQ{g5{-7vamdbbEjMx71|HY4V1$} zIX&c4Cx5zcyW4^GH^rlaz1f8P8)}ywtobDT*D+|5UU@a}g8Bm^@_>nKM0(b<{ZS=K zu#H9_FIuVp8RAJe#C>jO7vgGZmRtbVWj3feoIS1T-m7wqx6$nKPjjk1tJ+>Q=R`v8 zbI>}49fDdNgzT#~cOOA0Xe*MX&h8q1BNZAIWH1cG>=fJ|LvkHPDDkhB9>tt~*@ zLfhA)jlm*jm)c=qIpphILoF=Q~* z9u?R|eVsg-LAD%w*0fwZ;@ z6kYdU{Sk=BR+;dQh^jwetISh5gud@zv>zN(rcVazKv1&=8QewJbbUg7X=+`n$!_j1 zP05;Ov1i%0+7*zT9$T*TRN0}ij*jcqlY%Z7s}-Q6u1_m-`aL|%q=Hp`F8I!hk|0i5 z637LV_;co3lD-mF5})8J)>x}>YY?Go)_#FVy>2l0BJ!7ZhfSpCs1%Kun9J_RK!jGA zP(97+2anWKe}OmbUU7!)RzC!TFtMz0+&P#dpRnFzi;9Kb3C|}j_*Nm=U&m%-px@^q ztDHPs!*C`vA}njItw+=~xF=JQE6>4?ZL~%hK-k8w-sFvS0|Na{R*?4|sJHNTkwGP-plqdOR*nxvhEveG+;^9?Lm>QpC$+8(HrK?YLl z^Fdh-Dt`<; zI74FNn)Wxup(;{o3Me@*x4HC)BQU455d-&Q9khqh(3Pn|E0IisM4k!75Q4uQt3YHg zA{%evZ-dT;x^Bil`z~1)vNLK78V_mA-vCY%GAoBQV!pYFz|G{+cuP5v#IYs4hV&fL zPnLZzvFnM)O`ImL&C$zo^7bPp|8k!;Z-k9F#k+XYli65>@=bnMb)+rnitJvD14L&m zR6QhgxlqsGF?*h!x93;~gn=bx&M^=BbJ?ZL0}61}AH()MyT9!*SVeQJ$am^9`P7{a z$2n?nZgjrhF`oG!@G|HAXkKP!&Fy%ZUO!R!P2|^Qr&~ns>%>}FKIunZtwrOo^GUs4 zjfwOr`U`EvI>waDnxx)R5MCMW-rAoOn>}k&FoJx9=bM+dXNl0ou2FGu&MB~O3*ApQ z$tFIHZ|UI6-CL__SMAwel4SDgNpg~P@?+dGkynbX;t@2xEC{A&dxME2EN)5cohr1t z)z}B=P$@zdsGia~>IUJP-tTF89~946B%$VM9OgcnA?>^%ZYO#EJch(?-+`XU_aA^GVigU&5ysjBh>d}q835)$nC2GP!8fDPvJ z>7Y=H?_|Rtd4yiu!SiLbqpO(QSRZL;tSIe_g|s6p)M1p<*?4PstQPhiHX+X%61&xU z*qQ}R)0|>S-FS7?HEREY3%oM;$bEf#)Rv88xA`mhaDQXXZoF^6`>lLk;!69W?YH4? z3dBtK#$4)Q&!K)Hjx(Nib~Aexx-quT^{{8D9s06oz5RHI150)X;=tA;H&x=m)>q$- z151$=nKj6~+N1R0z-HDwBFyyMMYFaZo{&3nV9^G1r+U7r&@tNdm|c97hXE_uJ|qS# zwKqC{F9Vj&3!0zAfXxeJ>6an{78-KSnqHGEFUGT1iT|2ebDmd-{8!r3kZpzdue2|b z|4KcgI8f(hzf%98rzWvqJ-r%7lx(F`T}%lZ+%`OmDlA%zm0tfmqdm2c$+fsyNd2$R zfOdmdMo61Brg-&?f@y8ew(F>u)uH@=wks|ocKg8UDQ#V8Q`NaapsX5`nXl(3uW`PGL&rvB&r>U(N$l-Q!BgLX-?TVr|_GKSe5p#QljH&I5TVxz&t zS^iIxa?@~B9H%&lkj{|3Y`MG$6#35Ver@q~UVkHUJ^UIT>)uA&mV?>sx`G8Ql*g;= zTvtFfSGV@7V7u0?momp5V&xkXOeRaIr4qT6It$wo(isXbUG>c14?^~a?hD?}maEn) zF0Ok`c`=}qG&gAp6W_TF;uH(d?G}!+opPv*n75 z3vb!?NO9k)^Zw#>1hvn#?eOfoGfJ^>jp>IhRFW~bS*CkfsN^{z7V3DgQ0XsIp!ZmL zuuwO*TB3izLVdx@LTw!nTZkG~oXmscn^-X4kf$x?EQjtR*>pShDG^blJVexR5K)Ke zz1A%zH~J15fM)-Q156>v?uf43jr((t?l?b`y#V4iWIHbxm1J0w@yH%a_8I|9K(EZ| zjbSGlmtS3ayw${Nr(NMn^X{bN-p`qT1g&JpzN4)Jls4{9k7}xlM z^X>$BU2JnI8*9s2KykP&m9YzByC#{Eu4OwE9R|~uYDBogvPf+|!*%(~h({t#ayPS? z^s+xs*t#H`P4j%Zj87Ui3!g&qw-*z(E>I%dZ1)w?)%-FQ`(iJP`{+6|VaNl<h_lD-mTbZI~iKpseimtnbDT>Ub^Ab~ZxX2V8K0(soC8lTr zn4-ZL!M#jTd|PCS?#G<>`h?%A z#Nd@Y_i>aC)+rg{o+x9%n~llj(!4~^o8sAs^|BIi?|Wef^V(YJj(WMWzIh5i3ylxNKrJsDVxW3` z;Nua^OC$C-F)C%6!Bndv4^6)5jH=vRi#}UmsbAtqbTyFfdv=~h1+Kt~X*Qt-t)vsr^~VY5;kG9ucvAv2gaGvYKa85(4 z?hNcj9CN^LN1QqA(z5kqnvDltpnRIDiQzoX5YreVYWp#;IK-SFdjt0ymn-@;vNyP3 z@8LetLJ#s?q+b%<8JRJ#6GSwE{p_JTQ~tg0I7x9ZabzdpnBz3Jc z?ycPljyogy*hxCr#gD=$s=??+b4-8%#BPD>+u5qX>#tjlEfoJaM9wA~a=4Gy3hNJY zk637}X6;`Q;Wm`X_89I1*+)0x-76bVnzI_If#x zbv4zOflj|AKd*O8z}4olA{%!Si>%PXsaJ@@;Qz4FL{i-!&jfY&v-;+|H%-CNZbJsaV;v`&v~sRP2y9_&-{xDR;fxZk~T6CL+9 zT-<;X&?ZcBjPj_7d+<9$4zY4!`wUMYTCUEWW7oNJu{?%_x8IJQ`}A+U(M@@yhGZbb zLV}-b)HC_WYwL~`+m@_u0Qr29teC}*u}!=J-*m}1)D;}vMEqQlo|{}s^ju*?GqUBX zWl8Bo&lM`VhBt+EZMlp%c*|vXr9}zdWAz;J=}TK$EsVBk4)_A78$cduDQZje&?%pc zFg!1`S<00=iG{`?uWi=b$B7F|3|kPn4;d|?C4n9pTM4Pj&tTTR1wGGb2}ho67G#@H zHYc_Da%pvFahvN@bp&z)%_;A>j=9)4$OO>AvmMvL9vTLI=X_{3n#QNV$&*I<(L9+KTwI`euKX-9GQUw`8acD;JtS_ zpKl85-u~(Hh+QyOYCB60kAOAj+QsOO5qqM`jjdZ@LECKgiyc^kcYEn!l9ZVuHbbX< zAwI)}D&E$B*k_>eP@MFL_7Qs+lG3ydvncQL0A8QK-?aOl#mHxDZE=Su$)}ar3J~SW zfetI5;%7I(SCnN};@iYT0gkUf3^`L$ANn0WF`F!ikz@{~TMBCzCd*60P1h_nmaG%< z$(FZYVOwh6?@@d5EPo>UhM61H)w0a$mT>S{w2(5ROzD=fhZZJl+pDUEE8b{9$n1c@`dUE<6ZrCSsiGMkkbhVKjLocGnpV$}uhKK~0ZTCBYKd?4a0DMP-# zR&!xNbNscc!y)acLf^T-LN$QyM4F8jwMvj?%Lg_skvOx?6d%s)yg|@5{4k3S%Su=i=YHfBe+XrF@j9(iQOT=W?LO_}UJ5O3T_ZzOz~GVnSezf?giKw??r!_ff#J^g?x|kkbKcJHd4;TA>`-`#EnI_<%w$TO6?LqGR?PX4=YA{3kdSZcodwI6X2HKZykq!2?$}&pLYGeeO-f{E@Iyag4$;Dz>&kJwk&tuR&bN4kZcs3c$E7e|-!uh{}9`Pz4h2B2uLv07`T@FS~gX^+;TZ^_F87h{YPPwoX z9@Y&lQF~-1h|_L?|EX_I%g@EV6a9UJURH=2>Gq$4G7|yo#m79`LD_f1+7S`){;&fP z`=4$OYY%S^y+Af%l6qAzlAfKt8;p%plXvs5PZSwgI+h3 zj!EZNg)wjgV(bM(Mvu{BOoJY{=4>|FZSbC;{lvl#*@NmJ=cQvXLKP&4Q|~dkzhJY) z`Q7YR=p**}V+=(6X>w){=U!q_z>52T%`f%=TV_un`_qa6A)_a2+7lQX&Hdc8q8>WR z$NZZ27kT!Pt&b?DJqY3+jP7)ctYjFc)T44Se8pNW9C>;y_IZ!ZFCn96t}TS6yul!L zrY)mqj?JIF3-7aSe(ZF-&%!Zj|1a}v+M?L`sB1(d{fPbk1(kf8xc`Ng3}>QE9y`e< z$9@v_uMD7(W*I>CaB6&14k6ng2?yo`vwI&F14n-RHp z_&$mlQg!-Y2oWQb$Gcgy3}(F~KaDyNvwI}^erWas`2C*@sArw~wkKwu`b4`YX1*VN zpK>O*e+$Mb`Ui58zN5Z^8pK$1Sf0mX!O}k{=g+XE)p3}6?{`R1AdHZLsFbv1Ia$Dn|9{3YF+j-q=mL-*lfTCWiJI1WA_F2O%m+_Y)1L78wa`(+3LwbY&qt z8iLEL)!dWOBSlzve@ElC*ItDxP3f}yH&Q_g;uAe=21SQ%t)e`P1K;8_Vv?-EdW$6p zv;KDL8>s^YiOA8Uy|(hpVT22Waglr z%pBB{nS**Vb5Kua4hW`m8qHcB^<<>q5VyeCI=cy5QPbmBuGx5>-8j3+*lIjI+jhh{ z`&HO~PKCtJYG$f~CM)E#y4hN8V?`ibJiBfEU+KlAVTe2j80r~ zkpt1PXMJ_w_-^okAq!7IUO?m-*8D2!%sh@I7Yo&!d9#-_kHRvdhc#bAt(k|gym*B* z=Rn7&n67L1{k!-**;Kqf2lC;OZH4@NRA+`mZqIjPhnbVW2PRqeICSU#ZEpL&%WJ>+ z_dlN1KARbXapQl&YR~cV+izmE&t@Wt)lSO~c%xv3WVh}Uh4JNxg+3A3pWFyWhcu7oVmv~8_yU|9CW+$0{f4{ey2FxTg zyU(-V{y%t5)u~fer_S{~@8$QNUR-XMSC^Mncx!)Iqh(k|!)Td#Jb%-pPfueQ#?Ld1 zFdvbDzrU2}mQC^sJ0|%G3u+3K!xMdqxim*OJi#~7E1sU%f1HH)BwzG68S%;9u5h`h zE4IzF9<|?IGn(Kng3cA9}Tf4%~wK7+i<=5a!!qxMwqkN;0 z$LRj!7{tf;qQ|j_kM+?}w~e`|En~`y_VdaEj7hl<;Xos=gcD54mR-E^9nR<9<`tPY zDI; z=UWSKe4#Z7#}``{%ZyX(Ti^OPuF6`)J_o`}2r_~Tp%S4A;ZcOg5ULSYwbB=;>^M6p zE;O-MwAJZ$Bl^c)7?(N5xh9a{GX>_KP4JbSP8gD^Q&aUwrFYG7CPk=1yLfnI4C0Ty z$txGHjdyUq+JKNJ;kog0trj{>{LDu&*dU~R~ENSe>BA#si^IKwb5dpJC4&us#Cc)pumQYx`LLNopT;gCoVGO@jj)Gm)(0g=kkED*VW6I=gc+s z#@dCx^9suxq&dnRrF?6_p4u-lm(m7e=>suye@wTHLwU7j-;|{+OFouFZ?Dv> zZtt0CXRa7uPdLGt&le}25EKUD-t)y{S!o_Wt%NVQSb8U+b>rW(lYj(tKjo)b4#+dK1avfTp zF|Xc#OiJ07ydeptFiL`=|26A$#$`N~cw)7; zXb0c18twLkhg~(?zFnOe1|6UMC+X3*)j1KY>>m?9^Kec%phZ6AXy27yu`$Jw@(_(s zIUxC1S!sJkV#b`X4DS$qmT+^uCA<~k@%jl;UC+o)SI^IUUG+cpiS;Qb%*RcgOA(96 z!#AdOKIC)nEthJ8+Nlrv#J#n_2b*aWSuQb^N|Q14#}K>pUFrUV3!B}45W<}e$tRLd zj+n@}gs|_>#cQMF;T`FieLa)YPL(vfn^@V{Ti4568flA;(zI>qn}%<^lX7%1SD6Z> zskZlZ$=jZ=HC(`NJJQW>4PHEQ(SPmCtnOL8p^@9J%sdh@Z~X-Elx^Q3o{M1Inz-#q z&(zR4#3Pld8`?v(j?{G*6qq(l!;>W;<|4(>O-B z6Cp+i-oSjdfaZ?UFbBsWz6AFkM4&NG<5Z;)$8<**`Gmb_IhkEh3wkOX9%V1_KHjL! zv3Z5Ycq=O}^eU|jy^Ksp@na1?9~62X#zhgX7)PP+{=))NioKxEtw`&$dD4i^VudJd zHU(Yh{9#AEZWV`_dn-nio*$&$A^XjEOEK3^7F%a}vvz15pp6;q%6#PV|9Hf{eI9CE z#>rW8yrPGFXpJ<{yWu>0pCvrpvt43WZgehlu2@$4>PHLxR+^7 z^a|m!Rw10#3QFTKq3nz!6*Z**y0}4yKH<PN#*4_{ z5$KygVOfUqsc4F<8YS|W;RikG6VUpucY{eSX#Ml=HY%42_r8r9vRTM{S6 zQZ!c>M@ctx)tV2Et~H&Xd3_tlvvSGVmqJP#+6B~!R{inK7V|$B zFy+*b5oct997tZmi5nz~`EtR2X_8F6$&|B>@%-pjW9-)H*6Fo9+9}K>rb5Gm>QuP< z^!@7-QG8A|djISaua2tR)t6SKQ)#sR=;tFCN8+}G4e{t{eHrn6TfwW%n;o4$m&-;j zGanmqbo7ZaCzne~)A%bR9WMuT)}LKTUF{ER#n1Sf`c*Bf4<;X9-7FlUz{;q@k?NN1 zN46bN{`eSD7#FR&M8#4&Q#U1VdF!mz!#Ez`?>Vb$NO7%eXzFe&WH83lP98g3-=M(= zNy;i~?rLD~?mF~}#CN2EDt1mzIgzp@brZkwp=M+GN0R>yw(5<78_GkWf0d4%`$$s$ za9^{(!8;?=n~b|B&btq#ZQd`vdiL2jaznKjH8(D3aqpXd(EUfY^7$FDc=+!*+p&79Us-KJMOSUE?!ySB z2#+8TZ6z8T<&}gc=8CRbD>7F`R*$eV6)FeTZS3b7E3h8x?OowT9&NV8Joe^Sq(R;= zU{^UOb#@XBq5OH1}&k2pP`#o3;E!l8}z7*;{Af1^!$dxkX;X6_ll9lEm+`l*Tg}ZQ$ zAdSjGb%<|fT#WfwCo3uq{V`*uzCUK@FZa^l@=5`M4I$c&xn6fz@8K+p`4>5$xx8YY zhw~)w3`jT2S}iy(Z%xCoymdH^D_RS1l+aFMUq$O;99OnJj-wXRO#*@w!HAHAkc^Om zz$2t0m=K1wn)*v*s$|Sx9cRi@21=bYP-^2qsTuR)PDYM#x=i^u*-_b#NBO^Bm*R%y z4J7%H{4)pt@Aqk{IlD!+n5&-9xIp3i>G92$40)#I&ua=S%!fBwoINN4F@Hp5-W!LxJ?;haxp%!~=w!x-f(LL-7Wnqj^}@FEoAx!Kvc zhtP;1;@$5Mya;rUoy_#Gxy*}i({t0KXLdO98_p;egxLry5ne*@A$*1qp=WQ$Gq>Xz z1jLn<2rnV{5I#eoXV_Budt}Yi+kf*f|A+pHN`Jm)4_-XjQKI1W|B*i$cgrE!F83K+ zQH?|yR{k=t0uI>~Qd*z!xI+6v&$Rx``;4a!>)<2chwlY1ys=)$s|&DlUBD7v+*X)} z)V5OJgI>ivYMOYu)K?0=pRUEz5B49IAil)A#3!C+97|ek`K2=-Y<8XB@TKxuM7D)$ z^Ihi+;Lg^y85T40b8XMJz0el2FZM0QTZ?`7;&^ZW@jk@w^F@#MBYwXxdVB!!Sp#~K zds}`?Q*swHC8Q@=RzO-3(w2~(q^5v%lCH!Vyt7&S9O2NN&2Bm)-04$3yR&&7j`RAD z^AVrl96c^Td_i;cxDfG$&2$vPH6En33E^iwc&=@J{}Y4HX~9{z!%wtoo$m0@TkrIN z+w9lE7(W@*!6=|7w`-#FY{o~ta%(d5Cph!at2_g}${3u7ALNz$kp8+4^ay7gJ%jk> zUz(K7pwZ_$@mvzl{rZ~6{{TG>-dm6B$>6bee5sD?<7{ z=ru6dlmg_HhmeM}$vD@2i2KNA?J-^n;l1~cqg=Q*y&mbfUVDO9N^#!z2Ct;yeEtLE zi~GO8^{sf%j`MvuXCbfSDC?1Tqk5sF-JmCs35(z7mF=j@oXQZ8B%5OscRDO~%jozeYvBABAI7FjW zxaOI$BA=Dt29F0`G{`u(OiMTG(9zne>Yo3G`&dL}fGZbdkx z2k#t*G;T38Elx{!Wq{TJs#m0pJ<2%7_>|XdvlLhFxiU!9k;`@7c0? zy0YX9$JJlXo_#aa+ul2JD!ZUP5WnQCo#$=ShMzmTTXF5}ZMqn#Y`>UzBYXC&o1W6E zPo*xo0ImeY%)!2bvV+I{U8+erhxYpfXRLC6SH~88M(*8k{)IeCH`>=>yI>31dP9Mq zo@cJQXE0amXT00nd5&a5=IXNr^t`Eed&m@8f1aLC?q8oE8$tV)jpK5x+TUNL;*nC( zdOwaURn6N_-5cwm7G%+aI;*fV6*EH)2%l5$QQIe>Hw@M!JfRHqe^Pb=u6ev+u!=i1 zVFodh=QZH1>Ai2zUuiier76v%7@*q%N3pXhsLA9pGBi$#aXze01K*$}hTAAK3Pnb$q|ZIC!4M;D15KC*ZjX8aL2^=zO-k z`DYEz<*kgfymbZYCAHF=W*kP9ekT51`bi^}DW`Xc4p5%90^ax7xuOQCVGc%nx;VE% z+(}<)XpP1Er&lx-HLweps5(79F!#`%4eWwD53#C_l=7l{;!(DhXCzNT=5EhAPh=rm zvZI&HJ&zLdq38Phm!8#;&Ia7RCKKGLngdh52J&K*-@zRA2o6r7UZnXG!OYfL8S|uE zMh0iOZ1KjQmx<+cQyqgauVKY3ZN|3+TgHE#%Uy39q&SO!jmQ^-U{uL zXB=XBXJtT>t%t-F<2)!oE5b*n=-j5fW3xC~0v4Q3RA!8Q`}+ID30;3b1#&Jcr$Cc1 zRN6KEm!#cV(6^hZJpaS;F6BpjHOafA3rTHZovB`pyaFxt-Atx3rCHd?E}$CMSus`| z#)D_18Yuz%^=r^58o)g>X2rVI#X32!^l=<&%#{@&FXH`aJ(vpGPi;rEA>ttFU<(<% zg^kLL{WI=A4@%+4lWowmx;oeaxt?^n^p3l46r{qUxg;NQYD{n?c$q5#t6b(v=t)~|tj(YQK|O8JfSxuQBRy?2MtWL`#kkj)oIqc(g(gV03y})er8~}@ z40Q`KNlIsq+j>$gXD1M=`m-i|k-y`e!IRkf!WNs@xgFLoo z;9F;oL$B9=m#G|-940=AwG$!s{ZR)-?;q_GUd@o%N?SMcDRk2v)LObuZew~gTUioP zKGkia99NwXJm`g_Y0&h@nfvqnpBytrt*D>mC3Tw z_ayEt#T}~mER1HV#RUC*lcK}YS?=<_Q*o9HN`8`q-8VmA+?8C*L?L`tc%tpH}u$bfmUgLf4j>U zqNC;JDJI2?wP0fZxZ{p0=H1y$`3U5dls&?Wu~re4NRxVLtQO5ZEt|Z|$0U@7qTXE0 z$>b8F+FDQA6!Y)!U2bE<1zx^)q<2}Pdj@(Rl$WSL^r^MBG;c)ymCfBqZ@Vv#D51QK zy^8q~-i?3;faX(5NupQj)5y{1=qu6Z2ItT(G52ZQJdJZrKOLCRBJQSj>A5*I0Y*-- z@7f(FzjKDY8e5l4uruNx+U{rZ|LwxUAa6JO?Dftw%r$O7ob#6fHU}20>z;~pt_h`h zO+n~H(JIs?+QqCLTFU;b$hC2cHKGRkE~KcO5eNB4lT*{*LsZ7t{F;t_##7UotC`bp z2;6VIbGACN@|mk;`KkA^b{@1-P_LMK*GQxVCLSm@_B4xiq7^nbrEjDsflpaH-pASL z%IMMZbWZS?@UEzq(Xd!=pEu{5fpH7Il4^NXP)o>|pX>ykmlsmco?H?CAT+-D#9W~w^oCVF)gN|i^jt-Qg!f>3P(Bb&tk~oZ?aXDm;_An5!1G7gI8oKBq^U!#Z(p zHQ|Yco+UkG2PKQXDU^(qwH|uv>HeplZjDFUZ#+AoGC1GOnCEw5yqTxxydn*bZED|G zd5i~`SJ`CuVN4qW?(7K9Md3EqzlF4*2T~e4)d(qWFv+88V za#`%Zrj?ei8My&8l-A{FyXm&w0q%=9n!z^BlDNG2Uyz(Ne$^CloXTYz!wf8xvxOqu zp`4UPGtVI{(H?;WB{-z~l3?_%9AaH@d{Q=DMdbNkz|OCZ2!EqS?UiFA277_({NuLC zXTBcOZ=3wn-?2?j8y2-qUM(B8%ycaEXv7g&X$wu6e^bcTdy_Zmc=8ETPw^Mvb2=X3 zlQzkD1(;QmCnbmU<9X1-=7Bf*v#a&%QI&@-4~H$3zE{HQJi-p+H1E(6?l(7;b!PyyIVH*m^P2dWG#|aUnhDj5O%!LF3)qg}??$*uGYZ?+~^pbbt#E z+uAJVTSmllCZ5uhwk+@%IJVLf7TSdE3p|$a>^6F;u#GWajA*J9bKR7r&Bl%F0%M19 z6TT8Ob{aP(Zz>D?#y)JDX+tVBw+WE@Zp{Oqk9k3Duz&NH%p(2ZSc*8ZeYOyH+_Kl! zGcRNE!CjY@y-}1i$p_nbJ#Z!U?iqEx(0?E<)f1K62bxA26i8O+)uha^v;xTDUOA+} znr91gnM~i(H#AGEBB*}FlzHYry7z!Yhyx)!+dcma9Q}%UW-hlm$@|PDn@4N4n3s_0DHnf;4IBqky`2dYT&rts8D9;?^rbp?_Q;1WYVm9@gykdAZ^xvg?!e*l*;wlZX zGT{% z_+?X|z4!Q@cfM@?D63`HCHn`vF4cVCkv4z=%*;*fVEU@vi5sB}KuI@9i5oXa9<{7& zn~0yu>>e9ZmzM9JR$Cko3o*_V|R&aSqmI3nd&+@QGoeK4J6A z0Z(@Pb?q_KR`0&iq)>gS{!5tmto!cljanjuZIlzJ%3+;wX#rzfC7Tp?Eh8Fx3Be{z)H;op!Xb=$j)Q`fl_ ztS>ZP^f~_UyL*hAE#^AbhLKk4=CYZ-1#WjZ-TE^x(@GVNhsm5R^#UTeYKEQB~OuOPEZM_iCy7Gx6geIwuMhL*u1ZerDXSIn@t zBzNkM(Y!ZwBySSx-;-|fZP_>fEVL7#ehVROx&pMq-G9UuR2<9l7vkCyUig7=v(}ZM zXUt8z*eZ5D=4cO<6`DTc4A$~bpc|2YMBw>N?d0W91Gj1epI{U&g4zT z&A+OeU+;hIkr`|WmBeavE2WTfeC!xOn?=f2H*Wfn?3uww3$_36h`soPLuAHCSW1z&9&dlFVacA# zfZm#lF}cP=Gh}#nxjR)I{l$=PHqT|Te*Ox_a<|3d3KaVjd`dlW7Iok(qIOi$Sm;5I zX?{=})0%!S^r`<@mb45=m7|2)GUnwUDE{KkU5l+inwX#3#kz`jF)Q4(T{rHw+y-(%+NV%3n8Vs$Tg(e2wEA^^bkPI;%eb zP6=ywTE0V!WtDnJ9US#AJl7yV`u5OvV@4Wt@W3J{Ofn9M?Lxpclsxe1sL z5tus{bj7zKKL1~$a$^+3r?o5QVK)$cjM1tXPc?qO=#Fz>2CsyL{dnSuq*LuZldXg^ zA{xkb(3&1+Wt@<1`*lg_d|I=+AN2!>Y~pWp2;}e))`+uA1E`mF=PTcblQHQVNcQ-VSlOin#*_105g5 zYLo?ncEO!mZLp_!*EANoE5YeRpD21uyp&QMZx?qFt!AsAD4;(0Y${sB{Q1u}NQ0an zQ%*Xm=vXPj8r6lmX4zk8swrU1e?0c zCT=pOON))A@8c%_`G)`h;3jWHeQ6v}y-BC6AUuWeG{X0Bc5C}_c2D)=?4Bf@Z9mS= z*qJm0XP0!$cw&``vs(o_$RN({>2cTN>|E-+?FtX#?3RN|skjbjw_*s+F1@3y#lQQZ z7WeLlVPD)@Z#p3&ZV6w3rSb9l)Dw>Yy^$rEkL#p}+}l&zO&Gkyqv;#Dsin9BMA7k| z#*lVSLfTaVY4^IcMtZX-rE^A!vilxb;O=Y&&JLKn5fh-9>qp$Bcch(E%r|BaKQ;e* zh&$3u4BwWvHGN}|intpK?8|qvYJ0sOC2TqhNt&tPx4OFdO@}YIF8Hst&in|7x{+It z=et7YO=}QO+S(g3Zp+2>k)Ct;Q-QW~h1ylLooQQLck1TN`Qd`PU~bL#}`oQaz#S)*z)_wX&D=XdHDt zTn8(U@$R|`O`FQa=sNaG$FL?4cIo>VJJQ1w#x6FlYcV!nM)(x;=~;3)E_S*P@j+uiTZ^4jOI1X z?;3>L5NJ+QU&Z7kTHUV49)J12f<1oxd)Q;D1C5oZEQ50B|0FJ_?niJrWIyK-2$z$N za}1XgrT=K13S-D(ChGsU@Zw3~AHs_hUBFs~)rBjgejvPfjIX;{9k0p9nF?(-3tZK5 ze%67cFN*3}*WA1&=={J(0gd%fx$!3qo8q?=TZ`&#z4{5SfJc6$fYUK66ZzS@*lLYk z*!8uQe9Tst-yKUG*IvYbNo($)Rz%!lm^dcJ(NG$||#%wklmTtxB=` z!%I9yXtm+-;4$RT4ALy&?1V6Xz@y9NxC8j!zh$$PQ7I+i!J~EqPi5FPmAJ-aU(#8j zEvhx+O8>#0ya{%=wkWqpd@b>NGzO6~l2ftc%oJl}2WzOl-)z#bYc19|-QhRrteD{px{MzpJ-u7T^ zz+mCx)_%3_O?KW3-R+@u-RnMd^m3fR-g1t0E)Nv#jw~z*F8_e%|M46vuM0$M>;5pi zSjThRJ?9u#!=V@tbj_aDtkXq%2Z#YKwdMZvCFc&+i@V!{;s+_X5_iLXk2pAP;5aYX z*GjOinD3dks9!>e$_F1oKSOPJ2yIt^U_raa#u6~8u#4sfrd3Cr_t*;?CRH27$-sW< ztrM$L#b$nTb)tBHUkbaAfq%&B_pr`~y!MY-$BlejgVvD?Pk`iqVPzVJOyvZAj@!_& z+nwcR%)glV99Dz7Pc!lcX#%uy|2$JuS@Jy_;DUoS(!7>4c#dpv4fHhVPn5DVa)_hGY$jZ<}{-m1P@PrM{8h=FB}IMgT)v(!zMlEfcPn6 zwh3IvXrK7$Xdkyxc};W+*J=t@h1QVCE|Se~9;wes54di^>Cx^C#c~exhP* zEaCe-tShyW;wt}B=$)u|dATQIYQ5W36qt;qlJ52A>jsI8xo;R81WU1G8_6^!|_jA+g17>lF6 zs_vRAy=YGbl8E#RCM)l&uaC!^XbQ|}6B?4h***Zd#9gmla9_cAU=&CT{W$g) zkwQ2H!m$_qH*oB~{2q?|mT55@d-adt*qwh9$8LwbBVLDNw*$v6ehpVLy(2!C&Fn3Bhp(=2W^TZt|P~FOEWZm)wf?wAPE) zcv-`fhZD(KYz1N7Z-K3)fT)d%d7nlz(qq3g?gudMB>yC+UPg%>IfzF`?+w7b=L}%p zCqs+-%q9I0%sbg_Vwm^UD&~DOZ^0agM!rH0q<}9Wj1lV`1B>k^@XTQZyvzRXR33lD||g>{{HV_=CQtCVXLRufy^M=9B2@HKM$v?va?4T?n}xdEx!(y z>83z!;EJs_0R1NLSMcHkb>0`?T>An%!h6!950titr9F+X`D0vX*i_yYd>#i{K>V!* z{4Leb1pOtITQQ%{;b3VkDdsju(LhZ3fDK?JQ^~q&d&uf5$V-spTHs++emk&K#bm5K zp4?#!By}WjWG*w6OXQLZQDlwrLeeH}R=1~Y{Oh;i_cZX{Cz8IyxN%f7 z=hPjKJ4qHv@tPSFJf({3j6as5QgA~@$|n8M*Cno#_vt$CYocdHR>pPQ-$c(DIv!}! z$uw8u@zr>5`NxBLe*qX9GlGn82!X~Y@iasALg`o^Y6^?;jf|^nb3x7F=MRJXb;<$l zk}J^brRJw^enm=ETVa@ftyD_&uQrH<`IY&vOTTQtD{nlWeWX45q!8BYgmAK++RVtk zCzbA_r{mP8pF9$M_Gd@_Bt8B1KfL`AkPMn)OWAdyYVGla@=i;KFhtEbbdC-6oCNbNgFzAiMly zsYg28_3amfrHhsA+kJ-e@%tL3mE~`K6~hP2FP|c*XaN;JJGAug_EPyxy;I8@rFVO$ zNT%N1U)Xx`#rIH~J^R{vZj+|s+ehCTCPEeq>)%36-ulZq_WXn|znVq$n>0OIL&!^x z5gk9_6H!KblEag^Z|#xZJGWk9&ka7!x?<0dIAP^eA2isRsz}9%Q^m$#-F0`&0N!9 zeDhWM&bXt7V>E6PI@U_*+qUoB56=Gf>|@fP_KGlUL;3B*1IGREFMibq{G4KbHXojD z8x7#WN`iC+{`=EGt|5klBMcnzobZM66&;Rijss>N!F*$ZiV;|;Cp+dHb{~RAAEdrJ3g#b<^1?CvyowJ-ekvbz zGz%+XmRD0jDqc2X3)uc(u-qX0dfB29Xs$MXy`Pt9l)jE)xqNb)Im6c(kYa_c%4OWjAfAY!z29#ld zi3Q(H{X%`c4&jIFN-^DLVP#G;W8QO;aScT*eIM(@xH@vX z$CX}(b*eB12jU<8dK!g_Yvws{CyYJDyo+S;U^>iaI?-d$X~D} zn@{Af3lJ)Mj6)}vVn+z9kzX4t*|4!HwyOu@Nbqq$+tO^)cMQ%0;?<_%n`C30@@906 zjJ9J+|M$}RdC2d751s?~UTH8+wSmwcA+h=l%`+Z(Qhp;Lv0+B4o(vPM@KyweT8p}* zduKN)SA;y}YoaJ4t%53DMqEvSVTc3ClZ!brgDE%i*!`f{7Ie3BkjNJzg?51;4E&&M zP4XM@uJnD9GfDpZ=0E@Ztsy=k(Ku@Km?;dyeDe*%OhE)baST(6e=vR;3*rb!Ta?O- zgP+{*LP%M}GJJ{#Pet%I^f~fty8-uaWY%vZ|Fyq<7Q5kCn0bX3hAqN*u4NrF5BV>! zFyGj4zRMyoi!6rP#TLf&fQ6Y>YGD>FvGAHlEX-v3PO@4i(a(qpD4Rt+50=5g7%e=W z!B;8ZkM0feFFbyerNUON`WH?n|HAMMnfDYA_!x>TQ)HbXiq@GU$=C2!%c(~TGQtsL zGsO3BIeZWY{`i>RA?o@}%*SvT!(_s5FqhgQ8*%svQk=bkx&I=iUDtGt+AnD!VpZfjb2i^Yg zb~ouY{NWvL1^Bv>kU#v8`u(~PGj@7Rud#C*hCjSN$<@?;hNHMg6WeO!^G)X;)ZV zUEtfx<88HpSDG#1Me4Kn_=TPO;0;xWIw7>yHP@jQb%Hrn#nbDN%X;6har|}v@g>Ax@sNV9Io9RyaGhdak!^*C#p4a@n#KI7LF|LHt;$*hK1KMv##e*4YJAV) z_-yp(T?f8r9eAL1zGVn@gffKXrxo*}8{Nz=XQgSE5LnPKc9iWC8o8q<=?R{7w&zq7x(b&!_Dy1#P|O4pS}oh84>JP46uLpOQIc))iwM?a*oar6e1Z;oO{DP% zX%qCy9sxS(zu;RazZq%w!Jl;u&R_fCe~LQv;(H;S|AI5^8V2#+o6)caT8)bbPGPYxRGLf=F6!Usa%()!srK3rdj<0JJvUmFnmUaQ}5M#1$? zoS(t@b)0K({!RV*Gr}Jx`>=;a-x80zzD6qSWyR+tr7g4B-momdipwPXAxrbJ{`j&( z<9*_@%K~~kb1(d5;XzAYy`xmy&jdal_A~$PiWwu`@myGSE>4Vdy&EvWH}&?g7j!omo7;o#8SWYTg0(@#m`~G^T|M25QQY~ zV2phY0t@a3{6Qo#ubzCXB7Z^nKau~Y?<~IWl;L&qxAwprtG4UpB^ogaKF5V=!0lajW`@18Ip=|kKHw* z-XM+6a;VH7hCV|-*s<2q=O&dX)o&U3x6bNU6sDqTea{S zt7uiQPaixa)UVPvY5q|OB2LE9b%~d^2X1aLg$|sIwFuf>|va&MQrpteFSr z&1m`3|2pXwUb{dZ6{ZXAz4bv;h!vluJ?JoBZUE-zrH09_w?l^9Z1s8NPm>N7;XUQZ z=>3bI2BZkxu@SooUmk^rQeG^3GZRz@B&5 zE6SDF>^>x_bthdb?X5H!VP`db;_^V}Rz>$>S&p=Fgk?kg-!1STBi-*vv>su779{p|y(l`~nK6tHl#)0>U^MXE=iH+nB44jhY3FOoY4MWs+A}yV-)re!{_*E{j@~DEHP2h; ziMXnYnu2#cG+kWb*$v$CzOyLNs%%mA>>aqu6qkFxb2SCW=PdIy1;^w#a2%Oafn$2k z+aAlq!$j6~pw$bex49KoLhOAB8)2ueL*L0kkEFTAz>+e$Dv`(Tl&XBIhi4R}b4VXk zWidBB!Ibm9uD;pzU42TuAN&jW(123SiwTfHn?lO!L^~^QX;o;S97v>HeL@>%WZ!J; z14x>pcTp!AE2ZdHl4Fgk-);n6d-QyU&8F_Im{Dx&CGHrWi|}FBfp>~(!r;Gvz9hb; z5+SBv$sDj|SbaixQ~feYlLf1hb37=!W@&=V*=fAXAp>?Mfi=B8E)({2m-yN;U`m>T z+DtRjw3(cJWN3OG7(6(H5}(J5n}ewB58Q@@Pm;GaVP4$(g=i!Pok0a=HnkR zz9u6c`_}BJ|6tV1@OV=8?SJL9no)dO#!hn|&-yE`RimA86b$iK&FlA9{dxrUJ5zl; zGm3vr;EquAIR^Xo*s1lo=7`E}A0 zi9@_q4MV(DsXlttXHa)r0zPgL!d(b4e_HYdU4uUP`@W#ewf}uz(0K#Cpj1YhCsCjG zjN+Kjdq(l!_Ialn6q_^T^FDy_b6Wb+9ks9~&1-k}jd9Fx_xEv*1?^159sHl9^y9gbYi&?Oefo(uVUdHZ|=_=!l0_ zKcm=i+_3pi(!RH8Tx-<+%?(k?+i!D2u73NrzW*v=BRemCldW4@sujtv@LxuxWu}0~ zOKDDNah+4@Q=owrfho5I>w>vK@rV)oWD+WZX2YNd)ONHH@npoK5r4J}bKpD35*j+g z_Q*KzAUfi>9ohkeHli#*fu6q2>kn`6_`{D9t#Xl12zX&|RhB-#$I@r_=(EK9BS8Z^ z+3JFNUd%T@7CsV$Gz>h8rB7^KmXD`ebG`Jer7ueH$d_btv)Dcv`=E}s!S7AAuomVS zoF&1BrN>&SmG(3OgEZi)KzroQKRX^$C~4qh`v;FwQ^z26jPJR6(hJlEia|+7Qu$>% zz7#T}bpYyZ_TbtZ7dVBxa z%TKNMobkNhe-%H~-SmtHyMRJ-@ix%a*qM@Nx@S)ng@Ec!jAvbB(J?fabO730=p-(*8!q%sJ9! zdVaRrPX2Ha(AJhd!R-j#X4hx?!_{sMyDug>e!^2+yGjRS9b-NndS$Pc*JO`J%Z0-= zg2lWvgDLL{*8%UQ1B$aorNfNOm>)XF$RmI)X3RO4?a&TwhjwV6+hP{+e4O=RV8T9l({iHgI<0|6aa{x)*f)?XV>&IG zJ!pvv#@tp^+hgt-?t>3uC3(g%=8sNq*uG3!yq#T;nEj@}$g@jQ4)(#z2fjcVXr)bw z*(+w~9HqS*x0`xjEMd&{jJIbH(kJ4K>I~*cQ4AsR73()@)isIy-wohou@|jvd%$!M zy9kFid}-Sz(pUcnjf*>BY|)*7eW~xE2J(D^eH_RMSe@>so`~xtABu$d z8X#?GJt97o>Zh*Jw5zd02j52yeSY6~TQ}nzUCzM*K5y?`-E1jg2TD;c!VbjNt#WB} z3nu~7znk8jC}B^HtP#yvkt>y*HPH37hioBz*7kh|VC4(s5)w!qJ3a8b@0oDs!B;Ke zx!}y=?ZRFYc1jlaaF?QT3l;p=Yd|qyEJNjV0 zIwt22cy}2ws^+>`c(iC8Lb%vJ2XmMFb=UCv#|@&zd@|iA*I-=CH6M^F`PmI(c%>Uw zgs|YB-8AKDdZp%4a+Me^{HU;rlSPbI9kh*vH#jiXN!ALz)xGD#*)&Q!S8DGP!*96_j&j(cC+CRa7u_Vy=rT$7 zNBK_S2?0?X)Ptgl;R-)_+*!;QIYS4P&#=*@K4mfAo=)1eXz2;#8%{I268RSd#$1Vo z1#iNKjbv{zJa33cS5`q({r_-;uNFu=F`w(q!oC>L zKfuqA>$Ixv%YuUk0(E6h&s3g{Ohv>o9R6jaRg6oShwhKI!q=}GzJ4K#c~62ZG~Bls zZDH~;ecS8F(|BHiCR4XX!*d&pX3(r*Dl?%^u+k2as(0B*`#slT!XgnZa}w*taReH> zRF_C(aIe>>Pvda-1m6Qml=gj=19yXN+zk&$79Nf){2NQWEc_eU@A)^5v_}0KpN{%B zjyYHu^>4g*oqr>{AnM^*nK9tus6P3(JRGUsg{p^RTT#@*@rM6l562w1TYulfaoE5d zxZcC@v0}nIF2%9D-@`HSM?4%Cqm5}TiM2DWNpqmDi;WkdA*BLHif-+rk;)~a?$J^) zuJi$M+5t=W-CY)$bu@(*XPF_1otfjV&&BHSPw=5{?`33*SuuVnS*it*y(GVCo59KZ z&iQ2M7C7V{ZnZ7=u^ z?5oB)202isoa!1|H?yFv7Q&%J^v$N=u3dM?5!A^R(iGXcv7bFq9-0a4JX<%sQ6Tdb z<#7v|0`X^n5e;GwSCIp4$OUb1?@DpR9d8QgI}$b$65_=xaqvV=sfzDRRH=laBXLs% zQcuG1S$u0q+?6U4RT+ynY3#zReaTk#3;Uis92>9$mty{U>gyTS){ zYp1fSY3~*axXSr6U0t32Ho9W-Ib|1MW_<#^W1_ zC)C_ej%gnIjXwxMNZ6XVWrUYIsXw9X5Oxu^WiAlW zlP@J#a&p7v)NO%>=| z1?IYS35XHM1!I0YK1*6AjrK0t!BmXqKi#Z?#I% zGuJU$z1B$FCKh$OeR}S6ZrXyp6|f&n?S_848@{yN9B{gW6wZJ=sa$%{tmJB)9rgwn z+3H61@7_lDzZ)~i6R0%c2lr3=_IvxMefy*Pr_r70{%PM1?4S1Sad>H}=n}++?4PEG z--RuGkjI|v_4h6Ez`w?|s7*j^>FM{R{kwrT59m+alKlwMwj$T}!7tgcV}rWKQRO53 zIm_6aNO0WYd<7PW+<+Xa3&;UWsa4X8!{7&HslRFZ)BvtF(T*7L)?{z|nJ!O)Og{E+ z0(BDyEz|hQpY`XJdm+k`2&E_OgLXYy6WyZ++pAp4!mbAyvL1PCJ&y4ROsnv(jQP=1 zb6nI*MK0kmT_N?O!Co2Ur-`}|rc{0Vr26(p^!#iWAz>NJz(Z>3=$c}Wo_bo1MZYoI zWvL2Yv|VH!HBzfoa#8I)U}oR!pyvrQOJC+T35SP%JH|%~J26%lD`CC*`yq3&0!4p6 zv;2SI5jpWsm+iS2w3I`7xkv-Crw%lGFACa$N z6?qc+LZXk@X=D$1RA{qdab2nBZ}eJJ9`h#nhQT*z?+w^xf{}~Wos1qmW$5(xv1)zr zv?DhVtxxR!n;o``hE0~k_B~qUn3+8eT#PPDXdCMTc4>z28N6UT=FHLi6$SEMt73k5 z3hhSGp2LDO;X0C0J3%43_0=_PrS95@{(A9$^}8t7`^FJnBApc370JH%ChVzu5E2nz zjqo05SgbvXpU#pD9Zz6Ae!#<4D`A6uHFRXfo{82~-nEj@IPY*ZFkp;%UU z!q?04<6t)vTY-AO-F0qC#U4N^KEV~jPC&pXP#SZUCG0@-_oe*sJp@Lg|M#VE^}OE( zZvCnHY@nj=z|$wu9~P4QQ8g^w)dR z_TA*|qr2B6TEexvuuePIgr=&r)^ce@J-g~wv1W&1OH@`MU!;YBiI7a}h0`)Ozr{Lh z3N{uj51FA0l0&IkmT(j0AaCy-11r;p^IhQ$4P5SM(l^7aGHHp~&R(G>O?Wc)EtC4K zF4$DK9J20cpoNHs4O83CEe`sNkvvN4JJ~HrPeZieK?LHTNJb_8nd~4$Z|S!!vc%yS z2?sqE{I&(SkDzJbw=EXnw=ITeI~o#zD@#^2O7H;d|DB6??1T#si6tmSOTt0M{P7IU z5bPI~fxfjA>jnAmkWYd|x8i=1=aW@mjgMzAl}Q60fR)gM028O~0vZQ=AZa6Xst2Gw zW2v5$o-@x%n_Rp0X0n5u+RnpK8Qoqao6mwjlvlyH2T z?}@!BmFh3_RLU1N`xuwIZR396MzFGuJ&E5&0M6xcgsbl4j-<|IQXRgWLday-h>jN! z?+qqx<~v?QtPUOn>6F%J>m7dL>6Wf=X!knrjpdeb*fU>BDesngfuQ+jcQjTTc={dT zLm_KK8VDISXVme>TSjfhcdOj{ zLh7&gjKcbpQ5=F)1B-@#?AFnn#%wGD?q*BFge=DOoV4_vU0>Z;uJm1UM}D3ry89B` z29!ZpVZL}YY$)cY^+;pC>iVsz`%Jf{iWS+a-jH@R=x<4+D%7igxXZ4|TGFC?ummG^ z#1`f%Q(-GFMSTA(!(msySWtH{X>-b!%{V7- zes{*ci#riZ+$9O-rKWo=AK!@Huqjg+s3+jFKnMR5^>Ga zZzR*^w=WLg0zUD=D+sK7a8~U_pu{hfT$qIZ2}tK=EXvy#n1Z%l4`eLL7AOhHA^%M5 zNYbMeME5w*T^n9yRey0x_cd3kKN<(bIB5~1dmYdW$lPY#kO54y3A!k<+mIcHbV4*A zY5vi^2U)nL`7r_K7ZFw<&|U|Vp)*ZF+=%cz0_}UygL66p%^~t>k4Ja`f#^NWUyT#L za?`pD{(uVu(S2bo)k*dQ?3KY*$BVGHd-T~X?1Z$^gr`j!n4vWPsZ8`OD(9855zEq# zF2()@FL@H2Pljk$N*>9BK?-L(0&c)uxKfYJpD}f+!ACM=Qzk!#rt5QB{rG*4SK3>sU<*D!ILbF1@DwGGkwh(rD zCgX~0tqf^%QL9!h&n`r2Ywmu5cmpT9Kn@6(%u9riX4)rvQ=FU(nYDAGuSm7p>VeJ8 z!fgGsOLrv=-Yw9$d)7nJHFRVkbxB@)hXv;Z{2GerN$j+HjGfCoNu6b$Wh2zKO;_`gK$kcnlA8l(dH}eoJ9_0CjZ$EAFidk{4mrPD&VM)kca@ z6Avv^0)lEM9ULVjGvHe^HY^CV-+&co`rh#CzDM7o?*Rca1>g9|YT!^H(x(5MdS`I*YL1P@(l{(9K0t47%G$D<96l7$jdo z%XHf1ghOxZI^Z+ni2Hi1>Mudw640j}LmNMqCBBX~>{vVLJR#sIQQTA6P zv?NN)>4*!9_f9#(&KFywer2f-+PZt~gWNRb@h;jRR(II1utP(Yl{_Um^%$wHfH&aH zLw1gMsDI~(4O62#M=Tt&bHw96uyaH%)@?#%(#{dQqqJv=s&55N@JztY5p|yAPzH96 z*npiQ#$xA)(bzd+BzBH4*}KAp@E-vh9Xm%P_U{}KXCJL{r&=rg#63FfOL0K5nBT}5 z+&|)oopBDsSc>iKf{NZ=P9hwLKps{MK%ndTQ^>d5|2ax7s4Y2ML1WMHGJ#e9mj zF(eLf5ZsAT%~lEW#};7^S&amH&U!W|n zpW|NV*5<^yN_=|0MCG38YN5~FM)ozbtr&HQ_$|xrjdwyXT@+IG-W|XUL_WgdB5x&p z1b|Sfmh6S-ljT-m1AyWZMa^RxQTNylcG3Ne+v9F?pK~X7nvSQQ;7^jIk#b7!G;L1Z z!f#F4#&yns&tUQgdiV;(_m>#*fzLz{@5 zULVV~Tim+GMv75u0L>sP^3orR>!4g#d>vQ$<)t`PT4Kt_dY{4m@h@dSVs?z=A9m0? z#eRBcINs4Y;qBG`R(j>R5y@Le|G&k333OCdw)Uwpl}aVK8GuR%P^kpO5FiO*P*5rZ z2xI^h6;ax%K)4wy2?oTWJ8dy^YqwDX0Re~iZmNPHga#`?eXn2p7fG~HX&VCAh|l*z z1Dcs)XnlX%cD--kAt?j4-M#*`{;YLVRrj8I?z!jev(G+z`1URabb5R1HtbwOCmi9y zqqmI^xir}?iEhY#NqkwcVRG;#RcMKLbG{Y1%OGPD-(u$MBNR&M^ndqGPZuqOFn;C3apJDSQ|ae+;AUy z=A~9nyJ4hbo-hh|K+U4n>*vDq-u~G25S6uZ73sg&QNQG+eQu!Y5a;MbMtz32WcTorcr; zYa=W5XXAE;oPA1YLfAWUz;b^;gM+~$8iJ-InWn*CV`pFxrJpBLQ5$y8E zY>&V?70Q`+TFg((uj3ztY@h=chrRUyQJaSuDO2S(PO~8#V-N#vu`~t?L<~;E%1vE* zDV&?KAxu8Myf<4M8P_!+;Zvqnr}<3WncO#AH$tn^9kxBI-D{@BL*9trk#IWifM)&Z zjxmmybt@d`pAvJ=G|}ovwbt?IC7}@VQb~r&xriIRBjctS9?He@@JOX_MM_}xi4gFVKi!f9Gv zi1YEw`F%j&>2vLcE%QCedw2YbFC7`)&-o*-yWFQabi@ zwOX!r;@5xUco)ZO@F-F9qrioqKB#i?(2I^rVpn7GcX!1!NB2E;$q1U;-$)i7-6V_o z=`pGWls}Ko*~$-*^|c)=TwcjZEp6F%flv3y~7=ul^Dc<8Z}%KgF40x`;cpjk z=6AzOp?elM$I=Vv#YUoNEpW4+2D-79v%!uIt8_anpN#duCPZUBoq~Ern#bH>&Q!0u zT#9sc_7w5ctb}GcPDHbe{|=gE(jb~;SZX3Tf$?El)%p=BXTVMbx^)gT2P?^{o=XnG zw&WZmWo*l^lo4WiRh~}1L(Ku92eRHf8;m=KWI9@N*1{KO2J|^oaFDM~D8~ExG-=#P z<|TQT<`3;36*@@vjz^BdyB*2kN6E-hcn5M6CLNv5C3%bHt?J2e_&iDTle(rjCSP9F zqdlF1423piC@dfkWO!~-mckJZwV$omI$Y+L=Wd=C!)43A{uRGWToHan;#z&yW}sL_ zdbhy_wPv=aK)W-kQ>>%w!<%v%QXI-!9E6>=0iOzX8m*t&lL}sEqC>*#yb8R|?;>@^ zPKvP-R%iH4Se?dUSe-y|nlTiM>z^w5K9di$VqcvA9I?&d)GsIMb+#18e*Jdjlqhw4 zsIPbJ$9tCv2cfm^6VY`($^yc$#(8f>gQvDFYNNbITe$FK6z~l+Wxq zhN(+Eq0NVm^+rtDy&r{p^*dcJ8(uPQ58V}VmYFl4^>Xb;Htk=f_SHcaxp%y}V#pRs zeku3jozVb-t>H| zG3KR*gR^;){IeF%9`wa2F^RI`5RM(B{lUEFyWNmB+{|2fOB_4$ycDrMf^h7D{Fb22 zlUDXX`Q0r|z0uu>{YRz)%5ChrR`$khd_taSz!MszCs_HJEi)0Lr$lm-M6N9%D${o7 z!_#~dKlNxDw2G2OG1WVRQ>|kqv#`by@{2BM*8!4x_1NzXs~0*zE1&G0(raneq6H-3 zPvR1hAv8E{{N|^{9gQD++DLE1*JLqqB)Wi(G_?E9?+@>n_TSPDb;xQXVV}^RoA%nY z|E9h72gf;ak3xH6TI*=9e8&ff%ffzEnbR~wglh>{d0mZ-0z7ZVY4t1l=MK2c7pJp| z-2H)4-?eaDjq*+qS7okcc{i=gByRx!w!e-?tcKfU&D~Gs3?x5b2M1eXH?7_2mxj0w z{I}ubNBbtS2}(3UPq$n*RL}A19PnN!|7ol3<-erl?zdbItsd!c2}3O^k!6C6!M$NL z^w?yH+zyS^Qajxf4qj*%#1`~Uyk)t&#BxS(f7|ZW?&lBeg%mVrU4&z-*D%PNK?Bei zjY**%P*ucnnsuWbF^|X5n?Z9=I_^UkJN>VFxbZ*@zqYr{#6`*y(F^Do+VL=R-as86 z!p#HTn&PcSU<$*9Euw@i2$$ zdNy*&nX%UBta0EHu=n|ww_D8Z2IdUGesQ;l&YIF{d&23;AZiz_;b#^N@$NuLG7tv? z3u$+1>efA^?O0~l8k5t<|Iz*n*!p{*MK2CxG3<7R?J={MeFj!MopYIY0*5tOe2%K@ z1@Q^9;BQA)E#|F8=A{2Bppn_!At~`+IL?hI@ z@ZxF_34N3mh}{QFe)!fx{$SOSB0`r6`wq=|>^#?pfX6k>V8!tEcZ(~lxbtGg&!qz^ z3FAWks8qMbd`Zk{kV-iX681oT1*#D4W9B2HsULde%m!*&Yq58m3f~iHOfBB|!}1!0 zCBcq&fKZ(NGQceM!?rTxtVstjbBAnx~>7sLqr#7 z+Mw^4$-y(&JsMcClK)M9?}$kW7}d4Fz2{O?s6&G~bZa#Z$&yUHiPcBk5yx?ohd~7L z9I4mgY3uN`bwc}DgG)Bx`n8!8Jx`%sGeaT3+vAU;8ErE*xKNa1I^xxy`&=n zazPvDfIOcO-zN2v$_a}nBr)l^Ay(3>Lh5zWlZj@?Cy|~OHTbmo$Z(#0ExL;I81Tsu z{a8uYr0AW<51RUdbO(N%-;X{aA8G2RPQ(@{J~$^I;^p-38KhkXpL+bm+y{8B(#IjZ`1v-D6A2lK}43b$M>g%3X3_hdcJS^ z;8m@It~z_>`zE6ge*|qXVcJXQ5{V<=$^=|_)NR8Rpz8^VVk_qRpi}o}iRDKFn+4c| zpb|BZ=obk2z0pa;m0-<4?e@Xh!<_mQHK!FZAnkY2c>Jeri%ka|Z46n^cT?1nz9VP% zzH4zn){L(T>B!z~=*Zd~+L61P#>dzpdHax8HQ^7Ejg(@7Xsp_!CB8)CLi6AD>OE*L zXGM;{a{GrAr({gFgR?36FzklW%VJ(eamG?T#Mfw?6`3*#xh=K4`XOV-3cGs6a=UTI zT*wmeNCack7M1uzNs-LIV{l(OE8yg@$YfFP>xDH1+6Fj zeg@-Azu+ql%*Y5XRi;*h6}oNonbv+gK6Or&RU^~w1jH=tar@wh=R&-K&;K;OKm45> z7B0LiD>qoj;60i7gvA3+pyHy-;ZDGgfZ{fM6?QtT9)9!CcCTtB?4|Y+ZKZJs>BmFP za9$01KKE-K`~t^R>1F#^SiL00lJ~el^zEiKP0^vzT%i7EIH=DRTsIqZWOHvAuwRX_ z&%F^^j@^jepI6xvWj)P3dLs(d_{@z_xN1WG=K?`b&7a~{H99ee|BWjL582#U4vVd; zjiTUH*)KKUU@VI+G!@nLp@s(j%EwL6D<>_Tp%r_l!M-`++CteBC>4qzcdet^ek zVV@xtxN*>_Wn`FObB(AEhqq)?Uug0sUONA~>B@Ok<&w8whiCbeV&A@q;^X|OORnE; zLD?g`PiVapCG7gY2NRhb3Do(TFH_p3ZG;SH)a>(p7v`&^Ie0 zR#bUFf9?TZF3`v5I+dfDK;=w593+)izCy$$qbrn`lCE@q&CoK6u2IfNnJQzvMIQ#= zt->rPbS64S_n+cTVqUs$&d{@5a$dR+aQC6OK@PrYJJ2^z;xOU+VE>5u>0F4ywDK=>kr}c2{|AcR58!wGQQ|tL-5vcc`8p&dK(+)0Dmsc>)@nLy7MnwY@?yNbFB8aaV8qOw#hR z;%(^n?Kl*iw5h>U)XdBFLz zi5V5;+>p?sCEOd`rM7EJ!n)X3OuVK;Mo4W5{7;eHk)^S(G-(mNQAzQbwGop>!q!s) zJtyP?c$TfaU5^<`{$+Zgi*ktPjKHc4*%MLxghE_&8hbxrOI2O)eZ4B9us83b{$A1= z?3e_9>>#8NX^mWucO)A$VgD<8Pt#z&z*p~pOf;A;5I#I7eP44JN$h}w@&&HNy^npt z4brH~eCiI^+sqSk>(DppQ?Y~J&qHfpFfm1z=x;|{f)k#{gixJ^m2C1PRRzs*?Ybl{ z@D{NCNs_+>W1X==gZ<=~(np=~xO=rM;l($<=plqFb+y$&675uvnjeYM=9H1%)h~~j zg#9^r{8gy(oBCE)ywh#0aD5ov{qNnX$%yao-rTLV+dq`J8p*iW74Fh+)5-h5XYf8G z*PX_vvZj$7L2`g%xBKLX%X|p>bc{W`Af`j=E%J%DXFemo7yCxw{~BK={`0<2U=TnG z^W9(W=IvK=eD5iMnIa>ieRF0A5$(J5+j$jUaaUIh zc*j!GI^J*@x>V${Lr!=jgi}+P)7j#|a>P+wjaJuLjA?1zWNzVT5 zneR+@_MMnVSAB>M9r*nlpQjKypA%-x?occCMBqQ!nND{gKaQ z{s6XiX1@I_^~Z}CZ;f*qsAMhjf~u;hg#}kquSn;}-&Ny$K)#9=RTbb$>J>Ue*AN+w zmSbP#q_;}#@qsE{?2UA)9?tLMO7pv)l5EB9^MdN%NnCm$=##J_5 z4Taq?2J!15qNHLt8B<@LRM~6{d6xI^mdY6TwXc~S{fFpXG4*NFqb_rm+rB({kP^N;O_|2KZ5mANZ$UMRt4xYzO3QDy=d_t-{-?> z!Ya<;Ub+K_wqj%wxBNqgYGHo2`XS7VlJ-#nab2qGFcsX{LhIMrPx32W=3?~uO!>E| za=Q01w>GK5JsCWqv^C?%G9dwc!6l>p<@Xb}Ob~hSSZC*TYDa!=p)igRa4TvFBe0jE z%Ii9u@T*OdYc*Dq$4mrrM`6uE)Sa}F(RY>nJ^F|pWB1qUk%-)VL>}M&E7nct15|re zK798J;HmeB=y|&jIJ=NFW+8*}pnaC)#`W+ECz&7tM;hXHPvSTEI&|UFfKOU0T;}*Y z6&o!54hhoY6Bk^LS`}VS`W!_D4GdxneLoR9pdE#kWm#}=k{mRIaSKWP zfgkY#v=2U3oj?}81igT%;|}?060R`KcnMdSzA3oE<4=X@>5fSIO8%t-j}td6b0Lc) zyRLdf=Wyi(@{l#)VWT6_Dd7r}WTL`;tcG9q(am=t_r~Bo@9^>1lbN<_%R|nRh9bvL zai4@K3{-d#Rk&$`get6aYEMT(`b3=vshojug%8TO!Ut*J7TPg{C+vrR`*9oz80R?{ zd!m6Ws}hSWr^cNmJ%btkR)i%S0nzJbEMdcJGq8kXbj&>d)Cm1+yv^^Fv5c_qmavTc z`6qsZ^Xm_>YYc18(D`LR4Ss~8)Mf19pMI=h`R0D?GE>dK9oE_WBlT2!g!Wt1Qh9iI zErq`ygYz5q4?q9F@f!XS5!pCYMmBy%MmDzj=Zh^`eF*rxhyLZz+(V;)SuBW1zwh)< zx}-=B(fx#3eE(&U4*H{3#@Zd7HT=&m09p4S-t*vX=^<$qmv~?%+x%ZOn*!q$B2racdR`)qdto_yS7B2ai-ss7j-e@`A=n?X+!`_TAnQeaiaiwP#9Dj{p z$^Ynp%`Y_B{LeKRi);8m*?WBc0K5PX)&l1^l<(pTi$D5ubPx`+@@<1fE(@!Kz`Z}@3n&XjtEViw|nbzH(1U;dUq$Ty&LElS@w z{09HR<)PAqPfWd-es0lrj$^0SB!j+mi#ERhFI=n;W!SR=GOP5fj z{|9~XQWHHr({TU4(f_+>pW>VY^bA9~w&gNcp@^uW8D{GE4gcyP^R6S1#VV(s;uCjSwvB_N6D8{Nh~Et`R2gKPE?$3{B6|o-`aWKx1M%XMoOi z@f_&v%53L`;*;#aN+!(YU&{O*epZOHBF;`WnlNCK1h5tvy|5aKXvvTSt*$l==)HW7 z!ue})FWpc4Uy*H9SlQC&AcwWH2y0aO97v7+P}ot9U5{TI;#l77ySmkr1&um-vTYgq zv&wBNyRQW{>UPpC*7h!iKgrUT=EkMtw>K_MR!tgXUEI95g;hy=mAqz?C(m=hbKLU_ z5AR`VS)IaknzOzc`CU6NKlMdEVmWCP>i8TWlH4u!D|zfqNV%)o)}lf!FJQ-WN3-5D z&yy_Pzm&J7=Xg+uv$kvAg=~+*Q`>FJDE(t?Pb*)?zbTF>V#AwNAEh^2KGJSa!!DAQ zr$J{DfvA@u%eEH&AODp`sIF2EB{ow|ki=p8AD5ZG!}eKR^J5-J(Aag9dJ>=?4!{yq zl1**6l2_Xs@^D0p){y`Su(VyxVV4652^wfT(a}o(r9I01km_lV5^QH8TBAJ`?X74% z|GvGIGG?^*rG1I$<9L!VpGk{~Oh%Q0e++UNO{z||r>=;!kE4hey9HT|EY`8r8|<5- zEI4DbrvQbhCMvCZzCC?~&OW(1%|4|%#=br(y?UiR10}Tf$|!Z2{i{)xwZLXbMsAbm zxVNxd)Rb+3=0lClNZRU1J3IvtW6LU^=8kxuKJe**Q0_2xFKZ8U`aeFP;hMZZJ@EMf z-wfZ3ih(rljpk1O3DLh9o^AvA$T8WD^KMx;51Fp)L9W5OTeMLcbc^AchkD2|*ZZpI z6=bRRp!GO6s4)LcV*)KmG*v0 zEEEG)TN!ABBBIpJ5=iU1>k){CGFRzDk6ZmoH%DmRtGv!0!LP9v0nfWA2+y15JaGx& zxk*^wkU0@=Qv56zRlOS8wdJVWwYysMRKq`X@jmzp-S_s&FYTVreX2!O zz5URwu6{oNdEU6_fRjmcCWo%<9MdR*)I@soA`uYM<(oQMm!_EB>-M? zW_D=hGv!mfrL8XWdLUOqz$pL&=wxeA5@;pj=};I7d93Rb1wi{gL3Pua&5ua}JRAtw~ zXDQmD$LyV39f3J$vLg!HZh&m&dV?~9(DS}Pwypo>Y;UNcPmY0pp!P@G_{fwk4LJ>3 z9X)5+xB_Uy!&6wrO5XLx@dKCnHk3wdMGuPqylWf(9`~;|VoM6UVkSx!u_DUu0-P2{ zGy6!gdp!#6J9#|`{z$99Y5lR~g+NX7Wa%nbV3)pTHlf+B&(txr3R?6di0@pwBo zC4DIA(03raiVm@_s`ABH4e8sp4oy(rQVf%*@tP+5WnRP8!zFX5OO?W5-md}Yg>B=r-i>1hsZxVBeVyc zEBVCy0|!1C#h|Z$5hFI%d*1<-6P9CZ>9Mg~;*D|ZM`K4awt49Vnlr1!IkQTfGhxW^ z!OWu{-iF*MWQW7MLqB&Jee+s5Y`dV&AwP-m`Zb6j{|a_o2HGM$3+Y`re3HK|`6m!< zQtTVit_7cJ6YOoEN21M7R}~cHpPXJ+0}IBIwrcohRyS9_z3#32-gQUUwZtWn4!pWq z_lFRm+Sz_Z*&$l}(Upb{+o3;Kgm%~(5f30*kXRXc{4Z@!SaW;N;d3wGs$W8Jn&i*Y9&M7-!@d_ReU_WqPp;>x>+{%bj7E!xA#eT_pXjdnft zG3P49@eq#w4$igkQ_l4Pa(4dgOV0JiS;WW#bNEff%I8`UI}7~(OR&?DJYs;qoe9_g zOvbKsiO*G|Qg(#mwG_G0-W0h#P^$K;*G1Gdb=%x??P|Z~;SkJZ!@39UsvDYh275IJ z{(?{Nm38;n%OPnQk}upb>XH=_@wqZ2ZYv*tsiu%3vsRW0>062bzubJ#z%5n;CW^)(RL(4;y`Y8 zr*=C~e3G8ES@MNO1NoD-|2F#$u`E`j0SoautPy{l3y*Pb?Co1@u}4J?R!OxHMH(yB zWt(l0NA;C9U!sq$S$(Rqg}xM@1|`C<-nN&}`a-KpuuMnm3H2l4SPk|S^0@(@r#HF9 zIW4;97k^BGpRUAPZT?30##gpo-iT}(o7!&9^fnq;GC!Q@&Gs(&mfkAUo9KZ7dQ>vK z<-Q-B>5Y76ORxs+hb~`fw*g}>VKSSzEM(tg0yOTuSzj>0)T>THR!&Z}=pwX#c=I}7 z_O8-;UFVA$AG@T|~()y)Qq`n34`1YanR9c+4cXDxLe^Ym8v7z*d3lsU|{x^7GZ)kA$fkn<9 z?2fiEv466W!;XWZXT`8(Q6BAiluF!6lyv7j}9iwRO(MH5+f&c9g84sSo}VB0GzbF#KSM%Rk*DH zymO+suUBL+O|DJ&Ww8^QnaZAtDR#)2s**>WHK>iBJiK9V;LiEO*!O zrk==@<=%2Pe9+YjQNDtl`qD>eK`=g1V2Ge_jV zIIw1ls$zCa(-n*VWaFioQ;RjgWe6`mapeR4cUKPb$N3Ze`=?hF>yX!`>B>hq7h3tz zz=tB0;=A4V*8yUOv@3GE8CV?y(ak0!JLA&=y?%6+!v7JY&A zolCUB-*lZ|^^RCzZIL2>*UYxJT3V)eQi)TLUx1O^sw#8jX09 zBvfR}+oP>FaL@0qzi9hP^@!Gfo6WTQ_JvYKMG2pT!^`FfU+@;IlH>AIpeM%q3#%UT@RA?Y{Pg(k(9LP}mB5>Z1Wa1C+_w07 z8)EKPz(0Y0&ufd{Db0i^&1Rkh4KK`&J+0nB?CUe3FKHm(?J55KGucKO|UvbTGH+(0w9h1=$#QlhleAmY!!cAL6Z>#T^$Ylw0E1tFG_m8J6%-}KS zpZs&d7^`}btAUl9ILlj~UVQwIzSo7lANP;Nci-zL`XeT*@;3KgbHs9yJLBJSncuh7 z@tl}#Qd*~nVoqb=SY%S1gAtub9-w-tK3j;4FLctjH&F5(U)wbTkC8LocgAEPcFaAvPEbW{0)R`^5ZZ1W(Ht!4%I@!fSv8&TvLZlpDw&L>lYT!c7@LdwjNXU(jOdNti~Q}Bc{bk5eUj%!lwr?wYm%3}oM90fBg>k41mRab zsVP~F$1rp9`wjVj21h^tq~Wxc2VM{2jENg$H4vRc$A-2T?2)@q@Nv~)fN;N{Ew8CWS(tX#5pEn+)FYI(SgAmiXCET^HVtBdU z@gY|Gc^${oDwEegk(JUq^DO^eoJ^{hWWE6Qz4?80ZB0GQAFX|zCrNJ2?4@m5Ev*Yo zMtot#ivN)mk3F8Z@1FFTKB@MVkfW}1uGeZmvwtqFX2Jd#^bBc!i|ZinF(!HV6R)W! zyw3k+l<%DWt&RUu`?=%4q&tUf2shuSJZU4I6BB<7e1$pOc=vWGEwGvC=Pk__QU1CiY~9o>lXlbrbrUdd5&0x}Dx8?;Ns4 zzEXQ`lZZjXK3fvxi9&UB27Yr}0{cIQ&FtO7iGD$oXm+tgPC#n1Hcv8Z_29EUR;5lh zvmzF4X4qY*=OkxlCns`6u(Y%uMwxo-ZCNz4#nLCvZKY2w%dVwQ7XzxFe2wZ-uAgJs zJLq}<*Ap#vmN?PIYUXQAbj~8znP{(tQs zb9jejyn{u4hl#BHFug-6+K=yBs{>5DAHT)6Cg6N&j@Cf;;=6bb0uytY)hx-3_ryCI z(xrDa;~jB`?_^-vb#%{i`F&!U&$CpnM=7IaIkmBJoj%k_{e+BVVqZ{yDetdU<<#j^ zQhf{{{^PkEWN67r8>%OFSUsDVPJTYsNoA?709&1=Rm~II#n|4o@s>uWRpkomcn!*| zO4F%wC_tv{CgxIpd? z>L;ZiR4h9g-#xJyf93tqmtvo&@$S!n28a$)Q179DL`O=wF!}i-aKAEEL>KFrL=!ka zIHn1x9~t+Oe;FteX_4p!bOBm)3RA`=a!KBdY;h67m+TWmewCOO= z6Ga+D9}Ut4lgE+Xk=kuE;<2inCJue`mRz3t0`0p^q4h7bC0bYJPbjl-)MseNcgm@l zK3UB|lJzR-eU*MO$1$CMi>Vhi#1FA^nLXhW!fV?IJ`dP+IU=}dMDsB4gHrK zG{(xI?8p@m=HDCZ?AAJsdNQ!`n)IsobB9KA`8_-1i}VbH?29Ce>5&XwAKubK~61GVI4x-Cduy+yk<1ZZBokrRqodaxvX;j zFD!@Xprl)x+jp@N?J6&ka7eHCpP6dYM+me*2zv>>co>T<|5E z%$I1)p2IriklQ~IeRS76X)fWrI0nPlEh-$uyn;mXn5ZV!N~C z_fEoj%vs|9@_Cz}e4og2cHFW~%x|gAO`?oJb0<@BM>d( znS-?PM65K9%Kd*I9elSAqOXMw65mwnA$dW|Bw9|D`+w+KF0N_j(7KIsO>5O^qyuW* zr_dMVnZwlXlXJ6cXR$W1Z#d>ToQm~0jlI7$ll^up&C!fR>6tTS+96s9{;tpx#yOeB z5j-S~XicF%JH}z6%u^il+Imk=T}t15A8(;`7<9cAbiH*!&^k0+Zc79opy$H+Hs>Ul zovF|*$s8DqeKa1_cFaZM$Kv-jGF>WdP#Yy)wMyo;Wv9i+&!YDIWLWz!X8UmLqV~~TG7M{1g3LE?Ep@JZ zjr#QaWNYyI!#HGm=1SCsuQM}n>iR1aNO_?SYgN}qh+xF~fDr)7m6g894h{HUO| z2R}10jWLC`&jiuN_kI69*=+dQV1Xm(NZM*&|^Ch~U+Ck^&8swJ7 zMBM#-dy@YFFV_aimj=+R0pmnt5-cmxdQG*VO{r8D?%8Vi8*}9E+1sp}|IhDju%543_X!WmbxY5Z<}&dg(4^<@*(aR;f3Qz@ z`ybsW$a`bRU7k#_oxXp1&+r#{+)0j8`gcCgWy*XuLhd(`3c%07f-PxQec&qobXfRobZng%L$)pAD$CFGwB1Cku*7UP0|5%Nz#b$vZRG0oJqDZ z@s?((OYADhi6M;Hznd?f;d}y2p!7+9cQdwta=72cjHB6NKrEdxw6<{6qQX1HVVU`2~{^PCS%vKJa_wn_rND zb3ys$|7X+>)k&%On{EQw-cq1XD4z8}g<&!R$A(MEMlm?qYw9TBd(>9++l&|+aG v3&$cXAaIM=t&m3pfh>Gg$$v>nHFfSn#+KDS?UG9T^Zx^(Dz;Sn?GyhC;-l?~ literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8723ds_config b/rtkbt/vendor/firmware_box/rtl8723ds_config new file mode 100755 index 0000000000000000000000000000000000000000..0015d66a04424941bf2c8c417b4f87a961085534 GIT binary patch literal 75 zcmWGtt=#U)z{4QG)G&!9;OHyKhthx7$1^VB-p9x!B)OZB(dGanivYt01_l9MhX1Uw a49pCS|3Sb(fLnvZz<>eF`G16wkr@DvgBpkc literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8723ds_fw b/rtkbt/vendor/firmware_box/rtl8723ds_fw new file mode 100755 index 0000000000000000000000000000000000000000..566d67432f73ef4b10aea5970815066d78a4bb83 GIT binary patch literal 52896 zcmd443w#r0zCS#ZOwzPX+i55e?rBnE~z3bS`j^ymNF%o6fNkotGHuD zMYp(eM=pCpS`iy5g+Z19mgO(#?u}tceh7Y zxrKr?!S=|DZn;n{bcWg^qMNx&_e{Pu!P3I^$fBn9$O}!()zX4$T#2}Pv1zb(2=W-x zeH@DTP;cxw4Dn%JI%+mEm(*oUdC`7eevmQ94c!N9$ z=O6S2d1W0hXD1qD0clY|dCgnAT&FY0x8ls>`RjNuJJ}!~MYept9p^r?{no zy`rufVAG?2Y*Q1mhB{URlDvk%taC};vNK72?rM~~THK{~jR^+XvJ~y&=H;P?Kk+6n zU%EEJ&UtGBmV8UTGobdGIxL@38~x73>}Tw1ujPnx@5sF?4DxIQ#y+z^=X>Hj>hW1Z zV^QJS3qlJ!TWO&{(t<7;te z&S}4_n_beO^B6j&w6{lQx!46IBFi)Ogw5L5m`hyQ?x)bdYYp=EWr?M_;|a&2OPGpL zURP~Y(uXuBWaHW~+(~YuX8qoPr5SnIOFB%b?~=3ak(q9`s-KO^ALgBP&QhOh))fr# zInN8*9tpBJ7di}qX`QTazlc&Vv39aEakg7Kl1h%-qE9e(l@PV(1$dvOh4-eIU3=a> z>%Uf8_-c6l1@!|7HrA>4xmqkoRJ>)6r6qB*Zfyd}swrbpUn(oro9bVLU_qFQ5Nii~ zr9vNywZh<>N5zVIrOd$;rH|SpuVLQoax=!0mzeTIuiV8;u05P%Q9vJdh8g3u8TxR% zUFbWnvCKi5quepdx2A)+Y>+6`ev!GH(Gwfc6Ek+lG@Ch;S6%jPSz2l8@f3P{iE4RE z=Oi0*MZY8IBxAfVJ^8fdCL9EF;*kzo97gxK6j3G2UT7Favin+8UH`DoKIwoc?dv%DS)h zOHIbQC$+6QZ&Z?0WNNRo7!wmh%Bs8t`szjkHul5-aX7n~Gz?oS`@(KM3EuY)zzh<7mIQ7SqPcHWq zZRJ~+qurizv&;J1wkR`0r{Qxx7a!lJ%!y!S_n7z>H|LN7YUERn_Fdu;>eK9LkI)E} z0-~3d0+O&ftB>(HDTuRAZu)tW^5j?zW=&=C`TuAm8p;$ zYQj52PfOCKNFl%ZXa~P3ciFC2bV0viFX|=y76nX^#y!5gQZ9 zn@y9F)(%)7zBumUeo=+_^TQAV}zzjp6sn^J7{AjyQBcQ{K_qK?R8V@ zG7iq1>k-`SBP+yFp0yX)2TYOv?kys_e2d79U((Bxo5<|1CNHp|9)#*UUUyqHO~{XI-m zvd0oBYqCVLn?PyY29%w#r=zA6Ko{3)&?g-Fgw`nP3+e|e0`�UDOxUS42CBR?k3C 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%0A;}a4B{h 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 DQ{f(K literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8761a_fw b/rtkbt/vendor/firmware_box/rtl8761a_fw new file mode 100755 index 0000000000000000000000000000000000000000..ac99c0cf7831b8a6d853ddb5b4e1d2bfccd336aa GIT binary patch literal 66740 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 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8761at_config b/rtkbt/vendor/firmware_box/rtl8761at_config new file mode 100755 index 0000000000000000000000000000000000000000..f1904fa660a56f4d771b1b082087c27dc67f5a68 GIT binary patch literal 109 zcmWGtt=yi@@P&bck%57MHGqMEhe3d;VG>Kg(N~fWrT?yvW?aIp&cK-bkAac#F(V^G zG$RW)H#b)mBa@KieFjE`az;j*ZHz1e3>z5kFfej32=FreXN_fGW?=je0uBP)8XN`& I3}DWG0KyL+T>t<8 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8761at_fw b/rtkbt/vendor/firmware_box/rtl8761at_fw new file mode 100755 index 0000000000000000000000000000000000000000..b34efe5dc40752283658d48be20e754f11abc496 GIT binary patch literal 67044 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 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8821a_fw b/rtkbt/vendor/firmware_box/rtl8821a_fw new file mode 100755 index 0000000000000000000000000000000000000000..52c150df6fba40dcf7a20ad5e6bc054ac4a41d5a GIT binary patch literal 41184 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 z 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 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8821as_fw b/rtkbt/vendor/firmware_box/rtl8821as_fw new file mode 100755 index 0000000000000000000000000000000000000000..09b8560ea7eeb0ec84598113722bcf70f137265c GIT binary patch literal 40744 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∋pwb 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 ODPBs_^sqb&$O344%fi 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 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8821cs_config b/rtkbt/vendor/firmware_box/rtl8821cs_config new file mode 100755 index 0000000000000000000000000000000000000000..311ee34493e5831558da8651ed62a88f7806f26c GIT binary patch literal 75 zcmWGtt=#U)z{4QG)G&!9;OHyKhthx7$1^VB-p9x!B)OZB(dGanivYt0h9iuO%nSm& a4F6eU8JHOu|AT;o0JjE*fdK=U^B(|ki5iFi literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8821cs_fw b/rtkbt/vendor/firmware_box/rtl8821cs_fw new file mode 100755 index 0000000000000000000000000000000000000000..43cc65ef9b58afcb03a51f03b6b346f94cd3b556 GIT binary patch literal 41712 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 a+5346b8EkF5Ow~${`$fd%oFUFKlpDXc5w0l literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8822b_config b/rtkbt/vendor/firmware_box/rtl8822b_config new file mode 100755 index 0000000000000000000000000000000000000000..17f3985f7247272890586564a970f234e5993511 GIT binary patch literal 56 zcmWGtt=w+Ju#b^RNOCtLqs;+E76FD03`ZClnHdCl8UC}zGB7hR{s#dE0d5Tr0|N#y G=RW|gITLaK literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8822b_fw b/rtkbt/vendor/firmware_box/rtl8822b_fw new file mode 100755 index 0000000000000000000000000000000000000000..6e3f6efe96fb77ba63560a32968cc176d5a7c0e3 GIT binary patch literal 54452 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 literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8822bs_config b/rtkbt/vendor/firmware_box/rtl8822bs_config new file mode 100755 index 0000000000000000000000000000000000000000..311ee34493e5831558da8651ed62a88f7806f26c GIT binary patch literal 75 zcmWGtt=#U)z{4QG)G&!9;OHyKhthx7$1^VB-p9x!B)OZB(dGanivYt0h9iuO%nSm& a4F6eU8JHOu|AT;o0JjE*fdK=U^B(|ki5iFi literal 0 HcmV?d00001 diff --git a/rtkbt/vendor/firmware_box/rtl8822bs_fw b/rtkbt/vendor/firmware_box/rtl8822bs_fw new file mode 100755 index 0000000000000000000000000000000000000000..bfe37d2a92d63595cef40b9bf92e772cb2a82f9a GIT binary patch literal 44972 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