From 57113df3a0e2be01232281fad9a5f2c060567981 Mon Sep 17 00:00:00 2001
From: lin <lin@kickpi.com>
Date: Mon, 25 Aug 2025 12:27:45 +0000
Subject: [PATCH] add vs6621 support in android

---
 android/hardware/seekwave/wlan/wifi_hal/wifi_command.cpp                           |   87 
 android/hardware/seekwave/firmware/SDIO-Fimware/md5.txt                            |    2 
 android/hardware/seekwave/skwbt/include/skw_common.h                               |   47 
 android/hardware/seekwave/wlan/configs/Android.mk                                  |   31 
 android/device/softwinner/common/config/wireless/wireless_config.mk                |   17 
 android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.ini        |  181 +
 android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.ini       |  183 +
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.bin        |    0 
 android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.ini       |  181 +
 android/hardware/seekwave/skwbt/Android.mk                                         |   43 
 android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.ini              |  181 +
 android/hardware/seekwave/skwbt/src/skw_btsnoop.c                                  |  252 +
 android/hardware/seekwave/wlan/wifi_hal/main.cpp                                   | 1895 +++++++++++
 android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp64                  |    0 
 android/hardware/seekwave/wlan/configs/wpa_supplicant_overlay.conf                 |    6 
 android/hardware/aw/wireless/bluetooth/firmware/firmware.mk                        |    1 
 android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_wext.c    |    3 
 android/device/softwinner/ceres-c3/BoardConfig.mk                                  |   15 
 android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.ini               |  181 +
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.ini       |  181 +
 android/hardware/aw/wireless/wlan/config/init.wlan.common.rc                       |    6 
 android/hardware/seekwave/skwbt/src/skw_gen_addr.c                                 |  171 +
 android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_nl80211.c |    3 
 android/hardware/aw/wireless/bluetooth/firmware/seekwave/seekwave-bt.mk            |   23 
 android/hardware/seekwave/wlan/CleanSpec.mk                                        |   49 
 android/hardware/aw/wireless/bluetooth/libbt/common/Android.mk                     |    3 
 android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.bin              |    0 
 android/hardware/seekwave/skwbt/src/skw_log.c                                      |  216 +
 android/hardware/seekwave/wlan/Android.mk                                          |    3 
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.bin       |    0 
 android/hardware/seekwave/firmware/USB-Firmware/md5.txt                            |    2 
 android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160lite.nvbin              |    0 
 android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.bin       |    0 
 android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skwbt.conf                    |   30 
 android/hardware/seekwave/wlan/configs/config-skw.mk                               |   21 
 android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/vendor/seekwave/Android.mk  |   93 
 android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.ini              |  183 +
 android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6316.nvbin                  |    0 
 android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.bin              |    0 
 android/hardware/aw/wireless/wlan/wifi_hal/common/Android.mk                       |    4 
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.ini       |  183 +
 longan/kernel/linux-4.9/drivers/misc/seekwaveplatform_lite/sdio/skw_sdio_main.c    |   32 
 android/device/softwinner/ceres-c3/configs/bluetooth/rtkbt.conf                    |    0 
 android/hardware/seekwave/firmware/USB-Firmware/RAM_RW_KERNEL_DRAM.bin             |    0 
 android/hardware/seekwave/skwbt/include/skw_btsnoop.h                              |   49 
 android/hardware/aw/wireless/hwinfo/hwinfo.rc                                      |    7 
 android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.bin               |    0 
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.bin       |    0 
 android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.ini       |  183 +
 android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.ini              |  183 +
 longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts                          |    2 
 android/hardware/seekwave/firmware/USB-Firmware/ROM_EXEC_KERNEL_IRAM.bin           |    0 
 android/hardware/aw/wireless/bluetooth/libbt/vendor/seekwave/Android.mk            |   38 
 android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_IRAM_SDIO.bin             |    0 
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.ini       |  183 +
 android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.ini       |  591 +++
 android/hardware/seekwave/firmware/device-skw.mk                                   |   24 
 android/hardware/aw/wireless/hwinfo/libhwinfo.c                                    |    6 
 android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_DRAM_SDIO.bin             |    0 
 android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.bin              |    0 
 android/hardware/seekwave/wlan/wpa_supplicant_8_lib/NOTICE                         |   42 
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.ini        |  181 +
 android/hardware/seekwave/skwbt/src/skw_ext.c                                      |  263 +
 android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.bin       |    0 
 android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.bin       |    0 
 android/hardware/seekwave/skwbt/include/scom_vendor.h                              |  219 +
 android/hardware/seekwave/wlan/wpa_supplicant_8_lib/Android.mk                     |   64 
 android/hardware/seekwave/skwbt/include/skw_ext.h                                  |   41 
 android/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc |   10 
 android/hardware/seekwave/skwbt/include/skw_gen_addr.h                             |   19 
 android/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp                    |    2 
 android/hardware/seekwave/skwbt/include/skw_log.h                                  |   23 
 android/hardware/seekwave/wlan/wifi_hal/Android.mk                                 |   36 
 android/frameworks/opt/net/wifi/libwifi_hal/Android.mk                             |    3 
 android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.bin       |    0 
 android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.bin        |    0 
 android/hardware/seekwave/wlan/wifi_hal/NOTICE                                     |   43 
 android/hardware/seekwave/wlan/wpa_supplicant_8_lib/driver_cmd_nl80211.c           |  169 +
 android/hardware/aw/wireless/wlan/config/p2p_supplicant_overlay.conf               |    1 
 android/hardware/seekwave/skwbt/include/bt_vendor_skw.h                            |   64 
 android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.bin       |    0 
 android/hardware/seekwave/firmware/SDIO-Fimware/RAM_RW_KERNEL_DRAM.bin             |    0 
 android/hardware/seekwave/skwbt/src/scom_vendor.c                                  | 1747 +++++++++++
 android/hardware/seekwave/skwbt/src/bt_vendor_skw.c                                |  545 +++
 android/hardware/seekwave/wlan/METADATA                                            |    3 
 android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/Android.mk           |    2 
 android/hardware/aw/wireless/bluetooth/config/init.bluetooth.common.rc             |   11 
 android/hardware/seekwave/firmware/SDIO-Fimware/ROM_EXEC_KERNEL_IRAM.bin           |    0 
 android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp32                  |    0 
 android/hardware/seekwave/wlan/wifi_hal/wifi_command.h                             |   99 
 android/hardware/seekwave/wlan/wpa_supplicant_8_lib/MODULE_LICENSE_BSD             |    0 
 android/hardware/aw/wireless/wlan/wifi_hal/vendor/seekwave/Android.mk              |   56 
 android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160.nvbin                  |    0 
 android/hardware/seekwave/skwbt/skwbt.mk                                           |    8 
 android/hardware/seekwave/wlan/wifi_hal/main.h                                     |   53 
 95 files changed, 9,450 insertions(+), 29 deletions(-)

diff --git a/android/device/softwinner/ceres-c3/BoardConfig.mk b/android/device/softwinner/ceres-c3/BoardConfig.mk
index 5e20043..971835f 100644
--- a/android/device/softwinner/ceres-c3/BoardConfig.mk
+++ b/android/device/softwinner/ceres-c3/BoardConfig.mk
@@ -91,15 +91,16 @@
 
 # wifi and bt configuration
 # 1. Wifi Configuration
-BOARD_WIFI_VENDOR := aic
-BOARD_USR_WIFI    := aic8800
-WIFI_DRIVER_MODULE_PATH := "/vendor/modules/aic8800_fdrv.ko"
-WIFI_DRIVER_MODULE_NAME := "aic8800_fdrv"
-WIFI_DRIVER_MODULE_ARG  := ""
+BOARD_WIFI_VENDOR := common
+BOARD_USR_WIFI    :=
+WIFI_DRIVER_MODULE_PATH :=
+WIFI_DRIVER_MODULE_NAME :=
+WIFI_DRIVER_MODULE_ARG  :=
 
 # 2. Bluetooth Configuration
-BOARD_BLUETOOTH_VENDOR    := aic
-BOARD_HAVE_BLUETOOTH_NAME := aic8800
+BOARD_BLUETOOTH_VENDOR    := common
+BOARD_HAVE_BLUETOOTH_NAME :=
+BOARD_BLUETOOTH_CONFIG_DIR :=  $(PRODUCT_PLATFORM_PATH)/common/wireless/bluetooth
 
 # wifi and bt configuration
 # 1. Wifi Configuration
diff --git a/android/device/softwinner/ceres-c3/configs/bluetooth/rtkbt.conf b/android/device/softwinner/ceres-c3/configs/bluetooth/rtkbt.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/device/softwinner/ceres-c3/configs/bluetooth/rtkbt.conf
diff --git a/android/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc b/android/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc
index 062150b..e08690c 100755
--- a/android/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc
+++ b/android/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc
@@ -35,6 +35,16 @@
     insmod /vendor/modules/aic8800_btlpm.ko
     setprop vendor.init.lpm.load 1
 
+on property:persist.vendor.bluetooth_vendor=seekwave
+    mkdir /data/local/skw 0777 system system
+    insmod /vendor/modules/skw_sdio.ko
+    insmod /vendor/modules/skw_bootcoms.ko log_path=/data/local/skw
+    setprop vendor.init.lpm.load 1
+
+on property:persist.vendor.bluetooth_vendor=seekwave_lite
+    insmod /vendor/modules/skw_sdio_lite.ko
+    setprop vendor.init.lpm.load 1
+
 on property:vendor.driver.lpm.load=1
     setprop vendor.init.lpm.load 1
 
diff --git a/android/device/softwinner/common/config/wireless/wireless_config.mk b/android/device/softwinner/common/config/wireless/wireless_config.mk
index 3b6c392..c5d4859 100755
--- a/android/device/softwinner/common/config/wireless/wireless_config.mk
+++ b/android/device/softwinner/common/config/wireless/wireless_config.mk
@@ -27,8 +27,8 @@
 
 WIRELESS_CONFIG_PATH       := device/softwinner/common/config/wireless
 
-SUPPORTED_WIFI_VENDOR      := broadcom realtek xradio sprd aic ssv common
-SUPPORTED_BLUETOOTH_VENDOR := broadcom realtek xradio sprd aic common
+SUPPORTED_WIFI_VENDOR      := broadcom realtek xradio sprd aic ssv seekwave common
+SUPPORTED_BLUETOOTH_VENDOR := broadcom realtek xradio sprd aic seekwave common
 
 SAVED_PRODUCT_COPY_FILES   := $(PRODUCT_COPY_FILES)
 PRODUCT_COPY_FILES         :=
@@ -100,6 +100,15 @@
         BOARD_HOSTAPD_PRIVATE_LIB   := lib_driver_cmd_ssv
         BOARD_WIRELESS_PROPERTIES   += wifi.direct.interface=p2p0
         -include hardware/ssv/wlan/firmware/$(BOARD_USR_WIFI)/device-ssv.mk
+    else ifeq ($(BOARD_WIFI_VENDOR),seekwave)
+        BOARD_WLAN_DEVICE           := seekwave
+        BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_seekwave
+        BOARD_HOSTAPD_PRIVATE_LIB   := lib_driver_cmd_seekwave
+        # hostapd enable 802.11ax
+        #WIFI_FEATURE_HOSTAPD_11AX := true
+        PRODUCT_PROPERTY_OVERRIDES  += wifi.direct.interface=p2p-dev-wlan0
+        PRODUCT_CFI_INCLUDE_PATHS   += hardware/seekwave/wlan/wpa_supplicant_8_lib
+        $(call inherit-product-if-exists, hardware/seekwave/wlan/configs/config-skw.mk)
     else ifeq ($(BOARD_WIFI_VENDOR),common)
         BOARD_WLAN_DEVICE           := common
         BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_common
@@ -168,6 +177,10 @@
         BOARD_WIRELESS_FILES    += $(TARGET_DEVICE_DIR)/configs/bluetooth/rtkbt.conf:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth/rtkbt.conf
         BOARD_WIRELESS_PACKAGES += libbt-package wireless_hwinfo
         -include hardware/aw/wireless/bluetooth/firmware/firmware.mk
+    else ifeq ($(BOARD_BLUETOOTH_VENDOR),seekwave)
+        BOARD_WIRELESS_FILES    += hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160.nvbin:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth/sv6160.nvbin
+        BOARD_WIRELESS_FILES    += hardware/seekwave/skwbt/vendor/etc/bluetooth/skwbt.conf:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth/skwbt.conf
+        BOARD_WIRELESS_PACKAGES += libbt-vendor-seekwave
     endif
     $(call soong_config_add,vendor,board_bluetooth_vendor,$(BOARD_BLUETOOTH_VENDOR))
 else
diff --git a/android/frameworks/opt/net/wifi/libwifi_hal/Android.mk b/android/frameworks/opt/net/wifi/libwifi_hal/Android.mk
index d7cb70c..313daba 100644
--- a/android/frameworks/opt/net/wifi/libwifi_hal/Android.mk
+++ b/android/frameworks/opt/net/wifi/libwifi_hal/Android.mk
@@ -118,6 +118,9 @@
 else ifeq ($(BOARD_WLAN_DEVICE), aic)
   # support AIC WIFI HAL
   LIB_WIFI_HAL := libwifi-hal-aic
+else ifeq ($(BOARD_WLAN_DEVICE), seekwave)
+  # support seekwave WIFI HAL
+  LIB_WIFI_HAL := libwifi-hal-skw
 else ifeq ($(BOARD_WLAN_DEVICE), common)
   # support aw autodetct WIFI HAL
   LIB_WIFI_HAL := libwifi-hal-autodetect
diff --git a/android/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp b/android/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
index 8365834..93987cb 100644
--- a/android/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
+++ b/android/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
@@ -119,7 +119,7 @@
   char driver_status[PROPERTY_VALUE_MAX];
 #ifdef WIFI_DRIVER_MODULE_PATH
   FILE *proc;
-  char line[sizeof(DRIVER_MODULE_TAG) + 10];
+  char line[sizeof(DRIVER_MODULE_TAG) + 20];
 #endif
 
   if (!property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
diff --git a/android/hardware/aw/wireless/bluetooth/config/init.bluetooth.common.rc b/android/hardware/aw/wireless/bluetooth/config/init.bluetooth.common.rc
index d6a1030..045c594 100755
--- a/android/hardware/aw/wireless/bluetooth/config/init.bluetooth.common.rc
+++ b/android/hardware/aw/wireless/bluetooth/config/init.bluetooth.common.rc
@@ -35,6 +35,17 @@
     insmod /vendor/modules/aic8800_btlpm.ko
     setprop vendor.init.lpm.load 1
 
+on property:persist.vendor.overlay.bluetooth_vendor=seekwave
+    mkdir /data/local/skw 0777 system system
+    insmod /vendor/modules/skw_sdio.ko
+    insmod /vendor/modules/skw_bootcoms.ko log_path=/data/local/skw
+    setprop vendor.init.lpm.load 1
+
+on property:persist.vendor.overlay.bluetooth_vendor=seekwave_lite
+    insmod /vendor/modules/skw_sdio_lite.ko
+    setprop vendor.init.lpm.load 1
+
+
 on property:vendor.driver.lpm.load=1
     setprop vendor.init.lpm.load 1
 
diff --git a/android/hardware/aw/wireless/bluetooth/firmware/firmware.mk b/android/hardware/aw/wireless/bluetooth/firmware/firmware.mk
index fbb4ecd..4f3b5c8 100755
--- a/android/hardware/aw/wireless/bluetooth/firmware/firmware.mk
+++ b/android/hardware/aw/wireless/bluetooth/firmware/firmware.mk
@@ -3,6 +3,7 @@
 -include hardware/aw/wireless/bluetooth/firmware/broadcom/broadcom-bt.mk
 -include hardware/aw/wireless/bluetooth/firmware/sprd/sprd-bt.mk
 -include hardware/aw/wireless/bluetooth/firmware/aic/aic-bt.mk
+-include hardware/aw/wireless/bluetooth/firmware/seekwave/seekwave-bt.mk
 
 # initrc for bluetooth
 PRODUCT_COPY_FILES += \
diff --git a/android/hardware/aw/wireless/bluetooth/firmware/seekwave/seekwave-bt.mk b/android/hardware/aw/wireless/bluetooth/firmware/seekwave/seekwave-bt.mk
new file mode 100755
index 0000000..be2bf56
--- /dev/null
+++ b/android/hardware/aw/wireless/bluetooth/firmware/seekwave/seekwave-bt.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2008 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.
+#
+
+CUR_PATH := hardware/seekwave/skwbt
+
+PRODUCT_COPY_FILES += $(CUR_PATH)/vendor/etc/bluetooth/skwbt.conf:vendor/etc/bluetooth/skwbt.conf
+PRODUCT_COPY_FILES += $(CUR_PATH)/vendor/etc/bluetooth/sv6160.nvbin:vendor/etc/bluetooth/sv6160.nvbin
+PRODUCT_COPY_FILES += $(CUR_PATH)/vendor/etc/bluetooth/sv6316.nvbin:vendor/etc/bluetooth/sv6316.nvbin
+PRODUCT_COPY_FILES += $(CUR_PATH)/vendor/etc/bluetooth/sv6160lite.nvbin:vendor/etc/bluetooth/sv6160lite.nvbin
+-include hardware/seekwave/firmware/device-skw.mk
diff --git a/android/hardware/aw/wireless/bluetooth/libbt/common/Android.mk b/android/hardware/aw/wireless/bluetooth/libbt/common/Android.mk
index 024be37..2fc8736 100755
--- a/android/hardware/aw/wireless/bluetooth/libbt/common/Android.mk
+++ b/android/hardware/aw/wireless/bluetooth/libbt/common/Android.mk
@@ -37,5 +37,6 @@
     libbt-xradio \
     libbt-broadcom \
     libbt-realtek \
-    libbt-sprd
+    libbt-sprd \
+    libbt-skw
 include $(BUILD_PHONY_PACKAGE)
diff --git a/android/hardware/aw/wireless/bluetooth/libbt/vendor/seekwave/Android.mk b/android/hardware/aw/wireless/bluetooth/libbt/vendor/seekwave/Android.mk
new file mode 100755
index 0000000..f8a5d3b
--- /dev/null
+++ b/android/hardware/aw/wireless/bluetooth/libbt/vendor/seekwave/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH := hardware/seekwave/skwbt
+
+include $(CLEAR_VARS)
+
+BDROID_DIR := $(TOP_DIR)system/bt
+ifeq ($(PLATFORM_VERSION),13)
+BDROID_DIR := $(TOP_DIR)packages/modules/Bluetooth/system
+else ifeq ($(PLATFORM_VERSION),14)
+BDROID_DIR := $(TOP_DIR)packages/modules/Bluetooth/system
+endif
+
+LOCAL_SRC_FILES := \
+    src/skw_ext.c \
+    src/bt_vendor_skw.c \
+    src/scom_vendor.c \
+    src/skw_log.c \
+	src/skw_gen_addr.c \
+	src/skw_btsnoop.c 
+
+LOCAL_C_INCLUDES += \
+    $(LOCAL_PATH)/include \
+	$(BDROID_DIR)/hci/include 
+
+LOCAL_C_INCLUDES += $(bdroid_C_INCLUDES)
+LOCAL_CFLAGS += $(bdroid_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := \
+        libcutils \
+        libutils \
+        liblog
+
+LOCAL_MODULE := libbt-skw
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_OWNER := seekwave
+LOCAL_PROPRIETARY_MODULE := true
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/hardware/aw/wireless/hwinfo/hwinfo.rc b/android/hardware/aw/wireless/hwinfo/hwinfo.rc
index 43e2724..764769f 100755
--- a/android/hardware/aw/wireless/hwinfo/hwinfo.rc
+++ b/android/hardware/aw/wireless/hwinfo/hwinfo.rc
@@ -4,3 +4,10 @@
     group system
     capabilities BLOCK_SUSPEND NET_ADMIN
     oneshot
+
+on boot
+    chmod 0660 /sys/class/rfkill/rfkill0/state
+    write /sys/class/rfkill/rfkill0/state 1
+
+on property:init.svc.wl_info=stopped
+    write /sys/class/rfkill/rfkill0/state 0
diff --git a/android/hardware/aw/wireless/hwinfo/libhwinfo.c b/android/hardware/aw/wireless/hwinfo/libhwinfo.c
index 12653bd..dababcb 100755
--- a/android/hardware/aw/wireless/hwinfo/libhwinfo.c
+++ b/android/hardware/aw/wireless/hwinfo/libhwinfo.c
@@ -99,6 +99,8 @@
     {"ssv",      {"libwifi-hal-ssv.so"   }},
     {"sprd",     {"libwifi-hal-sprd.so"  }},
     {"aic",      {"libwifi-hal-aic.so"   }},
+    {"seekwave", {"libwifi-hal-skw.so"   }},
+    {"seekwave_lite",{"libwifi-hal-skw.so"   }},
 };
 
 static const struct info_t libbt_name[] = {
@@ -108,6 +110,8 @@
     {"qualcomm", {"libbt-qualcomm.so"}},
     {"sprd",     {"libbt-sprd.so"    }},
     {"aic",      {"libbt-aic.so"     }},
+    {"seekwave", {"libbt-skw.so"     }},
+    {"seekwave_lite", {"libbt-skw.so"     }},
 };
 
 static const struct info_t wifi_drv_para[] = {
@@ -155,6 +159,8 @@
     {0x13030, "ssv6x5x",       "ssv6x5x",    "ssv6x5x",    "ssv",      0},
     {0x10000, "uwe5622",       "sprdwl_ng",  "sprdwl_ng",  "sprd",     1},
     {0x10145, "aic8800",     "aic8800_fdrv","aic8800_fdrv","aic",      1},
+    {0x10000, "skw",           "skw",        "skw",        "seekwave", 1},
+    {0x16621, "skw6160_lite",  "swt6621s_wifi",   "swt6621s_wifi",        "seekwave_lite", 1},
 };
 
 /* default select invalid if get wifi_hardware_info failed */
diff --git a/android/hardware/aw/wireless/wlan/config/init.wlan.common.rc b/android/hardware/aw/wireless/wlan/config/init.wlan.common.rc
index c90e13c..3d37ee8 100755
--- a/android/hardware/aw/wireless/wlan/config/init.wlan.common.rc
+++ b/android/hardware/aw/wireless/wlan/config/init.wlan.common.rc
@@ -35,3 +35,9 @@
 
 on property:persist.vendor.overlay.wlan_vendor=aic
     setprop wifi.direct.interface p2p-dev-wlan0
+
+on property:persist.vendor.overlay.wlan_vendor=seekwave
+    setprop wifi.direct.interface p2p-dev-wlan0
+
+on property:persist.vendor.overlay.wlan_vendor=seekwave_lite
+    setprop wifi.direct.interface p2p-dev-wlan0
diff --git a/android/hardware/aw/wireless/wlan/config/p2p_supplicant_overlay.conf b/android/hardware/aw/wireless/wlan/config/p2p_supplicant_overlay.conf
index e44c477..4939705 100755
--- a/android/hardware/aw/wireless/wlan/config/p2p_supplicant_overlay.conf
+++ b/android/hardware/aw/wireless/wlan/config/p2p_supplicant_overlay.conf
@@ -1,3 +1,4 @@
+p2p_no_group_iface=1
 disable_scan_offload=1
 wowlan_triggers=any
 p2p_no_go_freq=5170-5740
diff --git a/android/hardware/aw/wireless/wlan/wifi_hal/common/Android.mk b/android/hardware/aw/wireless/wlan/wifi_hal/common/Android.mk
index 68932b9..d497860 100755
--- a/android/hardware/aw/wireless/wlan/wifi_hal/common/Android.mk
+++ b/android/hardware/aw/wireless/wlan/wifi_hal/common/Android.mk
@@ -43,5 +43,7 @@
     libwifi-hal-ssv \
     libwifi-hal-xradio \
     libwifi-hal-rtk \
-    libwifi-hal-bcm
+    libwifi-hal-bcm \
+    libwifi-hal-skw
+
 include $(BUILD_PHONY_PACKAGE)
diff --git a/android/hardware/aw/wireless/wlan/wifi_hal/vendor/seekwave/Android.mk b/android/hardware/aw/wireless/wlan/wifi_hal/vendor/seekwave/Android.mk
new file mode 100755
index 0000000..a1abfbe
--- /dev/null
+++ b/android/hardware/aw/wireless/wlan/wifi_hal/vendor/seekwave/Android.mk
@@ -0,0 +1,56 @@
+# 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.
+
+LOCAL_PATH := hardware/seekwave/wlan/wifi_hal
+
+# Make the HAL library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_CFLAGS := -Wall \
+	    -Werror \
+	    -Wno-format \
+	    -Wno-reorder \
+	    -Wno-unused-function \
+	    -Wno-unused-parameter \
+	    -Wno-unused-private-field \
+	    -Wno-unused-variable \
+	    -Wno-unused-parameter
+
+LOCAL_C_INCLUDES += external/libnl/include \
+		 $(call include-path-for, libhardware_legacy)/hardware_legacy \
+		 external/wpa_supplicant_8/src/drivers \
+		 external/boringssl/include \
+		 external/boringssl/src/crypto/digest \
+		 external/boringssl/src/crypto/evp/
+
+LOCAL_HEADER_LIBRARIES := libutils_headers liblog_headers
+
+LOCAL_SRC_FILES := main.cpp \
+	       wifi_command.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+	libnl \
+	libutils \
+	liblog
+
+LOCAL_MODULE := libwifi-hal-skw
+LOCAL_PROPRIETARY_MODULE := true
+#LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+#LOCAL_LICENSE_CONDITIONS := notice
+#LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
+
+include $(BUILD_SHARED_LIBRARY)
+
+
diff --git a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/Android.mk b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/Android.mk
index 598d6f1..aaa347f 100755
--- a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/Android.mk
+++ b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/Android.mk
@@ -67,6 +67,8 @@
 LOCAL_WHOLE_STATIC_LIBRARIES += lib_driver_cmd_ssv
 LOCAL_WHOLE_STATIC_LIBRARIES += lib_driver_cmd_sprd
 LOCAL_WHOLE_STATIC_LIBRARIES += lib_driver_cmd_aic
+LOCAL_WHOLE_STATIC_LIBRARIES += lib_driver_cmd_skw
+
 LOCAL_CFLAGS := $(L_CFLAGS)
 LOCAL_SRC_FILES := $(WPA_SRC_FILE)
 LOCAL_C_INCLUDES := $(WPA_SUPPL_DIR_INCLUDE)
diff --git a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_nl80211.c b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_nl80211.c
index e2463ab..5c4d6dc 100755
--- a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_nl80211.c
+++ b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_nl80211.c
@@ -12,6 +12,7 @@
 extern driver_cmd_nl80211_cb ssv_nl80211_cb;
 extern driver_cmd_nl80211_cb sprd_nl80211_cb;
 extern driver_cmd_nl80211_cb  aic_nl80211_cb;
+extern driver_cmd_nl80211_cb seekwave_nl80211_cb;
 
 static driver_cmd_nl80211_cb *pcb = NULL;
 
@@ -38,6 +39,8 @@
 		pcb = &sprd_nl80211_cb;
 	else if (strcmp(vendor_name, "aic") == 0)
 		pcb = &aic_nl80211_cb;
+	else if (strcmp(vendor_name, "seekwave") == 0)
+		pcb = &seekwave_nl80211_cb;
 	else
 		return -1;
 
diff --git a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_wext.c b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_wext.c
index a4de396..f69ed22 100755
--- a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_wext.c
+++ b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common/driver_cmd_wext.c
@@ -11,6 +11,7 @@
 extern driver_cmd_wext_cb  xr_wext_cb;
 extern driver_cmd_wext_cb ssv_wext_cb;
 extern driver_cmd_wext_cb aic_wext_cb;
+extern driver_cmd_wext_cb seekwave_wext_cb;
 
 static driver_cmd_wext_cb *pcb = NULL;
 
@@ -35,6 +36,8 @@
 		pcb = &ssv_wext_cb;
 	else if (strcmp(vendor_name, "aic") == 0)
 		pcb = &aic_wext_cb;
+	else if (strcmp(vendor_name, "seekwave") == 0)
+		pcb = &seekwave_wext_cb;
 	else
 		return -1;
 
diff --git a/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/vendor/seekwave/Android.mk b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/vendor/seekwave/Android.mk
new file mode 100755
index 0000000..c0282f9
--- /dev/null
+++ b/android/hardware/aw/wireless/wlan/wpa_supplicant_8_lib/vendor/seekwave/Android.mk
@@ -0,0 +1,93 @@
+#
+# Copyright (C) 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
+
+ifeq ($(WPA_SUPPLICANT_VERSION),VER_0_8_X)
+
+ifneq ($(BOARD_WPA_SUPPLICANT_DRIVER),)
+  CONFIG_DRIVER_$(BOARD_WPA_SUPPLICANT_DRIVER) := y
+endif
+
+WPA_SUPPL_DIR = external/wpa_supplicant_8
+WPA_SRC_FILE :=
+
+include $(WPA_SUPPL_DIR)/wpa_supplicant/android.config
+
+WPA_SUPPL_DIR_INCLUDE = $(WPA_SUPPL_DIR)/src \
+	$(WPA_SUPPL_DIR)/src/common \
+	$(WPA_SUPPL_DIR)/src/drivers \
+	$(WPA_SUPPL_DIR)/src/l2_packet \
+	$(WPA_SUPPL_DIR)/src/utils \
+	$(WPA_SUPPL_DIR)/src/wps \
+	$(WPA_SUPPL_DIR)/wpa_supplicant
+
+ifdef CONFIG_DRIVER_NL80211
+WPA_SUPPL_DIR_INCLUDE += external/libnl/include
+WPA_SRC_FILE += driver_cmd_nl80211.c
+endif
+
+ifdef CONFIG_DRIVER_WEXT
+WPA_SRC_FILE += driver_cmd_wext.c
+endif
+
+ifeq ($(TARGET_ARCH),arm)
+# To force sizeof(enum) = 4
+L_CFLAGS += -mabi=aapcs-linux
+endif
+
+ifdef CONFIG_ANDROID_LOG
+L_CFLAGS += -DCONFIG_ANDROID_LOG
+endif
+
+ifdef CONFIG_P2P
+L_CFLAGS += -DCONFIG_P2P
+endif
+########################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := lib_driver_cmd_skw
+LOCAL_SHARED_LIBRARIES := libc libcutils
+LOCAL_CFLAGS := $(L_CFLAGS)
+#LOCAL_SRC_FILES := $(WPA_SRC_FILE)
+LOCAL_C_INCLUDES := $(WPA_SUPPL_DIR_INCLUDE)
+LOCAL_PROPRIETARY_MODULE := true
+
+LOCAL_C_INCLUDES += hardware/aw/wireless/wlan/wpa_supplicant_8_lib/common
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+SCRIPT_PATH := hardware/aw/wireless/wlan/wpa_supplicant_8_lib/vendor
+VENDOR_PATH := hardware/seekwave/wlan/wpa_supplicant_8_lib
+
+ifdef CONFIG_DRIVER_NL80211
+LOCAL_GENERATED_SOURCES := $(local-generated-sources-dir)/driver_cmd_nl80211.c
+LOCAL_GENERATED_SOURCES += $(local-generated-sources-dir)/driver_cmd_nl80211.h
+LOCAL_GENERATED_SOURCES += $(local-generated-sources-dir)/rtw_version.h
+endif
+
+ifdef CONFIG_DRIVER_WEXT
+LOCAL_GENERATED_SOURCES += $(local-generated-sources-dir)/driver_cmd_wext.c
+LOCAL_GENERATED_SOURCES += $(local-generated-sources-dir)/driver_cmd_wext.h
+endif
+
+$(LOCAL_GENERATED_SOURCES): $(SCRIPT_PATH)/auto-gen-source.sh $(VENDOR_PATH)
+	@echo "Generator: $@"
+	@./$< $^ seekwave $@
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################
+
+endif
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..4b472d6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..8f38b28
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QF_SEEKWAVE_R00005.ini
@@ -0,0 +1,181 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6521QF_20230728
+;优化TX EVM
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit = 0x401420C0,4,0
+RegAddr_Config = 0x401420C0,4,0
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 11,11,11
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 11,11,11
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 20, 20, 20, 19, 19, 19, 17, 17
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 10, 10, 10, 10, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 19, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 13, 13, 13, 11, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 10, 10, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 20, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 13, 13, 10
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 10, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit = 0x40142080,4,1
+RegAddr_Config = 0x40142080,4,1
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 7, 7, 7
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 7, 7, 7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 6, 6, 8, 8, 4, 4, 4, 4
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 5, 5, 5, 5, 6, 6
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 6, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 5, 5, 6
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 8, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit = 0x40142080,16,12
+RegAddr_Config = 0x40142080,16,12
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 4, 4, 4
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 4, 4, 4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 4, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 7, 7, 4, 4, 6, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 8, 6, 6, 6, 8, 4
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 7, 4, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 6, 4
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 4, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..16c90dc
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..7ece14e
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6521QT_SEEKWAVE_R00005.ini
@@ -0,0 +1,183 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6521QT_20230728
+;增加2.4G PA寄存器优化兼容配置
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 5.5, 5.5, 5.5, 4
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 4.5, 5.5, 5, 5, 4.5, 5.3, 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 5, 5.5, 4.5, 5.5, 4.5, 5.5
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 4.5, 4.5
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit= 0x401420C0,4,0(5G RegAddr)
+RegAddr_Config = 0x401420C0,4,0
+;cbw20/cbw40 2g 3个channel 3,7,11
+;RegAddr1,start_bit, stop_bit= 0x401420C8,3,0(2G RegAddr)
+RegAddr_2G_CBW20 = 14,14,15
+;标志位,RegAddr_2G_CBW40 = version, reserved, reserved
+;version = 11:2G采用缺省配置; version = 20: 2G采用配置文件定义值
+RegAddr_2G_CBW40 = 20,11,11
+;cbw20,5g low band 8个channel 36, 40, 44, 48, 52, 56, 60, 64
+RegAddr_5G_LOW_CBW20 = 23, 24, 21, 21, 24, 22, 22, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 11, 13, 11, 13, 13, 13, 15, 15, 13, 13, 12, 12
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 14, 12, 12, 11, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 17, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 11, 13, 14, 13, 12
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 13, 13, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 19, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 11, 14, 11
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 12, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,4,1
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,4,1
+RegAddr_2G_CBW20 = 9, 9, 9
+;cbw40/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,4,1
+RegAddr_2G_CBW40 = 9, 9, 9
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 7, 7, 7, 10, 10, 10, 10, 10, 8, 8, 8, 8
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 12, 12, 12, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 7, 5, 5, 10, 8, 8
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 8, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 10, 8
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 9, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,16,12
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,16,12
+RegAddr_2G_CBW20 = 18, 18, 18
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,16,12
+RegAddr_2G_CBW40 = 18, 18, 18
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 12, 10, 10, 10, 12, 12, 13, 13, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 16, 16, 12, 12, 12, 12, 12, 12
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 10, 10, 6, 13, 10, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 11, 11, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 10, 12, 12
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 13, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..16c90dc
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..d0e942d
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621QT_SEEKWAVE_R00005.ini
@@ -0,0 +1,183 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6621QT_20230728
+;增加2.4G PA寄存器优化兼容配置
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 5.5, 5.5, 5.5, 4
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 4.5, 5.5, 5, 5, 4.5, 5.3, 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 5, 5.5, 4.5, 5.5, 4.5, 5.5
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 4.5, 4.5
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit= 0x401420C0,4,0(5G RegAddr)
+RegAddr_Config = 0x401420C0,4,0
+;cbw20/cbw40 2g 3个channel 3,7,11
+;RegAddr1,start_bit, stop_bit= 0x401420C8,3,0(2G RegAddr)
+RegAddr_2G_CBW20 = 14,14,15
+;标志位,RegAddr_2G_CBW40 = version, reserved, reserved
+;version = 11:2G采用缺省配置; version = 20: 2G采用配置文件定义值
+RegAddr_2G_CBW40 = 20,11,11
+;cbw20,5g low band 8个channel 36, 40, 44, 48, 52, 56, 60, 64
+RegAddr_5G_LOW_CBW20 = 23, 24, 21, 21, 24, 22, 22, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 11, 13, 11, 13, 13, 13, 15, 15, 13, 13, 12, 12
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 14, 12, 12, 11, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 17, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 11, 13, 14, 13, 12
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 13, 13, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 19, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 11, 14, 11
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 12, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,4,1
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,4,1
+RegAddr_2G_CBW20 = 9, 9, 9
+;cbw40/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,4,1
+RegAddr_2G_CBW40 = 9, 9, 9
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 7, 7, 7, 10, 10, 10, 10, 10, 8, 8, 8, 8
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 12, 12, 12, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 7, 5, 5, 10, 8, 8
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 8, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 10, 8
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 9, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,16,12
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,16,12
+RegAddr_2G_CBW20 = 18, 18, 18
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,16,12
+RegAddr_2G_CBW40 = 18, 18, 18
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 12, 10, 10, 10, 12, 12, 13, 13, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 16, 16, 12, 12, 12, 12, 12, 12
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 10, 10, 6, 13, 10, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 11, 11, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 10, 12, 12
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 13, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..4b472d6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..9b2c945
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/EA6621Q_SEEKWAVE_R00005.ini
@@ -0,0 +1,181 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6621QF_20230728
+;优化TX EVM
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit = 0x401420C0,4,0
+RegAddr_Config = 0x401420C0,4,0
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 11,11,11
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 11,11,11
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 20, 20, 20, 19, 19, 19, 17, 17
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 10, 10, 10, 10, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 19, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 13, 13, 13, 11, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 10, 10, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 20, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 13, 13, 10
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 10, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit = 0x40142080,4,1
+RegAddr_Config = 0x40142080,4,1
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 7, 7, 7
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 7, 7, 7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 6, 6, 8, 8, 4, 4, 4, 4
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 5, 5, 5, 5, 6, 6
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 6, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 5, 5, 6
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 8, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit = 0x40142080,16,12
+RegAddr_Config = 0x40142080,16,12
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 4, 4, 4
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 4, 4, 4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 4, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 7, 7, 4, 4, 6, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 8, 6, 6, 6, 8, 4
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 7, 4, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 6, 4
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 4, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/RAM_RW_KERNEL_DRAM.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/RAM_RW_KERNEL_DRAM.bin
new file mode 100755
index 0000000..b905f8d
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/RAM_RW_KERNEL_DRAM.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/ROM_EXEC_KERNEL_IRAM.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/ROM_EXEC_KERNEL_IRAM.bin
new file mode 100755
index 0000000..f51c69d
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/ROM_EXEC_KERNEL_IRAM.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_DRAM_SDIO.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_DRAM_SDIO.bin
new file mode 100755
index 0000000..d4da86f
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_DRAM_SDIO.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_IRAM_SDIO.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_IRAM_SDIO.bin
new file mode 100755
index 0000000..d564762
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_IRAM_SDIO.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.bin b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.bin
new file mode 100755
index 0000000..7746053
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.ini b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.ini
new file mode 100755
index 0000000..da3da52
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.ini
@@ -0,0 +1,591 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = XW_SDIO_V3.0
+;优化TX EVM
+;-----------------------------------------------------------------------------
+
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 22, 22, 22, 22
+;G_TXPWR11B_UQ2_DIV = 22, 22, 22, 22
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 21, 21, 21, 21, 21, 21, 21, 19
+;G_TXPWRNONHTDUP2G_UQ2_DIV = 21, 21, 21, 21, 21, 21, 21, 19
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 21, 21, 21, 21, 21, 21, 21, 19, 21, 21, 21, 21, 21, 21, 21, 19
+;G_TXPWRNONHTDUP5G_UQ2_DIV = 21, 21, 21, 21, 21, 21, 21, 19, 21, 21, 21, 21, 21, 21, 21, 19
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 20, 20, 20, 20, 20, 20, 20, 18, 18, 15, 15, 12, 12, 20, 20, 20, 20, 20, 20, 20, 18, 18, 15, 15, 12, 12
+;G_TXPWRMCS2G_UQ2_DIV = 20, 20, 20, 20, 20, 20, 20, 18, 18, 15, 15, 12, 12, 20, 20, 20, 20, 20, 20, 20, 18, 18, 15, 15, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 19, 19, 19, 19, 19, 19, 19, 17, 17, 14, 14, 12, 12, 19, 19, 19, 19, 19, 19, 19, 17, 17, 14, 14, 12, 12, 18, 18, 18, 18, 18, 18, 18, 16, 16, 13, 13, 11, 11
+;G_TXPWRMCS5G_UQ2_DIV = 19, 19, 19, 19, 19, 19, 19, 17, 17, 14, 14, 12, 12, 19, 19, 19, 19, 19, 19, 19, 17, 17, 14, 14, 12, 12, 18, 18, 18, 18, 18, 18, 18, 16, 16, 13, 13, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15
+;TBMAXTXPWR5G_UQ3_DIV = 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15
+TBMAXTXPWR2G_UQ3 = 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15
+;TBMAXTXPWR2G_UQ3_DIV = 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 19, 19, 17, 16, 15
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+;TBMINTXPWR_SQ2_DIV = 00, 00
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;G_TXPWR11B_UQ2_DELTA_DIV = 00, 00, 00, 00
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;G_TXPWRNONHTDUP2G_UQ2_DELTA_DIV = 00, 00, 00, 00, 00, 00, 00, 00
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;G_TXPWRNONHTDUP5G_UQ2_DELTA_DIV = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;G_TXPWRMCS2G_UQ2_DELTA_DIV = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;G_TXPWRMCS5G_UQ2_DELTA_DIV = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;TBMAXTXPWR5G_UQ3_DELTA_DIV = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;TBMAXTXPWR2G_UQ3_DELTA_DIV = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;TBMINTXPWR_SQ2_DELTA_DIV = 00, 00
+
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;---------------Primary-------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+G_COMPCHANTXPWR6G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+G_COMPCHANTXPWR6G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+G_COMPCHANTXPWR6G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+G_COMPCHANTXPWR6G_LOW_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+G_COMPCHANTXPWR6G_MID_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+G_COMPCHANTXPWR6G_LOW_CBW80_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+[CHAN_RSSI_COMPINFO]
+;-----------------------------------------------------------------------------
+;---------------Primary-------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿RSSI,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANRSSI2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANRSSI2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANRSSI5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANRSSI5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANRSSI5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANRSSI5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANRSSI5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANRSSI5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANRSSI5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANRSSI5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANRSSI5G_HIGH_CBW80_SQ2 = 0,0
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+G_COMPCHANRSSI6G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+G_COMPCHANRSSI6G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+G_COMPCHANRSSI6G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+G_COMPCHANRSSI6G_LOW_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+G_COMPCHANRSSI6G_MID_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+G_COMPCHANRSSI6G_LOW_CBW80_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+[RegAddr1]
+;---------------------------PRI_5GTX_PAInMatchH1-------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PAInMatchH1 -- 40148894 [21 = 17]
+RegAddr_Config = 0x40148894,21,17
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  22, 22, 22, 21, 21, 21, 20, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  18, 17, 17, 16, 16, 16, 15, 15, 15, 15, 14, 14
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  14, 13, 13, 13, 12, 13, 13, 13
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  22, 21, 21, 20
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  17, 17, 16, 15, 15, 14
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  13, 13, 13, 13
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  21, 20
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  17, 16, 15
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  13, 13
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 9
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  12, 12, 12, 12, 11, 11, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 5
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  5, 4, 4, 4, 3, 3, 2, 2, 2
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  12, 12, 11, 10, 9, 9, 8, 7, 6, 5, 5, 4, 3, 2
+;-----------------------------------------------------------------------------
+
+[RegAddr2]
+;---------------------------PRI_5GTX_PAInMatchL1-------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PAInMatchL1 -- 40144890 [26 = 22]
+RegAddr_Config = 0x40148890,21,17
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  22, 22, 22, 21, 21, 21, 20, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  18, 17, 17, 16, 16, 16, 15, 15, 15, 15, 14, 14
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  14, 13, 13, 13, 13, 13, 13, 13
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  22, 21, 21, 20
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  17, 17, 16, 15, 15, 14
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  13, 13, 13, 13
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  21, 20
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  17, 16, 15
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  13, 13
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 9
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  12, 12, 12, 12, 11, 11, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 5
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  5, 4, 4, 4, 3, 3, 2, 2, 2
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  12, 12, 11, 10, 9, 9, 8, 7, 6, 5, 5, 4, 3, 2
+;-----------------------------------------------------------------------------
+
+[RegAddr3]
+;---------------------------PRI_5GTX_PABiasH1---------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasH1 -- 4014888C [11 = 7]
+RegAddr_Config = 0x4014888C,11,7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  15, 16, 14, 15, 16, 14, 14, 16
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  10, 10, 13, 10, 7, 9, 8, 5, 5, 6, 3, 2
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  3, 25, 0, 25, 1, 2, 2, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  16, 14, 16, 15
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  11, 12, 8, 7, 6, 3
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  2, 2, 11, 11
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  15, 14
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  11, 8, 5
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  25, 11
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 18, 18, 18, 18, 18, 18
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 18, 18, 18, 18
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  18, 18, 18, 18, 18, 18, 18, 18, 18
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  13, 13, 13, 13, 13, 13, 13, 13, 18, 18, 18, 18, 18, 18
+;-----------------------------------------------------------------------------
+
+[RegAddr4]
+;-------------------------PRI_5GTX_PABiasH2-----------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasH2 -- 4014888C [23 = 20]
+RegAddr_Config = 0x4014888C,23,20
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  11, 11, 11, 11, 11, 10, 11, 12
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  8, 8, 9, 6, 6, 8, 5, 4, 6, 6, 3, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  5, 3, 3, 5, 4, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  12, 11, 10, 11
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  8, 8, 7, 5, 6, 3
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  5, 5, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  10, 9
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  8, 7, 5
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  4, 6
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  7, 7, 7, 7, 7, 7, 7, 7, 7
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7
+;-----------------------------------------------------------------------------
+
+[RegAddr5]
+;---------------------------PRI_5GTX_PABiasH3---------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasH3 -- 4014888C [30]
+RegAddr_Config = 0x4014888C,24,24
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  1, 1, 1, 1
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  1, 1, 1, 1, 1, 1
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  1, 1, 1, 1
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  1, 1
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  1, 1, 1
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  1, 1
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;-----------------------------------------------------------------------------
+
+[RegAddr6]
+;--------------------------PRI_5GTX_PABiasH4----------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasH4 -- 4014888C [6 = 4]
+RegAddr_Config = 0x4014888C,6,4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  3, 3, 3, 3, 3, 3, 3, 3
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  3, 1, 3, 1, 3, 2, 2, 2
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  3, 3, 3, 3
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  3, 3, 3, 3, 3, 3
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  3, 3, 2, 2
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  3, 3
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  3, 3, 3
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  1, 2
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;-----------------------------------------------------------------------------
+
+[RegAddr7]
+;--------------------------PRI_5GTX_PABiasL1----------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasL1 -- 40144888 [11 = 7]
+RegAddr_Config = 0x40148888,11,7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  15, 16, 14, 15, 16, 14, 14, 16
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  10, 10, 13, 10, 7, 9, 8, 5, 5, 6, 3, 2
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  28, 25, 0, 1, 25, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  16, 14, 16, 15
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  11, 12, 8, 7, 6, 3
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  2, 2, 11, 11
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  15, 14
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  11, 8, 5
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  25, 11
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 18, 18, 18, 18, 18, 18
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 18, 18, 18, 18
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  18, 18, 18, 18, 18, 18, 18, 18, 18
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  13, 13, 13, 13, 13, 13, 13, 13, 18, 18, 18, 18, 18, 18
+;-----------------------------------------------------------------------------
+
+[RegAddr8]
+;-------------------------PRI_5GTX_PABiasL2-----------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasL2 -- 40144888 [29 = 26]
+RegAddr_Config = 0x40148888,23,20
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  11, 11, 11, 11, 11, 10, 11, 12
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  8, 8, 9, 6, 6, 8, 5, 4, 6, 6, 3, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  5, 3, 3, 4, 4, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  12, 11, 10, 11
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  8, 8, 7, 5, 6, 3
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  5, 5, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  10, 9
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  8, 7, 5
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  4, 6
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  7, 7, 7, 7, 7, 7, 7, 7, 7
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7
+;-----------------------------------------------------------------------------
+
+[RegAddr9]
+;------------------------PRI_5GTX_PABiasL3-------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasL3 -- 40144888 [30]
+RegAddr_Config = 0x40148888,24,24
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  1, 1, 1, 1
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  1, 1, 1, 1, 1, 1
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  1, 1, 1, 1
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  1, 1
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  1, 1, 1
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  1, 1
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  1, 1, 1, 1, 1, 1, 1, 1, 1
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+;-----------------------------------------------------------------------------
+
+[RegAddr10]
+;------------------------PRI_5GTX_PABiasL4------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_5GTX_PABiasL4 -- 40144888 [11 = 9]
+RegAddr_Config = 0x40148888,6,4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 =  3, 3, 3, 3, 3, 3, 3, 3
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 =  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 =  1, 1, 3, 3, 1, 2, 2, 2
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 =  3, 3, 3, 3
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 =  3, 3, 3, 3, 3, 3
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 =  3, 3, 2, 2
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 =  3, 3
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 =  3, 3, 3
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 =  1, 2
+;cbw20,6g low band 20个channel 187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,
+RegAddr_6G_LOW_CBW20 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw20,6g mid band 20个 channel 267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,
+RegAddr_6G_MID_CBW20 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw20,6g high band 20个 channel 347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,
+RegAddr_6G_HIGH_CBW20 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw40,6g low band 20个channel 193,201,209,217,225,233,241,249,257,265,273,281,289,297,305,313,321,329,337,345,
+RegAddr_6G_LOW_CBW40 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw40,6g mid band 9个 channel 353,361,369,377,385,393,401,409,417,
+RegAddr_6G_MID_CBW40 =  2, 2, 2, 2, 2, 2, 2, 2, 2
+;cbw80,6g low band 14个 channel 197,213,229,245,261,277,293,309,325,341,357,373,389,405,
+RegAddr_6G_LOW_CBW80 =  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+;------------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+
+[RegAddr25]
+;------------------------PRI_2GTX_PAInMatch HP------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_2GTX_PAInMatch -- 401448BC [21 = 17]
+RegAddr_Config = 0x401488BC,21,17
+;cbw20 2g 3个channel段 1~4,5~9,10~13
+RegAddr_2G_CBW20 =  21, 20, 19
+;cbw40 2g 3个channel段 3~4,5~9,10~11
+RegAddr_2G_CBW40 =  21, 20, 19
+;-----------------------------------------------------------------------------
+
+[RegAddr26]
+;------------------------PRI_2GTX_HP_PABias1------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_2GTX_PABias1 -- 401448B4 [17 = 13]
+RegAddr_Config = 0x401488B4,11,7
+;cbw20 2g 3个channel段 1~4,5~9,10~13
+RegAddr_2G_CBW20 =  10, 11, 14
+;cbw40 2g 3个channel段 3~4,5~9,10~11
+RegAddr_2G_CBW40 =  10, 11, 14
+;-----------------------------------------------------------------------------
+
+[RegAddr27]
+;------------------------PRI_2GTX_HP_PABias2------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_2GTX_PABias2 -- 401448B4 [29 = 26]
+RegAddr_Config = 0x401488B4,23,20
+;cbw20 2g 3个channel段 1~4,5~9,10~13
+RegAddr_2G_CBW20 =  7, 7, 10
+;cbw40 2g 3个channel段 3~4,5~9,10~11
+RegAddr_2G_CBW40 =  7, 7, 10
+;-----------------------------------------------------------------------------
+
+[RegAddr28]
+;------------------------PRI_2GTX_HP_PABias3------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_2GTX_PABias2 -- 401448B4 [29 = 26]
+RegAddr_Config = 0x401488B4,24,24
+;cbw20 2g 3个channel段 1~4,5~9,10~13
+RegAddr_2G_CBW20 =  1, 1, 1
+;cbw40 2g 3个channel段 3~4,5~9,10~11
+RegAddr_2G_CBW40 =  1, 1, 1
+;-----------------------------------------------------------------------------
+
+[RegAddr29]
+;------------------------PRI_2GTX_HP_PABias4------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;PRI_2GTX_PABias2 -- 401448B4 [29 = 26]
+RegAddr_Config = 0x401488B4,6,4
+;cbw20 2g 3个channel段 1~4,5~9,10~13
+RegAddr_2G_CBW20 =  2, 2, 2
+;cbw40 2g 3个channel段 3~4,5~9,10~11
+RegAddr_2G_CBW40 =  2, 2, 2
+;-----------------------------------------------------------------------------
+;------------------------------------------------------------------------------
+
+[CAL_RESULT_INFO_EN]
+;-----------------------------------------------------------------------------
+;0:配置文件中[CAL_RESULT_INFO]参数不生效
+;1:配置文件中[CAL_RESULT_INFO]参数生效
+;uint8
+CAL_RESULT_INFO_EN = 0
+
+[CAL_RESULT_INFO]
+;-----------------------------------------------------------------------------
+;CAL_RESULT_BITMAP = FFFFFFFF  bitmap是用于指示是否写入efuse以及如何写入的,第一次传递过去必须是0,表示不写入,后续校准结束后根据校准结果写入
+;赋值的数值必须是16进制,并且需要字符将所有位置填满,比如16位的0需要写成0000,32位的3需要写出00000003
+RSV0 = 00
+DCXO = 40
+TEMPTURE = 0000
+;2.4G
+B2_TX_DELTA_GAIN = 04, 01, 01, 01, FC, FD, F9, F9, F3, F8, F1, F0
+;B2_MIMO_TX_GAIN_DIFF = 04, 01, 01, 01
+B2_RX_LIMIT_DELTA_GAIN = 22, 20, 23, 21, 25, 21
+B2_RX_NORMAL_DELTA_GAIN = 20, 20, 20, 20, 23, 24, 22
+;B2_MIMO_RX_GAIN_DIFF = 04, 01, 01, 01, 20, 23, 21, 25, 21
+;5G&6G
+B5_TX_DELTA_GAIN = F9, F8, F8, FA, EF, EE, EE, F0, F4, F2, F3, F4, FA, F9, FA, FA, F8, F6, F6, F6, F4, F1, F0, F1, F7, F5, F5, F5, FB, F8, F7, F7, FA, F7, F7, F7, F7, F4, F4, F4, F6, F3, F4, F4, F9, F8, F8, FA, EF, EE, EE, F0, F4, F2, F3, F4, FA, F9, FA, FA, F8, F6, F6, F6, F4, F1, F0, F1, F7, F5, F5, F5, FB, F8, F7, F7, FA, F7, F7, F7, F7, F4, F4, F4, F6, F3, F4, F4
+;B5_MIMO_TX_GAIN_DIFF = 04, 01, 01, 01, 20, 20, 20, 23, 24, 22, 24, 22, 04, 01, 01, 01, 20, 20, 20, 23, 24, 22, 24, 22
+B5_RX_LIMIT_DELTA_GAIN = 0B, 12, 08, 12, 08, 12, 03, 0E, FC, 0B, FC, 09, FA, 09, F9, 06, F7, 04, F6, 03, F5, 00, 0B, 12, 08, 12, 08, 12, 03, 0E, FC, 0B, FC, 09, FA, 09, F9, 06, F7, 04, F6, 03, F5, 00
+B5_RX_NORMAL_DELTA_GAIN = 0E, 0D, 11, 0D, 0F, 1A, 18, 05, 05, 0C, 0F, 0E, 11, 10, FA, FA, 02, 09, 07, 04, 04, 0E, 0D, 11, 0D, 0F, 1A, 18, 05, 05, 0C, 0F, 0E, 11, 10, FA, FA, 02, 09, 07, 04, 04
+;B5_MIMO_RX_GAIN_DIFF = 0B, 12, 08, 12, 08, 12, 03, 0E, FC, 0B, FC, 09, FA, 09, F9, 06, F7, 04, F6, 03, F5, 00, 20, 20, 23, 24, 22, 0B, 12, 08, 12, 08, 12, 03, 0E, FC, 0B, FC, 09, FA, 09, F9, 06, F7, 04, F6, 03, F5, 00, 20, 20, 23, 24, 22
+RSV1 = 00, 00, 00,00,00
+;------------------------------------------------------------------------------
+
diff --git a/android/hardware/seekwave/firmware/SDIO-Fimware/md5.txt b/android/hardware/seekwave/firmware/SDIO-Fimware/md5.txt
new file mode 100755
index 0000000..081b639
--- /dev/null
+++ b/android/hardware/seekwave/firmware/SDIO-Fimware/md5.txt
@@ -0,0 +1,2 @@
+324299e2905e6dcc7efdf845a0b9c74d  RAM_RW_KERNEL_DRAM.bin
+bfcf9d462a2082e9b75d1495a869b8b1  ROM_EXEC_KERNEL_IRAM.bin
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..4b472d6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..8f38b28
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QF_SEEKWAVE_R00005.ini
@@ -0,0 +1,181 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6521QF_20230728
+;优化TX EVM
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit = 0x401420C0,4,0
+RegAddr_Config = 0x401420C0,4,0
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 11,11,11
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 11,11,11
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 20, 20, 20, 19, 19, 19, 17, 17
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 10, 10, 10, 10, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 19, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 13, 13, 13, 11, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 10, 10, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 20, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 13, 13, 10
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 10, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit = 0x40142080,4,1
+RegAddr_Config = 0x40142080,4,1
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 7, 7, 7
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 7, 7, 7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 6, 6, 8, 8, 4, 4, 4, 4
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 5, 5, 5, 5, 6, 6
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 6, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 5, 5, 6
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 8, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit = 0x40142080,16,12
+RegAddr_Config = 0x40142080,16,12
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 4, 4, 4
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 4, 4, 4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 4, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 7, 7, 4, 4, 6, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 8, 6, 6, 6, 8, 4
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 7, 4, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 6, 4
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 4, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..16c90dc
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..7ece14e
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6521QT_SEEKWAVE_R00005.ini
@@ -0,0 +1,183 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6521QT_20230728
+;增加2.4G PA寄存器优化兼容配置
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 5.5, 5.5, 5.5, 4
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 4.5, 5.5, 5, 5, 4.5, 5.3, 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 5, 5.5, 4.5, 5.5, 4.5, 5.5
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 4.5, 4.5
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit= 0x401420C0,4,0(5G RegAddr)
+RegAddr_Config = 0x401420C0,4,0
+;cbw20/cbw40 2g 3个channel 3,7,11
+;RegAddr1,start_bit, stop_bit= 0x401420C8,3,0(2G RegAddr)
+RegAddr_2G_CBW20 = 14,14,15
+;标志位,RegAddr_2G_CBW40 = version, reserved, reserved
+;version = 11:2G采用缺省配置; version = 20: 2G采用配置文件定义值
+RegAddr_2G_CBW40 = 20,11,11
+;cbw20,5g low band 8个channel 36, 40, 44, 48, 52, 56, 60, 64
+RegAddr_5G_LOW_CBW20 = 23, 24, 21, 21, 24, 22, 22, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 11, 13, 11, 13, 13, 13, 15, 15, 13, 13, 12, 12
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 14, 12, 12, 11, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 17, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 11, 13, 14, 13, 12
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 13, 13, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 19, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 11, 14, 11
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 12, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,4,1
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,4,1
+RegAddr_2G_CBW20 = 9, 9, 9
+;cbw40/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,4,1
+RegAddr_2G_CBW40 = 9, 9, 9
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 7, 7, 7, 10, 10, 10, 10, 10, 8, 8, 8, 8
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 12, 12, 12, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 7, 5, 5, 10, 8, 8
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 8, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 10, 8
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 9, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,16,12
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,16,12
+RegAddr_2G_CBW20 = 18, 18, 18
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,16,12
+RegAddr_2G_CBW40 = 18, 18, 18
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 12, 10, 10, 10, 12, 12, 13, 13, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 16, 16, 12, 12, 12, 12, 12, 12
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 10, 10, 6, 13, 10, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 11, 11, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 10, 12, 12
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 13, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..16c90dc
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..d0e942d
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6621QT_SEEKWAVE_R00005.ini
@@ -0,0 +1,183 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6621QT_20230728
+;增加2.4G PA寄存器优化兼容配置
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 5.5, 5.5, 5.5, 4
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 4.5, 5.5, 5, 5, 4.5, 5.3, 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 5, 5.5, 4.5, 5.5, 4.5, 5.5
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 4.5, 4.5
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit= 0x401420C0,4,0(5G RegAddr)
+RegAddr_Config = 0x401420C0,4,0
+;cbw20/cbw40 2g 3个channel 3,7,11
+;RegAddr1,start_bit, stop_bit= 0x401420C8,3,0(2G RegAddr)
+RegAddr_2G_CBW20 = 14,14,15
+;标志位,RegAddr_2G_CBW40 = version, reserved, reserved
+;version = 11:2G采用缺省配置; version = 20: 2G采用配置文件定义值
+RegAddr_2G_CBW40 = 20,11,11
+;cbw20,5g low band 8个channel 36, 40, 44, 48, 52, 56, 60, 64
+RegAddr_5G_LOW_CBW20 = 23, 24, 21, 21, 24, 22, 22, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 11, 13, 11, 13, 13, 13, 15, 15, 13, 13, 12, 12
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 14, 12, 12, 11, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 17, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 11, 13, 14, 13, 12
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 13, 13, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 19, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 11, 14, 11
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 12, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,4,1
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,4,1
+RegAddr_2G_CBW20 = 9, 9, 9
+;cbw40/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,4,1
+RegAddr_2G_CBW40 = 9, 9, 9
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 7, 7, 7, 10, 10, 10, 10, 10, 8, 8, 8, 8
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 12, 12, 12, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 7, 5, 5, 10, 8, 8
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 8, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 10, 8
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 9, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,16,12
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,16,12
+RegAddr_2G_CBW20 = 18, 18, 18
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,16,12
+RegAddr_2G_CBW40 = 18, 18, 18
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 12, 10, 10, 10, 12, 12, 13, 13, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 16, 16, 12, 12, 12, 12, 12, 12
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 10, 10, 6, 13, 10, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 11, 11, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 10, 12, 12
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 13, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..4b472d6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..9b2c945
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/EA6621Q_SEEKWAVE_R00005.ini
@@ -0,0 +1,181 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6621QF_20230728
+;优化TX EVM
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit = 0x401420C0,4,0
+RegAddr_Config = 0x401420C0,4,0
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 11,11,11
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 11,11,11
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 20, 20, 20, 19, 19, 19, 17, 17
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 10, 10, 10, 10, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 19, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 13, 13, 13, 11, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 10, 10, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 20, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 13, 13, 10
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 10, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit = 0x40142080,4,1
+RegAddr_Config = 0x40142080,4,1
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 7, 7, 7
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 7, 7, 7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 6, 6, 8, 8, 4, 4, 4, 4
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 5, 5, 5, 5, 6, 6
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 6, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 5, 5, 6
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 8, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit = 0x40142080,16,12
+RegAddr_Config = 0x40142080,16,12
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 4, 4, 4
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 4, 4, 4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 4, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 7, 7, 4, 4, 6, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 8, 6, 6, 6, 8, 4
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 7, 4, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 6, 4
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 4, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/RAM_RW_KERNEL_DRAM.bin b/android/hardware/seekwave/firmware/USB-Firmware/RAM_RW_KERNEL_DRAM.bin
new file mode 100755
index 0000000..0ae42c6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/RAM_RW_KERNEL_DRAM.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/ROM_EXEC_KERNEL_IRAM.bin b/android/hardware/seekwave/firmware/USB-Firmware/ROM_EXEC_KERNEL_IRAM.bin
new file mode 100755
index 0000000..3127d06
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/ROM_EXEC_KERNEL_IRAM.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/USB-Firmware/md5.txt b/android/hardware/seekwave/firmware/USB-Firmware/md5.txt
new file mode 100755
index 0000000..3c76ee8
--- /dev/null
+++ b/android/hardware/seekwave/firmware/USB-Firmware/md5.txt
@@ -0,0 +1,2 @@
+03dc64c52e487c360615e221ea57ce9f  RAM_RW_KERNEL_DRAM.bin
+96b1e5009e1376d2bf9c7cc8a1b2ced1  ROM_EXEC_KERNEL_IRAM.bin
diff --git a/android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..4b472d6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..8f38b28
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6521QF_SEEKWAVE_R00005.ini
@@ -0,0 +1,181 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6521QF_20230728
+;优化TX EVM
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit = 0x401420C0,4,0
+RegAddr_Config = 0x401420C0,4,0
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 11,11,11
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 11,11,11
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 20, 20, 20, 19, 19, 19, 17, 17
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 10, 10, 10, 10, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 19, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 13, 13, 13, 11, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 10, 10, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 20, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 13, 13, 10
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 10, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit = 0x40142080,4,1
+RegAddr_Config = 0x40142080,4,1
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 7, 7, 7
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 7, 7, 7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 6, 6, 8, 8, 4, 4, 4, 4
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 5, 5, 5, 5, 6, 6
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 6, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 5, 5, 6
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 8, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit = 0x40142080,16,12
+RegAddr_Config = 0x40142080,16,12
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 4, 4, 4
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 4, 4, 4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 4, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 7, 7, 4, 4, 6, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 8, 6, 6, 6, 8, 4
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 7, 4, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 6, 4
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 4, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..16c90dc
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..7ece14e
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6521QT_SEEKWAVE_R00005.ini
@@ -0,0 +1,183 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6521QT_20230728
+;增加2.4G PA寄存器优化兼容配置
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 5.5, 5.5, 5.5, 4
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 4.5, 5.5, 5, 5, 4.5, 5.3, 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 5, 5.5, 4.5, 5.5, 4.5, 5.5
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 4.5, 4.5
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit= 0x401420C0,4,0(5G RegAddr)
+RegAddr_Config = 0x401420C0,4,0
+;cbw20/cbw40 2g 3个channel 3,7,11
+;RegAddr1,start_bit, stop_bit= 0x401420C8,3,0(2G RegAddr)
+RegAddr_2G_CBW20 = 14,14,15
+;标志位,RegAddr_2G_CBW40 = version, reserved, reserved
+;version = 11:2G采用缺省配置; version = 20: 2G采用配置文件定义值
+RegAddr_2G_CBW40 = 20,11,11
+;cbw20,5g low band 8个channel 36, 40, 44, 48, 52, 56, 60, 64
+RegAddr_5G_LOW_CBW20 = 23, 24, 21, 21, 24, 22, 22, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 11, 13, 11, 13, 13, 13, 15, 15, 13, 13, 12, 12
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 14, 12, 12, 11, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 17, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 11, 13, 14, 13, 12
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 13, 13, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 19, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 11, 14, 11
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 12, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,4,1
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,4,1
+RegAddr_2G_CBW20 = 9, 9, 9
+;cbw40/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,4,1
+RegAddr_2G_CBW40 = 9, 9, 9
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 7, 7, 7, 10, 10, 10, 10, 10, 8, 8, 8, 8
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 12, 12, 12, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 7, 5, 5, 10, 8, 8
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 8, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 10, 8
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 9, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,16,12
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,16,12
+RegAddr_2G_CBW20 = 18, 18, 18
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,16,12
+RegAddr_2G_CBW40 = 18, 18, 18
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 12, 10, 10, 10, 12, 12, 13, 13, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 16, 16, 12, 12, 12, 12, 12, 12
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 10, 10, 6, 13, 10, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 11, 11, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 10, 12, 12
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 13, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..16c90dc
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..d0e942d
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6621QT_SEEKWAVE_R00005.ini
@@ -0,0 +1,183 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6621QT_20230728
+;增加2.4G PA寄存器优化兼容配置
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 5.5, 5.5, 5.5, 4
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 4.5, 5.5, 5, 5, 4.5, 5.3, 4.5, 5.5, 4.5, 4.5, 4.5, 4.5, 5, 5, 5.5, 4.5, 5.5, 4.5, 5.5
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 4.5, 4.5
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit= 0x401420C0,4,0(5G RegAddr)
+RegAddr_Config = 0x401420C0,4,0
+;cbw20/cbw40 2g 3个channel 3,7,11
+;RegAddr1,start_bit, stop_bit= 0x401420C8,3,0(2G RegAddr)
+RegAddr_2G_CBW20 = 14,14,15
+;标志位,RegAddr_2G_CBW40 = version, reserved, reserved
+;version = 11:2G采用缺省配置; version = 20: 2G采用配置文件定义值
+RegAddr_2G_CBW40 = 20,11,11
+;cbw20,5g low band 8个channel 36, 40, 44, 48, 52, 56, 60, 64
+RegAddr_5G_LOW_CBW20 = 23, 24, 21, 21, 24, 22, 22, 20
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 11, 13, 11, 13, 13, 13, 15, 15, 13, 13, 12, 12
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 14, 12, 12, 11, 11, 11, 11
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 17, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 11, 13, 14, 13, 12
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 13, 13, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 19, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 11, 14, 11
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 12, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,4,1
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,4,1
+RegAddr_2G_CBW20 = 9, 9, 9
+;cbw40/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,4,1
+RegAddr_2G_CBW40 = 9, 9, 9
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 7, 7, 7, 10, 10, 10, 10, 10, 8, 8, 8, 8
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 12, 12, 12, 12, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 7, 5, 5, 10, 8, 8
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 8, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 10, 8
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 9, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit (5G RegAddr)
+RegAddr_Config = 0x40142080,16,12
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420A8,16,12
+RegAddr_2G_CBW20 = 18, 18, 18
+;cbw20/cbw40 2g 3个channel 3,7,11, RegAddr = 0x401420AC,16,12
+RegAddr_2G_CBW40 = 18, 18, 18
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 12, 10, 10, 10, 12, 12, 13, 13, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 16, 16, 12, 12, 12, 12, 12, 12
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 10, 10, 6, 13, 10, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 11, 11, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 10, 12, 12
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 13, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.bin b/android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.bin
new file mode 100755
index 0000000..4b472d6
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.bin
Binary files differ
diff --git a/android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.ini b/android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.ini
new file mode 100755
index 0000000..9b2c945
--- /dev/null
+++ b/android/hardware/seekwave/firmware/calib/EA6621Q_SEEKWAVE_R00005.ini
@@ -0,0 +1,181 @@
+;******************************************************************************
+;                      Wifi Limit Setup file
+;******************************************************************************
+[VERSION]
+WT_VERSION = EA6621QF_20230728
+;优化TX EVM
+;-----------------------------------------------------------------------------
+[CAL_POWER_INFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理txpower,s(8,2)
+;发送给DUT之后,DUT会进行 <<Qnum 的操作,这里的数据不要提前移位 赋值的数值必须是10进制,与DUT侧对应
+;注释:11b rate  1M,2M,5.5M,11M
+G_TXPWR11B_UQ2 = 17, 17, 17, 17
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 13, 13, 12, 12
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 14, 13, 13, 11, 11, 11
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3 = 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12, 16, 16, 16, 16, 16, 16, 16, 15, 14, 13, 13, 12, 12
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3 = 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13, 17, 17, 17, 17, 17, 17, 17, 15, 15, 14, 14, 13, 13
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2 = 00, 00
+
+;注释:11b rate          1M,2M,5.5M,11M
+G_TXPWR11B_UQ2_DELTA = 00, 00, 00, 00
+;注释:non-ht 2g cbw40 rate    6M/9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht 5g cbw40 rate 6M,9M,12M,18M,24M,36M,48M,54M; cbw80 rate 6M,9M,12M,18M,24M,36M,48M,54M
+G_TXPWRNONHTDUP5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;注释:non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS2G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释non-ht/ht/vht/he cbw20 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw40 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;ht/vht/he cbw80 rate dcmMCS0,DCMMCS1/mcs0/6m/9m,DCMMCS3/12M/mcs1,DCMMCS4/18M/mcs2,24M/mcs3,36M/mcs4,48M/mcs5,54M/mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+G_TXPWRMCS5G_UQ2_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR5G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释he TB SMALL RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB BIG RU rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+;he TB  BIG RU BIG POWER rate dcmMCS0,DCMMCS1/mcs0,DCMMCS3/mcs1,DCMMCS4/mcs2,mcs3,mcs4,mcs5,mcs6,mcs7,mcs8,mcs9,mcs10,mcs11,
+TBMAXTXPWR2G_UQ3_DELTA = 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
+;写注释 5G,2G MIN TX POWER
+TBMINTXPWR_SQ2_DELTA = 00, 00
+;-----------------------------------------------------------------------------
+[CHAN_POWER_COMPINFO]
+;-----------------------------------------------------------------------------
+;设置浮点数,工具会自动做浮点转定点数的处理。按频点补偿txpower,s(8,2),正数表示加功率,负数表示减功率
+;cbw20,2g 14个channel 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+G_COMPCHANTXPWR2G_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;cbw40,2g 9个channel 3,4,5,6,7,8,9,10,11
+G_COMPCHANTXPWR2G_CBW40_SQ2 = 0,0,0,0,0,0,0,0,0
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+G_COMPCHANTXPWR5G_LOW_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+G_COMPCHANTXPWR5G_MID_CBW20_SQ2 = 0,0,0,0,0,0,0,0,0,0,0,0
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+G_COMPCHANTXPWR5G_HIGH_CBW20_SQ2 = 0,0,0,0,0,0,0,0
+;cbw40,5g low band 4个channel 38,46,54,62
+G_COMPCHANTXPWR5G_LOW_CBW40_SQ2 = 0,0,0,0
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+G_COMPCHANTXPWR5G_MID_CBW40_SQ2 = 0,0,0,0,0,0
+;cbw40,5g high band 4个 channel 151,159,167,175
+G_COMPCHANTXPWR5G_HIGH_CBW40_SQ2 = 0,0,0,0
+;cbw80,5g low band 2个 channel 42,58
+G_COMPCHANTXPWR5G_LOW_CBW80_SQ2 = 0,0
+;cbw80,5g mid band 3个 channel 106,122,138
+G_COMPCHANTXPWR5G_MID_CBW80_SQ2 = 0,0,0
+;cbw80,5g high band 2个 channel 155,171
+G_COMPCHANTXPWR5G_HIGH_CBW80_SQ2 = 0,0
+
+;-----------------------------------------------------------------------------
+[RegAddr1]
+;-----------------------------------------------------------------------------
+;寄存器配置,RegAddr是寄存器地址,每个信道对应一个寄存器值
+;RegAddr1,start_bit, stop_bit = 0x401420C0,4,0
+RegAddr_Config = 0x401420C0,4,0
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 11,11,11
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 11,11,11
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 20, 20, 20, 19, 19, 19, 17, 17
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 10, 10
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 10, 10, 10, 10, 10, 10, 10, 10
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 20, 19, 19, 17
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 13, 13, 13, 13, 11, 10
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 10, 10, 10, 10
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 20, 19
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 13, 13, 10
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 10, 10
+
+;------------------------------------------------------------------------------
+[RegAddr2]
+;-----------------------------------------------------------------------------
+;RegAddr2,start_bit, stop_bit = 0x40142080,4,1
+RegAddr_Config = 0x40142080,4,1
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 7, 7, 7
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 7, 7, 7
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 6, 6, 6, 5, 5, 5, 6, 6
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 6, 6, 8, 8, 4, 4, 4, 4
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 6, 5, 5, 6
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 5, 5, 5, 5, 6, 6
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 6, 8, 4, 4
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 6, 5
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 5, 5, 6
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 8, 4	
+
+;------------------------------------------------------------------------------
+[RegAddr3]
+;-----------------------------------------------------------------------------
+;RegAddr3,start_bit, stop_bit = 0x40142080,16,12
+RegAddr_Config = 0x40142080,16,12
+;cbw20 2g 3个channel 3,7,11
+RegAddr_2G_CBW20 = 4, 4, 4
+;cbw40 2g 3个channel 3,7,11
+RegAddr_2G_CBW40 = 4, 4, 4
+;cbw20,5g low band 8个channel 36,40,44,48,52,56,60,64
+RegAddr_5G_LOW_CBW20 = 4, 4, 4, 4, 4, 4, 4, 4
+;cbw20,5g mid band 12个 channel 100,104,108,112,116,120,124,128,132,136,140,144
+RegAddr_5G_MID_CBW20 = 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 4, 4
+;cbw20,5g high band 8个 channel 149,153,157,161,165,169,173,177
+RegAddr_5G_HIGH_CBW20 = 7, 7, 4, 4, 6, 6, 6, 6
+;cbw40,5g low band 4个channel 38,46,54,62
+RegAddr_5G_LOW_CBW40 = 4, 4, 4, 4
+;cbw40,5g mid band 6个 channel 102,110,118,126,134,142
+RegAddr_5G_MID_CBW40 = 8, 6, 6, 6, 8, 4
+;cbw40,5g high band 4个 channel 151,159,167,175
+RegAddr_5G_HIGH_CBW40 = 7, 4, 6, 6
+;cbw80,5g low band 2个 channel 42,58
+RegAddr_5G_LOW_CBW80 = 4, 4
+;cbw80,5g mid band 3个 channel 106,122,138
+RegAddr_5G_MID_CBW80 = 8, 6, 4
+;cbw80,5g high band 2个 channel 155,171
+RegAddr_5G_HIGH_CBW80 = 4, 6
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/android/hardware/seekwave/firmware/device-skw.mk b/android/hardware/seekwave/firmware/device-skw.mk
new file mode 100755
index 0000000..2138833
--- /dev/null
+++ b/android/hardware/seekwave/firmware/device-skw.mk
@@ -0,0 +1,24 @@
+#
+# Copyright (C) 2008 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.
+#
+
+########################
+
+PRODUCT_COPY_FILES += \
+    #hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_IRAM_SDIO.bin:$(TARGET_COPY_OUT_VENDOR)/etc/firmware/SWT6621S_IRAM_SDIO.bin \
+	#hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_DRAM_SDIO.bin:$(TARGET_COPY_OUT_VENDOR)/etc/firmware/SWT6621S_DRAM_SDIO.bin \
+    #hardware/seekwave/firmware/SDIO-Fimware/SWT6621S_SEEKWAVE_R00001.bin:$(TARGET_COPY_OUT_VENDOR)/etc/firmware/SWT6621S_SEEKWAVE_R00001.bin  
+PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*,hardware/seekwave/firmware/SDIO-Fimware,$(TARGET_COPY_OUT_VENDOR)/etc/firmware)
+########################
diff --git a/android/hardware/seekwave/skwbt/Android.mk b/android/hardware/seekwave/skwbt/Android.mk
new file mode 100755
index 0000000..02e0043
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/Android.mk
@@ -0,0 +1,43 @@
+
+LOCAL_PATH := $(call my-dir)
+
+ifneq ($(BOARD_HAVE_BLUETOOTH_SEEKWAVE),)
+
+include $(CLEAR_VARS)
+
+BDROID_DIR := $(TOP_DIR)system/bt
+ifeq ($(PLATFORM_VERSION),13)
+BDROID_DIR := $(TOP_DIR)packages/modules/Bluetooth/system
+else ifeq ($(PLATFORM_VERSION),14)
+BDROID_DIR := $(TOP_DIR)packages/modules/Bluetooth/system
+endif
+
+LOCAL_SRC_FILES := \
+    src/bt_vendor_skw.c \
+    src/scom_vendor.c \
+    src/skw_log.c \
+	src/skw_gen_addr.c \
+	src/skw_ext.c \
+	src/skw_btsnoop.c 
+
+LOCAL_C_INCLUDES += \
+    $(LOCAL_PATH)/include \
+	$(BDROID_DIR)/hci/include 
+
+LOCAL_C_INCLUDES += $(bdroid_C_INCLUDES)
+LOCAL_CFLAGS += $(bdroid_CFLAGS)
+
+LOCAL_SHARED_LIBRARIES := \
+        libcutils \
+        libutils \
+        liblog
+
+LOCAL_MODULE := libbt-vendor
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_OWNER := seekwave
+LOCAL_PROPRIETARY_MODULE := true
+
+include $(BUILD_SHARED_LIBRARY)
+
+endif #BOARD_HAVE_BLUETOOTH_SEEKWAVE
diff --git a/android/hardware/seekwave/skwbt/include/bt_vendor_skw.h b/android/hardware/seekwave/skwbt/include/bt_vendor_skw.h
new file mode 100755
index 0000000..625e119
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/bt_vendor_skw.h
@@ -0,0 +1,64 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#ifndef __BT_VENDOR_SKW_H__
+#define __BT_VENDOR_SKW_H__
+
+
+#include "bt_vendor_lib.h"
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/epoll.h>
+#include <sys/eventfd.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <cutils/properties.h>
+
+
+#define SKW_LIBBT_VERSION "0.2"
+
+#define SKWBT_TRANS_TYPE_H4          0x01
+#define SKWBT_TRANS_TYPE_UART        0x10
+#define SKWBT_TRANS_TYPE_SDIO        0x20
+#define SKWBT_TRANS_TYPE_USB         0x40
+
+
+#define SKW_CHIPID_6316       0x5301
+#define SKW_CHIPID_6160       0x0017
+#define SKW_CHIPID_6160_LITE  0x5302
+
+
+//#define IOCTL_CMD_WAKEUP_ADV_EN 0x01
+#define IOCTL_CMD_LOG_EN_GET    _IOWR('S', 2, uint8_t *)
+
+#ifndef FALSE
+#define FALSE  0
+#endif
+
+#ifndef TRUE
+#define TRUE   1
+#endif
+
+
+extern bt_vendor_callbacks_t *bt_vendor_cbacks;
+extern char skwbt_transtype;
+extern char skwbtuartonly;
+extern char skwbtNoSleep;
+extern int  btboot_fp;
+extern int  btpw_fp;
+
+#endif /*BT_UNUSED_H*/
diff --git a/android/hardware/seekwave/skwbt/include/scom_vendor.h b/android/hardware/seekwave/skwbt/include/scom_vendor.h
new file mode 100755
index 0000000..7e44071
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/scom_vendor.h
@@ -0,0 +1,219 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#ifndef __SCOM_VENDOR_H__
+#define __SCOM_VENDOR_H__
+
+#include <sys/types.h>
+
+
+/* Structure used to configure serial port during open */
+typedef struct
+{
+    uint16_t fmt;       /* Data format */
+    uint8_t  baud;      /* Baud rate */
+    uint8_t hw_fctrl; /*hardware flowcontrol*/
+} tUSERIAL_CFG;
+
+
+/* Hardware Configuration State */
+enum {
+	HW_CFG_INIT = 0x00,
+    HW_CFG_START,
+    HW_CFG_WRITE_OS_TYPE,
+    HW_CFG_READ_HCI_VERSION,
+    HW_CFG_NV_SEND,
+    HW_CFG_NV_SEND_CMPL,
+    HW_CFG_WRITE_BD_ADDR,
+    HW_CFG_WRITE_WAKEUP_ADV_DATA,
+    HW_RESET_CONTROLLER,
+    HARDWARE_INIT_COMPLETE
+};
+
+#define HCI_CMD_MAX_LEN       258
+
+#define NV_FILE_RD_BLOCK_SIZE 252
+#define DEVICE_NODE_MAX_LEN   64
+
+#define NV_TAG_BD_ADDR          0x01
+#define NV_TAG_DSP_LOG_SETTING  0x05
+
+#define SCOM_READ_BUFFER_LEN    2056
+
+enum{
+	BT_COM_PORT_CMDEVT = 0x0,//CMD/Evet, in case of UART:ACL + AUDIO
+	BT_COM_PORT_ACL,//ACL IN/OUT
+	BT_COM_PORT_AUDIO,//AUDIO IN/OUT
+	BT_COM_PORT_ISO,
+	BT_COM_PORT_SIZE
+};
+
+
+typedef struct
+{
+    uint32_t    baudrate; //for UART
+    uint8_t     state;          /* Hardware configuration state mechine*/
+	uint8_t     file_offset;//for nv
+	FILE *      nv_fp;
+} bt_hw_cfg_cb_st;
+
+typedef struct
+{
+    int fd;                     //
+    int socket_fd[2];
+    int signal_fd[2];
+    int epoll_fd;
+    struct termios termios;     /* serial terminal of BT port */
+    char port_name[DEVICE_NODE_MAX_LEN];
+    pthread_t thread_socket_id;
+    pthread_t thread_uart_id;
+    char thread_running;
+    char recv_comm_thread_running;
+	char is_busying;
+	char read_retry;
+
+	volatile char  driver_state;
+	int mode;
+} scomm_vnd_st;
+
+typedef struct{
+  int  fd;                              // the file descriptor to monitor for events.
+  void *context;                       // a context that's passed back to the *_ready functions..
+  pthread_mutex_t lock;                // protects the lifetime of this object and all variables.
+
+  void (*read_ready)(void *context);   // function to call when the file descriptor becomes readable.
+  void (*write_ready)(void *context);  // function to call when the file descriptor becomes writeable.
+}skw_socket_object_st;
+
+
+
+#define HCI_CMD_PREAMBLE_SIZE                    3
+#define HCI_EVT_CMD_CMPL_OPCODE_OFFSET           3     //opcode's offset in HCI_Command_Complete Event
+#define HCI_EVT_CMD_CMPL_STATUS_OFFSET           5     //status's offset in HCI_Command_Complete Event
+
+
+
+/*
+ *  Definitions for HCI groups
+*/
+#define HCI_GRP_LINK_CONTROL_CMDS (0x01 << 10)       /* 0x0400 */
+#define HCI_GRP_LINK_POLICY_CMDS (0x02 << 10)        /* 0x0800 */
+#define HCI_GRP_HOST_CONT_BASEBAND_CMDS (0x03 << 10) /* 0x0C00 */
+#define HCI_GRP_INFORMATIONAL_PARAMS (0x04 << 10)    /* 0x1000 */
+#define HCI_GRP_STATUS_PARAMS (0x05 << 10)           /* 0x1400 */
+#define HCI_GRP_TESTING_CMDS (0x06 << 10)            /* 0x1800 */
+#define HCI_GRP_BLE_CMDS (0x08 << 10)               /* 0x2000 (LE Commands) */
+
+#define HCI_GRP_VENDOR_SPECIFIC (0x3F << 10) /* 0xFC00 */
+
+/* Group occupies high 6 bits of the HCI command rest is opcode itself */
+#define HCI_OGF(p) (uint8_t)((0xFC00 & (p)) >> 10)
+#define HCI_OCF(p) (0x3FF & (p))
+
+
+#define HCI_RESET                       (0x0003 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_READ_LOCAL_VERSION_INFO     (0x0001 | HCI_GRP_INFORMATIONAL_PARAMS)
+
+#define HCI_CMD_SKW_BT_NVDS             0xFC80
+#define HCI_CMD_WRITE_BD_ADDR           0xFC82
+#define HCI_CMD_WRITE_OS_TYPE           0xFC83
+#define HCI_CMD_WRITE_WAKEUP_ADV_DATA   0xFC84
+#define HCI_CMD_WRITE_WAKEUP_ADV_ENABLE 0xFC85
+
+
+#define HCI_COMMAND_COMPLETE_EVENT      0x0E
+#define HCI_COMMAND_STATUS_EVENT        0x0F
+#define HCI_HARDWARE_ERROR_EVENT        0x10
+
+#define HWERR_CODE_CP_ERROR             0x10
+
+#define CP_ERR_ENOTCONN -107 //Transport endpoint 
+
+
+#define HCI_COMMAND_PKT_PREAMBLE_SIZE		0x03
+#define HCI_ACLDATA_PKT_PREAMBLE_SIZE		0x04
+#define HCI_SCODATA_PKT_PREAMBLE_SIZE		0x03
+#define HCI_EVENT_PKT_PREAMBLE_SIZE  		0x02
+#define HCI_ISODATA_PKT_PREAMBLE_SIZE		0x04
+#define HCI_EVENT_SKWLOG_PREAMBLE_SIZE  	0x03
+
+#define HCI_COMMON_DATA_LENGTH_INDEX  0x03
+#define HCI_EVENT_DATA_LENGTH_INDEX   0x02
+#define HCI_SKWLOG_DATA_LENGTH_INDEX  0x02
+
+
+
+//---------------------UART Para Start-------------------------//
+
+/**** baud rates ****/
+#define USERIAL_BAUD_300        0
+#define USERIAL_BAUD_600        1
+#define USERIAL_BAUD_1200       2
+#define USERIAL_BAUD_2400       3
+#define USERIAL_BAUD_9600       4
+#define USERIAL_BAUD_19200      5
+#define USERIAL_BAUD_57600      6
+#define USERIAL_BAUD_115200     7
+#define USERIAL_BAUD_230400     8
+#define USERIAL_BAUD_460800     9
+#define USERIAL_BAUD_921600     10
+#define USERIAL_BAUD_1M         11
+#define USERIAL_BAUD_1_5M       12
+#define USERIAL_BAUD_2M         13
+#define USERIAL_BAUD_3M         14
+#define USERIAL_BAUD_4M         15
+#define USERIAL_BAUD_AUTO       16
+
+/**** Data Format ****/
+/* Stop Bits */
+#define USERIAL_STOPBITS_1      1
+#define USERIAL_STOPBITS_1_5    (1<<1)
+#define USERIAL_STOPBITS_2      (1<<2)
+
+/* Parity Bits */
+#define USERIAL_PARITY_NONE     (1<<3)
+#define USERIAL_PARITY_EVEN     (1<<4)
+#define USERIAL_PARITY_ODD      (1<<5)
+
+/* Data Bits */
+#define USERIAL_DATABITS_5      (1<<6)
+#define USERIAL_DATABITS_6      (1<<7)
+#define USERIAL_DATABITS_7      (1<<8)
+#define USERIAL_DATABITS_8      (1<<9)
+
+
+#define USERIAL_HW_FLOW_CTRL_OFF  0
+#define USERIAL_HW_FLOW_CTRL_ON    1
+
+
+//---------------------UART Para End-------------------------//
+
+
+
+void scomm_vendor_init();
+
+void scomm_vendor_set_port_name(uint8_t port_index, char *port_name, int mode);
+
+uint8_t scomm_vendor_check_port_valid(uint8_t port_index);
+
+int scomm_vendor_uart_open(uint8_t port_index);
+
+int scomm_vendor_usbsdio_open(uint8_t port_index);
+
+int scomm_vendor_socket_open(uint8_t port_index);
+
+void scomm_vendor_close();
+
+void scomm_vendor_config_start();
+
+void scomm_vendor_write_bt_state();
+
+void scomm_vendor_parse_wakeup_adv_conf(char *data_str);
+
+
+#endif
diff --git a/android/hardware/seekwave/skwbt/include/skw_btsnoop.h b/android/hardware/seekwave/skwbt/include/skw_btsnoop.h
new file mode 100755
index 0000000..4b7fd10
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/skw_btsnoop.h
@@ -0,0 +1,49 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+
+#ifndef __SKW_BTSNOOP_H__
+#define __SKW_BTSNOOP_H__
+
+
+#include <assert.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/prctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <time.h>
+#include <utils/Log.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+
+
+
+/* HCI Packet types */
+#define HCI_COMMAND_PKT		0x01
+#define HCI_ACLDATA_PKT		0x02
+#define HCI_SCODATA_PKT		0x03
+#define HCI_EVENT_PKT		0x04
+#define HCI_ISO_PKT		    0x05
+#define HCI_EVENT_SKWLOG	0x07
+
+
+void skw_btsnoop_init();
+void skw_btsnoop_close(void);
+void skw_btsnoop_capture(const uint8_t *packet, char is_received);
+
+
+
+
+#endif
diff --git a/android/hardware/seekwave/skwbt/include/skw_common.h b/android/hardware/seekwave/skwbt/include/skw_common.h
new file mode 100755
index 0000000..072e70e
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/skw_common.h
@@ -0,0 +1,47 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#ifndef __SKW_COMMON_H__
+#define __SKW_COMMON_H__
+
+#define SKW_UNUSED(x) (void)(x)
+//#define SKW_UNUSED(x) (x = x)
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+
+#ifndef UINT8_TO_STREAM
+#define UINT8_TO_STREAM(p, u8)   {*(p)++ = (uint8_t)(u8);}
+#endif
+
+
+#ifndef UINT16_TO_STREAM
+#define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
+#endif
+
+#ifndef STREAM_TO_UINT16
+#define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
+#endif
+
+
+#define RW_NO_INTR(func)  do {} while (((func) == -1) && (errno == EINTR))
+
+
+extern char skwdriverlog_en;
+#define SKWBT_LOG(fmt, args...)  do{if(skwdriverlog_en){ALOGD("[SKWBT]:" fmt, ## args);}}while(0)
+
+#define SKW_LOG_DEFAULT_SIZE (100 * 1024 * 1024)//300M
+
+
+#endif
diff --git a/android/hardware/seekwave/skwbt/include/skw_ext.h b/android/hardware/seekwave/skwbt/include/skw_ext.h
new file mode 100755
index 0000000..3264a2f
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/skw_ext.h
@@ -0,0 +1,41 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+#ifndef __SKW_EXT_H__
+#define __SKW_EXT_H__
+
+#define BLE_ADV_WAKEUP_ENABLE 1
+
+
+
+#define BLE_ADV_WAKEUP_GRP_NUMS 3
+
+typedef struct
+{
+    uint8_t grp_len;
+    uint8_t addr_offset;
+    uint8_t data[32];
+    uint8_t mask[32];
+} Wakeup_ADV_Grp_St;
+
+typedef struct
+{
+    uint8_t gpio_no;
+    uint8_t level;
+    uint8_t data_len;//total len
+    uint8_t grp_nums;
+    Wakeup_ADV_Grp_St adv_group[BLE_ADV_WAKEUP_GRP_NUMS];
+} Wakeup_ADV_Info_St;
+
+
+void skw_ext_inotify_thread_init(void);
+
+void skw_ext_inotify_thread_exit(void);
+
+
+
+#endif
diff --git a/android/hardware/seekwave/skwbt/include/skw_gen_addr.h b/android/hardware/seekwave/skwbt/include/skw_gen_addr.h
new file mode 100755
index 0000000..e71aa11
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/skw_gen_addr.h
@@ -0,0 +1,19 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#ifndef __SKW_GEN_ADDR_H__
+#define __SKW_GEN_ADDR_H__
+
+void skw_addr_gen_init();
+
+void skw_addr_get(unsigned char *buffer);
+
+char skw_addr_from_ap(unsigned char *bd_addr);
+
+
+#endif
diff --git a/android/hardware/seekwave/skwbt/include/skw_log.h b/android/hardware/seekwave/skwbt/include/skw_log.h
new file mode 100755
index 0000000..02ab369
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/include/skw_log.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#ifndef __SKW_LOG_H__
+#define __SKW_LOG_H__
+
+void skwlog_init();
+
+void skwlog_reopen(char new_file);
+
+void skwlog_print_current_time();
+
+void skwlog_write(unsigned char *buffer, unsigned int length);
+
+void skwlog_close();
+
+
+#endif
diff --git a/android/hardware/seekwave/skwbt/skwbt.mk b/android/hardware/seekwave/skwbt/skwbt.mk
new file mode 100755
index 0000000..5c1cbc9
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/skwbt.mk
@@ -0,0 +1,8 @@
+	
+CUR_PATH := hardware/seekwave/skwbt
+
+
+PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*,$(CUR_PATH)/vendor/etc/bluetooth,vendor/etc/bluetooth)
+
+
+$(call inherit-product, hardware/seekwave/firmware/device-skw.mk)
diff --git a/android/hardware/seekwave/skwbt/src/bt_vendor_skw.c b/android/hardware/seekwave/skwbt/src/bt_vendor_skw.c
new file mode 100755
index 0000000..33eaae8
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/src/bt_vendor_skw.c
@@ -0,0 +1,545 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  Filename:      bt_vendor_skw.c
+ *
+ *  Description:   SeekWave vendor specific library implementation
+ *
+ ******************************************************************************/
+
+#undef NDEBUG
+#define LOG_TAG "libbt_vendor"
+
+
+#include <utils/Log.h>
+#include "bt_vendor_skw.h"
+#include "scom_vendor.h"
+#include "skw_btsnoop.h"
+#include "skw_log.h"
+#include "skw_gen_addr.h"
+#include "skw_common.h"
+#include <cutils/properties.h>
+#include "skw_ext.h"
+
+#define SKWBT_CONFIG_FILE       "/vendor/etc/bluetooth/skwbt.conf"
+
+bt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
+uint8_t vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+uint8_t port_cnts = 0;
+
+char skwbt_transtype = 0;
+static char skwbt_device_node[BT_COM_PORT_SIZE][DEVICE_NODE_MAX_LEN + 1];
+
+int  btboot_fp = -1;
+int  btpw_fp = -1;
+char btsnoop_log_en = FALSE;
+char btcp_log_en = FALSE;
+char skwlog_slice = FALSE;
+char skwdriverlog_en = TRUE;
+char skwbtuartonly = TRUE;
+char skwbtNoSleep = FALSE; //No Sleep
+
+extern char skw_btsnoop_path[];
+extern char btsnoop_save_log;
+extern Wakeup_ADV_Info_St   wakeup_ADV_Info;
+
+static char *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_skwbt_conf()
+{
+    memset(skwbt_device_node, 0, sizeof(skwbt_device_node));
+    FILE *fp = fopen(SKWBT_CONFIG_FILE, "rt");
+    if (!fp)
+    {
+        //ALOGE("%s unable to open file '%s': %s", __func__, SKWBT_CONFIG_FILE, strerror(errno));
+        strcpy(skwbt_device_node[0], "/dev/ttyS0");
+        return ;
+    }
+
+    char *split;
+    char line[1024];
+    int port_index = BT_COM_PORT_CMDEVT;
+
+    while (fgets(line, sizeof(line), fp))
+    {
+        char *line_ptr = trim(line);
+
+        // 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", __func__);
+            fclose(fp);
+            return;
+        }
+
+        *split = '\0';
+        split ++;
+        if((!strcmp(trim(line_ptr), "BtDeviceNode")) && (port_index < BT_COM_PORT_SIZE))
+        {
+            int mode = O_RDWR;
+            char *str_ptr = trim(split);
+            int len = strlen(str_ptr);
+#if 0
+            if(strstr(split, "BTDATA"))
+            {
+                port_index = BT_COM_PORT_ACL;
+            }
+            else if(strstr(split, "BTAUDIO"))
+            {
+                port_index = BT_COM_PORT_AUDIO;
+            }
+            else if(strstr(split, "BTISOC"))
+            {
+                port_index = BT_COM_PORT_ISO;
+            }
+#endif
+            if(len > DEVICE_NODE_MAX_LEN)
+            {
+                len = DEVICE_NODE_MAX_LEN;
+                str_ptr[DEVICE_NODE_MAX_LEN] = 0x00;
+            }
+            memcpy(skwbt_device_node[port_index], str_ptr, len);
+            scomm_vendor_set_port_name(port_index, skwbt_device_node[port_index], mode);
+
+            port_index ++;
+        }
+    }
+
+
+    fclose(fp);
+
+    skwbt_transtype = SKWBT_TRANS_TYPE_H4;
+    if(skwbt_device_node[0][0] == '?')
+    {
+        int i = 0;
+        while(skwbt_device_node[0][i] != '\0')
+        {
+            skwbt_device_node[0][i] = skwbt_device_node[0][i + 1];
+            i++;
+        }
+        scomm_vendor_set_port_name(0, skwbt_device_node[0], O_RDWR);
+        skwbt_transtype |= SKWBT_TRANS_TYPE_UART;
+    }
+}
+
+char skwbt_boot_open()
+{
+    btboot_fp = open("/dev/BTBOOT", O_RDWR);
+    if (btboot_fp < 0)
+    {
+        ALOGE("%s: unable to open : %s", __func__, strerror(errno));
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+static void load_skwbt_stack_conf()
+{
+    FILE *fp = fopen(SKWBT_CONFIG_FILE, "rt");
+    if (!fp)
+    {
+        ALOGE("%s unable to open file '%s': %s", __func__, SKWBT_CONFIG_FILE, strerror(errno));
+        return;
+    }
+    char *split;
+    int line_num = 0;
+    char line[1024];
+    while (fgets(line, sizeof(line), fp))
+    {
+        char *line_ptr = 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';
+
+        if(!strcmp(trim(line_ptr), "SkwBtsnoopDump"))
+        {
+            if(!strcmp(trim(split + 1), "true"))
+            {
+                btsnoop_log_en = TRUE;
+            }
+            else
+            {
+                btsnoop_log_en = FALSE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "BtSnoopFileName"))
+        {
+            sprintf(skw_btsnoop_path, "%s", trim(split + 1));
+        }
+        else if(!strcmp(trim(line_ptr), "BtSnoopSaveLog"))
+        {
+            if(!strcmp(trim(split + 1), "true"))
+            {
+                btsnoop_save_log = TRUE;
+            }
+            else
+            {
+                btsnoop_save_log = FALSE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "SkwBtcplog"))
+        {
+            if(!strcmp(trim(split + 1), "true"))
+            {
+                btcp_log_en = TRUE;
+            }
+            else
+            {
+                btcp_log_en = FALSE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "SkwLogSlice"))
+        {
+            if(!strcmp(trim(split + 1), "true"))
+            {
+                skwlog_slice = TRUE;
+            }
+            else
+            {
+                skwlog_slice = FALSE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "SkwBtDrvlog"))
+        {
+            if(!strcmp(trim(split + 1), "false"))
+            {
+                skwdriverlog_en = FALSE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "SkwBtUartOnly"))
+        {
+            if(!strcmp(trim(split + 1), "false"))//SkwBtUartOnly is false
+            {
+                skwbtuartonly = FALSE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "SkwBtNoSleep"))
+        {
+            if(strcmp(trim(split + 1), "true") == 0)//SkwBtNoSleep is true
+            {
+                skwbtNoSleep = TRUE;
+            }
+        }
+        else if(!strcmp(trim(line_ptr), "WakeupADVData"))
+        {
+            char *data_str = trim(split + 1);
+            if(data_str)
+            {
+                scomm_vendor_parse_wakeup_adv_conf(data_str);
+            }
+        }
+
+
+    }
+
+    fclose(fp);
+}
+
+
+
+
+/*****************************************************************************
+**
+**   BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
+**
+*****************************************************************************/
+
+
+
+/** initialise **/
+static int init(const bt_vendor_callbacks_t *p_cb, unsigned char *local_bdaddr)
+{
+    ALOGI("SeekWave BlueTooth Version: %s", SKW_LIBBT_VERSION);
+    if (p_cb == NULL)
+    {
+        ALOGE("init failed with no user callbacks!");
+        return -1;
+    }
+
+    scomm_vendor_init();
+
+    load_skwbt_conf();
+    load_skwbt_stack_conf();
+    skwlog_init();
+
+
+    bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;//save callback
+    memcpy(vnd_local_bd_addr, local_bdaddr, 6);
+
+    if(btsnoop_log_en)
+    {
+        //enable btsnoop log
+        skw_btsnoop_init();
+    }
+    skw_addr_gen_init();
+
+    return 0;
+}
+
+/** operations **/
+static int op(bt_vendor_opcode_t opcode, void *param)
+{
+    int retval = 0;
+
+    ALOGD("op for %d", opcode);
+
+    switch(opcode)
+    {
+        case BT_VND_OP_POWER_CTRL:
+        {
+            if(skwbt_transtype & SKWBT_TRANS_TYPE_UART)
+            {
+                int *state = (int *) param;
+                if (*state == BT_VND_PWR_OFF)
+                {
+                    usleep(200000);
+                    ALOGD("set power off and delay 200ms");
+                }
+                else if (*state == BT_VND_PWR_ON)
+                {
+                    usleep(200000);
+                    ALOGD("set power on and delay 200ms");
+                }
+            }
+        }
+        break;
+
+        case BT_VND_OP_FW_CFG:
+        {
+            scomm_vendor_config_start();
+        }
+        break;
+
+        case BT_VND_OP_SCO_CFG:
+        {
+            retval = -1;
+        }
+        break;
+
+        case BT_VND_OP_USERIAL_OPEN:
+        {
+            int fd = -1, idx = 0;
+            int (*fd_array)[] = (int (*)[]) param;
+
+
+            if(skwbt_transtype & SKWBT_TRANS_TYPE_UART)
+            {
+                if(skwbtuartonly == FALSE)
+                {
+                    SKWBT_LOG("open boot");
+                    if(!skwbt_boot_open())
+                    {
+                        retval = 0;
+                        break;
+                    }
+                    btpw_fp = open("/dev/BTDATA", O_RDWR);
+                }
+                if(scomm_vendor_uart_open(0) != -1)
+                {
+                    retval = 1;
+                    fd = scomm_vendor_socket_open(0);
+                }
+            }
+            else
+            {
+                int tFd = -1;
+                //uint8_t log_enable = 0;
+                if(!skwbt_boot_open())
+                {
+                    retval = 0;
+                    break;
+                }
+#if 0
+                if(ioctl(btboot_fp, IOCTL_CMD_LOG_EN_GET, &log_enable) == 0)
+                {
+                    ALOGD("SKWBT log_enable res:%d, btcp_log_en:%d, btsnoop_log_en:%d", log_enable, btcp_log_en, btsnoop_log_en);
+                    if(btcp_log_en && log_enable)//0:default, 1:release version; 2:debug version
+                    {
+                        btcp_log_en = log_enable == 2;
+                    }
+                    if(btsnoop_log_en && log_enable)
+                    {
+                        btsnoop_log_en = log_enable == 2;
+                    }
+                }
+#endif
+
+#ifdef IOCTL_CMD_WAKEUP_ADV_EN
+                if(wakeup_ADV_Info.grp_nums > 0)
+                {
+                    int res = ioctl(btboot_fp, IOCTL_CMD_WAKEUP_ADV_EN);
+                    ALOGD("%s, wakeup adv en res:%d", __func__, res);
+                }
+#endif
+                for (idx = 0; idx < BT_COM_PORT_SIZE; idx++)
+                {
+                    if(scomm_vendor_check_port_valid(idx) == FALSE)
+                    {
+                        continue;
+                    }
+                    if(scomm_vendor_usbsdio_open(idx) != -1)
+                    {
+                        tFd = scomm_vendor_socket_open(idx);
+
+                        ALOGD("idx:%d, tFd:%d, fd:%d", idx, tFd, fd);
+                        if((tFd != -1) && (fd == -1))
+                        {
+                            fd = tFd;
+                        }
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+
+                if(idx <= BT_COM_PORT_ACL)
+                {
+                    skwbt_transtype |= SKWBT_TRANS_TYPE_USB;
+                }
+                else
+                {
+                    skwbt_transtype |= SKWBT_TRANS_TYPE_SDIO;
+                }
+            }
+            ALOGD("retval:%d, fd:%d, idx:%d", retval, fd, idx);
+
+            if (fd != -1)
+            {
+                retval = 1;
+                for (idx = 0; idx < CH_MAX; idx++)
+                {
+                    (*fd_array)[idx] = fd;
+                }
+                skw_ext_inotify_thread_init();
+                property_set("SKWBT.OPEN.STATE", "1");
+            }
+            else
+            {
+                retval = 0;
+            }
+        }
+        break;
+
+        case BT_VND_OP_USERIAL_CLOSE:
+        {
+            if(btboot_fp > 0)
+            {
+                scomm_vendor_write_bt_state();
+                close(btboot_fp);
+                btboot_fp = -1;
+            }
+            scomm_vendor_close();
+            skw_ext_inotify_thread_exit();
+            property_set("SKWBT.OPEN.STATE", "0");
+        }
+        break;
+
+        case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
+        {
+
+        }
+        break;
+
+        case BT_VND_OP_LPM_SET_MODE:
+        {
+
+        }
+        break;
+
+        case BT_VND_OP_LPM_WAKE_SET_STATE:
+        {
+
+        }
+        break;
+        case BT_VND_OP_EPILOG:
+        {
+            if(bt_vendor_cbacks)
+            {
+                bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
+            }
+        }
+        break;
+
+        default:
+            break;
+    }
+
+    return retval;
+}
+
+
+/** Close **/
+static void cleanup( void )
+{
+    ALOGD("bt_vendor_skw.c cleanup");
+
+    if(btsnoop_log_en)
+    {
+        skw_btsnoop_close();
+    }
+    skwlog_close();
+
+    btsnoop_log_en = FALSE;
+    bt_vendor_cbacks = NULL;
+    skwbt_transtype = 0;
+}
+
+
+
+// Entry point
+const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {sizeof(bt_vendor_interface_t),
+                                                              init,
+                                                              op,
+                                                              cleanup
+                                                             };
+
+
diff --git a/android/hardware/seekwave/skwbt/src/scom_vendor.c b/android/hardware/seekwave/skwbt/src/scom_vendor.c
new file mode 100755
index 0000000..c2d2e4d
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/src/scom_vendor.c
@@ -0,0 +1,1747 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  Filename:      scom_vendor.c
+ *
+ *  Description:   serials communication operation
+ *
+ ******************************************************************************/
+
+#include <pthread.h>
+#include <utils/Log.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/eventfd.h>
+#include <cutils/sockets.h>
+#include <sys/poll.h>
+#include <assert.h>
+#include "scom_vendor.h"
+#include "bt_hci_bdroid.h"
+#include "skw_common.h"
+#include "bt_vendor_skw.h"
+#include "skw_btsnoop.h"
+#include "skw_log.h"
+#include "skw_gen_addr.h"
+#include "skw_ext.h"
+
+
+
+bt_hw_cfg_cb_st      hw_cfg_cb;
+scomm_vnd_st         scomm_vnd[BT_COM_PORT_SIZE];
+skw_socket_object_st skw_socket_object;
+uint8_t              recvSocketBuf[4096];
+static pthread_mutex_t write2host_lock;
+uint16_t             chip_version = 0;
+Wakeup_ADV_Info_St   wakeup_ADV_Info = {0};
+extern char btcp_log_en;
+
+
+#define SKWBT_NV_FILE_PATH       "/vendor/etc/bluetooth"
+
+
+static const uint8_t hci_preamble_sizes[] =
+{
+    0,
+    HCI_COMMAND_PKT_PREAMBLE_SIZE,
+    HCI_ACLDATA_PKT_PREAMBLE_SIZE,
+    HCI_SCODATA_PKT_PREAMBLE_SIZE,
+    HCI_EVENT_PKT_PREAMBLE_SIZE,
+    HCI_ISODATA_PKT_PREAMBLE_SIZE,
+    0,
+    HCI_EVENT_SKWLOG_PREAMBLE_SIZE
+};
+
+
+static tUSERIAL_CFG userial_H4_cfg =
+{
+    (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1),
+    //USERIAL_BAUD_115200,
+    USERIAL_BAUD_3M,
+    //USERIAL_BAUD_1_5M,
+    USERIAL_HW_FLOW_CTRL_ON
+};
+
+
+char hex2char(int num)
+{
+    char ch;
+    if(num >= 0 && num <= 9)
+    {
+        ch = num + 48;
+    }
+    else if(num > 9 && num <= 15)
+    {
+        ch = (num - 10) + 65;
+    }
+    else
+    {
+        ch = '\0';
+    }
+    return ch;
+}
+
+void hex2String(unsigned char hex[], unsigned char str[], int N)
+{
+    int i = 0, j;
+    for(i = 0, j = 0; i < N; i++, j += 2)
+    {
+        str[j] = hex2char((hex[i] & 0xF0) >> 4);
+        str[j + 1] = hex2char(hex[i] & 0x0F);
+    }
+    str[N << 1] = 0;
+}
+
+unsigned char char2hex(char ch)
+{
+    unsigned char num = 0;
+    if(ch >= '0' && ch <= '9')
+    {
+        num = ch - 48;//0:48
+    }
+    else if(ch >= 'a' && ch <= 'f')
+    {
+        num = ch + 10 - 97;//a:97
+    }
+    else if(ch >= 'A' && ch <= 'F')
+    {
+        num = ch + 10 - 65;//A:65
+    }
+    return num;
+}
+
+void scomm_vendor_init()
+{
+    uint8_t i;
+    for(i = 0; i < BT_COM_PORT_SIZE; i++)
+    {
+        memset(&scomm_vnd[i], 0, sizeof(scomm_vnd_st));
+        scomm_vnd[i].fd           = -1;
+        scomm_vnd[i].driver_state = FALSE;
+        scomm_vnd[i].mode         = O_RDWR;
+    }
+
+    pthread_mutex_init(&write2host_lock, NULL);
+}
+
+void scomm_vendor_set_port_name(uint8_t port_index, char *port_name, int mode)
+{
+    int len = strlen(port_name);
+    memset(scomm_vnd[port_index].port_name, 0, DEVICE_NODE_MAX_LEN);
+    if(len < DEVICE_NODE_MAX_LEN)
+    {
+        memcpy(scomm_vnd[port_index].port_name, port_name, len);
+    }
+    scomm_vnd[port_index].mode = mode;
+
+    ALOGD("skwbt_device_node:%s, port:%d", port_name, port_index);
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_tcio_baud
+**
+** Description     helper function converts USERIAL baud rates into TCIO
+**                  conforming baud rates
+**
+** Returns         TRUE/FALSE
+**
+*******************************************************************************/
+uint8_t scomm_vendor_tcio_baud(uint8_t cfg_baud, uint32_t *baud)
+{
+    if (cfg_baud == USERIAL_BAUD_115200)
+    {
+        *baud = B115200;
+    }
+    else if (cfg_baud == USERIAL_BAUD_4M)
+    {
+        *baud = B4000000;
+    }
+    else if (cfg_baud == USERIAL_BAUD_3M)
+    {
+        *baud = B3000000;
+    }
+    else if (cfg_baud == USERIAL_BAUD_2M)
+    {
+        *baud = B2000000;
+    }
+    else if (cfg_baud == USERIAL_BAUD_1M)
+    {
+        *baud = B1000000;
+    }
+    else if (cfg_baud == USERIAL_BAUD_1_5M)
+    {
+        *baud = B1500000;
+    }
+    else if (cfg_baud == USERIAL_BAUD_921600)
+    {
+        *baud = B921600;
+    }
+    else if (cfg_baud == USERIAL_BAUD_460800)
+    {
+        *baud = B460800;
+    }
+    else if (cfg_baud == USERIAL_BAUD_230400)
+    {
+        *baud = B230400;
+    }
+    else if (cfg_baud == USERIAL_BAUD_57600)
+    {
+        *baud = B57600;
+    }
+    else if (cfg_baud == USERIAL_BAUD_19200)
+    {
+        *baud = B19200;
+    }
+    else if (cfg_baud == USERIAL_BAUD_9600)
+    {
+        *baud = B9600;
+    }
+    else if (cfg_baud == USERIAL_BAUD_1200)
+    {
+        *baud = B1200;
+    }
+    else if (cfg_baud == USERIAL_BAUD_600)
+    {
+        *baud = B600;
+    }
+    else
+    {
+        ALOGE( "userial vendor open: unsupported baud idx %i", cfg_baud);
+        *baud = B115200;
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_uart_open
+**
+** Description     Uart Open
+**
+** Returns         None
+**
+*******************************************************************************/
+int scomm_vendor_uart_open(uint8_t port_index)
+{
+    tUSERIAL_CFG *p_cfg = &userial_H4_cfg;
+    uint32_t baud;
+    uint8_t data_bits;
+    uint16_t parity;
+    uint8_t stop_bits;
+
+    scomm_vnd[port_index].fd = -1;
+
+    if (!scomm_vendor_tcio_baud(p_cfg->baud, &baud))
+    {
+        return -1;
+    }
+
+    if(p_cfg->fmt & USERIAL_DATABITS_8)
+    {
+        data_bits = CS8;
+    }
+    else if(p_cfg->fmt & USERIAL_DATABITS_7)
+    {
+        data_bits = CS7;
+    }
+    else if(p_cfg->fmt & USERIAL_DATABITS_6)
+    {
+        data_bits = CS6;
+    }
+    else if(p_cfg->fmt & USERIAL_DATABITS_5)
+    {
+        data_bits = CS5;
+    }
+    else
+    {
+        ALOGE("userial vendor open: unsupported data bits");
+        return -1;
+    }
+
+    if(p_cfg->fmt & USERIAL_PARITY_NONE)
+    {
+        parity = 0;
+    }
+    else if(p_cfg->fmt & USERIAL_PARITY_EVEN)
+    {
+        parity = PARENB;
+    }
+    else if(p_cfg->fmt & USERIAL_PARITY_ODD)
+    {
+        parity = (PARENB | PARODD);
+    }
+    else
+    {
+        ALOGE("userial vendor open: unsupported parity bit mode");
+        return -1;
+    }
+
+    if(p_cfg->fmt & USERIAL_STOPBITS_1)
+    {
+        stop_bits = 0;
+    }
+    else if(p_cfg->fmt & USERIAL_STOPBITS_2)
+    {
+        stop_bits = CSTOPB;
+    }
+    else
+    {
+        ALOGE("userial vendor open: unsupported stop bits");
+        return -1;
+    }
+
+    ALOGI("userial vendor open: opening %s,baud:%d", scomm_vnd[port_index].port_name, p_cfg->baud);
+
+    if ((scomm_vnd[port_index].fd = open(scomm_vnd[port_index].port_name, O_RDWR)) == -1)
+    {
+        ALOGE("userial vendor open: unable to open %s, %s", scomm_vnd[port_index].port_name, strerror(errno));
+        return -1;
+    }
+
+    tcflush(scomm_vnd[port_index].fd, TCIOFLUSH);
+
+    tcgetattr(scomm_vnd[port_index].fd, &scomm_vnd[port_index].termios);
+    cfmakeraw(&scomm_vnd[port_index].termios);
+
+    if(p_cfg->hw_fctrl == USERIAL_HW_FLOW_CTRL_ON)
+    {
+        ALOGI("userial vendor open: with HW flowctrl ON");
+        scomm_vnd[port_index].termios.c_cflag |= (CRTSCTS | stop_bits | parity);
+    }
+    else
+    {
+        ALOGI("userial vendor open: with HW flowctrl OFF");
+        scomm_vnd[port_index].termios.c_cflag &= ~CRTSCTS;
+        scomm_vnd[port_index].termios.c_cflag |= (stop_bits | parity);
+
+    }
+
+    tcsetattr(scomm_vnd[port_index].fd, TCSANOW, &scomm_vnd[port_index].termios);
+    tcflush(scomm_vnd[port_index].fd, TCIOFLUSH);
+
+    tcsetattr(scomm_vnd[port_index].fd, TCSANOW, &scomm_vnd[port_index].termios);
+    tcflush(scomm_vnd[port_index].fd, TCIOFLUSH);
+    tcflush(scomm_vnd[port_index].fd, TCIOFLUSH);
+
+    /* set input/output baudrate */
+    cfsetospeed(&scomm_vnd[port_index].termios, baud);
+    cfsetispeed(&scomm_vnd[port_index].termios, baud);
+    tcsetattr(scomm_vnd[port_index].fd, TCSANOW, &scomm_vnd[port_index].termios);
+
+
+    ALOGE("UART device fd = %d Open", scomm_vnd[port_index].fd);
+
+
+    return scomm_vnd[port_index].fd;
+
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_usbsdio_open
+**
+** Description     check port name valid
+**
+** Returns         None
+**
+*******************************************************************************/
+uint8_t scomm_vendor_check_port_valid(uint8_t port_index)
+{
+    if(scomm_vnd[port_index].port_name[0] == 0)
+    {
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_usbsdio_open
+**
+** Description     USB/SDIO Open
+**
+** Returns         None
+**
+*******************************************************************************/
+int scomm_vendor_usbsdio_open(uint8_t port_index)
+{
+    if ((scomm_vnd[port_index].fd = open(scomm_vnd[port_index].port_name, O_RDWR)) == -1)
+    {
+        ALOGE("%s: unable to open %s: %s", __func__, scomm_vnd[port_index].port_name, strerror(errno));
+        return -1;
+    }
+    ALOGD("USB/SDIO device[%d], %s fd = %d open", port_index, scomm_vnd[port_index].port_name, scomm_vnd[port_index].fd);
+
+    return scomm_vnd[port_index].fd;
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_recv_rawdata
+**
+** Description     recv data from host and process
+**
+** Returns         None
+**
+*******************************************************************************/
+uint8_t pkt_cnts = 0;
+static void scomm_vendor_recv_rawdata(void *context)
+{
+    SKW_UNUSED(context);
+    uint8_t port_index = 0;//(uint8_t)context;
+    ssize_t  bytes_read = 0;
+    uint8_t  pkt_type = 0, offset = 1;
+    uint16_t need_read_lens = 0, total_len = 0;
+    int16_t  rev_len = 0;
+
+    //SKWBT_LOG("%s [%d] start", __func__, port_index);
+
+    //do{
+
+    //-----------type-------------//
+    //do
+    {
+        rev_len = read(scomm_vnd[port_index].socket_fd[1], recvSocketBuf, 1);
+        if(rev_len <= 0)
+        {
+            ALOGE("%s type read err, rev_len:%d", __func__, rev_len);
+            return ;
+        }
+        bytes_read += rev_len;
+    }
+    //while (bytes_read < 1);
+
+    total_len = 1;
+    pkt_type = recvSocketBuf[0];
+    if((pkt_type == HCI_COMMAND_PKT) || (pkt_type == HCI_ACLDATA_PKT) || (pkt_type == HCI_SCODATA_PKT) || (pkt_type == HCI_ISO_PKT))
+    {
+        need_read_lens = hci_preamble_sizes[pkt_type];
+    }
+    else
+    {
+        ALOGE("%s invalid data type: %d", __func__, pkt_type);
+        assert(0);
+    }
+    offset += need_read_lens;
+
+    //SKWBT_LOG("pkt_type:%d, bytes_read:%zd, offset:%d", pkt_type, bytes_read, offset);
+
+    //-----------header-------------//
+    bytes_read = 0;
+    offset = 1;
+    do
+    {
+        rev_len = read(scomm_vnd[port_index].socket_fd[1], recvSocketBuf + offset + bytes_read, need_read_lens);
+        if(rev_len < 0)
+        {
+            ALOGE("%s header read err, rev_len:%d", __func__, rev_len);
+            return ;
+        }
+        bytes_read += rev_len;
+        //SKWBT_LOG("header bytes_read:%zd, need_read_lens:%d", bytes_read, need_read_lens);
+    } while (bytes_read < need_read_lens);
+    offset += need_read_lens;
+
+    total_len += need_read_lens;
+    //get payload length
+    if((pkt_type == HCI_ACLDATA_PKT) || (pkt_type == HCI_ISO_PKT))
+    {
+        need_read_lens = *(uint16_t *)&recvSocketBuf[HCI_COMMON_DATA_LENGTH_INDEX];
+    }
+    else if((pkt_type == HCI_EVENT_PKT) || (pkt_type == HCI_EVENT_SKWLOG))
+    {
+        need_read_lens = recvSocketBuf[HCI_EVENT_DATA_LENGTH_INDEX];
+    }
+    else//cmd/sco
+    {
+        need_read_lens = recvSocketBuf[HCI_COMMON_DATA_LENGTH_INDEX];
+    }
+    //-----------payload-------------//
+    bytes_read = 0;
+    if(need_read_lens > 0)
+    {
+        do
+        {
+            rev_len = read(scomm_vnd[port_index].socket_fd[1], recvSocketBuf + offset + bytes_read, need_read_lens);
+            if(rev_len < 0)
+            {
+                ALOGE("%s header read err, rev_len:%d", __func__, rev_len);
+                return ;
+            }
+            bytes_read += rev_len;
+            //SKWBT_LOG("payload bytes_read:%zd, need_read_lens:%d", bytes_read, need_read_lens);
+        } while (bytes_read < need_read_lens);
+        total_len += need_read_lens;
+    }
+
+
+    uint8_t str_buffer[200] = {0};
+    hex2String(recvSocketBuf, str_buffer, (total_len > 64) ? 64 : total_len);
+
+    if((skwbt_transtype & SKWBT_TRANS_TYPE_UART) && (skwbtuartonly == FALSE) && (skwbtNoSleep == FALSE) && (btpw_fp > 0))//uart
+    {
+        char tmp_buf[6] = {0};
+        int r_len;
+
+        tmp_buf[0] = pkt_cnts ++;
+        r_len = write(btpw_fp, tmp_buf, 1);
+        SKWBT_LOG("r_len:%d, btpw_fp:%d, pkt_cnts:%d", r_len, btpw_fp, pkt_cnts);
+    }
+
+    uint16_t length = total_len;
+    uint16_t transmitted_length = 0;
+    uint8_t  send_port = BT_COM_PORT_CMDEVT;
+    if(skwbt_transtype & SKWBT_TRANS_TYPE_SDIO)
+    {
+        switch(recvSocketBuf[0])
+        {
+            case HCI_ACLDATA_PKT:
+                send_port = BT_COM_PORT_ACL;
+                break;
+            case HCI_SCODATA_PKT:
+                send_port = BT_COM_PORT_AUDIO;
+                break;
+            case HCI_ISO_PKT:
+                send_port = BT_COM_PORT_ISO;
+                break;
+            default:
+                send_port = BT_COM_PORT_CMDEVT;
+                break;
+        }
+    }
+
+
+    SKWBT_LOG("total_len:%d, port:%d, %s", total_len, send_port, str_buffer);
+
+    skw_btsnoop_capture(recvSocketBuf, FALSE);
+
+
+
+    while((length > 0) && scomm_vnd[send_port].driver_state)
+    {
+        ssize_t ret = write(scomm_vnd[send_port].fd, recvSocketBuf + transmitted_length, length);
+
+        switch (ret)
+        {
+            case -1:
+                ALOGE("In %s, error writing to the scomm: %s", __func__, strerror(errno));
+                return ;
+            //break;
+            case 0:
+                ALOGE("%s, ret %zd", __func__, ret);
+                break;
+            default:
+                transmitted_length += ret;
+                length -= ret;
+                //break;
+        }
+    }
+
+    //SKWBT_LOG("%s [%d] end", __func__, port_index);
+}
+
+static void *scomm_vendor_recv_socket_thread(void *arg)
+{
+    //SKW_UNUSED(arg);
+    int port_index = (int)((long)arg);//for error: cast from pointer to integer of different size
+    struct epoll_event events[32];
+    scomm_vnd_st *scomm = &scomm_vnd[0];
+    int j, ret;
+
+    ALOGD("%s [%d] start", __func__, port_index);
+
+    while(scomm->thread_running)
+    {
+        do
+        {
+            ret = epoll_wait(scomm->epoll_fd, events, 32, 500);
+
+            //ALOGE("recv_socket_thread ret:%d, state:%d", ret, scomm->thread_running);
+
+        } while(scomm->thread_running && (ret == -1) && (errno == EINTR));
+
+        if (ret < 0)
+        {
+            ALOGE("%s error in epoll_wait:%d, %s", __func__, ret, strerror(errno));
+            break;
+        }
+        for (j = 0; (j < ret) && (scomm->thread_running); ++j)
+        {
+            skw_socket_object_st *object = (skw_socket_object_st *)events[j].data.ptr;
+            if (object == NULL)
+            {
+                continue;
+            }
+            else
+            {
+                if (events[j].events & (EPOLLIN | EPOLLHUP | EPOLLRDHUP | EPOLLERR) && object->read_ready)
+                {
+                    object->read_ready(object->context);
+                    //object->read_ready(port_index);
+                }
+            }
+        }
+    }
+    //scomm_vnd[port_index].thread_socket_id = -1;
+
+    ALOGD("%s [%d] exit", __func__, port_index);
+    return NULL;
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_send_to_host
+**
+** Description     send data to host
+**
+** Returns         None
+**
+*******************************************************************************/
+static void scomm_vendor_send_to_host(uint8_t port_index, unsigned char *buffer, unsigned int total_length)
+{
+    unsigned int length = total_length;
+    uint16_t transmitted_length = 0;
+    ssize_t ret;
+
+
+    pthread_mutex_lock(&write2host_lock);
+    while ((length > 0) && scomm_vnd[port_index].thread_running)
+    {
+        RW_NO_INTR(ret = write(scomm_vnd[port_index].socket_fd[1], buffer + transmitted_length, length));
+
+        //SKWBT_LOG("write to host ret:%zd", ret);
+        switch (ret)
+        {
+            case -1:
+                ALOGE("In %s, error writing to socket: %s", __func__, strerror(errno));
+                break;
+            case 0:
+                break;
+            default:
+                transmitted_length += ret;
+                length -= ret;
+                break;
+        }
+    }
+    pthread_mutex_unlock(&write2host_lock);
+
+    SKWBT_LOG("write to host[%d] total_length:%d, ret:%zd", port_index, total_length, ret);
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_send_hw_error
+**
+** Description     send HCI_HW_ERR command to hsot
+**
+** Returns         None
+**
+*******************************************************************************/
+
+void scomm_vendor_send_hw_error()
+{
+    unsigned char p_buf[10];
+
+    ALOGE("%s, CP Error", __func__);
+
+    p_buf[0] = HCI_EVENT_PKT;//event
+    p_buf[1] = HCI_HARDWARE_ERROR_EVENT;//hardware error
+    p_buf[2] = 0x01;//len
+    p_buf[3] = HWERR_CODE_CP_ERROR;//userial error code
+    scomm_vendor_send_to_host(0, p_buf, 4);
+}
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_find_valid_type
+**
+** Description     find the index of valid packet type
+**
+** Returns         None
+**
+*******************************************************************************/
+int scomm_vendor_find_valid_type(uint8_t *buffer, uint16_t len)
+{
+    int i;
+    for(i = 0; i < len; i++)
+    {
+        switch(buffer[i])
+        {
+            case HCI_EVENT_PKT:
+            case HCI_ACLDATA_PKT:
+            case HCI_SCODATA_PKT:
+            //case HCI_COMMAND_PKT:
+            case HCI_EVENT_SKWLOG:
+                return i;
+            default:
+                break;
+        }
+#if 0
+        if((HCI_EVENT_PKT == buffer[i]) || (HCI_ACLDATA_PKT == buffer[i]) || (HCI_SCODATA_PKT == buffer[i]) || (HCI_COMMAND_PKT == buffer[i])
+                || (HCI_EVENT_SKWLOG == buffer[i]))
+        {
+            return i;
+        }
+#endif
+    }
+    return len;
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_recv_scomm_thread
+**
+** Description     recv data from UART/USB/SDIO and process
+**
+** Returns         None
+**
+*******************************************************************************/
+static void *scomm_vendor_recv_scomm_thread(void *arg)
+{
+    //SKW_UNUSED(arg);
+    int port_index = (int)((long)arg);
+    struct pollfd pfd[2];
+    scomm_vnd_st *scomm = &scomm_vnd[port_index];
+    pfd[0].events = POLLIN | POLLHUP | POLLERR | POLLRDHUP;
+    pfd[0].fd = scomm->signal_fd[1];
+    pfd[1].events = POLLIN | POLLHUP | POLLERR | POLLRDHUP;
+    pfd[1].fd = scomm->fd;
+
+    uint8_t   read_buffer[SCOM_READ_BUFFER_LEN + 1] = {0};
+    uint8_t   str_buffer[SCOM_READ_BUFFER_LEN + 1] = {0};
+    ssize_t   bytes_read;
+    uint16_t  last_len = 0, rev_len = 0;
+    int       ret, is_uart = (skwbt_transtype & SKWBT_TRANS_TYPE_UART);
+
+    scomm->recv_comm_thread_running = TRUE;
+    scomm->read_retry = 0;
+    ALOGD("%s [%d] start, is_uart:%d", __func__, port_index, is_uart);
+
+    while(scomm->thread_running)
+    {
+        if(is_uart)
+        {
+            do
+            {
+                ret = poll(pfd, 2, 500);
+            } while(ret == -1 && errno == EINTR && scomm->thread_running);
+            //exit signal is always at first index
+            if(pfd[0].revents && !scomm->thread_running)
+            {
+                ALOGE("receive exit signal and stop thread ");
+                break;
+            }
+            if (pfd[1].revents & (POLLERR | POLLHUP))
+            {
+                ALOGE("%s poll error, fd : %d", __func__, scomm->fd);
+                scomm->driver_state = FALSE;
+                close(scomm->fd);
+                break;
+            }
+            if(!(pfd[1].revents & POLLIN))
+            {
+                continue;
+            }
+        }
+
+
+        scomm->is_busying = FALSE;
+        bytes_read = read(scomm->fd, read_buffer + last_len, SCOM_READ_BUFFER_LEN - last_len);
+        scomm->is_busying = TRUE;
+
+        if(bytes_read == 0)
+        {
+            if(scomm->thread_running)
+            {
+                continue;
+            }
+            break;
+        }
+        if(bytes_read < 0)
+        {
+            ALOGE("%s, read fail, thread[%d] state:%d, error code:%zd, %s, read_retry:%d", __func__, port_index, (scomm->thread_running), bytes_read, strerror(errno), scomm->read_retry);
+            if((scomm->thread_running) && (0 == port_index))
+            {
+                if(scomm->read_retry == 0)
+                {
+                    scomm->read_retry = 1;
+                    usleep(200000);
+                    continue;
+                }
+                scomm_vendor_send_hw_error();
+            }
+            break;
+        }
+        if(read_buffer[0] != HCI_EVENT_SKWLOG)
+        {
+            hex2String(read_buffer + last_len, str_buffer, (bytes_read > 64) ? 64 : bytes_read);
+            SKWBT_LOG("scomm[%d] read:%zd, last_len:%d, %s", port_index, bytes_read, last_len, str_buffer);
+        }
+
+        //data parse for get a commplete packet and capture the snoop log
+        rev_len = bytes_read + last_len;
+        do
+        {
+            uint8_t pkt_type = read_buffer[0];
+            if((pkt_type == HCI_EVENT_PKT) || (pkt_type == HCI_ACLDATA_PKT) || (pkt_type == HCI_SCODATA_PKT) || (pkt_type == HCI_EVENT_SKWLOG) || (pkt_type == HCI_ISO_PKT))
+            {
+                uint16_t hdr_lens = hci_preamble_sizes[pkt_type] + 1;
+                if(rev_len >= hdr_lens)
+                {
+                    uint16_t pkt_len = 0;
+                    //get payload length
+                    if((pkt_type == HCI_ACLDATA_PKT) || (pkt_type == HCI_ISO_PKT))
+                    {
+                        pkt_len = *(uint16_t *)&read_buffer[HCI_COMMON_DATA_LENGTH_INDEX];
+                    }
+                    else if(pkt_type == HCI_EVENT_PKT)
+                    {
+                        pkt_len = read_buffer[HCI_EVENT_DATA_LENGTH_INDEX];
+                    }
+                    else if(pkt_type == HCI_EVENT_SKWLOG)
+                    {
+                        pkt_len = *(uint16_t *)&read_buffer[HCI_SKWLOG_DATA_LENGTH_INDEX];
+                    }
+                    else//cmd/sco
+                    {
+                        pkt_len = read_buffer[HCI_COMMON_DATA_LENGTH_INDEX];
+                    }
+
+                    SKWBT_LOG("rev_len:%d, pkt_type:%d, hdr_lens:%d, pkt_len:%d", rev_len, pkt_type, hdr_lens, pkt_len);
+
+                    pkt_len += hdr_lens;
+                    if(rev_len >= pkt_len)
+                    {
+                        if(pkt_type == HCI_EVENT_SKWLOG)
+                        {
+                            skwlog_write(read_buffer, pkt_len);
+                        }
+                        else//
+                        {
+
+                            skw_btsnoop_capture(read_buffer, TRUE);
+                            scomm_vendor_send_to_host(0, read_buffer, pkt_len);
+                        }
+                        last_len = rev_len - pkt_len;
+                        if((pkt_len + last_len) <= SCOM_READ_BUFFER_LEN)
+                        {
+                            memcpy(read_buffer, read_buffer + pkt_len, last_len);
+                        }
+                        else
+                        {
+                            ALOGE("%s, err packet, pkt_len:%d, last_len:%d", __func__, pkt_len, last_len);
+                        }
+                        if(last_len >= 4)
+                        {
+                            rev_len = last_len;
+                            SKWBT_LOG(" more packet, rev_len:%d ", rev_len);
+                            continue;
+                        }
+
+                    }
+                    else
+                    {
+                        last_len = rev_len;
+                        SKWBT_LOG("need more, rev_len:%d, pkt_len:%d, last_len:%d", rev_len, pkt_len, last_len);
+                    }
+                }
+                else
+                {
+                    last_len = rev_len;
+                }
+            }
+            else//invalid data, discard
+            {
+                int vLen = scomm_vendor_find_valid_type(read_buffer, rev_len);
+                ALOGE("invalid type:%02X, vLen:%d", pkt_type, vLen);
+
+                last_len = rev_len - vLen;
+                if(vLen < rev_len)
+                {
+                    memcpy(read_buffer, read_buffer + vLen, last_len);
+                }
+            }
+
+            break;
+        } while (1);
+    }
+
+
+    scomm->is_busying = FALSE;
+    scomm->thread_uart_id = -1;
+
+    ALOGD("%s [%d] exit", __func__, port_index);
+    return NULL;
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_socket_open
+**
+** Description     USB/SDIO Open
+**
+** Returns         None
+**
+*******************************************************************************/
+int scomm_vendor_socket_open(uint8_t port_index)
+{
+    int ret = 0;
+    struct epoll_event event;
+    if((ret = socketpair(AF_UNIX, SOCK_STREAM, 0, scomm_vnd[port_index].socket_fd)) < 0)
+    {
+        ALOGE("%s, errno : %s", __func__, strerror(errno));
+        return ret;
+    }
+
+    if((ret = socketpair(AF_UNIX, SOCK_STREAM, 0, scomm_vnd[port_index].signal_fd)) < 0)
+    {
+        ALOGE("%s, errno : %s", __func__, strerror(errno));
+        return ret;
+    }
+
+    scomm_vnd[port_index].epoll_fd = epoll_create(4);
+    if (scomm_vnd[port_index].epoll_fd == -1)
+    {
+        ALOGE("%s unable to create epoll instance: %s", __func__, strerror(errno));
+        return -1;
+    }
+
+    scomm_vnd[port_index].thread_running = TRUE;
+    scomm_vnd[port_index].recv_comm_thread_running = FALSE;
+    scomm_vnd[port_index].thread_socket_id = -1;
+
+    pthread_attr_t thread_attr;
+    pthread_attr_init(&thread_attr);
+    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
+
+    memset(&event, 0, sizeof(event));
+    event.events = EPOLLIN | EPOLLHUP | EPOLLRDHUP | EPOLLERR;
+    event.data.ptr = (void *)&skw_socket_object;
+    if (epoll_ctl(scomm_vnd[port_index].epoll_fd, EPOLL_CTL_ADD, scomm_vnd[port_index].socket_fd[1], &event) == -1)
+    {
+        ALOGE("%s unable to register fd %d to epoll set: %s", __func__, scomm_vnd[port_index].socket_fd[1], strerror(errno));
+        close(scomm_vnd[port_index].epoll_fd);
+        scomm_vnd[port_index].epoll_fd = -1;
+        scomm_vnd[port_index].thread_running = FALSE;
+        return -1;
+    }
+
+    event.data.ptr = NULL;
+    if (epoll_ctl(scomm_vnd[port_index].epoll_fd, EPOLL_CTL_ADD, scomm_vnd[port_index].signal_fd[0], &event) == -1)
+    {
+        ALOGE("%s unable to register signal0 fd %d to epoll set: %s", __func__, scomm_vnd[port_index].signal_fd[0], strerror(errno));
+        close(scomm_vnd[port_index].epoll_fd);
+        scomm_vnd[port_index].epoll_fd = -1;
+        scomm_vnd[port_index].thread_running = FALSE;
+        return -1;
+    }
+
+
+    if(port_index == 0)
+    {
+        skw_socket_object.fd = scomm_vnd[port_index].socket_fd[1];
+        skw_socket_object.read_ready = scomm_vendor_recv_rawdata;
+        skw_socket_object.write_ready = NULL;
+
+        if (pthread_create(&scomm_vnd[port_index].thread_socket_id, &thread_attr, scomm_vendor_recv_socket_thread, (void *)(long)port_index) != 0 )
+        {
+            ALOGE("pthread_create : %s", strerror(errno));
+            close(scomm_vnd[port_index].epoll_fd);
+            scomm_vnd[port_index].epoll_fd = -1;
+            scomm_vnd[port_index].thread_socket_id = -1;
+            scomm_vnd[port_index].thread_running = FALSE;
+            return -1;
+        }
+    }
+
+
+    if (pthread_create(&scomm_vnd[port_index].thread_uart_id, &thread_attr, scomm_vendor_recv_scomm_thread, (void *)(long)port_index) != 0 )
+    {
+        ALOGE("pthread_create : %s", strerror(errno));
+        close(scomm_vnd[port_index].epoll_fd);
+        scomm_vnd[port_index].thread_running = FALSE;
+        pthread_join(scomm_vnd[port_index].thread_socket_id, NULL);
+        scomm_vnd[port_index].thread_socket_id = -1;
+        return -1;
+    }
+    while(!scomm_vnd[port_index].recv_comm_thread_running)
+    {
+        usleep(20);
+    }
+
+    scomm_vnd[port_index].driver_state = TRUE;
+
+    ret = scomm_vnd[port_index].socket_fd[0];
+
+    ALOGD("%s socket_fd:%d", __func__, ret);
+    return ret;
+}
+
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_socket_close
+**
+** Description     socket close
+**
+** Returns         None
+**
+*******************************************************************************/
+static void scomm_vendor_socket_close(uint8_t port_index)
+{
+    int result;
+
+    ALOGE( "%s [%d], thread_socket_id:0x%X", __func__, port_index, (int)scomm_vnd[port_index].thread_socket_id);
+
+    if ((scomm_vnd[port_index].socket_fd[0] > 0) && (result = close(scomm_vnd[port_index].socket_fd[0])) < 0)
+    {
+        ALOGE( "%s (fd:%d) FAILED result:%d", __func__, scomm_vnd[port_index].socket_fd[0], result);
+    }
+
+    if (epoll_ctl(scomm_vnd[port_index].epoll_fd, EPOLL_CTL_DEL, scomm_vnd[port_index].socket_fd[1], NULL) == -1)
+    {
+        ALOGE("%s unable to unregister fd %d from epoll set: %s", __func__, scomm_vnd[port_index].socket_fd[1], strerror(errno));
+    }
+    if (epoll_ctl(scomm_vnd[port_index].epoll_fd, EPOLL_CTL_DEL, scomm_vnd[port_index].signal_fd[0], NULL) == -1)
+    {
+        ALOGE("%s unable to unregister signal0 fd %d from epoll set: %s", __func__, scomm_vnd[port_index].signal_fd[0], strerror(errno));
+    }
+
+    if(scomm_vnd[port_index].epoll_fd > 0)
+    {
+        close(scomm_vnd[port_index].epoll_fd);
+    }
+
+    if(scomm_vnd[port_index].thread_socket_id != -1)
+    {
+        if ((result = pthread_join(scomm_vnd[port_index].thread_socket_id, NULL)) < 0)
+        {
+            ALOGE( "data thread pthread_join()  scomm_vnd[port_index].thread_socket_id failed result:%d", result);
+        }
+        else
+        {
+            scomm_vnd[port_index].thread_socket_id = -1;
+            ALOGE( "data thread pthread_join() scomm_vnd[port_index].thread_socket_id pthread_join_success result:%d", result);
+        }
+    }
+
+    if ((scomm_vnd[port_index].socket_fd[1] > 0) && (result = close(scomm_vnd[port_index].socket_fd[1])) < 0)
+    {
+        ALOGE( "%s (fd:%d) FAILED result:%d", __func__, scomm_vnd[port_index].socket_fd[1], result);
+    }
+
+    if ((scomm_vnd[port_index].signal_fd[0] > 0) && (result = close(scomm_vnd[port_index].signal_fd[0])) < 0)
+    {
+        ALOGE( "%s (signal fd[0]:%d) FAILED result:%d", __func__, scomm_vnd[port_index].signal_fd[0], result);
+    }
+    if ((scomm_vnd[port_index].signal_fd[1] > 0) && (result = close(scomm_vnd[port_index].signal_fd[1])) < 0)
+    {
+        ALOGE( "%s (signal fd[1]:%d) FAILED result:%d", __func__, scomm_vnd[port_index].signal_fd[1], result);
+    }
+
+    scomm_vnd[port_index].epoll_fd = -1;
+    scomm_vnd[port_index].socket_fd[0] = -1;
+    scomm_vnd[port_index].socket_fd[1] = -1;
+    scomm_vnd[port_index].signal_fd[0] = -1;
+    scomm_vnd[port_index].signal_fd[1] = -1;
+    ALOGE( "%s [%d] end", __func__, port_index);
+}
+
+
+void scomm_vendor_write_bt_state()
+{
+    //if(skwbt_transtype & SKWBT_TRANS_TYPE_USB)
+    if(chip_version == SKW_CHIPID_6160)
+    {
+        char buffer[10] = {0x01, 0x80, 0xFE, 0x01, 0x00};
+        scomm_vnd_st *scomm = &scomm_vnd[0];
+        write(scomm->fd, buffer, 5);
+        usleep(15000);
+    }
+}
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_port_close
+**
+** Description     Conduct vendor-specific close works
+**
+** Returns         None
+**
+*******************************************************************************/
+void scomm_vendor_port_close(uint8_t port_index)
+{
+    //send close signal
+    unsigned char close_signal = 1;
+    ssize_t ret;
+    int res, i;
+    scomm_vnd_st *scomm = &scomm_vnd[port_index];
+    ALOGD( "%s [%d] start, fd:%d, busy:%d", __func__, port_index, scomm->fd, scomm->is_busying);
+
+    if(scomm->fd == -1)
+    {
+        return;
+    }
+
+    scomm->thread_running = FALSE;
+    scomm->driver_state = FALSE;
+
+    while(scomm->is_busying)
+    {
+        usleep(20);
+    }
+
+    res = ioctl(scomm->fd, 0);
+    //ALOGE("res:%d, %s", res, strerror(errno));
+
+    ALOGE("%s signal_fd:%d", __func__, scomm->signal_fd[1]);
+    RW_NO_INTR(ret = write(scomm->signal_fd[1], &close_signal, 1));
+
+    usleep(300);//wait
+    for(i = 0; (skwbt_transtype & SKWBT_TRANS_TYPE_SDIO) && (i < 2) && (scomm->thread_uart_id != -1); i++)
+    {
+        res = ioctl(scomm->fd, 0);//try again
+        usleep(200);
+        ALOGD("%s,%d times:%d, res:%d, %s", __func__, port_index, i, res, strerror(errno));
+    }
+
+    //scomm close
+    if ((scomm->fd > 0) && (res = close(scomm->fd)) < 0)
+    {
+        ALOGE( "%s (fd:%d) FAILED result:%d", __func__, scomm->fd, res);
+    }
+
+    ALOGD("Run Here");
+
+    if(scomm->thread_uart_id != -1)
+    {
+        pthread_join(scomm->thread_uart_id, NULL);
+        scomm->thread_uart_id = -1;
+    }
+
+    scomm_vendor_socket_close(port_index);
+
+    //close(scomm_vnd[port_index].fd);
+    scomm->fd = -1;
+
+
+    ALOGD( "%s [%d] finish", __func__, port_index);
+
+}
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_close
+**
+** Description     Conduct vendor-specific close works
+**
+** Returns         None
+**
+*******************************************************************************/
+void scomm_vendor_close()
+{
+    int idx = 0;
+    for(idx = 0; idx < BT_COM_PORT_SIZE; idx++)
+    {
+        scomm_vendor_port_close(idx);
+    }
+    if(btpw_fp > 0)
+    {
+        close(btpw_fp);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         scomm_vendor_init_err
+**
+** Description      init err
+**
+** Returns          None
+**
+*******************************************************************************/
+void scomm_vendor_init_err(HC_BT_HDR   *p_buf)
+{
+    hw_cfg_cb.state = HW_CFG_INIT;
+    bt_vendor_cbacks->dealloc(p_buf);
+    fclose(hw_cfg_cb.nv_fp);
+    hw_cfg_cb.nv_fp = NULL;
+
+}
+
+/*******************************************************************************
+**
+** Function         scomm_vendor_config_callback
+**
+** Description      Callback function for controller configuration
+**
+** Returns          None
+**
+*******************************************************************************/
+void scomm_vendor_config_callback(void *p_mem)
+{
+    uint8_t     status = 0;
+    uint16_t    opcode = 0;
+    HC_BT_HDR   *p_buf = NULL;
+    HC_BT_HDR   *p_evt_buf = NULL;
+
+
+    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);
+        uint8_t *p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE_OFFSET;
+        STREAM_TO_UINT16(opcode, p);
+    }
+
+
+    ALOGD("%s status:%d ,opcode:%04X", __func__, status, opcode);
+    if((status == 0) && bt_vendor_cbacks)
+    {
+        p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + HCI_CMD_MAX_LEN);
+    }
+
+    if(p_buf)
+    {
+        p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
+        p_buf->offset = 0;
+        p_buf->len = 0;
+        p_buf->layer_specific = 0;
+
+        ALOGD("hw_cfg_cb.state = %d", hw_cfg_cb.state);
+
+        switch (hw_cfg_cb.state)
+        {
+            case HW_CFG_START:
+            {
+                uint8_t *ptr = (uint8_t *) (p_buf + 1);
+                UINT16_TO_STREAM(ptr, HCI_READ_LOCAL_VERSION_INFO);
+                UINT8_TO_STREAM(ptr, 0);
+
+                p_buf->len = 3;//packet len
+                bt_vendor_cbacks->xmit_cb(HCI_READ_LOCAL_VERSION_INFO, p_buf, scomm_vendor_config_callback);
+                hw_cfg_cb.state = HW_CFG_READ_HCI_VERSION;
+                break;
+            }
+            case HW_CFG_READ_HCI_VERSION:
+            {
+                char file_name[128] = {0};
+                uint8_t skip_header = 0;
+                uint8_t *p = (uint8_t *)(p_evt_buf + 1) + 7;
+                if(p == NULL)
+                {
+                    ALOGE("%s invalid ptr", __func__);
+                    bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
+                    hw_cfg_cb.state = HW_CFG_INIT;
+                    return ;
+                }
+                STREAM_TO_UINT16(chip_version, p);
+
+                ALOGD("chip_version:0x%04X", chip_version);
+
+                switch(chip_version)
+                {
+                    case SKW_CHIPID_6316://0x6316
+                    {
+                        skip_header = 1;
+                        sprintf(file_name, "%s/sv6316.nvbin", SKWBT_NV_FILE_PATH);
+                        break;
+                    }
+                    case SKW_CHIPID_6160_LITE:
+                    {
+                        skip_header = 1;
+                        sprintf(file_name, "%s/sv6160lite.nvbin", SKWBT_NV_FILE_PATH);
+                        break;
+                    }
+                    default:
+                    {
+                        sprintf(file_name, "%s/sv6160.nvbin", SKWBT_NV_FILE_PATH);
+                        chip_version = SKW_CHIPID_6160;
+                        break;
+                    }
+                }
+
+                hw_cfg_cb.nv_fp = fopen(file_name, "rb");
+                if(!hw_cfg_cb.nv_fp)
+                {
+                    ALOGE("%s unable to open nv file:%s: %s", __func__, file_name, strerror(errno));
+                    bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
+                    hw_cfg_cb.state = HW_CFG_INIT;
+                    return;
+                }
+                hw_cfg_cb.file_offset = 0;
+                hw_cfg_cb.state = HW_CFG_NV_SEND;
+                if(skip_header)//skip header
+                {
+                    char buffer[6];
+                    fread(buffer, 1, 4, hw_cfg_cb.nv_fp);
+                }
+            }
+            case HW_CFG_NV_SEND:
+            {
+                uint8_t len = 0, res = 0;
+                uint8_t *ptr = (uint8_t *) (p_buf + 1);//skip header
+                UINT16_TO_STREAM(ptr, HCI_CMD_SKW_BT_NVDS);
+
+                if((chip_version == SKW_CHIPID_6316) || (chip_version == SKW_CHIPID_6160_LITE))//0x6316
+                {
+                    uint8_t tmp_buffer[10] = {0};
+                    uint8_t *param_buf = ptr + 3;
+                    uint8_t nv_tag = 0;
+                    int  nv_param_len = 0;
+                    int  total_len = 0;
+                    char file_end = 0;
+                    int  file_ptr;
+                    while(1)
+                    {
+                        file_ptr = ftell(hw_cfg_cb.nv_fp);
+                        if(file_ptr < 0)
+                        {
+                            ALOGE("%s invalid file_ptr:%d", __func__, file_ptr);
+                            bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
+                            hw_cfg_cb.state = HW_CFG_INIT;
+                            return ;
+                        }
+                        len = fread(tmp_buffer, 1, 3, hw_cfg_cb.nv_fp);
+                        if((len < 3) || feof(hw_cfg_cb.nv_fp))
+                        {
+                            file_end = 1;
+                            break;
+                        }
+                        memcpy(param_buf + total_len, tmp_buffer, 3);
+                        nv_param_len = tmp_buffer[2];
+                        nv_tag = tmp_buffer[0];
+                        ALOGD("tag:%d, nv_param_len:%d, file_ptr:%d", tmp_buffer[0], nv_param_len, file_ptr);
+
+                        if((nv_param_len + total_len + 3) > 252)//252 + 3
+                        {
+                            fseek(hw_cfg_cb.nv_fp, file_ptr, SEEK_SET);
+                            break;
+                        }
+                        total_len += 3;
+                        if((nv_param_len > 0) && ((total_len + nv_param_len) < HCI_CMD_MAX_LEN))
+                        {
+                            len = fread(param_buf + total_len, 1, nv_param_len, hw_cfg_cb.nv_fp);
+                            if(len < nv_param_len)
+                            {
+                                ALOGE("%s, len:%d, nv_param_len:%d", __func__, len, nv_param_len);
+                                scomm_vendor_init_err(p_buf);
+                                break;
+                            }
+                            if(nv_tag == NV_TAG_BD_ADDR)
+                            {
+                                skw_addr_get(param_buf + total_len + 3);
+                            }
+                            else if(nv_tag == NV_TAG_DSP_LOG_SETTING)
+                            {
+                                *(param_buf + total_len) = btcp_log_en ? 0 : 1;
+                            }
+                            total_len += len;
+                        }
+                    }
+                    if(total_len > 0)
+                    {
+                        ptr[0] = (total_len + 2);//payload len
+                        ptr[1] = hw_cfg_cb.file_offset;
+                        ptr[2] = total_len;//para len
+                        p_buf->len = total_len + 2 + 3;//packet len
+                        res = bt_vendor_cbacks->xmit_cb(HCI_CMD_SKW_BT_NVDS, p_buf, scomm_vendor_config_callback);
+                        hw_cfg_cb.file_offset ++;
+                        if(res == FALSE)//send error
+                        {
+                            scomm_vendor_init_err(p_buf);
+                            break;
+                        }
+                    }
+                    if(file_end)
+                    {
+                        hw_cfg_cb.state = HW_CFG_WRITE_OS_TYPE;
+                        fclose(hw_cfg_cb.nv_fp);
+                        hw_cfg_cb.nv_fp = NULL;
+                    }
+                }
+                else
+                {
+                    len = fread(ptr + 3, 1, NV_FILE_RD_BLOCK_SIZE, hw_cfg_cb.nv_fp);
+                    ptr[0] = (len + 2);//payload len
+                    ptr[1] = hw_cfg_cb.file_offset;
+                    ptr[2] = len;//para len
+                    p_buf->len = len + 2 + 3;//packet len
+                    if(0 == hw_cfg_cb.file_offset)
+                    {
+                        //*(ptr + 3 + 3) = 'A';
+                        //byte7
+                        skw_addr_get(ptr + 3 + 7);
+                    }
+                    else if(1 == hw_cfg_cb.file_offset)
+                    {
+                        *(ptr + 3 + 62) |= 0x80;
+                        *(ptr + 3 + 53) = btcp_log_en ? 0 : 1;
+                    }
+
+                    res = bt_vendor_cbacks->xmit_cb(HCI_CMD_SKW_BT_NVDS, p_buf, scomm_vendor_config_callback);
+
+                    ALOGD("len:%d, file_offset:%d, plen:%d,%d res:%d", len, hw_cfg_cb.file_offset, p_buf->len, ptr[0], res);
+
+                    hw_cfg_cb.file_offset ++;
+
+                    if((len < NV_FILE_RD_BLOCK_SIZE) || (len == 0) || feof(hw_cfg_cb.nv_fp))//end of file
+                    {
+                        hw_cfg_cb.state = HW_CFG_WRITE_BD_ADDR;
+                        fclose(hw_cfg_cb.nv_fp);
+                        hw_cfg_cb.nv_fp = NULL;
+                    }
+                    if(res == FALSE)//send error
+                    {
+                        scomm_vendor_init_err(p_buf);
+                    }
+
+                }
+                break;
+            }
+            case HW_CFG_WRITE_OS_TYPE:
+            {
+                if(chip_version != SKW_CHIPID_6160)
+                {
+                    uint8_t *ptr = (uint8_t *) (p_buf + 1);
+                    UINT16_TO_STREAM(ptr, HCI_CMD_WRITE_OS_TYPE);
+                    UINT8_TO_STREAM(ptr, 1);
+                    UINT8_TO_STREAM(ptr, 1);
+
+                    p_buf->len = 3 + 1;//packet len
+                    bt_vendor_cbacks->xmit_cb(HCI_CMD_WRITE_OS_TYPE, p_buf, scomm_vendor_config_callback);
+                    hw_cfg_cb.state = HW_CFG_WRITE_BD_ADDR;
+                    break;
+                }
+            }
+            case HW_CFG_WRITE_BD_ADDR:
+            {
+                uint8_t *ptr = (uint8_t *) (p_buf + 1);
+                UINT16_TO_STREAM(ptr, HCI_CMD_WRITE_BD_ADDR);
+                UINT8_TO_STREAM(ptr, 6);
+
+                p_buf->len = 3 + 6;//packet len
+                if(skw_addr_from_ap(ptr))
+                {
+                    bt_vendor_cbacks->xmit_cb(HCI_CMD_WRITE_BD_ADDR, p_buf, scomm_vendor_config_callback);
+#if BLE_ADV_WAKEUP_ENABLE
+                    hw_cfg_cb.state = HW_CFG_WRITE_WAKEUP_ADV_DATA;
+#else
+                    hw_cfg_cb.state = HW_CFG_NV_SEND_CMPL;
+#endif
+                    break;
+                }
+            }
+#if BLE_ADV_WAKEUP_ENABLE
+            case HW_CFG_WRITE_WAKEUP_ADV_DATA:
+            {
+                uint8_t adv_data_len = wakeup_ADV_Info.data_len;
+                if(adv_data_len > 0)
+                {
+                    uint8_t *ptr = (uint8_t *) (p_buf + 1);
+                    uint8_t i, adv_len;
+                    uint8_t pld_len = adv_data_len + 4;//add the length of gpio & level & grp nums & total len
+                    Wakeup_ADV_Grp_St *adv_grp;
+                    UINT16_TO_STREAM(ptr, HCI_CMD_WRITE_WAKEUP_ADV_DATA);
+                    UINT8_TO_STREAM(ptr, pld_len);
+                    UINT8_TO_STREAM(ptr, wakeup_ADV_Info.gpio_no);
+                    UINT8_TO_STREAM(ptr, wakeup_ADV_Info.level);
+                    UINT8_TO_STREAM(ptr, wakeup_ADV_Info.grp_nums);
+                    UINT8_TO_STREAM(ptr, adv_data_len);
+                    for(i = 0; i < wakeup_ADV_Info.grp_nums; i++)
+                    {
+                        adv_grp = &wakeup_ADV_Info.adv_group[i];
+                        UINT8_TO_STREAM(ptr, adv_grp->grp_len);
+                        UINT8_TO_STREAM(ptr, adv_grp->addr_offset);
+                        adv_len = (adv_grp->grp_len - 2) >> 1;
+
+                        SKWBT_LOG("grp len:%d, adv_len:%d", adv_grp->grp_len, adv_len);
+
+                        memcpy(ptr, adv_grp->data, adv_len);
+                        ptr += adv_len;
+                        memcpy(ptr, adv_grp->mask, adv_len);
+                        ptr += adv_len;
+                    }
+
+                    p_buf->len = 3 + pld_len;//packet len
+                    bt_vendor_cbacks->xmit_cb(HCI_CMD_WRITE_WAKEUP_ADV_DATA, p_buf, scomm_vendor_config_callback);
+                    hw_cfg_cb.state = HW_CFG_NV_SEND_CMPL;
+                    break;
+                }
+            }
+#endif
+            case HW_CFG_NV_SEND_CMPL:
+            {
+                bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
+                bt_vendor_cbacks->dealloc(p_buf);//free buffer
+                hw_cfg_cb.state = HW_CFG_INIT;
+                break;
+            }
+        }
+    }
+
+
+    /* Free the RX event buffer */
+    if ((bt_vendor_cbacks) && (p_evt_buf != NULL))
+    {
+        bt_vendor_cbacks->dealloc(p_evt_buf);
+    }
+
+
+}
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_config_start
+**
+** Description     Kick off controller initialization process
+**
+** Returns         None
+**
+*******************************************************************************/
+void scomm_vendor_config_start()
+{
+    memset(&hw_cfg_cb, 0, sizeof(bt_hw_cfg_cb_st));
+
+    HC_BT_HDR  *p_buf = NULL;
+    uint8_t     *p;
+
+    hw_cfg_cb.state = HW_CFG_INIT;
+
+    if (bt_vendor_cbacks)
+    {
+        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);
+            UINT16_TO_STREAM(p, HCI_RESET);
+            *p = 0; /* parameter length */
+
+            hw_cfg_cb.state = HW_CFG_START;
+
+            bt_vendor_cbacks->xmit_cb(HCI_RESET, p_buf, scomm_vendor_config_callback);
+        }
+        else
+        {
+            ALOGE("%s buffer alloc fail", __func__);
+        }
+    }
+    else
+    {
+        ALOGE("%s call back func is null", __func__);
+    }
+}
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_write_wakeup_adv_data_callback
+**
+** Description     send wakeup adv data callback
+**
+** Returns         None
+**
+*******************************************************************************/
+void scomm_vendor_write_wakeup_adv_data_callback(void *p_mem)
+{
+    uint8_t     status = 0;
+    uint16_t    opcode = 0;
+    HC_BT_HDR   *p_evt_buf = NULL;
+    if(p_mem != NULL)
+    {
+        uint8_t *p;
+        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);
+
+        ALOGD("%s status:%d ,opcode:%04X", __func__, status, opcode);
+
+        if(bt_vendor_cbacks)
+        {
+            bt_vendor_cbacks->dealloc(p_evt_buf);
+        }
+    }
+    else
+    {
+        ALOGE("%s pram is null", __func__);
+    }
+}
+
+/*******************************************************************************
+**
+** Function        scomm_vendor_write_wakeup_adv_enable
+**
+** Description     send wakeup adv enable
+**
+** Returns         None
+**
+*******************************************************************************/
+void scomm_vendor_write_wakeup_adv_enable()
+{
+    HC_BT_HDR   *p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc(HCI_CMD_MAX_LEN);
+    uint8_t     *p;
+
+    if(p_buf)
+    {
+        uint8_t param_len = 1;
+        p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
+        p_buf->offset = 0;
+        p_buf->len = 0;
+        p_buf->layer_specific = 0;
+
+        p = (uint8_t *) (p_buf + 1);
+        UINT16_TO_STREAM(p, HCI_CMD_WRITE_WAKEUP_ADV_ENABLE);
+        UINT8_TO_STREAM(p, param_len);
+        UINT8_TO_STREAM(p, 0x01);
+
+        p_buf->len = 3 + param_len;//packet len
+
+        bt_vendor_cbacks->xmit_cb(HCI_CMD_WRITE_WAKEUP_ADV_ENABLE, p_buf, scomm_vendor_write_wakeup_adv_data_callback);
+    }
+    else
+    {
+        ALOGE("%s buffer alloc fail", __func__);
+    }
+
+
+}
+
+
+/*
+    data_str = "xxxx;...."
+*/
+char *scomm_vendor_config_get_uint8(char *data_str, uint8_t *value)
+{
+    char *split0 = strchr(data_str, ';');
+    uint8_t len = 0;
+    char buffer[8] = {0};
+    if((split0 == NULL) || (split0 == data_str))
+    {
+        return NULL;
+    }
+    len = split0 - data_str;
+    if(len > 4)//invalid
+    {
+        SKWBT_LOG("%s, invalid str , %s", __func__, data_str);
+        return NULL;
+    }
+    memcpy(buffer, data_str, len);
+    *value = atoi(buffer);
+    return split0 + 1;//skip ;
+}
+
+void scomm_vendor_parse_wakeup_adv_conf(char *data_str)
+{
+    //WakeupADVData=GPIO_No(decimal);Level(decimal);addr offset(decimal);ADVData(Hex);Mask(Hex)
+    int str_len = strlen(data_str);
+    char *base_ptr = data_str;
+    char *split0, *split1;
+    uint8_t adv_grp_nums = 0, adv_len = 0, mask_len;
+    uint8_t gpio_no = 0, level = 0, addr_offset;
+    uint8_t i = 0, j = 0, k;
+    Wakeup_ADV_Grp_St *adv_grp;
+    int total_len = 0;
+
+    wakeup_ADV_Info.data_len = 0;
+    if(str_len > 512)
+    {
+        SKWBT_LOG("%s, invalid config str, %s", __func__, data_str);
+        return ;
+    }
+    if((base_ptr = scomm_vendor_config_get_uint8(base_ptr, &gpio_no)) == NULL)
+    {
+        return ;
+    }
+    if((base_ptr = scomm_vendor_config_get_uint8(base_ptr, &level)) == NULL)
+    {
+        return ;
+    }
+    for(k = 0; k < BLE_ADV_WAKEUP_GRP_NUMS; k++)
+    {
+        //addr offset(decimal);ADVData(Hex);Mask(Hex)
+        if((base_ptr = scomm_vendor_config_get_uint8(base_ptr, &addr_offset)) == NULL)
+        {
+            break;
+        }
+        if((addr_offset == 1) || (addr_offset > 26))
+        {
+            SKWBT_LOG("%s, invalid addr_offset , %s", __func__, data_str);
+            return ;
+        }
+        adv_grp = &wakeup_ADV_Info.adv_group[k];
+        split0 = strchr(base_ptr, ';');
+        if(split0 == NULL)
+        {
+            SKWBT_LOG("%s, invalid config , %s", __func__, data_str);
+            return ;
+        }
+        split1 = strchr(split0 + 1, ';');
+
+        adv_len = split0 - base_ptr;
+        adv_grp->addr_offset = addr_offset;
+        adv_grp->grp_len = adv_len + 2;//add addr_offset & self length
+
+        split0 ++;//skip ;
+        if(split1 == NULL)
+        {
+            mask_len = data_str + str_len - split0;
+        }
+        else
+        {
+            mask_len = split1 - split0;
+        }
+        if(mask_len != adv_len)
+        {
+            SKWBT_LOG("%s, mask_len != adv_len , %s", __func__, data_str);
+            return ;
+        }
+        SKWBT_LOG("grp len:%d, adv_len:%d", adv_grp->grp_len, adv_len);
+        for(i = 0, j = 0; i < adv_len; j ++, i += 2)
+        {
+            adv_grp->data[j] = (char2hex(base_ptr[i]) << 4) | char2hex(base_ptr[i + 1]);
+            adv_grp->mask[j] = (char2hex(split0[i]) << 4) | char2hex(split0[i + 1]);
+        }
+        total_len += adv_grp->grp_len;
+        adv_grp_nums ++;
+        if(split1 == NULL)
+        {
+            break;
+        }
+        base_ptr = split1 + 1;
+    }
+    wakeup_ADV_Info.data_len = total_len;//not contain gpio & level
+    wakeup_ADV_Info.grp_nums = adv_grp_nums;
+    wakeup_ADV_Info.gpio_no = gpio_no;
+    wakeup_ADV_Info.level = level;
+
+    SKWBT_LOG("ADV str len:%d, gpio:%d, level:%d, adv_grp_nums:%d, total_len:%d, Data:%s", str_len, gpio_no, level, adv_grp_nums, total_len, data_str);
+}
+
+
+
diff --git a/android/hardware/seekwave/skwbt/src/skw_btsnoop.c b/android/hardware/seekwave/skwbt/src/skw_btsnoop.c
new file mode 100755
index 0000000..f567147
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/src/skw_btsnoop.c
@@ -0,0 +1,252 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "skw_btsnoop"
+
+#include "skw_btsnoop.h"
+#include <unistd.h>
+#include <sys/stat.h>
+#include "skw_log.h"
+#include "skw_common.h"
+
+
+
+char skw_btsnoop_path[1024] = {'\0'};
+static pthread_mutex_t btsnoop_log_lock;
+
+char btsnoop_save_log                     = FALSE;
+static int hci_btsnoop_fd                 = -1;
+static const uint64_t BTSNOOP_EPOCH_DELTA = 0x00dcddb30f2f8000ULL;
+unsigned int btsnoop_cnts = 0;
+unsigned int btsnoop_rev_length = 0;
+extern char skwlog_slice;
+extern char btsnoop_log_en;
+
+static uint64_t skw_btsnoop_timestamp(void)
+{
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+
+    uint64_t timestamp = (tv.tv_sec * 1000LL * 1000LL) + tv.tv_usec + BTSNOOP_EPOCH_DELTA;
+    return timestamp;
+}
+
+void skw_btsnoop_open()
+{
+    char last_log_path[PATH_MAX];
+    uint64_t timestamp;
+    uint32_t usec;
+    char new_file = TRUE;
+    btsnoop_rev_length = 0;
+
+
+    if((hci_btsnoop_fd != -1) || (!btsnoop_log_en) || (strlen(skw_btsnoop_path) <= 0))
+    {
+        ALOGE("%s btsnoop log file is already open. log_en:%d", __func__, btsnoop_log_en);
+        return;
+    }
+
+    if(btsnoop_save_log)
+    {
+        struct stat buf;
+        int fd = -1;
+        if(stat(skw_btsnoop_path, &buf) == 0)
+        {
+            fd = open(skw_btsnoop_path, O_RDONLY);
+        }
+
+        if(fd >= 0)
+        {
+            fstat(fd, &buf);
+            int file_zie = (int)buf.st_size;
+            close(fd);
+            ALOGD("%s btsnoop log file size:%d", __func__, file_zie);
+            if(skwlog_slice)
+            {
+                if(file_zie > SKW_LOG_DEFAULT_SIZE)
+                {
+                    snprintf(last_log_path, PATH_MAX, "%s.last", skw_btsnoop_path);
+                    remove(last_log_path);
+                    if (!rename(skw_btsnoop_path, last_log_path) && (errno != ENOENT))
+                    {
+                        ALOGE("%s unable to rename '%s' to btsnoop_hci: %s", __func__, skw_btsnoop_path, strerror(errno));
+                        return ;
+                    }
+                    skwlog_reopen(TRUE);
+                }
+                else
+                {
+                    btsnoop_rev_length = file_zie;
+                    if(file_zie < 16)
+                    {
+                        new_file = TRUE;
+                    }
+                    else
+                    {
+                        new_file = FALSE;
+                    }
+                    skwlog_reopen(new_file);
+                }
+            }
+            else
+            {
+                if(file_zie > 16)
+                {
+                    time_t current_time = time(NULL);
+                    struct tm *time_created = localtime(&current_time);
+                    char config_time_created[sizeof("YYYY-MM-DD-HHMMSS") + 1];
+                    strftime(config_time_created, sizeof("YYYY-MM-DD-HHMMSS"), "%Y-%m-%d-%H%M%S", time_created);
+                    timestamp = skw_btsnoop_timestamp() - BTSNOOP_EPOCH_DELTA;
+                    usec = (uint32_t)(timestamp % 1000000LL);
+                    snprintf(last_log_path, PATH_MAX, "%s.%s_%d-%02d", skw_btsnoop_path, config_time_created, (int)usec, (int)btsnoop_cnts);
+                    btsnoop_cnts ++;
+                    if (!rename(skw_btsnoop_path, last_log_path) && (errno != ENOENT))
+                    {
+                        ALOGE("%s unable to rename '%s' to '%s': %s", __func__, skw_btsnoop_path, last_log_path, strerror(errno));
+                    }
+
+                }
+            }
+
+        }
+        else if(skwlog_slice)
+        {
+            ALOGD("%s btsnoop log file not exist", __func__);
+            skwlog_reopen(TRUE);
+        }
+
+    }
+    else
+    {
+        snprintf(last_log_path, PATH_MAX, "%s.last", skw_btsnoop_path);
+        if (!rename(skw_btsnoop_path, last_log_path) && errno != ENOENT)
+        {
+            ALOGE("%s unable to rename '%s' to '%s': %s", __func__, skw_btsnoop_path, last_log_path, strerror(errno));
+        }
+    }
+
+    hci_btsnoop_fd = open(skw_btsnoop_path, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+
+    if (hci_btsnoop_fd < 0)
+    {
+        ALOGE("%s unable to open '%s': %s", __func__, skw_btsnoop_path, strerror(errno));
+        return;
+    }
+
+    ALOGD("%s open '%s', fd:%d, is new:%d", __func__, skw_btsnoop_path, hci_btsnoop_fd, new_file);
+    //lseek(hci_btsnoop_fd, 0, SEEK_END);
+    if(new_file)
+    {
+        write(hci_btsnoop_fd, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16);
+
+        ALOGD("%s write header", __func__);
+    }
+}
+
+void skw_btsnoop_init()
+{
+    pthread_mutex_init(&btsnoop_log_lock, NULL);
+    btsnoop_cnts = 0;
+    //ALOGD("%s btsnoop log file path:%s", __func__,skw_btsnoop_path);
+    skw_btsnoop_open();
+}
+
+void skw_btsnoop_close(void)
+{
+    pthread_mutex_destroy(&btsnoop_log_lock);
+    if (hci_btsnoop_fd != -1)
+    {
+        close(hci_btsnoop_fd);
+    }
+    hci_btsnoop_fd = -1;
+}
+
+static void skw_btsnoop_write(const void *data, size_t length)
+{
+    if (hci_btsnoop_fd != -1)
+    {
+        write(hci_btsnoop_fd, data, length);
+    }
+}
+
+void skw_btsnoop_capture(const uint8_t *packet, char is_received)
+{
+    int length_he = 0;
+    int length    = 0;
+    int flags     = 0;
+    int drops     = 0;
+    if((!btsnoop_log_en) || (hci_btsnoop_fd == -1))
+    {
+        return ;
+    }
+
+    pthread_mutex_lock(&btsnoop_log_lock);
+
+    uint8_t type = packet[0];
+    switch (type)
+    {
+        case HCI_COMMAND_PKT:
+            length_he = packet[3] + 4;
+            flags = 2;
+            break;
+        case HCI_ACLDATA_PKT:
+        case HCI_ISO_PKT:
+            length_he = (packet[4] << 8) + packet[3] + 5;
+            flags = is_received;
+            break;
+        case HCI_SCODATA_PKT:
+            length_he = packet[3] + 4;
+            flags = is_received;
+            break;
+        case HCI_EVENT_PKT:
+        case HCI_EVENT_SKWLOG:
+            length_he = packet[2] + 3;
+            flags = 3;
+            break;
+        default:
+            pthread_mutex_unlock(&btsnoop_log_lock);
+            return;
+            //break;
+    }
+
+    btsnoop_rev_length += length_he;
+
+    //SKWBT_LOG("btsnoop_capture type:%d, len:%d", type, length_he);
+
+    uint64_t timestamp = skw_btsnoop_timestamp();
+    uint32_t time_hi = timestamp >> 32ul;
+    uint32_t time_lo = timestamp & 0xFFFFFFFF;
+
+    length = htonl(length_he);
+    flags = htonl(flags);
+    drops = htonl(drops);
+    time_hi = htonl(time_hi);
+    time_lo = htonl(time_lo);
+
+    skw_btsnoop_write(&length, 4);
+    skw_btsnoop_write(&length, 4);
+    skw_btsnoop_write(&flags, 4);
+    skw_btsnoop_write(&drops, 4);
+    skw_btsnoop_write(&time_hi, 4);
+    skw_btsnoop_write(&time_lo, 4);
+
+    skw_btsnoop_write(packet, length_he);
+
+    if(btsnoop_rev_length >= SKW_LOG_DEFAULT_SIZE)
+    {
+        close(hci_btsnoop_fd);
+        hci_btsnoop_fd = -1;
+        skw_btsnoop_open();
+        //skwlog_reopen(TRUE);
+    }
+
+    pthread_mutex_unlock(&btsnoop_log_lock);
+}
+
+
+
diff --git a/android/hardware/seekwave/skwbt/src/skw_ext.c b/android/hardware/seekwave/skwbt/src/skw_ext.c
new file mode 100755
index 0000000..4843201
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/src/skw_ext.c
@@ -0,0 +1,263 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#include <pthread.h>
+#include <errno.h>
+#include <utils/Log.h>
+#include <sys/inotify.h>
+#include <sys/epoll.h>
+#include <sys/socket.h>
+
+#include <string.h>
+#include <unistd.h>
+#include "skw_common.h"
+#include "skw_ext.h"
+
+#define SKW_EXT_BUF_SIZE 2048
+
+typedef struct
+{
+    pthread_t thread_id;
+    char thread_running;
+    int epoll_fd;
+    int signal_fd[2];
+} skw_inotify_thread_info_st;
+
+skw_inotify_thread_info_st skw_inotify_thread_info;
+
+
+extern void scomm_vendor_write_wakeup_adv_enable();
+
+
+/*
+struct inotify_event {
+   int      wd;       // Watch descriptor
+   uint32_t mask;     // Mask of events
+   uint32_t cookie;   // Unique cookie associating related  events (for rename(2))
+   uint32_t len;      // Size of name field
+   char     name[];   // Optional null-terminated name
+};
+*/
+
+/*******************************************************************************
+**
+** Function        skw_ext_inotify_thread
+**
+** Description     inotify thread function
+**
+** Returns         void *
+**
+*******************************************************************************/
+static void *skw_ext_inotify_thread(void *arg)
+{
+    int fd = -1;
+    int wd = -1;
+    int read_len = 0;
+    int event_pos = 0;
+    int event_size = 0;
+    char buffer[SKW_EXT_BUF_SIZE + 1] = {0};
+    struct inotify_event *event = NULL;
+    skw_inotify_thread_info_st *thread_info = &skw_inotify_thread_info;
+
+    int epfd = epoll_create(4);
+    struct epoll_event ev;
+    struct epoll_event events[20];
+
+    SKWBT_LOG("%s enter", __func__);
+
+    SKW_UNUSED(arg);
+    fd = inotify_init1(IN_NONBLOCK);
+    if(fd < 0)
+    {
+        ALOGE("inotify_init1 failed: %s", strerror(errno));
+        return NULL;
+    }
+    wd = inotify_add_watch(fd, "/dev", IN_CREATE);
+    if (wd < 0)
+    {
+        ALOGE("inotify_add_watch fail: %s\n", strerror(errno));
+        return NULL;
+    }
+    if(socketpair(AF_UNIX, SOCK_STREAM, 0, thread_info->signal_fd) == -1)
+    {
+        ALOGE("signal socket creare fail: %s\n", strerror(errno));
+        return NULL;
+    }
+    thread_info->epoll_fd = epfd;
+
+    memset(&ev, 0, sizeof(ev));
+    ev.data.fd = fd;
+    ev.events = EPOLLIN | EPOLLET;
+    epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev);
+
+
+    ev.events = EPOLLIN  | EPOLLHUP | EPOLLRDHUP | EPOLLERR;
+    ev.data.fd = thread_info->signal_fd[0];
+    if (epoll_ctl(epfd, EPOLL_CTL_ADD, ev.data.fd, &ev) == -1)
+    {
+        ALOGE("%s unable to register signal fd %d to epoll set: %s", __func__, ev.data.fd, strerror(errno));
+        return NULL;
+    }
+
+    while(thread_info->thread_running)
+    {
+        int nfds = epoll_wait(epfd, events, 20, 500);
+        for (int i = 0; i < nfds; ++i)
+        {
+            if(thread_info->thread_running == 0)
+            {
+                goto thread_exit;
+            }
+            if ((events[i].data.fd != fd) || (!(events[i].events & EPOLLIN)))
+            {
+                continue;
+            }
+            read_len = read(fd, buffer, SKW_EXT_BUF_SIZE);
+
+            //SKWBT_LOG("select read_len:%d, nfds:%d", read_len, nfds);
+
+            if(read_len <= 0)
+            {
+                continue;
+            }
+            event_pos = 0;
+
+            while((read_len >= (int)sizeof(struct inotify_event)) && (event_pos < SKW_EXT_BUF_SIZE))//may receive multiple events
+            {
+                event = (struct inotify_event *)(buffer + event_pos);
+                if(event->len)
+                {
+                    if(event->mask & IN_CREATE)
+                    {
+                        SKWBT_LOG("recv command msg mask:0x%X name:%s", event->mask, event->name);
+                        if (((event->mask & IN_ISDIR) == 0) && (memcmp(event->name, "shutdown", 8) == 0))
+                        {
+                            scomm_vendor_write_wakeup_adv_enable();
+
+                            SKWBT_LOG("received shutdown command");
+                            goto thread_exit;
+                        }
+                    }
+                    else
+                    {
+                        SKWBT_LOG("othre event, mask:0x%X, name: %s", event->mask, event->name);
+                    }
+                }
+
+                event_size = sizeof(struct inotify_event) + event->len;
+                read_len -= event_size;
+                event_pos += event_size;
+            }
+
+        }
+    }
+
+thread_exit:
+    SKWBT_LOG("%s exit", __func__);
+    inotify_rm_watch(fd, wd);
+    close(fd);
+    thread_info->thread_running = FALSE;
+    return NULL;
+}
+
+/*******************************************************************************
+**
+** Function        skw_ext_inotify_thread_init
+**
+** Description     inotify thread init
+**
+** Returns         None
+**
+*******************************************************************************/
+void skw_ext_inotify_thread_init(void)
+{
+#if BLE_ADV_WAKEUP_ENABLE
+    skw_inotify_thread_info_st *thread_info = &skw_inotify_thread_info;
+    pthread_attr_t thread_attr;
+    pthread_attr_init(&thread_attr);
+    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
+
+    memset(thread_info, 0, sizeof(skw_inotify_thread_info_st));
+    SKWBT_LOG("%s enter", __func__);
+
+    thread_info->signal_fd[0] = -1;
+    thread_info->signal_fd[1] = -1;
+    if(pthread_create(&thread_info->thread_id, &thread_attr, skw_ext_inotify_thread, NULL) != 0)
+    {
+        ALOGE("%s pthread_create : %s", __func__, strerror(errno));
+        thread_info->thread_id = -1;
+        return ;
+    }
+    thread_info->thread_running = TRUE;
+#else
+    SKW_UNUSED(skw_ext_inotify_thread);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function        skw_ext_inotify_thread_exit
+**
+** Description     inotify thread exit
+**
+** Returns         None
+**
+*******************************************************************************/
+void skw_ext_inotify_thread_exit(void)
+{
+#if BLE_ADV_WAKEUP_ENABLE
+    char is_closed = 0;
+    skw_inotify_thread_info_st *thread_info = &skw_inotify_thread_info;
+
+    if(thread_info->thread_running && (thread_info->thread_id != -1))
+    {
+        unsigned char close_signal = 1;
+        thread_info->thread_running = FALSE;
+        if(thread_info->epoll_fd >= 0)
+        {
+            ssize_t ret;
+            RW_NO_INTR(ret = write(thread_info->signal_fd[1], &close_signal, 1));
+            SKWBT_LOG("%s signal_fd:%d, ret:%d", __func__, thread_info->epoll_fd, (int)ret);
+
+            epoll_ctl(thread_info->epoll_fd, EPOLL_CTL_DEL, thread_info->signal_fd[0], NULL);
+            close(thread_info->signal_fd[0]);
+            close(thread_info->signal_fd[1]);
+
+            is_closed = 1;
+        }
+        pthread_join(thread_info->thread_id, NULL);
+    }
+
+    if(is_closed == 0)//The thread may have exited
+    {
+        if(thread_info->signal_fd[0] != -1)
+        {
+            close(thread_info->signal_fd[0]);
+        }
+        if(thread_info->signal_fd[1] != -1)
+        {
+            close(thread_info->signal_fd[1]);
+        }
+    }
+    if(thread_info->epoll_fd >= 0)
+    {
+        if(is_closed == 0)
+        {
+            epoll_ctl(thread_info->epoll_fd, EPOLL_CTL_DEL, thread_info->signal_fd[0], NULL);
+        }
+        close(thread_info->epoll_fd);
+    }
+    thread_info->signal_fd[0] = -1;
+    thread_info->signal_fd[1] = -1;
+    thread_info->epoll_fd = -1;
+
+
+    SKWBT_LOG("%s exit", __func__);
+#endif
+
+}
diff --git a/android/hardware/seekwave/skwbt/src/skw_gen_addr.c b/android/hardware/seekwave/skwbt/src/skw_gen_addr.c
new file mode 100755
index 0000000..447f447
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/src/skw_gen_addr.c
@@ -0,0 +1,171 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include <utils/Log.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#define MACDEF_FOR_INCAR 1
+
+#define BD_ADDR_LEN 6
+
+unsigned char bdaddr_lap[3] = {0x12, 0x24, 0x56};
+char bdaddr_valid = 1;
+extern char skw_btsnoop_path[];
+
+extern void hex2String(unsigned char hex[], unsigned char str[], int N);
+
+void skw_addr_gen_init()
+{
+    char basepath[PATH_MAX] = {0};
+    char filepath[PATH_MAX] = {0};
+    int size = strlen(skw_btsnoop_path);
+    int i;
+    for(i = size - 1; i > 0; i--)//get log dir
+    {
+        char ch = skw_btsnoop_path[i];
+        if((ch == '/') || (ch == '\\'))
+        {
+            memcpy(basepath, skw_btsnoop_path, i);
+            //ALOGD("cp:%d", i);
+            break;
+        }
+    }
+    snprintf(filepath, PATH_MAX, "%s/skwbdaddr.txt", basepath);
+
+    ALOGD("%s, %s", __func__, filepath);
+
+    FILE *fp = fopen(filepath, "r"); //read only
+    if(fp == NULL)//file not exist
+    {
+        fp = fopen(filepath, "w"); //file not exist, create it
+        srand(time(NULL));
+        if(fp)
+        {
+            bdaddr_lap[0] = (unsigned char)(rand() & 0xFF);
+            bdaddr_lap[1] = (unsigned char)(rand() & 0xFF);
+            bdaddr_lap[2] = (unsigned char)(rand() & 0xFF);
+            fwrite(bdaddr_lap, 3, 1, fp);
+            fflush(fp);
+            fclose(fp);
+        }
+        else
+        {
+            bdaddr_valid = 0;
+        }
+        //else use default addr
+    }
+    else
+    {
+        fread(bdaddr_lap, 3, 1, fp);
+        fclose(fp);
+    }
+
+    ALOGD("%s, addr valid:%d, %02X %02X %02X", __func__, bdaddr_valid, bdaddr_lap[0], bdaddr_lap[1], bdaddr_lap[2]);
+}
+
+
+#if MACDEF_FOR_INCAR
+
+#define VENDOR_REQ_TAG      0x56524551
+#define VENDOR_READ_IO      _IOW('v', 0x01, unsigned int)
+#define VENDOR_WRITE_IO     _IOW('v', 0x02, unsigned int)
+
+#define VENDOR_SN_ID        1
+#define VENDOR_WIFI_MAC_ID  2
+#define VENDOR_LAN_MAC_ID   3
+#define VENDOR_BLUETOOTH_ID 4
+
+struct rk_vendor_req
+{
+    uint32_t tag;
+    uint16_t id;
+    uint16_t len;
+    uint8_t data[1];
+};
+
+int m_get_mac_address(uint8_t *local_addr)
+{
+    int ret ;
+    uint8_t p_buf[64];
+    struct rk_vendor_req *req;
+
+    req = (struct rk_vendor_req *)p_buf;
+    int sys_fd = open("/dev/vendor_storage", O_RDWR, 0);
+    if(sys_fd < 0)
+    {
+        ALOGE("vendor_storage open fail\n");
+        return -1;
+    }
+
+    req->tag = VENDOR_REQ_TAG;
+    req->id = VENDOR_BLUETOOTH_ID;
+
+    req->len = 6;
+    ret = ioctl(sys_fd, VENDOR_READ_IO, req);
+    if (!ret)
+    {
+        //uint8_t str_buffer[32] = {0};
+        int i = 0, j = BD_ADDR_LEN - 1;
+        for(; i < BD_ADDR_LEN; i++, j--)
+        {
+            local_addr[i] = req->data[j];
+        }
+        //memcpy(local_addr, req->data, BD_ADDR_LEN);
+        //hex2String(local_addr, str_buffer, BD_ADDR_LEN);
+        //ALOGE("bt addr get ok:%s", str_buffer);
+    }
+
+    close(sys_fd);
+    return 0;
+}
+
+
+#endif
+
+char skw_addr_check_valid(unsigned char *bd_addr)
+{
+    uint32_t addr_check = 0;
+    int i ;
+    for( i = 0; i < BD_ADDR_LEN; i++)
+    {
+        addr_check += bd_addr[i];
+    }
+    return (addr_check > 0);
+}
+
+/*
+Get bd addr from AP
+if address exist, return 1, else 0
+*/
+char skw_addr_from_ap(unsigned char *bd_addr)
+{
+    memset(bd_addr, 0, BD_ADDR_LEN);
+#if MACDEF_FOR_INCAR
+    if(m_get_mac_address(bd_addr) == 0)
+    {
+        return skw_addr_check_valid(bd_addr);
+    }
+#endif
+	return 0;
+}
+
+void skw_addr_get(unsigned char *buffer)
+{
+    if(bdaddr_valid > 0)
+    {
+        buffer[0] = bdaddr_lap[0];
+        buffer[1] = bdaddr_lap[1];
+        buffer[2] = bdaddr_lap[2];
+    }
+}
+
diff --git a/android/hardware/seekwave/skwbt/src/skw_log.c b/android/hardware/seekwave/skwbt/src/skw_log.c
new file mode 100755
index 0000000..b743352
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/src/skw_log.c
@@ -0,0 +1,216 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2020-2021 SeekWave Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *
+ ******************************************************************************/
+
+#include <time.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <math.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <utils/Log.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include "skw_log.h"
+#include "skw_common.h"
+
+
+static pthread_mutex_t skwlog_lock;
+
+static int skwlog_fp = -1;
+unsigned int skwlog_rev_length = 0;
+unsigned int skwlog_cnts = 0;
+
+extern char skw_btsnoop_path[];
+extern char btcp_log_en;
+extern char skwlog_slice;
+extern char btsnoop_save_log;
+
+
+void skwlog_open(char new_file)
+{
+    char log_path[PATH_MAX];
+    char basepath[PATH_MAX] = {0};
+    char lastpath[PATH_MAX] = {0};
+    int  i;
+    int size = strlen(skw_btsnoop_path);
+    if((!btcp_log_en) || (size <= 0))
+    {
+        return ;
+    }
+
+    for( i = size - 1; i > 0; i--)//get log dir
+    {
+        char ch = skw_btsnoop_path[i];
+        if((ch == '/') || (ch == '\\'))
+        {
+            memcpy(basepath, skw_btsnoop_path, i);
+            //ALOGD("cp:%d", i);
+            break;
+        }
+    }
+    snprintf(log_path, PATH_MAX, "%s/skwlog.log", basepath);
+
+    struct stat buf;
+    int fd = -1;
+    if(stat(log_path, &buf) == 0)
+    {
+        fd = open(log_path, O_RDONLY);
+    }
+    if(fd > 0)
+    {
+        fstat(fd, &buf);
+        int file_zie = (int)buf.st_size;
+        close(fd);
+        ALOGD("%s cp log file size:%d", __func__, file_zie);
+        if(skwlog_slice)
+        {
+            if(new_file)
+            {
+                snprintf(lastpath, PATH_MAX, "%s/skwlog-last.log", basepath);
+                remove(lastpath);
+                if (!rename(log_path, lastpath) && (errno != ENOENT))
+                {
+                    ALOGE("%s unable to rename '%s' to '%s': %s", __func__, log_path, lastpath, strerror(errno));
+                }
+            }
+            else
+            {
+                skwlog_rev_length = (unsigned int)file_zie;
+            }
+        }
+        else
+        {
+            if(file_zie > (16 + 12))
+            {
+                time_t current_time = time(NULL);
+                struct tm *time_created = localtime(&current_time);
+                char config_time_created[sizeof("YYYY-MM-DD-HHMMSS") + 1];
+                strftime(config_time_created, sizeof("YYYY-MM-DD-HHMMSS"), "%Y-%m-%d-%H%M%S", time_created);
+
+                snprintf(lastpath, PATH_MAX, "%s/skwlog-%s_%03d-%02d.log", basepath, config_time_created, rand() % 1000, (int)skwlog_cnts);
+
+                if (!rename(log_path, lastpath) && (errno != ENOENT))
+                {
+                    ALOGE("%s unable to rename '%s' to '%s': %s", __func__, log_path, lastpath, strerror(errno));
+                }
+
+            }
+        }
+        if(0 == file_zie)
+        {
+            new_file = TRUE;
+        }
+    }
+    else
+    {
+        new_file = TRUE;
+    }
+
+    //ALOGD("basepath:%d, %s,%s",size, basepath, skw_btsnoop_path);
+
+    ALOGD("skwlog:%s, %s", log_path, lastpath);
+
+    skwlog_fp = open(log_path, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+
+    ALOGD("%s open '%s', fd:%d, is new:%d", __func__, log_path, skwlog_fp, new_file);
+    //lseek(skwlog_fp, 0, SEEK_END);
+    if(skwlog_fp > 0)
+    {
+        if(new_file)
+        {
+            write(skwlog_fp, "skwcplog\0\1\0\2\0\0\x3\xEA", 16);
+        }
+        //skwlog_print_current_time();
+    }
+    skwlog_cnts ++;
+}
+
+void skwlog_reopen(char new_file)
+{
+    pthread_mutex_lock(&skwlog_lock);
+    skwlog_rev_length = 0;
+    if (skwlog_fp != -1)
+    {
+        close(skwlog_fp);
+    }
+    skwlog_open(new_file);
+    pthread_mutex_unlock(&skwlog_lock);
+    if(skwlog_fp > 0)
+    {
+        skwlog_print_current_time();
+    }
+}
+
+
+void skwlog_print_current_time()
+{
+    time_t current_time = time(NULL);
+    struct tm *time_created = localtime(&current_time);
+
+    //
+    unsigned char buffer[16] = {0x07, 0xFF, 0x08, 0x00, 0x01, 0xD0, 0x55, 0x55};
+    buffer[8] = time_created->tm_sec;//[0,59]
+    buffer[9] = time_created->tm_min;//[0,59]
+    buffer[10] = time_created->tm_hour;//[0,23]
+    buffer[11] = time_created->tm_mday;//[1,31]
+
+    skwlog_write(buffer, 12);
+}
+
+void skwlog_init()
+{
+    pthread_mutex_init(&skwlog_lock, NULL);
+    skwlog_fp = -1;
+    skwlog_rev_length = 0;
+    skwlog_cnts = 0;
+    if(btcp_log_en && ((!btsnoop_save_log) || (!skwlog_slice)))
+    {
+        skwlog_open(TRUE);
+        if(skwlog_fp > 0)
+        {
+            skwlog_print_current_time();
+        }
+    }
+    ALOGD("skwlog_init,en:%d, slice:%d, fd:%d", btcp_log_en, skwlog_slice, skwlog_fp);
+}
+
+
+void skwlog_write(unsigned char *buffer, unsigned int length)
+{
+    if(skwlog_fp > 0)
+    {
+        pthread_mutex_lock(&skwlog_lock);
+
+        write(skwlog_fp, buffer, length);
+        skwlog_rev_length += length;
+
+        if(skwlog_rev_length >= SKW_LOG_DEFAULT_SIZE)
+        {
+            skwlog_rev_length = 0;
+            close(skwlog_fp);
+            skwlog_fp = -1;
+            skwlog_open(TRUE);
+        }
+        pthread_mutex_unlock(&skwlog_lock);
+    }
+}
+
+void skwlog_close()
+{
+    pthread_mutex_destroy(&skwlog_lock);
+    if (skwlog_fp != -1)
+    {
+        close(skwlog_fp);
+    }
+    skwlog_fp = -1;
+    skwlog_rev_length = 0;
+    skwlog_cnts = 0;
+}
+
diff --git a/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp32 b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp32
new file mode 100755
index 0000000..afabaf5
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp32
Binary files differ
diff --git a/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp64 b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp64
new file mode 100755
index 0000000..9b46195
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skw_logapp64
Binary files differ
diff --git a/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skwbt.conf b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skwbt.conf
new file mode 100755
index 0000000..f82ded8
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/skwbt.conf
@@ -0,0 +1,30 @@
+# RELEASE NAME: 20210721_BT_ANDROID_10.0
+# Bluetooth Device Name
+#Name=SeekWave Bluetooth
+
+#Indicate USB/SDIO or UART driver bluetooth
+BtDeviceNode=/dev/BTCMD
+BtDeviceNode=/dev/BTDATA
+BtDeviceNode=/dev/BTAUDIO
+BtDeviceNode=/dev/BTISOC
+#BtDeviceNode=?/dev/ttyS0
+
+# Enable BtSnoop logging function
+# valid value : true, false
+SkwBtUartOnly=false
+#SkwBtNoSleep:just for uart mode
+SkwBtNoSleep=false
+SkwBtsnoopDump=true
+SkwBtcplog=false
+SkwBtDrvlog=false
+
+#WakeupADVData=gpio No;effactive level;ADVData;Mask  ### ADVData size must be equal Mask size
+#WakeupADVData=4;1;0;020106031980010FFF00112233AABBCCDD;0000FF0000FFFFFF000000000000000000
+WakeupADVData=4;1;0;020105031980010FFF00112233AABBCCDDFFFFFFFFFFFF;000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+# BtSnoop log output file
+BtSnoopFileName=/data/misc/bluedroid/btsnoop_hci.cfa
+
+
+# Preserve existing BtSnoop log before overwriting
+BtSnoopSaveLog=true
+SkwLogSlice=true
diff --git a/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160.nvbin b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160.nvbin
new file mode 100755
index 0000000..70ab522
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160.nvbin
Binary files differ
diff --git a/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160lite.nvbin b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160lite.nvbin
new file mode 100755
index 0000000..19e9f3f
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6160lite.nvbin
Binary files differ
diff --git a/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6316.nvbin b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6316.nvbin
new file mode 100755
index 0000000..19e9f3f
--- /dev/null
+++ b/android/hardware/seekwave/skwbt/vendor/etc/bluetooth/sv6316.nvbin
Binary files differ
diff --git a/android/hardware/seekwave/wlan/Android.mk b/android/hardware/seekwave/wlan/Android.mk
new file mode 100755
index 0000000..e0462ae
--- /dev/null
+++ b/android/hardware/seekwave/wlan/Android.mk
@@ -0,0 +1,3 @@
+ifeq ($(BOARD_WLAN_DEVICE), seekwave)
+	include $(call all-subdir-makefiles)
+endif
diff --git a/android/hardware/seekwave/wlan/CleanSpec.mk b/android/hardware/seekwave/wlan/CleanSpec.mk
new file mode 100755
index 0000000..b84e1b6
--- /dev/null
+++ b/android/hardware/seekwave/wlan/CleanSpec.mk
@@ -0,0 +1,49 @@
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/android/hardware/seekwave/wlan/METADATA b/android/hardware/seekwave/wlan/METADATA
new file mode 100755
index 0000000..d97975c
--- /dev/null
+++ b/android/hardware/seekwave/wlan/METADATA
@@ -0,0 +1,3 @@
+third_party {
+  license_type: NOTICE
+}
diff --git a/android/hardware/seekwave/wlan/configs/Android.mk b/android/hardware/seekwave/wlan/configs/Android.mk
new file mode 100755
index 0000000..313a7ac
--- /dev/null
+++ b/android/hardware/seekwave/wlan/configs/Android.mk
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
+
+########################
+
+WIFI_DRIVER_SOCKET_IFACE := wlan0
+
+ifeq ($(strip $(WPA_SUPPLICANT_VERSION)),VER_0_8_X)
+	include external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant_conf.mk
+else
+ifeq ($(strip $(WPA_SUPPLICANT_VERSION)),VER_0_6_X)
+	include external/wpa_supplicant_6/wpa_supplicant/wpa_supplicant_conf.mk
+else
+	include external/wpa_supplicant/wpa_supplicant_conf.mk
+endif
+endif
+#######################
diff --git a/android/hardware/seekwave/wlan/configs/config-skw.mk b/android/hardware/seekwave/wlan/configs/config-skw.mk
new file mode 100755
index 0000000..3de916e
--- /dev/null
+++ b/android/hardware/seekwave/wlan/configs/config-skw.mk
@@ -0,0 +1,21 @@
+# Copyright (C) 2008 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.
+#
+
+########################
+
+PRODUCT_COPY_FILES += \
+	hardware/seekwave/wlan/configs/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/skw_wpa_supplicant_overlay.conf
+#    hardware/seekwave/wlan/configs/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/skw_p2p_supplicant_overlay.conf
+########################
diff --git a/android/hardware/seekwave/wlan/configs/wpa_supplicant_overlay.conf b/android/hardware/seekwave/wlan/configs/wpa_supplicant_overlay.conf
new file mode 100755
index 0000000..133b527
--- /dev/null
+++ b/android/hardware/seekwave/wlan/configs/wpa_supplicant_overlay.conf
@@ -0,0 +1,6 @@
+disable_scan_offload=1
+wowlan_triggers=any
+filter_rssi=-75
+p2p_disabled=1
+bgscan="simple:11:-70:105"
+no_ctrl_interface=
diff --git a/android/hardware/seekwave/wlan/wifi_hal/Android.mk b/android/hardware/seekwave/wlan/wifi_hal/Android.mk
new file mode 100755
index 0000000..520b8d0
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wifi_hal/Android.mk
@@ -0,0 +1,36 @@
+LOCAL_PATH := $(call my-dir)
+
+# Make the HAL library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_CFLAGS := -Wall \
+	    -Werror \
+	    -Wno-format \
+	    -Wno-reorder \
+	    -Wno-unused-function \
+	    -Wno-unused-parameter \
+	    -Wno-unused-private-field \
+	    -Wno-unused-variable \
+	    -Wno-unused-parameter
+
+LOCAL_C_INCLUDES += external/libnl/include \
+		 $(call include-path-for, libhardware_legacy)/hardware_legacy \
+		 external/wpa_supplicant_8/src/drivers \
+		 external/boringssl/include \
+		 external/boringssl/src/crypto/digest \
+		 external/boringssl/src/crypto/evp/
+
+LOCAL_HEADER_LIBRARIES := libutils_headers liblog_headers
+
+LOCAL_SRC_FILES := main.cpp \
+	       wifi_command.cpp
+
+LOCAL_MODULE := libwifi-hal-skw
+LOCAL_PROPRIETARY_MODULE := true
+#LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+#LOCAL_LICENSE_CONDITIONS := notice
+#LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
+
+include $(BUILD_STATIC_LIBRARY)
+
diff --git a/android/hardware/seekwave/wlan/wifi_hal/NOTICE b/android/hardware/seekwave/wlan/wifi_hal/NOTICE
new file mode 100755
index 0000000..f9d25ea
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wifi_hal/NOTICE
@@ -0,0 +1,43 @@
+
+Copyright (c) 2005-2010, The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the 
+   distribution.
+ * Neither the name of The Android Open Source Project nor the names
+   of its contributors may be used to endorse or promote products
+   derived from this software without specific prior written
+   permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+ * Copyright (c) 2002-2010, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2003-2004, Instant802 Networks, Inc.
+ * Copyright (c) 2005-2006, Devicescape Software, Inc.
+ * Copyright (c) 2007, Johannes Berg <johannes@sipsolutions.net>
+ * Copyright (c) 2009-2010, Atheros Communications
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
diff --git a/android/hardware/seekwave/wlan/wifi_hal/main.cpp b/android/hardware/seekwave/wlan/wifi_hal/main.cpp
new file mode 100755
index 0000000..c080fba
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wifi_hal/main.cpp
@@ -0,0 +1,1895 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Portions copyright (C) 2017
+ *
+ * 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 <errno.h>
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "main.h"
+#include "wifi_command.h"
+
+#define SKW_BUFF_SIZE                    256
+#define WIFI_HAL_SOCK_DEFAULT_PORT       644
+#define WIFI_HAL_SOCK_EVENT_PORT         645
+#define SOCK_BUFF_SIZE                   0x40000
+
+struct nl_sock *getSock(wifi_interface_handle handle)
+{
+	interface_info *info = (interface_info *)handle;
+
+	return ((hal_info *)info->hal_handle)->nl_hal;
+}
+
+int getFamily(wifi_interface_handle handle)
+{
+	interface_info *info = (interface_info *)handle;
+
+	return ((hal_info *)info->hal_handle)->family_nl80211;
+}
+
+void skw_wifi_get_error_info(wifi_error error, const char **chr)
+{
+	ALOGD("%s", __func__);
+}
+
+wifi_error skw_wifi_get_supported_feature_set(wifi_interface_handle handle, feature_set *feature)
+{
+
+	ALOGD("%s, feature: 0x%x", __func__, *feature);
+
+	*feature = 0;
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_concurrency_matrix(wifi_interface_handle handle, int count,
+					feature_set *feature, int *args)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_scanning_mac_oui(wifi_interface_handle handle, unsigned char *oui)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_supported_channels(wifi_handle handle, int *num, wifi_channel *channels)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_is_epr_supported(wifi_handle handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+class GetInterfacesCommand : public WifiCommand {
+private:
+	int index;
+	interface_info ifaces[SKW_NR_IFACE];
+
+public:
+	GetInterfacesCommand(struct nl_sock *sk, int family, int flags, int nl80211_cmd)
+		: WifiCommand(sk, family, flags, nl80211_cmd)
+	{
+		index = 0;
+		memset(ifaces, 0x0, sizeof(interface_info));
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+		return WIFI_SUCCESS;
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+		if (attr[NL80211_ATTR_IFINDEX])
+			ifaces[index].iface_idx = nla_get_u32(attr[NL80211_ATTR_IFINDEX]);
+		else
+			ifaces[index].wdev_idx = nla_get_u32(attr[NL80211_ATTR_WDEV]);
+
+		if (attr[NL80211_ATTR_IFNAME])
+			strcpy(ifaces[index].name, nla_get_string(attr[NL80211_ATTR_IFNAME]));
+
+		index++;
+
+		return WIFI_SUCCESS;
+	}
+
+	int getIfaceNum()
+	{
+		return index;
+	}
+
+	interface_info *iface(int idx)
+	{
+		return &ifaces[idx];
+	}
+};
+
+wifi_error skw_wifi_get_ifaces(wifi_handle handle, int *num, wifi_interface_handle **iface_handle)
+{
+	int i;
+	hal_info *hal = (hal_info *)handle;
+	GetInterfacesCommand cmd(hal->nl_hal, hal->family_nl80211, NLM_F_DUMP, NL80211_CMD_GET_INTERFACE);
+
+	memset(hal->interfaces, 0x0, sizeof(hal->interfaces));
+
+	cmd.build(NULL, NULL);
+	cmd.send();
+
+	if (cmd.getIfaceNum() == 0)
+		return WIFI_ERROR_UNKNOWN;
+
+	hal->nr_interfaces = cmd.getIfaceNum();
+
+	for (i = 0; i < hal->nr_interfaces; i++) {
+		strcpy(hal->interfaces[i].name, cmd.iface(i)->name);
+		hal->interfaces[i].iface_idx = cmd.iface(i)->iface_idx;
+		hal->interfaces[i].wdev_idx = cmd.iface(i)->wdev_idx;
+		hal->interfaces[i].hal_handle = handle;
+
+		hal->interface_handle[i] = (wifi_interface_handle)(&hal->interfaces[i]);
+	}
+
+	*iface_handle = &hal->interface_handle[0];
+	*num = hal->nr_interfaces;
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_iface_name(wifi_interface_handle handle, char *name, size_t size)
+{
+	interface_info *iface = (interface_info *)handle;
+
+	ALOGD("%s: name: %s", __func__, iface->name);
+
+	strncpy(name, iface->name, size);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_iface_event_handler(wifi_request_id,wifi_interface_handle ,
+		wifi_event_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_iface_event_handler(wifi_request_id, wifi_interface_handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_start_gscan(wifi_request_id id, wifi_interface_handle iface,
+		wifi_scan_cmd_params params, wifi_scan_result_handler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_stop_gscan(wifi_request_id, wifi_interface_handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_cached_gscan_results(wifi_interface_handle, byte, int,
+		wifi_cached_scan_results *results, int *)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_bssid_hotlist(wifi_request_id, wifi_interface_handle,
+		wifi_bssid_hotlist_params, wifi_hotlist_ap_found_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_bssid_hotlist(wifi_request_id, wifi_interface_handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_significant_change_handler(wifi_request_id, wifi_interface_handle,
+		wifi_significant_change_params, wifi_significant_change_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_significant_change_handler(wifi_request_id id, wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_gscan_capabilities(wifi_interface_handle iface, wifi_gscan_capabilities *capa)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_link_stats(wifi_interface_handle iface, wifi_link_layer_params params)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_link_stats(wifi_request_id id, wifi_interface_handle handle,
+		wifi_stats_result_handler result_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_clear_link_stats(wifi_interface_handle,u32, u32 *, u8, u8 *)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+class GetValidChannelsCommand : public WifiCommand {
+private:
+	wifi_channel *mChannels;
+	int max_channels, nr_channels;
+
+public:
+	GetValidChannelsCommand(struct nl_sock *sk, int family, int flags, int nl80211_cmd,
+			wifi_channel *channels, int max_chans) : WifiCommand(sk, family, flags, nl80211_cmd)
+	{
+		nr_channels = 0;
+		mChannels = channels;
+		max_channels = max_chans;
+		memset(channels, 0x0, max_chans * sizeof(*channels));
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+#define SKW_ATTR_BAND       20
+		struct nlattr *data;
+		interface_info *iface = (interface_info *)handle;
+		put_u32(NL80211_ATTR_VENDOR_ID, OUI_GOOGLE);
+		put_u32(NL80211_ATTR_VENDOR_SUBCMD, SKW_VCMD_GET_CHANNELS);
+
+		if (iface->wdev_idx)
+			put_u32(NL80211_ATTR_WDEV, iface->wdev_idx);
+		else
+			put_u32(NL80211_ATTR_IFINDEX, iface->iface_idx);
+
+		data =attr_start();
+
+		put_u32(SKW_ATTR_BAND, *(int *)param);
+
+		attr_end(data);
+
+		return WIFI_SUCCESS;
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+#define SKW_ATTR_NR_CAHNNELS           36
+#define SKW_ATTR_VALID_CHANNELS        37
+		int left, type;
+		struct nlattr *nla;
+		struct nlattr *data = attr[NL80211_ATTR_VENDOR_DATA];
+
+		if (!data)
+			return WIFI_ERROR_NOT_AVAILABLE;
+
+		nla_for_each_attr(nla, (struct nlattr *)nla_data(data), nla_len(data), left) {
+			type = nla_type(nla);
+			switch (type) {
+			case SKW_ATTR_NR_CAHNNELS:
+				nr_channels = nla_get_u32(nla);
+				break;
+
+			case SKW_ATTR_VALID_CHANNELS:
+				memcpy(mChannels, nla_data(nla), nla_len(nla));
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		return WIFI_SUCCESS;
+	}
+
+	int numChannels()
+	{
+		return nr_channels;
+	}
+};
+
+wifi_error skw_wifi_get_valid_channels(wifi_interface_handle iface, int band,
+			int max_channels, wifi_channel *channels, int *num_channels)
+{
+	int i;
+	wifi_error err = WIFI_ERROR_UNKNOWN;
+
+	GetValidChannelsCommand cmd(getSock(iface), getFamily(iface), 0, NL80211_CMD_VENDOR, channels, max_channels);
+
+	cmd.build(iface, &band);
+	err = cmd.send();
+
+	*num_channels = cmd.numChannels();
+
+	ALOGD("%s, BAND: %d, nr channels: %d", __func__, band, *num_channels);
+
+	return err;
+}
+
+wifi_error skw_wifi_rtt_range_request(wifi_request_id, wifi_interface_handle, unsigned,
+		wifi_rtt_config[], wifi_rtt_event_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_rtt_range_cancel(wifi_request_id id,  wifi_interface_handle iface,
+		unsigned range, mac_addr addr[])
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_rtt_capabilities(wifi_interface_handle handle, wifi_rtt_capabilities *capa)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_rtt_get_responder_info(wifi_interface_handle iface,
+		wifi_rtt_responder *responder_info)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_enable_responder(wifi_request_id id, wifi_interface_handle iface,
+		wifi_channel_info channel_hint, unsigned max_duration_seconds,
+		wifi_rtt_responder *responder_info)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_disable_responder(wifi_request_id id, wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_nodfs_flag(wifi_interface_handle, u32)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_start_logging(wifi_interface_handle, u32, u32, u32, u32, char *)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_epno_list(wifi_request_id, wifi_interface_handle,
+				const wifi_epno_params *, wifi_epno_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_epno_list(wifi_request_id, wifi_interface_handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+class SetCountryCodeCommand : public WifiCommand {
+public:
+	SetCountryCodeCommand(struct nl_sock *sk, int family, int flags, int nl80211_cmd)
+		: WifiCommand(sk, family, flags, nl80211_cmd)
+	{
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+		struct nlattr *data;
+		interface_info *iface = (interface_info *)handle;
+
+		put_u32(NL80211_ATTR_VENDOR_ID, OUI_GOOGLE);
+		put_u32(NL80211_ATTR_VENDOR_SUBCMD, SKW_VCMD_SET_COUNTRY);
+
+		if (iface->wdev_idx)
+			put_u32(NL80211_ATTR_WDEV, iface->wdev_idx);
+		else
+			put_u32(NL80211_ATTR_IFINDEX, iface->iface_idx);
+
+		data =attr_start();
+
+		put_string(5, (const char *)param);
+
+		attr_end(data);
+
+		return WIFI_SUCCESS;
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+		return WIFI_SUCCESS;
+	}
+};
+
+static wifi_error skw_wifi_set_country_code(wifi_interface_handle handle, const char *country)
+{
+	SetCountryCodeCommand cmd(getSock(handle), getFamily(handle), 0, NL80211_CMD_VENDOR);
+
+	ALOGD("%s, country: %s", __func__, country);
+
+	cmd.build(handle, (void *)country);
+
+	return cmd.send();
+}
+
+wifi_error skw_wifi_get_firmware_memory_dump( wifi_interface_handle iface,
+		wifi_firmware_memory_dump_handler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+wifi_error skw_wifi_set_log_handler(wifi_request_id id, wifi_interface_handle iface,
+		wifi_ring_buffer_data_handler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_log_handler(wifi_request_id id, wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_alert_handler(wifi_request_id id, wifi_interface_handle iface,
+		wifi_alert_handler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_alert_handler(wifi_request_id id, wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+class GetVersionCommand : public WifiCommand {
+private:
+	char buff[SKW_BUFF_SIZE];
+
+public:
+	GetVersionCommand(struct nl_sock *sk, int family, int flags, int cmd)
+		: WifiCommand(sk, family, flags, cmd)
+	{
+		memset(buff, 0x0, sizeof(buff));
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+		struct nlattr *data;
+		interface_info *info = (interface_info *)handle;
+
+		put_u32(NL80211_ATTR_VENDOR_ID, OUI_GOOGLE);
+		put_u32(NL80211_ATTR_VENDOR_SUBCMD, SKW_VCMD_GET_VERSION);
+
+		if (info->wdev_idx)
+			put_u32(NL80211_ATTR_WDEV, info->wdev_idx);
+		else
+			put_u32(NL80211_ATTR_IFINDEX, info->iface_idx);
+
+		data =attr_start();
+
+		put_u32(*(int *)param, 0);
+
+		attr_end(data);
+
+		return WIFI_SUCCESS;
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+		if (attr[NL80211_ATTR_VENDOR_DATA])
+			strncpy(buff, (char *)nla_data(attr[NL80211_ATTR_VENDOR_DATA]), sizeof(buff));
+
+		return WIFI_SUCCESS;
+	}
+
+	char *getVersion()
+	{
+		return buff;
+	}
+};
+
+
+wifi_error skw_wifi_get_firmware_version(wifi_interface_handle iface,
+					char *buffer, int buffer_size)
+{
+	int subcmd = SKW_FW_VERSION;
+	wifi_error err = WIFI_ERROR_UNKNOWN;
+	GetVersionCommand cmd(getSock(iface), getFamily(iface), 0, NL80211_CMD_VENDOR);
+
+	cmd.build(iface, &subcmd);
+	err = cmd.send();
+
+	strncpy(buffer, cmd.getVersion(), buffer_size);
+
+	ALOGD("%s: %s", __func__, buffer);
+
+	return err;
+}
+
+class GetRingBuffStatus : public WifiCommand
+{
+private:
+	u32 *num;
+	wifi_ring_buffer_status *mStatus;
+
+public:
+	GetRingBuffStatus(struct nl_sock *sk, int family, int flags,
+		int nl80211_cmd, u32 *num_rings, wifi_ring_buffer_status *status)
+		: WifiCommand(sk, family, flags, nl80211_cmd)
+	{
+		*num_rings = 0;
+		num = num_rings;
+		mStatus = status;
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+		interface_info *iface = (interface_info *)handle;
+
+		put_u32(NL80211_ATTR_VENDOR_ID, OUI_GOOGLE);
+		put_u32(NL80211_ATTR_VENDOR_SUBCMD, SKW_VCMD_GET_RING_BUFFERS_STATUS);
+
+		if (iface->wdev_idx)
+			put_u32(NL80211_ATTR_WDEV, iface->wdev_idx);
+		else
+			put_u32(NL80211_ATTR_IFINDEX, iface->iface_idx);
+
+		return WIFI_SUCCESS;
+
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+		int type, left;
+		struct nlattr *nla, *data;
+		int i = 0, nr_buff = 0;
+#define SKW_ATTR_RING_BUFFERS_STATUS    13
+#define SKW_ATTR_NUM_RING_BUFFERS       14
+
+		data = attr[NL80211_ATTR_VENDOR_DATA];
+		if (!data)
+			return WIFI_ERROR_NOT_AVAILABLE;
+
+		nla_for_each_attr(nla, (struct nlattr *)nla_data(data), nla_len(data), left) {
+			type = nla_type(nla);
+			switch (type) {
+			case SKW_ATTR_NUM_RING_BUFFERS:
+				nr_buff = nla_get_u32(nla);
+				break;
+
+			case SKW_ATTR_RING_BUFFERS_STATUS:
+				if (nla_len(nla) == sizeof(wifi_ring_buffer_status)) {
+					memcpy(&mStatus[i++], nla_data(nla), nla_len(nla));
+					*num = i;
+				} else {
+					ALOGE("wifi_ring_buffer_status not match");
+				}
+
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		if (nr_buff != *(int *)num)
+			ALOGE("num of ring buffs not match, %d - %d", nr_buff, *num);
+
+		return WIFI_SUCCESS;
+	}
+};
+
+// There are no flags for these 3 in the legacy feature set. Adding them to
+// the set because all the current devices support it.
+//  *hidl_caps |= HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA;
+//  *hidl_caps |= HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS;
+//  *hidl_caps |= HidlChipCaps::DEBUG_ERROR_ALERTS;
+wifi_error skw_wifi_get_ring_buffers_status(wifi_interface_handle iface,
+		u32 *num_rings, wifi_ring_buffer_status *status)
+{
+	GetRingBuffStatus cmd(getSock(iface), getFamily(iface), 0,
+			NL80211_CMD_VENDOR, num_rings, status);
+	cmd.build(iface, NULL);
+	cmd.send();
+
+	ALOGD("%s, num rings: %d", __func__, *num_rings);
+
+	return WIFI_SUCCESS;
+}
+
+class GetLoggerFeature : public WifiCommand
+{
+private:
+	unsigned int mFeatures;
+
+public:
+	GetLoggerFeature(struct nl_sock *sk, int family, int flags, int nl80211_cmd)
+		: WifiCommand(sk, family, flags, nl80211_cmd)
+	{
+		mFeatures = 0;
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+		interface_info *iface = (interface_info *)handle;
+		put_u32(NL80211_ATTR_VENDOR_ID, OUI_GOOGLE);
+		put_u32(NL80211_ATTR_VENDOR_SUBCMD, SKW_VCMD_GET_LOGGER_FEATURES);
+
+		if (iface->wdev_idx)
+			put_u32(NL80211_ATTR_WDEV, iface->wdev_idx);
+		else
+			put_u32(NL80211_ATTR_IFINDEX, iface->iface_idx);
+
+		return WIFI_SUCCESS;
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+		struct nlattr *data = attr[NL80211_ATTR_VENDOR_DATA];
+
+		if (!data)
+			return WIFI_ERROR_NOT_AVAILABLE;
+
+		mFeatures = nla_get_u32(data);
+
+		return WIFI_SUCCESS;
+	}
+
+	int features()
+	{
+		return mFeatures;
+	}
+};
+
+wifi_error skw_wifi_get_logger_supported_feature_set(wifi_interface_handle iface,
+							unsigned int *features)
+{
+	GetLoggerFeature cmd(getSock(iface), getFamily(iface), 0, NL80211_CMD_VENDOR);
+	cmd.build(iface, NULL);
+	cmd.send();
+
+	*features = cmd.features();
+
+	ALOGD("%s, features: 0x%x", __func__, *features);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_ring_data(wifi_interface_handle iface, char *ring_name)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_enable_tdls(wifi_interface_handle, mac_addr, wifi_tdls_params *,
+		wifi_tdls_handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_disable_tdls(wifi_interface_handle, mac_addr)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_tdls_status(wifi_interface_handle, mac_addr, wifi_tdls_status *)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_tdls_capabilities(wifi_interface_handle iface,
+		wifi_tdls_capabilities *capabilities)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_driver_version(wifi_interface_handle handle, char *buffer,
+					int buffer_size)
+{
+	int subcmd = SKW_DRV_VERSION;
+	wifi_error err = WIFI_ERROR_UNKNOWN;
+	GetVersionCommand cmd(getSock(handle), getFamily(handle), 0, NL80211_CMD_VENDOR);
+
+	if (cmd.build(handle, &subcmd) == WIFI_SUCCESS)
+		err = cmd.send();
+
+	if (err == WIFI_SUCCESS)
+		strncpy(buffer, cmd.getVersion(), buffer_size);
+
+	ALOGD("%s: %s", __func__, buffer);
+
+	return err;
+}
+
+wifi_error skw_wifi_set_passpoint_list(wifi_request_id id, wifi_interface_handle iface,
+		int num, wifi_passpoint_network *networks, wifi_passpoint_event_handler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_passpoint_list(wifi_request_id id, wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_lci(wifi_request_id id, wifi_interface_handle iface,
+		wifi_lci_information *lci)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_lcr(wifi_request_id id, wifi_interface_handle iface,
+		wifi_lcr_information *lcr)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+#if 0
+wifi_error skw_wifi_start_sending_offloaded_packet(wifi_request_id id,
+		wifi_interface_handle iface, u16 ether_type, u8 *ip_packet,
+		u16 ip_packet_len, u8 *src_mac_addr, u8 *dst_mac_addr,
+		u32 period_msec)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+#endif
+
+wifi_error skw_wifi_stop_sending_offloaded_packet(wifi_request_id id,
+		wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_start_rssi_monitoring(wifi_request_id id, wifi_interface_handle
+		iface, s8 max_rssi, s8 min_rssi, wifi_rssi_event_handler eh)
+{
+	ALOGD("%s", __func__);
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_wake_reason_stats(wifi_interface_handle iface,
+		WLAN_DRIVER_WAKE_REASON_CNT *wifi_wake_reason_cnt)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_configure_nd_offload(wifi_interface_handle iface, u8 enable)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_driver_memory_dump(wifi_interface_handle iface,
+		wifi_driver_memory_dump_callbacks callbacks)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_start_pkt_fate_monitoring(wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_tx_pkt_fates(wifi_interface_handle handle,
+		wifi_tx_report *tx_report_bufs, size_t n_requested_fates,
+		size_t *n_provided_fates)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_rx_pkt_fates(wifi_interface_handle handle,
+		wifi_rx_report *rx_report_bufs, size_t n_requested_fates,
+		size_t *n_provided_fates)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/* NAN functions */
+wifi_error skw_wifi_nan_enable_request(transaction_id id,
+		wifi_interface_handle iface, NanEnableRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_disable_request(transaction_id id,
+		wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_publish_request(transaction_id id,
+		wifi_interface_handle iface, NanPublishRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_publish_cancel_request(transaction_id id,
+		wifi_interface_handle iface, NanPublishCancelRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_subscribe_request(transaction_id id,
+		wifi_interface_handle iface, NanSubscribeRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_subscribe_cancel_request(transaction_id id,
+		wifi_interface_handle iface, NanSubscribeCancelRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_transmit_followup_request(transaction_id id,
+		wifi_interface_handle iface, NanTransmitFollowupRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_stats_request(transaction_id id,
+		wifi_interface_handle iface, NanStatsRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_config_request(transaction_id id,
+		wifi_interface_handle iface, NanConfigRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_tca_request(transaction_id id,
+		wifi_interface_handle iface, NanTCARequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_beacon_sdf_payload_request(transaction_id id,
+		wifi_interface_handle iface, NanBeaconSdfPayloadRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_register_handler(wifi_interface_handle iface,
+		NanCallbackHandler handlers)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_get_version(wifi_handle handle,
+		NanVersion* version)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_get_capabilities(transaction_id id,
+		wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_data_interface_create(transaction_id id,
+		wifi_interface_handle iface,
+		char *iface_name)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_data_interface_delete(transaction_id id,
+		wifi_interface_handle iface, char *iface_name)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_data_request_initiator(
+		transaction_id id, wifi_interface_handle iface,
+		NanDataPathInitiatorRequest *msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_data_indication_response(
+		transaction_id id, wifi_interface_handle iface,
+		NanDataPathIndicationResponse *msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_nan_data_end(transaction_id id,
+		wifi_interface_handle iface,
+		NanDataPathEndRequest *msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_select_tx_power_scenario(wifi_interface_handle iface,
+					wifi_power_scenario scenario)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+wifi_error skw_wifi_reset_tx_power_scenario(wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+/**
+ * Returns the chipset's hardware filtering capabilities:
+ * @param version pointer to version of the packet filter interpreter
+ *                supported, filled in upon return. 0 indicates no support.
+ * @param max_len pointer to maximum size of the filter bytecode, filled in
+ *                upon return.
+ */
+wifi_error skw_wifi_get_packet_filter_capabilities(wifi_interface_handle handle,
+		u32 *version, u32 *max_len)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+/**
+      * Programs the packet filter.
+ * @param program pointer to the program byte-code.
+ * @param len length of the program byte-code.
+     */
+wifi_error skw_wifi_set_packet_filter(wifi_interface_handle handle,
+		const u8 *program, u32 len)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_read_packet_filter(wifi_interface_handle handle,
+		u32 src_offset, u8 *host_dst,
+		u32 length)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_get_roaming_capabilities(wifi_interface_handle handle,
+		wifi_roaming_capabilities *caps)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_enable_firmware_roaming(wifi_interface_handle handle,
+		fw_roaming_state_t state)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_configure_roaming(wifi_interface_handle handle,
+		wifi_roaming_config *roaming_config)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_radio_mode_change_handler(wifi_request_id id, wifi_interface_handle
+		iface, wifi_radio_mode_change_handler eh)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+#if __ANDROID_API__ > __ANDROID_API_Q__
+wifi_error skw_wifi_set_latency_mode(wifi_interface_handle iface,
+		wifi_latency_mode mode)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+wifi_error skw_wifi_set_thermal_mitigation_mode(wifi_handle handle,
+		wifi_thermal_mode mode, u32 completion_window)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_map_dscp_access_category(wifi_handle handle,
+		u32 start, u32 end, u32 access_category)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_reset_dscp_mapping(wifi_handle handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_virtual_interface_create(wifi_handle handle, const char* ifname,
+		wifi_interface_type iface_type)
+{
+	ALOGD("%s: ifname: %s, type: 0x%x", __func__, ifname, iface_type);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_virtual_interface_delete(wifi_handle handle, const char* ifname)
+{
+	ALOGD("%s: ifname: %s", __func__, ifname);
+
+	return WIFI_SUCCESS;
+}
+
+wifi_error skw_wifi_set_subsystem_restart_handler(wifi_handle handle,
+		wifi_subsystem_restart_handler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Allow vendor HAL to choose interface name when creating
+ * an interface. This can be implemented by chips with their
+ * own interface naming policy.
+ * If not implemented, the default naming will be used.
+ */
+wifi_error skw_wifi_get_supported_iface_name(wifi_handle handle, u32 iface_type,
+		char *name, size_t len)
+{
+	return WIFI_ERROR_NOT_AVAILABLE;
+}
+
+/**
+ * Perform early initialization steps that are needed when WIFI
+ * is disabled.
+ * If the function returns failure, it means the vendor HAL is unusable
+ * (for example, if chip hardware is not installed) and no further
+ * functions should be called.
+ */
+wifi_error skw_wifi_early_initialize(void)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Get supported feature set which are chip-global, that is
+ * not dependent on any created interface.
+ */
+wifi_error skw_wifi_get_chip_feature_set(wifi_handle handle, feature_set *set)
+{
+	ALOGD("%s: 0x%x", __func__, *set);
+
+#if 0
+	*set |= WIFI_FEATURE_INFRA;
+	*set |= WIFI_FEATURE_INFRA_5G;
+	*set |= WIFI_FEATURE_P2P;
+	*set |= WIFI_FEATURE_SOFT_AP;
+#endif
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Invoked to indicate that the provided iface is the primary STA iface when there are more
+ * than 1 STA iface concurrently active.
+ */
+wifi_error skw_wifi_multi_sta_set_primary_connection(wifi_handle handle,
+		wifi_interface_handle iface)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * When there are 2 simultaneous STA connections, this use case hint
+ * indicates what STA + STA use-case is being enabled by the framework.
+ */
+wifi_error skw_wifi_multi_sta_set_use_case(wifi_handle handle,
+				wifi_multi_sta_use_case use_case)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Invoked to indicate that the following list of wifi_coex_unsafe_channel should be avoided
+ * with the specified restrictions.
+ * @param unsafeChannels list of current |wifi_coex_unsafe_channel| to avoid.
+ * @param restrictions bitmask of |wifi_coex_restriction| indicating wifi interfaces to
+ *         restrict from the current unsafe channels.
+ */
+wifi_error skw_wifi_set_coex_unsafe_channels(wifi_handle handle, u32 num_channels,
+			wifi_coex_unsafe_channel *unsafeChannels, u32 restrictions)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Invoked to set voip optimization mode for the provided STA iface
+ */
+wifi_error skw_wifi_set_voip_mode(wifi_interface_handle iface, wifi_voip_mode mode)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_register_handler
+ *        Request to register TWT callback before sending any TWT request
+ * @param wifi_interface_handle:
+ * @param TwtCallbackHandler: callback function pointers
+ * @return Synchronous wifi_error
+ */
+wifi_error skw_wifi_twt_register_handler(wifi_interface_handle iface,
+					TwtCallbackHandler handler)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_get_capability
+ *        Request TWT capability
+ * @param wifi_interface_handle:
+ * @return Synchronous wifi_error and TwtCapabilitySet
+ */
+wifi_error skw_wifi_twt_get_capability(wifi_interface_handle iface,
+					TwtCapabilitySet* twt_cap_set)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_setup_request
+ *        Request to send TWT setup frame
+ * @param wifi_interface_handle:
+ * @param TwtSetupRequest: detailed parameters of setup request
+ * @return Synchronous wifi_error
+ * @return Asynchronous EventTwtSetupResponse CB return TwtSetupResponse
+ */
+wifi_error skw_wifi_twt_setup_request(wifi_interface_handle iface,
+					TwtSetupRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_teardown_request
+ *        Request to send TWT teardown frame
+ * @param wifi_interface_handle:
+ * @param TwtTeardownRequest: detailed parameters of teardown request
+ * @return Synchronous wifi_error
+ * @return Asynchronous EventTwtTeardownCompletion CB return TwtTeardownCompletion
+ * TwtTeardownCompletion may also be received due to other events
+ * like CSA, BTCX, TWT scheduler, MultiConnection, peer-initiated teardown, etc.
+ */
+wifi_error skw_wifi_twt_teardown_request(wifi_interface_handle iface,
+					TwtTeardownRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_info_frame_request
+ *        Request to send TWT info frame
+ * @param wifi_interface_handle:
+ * @param TwtInfoFrameRequest: detailed parameters in info frame
+ * @return Synchronous wifi_error
+ * @return Asynchronous EventTwtInfoFrameReceived CB return TwtInfoFrameReceived
+ * Driver may also receive Peer-initiated TwtInfoFrame
+ */
+wifi_error skw_wifi_twt_info_frame_request(wifi_interface_handle iface,
+					TwtInfoFrameRequest* msg)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_get_stats
+ *        Request to get TWT stats
+ * @param wifi_interface_handle:
+ * @param config_id: configuration ID of TWT request
+ * @return Synchronous wifi_error and TwtStats
+ */
+wifi_error skw_wifi_twt_get_stats(wifi_interface_handle iface, u8 config_id,
+				TwtStats* stats)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief twt_clear_stats
+ *        Request to clear TWT stats
+ * @param wifi_interface_handle:
+ * @param config_id: configuration ID of TWT request
+ * @return Synchronous wifi_error
+ */
+wifi_error skw_wifi_twt_clear_stats(wifi_interface_handle iface, u8 config_id)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Invoked to set DTIM configuration when the host is in the suspend mode
+ * @param wifi_interface_handle:
+ * @param multiplier: when STA in the power saving mode, the wake up interval will be set to
+ *              1) multiplier * DTIM period if multiplier > 0.
+ *              2) the device default value if multiplier <=0
+ * Some implementations may apply an additional cap to wake up interval in the case of 1).
+ */
+wifi_error skw_wifi_set_dtim_config(wifi_interface_handle handle, u32 multiplier)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**@brief wifi_get_usable_channels
+ *        Request list of usable channels for the requested bands and modes. Usable
+ *        implies channel is allowed as per regulatory for the current country code
+ *        and not restricted due to other hard limitations (e.g. DFS, Coex) In
+ *        certain modes (e.g. STA+SAP) there could be other hard restrictions
+ *        since MCC operation many not be supported by SAP. This API also allows
+ *        driver to return list of usable channels for each mode uniquely to
+ *        distinguish cases where only a limited set of modes are allowed on
+ *        a given channel e.g. srd channels may be supported for P2P but not
+ *        for SAP or P2P-Client may be allowed on an indoor channel but P2P-GO
+ *        may not be allowed. This API is not interface specific and will be
+ *        used to query capabilities of driver in terms of what modes (STA, SAP,
+ *        P2P_CLI, P2P_GO, NAN, TDLS) can be supported on each of the channels.
+ * @param handle global wifi_handle
+ * @param band_mask BIT MASK of WLAN_MAC* as represented by |wlan_mac_band|
+ * @param iface_mode_mask BIT MASK of BIT(WIFI_INTERFACE_*) represented by
+ *        |wifi_interface_mode|. Bitmask respresents all the modes that the
+ *        caller is interested in (e.g. STA, SAP, WFD-CLI, WFD-GO, TDLS, NAN).
+ *        Note: Bitmask does not represent concurrency matrix. If the caller
+ *        is interested in CLI, GO modes, the iface_mode_mask would be set
+ *        to WIFI_INTERFACE_P2P_CLIENT|WIFI_INTERFACE_P2P_GO.
+ * @param filter_mask BIT MASK of WIFI_USABLE_CHANNEL_FILTER_* represented by
+ *        |wifi_usable_channel_filter|. Indicates if the channel list should
+ *        be filtered based on additional criteria. If filter_mask is not
+ *        specified, driver should return list of usable channels purely
+ *        based on regulatory constraints.
+ * @param max_size maximum number of |wifi_usable_channel|
+ * @param size actual number of |wifi_usable_channel| entries returned by driver
+ * @param channels list of usable channels represented by |wifi_usable_channel|
+ */
+wifi_error skw_wifi_get_usable_channels(wifi_handle handle, u32 band_mask, u32 iface_mode_mask,
+					u32 filter_mask, u32 max_size, u32* size,
+					wifi_usable_channel* channels)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+
+/**
+ * Trigger wifi subsystem restart to reload firmware
+ */
+wifi_error skw_wifi_trigger_subsystem_restart(wifi_handle handle)
+{
+	ALOGD("%s", __func__);
+
+	return WIFI_SUCCESS;
+}
+#endif
+
+static nl_sock *skw_create_socket(int port)
+{
+	struct nl_sock * sock = NULL;
+	uint32_t pid = getpid() & 0x3FFFFF;
+
+	sock = nl_socket_alloc();
+	if (sock == NULL) {
+		ALOGE("%s: socked alloc failed", __func__);
+
+		return NULL;
+	}
+
+	nl_socket_set_local_port(sock, pid + (port << 22));
+	if (nl_connect(sock, NETLINK_GENERIC)) {
+		ALOGE("%s: connect failed", __func__);
+
+		nl_socket_free(sock);
+
+		return NULL;
+	}
+
+	if (nl_socket_set_buffer_size(sock, SOCK_BUFF_SIZE, 0) < 0)
+		ALOGE("cmd_sock: set RX buffer failed, %d", strerror(errno));
+
+	return sock;
+}
+
+class GetMulticastId : public WifiCommand {
+private:
+	char *group;
+	int mId;
+
+public:
+	GetMulticastId(struct nl_sock *sk, int family, int flags, int nl80211_cmd)
+		: WifiCommand(sk, family, flags, nl80211_cmd)
+	{
+		group = NULL;
+		mId = -1;
+	}
+
+	virtual wifi_error build(wifi_interface_handle handle, void *param)
+	{
+		group = (char *)param;
+		put_string(CTRL_ATTR_FAMILY_NAME, "nl80211");
+
+		return WIFI_SUCCESS;
+	}
+
+	virtual wifi_error parser(struct nlattr *attr[NL80211_ATTR_MAX])
+	{
+		int i;
+		struct nlattr *mcgrp;
+
+		if (!attr[CTRL_ATTR_MCAST_GROUPS])
+			return WIFI_ERROR_UNKNOWN;
+
+		skw_nla_for_each_nested(mcgrp, attr[CTRL_ATTR_MCAST_GROUPS], i) {
+			struct nlattr *tb2[CTRL_ATTR_MCAST_GRP_MAX + 1];
+
+			nla_parse(tb2, CTRL_ATTR_MCAST_GRP_MAX, (struct nlattr *)nla_data(mcgrp),
+				  nla_len(mcgrp), NULL);
+
+			if (!tb2[CTRL_ATTR_MCAST_GRP_NAME] || !tb2[CTRL_ATTR_MCAST_GRP_ID] ||
+			    strncmp((const char *)nla_data(tb2[CTRL_ATTR_MCAST_GRP_NAME]),
+				    group, nla_len(tb2[CTRL_ATTR_MCAST_GRP_NAME])) != 0)
+				continue;
+
+			mId = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]);
+
+			break;
+		};
+
+		return WIFI_SUCCESS;
+	}
+
+	int id()
+	{
+		return mId;
+	}
+};
+
+static int skw_get_multicast_id(struct nl_sock *sk, const char *group)
+{
+	GetMulticastId cmd(sk, genl_ctrl_resolve(sk, "nlctrl"), 0, CTRL_CMD_GETFAMILY);
+	if (cmd.build(NULL, (void *)group) == WIFI_SUCCESS)
+		cmd.send();
+
+	return cmd.id();
+}
+
+static int skw_add_membership(struct nl_sock *sk, const char *group)
+{
+	int id = skw_get_multicast_id(sk, group);
+	if (id < 0) {
+		ALOGE("Could not find group %s", group);
+		return id;
+	}
+
+	int ret = nl_socket_add_membership(sk, id);
+	if (ret < 0)
+		ALOGE("Could not add membership to group %s", group);
+
+	return ret;
+}
+
+static int evtHandler(struct nl_msg *msg, void *arg)
+{
+	ALOGD("%s", __func__);
+
+	return NL_SKIP;
+}
+
+static wifi_error skw_wifi_event_init(hal_info *hal)
+{
+	int err;
+
+	hal->nl_event = skw_create_socket(WIFI_HAL_SOCK_EVENT_PORT);
+	if (hal->nl_event == NULL) {
+		ALOGE("%s: create event socket failed", __func__);
+
+		return WIFI_ERROR_UNKNOWN;
+	}
+
+	//nl_socket_modify_cb(hal->nl_event, NL_CB_SEQ_CHECK, no_seq_check, &err);
+	nl_socket_modify_cb(hal->nl_event, NL_CB_VALID, NL_CB_CUSTOM, evtHandler, &err);
+
+	skw_add_membership(hal->nl_event, "scan");
+	skw_add_membership(hal->nl_event, "mlme");
+	skw_add_membership(hal->nl_event, "vendor");
+	skw_add_membership(hal->nl_event, "regulatory");
+
+	return WIFI_SUCCESS;
+}
+
+static void skw_wifi_event_deinit(hal_info *hal)
+{
+	if (hal->nl_event)
+		nl_socket_free(hal->nl_event);
+}
+
+static wifi_error skw_wifi_hal_init(hal_info *hal)
+{
+	hal->nl_hal = skw_create_socket(WIFI_HAL_SOCK_DEFAULT_PORT);
+	if (hal->nl_hal == NULL) {
+		ALOGE("%s: create command socket failed", __func__);
+
+		return WIFI_ERROR_UNKNOWN;
+	}
+
+	hal->family_nl80211 = genl_ctrl_resolve(hal->nl_hal, "nl80211");
+	if (hal->family_nl80211 < 0) {
+		nl_socket_free(hal->nl_hal);
+
+		ALOGE("%s: resolve nl80211 id failed", __func__);
+
+		return WIFI_ERROR_UNKNOWN;
+	}
+
+	return WIFI_SUCCESS;
+}
+
+static void skw_wifi_hal_deinit(hal_info *hal)
+{
+	if (hal->nl_hal)
+		nl_socket_free(hal->nl_hal);
+}
+
+static wifi_error skw_wifi_initialize(wifi_handle *handle)
+{
+	wifi_error err;
+	hal_info *hal = NULL;
+
+	ALOGD("%s", __func__);
+
+	hal = (hal_info *)malloc(sizeof(hal_info));
+	if (hal == NULL) {
+		ALOGE("%s: alloc hal_info failed", __func__);
+
+		return WIFI_ERROR_OUT_OF_MEMORY;
+	}
+
+	memset(hal, 0, sizeof(*hal));
+
+	if (socketpair(AF_UNIX, SOCK_STREAM, 0, hal->exit_socks) == -1) {
+		ALOGE("socketpair failed");
+
+		free(hal);
+
+		return WIFI_ERROR_UNKNOWN;
+	}
+
+	err = skw_wifi_hal_init(hal);
+	if (err != WIFI_SUCCESS) {
+		free(hal);
+		return err;
+	}
+
+	err = skw_wifi_event_init(hal);
+	if (err != WIFI_SUCCESS) {
+		skw_wifi_hal_deinit(hal);
+		free(hal);
+
+		return err;
+	}
+
+	*handle = (wifi_handle)hal;
+
+	return WIFI_SUCCESS;
+}
+
+static void skw_wifi_deinitialize(wifi_handle handle)
+{
+	hal_info *hal = (hal_info *)handle;
+
+	if (hal->cleaned_up_handler)
+		(*(hal->cleaned_up_handler))(handle);
+
+	skw_wifi_hal_deinit(hal);
+	skw_wifi_event_deinit(hal);
+
+	if (hal->exit_socks[0])
+		close(hal->exit_socks[0]);
+
+	if (hal->exit_socks[1])
+		close(hal->exit_socks[1]);
+
+	free(hal);
+}
+
+void skw_wifi_cleanup(wifi_handle handle, wifi_cleaned_up_handler clean_handler)
+{
+	hal_info *hal = (hal_info *)handle;
+
+	ALOGD("%s", __func__);
+
+	hal->cleaned_up_handler = clean_handler;
+	hal->exit = true;
+
+	TEMP_FAILURE_RETRY(write(hal->exit_socks[0], "exit", 4));
+}
+
+static int skw_socket_handler(hal_info *hal, int events, struct nl_sock *sk)
+{
+	int ret;
+	struct nl_cb *cb = nl_socket_get_cb(sk);
+
+	ret = nl_recvmsgs(sk, cb);
+
+	nl_cb_put(cb);
+
+	return ret;
+}
+
+static void skw_wifi_event_loop(wifi_handle handle)
+{
+	pollfd fd[2];
+	hal_info *hal = (hal_info *)handle;
+
+	ALOGD("%s", __func__);
+
+	memset(&fd[0], 0, sizeof(fd));
+
+	fd[0].fd = nl_socket_get_fd(hal->nl_event);
+	fd[0].events = POLLIN;
+
+	fd[1].fd = hal->exit_socks[1];
+	fd[1].events = POLLIN;
+
+	do {
+		fd[0].revents = 0;
+		fd[1].revents = 0;
+
+		if (poll(fd, 2, -1) > 0) {
+			if (fd[0].revents & POLLIN) {
+				skw_socket_handler(hal, fd[0].revents, hal->nl_event);
+			}
+		}
+
+	} while (!hal->exit);
+
+	skw_wifi_deinitialize(handle);
+}
+
+#define POLL_DRIVER_DURATION_US (100000)
+#define POLL_DRIVER_MAX_TIME_MS (10000)
+static wifi_error skw_wifi_wait_for_driver_ready(void)
+{
+	int count = (POLL_DRIVER_MAX_TIME_MS * 1000) / POLL_DRIVER_DURATION_US;
+
+	ALOGD("%s", __func__);
+
+	do {
+		if ((access("/sys/class/net/wlan0", F_OK)) == 0)
+			return WIFI_SUCCESS;
+
+		usleep(POLL_DRIVER_DURATION_US);
+
+	} while(--count > 0);
+
+	ALOGE("Time out waiting on Driver ready ... ");
+
+	return WIFI_ERROR_TIMED_OUT;
+}
+
+wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn)
+{
+	if (!fn) {
+		ALOGE("invalid parameter fn");
+		return WIFI_ERROR_UNINITIALIZED;
+	}
+
+	fn->wifi_initialize = skw_wifi_initialize;
+	fn->wifi_wait_for_driver_ready = skw_wifi_wait_for_driver_ready;
+	fn->wifi_cleanup = skw_wifi_cleanup;
+	fn->wifi_event_loop = skw_wifi_event_loop;
+	fn->wifi_get_error_info = skw_wifi_get_error_info;
+	fn->wifi_get_supported_feature_set = skw_wifi_get_supported_feature_set;
+	fn->wifi_get_concurrency_matrix = skw_wifi_get_concurrency_matrix;
+	fn->wifi_set_scanning_mac_oui = skw_wifi_set_scanning_mac_oui;
+	fn->wifi_get_supported_channels = skw_wifi_get_supported_channels;
+	fn->wifi_is_epr_supported = skw_wifi_is_epr_supported;
+	fn->wifi_get_ifaces = skw_wifi_get_ifaces;
+	fn->wifi_get_iface_name = skw_wifi_get_iface_name;
+	fn->wifi_set_iface_event_handler = skw_wifi_set_iface_event_handler;
+	fn->wifi_reset_iface_event_handler = skw_wifi_reset_iface_event_handler;
+	fn->wifi_start_gscan = skw_wifi_start_gscan;
+	fn->wifi_stop_gscan = skw_wifi_stop_gscan;
+	fn->wifi_get_cached_gscan_results = skw_wifi_get_cached_gscan_results;
+	fn->wifi_set_bssid_hotlist = skw_wifi_set_bssid_hotlist;
+	fn->wifi_reset_bssid_hotlist = skw_wifi_reset_bssid_hotlist;
+	fn->wifi_set_significant_change_handler = skw_wifi_set_significant_change_handler;
+	fn->wifi_reset_significant_change_handler = skw_wifi_reset_significant_change_handler;
+	fn->wifi_get_gscan_capabilities = skw_wifi_get_gscan_capabilities;
+	fn->wifi_set_link_stats = skw_wifi_set_link_stats;
+	fn->wifi_get_link_stats = skw_wifi_get_link_stats;
+	fn->wifi_clear_link_stats = skw_wifi_clear_link_stats;
+	fn->wifi_get_valid_channels = skw_wifi_get_valid_channels;
+	fn->wifi_rtt_range_request = skw_wifi_rtt_range_request;
+	fn->wifi_rtt_range_cancel = skw_wifi_rtt_range_cancel;
+	fn->wifi_get_rtt_capabilities = skw_wifi_get_rtt_capabilities;
+	fn->wifi_rtt_get_responder_info = skw_wifi_rtt_get_responder_info;
+	fn->wifi_enable_responder = skw_wifi_enable_responder;
+	fn->wifi_disable_responder = skw_wifi_disable_responder;
+	fn->wifi_set_nodfs_flag = skw_wifi_set_nodfs_flag;
+	fn->wifi_start_logging = skw_wifi_start_logging;
+	fn->wifi_set_epno_list = skw_wifi_set_epno_list;
+	fn->wifi_reset_epno_list = skw_wifi_reset_epno_list;
+	fn->wifi_set_country_code = skw_wifi_set_country_code;
+	fn->wifi_get_firmware_memory_dump = skw_wifi_get_firmware_memory_dump;
+	fn->wifi_set_log_handler = skw_wifi_set_log_handler;
+	fn->wifi_reset_log_handler = skw_wifi_reset_log_handler;
+	fn->wifi_set_alert_handler = skw_wifi_set_alert_handler;
+	fn->wifi_reset_alert_handler = skw_wifi_reset_alert_handler;
+	fn->wifi_get_firmware_version = skw_wifi_get_firmware_version;
+	fn->wifi_get_ring_buffers_status = skw_wifi_get_ring_buffers_status;
+	fn->wifi_get_logger_supported_feature_set = skw_wifi_get_logger_supported_feature_set;
+	fn->wifi_get_ring_data = skw_wifi_get_ring_data;
+	fn->wifi_enable_tdls = skw_wifi_enable_tdls;
+	fn->wifi_disable_tdls = skw_wifi_disable_tdls;
+	fn->wifi_get_tdls_status = skw_wifi_get_tdls_status;
+	fn->wifi_get_tdls_capabilities = skw_wifi_get_tdls_capabilities;
+	fn->wifi_get_driver_version = skw_wifi_get_driver_version;
+	fn->wifi_set_passpoint_list = skw_wifi_set_passpoint_list;
+	fn->wifi_reset_passpoint_list = skw_wifi_reset_passpoint_list;
+	fn->wifi_set_lci = skw_wifi_set_lci;
+	fn->wifi_set_lcr = skw_wifi_set_lcr;
+	// fn->wifi_start_sending_offloaded_packet = skw_wifi_start_sending_offloaded_packet;
+	fn->wifi_stop_sending_offloaded_packet = skw_wifi_stop_sending_offloaded_packet;
+	fn->wifi_start_rssi_monitoring = skw_wifi_start_rssi_monitoring;
+	fn->wifi_stop_rssi_monitoring = skw_wifi_stop_rssi_monitoring;
+	fn->wifi_get_wake_reason_stats = skw_wifi_get_wake_reason_stats;
+	fn->wifi_configure_nd_offload = skw_wifi_configure_nd_offload;
+	fn->wifi_get_driver_memory_dump = skw_wifi_get_driver_memory_dump;
+	fn->wifi_start_pkt_fate_monitoring = skw_wifi_start_pkt_fate_monitoring;
+	fn->wifi_get_tx_pkt_fates = skw_wifi_get_tx_pkt_fates;
+	fn->wifi_get_rx_pkt_fates = skw_wifi_get_rx_pkt_fates;
+	fn->wifi_nan_enable_request = skw_wifi_nan_enable_request;
+	fn->wifi_nan_disable_request = skw_wifi_nan_disable_request;
+	fn->wifi_nan_publish_request = skw_wifi_nan_publish_request;
+	fn->wifi_nan_publish_cancel_request = skw_wifi_nan_publish_cancel_request;
+	fn->wifi_nan_subscribe_request = skw_wifi_nan_subscribe_request;
+	fn->wifi_nan_subscribe_cancel_request = skw_wifi_nan_subscribe_cancel_request;
+	fn->wifi_nan_transmit_followup_request = skw_wifi_nan_transmit_followup_request;
+	fn->wifi_nan_stats_request = skw_wifi_nan_stats_request;
+	fn->wifi_nan_config_request = skw_wifi_nan_config_request;
+	fn->wifi_nan_tca_request = skw_wifi_nan_tca_request;
+	fn->wifi_nan_beacon_sdf_payload_request = skw_wifi_nan_beacon_sdf_payload_request;
+	fn->wifi_nan_register_handler = skw_wifi_nan_register_handler;
+	fn->wifi_nan_get_version = skw_wifi_nan_get_version;
+	fn->wifi_nan_get_capabilities = skw_wifi_nan_get_capabilities;
+	fn->wifi_nan_data_interface_create = skw_wifi_nan_data_interface_create;
+	fn->wifi_nan_data_interface_delete = skw_wifi_nan_data_interface_delete;
+	fn->wifi_nan_data_request_initiator = skw_wifi_nan_data_request_initiator;
+	fn->wifi_nan_data_indication_response = skw_wifi_nan_data_indication_response;
+	fn->wifi_nan_data_end = skw_wifi_nan_data_end;
+	fn->wifi_select_tx_power_scenario = skw_wifi_select_tx_power_scenario;
+	fn->wifi_reset_tx_power_scenario = skw_wifi_reset_tx_power_scenario;
+	fn->wifi_get_packet_filter_capabilities = skw_wifi_get_packet_filter_capabilities;
+	fn->wifi_set_packet_filter = skw_wifi_set_packet_filter;
+	fn->wifi_read_packet_filter = skw_wifi_read_packet_filter;
+	fn->wifi_get_roaming_capabilities = skw_wifi_get_roaming_capabilities;
+	fn->wifi_enable_firmware_roaming = skw_wifi_enable_firmware_roaming;
+	fn->wifi_configure_roaming = skw_wifi_configure_roaming;
+	fn->wifi_set_radio_mode_change_handler = skw_wifi_set_radio_mode_change_handler;
+#if __ANDROID_API__ > __ANDROID_API_Q__
+	fn->wifi_set_latency_mode = skw_wifi_set_latency_mode;
+	fn->wifi_set_thermal_mitigation_mode = skw_wifi_set_thermal_mitigation_mode;
+	fn->wifi_map_dscp_access_category = skw_wifi_map_dscp_access_category;
+	fn->wifi_reset_dscp_mapping = skw_wifi_reset_dscp_mapping;
+	fn->wifi_virtual_interface_create = skw_wifi_virtual_interface_create;
+	fn->wifi_virtual_interface_delete = skw_wifi_virtual_interface_delete;
+	fn->wifi_set_subsystem_restart_handler = skw_wifi_set_subsystem_restart_handler;
+	fn->wifi_get_supported_iface_name = skw_wifi_get_supported_iface_name;
+	fn->wifi_early_initialize = skw_wifi_early_initialize;
+	fn->wifi_get_chip_feature_set = skw_wifi_get_chip_feature_set;
+	fn->wifi_multi_sta_set_primary_connection = skw_wifi_multi_sta_set_primary_connection;
+	fn->wifi_multi_sta_set_use_case = skw_wifi_multi_sta_set_use_case;
+	fn->wifi_set_coex_unsafe_channels = skw_wifi_set_coex_unsafe_channels;
+	fn->wifi_set_voip_mode = skw_wifi_set_voip_mode;
+	fn->wifi_twt_register_handler = skw_wifi_twt_register_handler;
+	fn->wifi_twt_get_capability = skw_wifi_twt_get_capability;
+	fn->wifi_twt_setup_request = skw_wifi_twt_setup_request;
+	fn->wifi_twt_teardown_request = skw_wifi_twt_teardown_request;
+	fn->wifi_twt_info_frame_request = skw_wifi_twt_info_frame_request;
+	fn->wifi_twt_get_stats = skw_wifi_twt_get_stats;
+	fn->wifi_twt_clear_stats = skw_wifi_twt_clear_stats;
+	fn->wifi_set_dtim_config = skw_wifi_set_dtim_config;
+	fn->wifi_get_usable_channels = skw_wifi_get_usable_channels;
+	fn->wifi_trigger_subsystem_restart = skw_wifi_trigger_subsystem_restart;
+#endif
+
+	return WIFI_SUCCESS;
+}
diff --git a/android/hardware/seekwave/wlan/wifi_hal/main.h b/android/hardware/seekwave/wlan/wifi_hal/main.h
new file mode 100755
index 0000000..e7a829d
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wifi_hal/main.h
@@ -0,0 +1,53 @@
+#ifndef __MAIN_H__
+#define __MAIN_H__
+
+#define LOG_TAG  "SKW_WiFiHAL"
+#include <log/log.h>
+
+#include "wifi_hal.h"
+
+#define OUI_GOOGLE     0x001A11
+#define SKW_NR_IFACE   8
+
+#define skw_nla_for_each_nested(pos, nla, rem) \
+	for (pos = (nlattr *)nla_data(nla), rem = nla_len(nla); \
+	     nla_ok(pos, rem); \
+	     pos = (nlattr *)nla_next(pos, &(rem)))
+
+typedef struct {
+	int  iface_idx;                                // id to use when talking to driver
+	int  wdev_idx;                                 // id to use when talking to driver
+	wifi_handle hal_handle;                        // handle to wifi data
+	char name[IFNAMSIZ+1];                         // interface name + trailing null
+} interface_info;
+
+typedef struct {
+	struct nl_sock *nl_hal;                        // command socket object
+	struct nl_sock *nl_event;                      // event socket object
+	int family_nl80211;                            // family id for 80211 driver
+
+	bool exit;                                     // Indication to exit since cleanup has started
+	int exit_socks[2];                             // sockets used to implement wifi_cleanup
+	wifi_cleaned_up_handler cleaned_up_handler;
+
+	bool in_event_loop;                             // Indicates that event loop is active
+
+	pthread_mutex_t cb_lock;                        // mutex for the event_cb access
+
+	int num_cmd;                                    // number of commands
+	int alloc_cmd;                                  // number of commands allocated
+
+	int nr_interfaces;
+	interface_info interfaces[SKW_NR_IFACE];
+	wifi_interface_handle interface_handle[SKW_NR_IFACE];
+
+	int max_num_interfaces;                         // max number of interfaces
+
+	// add other details
+} hal_info;
+
+static inline hal_info *getHalInfo(wifi_interface_handle handle)
+{
+    return (hal_info *)(((interface_info *)handle)->hal_handle);
+}
+#endif
diff --git a/android/hardware/seekwave/wlan/wifi_hal/wifi_command.cpp b/android/hardware/seekwave/wlan/wifi_hal/wifi_command.cpp
new file mode 100755
index 0000000..e594438
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wifi_hal/wifi_command.cpp
@@ -0,0 +1,87 @@
+#include <netlink/genl/genl.h>
+
+#include "wifi_command.h"
+
+static int ackHandler(struct nl_msg *msg, void *arg)
+{
+	*((int *)arg) = 0;
+
+	return NL_STOP;
+}
+
+static int finishHandler(struct nl_msg *msg, void *arg)
+{
+	*((int *)arg) = 0;
+
+	return NL_SKIP;
+}
+
+static int errorHandler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
+{
+	*((int *)arg) = 0;
+
+	return NL_SKIP;
+}
+
+static int msgHandler(struct nl_msg *msg, void *arg)
+{
+	struct nlattr *attr[NL80211_ATTR_MAX + 1];
+	WifiCommand *cmd = (WifiCommand *)arg;
+	struct genlmsghdr *gnlh = (struct genlmsghdr *)nlmsg_data(nlmsg_hdr(msg));
+
+	nla_parse(attr, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
+			genlmsg_attrlen(gnlh, 0), NULL);
+
+	cmd->parser(attr);
+
+	return NL_SKIP;
+}
+
+wifi_error sendMsg(struct nl_sock *sk, struct nl_msg *msg, void *arg)
+{
+	int err;
+	struct nl_cb *cb;
+
+       	cb = nl_cb_alloc(NL_CB_DEFAULT);
+	if (cb == NULL) {
+		ALOGE("%s: alloc cb failed");
+		return WIFI_ERROR_OUT_OF_MEMORY;
+	}
+
+	nl_cb_err(cb, NL_CB_CUSTOM, errorHandler, &err);
+	nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finishHandler, &err);
+	nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ackHandler, &err);
+	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, msgHandler, arg);
+
+	err = nl_send_auto_complete(sk, msg);
+	while (err > 0) {
+		int res = nl_recvmsgs(sk, cb);
+		if (res < 0)
+			ALOGE("%s: recv msg failed: %d", res);
+	}
+
+	nl_cb_put(cb);
+
+	return err ? WIFI_ERROR_UNKNOWN : WIFI_SUCCESS;
+}
+
+wifi_error WifiCommand::send()
+{
+	return sendMsg(sock, nlmsg(), (void *)this);
+}
+
+WifiCommand::~WifiCommand()
+{
+	nlmsg_free(msg);
+}
+
+WifiCommand::WifiCommand(struct nl_sock *sk, int family_id, int flags, int nl80211_cmd)
+{
+	sock = sk;
+
+	msg = nlmsg_alloc();
+	if (msg)
+		genlmsg_put(msg, 0, 0, family_id, 0, flags, nl80211_cmd, 0);
+	else
+		ALOGE("nlmsg alloc failed, nl80211 cmd: %d", nl80211_cmd);
+}
diff --git a/android/hardware/seekwave/wlan/wifi_hal/wifi_command.h b/android/hardware/seekwave/wlan/wifi_hal/wifi_command.h
new file mode 100755
index 0000000..8c73da4
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wifi_hal/wifi_command.h
@@ -0,0 +1,99 @@
+#ifndef __WIFI_COMMAND_H__
+#define __WIFI_COMMAND_H__
+
+#include "main.h"
+#include "nl80211_copy.h"
+
+#define SKW_VCMD_GET_CHANNELS                   0x1009
+#define SKW_VCMD_SET_COUNTRY                    0x100E
+#define SKW_VCMD_GET_VERSION                    0x1403
+#define SKW_VCMD_GET_RING_BUFFERS_STATUS        0x1404
+#define SKW_VCMD_GET_LOGGER_FEATURES            0x1406
+enum SKW_SUBCMD_GET_VERSION {
+	SKW_DRV_VERSION = 1,
+	SKW_FW_VERSION,
+};
+
+class WifiCommand {
+private:
+	struct nl_msg *msg;
+	struct nl_sock *sock;
+	int id;
+
+public:
+	WifiCommand(struct nl_sock *sk, int family_id, int flags, int nl80211_cmd);
+	wifi_error send();
+
+	virtual ~WifiCommand();
+	virtual wifi_error build(wifi_interface_handle handle, void *param) = 0;
+	// virtual wifi_error parser(struct nl_msg *msg) = 0;
+	virtual wifi_error parser(struct nlattr *attr[]) = 0;
+	// virtual wifi_error parser(struct nlattr *tb[CTRL_ATTR_MAX])
+
+	struct nl_msg *nlmsg()
+	{
+		return msg;
+	}
+
+	int put_s8(int attribute, int8_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(int8_t), &value);
+	}
+
+	int put_u8(int attribute, uint8_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(uint8_t), &value);
+	}
+
+	int put_s16(int attribute, int16_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(int16_t), &value);
+	}
+
+	int put_u16(int attribute, uint16_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(uint16_t), &value);
+	}
+
+	int put_s32(int attribute, int32_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(int32_t), &value);
+	}
+
+	int put_u32(int attribute, uint32_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(uint32_t), &value);
+	}
+
+	int put_s64(int attribute, int64_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(int64_t), &value);
+	}
+
+	int put_u64(int attribute, uint64_t value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(uint64_t), &value);
+	}
+
+	int put_string(int attribute, const char *value)
+	{
+		return nla_put(nlmsg(), attribute, strlen(value) + 1, value);
+	}
+
+	int put_addr(int attribute, mac_addr value)
+	{
+		return nla_put(nlmsg(), attribute, sizeof(mac_addr), value);
+	}
+
+	struct nlattr *attr_start()
+	{
+		return nla_nest_start(nlmsg(), NL80211_ATTR_VENDOR_DATA);
+	}
+
+	void attr_end(struct nlattr *attribute)
+	{
+		nla_nest_end(nlmsg(), attribute);
+	}
+};
+
+#endif
diff --git a/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/Android.mk b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/Android.mk
new file mode 100755
index 0000000..20e27f0
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/Android.mk
@@ -0,0 +1,64 @@
+# Copyright (C) 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
+
+ifeq ($(BOARD_WLAN_DEVICE), seekwave)
+
+WPA_SRC_DIR = external/wpa_supplicant_8
+
+SKW_LIB_INC = $(WPA_SRC_DIR)/src \
+		$(WPA_SRC_DIR)/src/common \
+		$(WPA_SRC_DIR)/src/drivers \
+		$(WPA_SRC_DIR)/src/l2_packet \
+		$(WPA_SRC_DIR)/src/utils \
+		$(WPA_SRC_DIR)/src/wps \
+		$(WPA_SRC_DIR)/wpa_supplicant
+
+SKW_LIB_INC += external/libnl/include
+SKW_LIB_SRC = driver_cmd_nl80211.c
+
+include $(WPA_SRC_DIR)/wpa_supplicant/android.config
+L_CFLAGS += -Wall -Werror -Wno-unused-parameter -Wno-macro-redefined
+
+ifeq ($(TARGET_ARCH),arm)
+# To force sizeof(enum) = 4
+L_CFLAGS += -mabi=aapcs-linux
+endif
+
+ifdef CONFIG_ANDROID_LOG
+L_CFLAGS += -DCONFIG_ANDROID_LOG
+endif
+
+ifdef CONFIG_P2P
+L_CFLAGS += -DCONFIG_P2P
+endif
+
+########################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := lib_driver_cmd_skw
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-BSD
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
+LOCAL_SHARED_LIBRARIES := libc libcutils
+LOCAL_CFLAGS := $(L_CFLAGS)
+LOCAL_SRC_FILES := $(SKW_LIB_SRC)
+LOCAL_C_INCLUDES := $(SKW_LIB_INC)
+LOCAL_VENDOR_MODULE := true
+include $(BUILD_STATIC_LIBRARY)
+
+########################
+
+endif
diff --git a/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/MODULE_LICENSE_BSD b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/MODULE_LICENSE_BSD
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/MODULE_LICENSE_BSD
diff --git a/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/NOTICE b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/NOTICE
new file mode 100755
index 0000000..b523c01
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/NOTICE
@@ -0,0 +1,42 @@
+Copyright (c) 2005-2010, The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+ * Neither the name of The Android Open Source Project nor the names
+   of its contributors may be used to endorse or promote products
+   derived from this software without specific prior written
+   permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+ * Copyright (c) 2002-2010, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2003-2004, Instant802 Networks, Inc.
+ * Copyright (c) 2005-2006, Devicescape Software, Inc.
+ * Copyright (c) 2007, Johannes Berg <johannes@sipsolutions.net>
+ * Copyright (c) 2009-2010, Atheros Communications
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
diff --git a/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/driver_cmd_nl80211.c b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/driver_cmd_nl80211.c
new file mode 100755
index 0000000..eda244e
--- /dev/null
+++ b/android/hardware/seekwave/wlan/wpa_supplicant_8_lib/driver_cmd_nl80211.c
@@ -0,0 +1,169 @@
+/*
+ * Driver interaction with extended Linux CFG8021
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
+ *
+ */
+
+#include "includes.h"
+#include <sys/types.h>
+#include <fcntl.h>
+#include <net/if.h>
+
+#include "common.h"
+#include "linux_ioctl.h"
+#include "driver_nl80211.h"
+#include "wpa_supplicant_i.h"
+#include "config.h"
+#ifdef ANDROID
+#include "android_drv.h"
+#endif
+
+typedef struct android_wifi_priv_cmd {
+	char *bufaddr;
+	int used_len;
+	int total_len;
+} android_wifi_priv_cmd;
+
+static int drv_errors = 0;
+
+static void wpa_driver_send_hang_msg(struct wpa_driver_nl80211_data *drv)
+{
+	drv_errors++;
+	if (drv_errors > DRV_NUMBER_SEQUENTIAL_ERRORS) {
+		drv_errors = 0;
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+	}
+}
+
+static void wpa_driver_notify_country_change(void *ctx, char *cmd)
+{
+	if ((os_strncasecmp(cmd, "COUNTRY", 7) == 0) ||
+	    (os_strncasecmp(cmd, "SETBAND", 7) == 0)) {
+		union wpa_event_data event;
+
+		os_memset(&event, 0, sizeof(event));
+		event.channel_list_changed.initiator = REGDOM_SET_BY_USER;
+		if (os_strncasecmp(cmd, "COUNTRY", 7) == 0) {
+			event.channel_list_changed.type = REGDOM_TYPE_COUNTRY;
+			if (os_strlen(cmd) > 9) {
+				event.channel_list_changed.alpha2[0] = cmd[8];
+				event.channel_list_changed.alpha2[1] = cmd[9];
+			}
+		} else {
+			event.channel_list_changed.type = REGDOM_TYPE_UNKNOWN;
+		}
+		wpa_supplicant_event(ctx, EVENT_CHANNEL_LIST_CHANGED, &event);
+	}
+}
+
+int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf,
+				  size_t buf_len )
+{
+	struct i802_bss *bss = priv;
+	struct wpa_driver_nl80211_data *drv = bss->drv;
+	struct ifreq ifr;
+	android_wifi_priv_cmd priv_cmd;
+	int ret = 0;
+
+	if (bss->ifindex <= 0 && bss->wdev_id > 0) {
+		/* DRIVER CMD received on the DEDICATED P2P Interface which doesn't
+		 * have an NETDEVICE associated with it. So we have to re-route the
+		 * command to the parent NETDEVICE
+		 */
+		struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx);
+
+		wpa_printf(MSG_DEBUG, "Re-routing DRIVER cmd to parent iface");
+		if (wpa_s && wpa_s->parent) {
+			/* Update the nl80211 pointers corresponding to parent iface */
+			bss = wpa_s->parent->drv_priv;
+			if (bss) {
+				drv = bss->drv;
+			} else {
+				wpa_printf(MSG_DEBUG, "bss invalid, command : %s", cmd);
+				return -1;
+			}
+
+			wpa_printf(MSG_DEBUG, "Re-routing command to iface: %s"
+					      " cmd (%s)", bss->ifname, cmd);
+		}
+	}
+
+	if (os_strcasecmp(cmd, "STOP") == 0) {
+		linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 0);
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STOPPED");
+	} else if (os_strcasecmp(cmd, "START") == 0) {
+		linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 1);
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STARTED");
+	} else if (os_strcasecmp(cmd, "MACADDR") == 0) {
+		u8 macaddr[ETH_ALEN] = {};
+
+		ret = linux_get_ifhwaddr(drv->global->ioctl_sock, bss->ifname, macaddr);
+		if (!ret)
+			ret = os_snprintf(buf, buf_len,
+					  "Macaddr = " MACSTR "\n", MAC2STR(macaddr));
+	} else { /* Use private command */
+		os_memcpy(buf, cmd, strlen(cmd) + 1);
+		memset(&ifr, 0, sizeof(ifr));
+		memset(&priv_cmd, 0, sizeof(priv_cmd));
+		os_strlcpy(ifr.ifr_name, bss->ifname, IFNAMSIZ);
+
+		priv_cmd.bufaddr = buf;
+
+		priv_cmd.used_len = buf_len;
+		priv_cmd.total_len = buf_len;
+		ifr.ifr_data = &priv_cmd;
+
+		if ((ret = ioctl(drv->global->ioctl_sock, SIOCDEVPRIVATE + 1, &ifr)) < 0) {
+			wpa_printf(MSG_ERROR, "%s: failed to issue private command: %s", __func__, cmd);
+			wpa_driver_send_hang_msg(drv);
+		} else {
+			drv_errors = 0;
+			ret = 0;
+			if ((os_strcasecmp(cmd, "LINKSPEED") == 0) ||
+			    (os_strcasecmp(cmd, "RSSI") == 0) ||
+			    (os_strcasecmp(cmd, "GETBAND") == 0) ||
+			    (os_strncasecmp(cmd, "WLS_BATCHING", 12) == 0))
+				ret = strlen(buf);
+			wpa_driver_notify_country_change(drv->ctx, cmd);
+			wpa_printf(MSG_DEBUG, "%s %s len = %d, %zu", __func__, buf, ret, strlen(buf));
+		}
+	}
+	return ret;
+}
+
+int wpa_driver_set_p2p_noa(void *priv, u8 count, int start, int duration)
+{
+	wpa_printf(MSG_DEBUG, "%s: count: %d, start: %d, duration: %d",
+		   __func__, count, start, duration);
+
+	return 0;
+}
+
+int wpa_driver_get_p2p_noa(void *priv __unused, u8 *buf __unused, size_t len __unused)
+{
+	wpa_printf(MSG_DEBUG, "%s: priv: 0x%p, buf: 0x%p, len: %zu",
+		   __func__, priv, buf, len);
+
+	return 0;
+}
+
+int wpa_driver_set_p2p_ps(void *priv, int legacy_ps, int opp_ps, int ctwindow)
+{
+	wpa_printf(MSG_DEBUG, "%s: legacy_ps: %d, opp_ps: %d, ctw: %d",
+		   __func__, legacy_ps, opp_ps, ctwindow);
+
+	return 0;
+}
+
+int wpa_driver_set_ap_wps_p2p_ie(void *priv, const struct wpabuf *beacon,
+                                 const struct wpabuf *proberesp,
+                                 const struct wpabuf *assocresp)
+{
+	return 0;
+}
diff --git a/longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts b/longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts
index 35b6b40..e64033c 100755
--- a/longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts
+++ b/longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts
@@ -941,7 +941,7 @@
                         /*sd-uhs-sdr25*/
                         sd-uhs-sdr50;
                         sd-uhs-ddr50;
-                        sd-uhs-sdr104;
+                        //sd-uhs-sdr104;
 			// kickpi
                         //sunxi-power-save-mode;
                         /*sunxi-dis-signal-vol-sw;*/
diff --git a/longan/kernel/linux-4.9/drivers/misc/seekwaveplatform_lite/sdio/skw_sdio_main.c b/longan/kernel/linux-4.9/drivers/misc/seekwaveplatform_lite/sdio/skw_sdio_main.c
index 31e34fb..11f8d71 100755
--- a/longan/kernel/linux-4.9/drivers/misc/seekwaveplatform_lite/sdio/skw_sdio_main.c
+++ b/longan/kernel/linux-4.9/drivers/misc/seekwaveplatform_lite/sdio/skw_sdio_main.c
@@ -2605,22 +2605,22 @@
 	struct sdio_func *func1 = skw_sdio->sdio_func[FUNC_1];
 	struct mmc_host *host = func1->card->host;
 
-	if ((SKW_SDIO_INBAND_IRQ == skw_sdio->irq_type) && (0 == (host->caps & MMC_CAP_SDIO_IRQ))) {
-		skw_sdio_err("Please add cap-sdio-irq to dts! irq_type=%d caps=0x%x\n", skw_sdio->irq_type, host->caps);
-		ret = -EPERM;
-	} else if ((host->ios.clock > 50000000UL) && (0 == (host->caps & MMC_CAP_UHS_SDR104))) {
-		skw_sdio_err("please add sd-uhs-sdr104 to dts! clock=%d cap=0x%x\n", host->ios.clock, host->caps);
-		ret = -EPERM;
-	} else if ((host->ios.clock <= 50000000UL) && (0 != (host->caps & MMC_CAP_UHS_SDR104))) {
-		skw_sdio_err("please remove sd-uhs-sdr104 from dts! clock=%d cap=0x%x\n", host->ios.clock, host->caps);
-		ret = -EPERM;
-	} else if (host->ios.clock != host->f_max) {
-		skw_sdio_err("actual clock is not equal to max clock! clock=%d f_max=%d\n", host->ios.clock, host->f_max);
-		ret = -EPERM;
-	} else if (host->ios.timing != MMC_TIMING_UHS_SDR104) {
-		skw_sdio_err("actual timing is not equal to max timing! timing=%d t_max=%d\n", host->ios.timing, MMC_TIMING_UHS_SDR104);
-		ret = -EPERM;
-	}
+	// if ((SKW_SDIO_INBAND_IRQ == skw_sdio->irq_type) && (0 == (host->caps & MMC_CAP_SDIO_IRQ))) {
+	// 	skw_sdio_err("Please add cap-sdio-irq to dts! irq_type=%d caps=0x%x\n", skw_sdio->irq_type, host->caps);
+	// 	ret = -EPERM;
+	// } else if ((host->ios.clock > 50000000UL) && (0 == (host->caps & MMC_CAP_UHS_SDR104))) {
+	// 	skw_sdio_err("please add sd-uhs-sdr104 to dts! clock=%d cap=0x%x\n", host->ios.clock, host->caps);
+	// 	ret = -EPERM;
+	// } else if ((host->ios.clock <= 50000000UL) && (0 != (host->caps & MMC_CAP_UHS_SDR104))) {
+	// 	skw_sdio_err("please remove sd-uhs-sdr104 from dts! clock=%d cap=0x%x\n", host->ios.clock, host->caps);
+	// 	ret = -EPERM;
+	// } else if (host->ios.clock != host->f_max) {
+	// 	skw_sdio_err("actual clock is not equal to max clock! clock=%d f_max=%d\n", host->ios.clock, host->f_max);
+	// 	ret = -EPERM;
+	// } else if (host->ios.timing != MMC_TIMING_UHS_SDR104) {
+	// 	skw_sdio_err("actual timing is not equal to max timing! timing=%d t_max=%d\n", host->ios.timing, MMC_TIMING_UHS_SDR104);
+	// 	ret = -EPERM;
+	// }
 
 	return ret;
 }

--
Gitblit v1.6.2