diff options
| author | Xueqin Wang <xueqin.wang@mediatek.com> | 2015-11-17 17:33:07 +0800 |
|---|---|---|
| committer | Mister Oyster <oysterized@gmail.com> | 2017-01-23 13:27:10 +0100 |
| commit | edc26f7b1641f1947a6a7984bb022b0462b629ae (patch) | |
| tree | ca1e8daa4c2843c05ada64d453e51433dfeb60d6 | |
| parent | 138a44c1fe96138844b4826c2edca6c30ccbc9ec (diff) | |
| download | android_kernel_m2note-edc26f7b1641f1947a6a7984bb022b0462b629ae.tar.gz | |
remove FM code because FM is not used
BUG=23460645
[Feature] FM radio
Change-Id: Ie5279ade9858007fe4e93f9d9a99346fae859f52
Signed-off-by: Xueqin Wang <xueqin.wang@mediatek.com>
CR-Id: ALPS02370452
103 files changed, 0 insertions, 37527 deletions
diff --git a/arch/arm64/configs/cm12_m2note_defconfig b/arch/arm64/configs/cm12_m2note_defconfig index c34c3b078..b908b2491 100644 --- a/arch/arm64/configs/cm12_m2note_defconfig +++ b/arch/arm64/configs/cm12_m2note_defconfig @@ -1238,8 +1238,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y CONFIG_MTK_COMBO_WIFI=y CONFIG_MTK_BT_SUPPORT=y CONFIG_MTK_WFD_SUPPORT=y -# CONFIG_MTK_FM is not set -# CONFIG_MTK_FM_SUPPORT is not set # CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set # CONFIG_SDIOAUTOK_SUPPORT is not set # CONFIG_MTK_MT6306_SUPPORT is not set @@ -1455,7 +1453,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y # CONFIG_MTK_INHOUSE_GPU is not set # CONFIG_SW_SYNC64 is not set CONFIG_MTK_LASTPC=y -# CONFIG_MTK_FMRADIO is not set CONFIG_MTK_HWMON=y CONFIG_MTK_CMDQ=y CONFIG_MTK_VIDEOX=y diff --git a/arch/arm64/configs/cm13_m2note_defconfig b/arch/arm64/configs/cm13_m2note_defconfig index a284f4bcc..f9122e354 100644 --- a/arch/arm64/configs/cm13_m2note_defconfig +++ b/arch/arm64/configs/cm13_m2note_defconfig @@ -1238,8 +1238,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y CONFIG_MTK_COMBO_WIFI=y CONFIG_MTK_BT_SUPPORT=y CONFIG_MTK_WFD_SUPPORT=y -# CONFIG_MTK_FM is not set -# CONFIG_MTK_FM_SUPPORT is not set # CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set # CONFIG_SDIOAUTOK_SUPPORT is not set # CONFIG_MTK_MT6306_SUPPORT is not set @@ -1455,7 +1453,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y # CONFIG_MTK_INHOUSE_GPU is not set # CONFIG_SW_SYNC64 is not set CONFIG_MTK_LASTPC=y -# CONFIG_MTK_FMRADIO is not set CONFIG_MTK_HWMON=y CONFIG_MTK_CMDQ=y CONFIG_MTK_VIDEOX=y diff --git a/arch/arm64/configs/los13_m2note_defconfig b/arch/arm64/configs/los13_m2note_defconfig index 719355f8a..86a888db4 100644 --- a/arch/arm64/configs/los13_m2note_defconfig +++ b/arch/arm64/configs/los13_m2note_defconfig @@ -1244,8 +1244,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y CONFIG_MTK_COMBO_WIFI=y CONFIG_MTK_BT_SUPPORT=y CONFIG_MTK_WFD_SUPPORT=y -# CONFIG_MTK_FM is not set -# CONFIG_MTK_FM_SUPPORT is not set # CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set # CONFIG_SDIOAUTOK_SUPPORT is not set # CONFIG_MTK_MT6306_SUPPORT is not set @@ -1461,7 +1459,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y # CONFIG_MTK_INHOUSE_GPU is not set # CONFIG_SW_SYNC64 is not set CONFIG_MTK_LASTPC=y -# CONFIG_MTK_FMRADIO is not set CONFIG_MTK_HWMON=y CONFIG_MTK_CMDQ=y CONFIG_MTK_VIDEOX=y diff --git a/arch/arm64/configs/los14_m2note_defconfig b/arch/arm64/configs/los14_m2note_defconfig index 6327b5488..99aaf16a6 100644 --- a/arch/arm64/configs/los14_m2note_defconfig +++ b/arch/arm64/configs/los14_m2note_defconfig @@ -1238,8 +1238,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y CONFIG_MTK_COMBO_WIFI=y CONFIG_MTK_BT_SUPPORT=y CONFIG_MTK_WFD_SUPPORT=y -# CONFIG_MTK_FM is not set -# CONFIG_MTK_FM_SUPPORT is not set # CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set # CONFIG_SDIOAUTOK_SUPPORT is not set # CONFIG_MTK_MT6306_SUPPORT is not set @@ -1455,7 +1453,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y # CONFIG_MTK_INHOUSE_GPU is not set # CONFIG_SW_SYNC64 is not set CONFIG_MTK_LASTPC=y -# CONFIG_MTK_FMRADIO is not set CONFIG_MTK_HWMON=y CONFIG_MTK_CMDQ=y CONFIG_MTK_VIDEOX=y diff --git a/arch/arm64/configs/m2note_defconfig b/arch/arm64/configs/m2note_defconfig index 7d1d1f5f4..c0eb8d333 100644 --- a/arch/arm64/configs/m2note_defconfig +++ b/arch/arm64/configs/m2note_defconfig @@ -1204,8 +1204,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y CONFIG_MTK_COMBO_WIFI=y CONFIG_MTK_BT_SUPPORT=y CONFIG_MTK_WFD_SUPPORT=y -# CONFIG_MTK_FM is not set -# CONFIG_MTK_FM_SUPPORT is not set # CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set # CONFIG_SDIOAUTOK_SUPPORT is not set # CONFIG_MTK_MT6306_SUPPORT is not set @@ -1421,7 +1419,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y # CONFIG_MTK_INHOUSE_GPU is not set # CONFIG_SW_SYNC64 is not set CONFIG_MTK_LASTPC=y -# CONFIG_MTK_FMRADIO is not set CONFIG_MTK_HWMON=y CONFIG_MTK_CMDQ=y CONFIG_MTK_VIDEOX=y diff --git a/arch/arm64/configs/m2note_recovery_defconfig b/arch/arm64/configs/m2note_recovery_defconfig index ab43b6524..7b05de567 100644 --- a/arch/arm64/configs/m2note_recovery_defconfig +++ b/arch/arm64/configs/m2note_recovery_defconfig @@ -1209,8 +1209,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y CONFIG_MTK_COMBO_WIFI=y CONFIG_MTK_BT_SUPPORT=y CONFIG_MTK_WFD_SUPPORT=y -# CONFIG_MTK_FM is not set -# CONFIG_MTK_FM_SUPPORT is not set # CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set # CONFIG_SDIOAUTOK_SUPPORT is not set # CONFIG_MTK_MT6306_SUPPORT is not set @@ -1426,7 +1424,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y # CONFIG_MTK_INHOUSE_GPU is not set # CONFIG_SW_SYNC64 is not set CONFIG_MTK_LASTPC=y -# CONFIG_MTK_FMRADIO is not set CONFIG_MTK_HWMON=y CONFIG_MTK_CMDQ=y CONFIG_MTK_VIDEOX=y diff --git a/drivers/misc/mediatek/Kconfig b/drivers/misc/mediatek/Kconfig index 1737cce9d..00abc771d 100644 --- a/drivers/misc/mediatek/Kconfig +++ b/drivers/misc/mediatek/Kconfig @@ -467,7 +467,6 @@ source "drivers/misc/mediatek/smartpa/Kconfig" source "drivers/misc/mediatek/lastpc/Kconfig" -source "drivers/misc/mediatek/fmradio/Kconfig" source "drivers/misc/mediatek/hwmon/Kconfig" source "drivers/misc/mediatek/cmdq/Kconfig" source "drivers/misc/mediatek/videox/Kconfig" diff --git a/drivers/misc/mediatek/Makefile b/drivers/misc/mediatek/Makefile index 62f962151..404516ca7 100644 --- a/drivers/misc/mediatek/Makefile +++ b/drivers/misc/mediatek/Makefile @@ -47,7 +47,6 @@ obj-y += aee/ obj-$(CONFIG_MTK_EMI_MPU) += emi_mpu/ obj-$(CONFIG_MTK_EMI_BWL) += emi_bwl/ -obj-$(CONFIG_MTK_FMRADIO) += fmradio/ obj-$(CONFIG_MTK_GPS) += gps/ obj-y += m4u/ diff --git a/drivers/misc/mediatek/fmradio/Kconfig b/drivers/misc/mediatek/fmradio/Kconfig deleted file mode 100644 index 0e396d449..000000000 --- a/drivers/misc/mediatek/fmradio/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config MTK_FMRADIO - bool CONFIG_MTK_FMRADIO - default n - help - CONFIG_MTK_FMRADIO diff --git a/drivers/misc/mediatek/fmradio/Makefile b/drivers/misc/mediatek/fmradio/Makefile deleted file mode 100755 index dd675150a..000000000 --- a/drivers/misc/mediatek/fmradio/Makefile +++ /dev/null @@ -1,228 +0,0 @@ -# Makefile generated by Mediatek -# fm support -ifeq ($(CONFIG_MTK_FM_SUPPORT), y) - -subdir-ccflags-y += -D MTK_WCN_REMOVE_KERNEL_MODULE -subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM)/include - -#define build_speical_fm_driver - -# MT6628 FM driver -#ifeq ($(CONFIG_MTK_FM_CHIP), MT6628_FM) - -$(warning feature_option=$(CONFIG_MTK_FM_CHIP)) -ifeq ($(findstring MT6628_FM,$(CONFIG_MTK_FM_CHIP)),MT6628_FM) -$(warning MT6628_FM) - FM_CHIP := mt6628 - FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) - ccflags-y += -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/../connectivity/combo/common/include \ - -I$(src)/../connectivity/combo/common/linux/include \ - -I$(src)/../connectivity/common_detect - -obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o - mt6628-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_rds_parser.o \ - core/fm_patch.o \ - core/fm_utils.o \ - core/fm_link.o \ - core/fm_eint.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_cmd.o \ - $(FM_CHIP_PATH)_fm_config.o - mtk_fm_drv-objs += $(mt6628-objs) -$(warning $(mtk_fm_drv-objs)) - #obj-$(CONFIG_MTK_FM) += private/ -endif - -# MT6620 FM driver -#ifeq ($(CONFIG_MTK_FM_CHIP), MT6620_FM) - -ifeq ($(findstring MT6620_FM,$(CONFIG_MTK_FM_CHIP)),MT6620_FM) -$(warning MT6620_FM) - FM_CHIP := mt6620 - FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) - ccflags-y += -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/../connectivity/combo/common/include \ - -I$(src)/../connectivity/combo/common/linux/include \ - -I$(src)/../connectivity/common_detect - - obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o - mt6620-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_rds_parser.o \ - core/fm_patch.o \ - core/fm_utils.o \ - core/fm_link.o \ - core/fm_eint.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_cmd.o \ - $(FM_CHIP_PATH)_fm_config.o - mtk_fm_drv-objs += $(mt6620-objs) -$(warning $(mtk_fm_drv-objs)) - #obj-$(CONFIG_MTK_FM) += private/ -endif -#$(foreach each_chip, $(CONFIG_MTK_FM_CHIP),$(eval $(call build_speical_fm_driver,$(each_chip)))) -#endef - -# MT6627 FM driver - -ifeq ($(findstring MT6627_FM,$(CONFIG_MTK_FM_CHIP)),MT6627_FM) -$(warning MT6627_FM) - FM_CHIP := mt6627 - FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) - ccflags-y += -DMT6627_FM - ccflags-y += -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/../connectivity/conn_soc/common/include \ - -I$(src)/../connectivity/conn_soc/common/linux/include \ - -I$(src)/../connectivity/common_detect - - obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o - mt6627-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_rds_parser.o \ - core/fm_patch.o \ - core/fm_utils.o \ - core/fm_link.o \ - core/fm_eint.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_cmd.o \ - $(FM_CHIP_PATH)_fm_config.o - mtk_fm_drv-objs += $(mt6627-objs) -$(warning $(mtk_fm_drv-objs)) - #obj-$(CONFIG_MTK_FM) += private/ -endif - -# MT6625 FM driver - -ifeq ($(findstring MT6625_FM,$(CONFIG_MTK_FM_CHIP)),MT6625_FM) -$(warning MT6627_FM) - FM_CHIP := mt6627 - FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) - ccflags-y += -DMT6627_FM - ccflags-y += -DMT6625_FM - ccflags-y += -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/../connectivity/conn_soc/common/include \ - -I$(src)/../connectivity/conn_soc/common/linux/include \ - -I$(src)/../connectivity/common_detect - - obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o - mt6627-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_rds_parser.o \ - core/fm_patch.o \ - core/fm_utils.o \ - core/fm_link.o \ - core/fm_eint.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_cmd.o \ - $(FM_CHIP_PATH)_fm_config.o - mtk_fm_drv-objs += $(mt6627-objs) -$(warning $(mtk_fm_drv-objs)) - #obj-$(CONFIG_MTK_FM) += private/ -endif - -# MT6580 FM driver - -ifeq ($(findstring MT6580_FM,$(CONFIG_MTK_FM_CHIP)),MT6580_FM) -$(warning MT6580_FM) - FM_CHIP := mt6580 - FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) - ccflags-y += -DMT6580_FM - ccflags-y += -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/../connectivity/conn_soc/common/include \ - -I$(src)/../connectivity/conn_soc/common/linux/include \ - -I$(src)/../connectivity/common_detect - - obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o - mt6580-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_rds_parser.o \ - core/fm_patch.o \ - core/fm_utils.o \ - core/fm_link.o \ - core/fm_eint.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_cmd.o \ - $(FM_CHIP_PATH)_fm_config.o - mtk_fm_drv-objs += $(mt6580-objs) -$(warning $(mtk_fm_drv-objs)) - #obj-$(CONFIG_MTK_FM) += private/ -endif - -# MT6630 FM driver -ifeq ($(findstring MT6630_FM,$(CONFIG_MTK_FM_CHIP)),MT6630_FM) -$(warning MT6630_FM) - FM_CHIP := mt6630 - FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) - ccflags-y += -DMT6630_FM - ccflags-y += -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/../connectivity/combo/common/include \ - -I$(src)/../connectivity/combo/common/linux/include \ - -I$(src)/../connectivity/common_detect - - obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o - mt6630-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_rds_parser.o \ - core/fm_patch.o \ - core/fm_utils.o \ - core/fm_link.o \ - core/fm_eint.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_cmd.o \ - $(FM_CHIP_PATH)_fm_config.o - mtk_fm_drv-objs += $(mt6630-objs) -$(warning $(mtk_fm_drv-objs)) - #obj-$(CONFIG_MTK_FM) += private/ -endif - -# MT6626 FM driver -ifeq ($(CONFIG_MTK_FM_CHIP), mt6626) -FM_CHIP := mt6626 -FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) -ccflags-y := -I$(src)/inc \ - -I$(src)/$(FM_CHIP)/inc \ - -I$(src)/cust/$(FM_CHIP) \ - -I$(src)/private/inc - -obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o -mtk_fm_drv-objs := core/fm_module.o \ - core/fm_main.o \ - core/fm_config.o \ - core/fm_patch.o \ - core/fm_rds_parser.o \ - core/fm_utils.o \ - core/fm_link.o \ - $(FM_CHIP_PATH)_fm_lib.o \ - $(FM_CHIP_PATH)_fm_rds.o \ - $(FM_CHIP_PATH)_fm_link.o \ - $(FM_CHIP_PATH)_fm_eint.o -endif - -#for include WMT header -subdir-ccflags-y += -DWMT_PLAT_ALPS=1 - -endif - -obj-y += dummy.o - diff --git a/drivers/misc/mediatek/fmradio/core/fm_config.c b/drivers/misc/mediatek/fmradio/core/fm_config.c deleted file mode 100644 index 4372eb303..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_config.c +++ /dev/null @@ -1,606 +0,0 @@ -/* fm_config.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/string.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_config.h" -#if (!defined(MT6628_FM) && !defined(MT6620_FM) && !defined(MT6627_FM) && !defined(MT6580_FM) && !defined(MT6630_FM)) -#include "fm_cust_cfg.h" -#endif -static fm_cust_cfg fm_config; -static fm_s32 fm_index; - -#if 0 -static fm_s32 to_upper(fm_s8 *str) -{ - fm_s32 i = 0; - - for (i = 0; i < (int)strlen(str); i++) { - if (('a' <= str[i]) && (str[i] <= 'z')) { - str[i] = str[i] - ('a' - 'A'); - } - } - - return 0; -} -#endif - -fm_s32 to_upper_n(fm_s8 *str, fm_s32 len) -{ - fm_s32 i = 0; - - for (i = 0; i < len; i++) { - if (('a' <= str[i]) && (str[i] <= 'z')) { - str[i] = str[i] - ('a' - 'A'); - } - } - - return 0; -} - -fm_s32 check_hex_str(fm_s8 *str, fm_s32 len) -{ - fm_s32 i = 0; - - for (i = 0; i < len; i++) { - if ((('a' <= str[i]) && (str[i] <= 'z')) || (('A' <= str[i]) && (str[i] <= 'Z')) - || (('0' <= str[i]) && (str[i] <= '9'))) { - ; - } else { - return -1; - } - } - - return 0; -} - -fm_s32 check_dec_str(fm_s8 *str, fm_s32 len) -{ - fm_s32 i = 0; - - for (i = 0; i < len; i++) { - if (('0' <= str[i]) && (str[i] <= '9')) { - ; - } else { - return -1; - } - } - - return 0; -} - -fm_s32 ascii_to_hex(fm_s8 *in_ascii, fm_u16 *out_hex) -{ - fm_s32 len = (fm_s32) strlen(in_ascii); - int i = 0; - fm_u16 tmp; - - len = (len > 4) ? 4 : len; - - if (check_hex_str(in_ascii, len)) { - return -1; - } - - to_upper_n(in_ascii, len); - *out_hex = 0; - - for (i = 0; i < len; i++) { - if (in_ascii[len - i - 1] < 'A') { - tmp = in_ascii[len - i - 1]; - *out_hex |= ((tmp - '0') << (4 * i)); - } else { - tmp = in_ascii[len - i - 1]; - *out_hex |= ((tmp - 'A' + 10) << (4 * i)); - } - } - - return 0; -} - -fm_s32 ascii_to_dec(fm_s8 *in_ascii, fm_s32 *out_dec) -{ - fm_s32 len = (fm_s32) strlen(in_ascii); - int i = 0; - int flag; - int multi = 1; - - len = (len > 10) ? 10 : len; - - if (in_ascii[0] == '-') { - flag = -1; - in_ascii += 1; - len -= 1; - } else { - flag = 1; - } - - if (check_dec_str(in_ascii, len)) { - return -1; - } - - *out_dec = 0; - multi = 1; - - for (i = 0; i < len; i++) { - *out_dec += ((in_ascii[len - i - 1] - '0') * multi); - multi *= 10; - } - - *out_dec *= flag; - return 0; -} - -fm_s32 trim_string(fm_s8 **start) -{ - fm_s8 *end = *start; - - /* Advance to non-space character */ - while (*(*start) == ' ') { - (*start)++; - } - - /* Move to end of string */ - while (*end != '\0') { - (end)++; - } - - /* Backup to non-space character */ - do { - end--; - } while ((end >= *start) && (*end == ' ')); - - /* Terminate string after last non-space character */ - *(++end) = '\0'; - return (end - *start); -} - -fm_s32 trim_path(fm_s8 **start) -{ - fm_s8 *end = *start; - - while (*(*start) == ' ') { - (*start)++; - } - - while (*end != '\0') { - (end)++; - } - - do { - end--; - } while ((end >= *start) && ((*end == ' ') || (*end == '\n') || (*end == '\r'))); - - *(++end) = '\0'; - return (end - *start); -} - -fm_s32 cfg_parser(fm_s8 *buffer, CFG_HANDLER handler, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - fm_s8 *p = buffer; - fm_s8 *group_start = NULL; - fm_s8 *key_start = NULL; - fm_s8 *value_start = NULL; - - enum fm_cfg_parser_state state = FM_CFG_STAT_NONE; - - FMR_ASSERT(p); - - for (p = buffer; *p != '\0'; p++) { - switch (state) { - case FM_CFG_STAT_NONE:{ - if (*p == '[') { - /* if we get char '[' in none state, it means a new group name start */ - state = FM_CFG_STAT_GROUP; - group_start = p + 1; - } else if (*p == COMMENT_CHAR) { - /* if we get char '#' in none state, it means a new comment start */ - state = FM_CFG_STAT_COMMENT; - } else if (!isspace(*p) && (*p != '\n') && (*p != '\r')) { - /* if we get an nonspace char in none state, it means a new key start */ - state = FM_CFG_STAT_KEY; - key_start = p; - } - - break; - } - case FM_CFG_STAT_GROUP:{ - if (*p == ']') { - /* if we get char ']' in group state, it means a group name complete */ - *p = '\0'; - /* FIX_ME */ - /* record group name */ - state = FM_CFG_STAT_NONE; - trim_string(&group_start); - /* WCN_DBG(FM_NTC|MAIN, "g=%s\n", group_start); */ - } - - break; - } - case FM_CFG_STAT_COMMENT:{ - if (*p == '\n') { - /* if we get char '\n' in comment state, it means new line start */ - state = FM_CFG_STAT_NONE; - group_start = p + 1; - } - - break; - } - case FM_CFG_STAT_KEY:{ - if (*p == DELIMIT_CHAR) { - /* if we get char '=' in key state, it means a key name complete */ - *p = '\0'; - /* FIX_ME */ - /* record key name */ - state = FM_CFG_STAT_VALUE; - value_start = p + 1; - trim_string(&key_start); - /* WCN_DBG(FM_NTC|MAIN, "k=%s\n", key_start); */ - } - - break; - } - case FM_CFG_STAT_VALUE:{ - if (*p == '\n' || *p == '\r') { - /* if we get char '\n' or '\r' in value state, it means a value complete */ - *p = '\0'; - /* record value */ - trim_string(&value_start); - /* WCN_DBG(FM_NTC|MAIN, "v=%s\n", value_start); */ - - if (handler) { - ret = - handler(group_start, key_start, value_start, - cfg); - } - - state = FM_CFG_STAT_NONE; - } - - break; - } - default: - break; - } - } - - return ret; -} - -fm_s32 cfg_item_match(fm_s8 *src_key, fm_s8 *src_val, fm_s8 *dst_key, fm_s32 *dst_val) -{ - fm_s32 ret = 0; - fm_u16 tmp_hex; - fm_s32 tmp_dec; - - /* WCN_DBG(FM_NTC|MAIN,"src_key=%s,src_val=%s\n", src_key,src_val); */ - /* WCN_DBG(FM_NTC|MAIN,"dst_key=%s\n", dst_key); */ - if (strcmp(src_key, dst_key) == 0) { - if (strncmp(src_val, "0x", strlen("0x")) == 0) { - src_val += strlen("0x"); - /* WCN_DBG(FM_NTC|MAIN,"%s\n", src_val); */ - ret = ascii_to_hex(src_val, &tmp_hex); - - if (!ret) { - *dst_val = tmp_hex; - /* WCN_DBG(FM_NTC|MAIN, "%s 0x%04x\n", dst_key, tmp_hex); */ - return 0; - } else { - /* WCN_DBG(FM_ERR | MAIN, "%s format error\n", dst_key); */ - return 1; - } - } else { - ret = ascii_to_dec(src_val, &tmp_dec); - - if (!ret /*&& ((0 <= tmp_dec) && (tmp_dec <= 0xFFFF)) */) { - *dst_val = tmp_dec; - /* WCN_DBG(FM_NTC|MAIN, "%s %d\n", dst_key, tmp_dec); */ - return 0; - } else { - /* WCN_DBG(FM_ERR | MAIN, "%s format error\n", dst_key); */ - return 1; - } - } - } - /* else */ - /* { */ - /* WCN_DBG(FM_ERR | MAIN, "src_key!=dst_key\n"); */ - /* } */ - - return -1; -} - -static fm_s32 cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg; - struct fm_tx_cust_cfg *tx_cfg = &cfg->tx_cfg; - - if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_L", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */ - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FMR_RSSI_TH_S", &rx_cfg->short_ana_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_CQI_TH", &rx_cfg->cqi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_MR_TH", &rx_cfg->mr_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SMG_TH", &rx_cfg->smg_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_CH_SIZE", &rx_cfg->scan_ch_size))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_SORT", &rx_cfg->scan_sort))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SEEK_SPACE", &rx_cfg->seek_space))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND", &rx_cfg->band))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_L", &rx_cfg->band_freq_l))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_H", &rx_cfg->band_freq_h))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH", &rx_cfg->fake_ch[fm_index]))) { - fm_index += 1; - rx_cfg->fake_ch_num = - (rx_cfg->fake_ch_num < fm_index) ? fm_index : rx_cfg->fake_ch_num; - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FMR_FAKE_CH_RSSI", &rx_cfg->fake_ch_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_DEEMPHASIS", &rx_cfg->deemphasis))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_OSC_FREQ", &rx_cfg->osc_freq))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMT_SCAN_HOLE_L", &tx_cfg->scan_hole_low))) { - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FMT_SCAN_HOLE_H", &tx_cfg->scan_hole_high))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMT_PWR_LVL_MAX", &tx_cfg->power_level))) { - return ret; - } else { - WCN_DBG(FM_WAR | MAIN, "invalid key\n"); - return -1; - } -} - -static fm_s32 fm_cust_config_default(fm_cust_cfg *cfg) -{ - FMR_ASSERT(cfg); -#if (!defined(MT6628_FM) && !defined(MT6620_FM) && !defined(MT6627_FM) && !defined(MT6580_FM) && !defined(MT6630_FM)) - - cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG; - cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT; - cfg->rx_cfg.cqi_th = FM_RX_CQI_TH; - cfg->rx_cfg.mr_th = FM_RX_MR_TH; - cfg->rx_cfg.smg_th = FM_RX_SMG_TH; - cfg->rx_cfg.scan_ch_size = FM_RX_SCAN_CH_SIZE; - cfg->rx_cfg.seek_space = FM_RX_SEEK_SPACE; - cfg->rx_cfg.band = FM_RX_BAND; - cfg->rx_cfg.band_freq_l = FM_RX_BAND_FREQ_L; - cfg->rx_cfg.band_freq_h = FM_RX_BAND_FREQ_H; - cfg->rx_cfg.scan_sort = FM_RX_SCAN_SORT_SELECT; - cfg->rx_cfg.fake_ch_num = FM_RX_FAKE_CH_NUM; - cfg->rx_cfg.fake_ch_rssi_th = FM_RX_FAKE_CH_RSSI; - cfg->rx_cfg.fake_ch[0] = FM_RX_FAKE_CH_1; - cfg->rx_cfg.fake_ch[1] = FM_RX_FAKE_CH_2; - cfg->rx_cfg.fake_ch[2] = FM_RX_FAKE_CH_3; - cfg->rx_cfg.fake_ch[3] = FM_RX_FAKE_CH_4; - cfg->rx_cfg.fake_ch[4] = FM_RX_FAKE_CH_5; - cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS; - - cfg->tx_cfg.scan_hole_low = FM_TX_SCAN_HOLE_LOW; - cfg->tx_cfg.scan_hole_high = FM_TX_SCAN_HOLE_HIGH; - cfg->tx_cfg.power_level = FM_TX_PWR_LEVEL_MAX; -#endif - return 0; -} - -static fm_s32 fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - fm_s8 *buf = NULL; - fm_s32 file_len = 0; - - if (!(buf = fm_zalloc(4096))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n"); - return -ENOMEM; - } - - fm_index = 0; - - file_len = fm_file_read(filename, buf, 4096, 0); - - if (file_len <= 0) { - ret = -1; - goto out; - } - - ret = cfg_parser(buf, cfg_item_handler, cfg); - - out: - - if (buf) { - fm_free(buf); - } - - return ret; -} - -static fm_s32 fm_cust_config_print(fm_cust_cfg *cfg) -{ - fm_s32 i; - - WCN_DBG(FM_NTC | MAIN, "rssi_l:\t0x%04x\n", cfg->rx_cfg.long_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "rssi_s:\t0x%04x\n", cfg->rx_cfg.short_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "mr_th:\t0x%04x\n", cfg->rx_cfg.mr_th); - WCN_DBG(FM_NTC | MAIN, "cqi_th:\t0x%04x\n", cfg->rx_cfg.cqi_th); - WCN_DBG(FM_NTC | MAIN, "smg_th:\t0x%04x\n", cfg->rx_cfg.smg_th); - WCN_DBG(FM_NTC | MAIN, "scan_ch_size:\t%d\n", cfg->rx_cfg.scan_ch_size); - WCN_DBG(FM_NTC | MAIN, "seek_space:\t%d\n", cfg->rx_cfg.seek_space); - WCN_DBG(FM_NTC | MAIN, "band:\t%d\n", cfg->rx_cfg.band); - WCN_DBG(FM_NTC | MAIN, "band_freq_l:\t%d\n", cfg->rx_cfg.band_freq_l); - WCN_DBG(FM_NTC | MAIN, "band_freq_h:\t%d\n", cfg->rx_cfg.band_freq_h); - WCN_DBG(FM_NTC | MAIN, "scan_sort:\t%d\n", cfg->rx_cfg.scan_sort); - WCN_DBG(FM_NTC | MAIN, "fake_ch_num:\t%d\n", cfg->rx_cfg.fake_ch_num); - WCN_DBG(FM_NTC | MAIN, "fake_ch_rssi_th:\t%d\n", cfg->rx_cfg.fake_ch_rssi_th); - - for (i = 0; i < cfg->rx_cfg.fake_ch_num; i++) { - WCN_DBG(FM_NTC | MAIN, "fake_ch:\t%d\n", cfg->rx_cfg.fake_ch[i]); - } - - WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis); - WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq); - WCN_DBG(FM_NTC | MAIN, "scan_hole_low:\t%d\n", cfg->tx_cfg.scan_hole_low); - WCN_DBG(FM_NTC | MAIN, "scan_hole_high:\t%d\n", cfg->tx_cfg.scan_hole_high); - WCN_DBG(FM_NTC | MAIN, "power_level:\t%d\n", cfg->tx_cfg.power_level); - - return 0; -} - -fm_s32 fm_cust_config(const fm_s8 *filepath) -{ - fm_s32 ret = 0; - fm_s8 *filep = NULL; - fm_s8 file_path[51] = { 0 }; - - fm_cust_config_default(&fm_config); - WCN_DBG(FM_NTC | MAIN, "FM default config\n"); - fm_cust_config_print(&fm_config); - - if (!filepath) { - filep = FM_CUST_CFG_PATH; - } else { - memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath)); - filep = file_path; - trim_path(&filep); - } - - ret = fm_cust_config_file(filep, &fm_config); - WCN_DBG(FM_NTC | MAIN, "FM cust config\n"); - fm_cust_config_print(&fm_config); - return ret; -} - -fm_u16 fm_cust_config_fetch(enum fm_cust_cfg_op op_code) -{ - fm_u16 tmp = 0; - fm_s32 i; - static fm_s32 fake_ch_idx; - - switch (op_code) { - /* For FM RX */ - case FM_CFG_RX_RSSI_TH_LONG:{ - tmp = fm_config.rx_cfg.long_ana_rssi_th; - break; - } - case FM_CFG_RX_RSSI_TH_SHORT:{ - tmp = fm_config.rx_cfg.short_ana_rssi_th; - break; - } - case FM_CFG_RX_CQI_TH:{ - tmp = fm_config.rx_cfg.cqi_th; - break; - } - case FM_CFG_RX_MR_TH:{ - tmp = fm_config.rx_cfg.mr_th; - break; - } - case FM_CFG_RX_SMG_TH:{ - tmp = fm_config.rx_cfg.smg_th; - break; - } - case FM_CFG_RX_SCAN_CH_SIZE:{ - tmp = fm_config.rx_cfg.scan_ch_size; - break; - } - case FM_CFG_RX_SEEK_SPACE:{ - tmp = fm_config.rx_cfg.seek_space; - break; - } - case FM_CFG_RX_BAND:{ - tmp = fm_config.rx_cfg.band; - break; - } - case FM_CFG_RX_BAND_FREQ_L:{ - tmp = fm_config.rx_cfg.band_freq_l; - break; - } - case FM_CFG_RX_BAND_FREQ_H:{ - tmp = fm_config.rx_cfg.band_freq_h; - break; - } - case FM_CFG_RX_SCAN_SORT:{ - tmp = fm_config.rx_cfg.scan_sort; - break; - } - case FM_CFG_RX_FAKE_CH_NUM:{ - tmp = fm_config.rx_cfg.fake_ch_num; - break; - } - case FM_CFG_RX_FAKE_CH:{ - tmp = fm_config.rx_cfg.fake_ch[fake_ch_idx]; - i = (fm_config.rx_cfg.fake_ch_num > - 0) ? fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX; - fake_ch_idx++; - fake_ch_idx = fake_ch_idx % i; - break; - } - case FM_CFG_RX_FAKE_CH_RSSI:{ - tmp = fm_config.rx_cfg.fake_ch_rssi_th; - break; - } - case FM_CFG_RX_DEEMPHASIS:{ - tmp = fm_config.rx_cfg.deemphasis; - break; - } - case FM_CFG_RX_OSC_FREQ:{ - tmp = fm_config.rx_cfg.osc_freq; - break; - } - /* For FM TX */ - case FM_CFG_TX_SCAN_HOLE_LOW:{ - tmp = fm_config.tx_cfg.scan_hole_low; - break; - } - case FM_CFG_TX_SCAN_HOLE_HIGH:{ - tmp = fm_config.tx_cfg.scan_hole_high; - break; - } - case FM_CFG_TX_PWR_LEVEL:{ - tmp = fm_config.tx_cfg.power_level; - break; - } - default: - break; - } - - WCN_DBG(FM_DBG | MAIN, "cust cfg %d: 0x%04x\n", op_code, tmp); - return tmp; -} diff --git a/drivers/misc/mediatek/fmradio/core/fm_eint.c b/drivers/misc/mediatek/fmradio/core/fm_eint.c deleted file mode 100644 index 19dbbe64b..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_eint.c +++ /dev/null @@ -1,56 +0,0 @@ -/* mt6620_fm_eint.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Run <Run.Liu@MediaTek.com> - * - * WCN combo chip FM Radio Driver -- EINT functions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM)) -#include "osal_typedef.h" -#include "stp_exp.h" -#include "wmt_exp.h" - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_eint.h" - -fm_s32 fm_enable_eint(void) -{ - return 0; -} - -fm_s32 fm_disable_eint(void) -{ - return 0; -} - -fm_s32 fm_request_eint(void (*parser) (void)) -{ - WCN_DBG(FM_NTC | EINT, "%s\n", __func__); - - mtk_wcn_stp_register_event_cb(FM_TASK_INDX, parser); - - return 0; -} - -fm_s32 fm_eint_pin_cfg(fm_s32 mode) -{ - return 0; -} -#endif diff --git a/drivers/misc/mediatek/fmradio/core/fm_link.c b/drivers/misc/mediatek/fmradio/core/fm_link.c deleted file mode 100644 index b7dde404e..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_link.c +++ /dev/null @@ -1,601 +0,0 @@ -/* fm_link.c - * - * (C) Copyright 2012 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver -- setup data link common part - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/slab.h> -#include <linux/interrupt.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_link.h" -#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM)) -#include "osal_typedef.h" -#include "stp_exp.h" -#include "wmt_exp.h" -static struct fm_link_event *link_event; - -static struct fm_trace_fifo_t *cmd_fifo; - -static struct fm_trace_fifo_t *evt_fifo; - -static fm_s32(*reset) (fm_s32 sta); - -static void WCNfm_wholechip_rst_cb(ENUM_WMTDRV_TYPE_T src, - ENUM_WMTDRV_TYPE_T dst, - ENUM_WMTMSG_TYPE_T type, void *buf, unsigned int sz) -{ - /* To handle reset procedure please */ - ENUM_WMTRSTMSG_TYPE_T rst_msg; - - if (sz <= sizeof(ENUM_WMTRSTMSG_TYPE_T)) { - memcpy((char *)&rst_msg, (char *)buf, sz); - WCN_DBG(FM_WAR | LINK, - "[src=%d], [dst=%d], [type=%d], [buf=0x%x], [sz=%d], [max=%d]\n", src, dst, - type, rst_msg, sz, WMTRSTMSG_RESET_MAX); - - if ((src == WMTDRV_TYPE_WMT) && (dst == WMTDRV_TYPE_FM) - && (type == WMTMSG_TYPE_RESET)) { - if (rst_msg == WMTRSTMSG_RESET_START) { - WCN_DBG(FM_WAR | LINK, "FM restart start!\n"); - if (reset) { - reset(1); - } - - } else if (rst_msg == WMTRSTMSG_RESET_END) { - WCN_DBG(FM_WAR | LINK, "FM restart end!\n"); - if (reset) { - reset(0); - } - } - } - } else { - /*message format invalid */ - WCN_DBG(FM_WAR | LINK, "message format invalid!\n"); - } -} - - -fm_s32 fm_link_setup(void *data) -{ - fm_s32 ret = 0; - - if (!(link_event = fm_zalloc(sizeof(struct fm_link_event)))) { - WCN_DBG(FM_ALT | LINK, "fm_zalloc(fm_link_event) -ENOMEM\n"); - return -1; - } - - link_event->ln_event = fm_flag_event_create("ln_evt"); - - if (!link_event->ln_event) { - WCN_DBG(FM_ALT | LINK, "create mt6620_ln_event failed\n"); - fm_free(link_event); - return -1; - } - - fm_flag_event_get(link_event->ln_event); - - - WCN_DBG(FM_NTC | LINK, "fm link setup\n"); - - cmd_fifo = fm_trace_fifo_create("cmd_fifo"); - if (!cmd_fifo) { - WCN_DBG(FM_ALT | LINK, "create cmd_fifo failed\n"); - ret = -1; - goto failed; - } - - evt_fifo = fm_trace_fifo_create("evt_fifo"); - if (!evt_fifo) { - WCN_DBG(FM_ALT | LINK, "create evt_fifo failed\n"); - ret = -1; - goto failed; - } - - reset = data; /* get whole chip reset cb */ - mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_FM, WCNfm_wholechip_rst_cb); - return 0; - - failed: - fm_trace_fifo_release(evt_fifo); - fm_trace_fifo_release(cmd_fifo); - fm_flag_event_put(link_event->ln_event); - if (link_event) { - fm_free(link_event); - } - - return ret; -} - -fm_s32 fm_link_release(void) -{ - - fm_trace_fifo_release(evt_fifo); - fm_trace_fifo_release(cmd_fifo); - fm_flag_event_put(link_event->ln_event); - if (link_event) { - fm_free(link_event); - } - - WCN_DBG(FM_NTC | LINK, "fm link release\n"); - return 0; -} - -/* - * fm_ctrl_rx - * the low level func to read a rigister - * @addr - rigister address - * @val - the pointer of target buf - * If success, return 0; else error code - */ -fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val) -{ - return 0; -} - -/* - * fm_ctrl_tx - * the low level func to write a rigister - * @addr - rigister address - * @val - value will be writed in the rigister - * If success, return 0; else error code - */ -fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val) -{ - return 0; -} - -/* - * fm_cmd_tx() - send cmd to FM firmware and wait event - * @buf - send buffer - * @len - the length of cmd - * @mask - the event flag mask - * @ cnt - the retry conter - * @timeout - timeout per cmd - * Return 0, if success; error code, if failed - */ -fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, - fm_s32(*callback) (struct fm_res_ctx *result)) -{ - fm_s32 ret_time = 0; - struct task_struct *task = current; - struct fm_trace_t trace; - - if ((NULL == buf) || (len < 0) || (0 == mask) - || (cnt > SW_RETRY_CNT_MAX) || (timeout > SW_WAIT_TIMEOUT_MAX)) { - WCN_DBG(FM_ERR | LINK, "cmd tx, invalid para\n"); - return -FM_EPARA; - } - - FM_EVENT_CLR(link_event->ln_event, mask); - -#ifdef FM_TRACE_ENABLE - trace.type = buf[0]; - trace.opcode = buf[1]; - trace.len = len - 4; - trace.tid = (fm_s32) task->pid; - fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE); - fm_memcpy(trace.pkt, &buf[4], - (trace.len > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : trace.len); -#endif - - sw_retry: - -#ifdef FM_TRACE_ENABLE - if (fm_true == FM_TRACE_FULL(cmd_fifo)) { - FM_TRACE_OUT(cmd_fifo, NULL); - } - FM_TRACE_IN(cmd_fifo, &trace); -#endif - - /* send cmd to FM firmware */ - if ((ret_time = mtk_wcn_stp_send_data(buf, len, FM_TASK_INDX)) <= 0) { - WCN_DBG(FM_EMG | LINK, "send data over stp failed[%d]\n", ret_time); - return -FM_ELINK; - } - /* wait the response form FM firmware */ - ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, mask, timeout); - - if (!ret_time) { - if (0 < cnt--) { - WCN_DBG(FM_WAR | LINK, "wait even timeout, [retry_cnt=%d], pid=%d\n", cnt, - task->pid); - fm_print_cmd_fifo(); - fm_print_evt_fifo(); - return -FM_EFW; - goto sw_retry; /* retry if timeout and retry cnt > 0 */ - } else { - WCN_DBG(FM_ALT | LINK, "fatal error, SW retry failed, reset HW\n"); - return -FM_EFW; - } - } - - FM_EVENT_CLR(link_event->ln_event, mask); - - if (callback) { - callback(&link_event->result); - } - - return 0; -} - -fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32)) -{ - fm_s32 len; - fm_s32 i = 0; - fm_u8 opcode = 0; - fm_u16 length = 0; - fm_u8 ch; - fm_u8 rx_buf[RX_BUF_SIZE + 10] = { 0 }; /* the 10 bytes are protect gaps */ - static volatile fm_task_parser_state state = FM_TASK_RX_PARSER_PKT_TYPE; - struct fm_trace_t trace; - struct task_struct *task = current; - - len = mtk_wcn_stp_receive_data(rx_buf, RX_BUF_SIZE, FM_TASK_INDX); - WCN_DBG(FM_DBG | LINK, "[len=%d],[CMD=0x%02x 0x%02x 0x%02x 0x%02x]\n", len, rx_buf[0], - rx_buf[1], rx_buf[2], rx_buf[3]); - - while (i < len) { - ch = rx_buf[i]; - - switch (state) { - case FM_TASK_RX_PARSER_PKT_TYPE: - - if (ch == FM_TASK_EVENT_PKT_TYPE) { - if ((i + 5) < RX_BUF_SIZE) { - WCN_DBG(FM_DBG | LINK, - "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", - rx_buf[i], rx_buf[i + 1], rx_buf[i + 2], - rx_buf[i + 3], rx_buf[i + 4], rx_buf[i + 5]); - } else { - WCN_DBG(FM_DBG | LINK, "0x%02x 0x%02x\n", rx_buf[i], - rx_buf[i + 1]); - } - - state = FM_TASK_RX_PARSER_OPCODE; - } else { - WCN_DBG(FM_ALT | LINK, - "event pkt type error (rx_buf[%d] = 0x%02x)\n", i, ch); - } - - i++; - break; - - case FM_TASK_RX_PARSER_OPCODE: - i++; - opcode = ch; - state = FM_TASK_RX_PARSER_PKT_LEN_1; - break; - - case FM_TASK_RX_PARSER_PKT_LEN_1: - i++; - length = ch; - state = FM_TASK_RX_PARSER_PKT_LEN_2; - break; - - case FM_TASK_RX_PARSER_PKT_LEN_2: - i++; - length |= (fm_u16) (ch << 0x8); - -#ifdef FM_TRACE_ENABLE - trace.type = FM_TASK_EVENT_PKT_TYPE; - trace.opcode = opcode; - trace.len = length; - trace.tid = (fm_s32) task->pid; - fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE); - fm_memcpy(trace.pkt, &rx_buf[i], - (length > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : length); - - if (fm_true == FM_TRACE_FULL(cmd_fifo)) { - FM_TRACE_OUT(cmd_fifo, NULL); - } - FM_TRACE_IN(cmd_fifo, &trace); -#endif - if (length > 0) { - state = FM_TASK_RX_PARSER_PKT_PAYLOAD; - } else if (opcode == CSPI_WRITE_OPCODE) { - state = FM_TASK_RX_PARSER_PKT_TYPE; - FM_EVENT_SEND(link_event->ln_event, FLAG_CSPI_WRITE); - } else { - state = FM_TASK_RX_PARSER_PKT_TYPE; - FM_EVENT_SEND(link_event->ln_event, (1 << opcode)); - } - - break; - - case FM_TASK_RX_PARSER_PKT_PAYLOAD: - - switch (opcode) { - case FM_TUNE_OPCODE: - - if ((length == 1) && (rx_buf[i] == 1)) { - FM_EVENT_SEND(link_event->ln_event, FLAG_TUNE_DONE); - } - - break; - - case FM_SOFT_MUTE_TUNE_OPCODE: - - if (length >= 2) { - fm_memcpy(link_event->result.cqi, &rx_buf[i], - (length > - FM_CQI_BUF_SIZE) ? FM_CQI_BUF_SIZE : length); - FM_EVENT_SEND(link_event->ln_event, FLAG_SM_TUNE); - } - break; - - case FM_SEEK_OPCODE: - - if ((i + 1) < RX_BUF_SIZE) { - link_event->result.seek_result = rx_buf[i] + (rx_buf[i + 1] << 8); /* 8760 means 87.60Mhz */ - } - - FM_EVENT_SEND(link_event->ln_event, FLAG_SEEK_DONE); - break; - - case FM_SCAN_OPCODE: - - /* check if the result data is long enough */ - if ((RX_BUF_SIZE - i) < (sizeof(fm_u16) * FM_SCANTBL_SIZE)) { - WCN_DBG(FM_ALT | LINK, - "FM_SCAN_OPCODE err, [tblsize=%d],[bufsize=%d]\n", - (unsigned int)(sizeof(fm_u16) * FM_SCANTBL_SIZE), - (unsigned int)(RX_BUF_SIZE - i)); - FM_EVENT_SEND(link_event->ln_event, FLAG_SCAN_DONE); - return 0; - } else if ((length >= FM_CQI_BUF_SIZE) - && ((RX_BUF_SIZE - i) >= FM_CQI_BUF_SIZE)) { - fm_memcpy(link_event->result.cqi, &rx_buf[i], - FM_CQI_BUF_SIZE); - FM_EVENT_SEND(link_event->ln_event, FLAG_CQI_DONE); - } else { - fm_memcpy(link_event->result.scan_result, &rx_buf[i], - sizeof(fm_u16) * FM_SCANTBL_SIZE); - FM_EVENT_SEND(link_event->ln_event, FLAG_SCAN_DONE); - } - - break; - - case FSPI_READ_OPCODE: - - if ((i + 1) < RX_BUF_SIZE) { - link_event->result.fspi_rd = - (rx_buf[i] + (rx_buf[i + 1] << 8)); - } - - FM_EVENT_SEND(link_event->ln_event, (1 << opcode)); - break; - case CSPI_READ_OPCODE: - { - if ((i + 1) < RX_BUF_SIZE) { - link_event->result.cspi_rd = - (rx_buf[i] + (rx_buf[i + 1] << 8) + - (rx_buf[i + 2] << 16) + (rx_buf[i + 3] << 24)); - } - - FM_EVENT_SEND(link_event->ln_event, FLAG_CSPI_READ); - break; - } - case FM_HOST_READ_OPCODE: - { - if ((i + 1) < RX_BUF_SIZE) { - link_event->result.cspi_rd = - (rx_buf[i] + (rx_buf[i + 1] << 8) + - (rx_buf[i + 2] << 16) + (rx_buf[i + 3] << 24)); - } - - FM_EVENT_SEND(link_event->ln_event, (1 << opcode)); - break; - } - - case RDS_RX_DATA_OPCODE: - - /* check if the rds data is long enough */ - if ((RX_BUF_SIZE - i) < length) { - WCN_DBG(FM_ALT | LINK, - "RDS RX err, [rxlen=%d],[bufsize=%d]\n", - (fm_s32) length, (RX_BUF_SIZE - i)); - FM_EVENT_SEND(link_event->ln_event, (1 << opcode)); - break; - } - /* copy rds data to rds buf */ - fm_memcpy(&link_event->result.rds_rx_result, &rx_buf[i], length); - - /*Handle the RDS data that we get */ - if (rds_parser) { - rds_parser(&link_event->result.rds_rx_result, length); - } else { - WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n"); - } - - FM_EVENT_SEND(link_event->ln_event, (1 << opcode)); - break; - - default: - FM_EVENT_SEND(link_event->ln_event, (1 << opcode)); - break; - } - - state = FM_TASK_RX_PARSER_PKT_TYPE; - i += length; - break; - - default: - break; - } - } - - return 0; -} - -fm_bool fm_wait_stc_done(fm_u32 sec) -{ - return fm_true; -} - -fm_s32 fm_force_active_event(fm_u32 mask) -{ - fm_u32 flag; - - flag = FM_EVENT_GET(link_event->ln_event); - WCN_DBG(FM_WAR | LINK, "before force active event, [flag=0x%08x]\n", flag); - flag = FM_EVENT_SEND(link_event->ln_event, mask); - WCN_DBG(FM_WAR | LINK, "after force active event, [flag=0x%08x]\n", flag); - - return 0; -} - - -extern fm_s32 fm_print_cmd_fifo(void) -{ -#ifdef FM_TRACE_ENABLE - struct fm_trace_t trace; - fm_s32 i = 0; - - while (fm_false == FM_TRACE_EMPTY(cmd_fifo)) { - fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE); - FM_TRACE_OUT(cmd_fifo, &trace); - WCN_DBG(FM_ALT | LINK, "trace, type %d, op %d, len %d, tid %d, time %d\n", - trace.type, trace.opcode, trace.len, trace.tid, - jiffies_to_msecs(abs(trace.time))); - i = 0; - while ((trace.len > 0) && (i < trace.len) && (i < (FM_TRACE_PKT_SIZE - 8))) { - WCN_DBG(FM_ALT | LINK, "trace, %02x %02x %02x %02x %02x %02x %02x %02x\n", - trace.pkt[i], trace.pkt[i + 1], trace.pkt[i + 2], trace.pkt[i + 3], - trace.pkt[i + 4], trace.pkt[i + 5], trace.pkt[i + 6], - trace.pkt[i + 7]); - i += 8; - } - WCN_DBG(FM_ALT | LINK, "trace\n"); - } -#endif - - return 0; -} - -extern fm_s32 fm_print_evt_fifo(void) -{ -#ifdef FM_TRACE_ENABLE - struct fm_trace_t trace; - fm_s32 i = 0; - - while (fm_false == FM_TRACE_EMPTY(evt_fifo)) { - fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE); - FM_TRACE_OUT(evt_fifo, &trace); - WCN_DBG(FM_ALT | LINK, "%s: op %d, len %d, %d\n", evt_fifo->name, trace.opcode, - trace.len, jiffies_to_msecs(abs(trace.time))); - i = 0; - while ((trace.len > 0) && (i < trace.len) && (i < (FM_TRACE_PKT_SIZE - 8))) { - WCN_DBG(FM_ALT | LINK, "%s: %02x %02x %02x %02x %02x %02x %02x %02x\n", - evt_fifo->name, trace.pkt[i], trace.pkt[i + 1], trace.pkt[i + 2], - trace.pkt[i + 3], trace.pkt[i + 4], trace.pkt[i + 5], - trace.pkt[i + 6], trace.pkt[i + 7]); - i += 8; - } - WCN_DBG(FM_ALT | LINK, "%s\n", evt_fifo->name); - } -#endif - - return 0; -} -#endif - -fm_s32 fm_trace_in(struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra) -{ - FMR_ASSERT(new_tra); - - if (thiz->len < thiz->size) { - fm_memcpy(&(thiz->trace[thiz->in]), new_tra, sizeof(struct fm_trace_t)); - thiz->trace[thiz->in].time = jiffies; - thiz->in = (thiz->in + 1) % thiz->size; - thiz->len++; - /* WCN_DBG(FM_DBG | RDSC, "add a new tra[len=%d]\n", thiz->len); */ - } else { - WCN_DBG(FM_WAR | RDSC, "tra buf is full\n"); - return -FM_ENOMEM; - } - - return 0; -} - -fm_s32 fm_trace_out(struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra) -{ - if (thiz->len > 0) { - if (dst_tra) { - fm_memcpy(dst_tra, &(thiz->trace[thiz->out]), sizeof(struct fm_trace_t)); - fm_memset(&(thiz->trace[thiz->out]), 0, sizeof(struct fm_trace_t)); - } - thiz->out = (thiz->out + 1) % thiz->size; - thiz->len--; - /* WCN_DBG(FM_DBG | RDSC, "del a tra[len=%d]\n", thiz->len); */ - } else { - WCN_DBG(FM_WAR | RDSC, "tra buf is empty\n"); - } - - return 0; -} - -fm_bool fm_trace_is_full(struct fm_trace_fifo_t *thiz) -{ - return (thiz->len == thiz->size) ? fm_true : fm_false; -} - -fm_bool fm_trace_is_empty(struct fm_trace_fifo_t *thiz) -{ - return (thiz->len == 0) ? fm_true : fm_false; -} - - -struct fm_trace_fifo_t *fm_trace_fifo_create(const fm_s8 *name) -{ - struct fm_trace_fifo_t *tmp; - - if (!(tmp = fm_zalloc(sizeof(struct fm_trace_fifo_t)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_trace_fifo) -ENOMEM\n"); - return NULL; - } - - fm_memcpy(tmp->name, name, (strlen(name)+1)); - tmp->size = FM_TRACE_FIFO_SIZE; - tmp->in = 0; - tmp->out = 0; - tmp->len = 0; - tmp->trace_in = fm_trace_in; - tmp->trace_out = fm_trace_out; - tmp->is_full = fm_trace_is_full; - tmp->is_empty = fm_trace_is_empty; - - WCN_DBG(FM_NTC | LINK, "%s created\n", tmp->name); - - return tmp; -} - - -fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo) -{ - if (fifo) { - WCN_DBG(FM_NTC | LINK, "%s released\n", fifo->name); - fm_free(fifo); - } - - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/core/fm_main.c b/drivers/misc/mediatek/fmradio/core/fm_main.c deleted file mode 100644 index 11233c06c..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_main.c +++ /dev/null @@ -1,3272 +0,0 @@ -/* fm_main.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver -- main functions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/kernel.h> -#include <asm/uaccess.h> -#include <linux/slab.h> -#include <mach/mtk_wcn_cmb_stub.h> - -#include "fm_main.h" -#include "fm_config.h" -#include "fm_err.h" -/* #include "fm_cust_cfg.h" */ -#include "osal_typedef.h" -#include "wmt_exp.h" -/* fm main data structure */ -static struct fm *g_fm_struct = NULL; -/* we must get low level interface first, when add a new chip, the main effort is this interface */ -static struct fm_lowlevel_ops fm_low_ops; -#ifdef MT6620_FM -static struct fm_lowlevel_ops MT6620fm_low_ops; -#endif -#ifdef MT6628_FM -static struct fm_lowlevel_ops MT6628fm_low_ops; -#endif -#ifdef MT6627_FM -static struct fm_lowlevel_ops MT6627fm_low_ops; -#endif -#ifdef MT6580_FM -static struct fm_lowlevel_ops MT6580fm_low_ops; -#endif -#ifdef MT6630_FM -static struct fm_lowlevel_ops MT6630fm_low_ops; -#endif -/* MTK FM Radio private advanced features */ -#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */ -static struct fm_priv priv_adv; -#endif -/* mutex for char device ops */ -static struct fm_lock *fm_ops_lock; -/* mutex for RDS parsing and read result */ -static struct fm_lock *fm_read_lock; -/* for get rds block counter */ -static struct fm_lock *fm_rds_cnt; -/* mutex for fm timer, RDS reset */ -static struct fm_lock *fm_timer_lock; -static struct fm_lock *fm_rxtx_lock; /* protect FM RX TX mode switch */ -static struct fm_lock *fm_rtc_mutex; /* protect FM GPS RTC drift info */ - -static struct fm_timer *fm_timer_sys; - -static fm_bool scan_stop_flag = fm_false; -static struct fm_gps_rtc_info gps_rtc_info; -volatile static bool g_fm_stat[3] = { - fm_false, //RX power - fm_false, //TX power - fm_false, //TX scan -}; - -/* RDS reset related functions */ -static fm_u16 fm_cur_freq_get(void); -static fm_s32 fm_cur_freq_set(fm_u16 new_freq); -static enum fm_op_state fm_op_state_get(struct fm *fmp); -static enum fm_op_state fm_op_state_set(struct fm *fmp, enum fm_op_state sta); -static void fm_timer_func(unsigned long data); -#ifdef MT6620_FM -static void fmtx_timer_func(unsigned long data); -#endif -static void fm_enable_rds_BlerCheck(struct fm *fm); -static void fm_disable_rds_BlerCheck(void); -static void fm_rds_reset_work_func(unsigned long data); -/* when interrupt be triggered by FM chip, fm_eint_handler will first be executed */ -/* then fm_eint_handler will schedule fm_eint_work_func to run */ -static void fm_eint_handler(void); -static void fm_eint_work_func(unsigned long data); -static fm_s32 fm_rds_parser(struct rds_rx_t *rds_raw, fm_s32 rds_size); -static fm_s32 fm_callback_register(struct fm_lowlevel_ops *ops); -static fm_s32 fm_callback_unregister(struct fm_lowlevel_ops *ops); - -static fm_s32 pwrdown_flow(struct fm *fm); - -static fm_u16 fm_cur_freq_get(void) -{ - return g_fm_struct ? g_fm_struct->cur_freq : 0; -} - -static fm_s32 fm_cur_freq_set(fm_u16 new_freq) -{ - if (g_fm_struct) - g_fm_struct->cur_freq = new_freq; - - return 0; -} - -static enum fm_op_state fm_op_state_get(struct fm *fmp) -{ - if (fmp) { - WCN_DBG(FM_DBG | MAIN, "op state get %d\n", fmp->op_sta); - return fmp->op_sta; - } else { - WCN_DBG(FM_ERR | MAIN, "op state get para error\n"); - return FM_STA_UNKOWN; - } -} - -static enum fm_op_state fm_op_state_set(struct fm *fmp, enum fm_op_state sta) -{ - if (fmp && (sta < FM_STA_MAX)) { - fmp->op_sta = sta; - WCN_DBG(FM_DBG | MAIN, "op state set to %d\n", sta); - return fmp->op_sta; - } else { - WCN_DBG(FM_ERR | MAIN, "op state set para error, %d\n", sta); - return FM_STA_UNKOWN; - } -} - -enum fm_pwr_state fm_pwr_state_get(struct fm *fmp) -{ - if (fmp) { - WCN_DBG(FM_DBG | MAIN, "pwr state get %d\n", fmp->pwr_sta); - return fmp->pwr_sta; - } else { - WCN_DBG(FM_ERR | MAIN, "pwr state get para error\n"); - return FM_PWR_MAX; - } -} - -enum fm_pwr_state fm_pwr_state_set(struct fm *fmp, enum fm_pwr_state sta) -{ - if (fmp && (sta < FM_PWR_MAX)) { - fmp->pwr_sta = sta; - WCN_DBG(FM_NTC | MAIN, "pwr state set to %d\n", sta); - return fmp->pwr_sta; - } else { - WCN_DBG(FM_ERR | MAIN, "pwr state set para error, %d\n", sta); - return FM_PWR_MAX; - } -} - -fm_s32 fm_set_stat(struct fm *fmp, int which, bool stat) -{ - fm_s32 ret = 0; - FMR_ASSERT(fmp); - - if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); - - if(which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0]))) - { - g_fm_stat[which] = stat; - WCN_DBG(FM_DBG | MAIN, "fm set stat object=%d, stat=%d\n", which, stat); - } - else - { - ret = -1; - WCN_DBG(FM_ERR | MAIN, "fm set stat error, object=%d, stat=%d\n", which, stat); - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_get_stat(struct fm *fmp, int which, bool *stat) -{ - fm_s32 ret = 0; - FMR_ASSERT(fmp); - FMR_ASSERT(stat); - if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); - - if(which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0]))) - { - *stat = g_fm_stat[which]; - WCN_DBG(FM_DBG | MAIN, "fm get stat object=%d, stat=%d\n", which, *stat); - } - else - { - ret = -1; - WCN_DBG(FM_ERR | MAIN, "fm get stat error, object=%d\n", which); - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -static volatile fm_s32 subsys_rst_state = FM_SUBSYS_RST_OFF; - -fm_s32 fm_sys_state_get(struct fm *fmp) -{ - return subsys_rst_state; -} - -fm_s32 fm_sys_state_set(struct fm *fmp, fm_s32 sta) -{ - if ((sta >= FM_SUBSYS_RST_OFF) && (sta < FM_SUBSYS_RST_MAX)) { - WCN_DBG(FM_NTC | MAIN, "sys state set from %d to %d\n", subsys_rst_state, sta); - subsys_rst_state = sta; - } else { - WCN_DBG(FM_ERR | MAIN, "sys state set para error, %d\n", sta); - } - - return subsys_rst_state; -} - - -fm_s32 fm_subsys_reset(struct fm *fm) -{ - /* check if we are resetting */ - if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) { - WCN_DBG(FM_NTC | MAIN, "subsys reset is ongoing\n"); - goto out; - } - - FMR_ASSERT(fm); - fm->timer_wkthd->add_work(fm->timer_wkthd, fm->rst_wk); - - out: - return 0; -} - - -fm_s32 fm_wholechip_rst_cb(fm_s32 sta) -{ - struct fm *fm = g_fm_struct; - - if (!fm) - return 0; - - if (sta == 1) { - if (fm_sys_state_get(fm) == FM_SUBSYS_RST_OFF) { - fm_sys_state_set(fm, FM_SUBSYS_RST_START); - } - } else { - fm->timer_wkthd->add_work(fm->timer_wkthd, fm->rst_wk); - } - return 0; -} - -fm_s32 fm_open(struct fm *fmp) -{ - fm_s32 ret = 0; - fm_s32 chipid; - FMR_ASSERT(fmp); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - /* makesure fmp->ref >= 0 */ - /* fmp->ref = (fmp->ref < 0) ? 0 : fmp->ref; */ - /* fmp->ref++; */ - - /* if ((fmp->ref > 0) && (fmp->chipon == fm_false)) */ - if (fmp->chipon == fm_false) { - chipid = mtk_wcn_wmt_chipid_query(); - WCN_DBG(FM_NTC | MAIN, "wmt chip id=0x%x\n", chipid); - if (chipid == 0x6628) /* get WCN chip ID */ - { -#ifdef MT6628_FM - fm_low_ops = MT6628fm_low_ops; - fmp->chip_id = 0x6628; - WCN_DBG(FM_NTC | MAIN, "get 6628 low ops\n"); -#endif - } else if (chipid == 0x6620) { -#ifdef MT6620_FM - fm_low_ops = MT6620fm_low_ops; - fmp->chip_id = 0x6620; - WCN_DBG(FM_NTC | MAIN, "get 6620 low ops\n"); -#endif - } else if ((chipid == 0x6572) || (chipid == 0x6582) || (chipid == 0x6592) \ - || (chipid == 0x8127) || (chipid == 0x6571) || (chipid == 0x6752) \ - || (chipid == 0x0321) || (chipid == 0x0335) || (chipid == 0x0337) \ - || (chipid == 0x6735) || (chipid == 0x8163)) { -#ifdef MT6627_FM - fm_low_ops = MT6627fm_low_ops; - fmp->chip_id = 0x6627; - WCN_DBG(FM_NTC | MAIN, "get 6627 low ops\n"); -#endif - } else if (chipid == 0x6580) { -#ifdef MT6580_FM - fm_low_ops = MT6580fm_low_ops; - fmp->chip_id = 0x6580; - WCN_DBG(FM_NTC | MAIN, "get 6580 low ops\n"); -#endif - } else if (chipid == 0x6630) { -#ifdef MT6630_FM - fm_low_ops = MT6630fm_low_ops; - fmp->chip_id = 0x6630; - WCN_DBG(FM_NTC | MAIN, "get 6630 low ops\n"); -#endif - } - -/* - if(fm_low_ops.bi.pwron == NULL) - { - WCN_DBG(FM_NTC | MAIN, "get fm_low_ops fail\n"); - fmp->ref--; - ret = -ENODEV; - goto out; - } - - ret = fm_low_ops.bi.pwron(0); - if (ret) { - fmp->ref--; - ret = -ENODEV; - goto out; - } - - - fmp->chipon = fm_true; -*/ - fm_eint_pin_cfg(FM_EINT_PIN_EINT_MODE); - fm_request_eint(fm_eint_handler); - } -/* out: */ - /* WCN_DBG(FM_NTC | MAIN, "fm->ref:%d\n", fmp->ref); */ - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_close(struct fm *fmp) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fmp); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - -/* - fmp->ref--; - if (fmp->ref == 0) { - pwrdown_flow(fmp); - if (fmp->chipon == fm_true) { - fm_eint_pin_cfg(FM_EINT_PIN_GPIO_MODE); - fm_low_ops.bi.pwroff(0); - fmp->chipon = fm_false; - } - } - - //makesure fm->ref >= 0 - fmp->ref = (fmp->ref < 0) ? 0 : fmp->ref; - WCN_DBG(FM_NTC | MAIN, "fmp->ref:%d\n", fmp->ref); -*/ - - fm_eint_pin_cfg(FM_EINT_PIN_GPIO_MODE); - - FM_UNLOCK(fm_ops_lock); - - return ret; -} - -/* -fm_s32 fm_flush(struct fm *fmp) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fmp); - if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); - - if (FM_PWR_OFF == fm_pwr_state_get(fmp)) - { - WCN_DBG(FM_NTC | MAIN, "should power off combo!\n"); - if (fmp->chipon == fm_true) - { - fm_low_ops.bi.pwroff(0); - fmp->chipon = fm_false; - } - } - WCN_DBG(FM_NTC | MAIN, "fm_flush done\n"); - FM_UNLOCK(fm_ops_lock); - - return ret; -} -*/ -fm_s32 fm_rds_read(struct fm *fmp, fm_s8 *dst, fm_s32 len) -{ - fm_s32 copy_len = 0, left = 0; - copy_len = sizeof(rds_t); - - if (FM_EVENT_GET(fmp->rds_event) == FM_RDS_DATA_READY) { - if (FM_LOCK(fm_read_lock)) - return (-FM_ELOCK); - - if ((left = copy_to_user((void *)dst, fmp->pstRDSData, (unsigned long)copy_len))) { - WCN_DBG(FM_ALT | MAIN, "fm_read copy failed\n"); - } else { - fmp->pstRDSData->event_status = 0x0000; - } - - WCN_DBG(FM_DBG | MAIN, "fm_read copy len:%d\n", (copy_len - left)); - - FM_EVENT_RESET(fmp->rds_event); - FM_UNLOCK(fm_read_lock); - } else { - /*if (FM_EVENT_WAIT(fmp->rds_event, FM_RDS_DATA_READY) == 0) { - WCN_DBG(FM_DBG | MAIN, "fm_read wait ok\n"); - goto RESTART; - } else { - WCN_DBG(FM_ALT | MAIN, "fm_read wait err\n"); - return 0; - } *//*event wait caused AP stop RDS thread and re-read RDS, which caused issue ALPS00595367 */ - - WCN_DBG(FM_DBG | MAIN, "fm_read no event now\n"); - return 0; - } - - return (copy_len - left); -} - -fm_s32 fm_powerup(struct fm *fm, struct fm_tune_parm *parm) -{ - fm_s32 ret = 0; - fm_u8 tmp_vol; - - FMR_ASSERT(fm_low_ops.bi.pwron); - FMR_ASSERT(fm_low_ops.bi.pwrupseq); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - /* for normal case */ - if (fm_low_ops.bi.pwron == NULL) { - WCN_DBG(FM_NTC | MAIN, "get fm_low_ops fail\n"); - ret = -ENODEV; - goto out; - } - - if (fm->chipon == fm_false) { - ret = fm_low_ops.bi.pwron(0); - if (ret) { - ret = -ENODEV; - goto out; - } - fm->chipon = fm_true; - } - - if (FM_PWR_RX_ON == fm_pwr_state_get(fm)) { - WCN_DBG(FM_NTC | MAIN, "already pwron!\n"); - goto out; - } else if (FM_PWR_TX_ON == fm_pwr_state_get(fm)) { - /* if Tx is on, we need pwr down TX first */ - WCN_DBG(FM_NTC | MAIN, "power down TX first!\n"); - - ret = fm_powerdowntx(fm); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "FM pwr down Tx fail!\n"); - return ret; - } - } - - fm_pwr_state_set(fm, FM_PWR_RX_ON); - - /* execute power on sequence */ - ret = fm_low_ops.bi.pwrupseq(&fm->chip_id, &fm->device_id); - if (ret) { - goto out; - } - - fm_enable_eint(); - - WCN_DBG(FM_DBG | MAIN, "pwron ok\n"); - fm_cur_freq_set(parm->freq); - - parm->err = FM_SUCCESS; - if (fm_low_ops.bi.low_pwr_wa) { - fm_low_ops.bi.low_pwr_wa(1); - } - - fm_low_ops.bi.volget(&tmp_vol); - WCN_DBG(FM_NTC | MAIN, "vol=%d!!!\n", tmp_vol); - - /* fm_low_ops.bi.volset(0); */ - fm->vol = 15; - if (fm_low_ops.ri.rds_bci_get) { - fm_timer_sys->init(fm_timer_sys, fm_timer_func, (unsigned long)g_fm_struct, - fm_low_ops.ri.rds_bci_get(), 0); - fm_timer_sys->start(fm_timer_sys); - WCN_DBG(FM_NTC | MAIN, "start timer ok\n"); - } else { - WCN_DBG(FM_NTC | MAIN, "start timer fail!!!\n"); - } - - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/* - * fm_powerup_tx - */ -fm_s32 fm_powerup_tx(struct fm *fm, struct fm_tune_parm *parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.pwron); - FMR_ASSERT(fm_low_ops.bi.pwrupseq_tx); - - if (FM_PWR_TX_ON == fm_pwr_state_get(fm)) { - WCN_DBG(FM_NTC | MAIN, "already pwron!\n"); - parm->err = FM_BADSTATUS; - goto out; - } else if (FM_PWR_RX_ON == fm_pwr_state_get(fm)) { - /* if Rx is on, we need pwr down first */ - ret = fm_powerdown(fm, 0); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "FM pwr down Rx fail!\n"); - goto out; - } - } - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - /* for normal case */ - if (fm->chipon == fm_false) { - fm_low_ops.bi.pwron(0); - fm->chipon = fm_true; - } - - fm_pwr_state_set(fm, FM_PWR_TX_ON); - ret = fm_low_ops.bi.pwrupseq_tx(); - - if (ret) { - parm->err = FM_FAILED; - fm_pwr_state_set(fm, FM_PWR_OFF); - WCN_DBG(FM_ERR | MAIN,"FM pwr up Tx fail!\n"); - } else { - parm->err = FM_SUCCESS; - } - fm_cur_freq_set(parm->freq); -#ifdef MT6620_FM - /* if(fm_low_ops.ri.rds_bci_get) */ - { - fm_timer_sys->count = 0; - fm_timer_sys->tx_pwr_ctrl_en = FM_TX_PWR_CTRL_ENABLE; - fm_timer_sys->tx_rtc_ctrl_en = FM_TX_RTC_CTRL_ENABLE; - fm_timer_sys->tx_desense_en = FM_TX_DESENSE_ENABLE; - - fm_timer_sys->init(fm_timer_sys, fmtx_timer_func, (unsigned long)g_fm_struct, - FM_TIMER_TIMEOUT_MIN, 0); - fm_timer_sys->start(fm_timer_sys); - WCN_DBG(FM_NTC | MAIN, "start timer ok\n"); - } -#endif - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - -static fm_s32 pwrdown_flow(struct fm *fm) -{ - fm_s32 ret = 0; - FMR_ASSERT(fm_low_ops.ri.rds_onoff); - FMR_ASSERT(fm_low_ops.bi.pwrdownseq); - - if (FM_PWR_OFF == fm_pwr_state_get(fm)) { - WCN_DBG(FM_NTC | MAIN, "FMSYS already pwroff!\n"); - goto out; - } - - if (FM_PWR_RX_ON == fm_pwr_state_get(fm)) { - /* Disable all interrupt */ - fm_disable_rds_BlerCheck(); - fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_false); - fm_disable_eint(); - - fm_pwr_state_set(fm, FM_PWR_OFF); - - /* execute power down sequence */ - ret = fm_low_ops.bi.pwrdownseq(); - - if (fm_low_ops.bi.low_pwr_wa) { - fm_low_ops.bi.low_pwr_wa(0); - } - - WCN_DBG(FM_ALT | MAIN, "pwrdown_flow exit\n"); - } - out: - return ret; -} - -fm_s32 fm_powerdown(struct fm *fm, int type) -{ - fm_s32 ret = 0; - if (1 == type) /* 0: RX 1: TX */ - { - ret = fm_powerdowntx(fm); - } else { - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - if (FM_LOCK(fm_rxtx_lock)) - return (-FM_ELOCK); - - ret = pwrdown_flow(fm); - - FM_UNLOCK(fm_rxtx_lock); - FM_UNLOCK(fm_ops_lock); - } - - if ((FM_PWR_OFF == fm_pwr_state_get(fm)) && (fm->chipon == fm_true)) { - fm_low_ops.bi.pwroff(0); - fm->chipon = fm_false; - } - - return ret; -} - -fm_s32 fm_powerdowntx(struct fm *fm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.pwrdownseq_tx); - /* if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); */ - if (FM_LOCK(fm_rxtx_lock)) - return (-FM_ELOCK); - - if (FM_PWR_TX_ON == fm_pwr_state_get(fm)) { -#ifdef MT6620_FM - if (FM_LOCK(fm_timer_lock)) - return (-FM_ELOCK); - fm_timer_sys->stop(fm_timer_sys); - FM_UNLOCK(fm_timer_lock); - fm_timer_sys->count = 0; - fm_timer_sys->tx_pwr_ctrl_en = FM_TX_PWR_CTRL_DISABLE; - fm_timer_sys->tx_rtc_ctrl_en = FM_TX_RTC_CTRL_DISABLE; - fm_timer_sys->tx_desense_en = FM_TX_DESENSE_DISABLE; -#endif - /* fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_false); */ - /* execute power down sequence */ - ret = fm_low_ops.bi.pwrdownseq_tx(); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "pwrdown tx fail\n"); - } - - fm_pwr_state_set(fm, FM_PWR_OFF); - WCN_DBG(FM_NTC | MAIN, "pwrdown tx ok\n"); - } - - FM_UNLOCK(fm_rxtx_lock); - /* FM_UNLOCK(fm_ops_lock); */ - return ret; -} - -fm_s32 fm_seek(struct fm *fm, struct fm_seek_parm *parm) -{ - fm_s32 ret = 0; - fm_u16 seekdir, space; - - FMR_ASSERT(fm_low_ops.bi.seek); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - parm->err = FM_BADSTATUS; - ret = -EPERM; - goto out; - } - - if (parm->space == FM_SPACE_100K) { - space = 0x0002; - } else if (parm->space == FM_SPACE_50K) { - space = 0x0001; - } else if (parm->space == FM_SPACE_200K) { - space = 0x0004; - } else { - /* default */ - space = 0x0002; - } - -#ifdef MTK_FM_50KHZ_SUPPORT - if (parm->band == FM_BAND_UE) { - fm->min_freq = FM_UE_FREQ_MIN; - fm->max_freq = FM_UE_FREQ_MAX; - } else if (parm->band == FM_BAND_JAPANW) { - fm->min_freq = FM_JP_FREQ_MIN; - fm->max_freq = FM_JP_FREQ_MAX; - } else if (parm->band == FM_BAND_SPECIAL) { - fm->min_freq = FM_RX_BAND_FREQ_L; - fm->max_freq = FM_RX_BAND_FREQ_H; - } -#else - if (parm->band == FM_BAND_UE) { - fm->min_freq = FM_UE_FREQ_MIN * 10; - fm->max_freq = FM_UE_FREQ_MAX * 10; - } else if (parm->band == FM_BAND_JAPANW) { - fm->min_freq = FM_JP_FREQ_MIN * 10; - fm->max_freq = FM_JP_FREQ_MAX * 10; - } else if (parm->band == FM_BAND_SPECIAL) { - fm->min_freq = FM_RX_BAND_FREQ_L * 10; - fm->max_freq = FM_RX_BAND_FREQ_H * 10; - } -#endif - else { - WCN_DBG(FM_ALT | MAIN, "band:%d out of range\n", parm->band); - parm->err = FM_EPARM; - ret = -EPERM; - goto out; - } - - if (parm->freq < fm->min_freq || parm->freq > fm->max_freq) { - WCN_DBG(FM_ALT | MAIN, "freq:%d out of range\n", parm->freq); - parm->err = FM_EPARM; - ret = -EPERM; - goto out; - } - - if (parm->seekdir == FM_SEEK_UP) { - seekdir = FM_SEEK_UP; - } else { - seekdir = FM_SEEK_DOWN; - } - - fm_op_state_set(fm, FM_STA_SEEK); - - /* seek successfully */ - if (fm_true == - fm_low_ops.bi.seek(fm->min_freq, fm->max_freq, &(parm->freq), seekdir, space)) { - parm->err = FM_SUCCESS; - } else { - parm->err = FM_SEEK_FAILED; - ret = -EPERM; - } - - if ((parm->space != FM_SPACE_50K) && (1 == fm_get_channel_space(parm->freq))) { - parm->freq /= 10; /* (8750 / 10) = 875 */ - } - - fm_op_state_set(fm, FM_STA_PLAY); - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/*********************************************************** -Function: fm_tx_scan() - -Description: get the valid channels for fm tx function - -Para: fm--->fm driver global info - parm--->input/output paramater - -Return: 0, if success; error code, if failed -***********************************************************/ -fm_s32 fm_tx_scan(struct fm *fm, struct fm_tx_scan_parm *parm) -{ - fm_s32 ret = 0; - fm_u16 scandir = 0; - fm_u16 space = FM_SPACE_100K; - - FMR_ASSERT(fm_low_ops.bi.tx_scan); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm->chipon != fm_true) { - parm->err = FM_BADSTATUS; - ret = -EPERM; - WCN_DBG(FM_ERR | MAIN, "tx scan chip not on\n"); - goto out; - } - switch (parm->scandir) { - case FM_TX_SCAN_UP: - scandir = 0; - break; - case FM_TX_SCAN_DOWN: - scandir = 1; - break; - default: - scandir = 0; - break; - } - - /*if (parm->space == FM_SPACE_100K) { - space = 2; - } else if (parm->space == FM_SPACE_50K) { - space = 1; - } else if (parm->space == FM_SPACE_200K) { - space = 4; - } else { - //default - space = 2; - } */ -#ifdef MTK_FM_50KHZ_SUPPORT - if (parm->band == FM_BAND_UE) { - fm->min_freq = FM_UE_FREQ_MIN * 10; - fm->max_freq = FM_UE_FREQ_MAX * 10; - } else if (parm->band == FM_BAND_JAPANW) { - fm->min_freq = FM_JP_FREQ_MIN * 10; - fm->max_freq = FM_JP_FREQ_MAX * 10; - } else if (parm->band == FM_BAND_SPECIAL) { - fm->min_freq = FM_FREQ_MIN * 10; - fm->max_freq = FM_FREQ_MAX * 10; - } -#else - if (parm->band == FM_BAND_UE) { - fm->min_freq = FM_UE_FREQ_MIN; - fm->max_freq = FM_UE_FREQ_MAX; - } else if (parm->band == FM_BAND_JAPANW) { - fm->min_freq = FM_JP_FREQ_MIN; - fm->max_freq = FM_JP_FREQ_MAX; - } else if (parm->band == FM_BAND_SPECIAL) { - fm->min_freq = FM_FREQ_MIN; - fm->max_freq = FM_FREQ_MAX; - } -#endif - else { - WCN_DBG(FM_ERR | MAIN, "band:%d out of range\n", parm->band); - parm->err = FM_EPARM; - ret = -EPERM; - goto out; - } - - if (unlikely((parm->freq < fm->min_freq) || (parm->freq > fm->max_freq))) { - parm->err = FM_EPARM; - ret = -EPERM; - goto out; - } - - if (unlikely(parm->ScanTBLSize < TX_SCAN_MIN || parm->ScanTBLSize > TX_SCAN_MAX)) { - parm->err = FM_EPARM; - ret = -EPERM; - goto out; - } - - ret = fm_low_ops.bi.anaswitch(FM_ANA_SHORT); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "switch to short ana failed\n"); - goto out; - } - /* do tx scan */ - if (!(ret = fm_low_ops.bi.tx_scan(fm->min_freq, fm->max_freq, &(parm->freq), - parm->ScanTBL, &(parm->ScanTBLSize), scandir, space))) { - parm->err = FM_SUCCESS; - } else { - WCN_DBG(FM_ERR | MAIN, "fm_tx_scan failed\n"); - parm->err = FM_SCAN_FAILED; - } - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_scan(struct fm *fm, struct fm_scan_parm *parm) -{ - fm_s32 ret = 0; - fm_u16 scandir = FM_SEEK_UP, space; - - FMR_ASSERT(fm_low_ops.bi.scan); - WCN_DBG(FM_NTC | MAIN, "fm_scan:start\n"); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - parm->err = FM_BADSTATUS; - ret = -EPERM; - goto out; - } - - if (parm->space == FM_SPACE_100K) { - space = 0x0002; - } else if (parm->space == FM_SPACE_50K) { - space = 0x0001; - } else if (parm->space == FM_SPACE_200K) { - space = 0x0004; - } else { - /* default */ - space = 0x0002; - } - -#ifdef MTK_FM_50KHZ_SUPPORT - if (parm->band == FM_BAND_UE) { - fm->min_freq = FM_UE_FREQ_MIN * 10; - fm->max_freq = FM_UE_FREQ_MAX * 10; - } else if (parm->band == FM_BAND_JAPANW) { - fm->min_freq = FM_JP_FREQ_MIN * 10; - fm->max_freq = FM_JP_FREQ_MAX * 10; - } else if (parm->band == FM_BAND_SPECIAL) { - fm->min_freq = FM_FREQ_MIN * 10; - fm->max_freq = FM_FREQ_MAX * 10; - } -#else - if (parm->band == FM_BAND_UE) { - fm->min_freq = FM_UE_FREQ_MIN; - fm->max_freq = FM_UE_FREQ_MAX; - } else if (parm->band == FM_BAND_JAPANW) { - fm->min_freq = FM_JP_FREQ_MIN; - fm->max_freq = FM_JP_FREQ_MAX; - } else if (parm->band == FM_BAND_SPECIAL) { - fm->min_freq = FM_RX_BAND_FREQ_L; - fm->max_freq = FM_RX_BAND_FREQ_H; - } -#endif - else { - WCN_DBG(FM_ALT | MAIN, "band:%d out of range\n", parm->band); - parm->err = FM_EPARM; - ret = -EPERM; - goto out; - } - - fm_op_state_set(fm, FM_STA_SCAN); - scan_stop_flag = fm_false; - - if (fm_true == - fm_low_ops.bi.scan(fm->min_freq, fm->max_freq, &(parm->freq), parm->ScanTBL, - &(parm->ScanTBLSize), scandir, space)) { - parm->err = FM_SUCCESS; - } else { - WCN_DBG(FM_ALT | MAIN, "fm_scan failed\n"); - parm->err = FM_SEEK_FAILED; - ret = -EPERM; - } - - fm_op_state_set(fm, FM_STA_STOP); - - out: - FM_UNLOCK(fm_ops_lock); - WCN_DBG(FM_NTC | MAIN, "fm_scan:done\n"); - return ret; -} - - -#define SCAN_SEG_LEN 250 -static struct fm_cqi cqi_buf[SCAN_SEG_LEN]; - -fm_s32 fm_scan_new(struct fm *fm, struct fm_scan_t *parm) -{ - fm_s32 ret = 0; - fm_s32 tmp; - fm_s32 cnt, seg; - fm_s32 i, j; - fm_s32 start_freq, end_freq; - fm_u16 scan_tbl[FM_SCANTBL_SIZE]; /* need no less than the chip */ - fm_u16 tbl_size = FM_SCANTBL_SIZE; - fm_u16 tmp_freq = 0; - fm_s32 chl_cnt; - fm_s32 ch_offset, step, tmp_val; - fm_u16 space_idx = 0x0002; - - fm_s32 cqi_cnt, cqi_idx; - fm_s8 *buf = (fm_s8 *) cqi_buf; - - FMR_ASSERT(fm_low_ops.bi.scan); - FMR_ASSERT(fm_low_ops.bi.cqi_get); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - /* caculate channel number, get segment count */ - cnt = (parm->upper - parm->lower) / parm->space + 1; /* Eg, (10800 - 8750) / 5 = 411 */ - seg = (cnt / SCAN_SEG_LEN) + ((cnt % SCAN_SEG_LEN) ? 1 : 0); /* Eg, (411 / 200) + ((411 % 200) ? 1 : 0) = 2 + 1 = 3 */ - - WCN_DBG(FM_NTC | MAIN, "total ch %d, seg %d\n", cnt, seg); - - /* alloc memory */ - tmp = cnt * sizeof(struct fm_ch_rssi *); - if (parm->sr_size < tmp) { - if (parm->sr.ch_rssi_buf) { - fm_free(parm->sr.ch_rssi_buf); - parm->sr.ch_rssi_buf = NULL; - } - parm->sr_size = tmp; - } - - if (!parm->sr.ch_rssi_buf) { - parm->sr.ch_rssi_buf = (struct fm_ch_rssi *)fm_zalloc(parm->sr_size); - if (!parm->sr.ch_rssi_buf) { - WCN_DBG(FM_ERR | MAIN, "scan alloc mem failed\n"); - parm->sr_size = 0; - return -2; - } - } - - if (parm->space == 5) { - space_idx = 0x0001; /* 50Khz */ - } else if (parm->space == 10) { - space_idx = 0x0002; /* 100Khz */ - } else if (parm->space == 20) { - space_idx = 0x0004; /* 200Khz */ - } - - - fm_op_state_set(fm, FM_STA_SCAN); - - /* do scan */ - chl_cnt = 0; - for (i = 0; (i < seg) && (fm_false == scan_stop_flag); i++) { - cqi_cnt = 0; - cqi_idx = 0; - - start_freq = parm->lower + SCAN_SEG_LEN * parm->space * i; - end_freq = parm->lower + SCAN_SEG_LEN * parm->space * (i + 1) - parm->space; - end_freq = (end_freq > parm->upper) ? parm->upper : end_freq; - - WCN_DBG(FM_NTC | MAIN, "seg %d, start %d, end %d\n", i, start_freq, end_freq); - if (fm_false == - fm_low_ops.bi.scan(start_freq, end_freq, &tmp_freq, scan_tbl, &tbl_size, - FM_SEEK_UP, space_idx)) { - ret = -1; - goto out; - } - /* get channel count */ - for (ch_offset = 0; ch_offset < FM_SCANTBL_SIZE; ch_offset++) { - if (scan_tbl[ch_offset] == 0) - continue; - for (step = 0; step < 16; step++) { - if (scan_tbl[ch_offset] & (1 << step)) { - tmp_val = - start_freq + (ch_offset * 16 + step) * parm->space; - if (tmp_val <= end_freq) { - /* record valid result channel */ - WCN_DBG(FM_NTC | MAIN, "freq %d\n", tmp_val); - parm->sr.ch_rssi_buf[chl_cnt].freq = tmp_val; - chl_cnt++; - cqi_cnt++; - } - } - } - } - - /* get cqi */ - if (fm_low_ops.bi.cqi_get) { - tmp = cqi_cnt; - while ((cqi_cnt > 0) && (fm_false == scan_stop_flag)) { - ret = - fm_low_ops.bi.cqi_get(buf + - (16 * sizeof(struct fm_cqi) * cqi_idx), - sizeof(cqi_buf) - - (16 * sizeof(struct fm_cqi) * cqi_idx)); - if (ret) { - goto out; - } - - cqi_cnt -= 16; - cqi_idx++; - } - cqi_cnt = tmp; - - /* fill cqi to result buffer */ - for (j = 0; j < cqi_cnt; j++) { - tmp = chl_cnt - cqi_cnt + j; /* target pos */ - parm->sr.ch_rssi_buf[tmp].freq = (fm_u16) cqi_buf[j].ch; - parm->sr.ch_rssi_buf[tmp].rssi = cqi_buf[j].rssi; - WCN_DBG(FM_NTC | MAIN, "idx %d, freq %d, rssi %d\n", tmp, - parm->sr.ch_rssi_buf[tmp].freq, - parm->sr.ch_rssi_buf[tmp].rssi); - } - } - /* 6620 won't get rssi in scan new */ - /* else if(fm_low_ops.bi.rssiget) */ - } - - fm_op_state_set(fm, FM_STA_STOP); - - out: - scan_stop_flag = fm_false; - FM_UNLOCK(fm_ops_lock); - parm->num = chl_cnt; - return ret; -} - - -fm_s32 fm_seek_new(struct fm *fm, struct fm_seek_t *parm) -{ - fm_s32 ret = 0; - fm_s32 space_idx = 0x0002; - - FMR_ASSERT(fm_low_ops.bi.setfreq); - FMR_ASSERT(fm_low_ops.bi.rssiget); - FMR_ASSERT(fm_low_ops.bi.rampdown); - FMR_ASSERT(fm_low_ops.bi.seek); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (parm->freq < parm->lower || parm->freq > parm->upper) { - WCN_DBG(FM_ERR | MAIN, "seek start freq:%d out of range\n", parm->freq); - ret = -EPERM; - goto out; - } - /* tune to start freq */ - fm_low_ops.bi.rampdown(); - fm_low_ops.bi.setfreq(parm->freq); - - if (parm->space == 5) { - space_idx = 0x0001; - } else if (parm->space == 10) { - space_idx = 0x0002; - } else if (parm->space == 20) { - space_idx = 0x0004; - } - - fm_op_state_set(fm, FM_STA_SEEK); - if (fm_false == - fm_low_ops.bi.seek(parm->lower, parm->upper, &(parm->freq), parm->dir, space_idx)) { - ret = -1; - goto out; - } - /* tune to new channel */ - fm_low_ops.bi.setfreq(parm->freq); - fm_low_ops.bi.rssiget(&parm->th); - - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - - -fm_s32 fm_tune_new(struct fm *fm, struct fm_tune_t *parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.mute); - FMR_ASSERT(fm_low_ops.bi.rampdown); - FMR_ASSERT(fm_low_ops.bi.setfreq); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - WCN_DBG(FM_DBG | MAIN, "%s\n", __func__); - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - ret = -EPERM; - goto out; - } - - if (parm->freq < parm->lower || parm->freq > parm->upper) { - WCN_DBG(FM_ERR | MAIN, "tune freq:%d out of range\n", parm->freq); - ret = -EPERM; - goto out; - } -/* fm_low_ops.bi.mute(fm_true); */ - fm_low_ops.bi.rampdown(); - - if (fm_cur_freq_get() != parm->freq) { - fm_memset(fm->pstRDSData, 0, sizeof(rds_t)); - } -#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */ - /* HILO side adjust if need */ - if (priv_adv.priv_tbl.hl_dese) { - if ((ret = priv_adv.priv_tbl.hl_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "HILO side %d\n", ret); - } - /* Frequency avoid adjust if need */ - if (priv_adv.priv_tbl.fa_dese) { - if ((ret = priv_adv.priv_tbl.fa_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "FA %d\n", ret); - } - /* MCU clock adjust if need */ - if (priv_adv.priv_tbl.mcu_dese) { - if ((ret = priv_adv.priv_tbl.mcu_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret); - } - /* GPS clock adjust if need */ - if (priv_adv.priv_tbl.gps_dese) { - if ((ret = priv_adv.priv_tbl.gps_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret); - } -#endif - fm_op_state_set(fm, FM_STA_TUNE); - WCN_DBG(FM_ALT | MAIN, "tuning to %d\n", parm->freq); - - if (fm_false == fm_low_ops.bi.setfreq(parm->freq)) { - WCN_DBG(FM_ALT | MAIN, "FM tune failed\n"); - ret = -EPERM; - goto out; - } -/* fm_low_ops.bi.mute(fm_false); */ - fm_op_state_set(fm, FM_STA_PLAY); - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - - -fm_s32 fm_cqi_get(struct fm *fm, fm_s32 ch_num, fm_s8 *buf, fm_s32 buf_size) -{ - fm_s32 ret = 0; - fm_s32 idx = 0; - - FMR_ASSERT(fm_low_ops.bi.cqi_get); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm_true == scan_stop_flag) { - WCN_DBG(FM_NTC | MAIN, "scan flow aborted, do not get CQI\n"); - ret = -1; - goto out; - } - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - ret = -EPERM; - goto out; - } - - if (ch_num * sizeof(struct fm_cqi) > buf_size) { - ret = -EPERM; - goto out; - } - - fm_op_state_set(fm, FM_STA_SCAN); - - idx = 0; - WCN_DBG(FM_NTC | MAIN, "cqi num %d\n", ch_num); - - while (ch_num > 0) { - ret = - fm_low_ops.bi.cqi_get(buf + 16 * sizeof(struct fm_cqi) * idx, - buf_size - 16 * sizeof(struct fm_cqi) * idx); - - if (ret) { - goto out; - } - - ch_num -= 16; - idx++; - } - - fm_op_state_set(fm, FM_STA_STOP); - - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - - -/* fm_is_dese_chan -- check if gived channel is a de-sense channel or not - * @pfm - fm driver global DS - * @freq - gived channel - * return value: 0, not a dese chan; 1, a dese chan; else error NO. - */ -fm_s32 fm_is_dese_chan(struct fm *pfm, fm_u16 freq) -{ - fm_s32 ret = 0; - FMR_ASSERT(pfm); - if (fm_low_ops.bi.is_dese_chan) { - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - ret = fm_low_ops.bi.is_dese_chan(freq); - FM_UNLOCK(fm_ops_lock); - } - - return ret; -} - - -/* fm_is_dese_chan -- check if gived channel is a de-sense channel or not - * @pfm - fm driver global DS - * @freq - gived channel - * return value: 0, not a dese chan; 1, a dese chan; else error NO. - */ -fm_s32 fm_desense_check(struct fm *pfm, fm_u16 freq, fm_s32 rssi) -{ - fm_s32 ret = 0; - FMR_ASSERT(pfm); - if (fm_low_ops.bi.desense_check) { - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - ret = fm_low_ops.bi.desense_check(freq, rssi); - FM_UNLOCK(fm_ops_lock); - } - - return ret; -} - -fm_s32 fm_dump_reg(void) -{ - fm_s32 ret = 0; - if (fm_low_ops.bi.dumpreg) { - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - ret = fm_low_ops.bi.dumpreg(); - FM_UNLOCK(fm_ops_lock); - } - return ret; -} - -/* fm_get_hw_info -- hw info: chip id, ECO version, DSP ROM version, Patch version - * @pfm - fm driver global DS - * @freq - target buffer - * return value: 0, success; else error NO. - */ -fm_s32 fm_get_hw_info(struct fm *pfm, struct fm_hw_info *req) -{ - fm_s32 ret = 0; - - FMR_ASSERT(req); - - /* default value for all chips */ - req->chip_id = 0x000066FF; - req->eco_ver = 0x00000000; - req->rom_ver = 0x00000001; - req->patch_ver = 0x00000100; - req->reserve = 0x00000000; - - /* get actual chip hw info */ - if (fm_low_ops.bi.hwinfo_get) { - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - ret = fm_low_ops.bi.hwinfo_get(req); - FM_UNLOCK(fm_ops_lock); - } - - return ret; -} - -fm_s32 fm_get_aud_info(fm_audio_info_t *data) -{ - /* FMR_ASSERT(fm_low_ops.bi.get_aud_info); */ - if (fm_low_ops.bi.get_aud_info) { - return fm_low_ops.bi.get_aud_info(data); - } else { - data->aud_path = FM_AUD_ERR; - data->i2s_info.mode = FM_I2S_MODE_ERR; - data->i2s_info.status = FM_I2S_STATE_ERR; - data->i2s_info.rate = FM_I2S_SR_ERR; - return 0; - } -} - -/* fm_get_i2s_info -- i2s info: on/off, master/slave, sample rate - * @pfm - fm driver global DS - * @req - target buffer - * return value: 0, success; else error NO. - */ -fm_s32 fm_get_i2s_info(struct fm *pfm, struct fm_i2s_info *req) -{ - FMR_ASSERT(fm_low_ops.bi.i2s_get); - - return fm_low_ops.bi.i2s_get(&req->status, &req->mode, &req->rate); -} - - -fm_s32 fm_hwscan_stop(struct fm *fm) -{ - fm_s32 ret = 0; - - if ((FM_STA_SCAN != fm_op_state_get(fm)) && (FM_STA_SEEK != fm_op_state_get(fm))) { - WCN_DBG(FM_WAR | MAIN, "fm isn't on scan, no need stop\n"); - return ret; - } - - FMR_ASSERT(fm_low_ops.bi.scanstop); - - fm_low_ops.bi.scanstop(); - fm_low_ops.bi.seekstop(); - scan_stop_flag = fm_true; - WCN_DBG(FM_DBG | MAIN, "fm will stop scan\n"); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - fm_low_ops.bi.rampdown(); - fm_low_ops.bi.setfreq(fm_cur_freq_get()); - - FM_UNLOCK(fm_ops_lock); - - return ret; -} - -/* fm_ana_switch -- switch antenna to long/short - * @fm - fm driver main data structure - * @antenna - 0, long; 1, short - * If success, return 0; else error code - */ -fm_s32 fm_ana_switch(struct fm *fm, fm_s32 antenna) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.anaswitch); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - WCN_DBG(FM_DBG | MAIN, "Switching ana to %s\n", antenna ? "short" : "long"); - fm->ana_type = antenna; - - if((FM_PWR_RX_ON == fm_pwr_state_get(fm)) || (FM_PWR_TX_ON == fm_pwr_state_get(fm))) - { - ret = fm_low_ops.bi.anaswitch(antenna); - } - - if (ret) { - WCN_DBG(FM_ALT | MAIN, "Switch ana Failed\n"); - } else { - WCN_DBG(FM_DBG | MAIN, "Switch ana OK!\n"); - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/* volume?[0~15] */ -fm_s32 fm_setvol(struct fm *fm, fm_u32 vol) -{ - fm_u8 tmp_vol; - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - return -EPERM; - } - FMR_ASSERT(fm_low_ops.bi.volset); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - tmp_vol = (vol > 15) ? 15 : vol; - fm_low_ops.bi.volset(tmp_vol); - fm->vol = (fm_s32) tmp_vol; - - FM_UNLOCK(fm_ops_lock); - return 0; -} - -fm_s32 fm_getvol(struct fm *fm, fm_u32 *vol) -{ - fm_u8 tmp_vol; - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - return -EPERM; - } - FMR_ASSERT(fm_low_ops.bi.volget); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - fm_low_ops.bi.volget(&tmp_vol); - *vol = (fm_u32) tmp_vol; - - FM_UNLOCK(fm_ops_lock); - return 0; -} - -fm_s32 fm_mute(struct fm *fm, fm_u32 bmute) -{ - fm_s32 ret = 0; - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - ret = -EPERM; - return ret; - } - FMR_ASSERT(fm_low_ops.bi.mute); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (bmute) { - ret = fm_low_ops.bi.mute(fm_true); - fm->mute = fm_true; - } else { - ret = fm_low_ops.bi.mute(fm_false); - fm->mute = fm_false; - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_getrssi(struct fm *fm, fm_s32 *rssi) -{ - fm_s32 ret = 0; - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - ret = -EPERM; - return ret; - } - FMR_ASSERT(fm_low_ops.bi.rssiget); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.rssiget(rssi); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_reg_read(struct fm *fm, fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.read); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.read(addr, val); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_reg_write(struct fm *fm, fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.write); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.write(addr, val); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_top_read(struct fm *fm, fm_u16 addr, fm_u32 *val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.top_read); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.top_read(addr, val); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_top_write(struct fm *fm, fm_u16 addr, fm_u32 val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.top_write); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.top_write(addr, val); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_host_read(struct fm *fm, fm_u32 addr, fm_u32 *val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.host_read); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.host_read(addr, val); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_host_write(struct fm *fm, fm_u32 addr, fm_u32 val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.host_write); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.host_write(addr, val); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_chipid_get(struct fm *fm, fm_u16 *chipid) -{ - FMR_ASSERT(chipid); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - *chipid = fm->chip_id; - - FM_UNLOCK(fm_ops_lock); - return 0; -} - -fm_s32 fm_monostereo_get(struct fm *fm, fm_u16 *ms) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.msget); - FMR_ASSERT(ms); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm_low_ops.bi.msget(ms) == fm_false) { - ret = -FM_EPARA; - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/* - * Force set to stero/mono mode - * @MonoStereo -- 0, auto; 1, mono - * If success, return 0; else error code - */ -fm_s32 fm_monostereo_set(struct fm *fm, fm_s32 ms) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.msset); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.msset(ms); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_pamd_get(struct fm *fm, fm_u16 *pamd) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.pamdget); - FMR_ASSERT(pamd); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm_low_ops.bi.pamdget(pamd) == fm_false) { - ret = -FM_EPARA; - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_caparray_get(struct fm *fm, fm_s32 *ca) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.caparray_get); - FMR_ASSERT(ca); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.caparray_get(ca); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_em_test(struct fm *fm, fm_u16 group, fm_u16 item, fm_u32 val) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.em); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (fm_false == fm_low_ops.bi.em(group, item, val)) { - ret = -FM_EPARA; - } - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_set_search_th(struct fm *fm, struct fm_search_threshold_t parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.set_search_th); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - ret = fm_low_ops.bi.set_search_th(parm.th_type, parm.th_val, parm.reserve); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_rds_tx(struct fm *fm, struct fm_rds_tx_parm *parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_tx); - - if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) { - parm->err = FM_BADSTATUS; - ret = -FM_EPARA; - goto out; - } - if (parm->other_rds_cnt > 29) { - parm->err = FM_EPARM; - WCN_DBG(FM_ERR | MAIN, "other_rds_cnt=%d\n", parm->other_rds_cnt); - ret = -FM_EPARA; - goto out; - } - - ret = fm_low_ops.ri.rds_tx(parm->pi, parm->ps, parm->other_rds, parm->other_rds_cnt); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "Rds_Tx failed!\n"); - goto out; - } -/* fm_cxt->txcxt.rdsTxOn = true; */ -/* fm_cxt->txcxt.pi = parm->pi; */ -/* memcpy(fm_cxt->txcxt.ps, parm->ps,sizeof(parm->ps)); */ -/* memcpy(fm_cxt->txcxt.other_rds, parm->other_rds,sizeof(parm->other_rds)); */ -/* fm_cxt->txcxt.other_rds_cnt = parm->other_rds_cnt; */ - out : - return ret; -} - -fm_s32 fm_rds_onoff(struct fm *fm, fm_u16 rdson_off) -{ - fm_s32 ret = 0; - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - ret = -EPERM; - goto out; - } - FMR_ASSERT(fm_low_ops.ri.rds_onoff); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - if (rdson_off) { - fm->rds_on = fm_true; - if (fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_true) == fm_false) { - WCN_DBG(FM_ALT | MAIN, "FM_IOCTL_RDS_ONOFF on faield\n"); - ret = -EPERM; - goto out; - } - - fm_enable_rds_BlerCheck(fm); - } else { - fm->rds_on = fm_false; - fm_disable_rds_BlerCheck(); - if (fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_false) == fm_false) { - WCN_DBG(FM_ALT | MAIN, "FM_IOCTL_RDS_ONOFF off faield\n"); - ret = -EPERM; - }; - } - - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_rds_good_bc_get(struct fm *fm, fm_u16 *gbc) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_gbc_get); - FMR_ASSERT(gbc); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - *gbc = fm_low_ops.ri.rds_gbc_get(); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_rds_bad_bc_get(struct fm *fm, fm_u16 *bbc) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_bbc_get); - FMR_ASSERT(bbc); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - *bbc = fm_low_ops.ri.rds_bbc_get(); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_rds_bler_ratio_get(struct fm *fm, fm_u16 *bbr) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_bbr_get); - FMR_ASSERT(bbr); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - *bbr = (fm_u16) fm_low_ops.ri.rds_bbr_get(); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_rds_group_cnt_get(struct fm *fm, struct rds_group_cnt_t *dst) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_gc_get); - FMR_ASSERT(dst); - if (FM_LOCK(fm_rds_cnt)) - return (-FM_ELOCK); - - ret = fm_low_ops.ri.rds_gc_get(dst, fm->pstRDSData); - - FM_UNLOCK(fm_rds_cnt); - return ret; -} - -fm_s32 fm_rds_group_cnt_reset(struct fm *fm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_gc_reset); - if (FM_LOCK(fm_rds_cnt)) - return (-FM_ELOCK); - - ret = fm_low_ops.ri.rds_gc_reset(fm->pstRDSData); - - FM_UNLOCK(fm_rds_cnt); - return ret; -} - -fm_s32 fm_rds_log_get(struct fm *fm, struct rds_rx_t *dst, fm_s32 *dst_len) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_log_get); - FMR_ASSERT(dst); - FMR_ASSERT(dst_len); - if (FM_LOCK(fm_read_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.ri.rds_log_get(dst, dst_len); - - FM_UNLOCK(fm_read_lock); - return ret; -} - -fm_s32 fm_rds_block_cnt_reset(struct fm *fm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.ri.rds_bc_reset); - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.ri.rds_bc_reset(); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_i2s_set(struct fm *fm, fm_s32 onoff, fm_s32 mode, fm_s32 sample) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.i2s_set); - if ((onoff != 0) || (onoff != 1)) { - onoff = 0; /* default on. */ - } - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.i2s_set(onoff, mode, sample); - - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/* - * fm_tune_tx - */ -fm_s32 fm_tune_tx(struct fm *fm, struct fm_tune_parm *parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.tune_tx); - - if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) { - parm->err = FM_BADSTATUS; - return -EPERM; - } - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - WCN_DBG(FM_DBG | MAIN, "%s\n", __func__); - - fm_op_state_set(fm, FM_STA_TUNE); - WCN_DBG(FM_NTC | MAIN, "Tx tune to %d\n", parm->freq); - /* tune to desired channel */ - if (fm_true != fm_low_ops.bi.tune_tx(parm->freq)) { - parm->err = FM_TUNE_FAILED; - WCN_DBG(FM_ALT | MAIN, "Tx tune failed\n"); - ret = -EPERM; - } - fm_op_state_set(fm, FM_STA_PLAY); - FM_UNLOCK(fm_ops_lock); - - return ret; -} - -/* - * fm_tune - */ -fm_s32 fm_tune(struct fm *fm, struct fm_tune_parm *parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.mute); - FMR_ASSERT(fm_low_ops.bi.rampdown); - FMR_ASSERT(fm_low_ops.bi.setfreq); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - WCN_DBG(FM_DBG | MAIN, "%s\n", __func__); - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - parm->err = FM_BADSTATUS; - ret = -EPERM; - goto out; - } -/* fm_low_ops.bi.mute(fm_true); */ - ret = fm_low_ops.bi.rampdown(); - if (ret) { - WCN_DBG(FM_ALT | MAIN, "FM ramp down failed\n"); - goto out; - } - - if (fm_cur_freq_get() != parm->freq) { - fm_memset(fm->pstRDSData, 0, sizeof(rds_t)); - } -#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */ - /* HILO side adjust if need */ - if (priv_adv.priv_tbl.hl_dese) { - if ((ret = priv_adv.priv_tbl.hl_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "HILO side %d\n", ret); - } - /* Frequency avoid adjust if need */ - if (priv_adv.priv_tbl.fa_dese) { - if ((ret = priv_adv.priv_tbl.fa_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "FA %d\n", ret); - } - /* MCU clock adjust if need */ - if (priv_adv.priv_tbl.mcu_dese) { - if ((ret = priv_adv.priv_tbl.mcu_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret); - } - /* GPS clock adjust if need */ - if (priv_adv.priv_tbl.gps_dese) { - if ((ret = priv_adv.priv_tbl.gps_dese(parm->freq, NULL)) < 0) { - goto out; - } - - WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret); - } -#endif - fm_op_state_set(fm, FM_STA_TUNE); - WCN_DBG(FM_ALT | MAIN, "tuning to %d\n", parm->freq); - - if (fm_true != fm_low_ops.bi.setfreq(parm->freq)) { - parm->err = FM_TUNE_FAILED; - WCN_DBG(FM_ALT | MAIN, "FM tune failed\n"); - ret = -FM_EFW; - } - /* fm_low_ops.bi.mute(fm_false);//open for dbg */ - fm_op_state_set(fm, FM_STA_PLAY); - out: - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/* cqi log tool entry */ -fm_s32 fm_cqi_log(void) -{ - fm_s32 ret = 0; - fm_u16 freq; - FMR_ASSERT(fm_low_ops.bi.cqi_log); - freq = fm_cur_freq_get(); - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - if ((freq != 10000) && (0xffffffff != g_dbg_level)) { - return -FM_EPARA; - } - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - ret = fm_low_ops.bi.cqi_log(8750, 10800, 2, 5); - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_pre_search(struct fm *fm) -{ - fm_s32 ret = 0; - FMR_ASSERT(fm_low_ops.bi.pre_search); - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - return -FM_EPARA; - } - if (FM_LOCK(fm_ops_lock)) { - return (-FM_ELOCK); - } - ret = fm_low_ops.bi.pre_search(); - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_restore_search(struct fm *fm) -{ - fm_s32 ret = 0; - FMR_ASSERT(fm_low_ops.bi.restore_search); - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - return -FM_EPARA; - } - if (FM_LOCK(fm_ops_lock)) { - return (-FM_ELOCK); - } - ret = fm_low_ops.bi.restore_search(); - FM_UNLOCK(fm_ops_lock); - return ret; -} - -/*fm soft mute tune function*/ -fm_s32 fm_soft_mute_tune(struct fm *fm, struct fm_softmute_tune_t *parm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm_low_ops.bi.softmute_tune); - - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - parm->valid = fm_false; - ret = -EPERM; - goto out; - } - /* fm_low_ops.bi.mute(fm_true); */ - WCN_DBG(FM_NTC | MAIN, "+%s():[freq=%d]\n", __func__, parm->freq); - /* fm_op_state_set(fm, FM_STA_TUNE); */ - - if (fm_false == fm_low_ops.bi.softmute_tune(parm->freq, &parm->rssi, &parm->valid)) { - parm->valid = fm_false; - WCN_DBG(FM_ALT | MAIN, "sm tune failed\n"); - ret = -EPERM; - } -/* fm_low_ops.bi.mute(fm_false); */ - out : - WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__); - FM_UNLOCK(fm_ops_lock); - - return ret; -} - -fm_s32 fm_over_bt(struct fm *fm, fm_s32 flag) -{ - fm_s32 ret = 0; - FMR_ASSERT(fm_low_ops.bi.fm_via_bt); - - if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) { - return -EPERM; - } - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - - ret = fm_low_ops.bi.fm_via_bt(flag); - if (ret) { - WCN_DBG(FM_ALT | MAIN, "%s(),failed!\n", __func__); - } else { - fm->via_bt = flag; - } - WCN_DBG(FM_NTC | MAIN, "%s(),[ret=%d]!\n", __func__, ret); - FM_UNLOCK(fm_ops_lock); - return ret; -} - -fm_s32 fm_tx_support(struct fm *fm, fm_s32 *support) -{ - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - if (fm_low_ops.bi.tx_support) { - fm_low_ops.bi.tx_support(support); - } else { - *support = 0; - } - WCN_DBG(FM_NTC | MAIN, "%s(),[%d]!\n", __func__, *support); - FM_UNLOCK(fm_ops_lock); - return 0; -} - -fm_s32 fm_rdstx_support(struct fm *fm, fm_s32 *support) -{ - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - if (fm_low_ops.ri.rdstx_support) { - fm_low_ops.ri.rdstx_support(support); - } else { - *support = 0; - } - WCN_DBG(FM_NTC | MAIN, "support=[%d]!\n", *support); - FM_UNLOCK(fm_ops_lock); - return 0; -} - -/*1:on,0:off*/ -fm_s32 fm_rdstx_enable(struct fm *fm, fm_s32 enable) -{ - fm_s32 ret = -1; - FMR_ASSERT(fm_low_ops.ri.rds_tx_enable); - FMR_ASSERT(fm_low_ops.ri.rds_tx_disable); - if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) { - return -FM_EPARA; - } - if (FM_LOCK(fm_ops_lock)) - return (-FM_ELOCK); - if (enable == 1) { - ret = fm_low_ops.ri.rds_tx_enable(); - if (ret) { - FM_LOG_ERR(MAIN, "rds_tx_enable fail=[%d]!\n", ret); - } - fm->rdstx_on = fm_true; - } else { - ret = fm_low_ops.ri.rds_tx_disable(); - if (ret) { - FM_LOG_ERR(MAIN, "rds_tx_disable fail=[%d]!\n", ret); - } - fm->rdstx_on = fm_false; - } - FM_LOG_NTC(MAIN, "rds tx enable=[%d]!\n", enable); - FM_UNLOCK(fm_ops_lock); - return 0; -} - -static void fm_timer_func(unsigned long data) -{ - struct fm *fm = g_fm_struct; - - if (FM_LOCK(fm_timer_lock)) - return; - - if (fm_timer_sys->update(fm_timer_sys)) { - WCN_DBG(FM_NTC | MAIN, "timer skip\n"); - goto out; /* fm timer is stoped before timeout */ - } - - if (fm != NULL) { - WCN_DBG(FM_NTC | MAIN, "timer:rds_wk\n"); - fm->timer_wkthd->add_work(fm->timer_wkthd, fm->rds_wk); - } - - out: - FM_UNLOCK(fm_timer_lock); -} - -#ifdef MT6620_FM -static void fmtx_timer_func(unsigned long data) -{ - struct fm *fm = g_fm_struct; - fm_s32 vco_cycle = 1; - - if (FM_LOCK(fm_timer_lock)) - return; - - fm_timer_sys->count++; - if (fm != NULL) { - /* schedule tx pwr ctrl work if need */ - if (fm->txpwrctl < 1) { - WCN_DBG(FM_WAR | MAIN, "tx power ctl time err\n"); - fm->txpwrctl = FM_TX_PWR_CTRL_INVAL_MIN; - } - if ((fm_timer_sys->tx_pwr_ctrl_en == FM_TX_PWR_CTRL_ENABLE) - && (fm_timer_sys->count % fm->txpwrctl == 0)) { - WCN_DBG(FM_NTC | MAIN, "Tx timer:fm_tx_power_ctrl_work\n"); - fm->timer_wkthd->add_work(fm->timer_wkthd, fm->fm_tx_power_ctrl_work); - } - /* - //schedule tx RTC ctrl work if need - if((timer->tx_rtc_ctrl_en == FM_TX_RTC_CTRL_ENABLE)&& (timer->count%FM_TX_RTC_CTRL_INTERVAL == 0)){ - FM_LOG_DBG(D_TIMER,"fm_tx_rtc_ctrl_work, ticks:%d\n", jiffies_to_msecs(jiffies)); - queue_work(fm->fm_timer_workqueue, &fm->fm_tx_rtc_ctrl_work); - } */ - /* schedule tx desense with wifi/bt work if need */ - if (fm->vcooff < 1) { - WCN_DBG(FM_WAR | MAIN, "tx vco tracking time err\n"); - fm->vcooff = FM_TX_VCO_OFF_MIN; - } - vco_cycle = fm->vcooff + fm->vcoon / 1000; - if ((fm_timer_sys->tx_desense_en == FM_TX_DESENSE_ENABLE) - && (fm_timer_sys->count % vco_cycle == 0)) { - WCN_DBG(FM_NTC | MAIN, "Tx timer:fm_tx_desense_wifi_work\n"); - fm->timer_wkthd->add_work(fm->timer_wkthd, fm->fm_tx_desense_wifi_work); - } - } - if (fm_timer_sys->update(fm_timer_sys)) { - WCN_DBG(FM_NTC | MAIN, "timer skip\n"); - goto out; /* fm timer is stoped before timeout */ - } - - out: - FM_UNLOCK(fm_timer_lock); -} -#endif -static void fm_tx_power_ctrl_worker_func(unsigned long data) -{ - fm_s32 ctrl = 0, ret = 0; - struct fm *fm = g_fm_struct; - - WCN_DBG(FM_NTC | MAIN, "+%s():\n", __func__); - - if (fm_low_ops.bi.tx_pwr_ctrl == NULL) - return; - if (FM_LOCK(fm_rxtx_lock)) - return; - - if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) { - WCN_DBG(FM_ERR | MAIN, "FM is not on TX mode\n"); - goto out; - } - - ctrl = fm->tx_pwr; - WCN_DBG(FM_NTC | MAIN, "tx pwr %ddb\n", ctrl); - ret = fm_low_ops.bi.tx_pwr_ctrl(fm_cur_freq_get(), &ctrl); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "tx_pwr_ctrl fail\n"); - } - - out: - FM_UNLOCK(fm_rxtx_lock); - WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__); - return; -} - -static void fm_tx_rtc_ctrl_worker_func(unsigned long data) -{ - fm_s32 ret = 0; - fm_s32 ctrl = 0; - struct fm_gps_rtc_info rtcInfo; - /* struct timeval curTime; */ - /* struct fm *fm = (struct fm*)fm_cb; */ - unsigned long curTime = 0; - - WCN_DBG(FM_NTC | MAIN, "+%s():\n", __func__); - - if (FM_LOCK(fm_rtc_mutex)) - return; - - if (gps_rtc_info.flag == FM_GPS_RTC_INFO_NEW) { - memcpy(&rtcInfo, &gps_rtc_info, sizeof(struct fm_gps_rtc_info)); - gps_rtc_info.flag = FM_GPS_RTC_INFO_OLD; - FM_UNLOCK(fm_rtc_mutex); - } else { - WCN_DBG(FM_NTC | MAIN, "there's no new rtc drift info\n"); - FM_UNLOCK(fm_rtc_mutex); - goto out; - } - - if (rtcInfo.age > rtcInfo.ageThd) { - WCN_DBG(FM_WAR | MAIN, "age over it's threshlod\n"); - goto out; - } - if ((rtcInfo.drift <= rtcInfo.driftThd) && (rtcInfo.drift >= -rtcInfo.driftThd)) { - WCN_DBG(FM_WAR | MAIN, "drift over it's MIN threshlod\n"); - goto out; - } - - if (rtcInfo.drift > FM_GPS_RTC_DRIFT_MAX) { - WCN_DBG(FM_WAR | MAIN, "drift over it's +MAX threshlod\n"); - rtcInfo.drift = FM_GPS_RTC_DRIFT_MAX; - goto out; - } else if (rtcInfo.drift < -FM_GPS_RTC_DRIFT_MAX) { - WCN_DBG(FM_WAR | MAIN, "drift over it's -MAX threshlod\n"); - rtcInfo.drift = -FM_GPS_RTC_DRIFT_MAX; - goto out; - } - /* - //get current time - do_gettimeofday(&curTime); - if((curTime.tv_sec - rtcInfo.tv.tv_sec) > rtcInfo.tvThd.tv_sec){ - FM_LOG_WAR(D_MAIN,"time diff over it's threshlod\n"); - goto out; - } */ - curTime = jiffies; - if (((long)curTime - (long)rtcInfo.stamp) / HZ > rtcInfo.tvThd.tv_sec) { - WCN_DBG(FM_WAR | MAIN, "time diff over it's threshlod\n"); - goto out; - } - if (fm_low_ops.bi.rtc_drift_ctrl != NULL) { - ctrl = rtcInfo.drift; - WCN_DBG(FM_NTC | MAIN, "RTC_drift_ctrl[0x%08x]\n", ctrl); - if ((ret = fm_low_ops.bi.rtc_drift_ctrl(fm_cur_freq_get(), &ctrl))) - goto out; - } - out: - WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__); - return; -} - -static void fm_tx_desense_wifi_worker_func(unsigned long data) -{ - fm_s32 ret = 0; - fm_s32 ctrl = 0; - struct fm *fm = g_fm_struct; - - WCN_DBG(FM_NTC | MAIN, "+%s():\n", __func__); - - if (FM_LOCK(fm_rxtx_lock)) - return; - - if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) { - WCN_DBG(FM_ERR | MAIN, "FM is not on TX mode\n"); - goto out; - } - - fm_tx_rtc_ctrl_worker_func(0); - - ctrl = fm->vcoon; - if (fm_low_ops.bi.tx_desense_wifi) { - WCN_DBG(FM_NTC | MAIN, "tx_desense_wifi[%d]\n", ctrl); - ret = fm_low_ops.bi.tx_desense_wifi(fm_cur_freq_get(), &ctrl); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "tx_desense_wifi fail\n"); - } - } - out: - FM_UNLOCK(fm_rxtx_lock); - WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__); - return; -} - -/* -************************************************************************************ -Function: fm_get_gps_rtc_info() - -Description: get GPS RTC drift info, and this function should not block - -Date: 2011/04/10 - -Return Value: success:0, failed: error coe -************************************************************************************ -*/ -fm_s32 fm_get_gps_rtc_info(struct fm_gps_rtc_info *src) -{ - fm_s32 ret = 0; -/* fm_s32 retry_cnt = 0; */ - struct fm_gps_rtc_info *dst = &gps_rtc_info; - - FMR_ASSERT(src); - FMR_ASSERT(dst); - - if (src->retryCnt > 0) { - dst->retryCnt = src->retryCnt; - WCN_DBG(FM_NTC | MAIN, "%s, new [retryCnt=%d]\n", __func__, dst->retryCnt); - } - if (src->ageThd > 0) { - dst->ageThd = src->ageThd; - WCN_DBG(FM_NTC | MAIN, "%s, new [ageThd=%d]\n", __func__, dst->ageThd); - } - if (src->driftThd > 0) { - dst->driftThd = src->driftThd; - WCN_DBG(FM_NTC | MAIN, "%s, new [driftThd=%d]\n", __func__, dst->driftThd); - } - if (src->tvThd.tv_sec > 0) { - dst->tvThd.tv_sec = src->tvThd.tv_sec; - WCN_DBG(FM_NTC | MAIN, "%s, new [tvThd=%d]\n", __func__, - (fm_s32) dst->tvThd.tv_sec); - } - ret = fm_rtc_mutex->trylock(fm_rtc_mutex, dst->retryCnt); - if (ret) { - goto out; - } - dst->age = src->age; - dst->drift = src->drift; - dst->stamp = jiffies; /* get curren time stamp */ - dst->flag = FM_GPS_RTC_INFO_NEW; - - FM_UNLOCK(fm_rtc_mutex); - - /* - //send event to info fm_tx_rtc_ctrl_work - if(timer_sys.tx_rtc_ctrl_en == FM_TX_RTC_CTRL_ENABLE){ - FM_LOG_DBG(D_TIMER,"fm_tx_rtc_ctrl_work, ticks:%d\n", jiffies_to_msecs(jiffies)); - queue_work(fm->fm_timer_workqueue, &fm->fm_tx_rtc_ctrl_work); - } - */ - - out: - return ret; -} - -static void fm_enable_rds_BlerCheck(struct fm *fm) -{ - if (FM_LOCK(fm_timer_lock)) - return; - fm_timer_sys->start(fm_timer_sys); - FM_UNLOCK(fm_timer_lock); - FM_LOG_NTC(MAIN, "enable rds timer ok\n"); -} - -static void fm_disable_rds_BlerCheck(void) -{ - if (FM_LOCK(fm_timer_lock)) - return; - fm_timer_sys->stop(fm_timer_sys); - FM_UNLOCK(fm_timer_lock); - FM_LOG_NTC(MAIN, "stop rds timer ok\n"); -} - -void fm_rds_reset_work_func(unsigned long data) -{ - fm_s32 ret = 0; - - if (!fm_low_ops.ri.rds_blercheck) { - return; - } - if (FM_LOCK(fm_rxtx_lock)) - return; - - if (FM_LOCK(fm_rds_cnt)) - return; - ret = fm_low_ops.ri.rds_blercheck(g_fm_struct->pstRDSData); - - WCN_DBG(FM_NTC | MAIN, "Addr_Cnt=%x\n", g_fm_struct->pstRDSData->AF_Data.Addr_Cnt); - if (g_fm_struct->pstRDSData->AF_Data.Addr_Cnt == 0xFF) /* check af list get,can't use event==af_list because event will clear after read rds every time */ - { - g_fm_struct->pstRDSData->event_status |= RDS_EVENT_AF; - } - if (!ret && g_fm_struct->pstRDSData->event_status) { - FM_EVENT_SEND(g_fm_struct->rds_event, FM_RDS_DATA_READY); - } - WCN_DBG(FM_NTC | MAIN, "rds event check=%x\n", g_fm_struct->pstRDSData->event_status); - FM_UNLOCK(fm_rds_cnt); - FM_UNLOCK(fm_rxtx_lock); -} - - -void fm_subsys_reset_work_func(unsigned long data) -{ - g_dbg_level = 0xffffffff; - if (FM_LOCK(fm_ops_lock)) - return; - - fm_sys_state_set(g_fm_struct, FM_SUBSYS_RST_START); - - if (g_fm_struct->chipon == fm_false) { - WCN_DBG(FM_ALT | MAIN, "chip off no need do recover\n"); - goto out; - } - - /* if whole chip reset, wmt will clear fm-on-flag, and firmware turn fm to off status, so no need turn fm off again */ - if (g_fm_struct->wholechiprst == fm_false) { - fm_low_ops.bi.pwrdownseq(); - /* subsystem power off */ - if (fm_low_ops.bi.pwroff(0)) { - WCN_DBG(FM_ALT | MAIN, "chip off fail\n"); - goto out; - } - } - - /* prepare to reset */ - - /* wait 3s */ - /* fm_low_ops.bi.msdelay(2000); */ - - /* subsystem power on */ - if (fm_low_ops.bi.pwron(0)) { - WCN_DBG(FM_ALT | MAIN, "chip on fail\n"); - goto out; - } - /* recover context */ - if (g_fm_struct->chipon == fm_false) { - fm_low_ops.bi.pwroff(0); - WCN_DBG(FM_ALT | MAIN, "no need do recover\n"); - goto out; - } - - if (FM_PWR_RX_ON == fm_pwr_state_get(g_fm_struct)) { - fm_low_ops.bi.pwrupseq(&g_fm_struct->chip_id, &g_fm_struct->device_id); - } else { - WCN_DBG(FM_ALT | MAIN, "no need do re-powerup\n"); - goto out; - } - - fm_low_ops.bi.anaswitch(g_fm_struct->ana_type); - - fm_low_ops.bi.setfreq(fm_cur_freq_get()); - - fm_low_ops.bi.volset((fm_u8) g_fm_struct->vol); - - g_fm_struct->mute = 0; - fm_low_ops.bi.mute(g_fm_struct->mute); - - if(fm_low_ops.ri.rds_bci_get) - { - fm_timer_sys->init(fm_timer_sys, fm_timer_func, (unsigned long)g_fm_struct, fm_low_ops.ri.rds_bci_get(), 0); - WCN_DBG(FM_NTC | MAIN, "initial timer ok\n"); - } - else - { - WCN_DBG(FM_NTC | MAIN, "initial timer fail!!!\n"); - } - - g_fm_struct->rds_on = 1; - fm_low_ops.ri.rds_onoff(g_fm_struct->pstRDSData, g_fm_struct->rds_on); - - WCN_DBG(FM_ALT | MAIN, "recover done\n"); - - out: - fm_sys_state_set(g_fm_struct, FM_SUBSYS_RST_END); - fm_sys_state_set(g_fm_struct, FM_SUBSYS_RST_OFF); - g_fm_struct->wholechiprst = fm_true; - - FM_UNLOCK(fm_ops_lock); - g_dbg_level = 0xfffffff5; -} - -static void fm_eint_handler(void) -{ - struct fm *fm = g_fm_struct; - WCN_DBG(FM_DBG | MAIN, "intr occur, ticks:%d\n", jiffies_to_msecs(jiffies)); - - if (fm != NULL) { - fm->eint_wkthd->add_work(fm->eint_wkthd, fm->eint_wk); - } -} - -static fm_s32 fm_rds_parser(struct rds_rx_t *rds_raw, fm_s32 rds_size) -{ - struct fm *fm = g_fm_struct; /* (struct fm *)work->data; */ - rds_t *pstRDSData = fm->pstRDSData; - - if (FM_LOCK(fm_read_lock)) - return (-FM_ELOCK); - /* parsing RDS data */ - fm_low_ops.ri.rds_parser(pstRDSData, rds_raw, rds_size, fm_cur_freq_get); - FM_UNLOCK(fm_read_lock); - - if ((pstRDSData->event_status != 0x0000) && (pstRDSData->event_status != RDS_EVENT_AF_LIST)) { - WCN_DBG(FM_NTC | MAIN, "Notify user to read, [event:%04x]\n", - pstRDSData->event_status); - FM_EVENT_SEND(fm->rds_event, FM_RDS_DATA_READY); - } - - return 0; -} - -static void fm_eint_work_func(unsigned long data) -{ - fm_event_parser(fm_rds_parser); - /* re-enable eint if need */ - fm_enable_eint(); -} - -static fm_s32 fm_callback_register(struct fm_lowlevel_ops *ops) -{ - FMR_ASSERT(ops); - - ops->cb.cur_freq_get = fm_cur_freq_get; - ops->cb.cur_freq_set = fm_cur_freq_set; - return 0; -} - -static fm_s32 fm_callback_unregister(struct fm_lowlevel_ops *ops) -{ - FMR_ASSERT(ops); - - fm_memset(&ops->cb, 0, sizeof(struct fm_callback)); - return 0; -} - - -static fm_s32 fm_para_init(struct fm *fmp) -{ - FMR_ASSERT(fmp); - - fmp->band = FM_BAND_SPECIAL; - fmp->min_freq = FM_RX_BAND_FREQ_L; - fmp->max_freq = FM_RX_BAND_FREQ_H; - fmp->cur_freq = 0; - - return 0; -} - -fm_s32 fm_cust_config_setup(fm_s8 *filename) -{ - fm_s32 ret; -#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6630_FM) || defined(MT6580_FM)) -#ifdef MT6628_FM - ret = MT6628fm_cust_config_setup(filename); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "MT6628fm_cust_config_setup failed\n"); - } -#endif -#ifdef MT6620_FM - ret = MT6620fm_cust_config_setup(filename); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "MT6620fm_cust_config_setup failed\n"); - } -#endif -#ifdef MT6627_FM - ret = MT6627fm_cust_config_setup(filename); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "MT6627fm_cust_config_setup failed\n"); - } -#endif -#ifdef MT6580_FM - ret = MT6580fm_cust_config_setup(filename); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "MT6580fm_cust_config_setup failed\n"); - } -#endif -#ifdef MT6630_FM - ret = MT6630fm_cust_config_setup(filename); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "MT6630fm_cust_config_setup failed\n"); - } -#endif -#else - fm_cust_config(filename); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "fm_cust_config failed\n"); - } -#endif - return ret; -} - -struct fm *fm_dev_init(fm_u32 arg) -{ - fm_s32 ret = 0; - struct fm *fm = NULL; - -/* if (!fm_low_ops.ri.rds_bci_get) */ -/* return NULL; */ - -/* if (!fm_low_ops.bi.chipid_get) */ -/* return NULL; */ - - /* alloc fm main data structure */ - if (!(fm = fm_zalloc(sizeof(struct fm)))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } - - fm->ref = 0; - fm->chipon = fm_false; - fm_pwr_state_set(fm, FM_PWR_OFF); -/* fm->chip_id = fm_low_ops.bi.chipid_get(); */ - /* FM Tx */ - fm->vcoon = FM_TX_VCO_ON_DEFAULT; - fm->vcooff = FM_TX_VCO_OFF_DEFAULT; - fm->txpwrctl = FM_TX_PWR_CTRL_INVAL_DEFAULT; - fm->tx_pwr = FM_TX_PWR_LEVEL_MAX; - fm->wholechiprst = fm_true; - gps_rtc_info.err = 0; - gps_rtc_info.age = 0; - gps_rtc_info.drift = 0; - gps_rtc_info.tv.tv_sec = 0; - gps_rtc_info.tv.tv_usec = 0; - gps_rtc_info.ageThd = FM_GPS_RTC_AGE_TH; - gps_rtc_info.driftThd = FM_GPS_RTC_DRIFT_TH; - gps_rtc_info.tvThd.tv_sec = FM_GPS_RTC_TIME_DIFF_TH; - gps_rtc_info.retryCnt = FM_GPS_RTC_RETRY_CNT; - gps_rtc_info.flag = FM_GPS_RTC_INFO_OLD; - - if (!(fm->rds_event = fm_flag_event_create("fm_rds_event"))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for RDS event\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } - - fm_flag_event_get(fm->rds_event); - - /* alloc fm rds data structure */ - if (!(fm->pstRDSData = fm_zalloc(sizeof(rds_t)))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for RDS\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } - - g_fm_struct = fm; - - fm->timer_wkthd = fm_workthread_create("fm_timer_wq"); - - if (!fm->timer_wkthd) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for fm_timer_wq\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } - - fm_workthread_get(fm->timer_wkthd); - - fm->eint_wkthd = fm_workthread_create("fm_eint_wq"); - - if (!fm->eint_wkthd) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for fm_eint_wq\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } - - fm_workthread_get(fm->eint_wkthd); - - fm->eint_wk = fm_work_create("fm_eint_work"); - - if (!fm->eint_wk) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for eint_wk\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } else { - fm_work_get(fm->eint_wk); - fm->eint_wk->init(fm->eint_wk, fm_eint_work_func, (unsigned long)fm); - } - - /* create reset work */ - fm->rst_wk = fm_work_create("fm_rst_work"); - - if (!fm->rst_wk) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for rst_wk\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } else { - fm_work_get(fm->rst_wk); - fm->rst_wk->init(fm->rst_wk, fm_subsys_reset_work_func, (unsigned long)fm); - } - - fm->rds_wk = fm_work_create("fm_rds_work"); - if (!fm->rds_wk) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for rds_wk\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } else { - fm_work_get(fm->rds_wk); - fm->rds_wk->init(fm->rds_wk, fm_rds_reset_work_func, (unsigned long)fm); - } - - fm->fm_tx_power_ctrl_work = fm_work_create("tx_pwr_ctl_work"); - if (!fm->fm_tx_power_ctrl_work) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for tx_pwr_ctl_work\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } else { - fm_work_get(fm->fm_tx_power_ctrl_work); - fm->fm_tx_power_ctrl_work->init(fm->fm_tx_power_ctrl_work, - fm_tx_power_ctrl_worker_func, (unsigned long)fm); - } - - fm->fm_tx_desense_wifi_work = fm_work_create("tx_desen_wifi_work"); - if (!fm->fm_tx_desense_wifi_work) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM for tx_desen_wifi_work\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } else { - fm_work_get(fm->fm_tx_desense_wifi_work); - fm->fm_tx_desense_wifi_work->init(fm->fm_tx_desense_wifi_work, - fm_tx_desense_wifi_worker_func, - (unsigned long)fm); - } - - /* fm timer was created in fm_env_setp() */ -/* fm_timer_sys->init(fm_timer_sys, fm_timer_func, (unsigned long)g_fm_struct, fm_low_ops.ri.rds_bci_get(), 0); */ -/* fm_timer_sys->start(fm_timer_sys); */ - - /* init customer config parameter */ - fm_cust_config_setup(NULL); - - fm_para_init(fm); - - return g_fm_struct; - - ERR_EXIT: - - if (fm->eint_wkthd) { - ret = fm_workthread_put(fm->eint_wkthd); - - if (!ret) - fm->eint_wkthd = NULL; - } - - if (fm->timer_wkthd) { - ret = fm_workthread_put(fm->timer_wkthd); - - if (!ret) - fm->timer_wkthd = NULL; - } - - if (fm->eint_wk) { - ret = fm_work_put(fm->eint_wk); - - if (!ret) - fm->eint_wk = NULL; - } - - if (fm->rds_wk) { - ret = fm_work_put(fm->rds_wk); - - if (!ret) - fm->rds_wk = NULL; - } - - if (fm->rst_wk) { - ret = fm_work_put(fm->rst_wk); - - if (!ret) - fm->rst_wk = NULL; - } - - if (fm->fm_tx_desense_wifi_work) { - ret = fm_work_put(fm->fm_tx_desense_wifi_work); - - if (!ret) - fm->fm_tx_desense_wifi_work = NULL; - } - - if (fm->fm_tx_power_ctrl_work) { - ret = fm_work_put(fm->fm_tx_power_ctrl_work); - - if (!ret) - fm->fm_tx_power_ctrl_work = NULL; - } - - if (fm->pstRDSData) { - fm_free(fm->pstRDSData); - fm->pstRDSData = NULL; - } - - fm_free(fm); - g_fm_struct = NULL; - return NULL; -} - -fm_s32 fm_dev_destroy(struct fm *fm) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_DBG | MAIN, "%s\n", __func__); - - fm_timer_sys->stop(fm_timer_sys); - - if (fm->eint_wkthd) { - ret = fm_workthread_put(fm->eint_wkthd); - - if (!ret) - fm->eint_wkthd = NULL; - } - - if (fm->timer_wkthd) { - ret = fm_workthread_put(fm->timer_wkthd); - - if (!ret) - fm->timer_wkthd = NULL; - } - - if (fm->eint_wk) { - ret = fm_work_put(fm->eint_wk); - - if (!ret) - fm->eint_wk = NULL; - } - - if (fm->rds_wk) { - ret = fm_work_put(fm->rds_wk); - - if (!ret) - fm->rds_wk = NULL; - } - - if (fm->rst_wk) { - ret = fm_work_put(fm->rst_wk); - - if (!ret) - fm->rst_wk = NULL; - } - - if (fm->pstRDSData) { - fm_free(fm->pstRDSData); - fm->pstRDSData = NULL; - } - - if (fm->pstRDSData) { - fm_free(fm->pstRDSData); - fm->pstRDSData = NULL; - } - - fm_flag_event_put(fm->rds_event); - - /* free all memory */ - if (fm) { - fm_free(fm); - fm = NULL; - g_fm_struct = NULL; - } - - return ret; -} - -fm_s32 fm_env_setup(void) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_NTC | MAIN, "%s\n", __func__); -#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM)) -#ifdef MT6620_FM - /* register call back functions */ - ret = fm_callback_register(&MT6620fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n"); - /* get low level functions */ - ret = MT6620fm_low_ops_register(&MT6620fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n"); - /* get rds level functions */ - ret = MT6620fm_rds_ops_register(&MT6620fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n"); -#endif -#ifdef MT6628_FM - /* register call back functions */ - ret = fm_callback_register(&MT6628fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n"); - /* get low level functions */ - ret = MT6628fm_low_ops_register(&MT6628fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n"); - /* get rds level functions */ - ret = MT6628fm_rds_ops_register(&MT6628fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n"); -#endif -#ifdef MT6627_FM - /* register call back functions */ - ret = fm_callback_register(&MT6627fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n"); - /* get low level functions */ - ret = MT6627fm_low_ops_register(&MT6627fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n"); - /* get rds level functions */ - ret = MT6627fm_rds_ops_register(&MT6627fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n"); -#endif -#ifdef MT6580_FM - /* register call back functions */ - ret = fm_callback_register(&MT6580fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n"); - /* get low level functions */ - ret = MT6580fm_low_ops_register(&MT6580fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n"); - /* get rds level functions */ - ret = MT6580fm_rds_ops_register(&MT6580fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n"); -#endif -#ifdef MT6630_FM - /* register call back functions */ - ret = fm_callback_register(&MT6630fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n"); - /* get low level functions */ - ret = MT6630fm_low_ops_register(&MT6630fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n"); - /* get rds level functions */ - ret = MT6630fm_rds_ops_register(&MT6630fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n"); -#endif -#else - /* register call back functions */ - ret = fm_callback_register(&fm_low_ops); - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n"); - /* get low level functions */ - ret = fm_low_ops_register(&fm_low_ops); - - if (ret) { - return ret; - } - - WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n"); - /* get rds level functions */ - ret = fm_rds_ops_register(&fm_low_ops); - - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n"); -#endif - - fm_ops_lock = fm_lock_create("ops_lock"); - - if (!fm_ops_lock) { - return -1; - } - - fm_read_lock = fm_lock_create("rds_read"); - - if (!fm_read_lock) { - return -1; - } - - fm_rds_cnt = fm_lock_create("rds_cnt"); - - if (!fm_rds_cnt) { - return -1; - } - - fm_timer_lock = fm_spin_lock_create("timer_lock"); - - if (!fm_timer_lock) { - return -1; - } - fm_rxtx_lock = fm_lock_create("rxtx_lock"); - if (!fm_rxtx_lock) { - return -1; - } - fm_rtc_mutex = fm_lock_create("rxtx_lock"); - if (!fm_rxtx_lock) { - return -1; - } - - fm_lock_get(fm_ops_lock); - fm_lock_get(fm_read_lock); - fm_lock_get(fm_rds_cnt); - fm_spin_lock_get(fm_timer_lock); - fm_lock_get(fm_rxtx_lock); - WCN_DBG(FM_NTC | MAIN, "4. fm locks created\n"); - - fm_timer_sys = fm_timer_create("fm_sys_timer"); - - if (!fm_timer_sys) { - return -1; - } - - fm_timer_get(fm_timer_sys); - WCN_DBG(FM_NTC | MAIN, "5. fm timer created\n"); - - ret = fm_link_setup((void *)fm_wholechip_rst_cb); - - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm link setup Failed\n"); - return -1; - } - - return ret; -} - -fm_s32 fm_env_destroy(void) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_NTC | MAIN, "%s\n", __func__); - - fm_link_release(); - -#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM)) -#if defined(MT6620_FM) - /* register call back functions */ - ret = fm_callback_unregister(&MT6620fm_low_ops); - - if (ret) { - return -1; - } - /* put low level functions */ - ret = MT6620fm_low_ops_unregister(&MT6620fm_low_ops); - - if (ret) { - return -1; - } - /* put rds func */ - ret = MT6620fm_rds_ops_unregister(&MT6620fm_low_ops); - - if (ret) { - return -1; - } -#endif -#if defined(MT6628_FM) - /* register call back functions */ - ret = fm_callback_unregister(&MT6628fm_low_ops); - - if (ret) { - return -1; - } - /* put low level functions */ - ret = MT6628fm_low_ops_unregister(&MT6628fm_low_ops); - - if (ret) { - return -1; - } - /* put rds func */ - ret = MT6628fm_rds_ops_unregister(&MT6628fm_low_ops); - - if (ret) { - return -1; - } -#endif -#if defined(MT6627_FM) - /* register call back functions */ - ret = fm_callback_unregister(&MT6627fm_low_ops); - - if (ret) { - return -1; - } - /* put low level functions */ - ret = MT6627fm_low_ops_unregister(&MT6627fm_low_ops); - - if (ret) { - return -1; - } - /* put rds func */ - ret = MT6627fm_rds_ops_unregister(&MT6627fm_low_ops); - - if (ret) { - return -1; - } -#endif -#if defined(MT6580_FM) - /* register call back functions */ - ret = fm_callback_unregister(&MT6580fm_low_ops); - - if (ret) { - return -1; - } - /* put low level functions */ - ret = MT6580fm_low_ops_unregister(&MT6580fm_low_ops); - - if (ret) { - return -1; - } - /* put rds func */ - ret = MT6580fm_rds_ops_unregister(&MT6580fm_low_ops); - - if (ret) { - return -1; - } -#endif -#if defined(MT6630_FM) - /* register call back functions */ - ret = fm_callback_unregister(&MT6630fm_low_ops); - - if (ret) { - return -1; - } - /* put low level functions */ - ret = MT6630fm_low_ops_unregister(&MT6630fm_low_ops); - - if (ret) { - return -1; - } - /* put rds func */ - ret = MT6630fm_rds_ops_unregister(&MT6630fm_low_ops); - - if (ret) { - return -1; - } -#endif -#else - /* register call back functions */ - ret = fm_callback_unregister(&fm_low_ops); - - if (ret) { - return -1; - } - /* put low level functions */ - ret = fm_low_ops_unregister(&fm_low_ops); - - if (ret) { - return -1; - } - /* put rds func */ - ret = fm_rds_ops_unregister(&fm_low_ops); - - if (ret) { - return -1; - } -#endif - ret = fm_lock_put(fm_ops_lock); - - if (!ret) - fm_ops_lock = NULL; - - ret = fm_lock_put(fm_read_lock); - - if (!ret) - fm_read_lock = NULL; - - ret = fm_lock_put(fm_rds_cnt); - - if (!ret) - fm_rds_cnt = NULL; - ret = fm_spin_lock_put(fm_timer_lock); - - if (!ret) - fm_timer_lock = NULL; - - ret = fm_timer_put(fm_timer_sys); - - if (!ret) - fm_timer_sys = NULL; - - return ret; -} - -/* - * GetChannelSpace - get the spcace of gived channel - * @freq - value in 760~1080 or 7600~10800 - * - * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0 - */ -fm_s32 fm_get_channel_space(fm_s32 freq) -{ - if ((freq >= 640) && (freq <= 1080)) { - return 0; - } else if ((freq >= 6400) && (freq <= 10800)) { - return 1; - } else { - return -1; - } -} diff --git a/drivers/misc/mediatek/fmradio/core/fm_module.c b/drivers/misc/mediatek/fmradio/core/fm_module.c deleted file mode 100644 index 676dd839a..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_module.c +++ /dev/null @@ -1,1633 +0,0 @@ -/* fm_module.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver -- main functions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/device.h> -#include <linux/fs.h> -#include <linux/proc_fs.h> -#include <linux/cdev.h> -#include <linux/interrupt.h> -#include <asm/uaccess.h> -#include <linux/sched.h> -#include <linux/delay.h> /* udelay() */ - -#include "fm_config.h" -#include "fm_main.h" -#include "fm_ioctl.h" - -#define FM_PROC_FILE "fm" - -fm_u32 g_dbg_level = 0xfffffff5; /* Debug level of FM */ - -/* fm main data structure */ -static struct fm *g_fm; -/* proc file entry */ -static struct proc_dir_entry *g_fm_proc; - -/* char device interface */ -static fm_s32 fm_cdev_setup(struct fm *fm); -static fm_s32 fm_cdev_destroy(struct fm *fm); - -static long fm_ops_ioctl(struct file *filp, fm_u32 cmd, unsigned long arg); -#ifdef CONFIG_COMPAT -static long fm_ops_compat_ioctl(struct file * filp,fm_u32 cmd,unsigned long arg); -#endif -static loff_t fm_ops_lseek(struct file *filp, loff_t off, fm_s32 whence); -static ssize_t fm_ops_read(struct file *filp, char *buf, size_t len, loff_t *off); -static fm_s32 fm_ops_open(struct inode *inode, struct file *filp); -static fm_s32 fm_ops_release(struct inode *inode, struct file *filp); -static fm_s32 fm_ops_flush(struct file *filp, fl_owner_t Id); -static struct file_operations fm_ops = { - .owner = THIS_MODULE, - .unlocked_ioctl = fm_ops_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = fm_ops_compat_ioctl, -#endif - .llseek = fm_ops_lseek, - .read = fm_ops_read, - .open = fm_ops_open, - .release = fm_ops_release, - .flush = fm_ops_flush, -}; - -/* static fm_s32 fm_proc_read(char *page, char **start, off_t off, fm_s32 count, fm_s32 *eof, void *data); */ -static ssize_t fm_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); -static ssize_t fm_proc_write(struct file *file, const char *buffer, size_t count, loff_t *ppos); - -static struct file_operations fm_proc_ops = { - .owner = THIS_MODULE, - .read = fm_proc_read, - .write = fm_proc_write, -}; - -static struct fm_scan_t parm = { - .sr_size = 0, - .sr.ch_rssi_buf = NULL, -}; - -#ifdef CONFIG_COMPAT -static long fm_ops_compat_ioctl(struct file *filp, fm_u32 cmd, unsigned long arg) -{ - long ret; - - WCN_DBG(FM_NTC | MAIN, "COMPAT %s---pid(%d)---cmd(0x%08x)---arg(0x%08x)\n", current->comm, - current->pid, cmd, (fm_u32) arg); - - if(!filp->f_op || !filp->f_op->unlocked_ioctl) - return -ENOTTY; - switch (cmd) { - case COMPAT_FM_IOCTL_GET_AUDIO_INFO: { - ret = filp->f_op->unlocked_ioctl(filp, FM_IOCTL_GET_AUDIO_INFO, arg); - break; - } - default: - ret = filp->f_op->unlocked_ioctl(filp, cmd, arg); - break; - } - - return ret; -} -#endif - -static long fm_ops_ioctl(struct file *filp, fm_u32 cmd, unsigned long arg) -{ - fm_s32 ret = 0; - struct fm_platform *plat = - container_of(filp->f_dentry->d_inode->i_cdev, struct fm_platform, cdev); - struct fm *fm = container_of(plat, struct fm, platform); - - WCN_DBG(FM_NTC | MAIN, "%s---pid(%d)---cmd(0x%08x)---arg(0x%08x)\n", current->comm, - current->pid, cmd, (fm_u32) arg); - - if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) { - WCN_DBG(FM_ALT | MAIN, "FM subsys is resetting, retry later\n"); - ret = -FM_ESRST; - return ret; - } - - switch (cmd) { - case FM_IOCTL_POWERUP:{ - struct fm_tune_parm parm; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP:0\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - - ret = fm_powerup(fm, &parm); - if (ret < 0) - goto out; - ret = fm_tune(fm, &parm); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP:1\n"); - - break; - } - - case FM_IOCTL_POWERDOWN:{ - int powerdwn_type = 0; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERDOWN:0\n"); - - if (copy_from_user(&powerdwn_type, (void *)arg, sizeof(int))) { - ret = -EFAULT; - goto out; - } - - ret = fm_powerdown(fm, powerdwn_type); /* 0: RX 1: TX */ - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERDOWN:1\n"); - break; - } - - case FM_IOCTL_TUNE:{ - struct fm_tune_parm parm; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE:0\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - - ret = fm_tune(fm, &parm); - if (ret < 0) { - goto out; - } - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE:1\n"); - break; - } - - case FM_IOCTL_SOFT_MUTE_TUNE: - { - struct fm_softmute_tune_t parm; - fm_cqi_log(); /* cqi log tool */ - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_SOFT_MUTE_TUNE......\n"); - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_softmute_tune_t))) { - ret = -EFAULT; - goto out; - } - - ret = fm_soft_mute_tune(fm, &parm); - if (ret < 0) { - goto out; - } - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_softmute_tune_t))) { - ret = -EFAULT; - goto out; - } - break; - } - case FM_IOCTL_PRE_SEARCH: - { - ret = fm_pre_search(fm); - break; - } - case FM_IOCTL_RESTORE_SEARCH: - { - ret = fm_restore_search(fm); - break; - } - case FM_IOCTL_SEEK:{ - struct fm_seek_parm parm; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SEEK:0\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_seek_parm))) { - ret = -EFAULT; - goto out; - } - - ret = fm_seek(fm, &parm); - if (ret < 0) { - goto out; - } - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_seek_parm))) { - ret = -EFAULT; - goto out; - } - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SEEK:1\n"); - break; - } - - case FM_IOCTL_SCAN:{ - struct fm_scan_parm parm; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SCAN start\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_scan_parm))) { - WCN_DBG(FM_ALT | MAIN, "copy_from_user failed\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_scan(fm, &parm); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_scan_parm))) { - ret = -EFAULT; - goto out; - } - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SCAN end\n"); - break; - } - - case FM_IOCTL_TUNE_NEW:{ - struct fm_tune_t tune_tmp; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE_NEW\n"); - - if (copy_from_user(&tune_tmp, (void *)arg, sizeof(struct fm_tune_t))) { - WCN_DBG(FM_ERR | MAIN, "tune new copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_tune_new(fm, &tune_tmp); - if (ret < 0) { - goto out; - } - - if (copy_to_user((void *)arg, &tune_tmp, sizeof(struct fm_tune_t))) { - WCN_DBG(FM_ERR | MAIN, "tune new copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_SEEK_NEW:{ - struct fm_seek_t seek_tmp; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SEEK_NEW\n"); - - if (copy_from_user(&seek_tmp, (void *)arg, sizeof(struct fm_seek_t))) { - WCN_DBG(FM_ERR | MAIN, "seek new copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_seek_new(fm, &seek_tmp); - if (ret < 0) { - goto out; - } - - if (copy_to_user((void *)arg, &seek_tmp, sizeof(struct fm_seek_t))) { - WCN_DBG(FM_ERR | MAIN, "seek new copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_SCAN_NEW:{ - struct fm_scan_t tmp; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SCAN_NEW\n"); - - if (copy_from_user(&tmp, (void *)arg, sizeof(struct fm_scan_t))) { - WCN_DBG(FM_ERR | MAIN, "copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - - switch (tmp.cmd) { - case FM_SCAN_CMD_START: - if ((tmp.upper > 10800) || (tmp.lower < 7600) || (tmp.space < 5) - || (tmp.space > 20)) { - WCN_DBG(FM_ERR | MAIN, "scan para error\n"); - ret = -EFAULT; - goto out; - } - parm.cmd = tmp.cmd; - parm.lower = tmp.lower; - parm.upper = tmp.upper; - parm.space = tmp.space; - - ret = fm_scan_new(fm, &parm); - if (ret < 0) { - goto out; - } - break; - - case FM_SCAN_CMD_GET_CH_RSSI: - if (parm.sr_size && parm.sr.ch_rssi_buf) { - if (copy_to_user - (tmp.sr.ch_rssi_buf, parm.sr.ch_rssi_buf, - parm.num * sizeof(struct fm_ch_rssi))) { - WCN_DBG(FM_ERR | MAIN, "scan copy_to_user err\n"); - ret = -EFAULT; - goto out; - } - } - break; - - default: - break; - } - - tmp.num = parm.num; - if (copy_to_user((void *)arg, &tmp, sizeof(struct fm_scan_t))) { - WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_CQI_GET:{ - struct fm_cqi_req cqi_req; - fm_s8 *buf = NULL; - fm_s32 tmp; - - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_CQI_GET\n"); - - if (copy_from_user(&cqi_req, (void *)arg, sizeof(struct fm_cqi_req))) { - WCN_DBG(FM_ALT | MAIN, "copy_from_user failed\n"); - ret = -EFAULT; - goto out; - } - - if ((cqi_req.ch_num * sizeof(struct fm_cqi) > cqi_req.buf_size) - || !cqi_req.cqi_buf) { - ret = -FM_EPARA; - goto out; - } - - tmp = cqi_req.ch_num / 16 + ((cqi_req.ch_num % 16) ? 1 : 0); - tmp = tmp * 16 * sizeof(struct fm_cqi); - buf = fm_zalloc(tmp); - - if (!buf) { - ret = -FM_ENOMEM; - goto out; - } - - ret = fm_cqi_get(fm, cqi_req.ch_num, buf, tmp); - - if (ret) { - fm_free(buf); - WCN_DBG(FM_ALT | MAIN, "get cqi failed\n"); - goto out; - } - - if (copy_to_user - ((void *)cqi_req.cqi_buf, buf, - cqi_req.ch_num * sizeof(struct fm_cqi))) { - fm_free(buf); - ret = -EFAULT; - goto out; - } - - fm_free(buf); - break; - } - - case FM_IOCTL_GET_HW_INFO:{ - struct fm_hw_info info; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GET_HW_INFO\n"); - - ret = fm_get_hw_info(fm, &info); - - if (ret) { - WCN_DBG(FM_ALT | MAIN, "get hw info failed\n"); - goto out; - } - - if (copy_to_user((void *)arg, &info, sizeof(struct fm_hw_info))) { - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_GET_I2S_INFO:{ - struct fm_i2s_info i2sinfo; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GET_I2S_INFO\n"); - - ret = fm_get_i2s_info(fm, &i2sinfo); - - if (ret) { - WCN_DBG(FM_ALT | MAIN, "get i2s info failed\n"); - goto out; - } - - if (copy_to_user((void *)arg, &i2sinfo, sizeof(struct fm_i2s_info))) { - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_SETVOL:{ - fm_u32 vol; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SETVOL start\n"); - if (copy_from_user(&vol, (void *)arg, sizeof(fm_u32))) { - WCN_DBG(FM_ALT | MAIN, "copy_from_user failed\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_setvol(fm, vol); - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SETVOL end:%d\n", vol); - break; - } - case FM_IOCTL_GETVOL:{ - fm_u32 vol; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GETVOL start\n"); - ret = fm_getvol(fm, &vol); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &vol, sizeof(fm_u32))) { - ret = -EFAULT; - goto out; - } - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GETVOL end=%d\n", vol); - break; - } - - case FM_IOCTL_MUTE:{ - fm_u32 bmute; - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_MUTE start\n"); - if (copy_from_user(&bmute, (void *)arg, sizeof(fm_u32))) { - ret = -EFAULT; - goto out; - } - - ret = fm_mute(fm, bmute); - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_MUTE end-%d\n", bmute); - break; - } - - case FM_IOCTL_GETRSSI:{ - fm_s32 rssi = 0; - - ret = fm_getrssi(fm, &rssi); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &rssi, sizeof(fm_s32))) { - ret = -EFAULT; - goto out; - } - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GETRSSI:%d\n", rssi); - break; - } - - case FM_IOCTL_RW_REG:{ - struct fm_ctl_parm parm_ctl; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_RW_REG\n"); - - if (copy_from_user(&parm_ctl, (void *)arg, sizeof(struct fm_ctl_parm))) { - ret = -EFAULT; - goto out; - } - - if (parm_ctl.rw_flag == 0) { - ret = fm_reg_write(fm, parm_ctl.addr, parm_ctl.val); - } else { - ret = fm_reg_read(fm, parm_ctl.addr, &parm_ctl.val); - } - if (ret < 0) - goto out; - - if ((parm_ctl.rw_flag == 0x01) && (!ret)) { - if (copy_to_user - ((void *)arg, &parm_ctl, sizeof(struct fm_ctl_parm))) { - ret = -EFAULT; - goto out; - } - } - - break; - } - case FM_IOCTL_TOP_RDWR: - { - struct fm_top_rw_parm parm_ctl; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_TOP_RDWR\n"); - - if (copy_from_user(&parm_ctl, (void *)arg, sizeof(struct fm_top_rw_parm))) { - ret = -EFAULT; - goto out; - } - - if (parm_ctl.rw_flag == 0) { - ret = fm_top_write(fm, parm_ctl.addr, parm_ctl.val); - } else { - ret = fm_top_read(fm, parm_ctl.addr, &parm_ctl.val); - } - if (ret < 0) - goto out; - - if ((parm_ctl.rw_flag == 0x01) && (!ret)) { - if (copy_to_user - ((void *)arg, &parm_ctl, sizeof(struct fm_top_rw_parm))) { - ret = -EFAULT; - goto out; - } - } - - break; - } - case FM_IOCTL_HOST_RDWR: - { - struct fm_host_rw_parm parm_ctl; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_TOP_RDWR\n"); - - if (copy_from_user(&parm_ctl, (void *)arg, sizeof(struct fm_host_rw_parm))) { - ret = -EFAULT; - goto out; - } - - if (parm_ctl.rw_flag == 0) { - ret = fm_host_write(fm, parm_ctl.addr, parm_ctl.val); - } else { - ret = fm_host_read(fm, parm_ctl.addr, &parm_ctl.val); - } - if (ret < 0) - goto out; - - if ((parm_ctl.rw_flag == 0x01) && (!ret)) { - if (copy_to_user - ((void *)arg, &parm_ctl, sizeof(struct fm_host_rw_parm))) { - ret = -EFAULT; - goto out; - } - } - - break; - } - - case FM_IOCTL_GETCHIPID:{ - fm_u16 chipid; - - ret = fm_chipid_get(fm, &chipid); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETCHIPID:%04x\n", chipid); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &chipid, sizeof(fm_u16))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_GETMONOSTERO:{ - fm_u16 usStereoMono; - - ret = fm_monostereo_get(fm, &usStereoMono); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETMONOSTERO:%04x\n", usStereoMono); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &usStereoMono, sizeof(fm_u16))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_SETMONOSTERO:{ - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_SETMONOSTERO, %d\n", (fm_s32) arg); - ret = fm_monostereo_set(fm, (fm_s32) arg); - break; - } - - case FM_IOCTL_GETCURPAMD:{ - fm_u16 PamdLevl; - - ret = fm_pamd_get(fm, &PamdLevl); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETCURPAMD:%d\n", PamdLevl); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &PamdLevl, sizeof(fm_u16))) - ret = -EFAULT; - goto out; - - break; - } - - case FM_IOCTL_GETCAPARRAY:{ - fm_s32 ca; - - ret = fm_caparray_get(fm, &ca); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETCAPARRAY:%d\n", ca); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &ca, sizeof(fm_s32))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_EM_TEST:{ - struct fm_em_parm parm_em; - - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_EM_TEST\n"); - - if (copy_from_user(&parm_em, (void *)arg, sizeof(struct fm_em_parm))) { - ret = -EFAULT; - goto out; - } - ret = - fm_em_test(fm, parm_em.group_idx, parm_em.item_idx, parm_em.item_value); - break; - } - - case FM_IOCTL_RDS_SUPPORT:{ - fm_s32 support = FM_RDS_ENABLE; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_RDS_SUPPORT\n"); - - if (copy_to_user((void *)arg, &support, sizeof(fm_s32))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_IS_FM_POWERED_UP:{ - fm_u32 powerup; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_IS_FM_POWERED_UP"); - - if (fm->chipon && fm_pwr_state_get(fm)) { - powerup = 1; - } else { - powerup = 0; - } - - if (copy_to_user((void *)arg, &powerup, sizeof(fm_u32))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_FM_SET_STATUS: { - fm_status_t fm_stat; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_FM_SET_STATUS"); - - if (copy_from_user(&fm_stat, (void*)arg, sizeof(fm_status_t))) { - ret = -EFAULT; - goto out; - } - - fm_set_stat(fm, fm_stat.which, fm_stat.stat); - - break; - } - - case FM_IOCTL_FM_GET_STATUS: { - fm_status_t fm_stat; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_FM_GET_STATUS"); - - if (copy_from_user(&fm_stat, (void*)arg, sizeof(fm_status_t))) { - ret = -EFAULT; - goto out; - } - - fm_get_stat(fm, fm_stat.which, &fm_stat.stat); - - if (copy_to_user((void*)arg, &fm_stat, sizeof(fm_status_t))) { - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_RDS_ONOFF:{ - fm_u16 rdson_off = 0; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_RDS_ONOFF start\n"); - - if (copy_from_user(&rdson_off, (void *)arg, sizeof(fm_u16))) { - ret = -EFAULT; - goto out; - } - ret = fm_rds_onoff(fm, rdson_off); - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_RDS_ONOFF end:%d\n", rdson_off); - break; - } - - case FM_IOCTL_GETGOODBCNT:{ - fm_u16 uGBLCNT = 0; - - ret = fm_rds_good_bc_get(fm, &uGBLCNT); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETGOODBCNT:%d\n", uGBLCNT); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &uGBLCNT, sizeof(fm_u16))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_GETBADBNT:{ - fm_u16 uBadBLCNT = 0; - - ret = fm_rds_bad_bc_get(fm, &uBadBLCNT); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETBADBNT:%d\n", uBadBLCNT); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &uBadBLCNT, sizeof(fm_u16))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_GETBLERRATIO:{ - fm_u16 uBlerRatio = 0; - - ret = fm_rds_bler_ratio_get(fm, &uBlerRatio); - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETBLERRATIO:%d\n", uBlerRatio); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &uBlerRatio, sizeof(fm_u16))) { - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_ANA_SWITCH:{ - fm_s32 antenna = -1; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_ANA_SWITCH\n"); - - if (copy_from_user(&antenna, (void *)arg, sizeof(fm_s32))) { - WCN_DBG(FM_ALT | MAIN, "copy from user error\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_ana_switch(fm, antenna); - break; - } - - case FM_IOCTL_RDS_GROUPCNT:{ - struct rds_group_cnt_req_t gc_req; - WCN_DBG(FM_DBG | MAIN, "......FM_IOCTL_RDS_GROUPCNT......\n"); - - if (copy_from_user - (&gc_req, (void *)arg, sizeof(struct rds_group_cnt_req_t))) { - WCN_DBG(FM_ALT | MAIN, "copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - /* handle group counter request */ - switch (gc_req.op) { - case RDS_GROUP_CNT_READ: - ret = fm_rds_group_cnt_get(fm, &gc_req.gc); - break; - case RDS_GROUP_CNT_WRITE: - break; - case RDS_GROUP_CNT_RESET: - ret = fm_rds_group_cnt_reset(fm); - break; - default: - break; - } - - if (copy_to_user((void *)arg, &gc_req, sizeof(struct rds_group_cnt_req_t))) { - WCN_DBG(FM_ALT | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_RDS_GET_LOG:{ - struct rds_raw_t rds_log; - fm_s32 len; - WCN_DBG(FM_DBG | MAIN, "......FM_IOCTL_RDS_GET_LOG......\n"); - /* fetch a record form RDS log buffer */ - ret = fm_rds_log_get(fm, (struct rds_rx_t *)&(rds_log.data), &len); - rds_log.dirty = TRUE; - rds_log.len = (len < sizeof(rds_log.data)) ? len : sizeof(rds_log.data); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &rds_log, rds_log.len + 2 * sizeof(fm_s32))) { - WCN_DBG(FM_ALT | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - - break; - } - - case FM_IOCTL_RDS_BC_RST:{ - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_RDS_BC_RST\n"); - ret = fm_rds_block_cnt_reset(fm); - break; - } - - case FM_IOCTL_I2S_SETTING:{ - struct fm_i2s_setting i2s_cfg; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_I2S_SETTING\n"); - - if (copy_from_user(&i2s_cfg, (void *)arg, sizeof(struct fm_i2s_setting))) { - WCN_DBG(FM_ALT | MAIN, "i2s set, copy_from_user err\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_i2s_set(fm, i2s_cfg.onoff, i2s_cfg.mode, i2s_cfg.sample); - - if (ret) { - WCN_DBG(FM_ALT | MAIN, "Set i2s err\n"); - goto out; - } - - break; - } - - case FM_IOCTL_IS_DESE_CHAN:{ - fm_s32 tmp; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_IS_DESE_CHAN\n"); - - if (copy_from_user(&tmp, (void *)arg, sizeof(fm_s32))) { - WCN_DBG(FM_ALT | MAIN, "is dese chan, copy_from_user err\n"); - ret = -EFAULT; - goto out; - } - - tmp = fm_is_dese_chan(fm, (fm_u16) tmp); - - if (copy_to_user((void *)arg, &tmp, sizeof(fm_s32))) { - WCN_DBG(FM_ALT | MAIN, "is dese chan, copy_to_user err\n"); - ret = -EFAULT; - goto out; - } - - break; - } - case FM_IOCTL_DESENSE_CHECK: - { - fm_desense_check_t tmp; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_IS_DESE_CHAN\n"); - - if (copy_from_user(&tmp, (void *)arg, sizeof(fm_desense_check_t))) { - WCN_DBG(FM_ALT | MAIN, "desene check, copy_from_user err\n"); - ret = -EFAULT; - goto out; - } - ret = fm_desense_check(fm, (fm_u16) tmp.freq, tmp.rssi); - - /*if (copy_to_user((void*)arg, &tmp, sizeof(fm_desense_check_t))) { - WCN_DBG(FM_ALT | MAIN, "desene check, copy_to_user err\n"); - ret = -EFAULT; - goto out; - } */ - - break; - } - case FM_IOCTL_SCAN_GETRSSI: - { - /*struct fm_rssi_req *req; - WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_SCAN_GETRSSI\n"); - if(!(req = fm_vmalloc(sizeof(struct fm_rssi_req)))) - { - WCN_DBG(FM_ALT | MAIN, "fm_vmalloc err\n"); - ret = -EFAULT; - goto out; - } - if(copy_from_user(req, (void*)arg, sizeof(struct fm_rssi_req))) - { - WCN_DBG(FM_ALT | MAIN, "copy_from_user err\n"); - ret = -EFAULT; - fm_vfree(req); - goto out; - } - ret = fm_get_rssi_after_scan(fm, req); - if(-ERR_FW_NORES == ret){ - WCN_DBG(FM_ALT | MAIN, "fm_get_rssi_after_scan err\n"); - } - if(copy_to_user((void*)arg, req, sizeof(struct fm_rssi_req))) - { - WCN_DBG(FM_ALT | MAIN, "copy_to_user err\n"); - ret = -EFAULT; - fm_vfree(req); - goto out; - } - */ - WCN_DBG(FM_ALT | MAIN, "FM_IOCTL_SCAN_GETRSSI:not support\n"); - break; - } - - case FM_IOCTL_DUMP_REG: - { - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_DUMP_REG......\n"); - - ret = fm_dump_reg(); - if (ret) { - WCN_DBG(FM_ALT | MAIN, "fm_dump_reg err\n"); - } - break; - } - case FM_IOCTL_GPS_RTC_DRIFT:{ - struct fm_gps_rtc_info rtc_info; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_GPS_RTC_DRIFT......\n"); - - if (fm_false == fm->chipon) { - WCN_DBG(FM_ERR | MAIN, "ERROR, FM chip is OFF\n"); - ret = -EFAULT; - goto out; - } - if (copy_from_user(&rtc_info, (void *)arg, sizeof(struct fm_gps_rtc_info))) { - WCN_DBG(FM_ERR | MAIN, "copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_get_gps_rtc_info(&rtc_info); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm_get_gps_rtc_info error\n"); - goto out; - } - break; - } - case FM_IOCTL_OVER_BT_ENABLE: - { - fm_s32 fm_via_bt = -1; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_OVER_BT_ENABLE......\n"); - - if (copy_from_user(&fm_via_bt, (void *)arg, sizeof(int32_t))) { - WCN_DBG(FM_ERR | MAIN, "copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_over_bt(fm, fm_via_bt); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm_over_bt err\n"); - } - break; - } - - case FM_IOCTL_SET_SEARCH_THRESHOLD: - { - struct fm_search_threshold_t parm; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_SET_SEARCH_THRESHOLD......\n"); - - if (copy_from_user - (&parm, (void *)arg, sizeof(struct fm_search_threshold_t))) { - WCN_DBG(FM_ALT | MAIN, "copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - ret = fm_set_search_th(fm, parm); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, - "FM_IOCTL_SET_SEARCH_THRESHOLD not supported\n"); - } - break; - } - case FM_IOCTL_GET_AUDIO_INFO: - { - fm_audio_info_t aud_data; - - ret = fm_get_aud_info(&aud_data); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm_get_aud_info err\n"); - } - if (copy_to_user((void *)arg, &aud_data, sizeof(fm_audio_info_t))) { - WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - - WCN_DBG(FM_DBG | MAIN, "fm_get_aud_info ret=%d\n", ret); - break; - } - /***************************FM Tx function************************************/ - case FM_IOCTL_TX_SUPPORT: - { - fm_s32 tx_support = -1; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_TX_SUPPORT......\n"); - - ret = fm_tx_support(fm, &tx_support); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm_tx_support err\n"); - } - if (copy_to_user((void *)arg, &tx_support, sizeof(fm_s32))) { - WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - break; - } - case FM_IOCTL_POWERUP_TX: - { - struct fm_tune_parm parm; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP_TX:0\n"); - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - - ret = fm_powerup_tx(fm, &parm); - if (ret < 0) { - goto out; - } - ret = fm_tune_tx(fm, &parm); - if (ret < 0) - goto out; - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP_TX:1\n"); - break; - } - - case FM_IOCTL_TUNE_TX: - { - struct fm_tune_parm parm; - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE_TX:0\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - - ret = fm_tune_tx(fm, &parm); - if (ret < 0) { - goto out; - } - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) { - ret = -EFAULT; - goto out; - } - - WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE_TX:1\n"); - break; - } - case FM_IOCTL_RDSTX_SUPPORT: - { - fm_s32 rds_tx_support = -1; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_RDSTX_SUPPORT......\n"); - - ret = fm_rdstx_support(fm, &rds_tx_support); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm_rdstx_support err\n"); - } - if (copy_to_user((void *)arg, &rds_tx_support, sizeof(fm_s32))) { - WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_RDSTX_ENABLE: - { - fm_s32 onoff = -1; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_RDSTX_ENABLE......\n"); - - if (copy_from_user(&onoff, (void *)arg, sizeof(fm_s32))) { - WCN_DBG(FM_ALT | MAIN, - "FM_IOCTL_RDSTX_ENABLE, copy_from_user err\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_rdstx_enable(fm, onoff); - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm_rdstx_enable err\n"); - } - - break; - } - - case FM_IOCTL_RDS_TX: - { - struct fm_rds_tx_parm parm; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_RDS_TX......\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_rds_tx_parm))) { - WCN_DBG(FM_ALT | MAIN, "RDS Tx, copy_from_user err\n"); - ret = -EFAULT; - goto out; - } - - ret = fm_rds_tx(fm, &parm); - if (ret) { - WCN_DBG(FM_ALT | MAIN, "fm_rds_tx err\n"); - } - - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_rds_tx_parm))) { - WCN_DBG(FM_ALT | MAIN, "RDS Tx, copy_to_user err\n"); - ret = -EFAULT; - goto out; - } - break; - } - - case FM_IOCTL_TX_SCAN: - { - struct fm_tx_scan_parm parm; - WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_TX_SCAN......\n"); - - if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tx_scan_parm))) { - WCN_DBG(FM_ALT | MAIN, "copy_from_user error\n"); - ret = -EFAULT; - goto out; - } - ret = fm_tx_scan(fm, &parm); - if (ret < 0) { - WCN_DBG(FM_ERR | MAIN, "FM_IOCTL_TX_SCAN failed\n"); - } - if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tx_scan_parm))) { - WCN_DBG(FM_ALT | MAIN, "copy_to_user error\n"); - ret = -EFAULT; - goto out; - } - break; - } - - default: - ret = -EPERM; - } - - out: - if (ret == -FM_EFW) { - if (fm_sys_state_get(fm) == FM_SUBSYS_RST_OFF) { - fm->wholechiprst = fm_false; - /* subsystem reset */ - fm_subsys_reset(fm); - } - } - - return ret; -} - -static loff_t fm_ops_lseek(struct file *filp, loff_t off, fm_s32 whence) -{ - struct fm *fm = filp->private_data; - - if (whence == SEEK_END) { - fm_hwscan_stop(fm); - } else if (whence == SEEK_SET) { - FM_EVENT_SEND(fm->rds_event, FM_RDS_DATA_READY); - } - - return off; -} - -static ssize_t fm_ops_read(struct file *filp, char *buf, size_t len, loff_t *off) -{ - struct fm *fm = filp->private_data; - fm_s32 copy_len = 0; - - if (!fm) { - WCN_DBG(FM_ALT | MAIN, "fm_read invalid fm pointer\n"); - return 0; - } - - WCN_DBG(FM_DBG | MAIN, "rds buf len=%zu\n", len); - WCN_DBG(FM_DBG | MAIN, "sizeof(rds_t)=%zu\n", sizeof(rds_t)); - - if (!buf || len < sizeof(rds_t)) { - WCN_DBG(FM_DBG | MAIN, "fm_read invliad buf\n"); - return 0; - } - /* return if FM is resetting */ - if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) { - WCN_DBG(FM_ALT | MAIN, "fm subsys underring reset\n"); - return 0; - } - - copy_len = sizeof(rds_t); - - return fm_rds_read(fm, buf, copy_len); -} - -static fm_s32 fm_ops_open(struct inode *inode, struct file *filp) -{ - fm_s32 ret = 0; - struct fm_platform *plat = container_of(inode->i_cdev, struct fm_platform, cdev); - struct fm *fm = container_of(plat, struct fm, platform); - - WCN_DBG(FM_NTC | MAIN, "fm_ops_open:0\n"); - if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) { - WCN_DBG(FM_ALT | MAIN, "FM subsys is resetting, retry later\n"); - ret = -FM_ESRST; - return ret; - } - - ret = fm_open(fm); - filp->private_data = fm; - - WCN_DBG(FM_NTC | MAIN, "fm_ops_open:1\n"); - return ret; -} - -static fm_s32 fm_ops_release(struct inode *inode, struct file *filp) -{ -/* fm_s32 ret = 0; */ -/* struct fm_platform *plat = container_of(inode->i_cdev, struct fm_platform, cdev); */ -/* struct fm *fm = container_of(plat, struct fm, platform); */ - -/* WCN_DBG(FM_NTC | MAIN, "fm_ops_release:0\n"); */ -/* fm_close(fm); */ - filp->private_data = NULL; - - WCN_DBG(FM_NTC | MAIN, "fm_ops_release\n"); - return 0; -} - -static fm_s32 fm_ops_flush(struct file *filp, fl_owner_t Id) -{ - fm_s32 ret = 0; - struct fm *fm = filp->private_data; - - WCN_DBG(FM_NTC | MAIN, "fm_ops_flush:0\n"); - fm_close(fm); - filp->private_data = fm; - - WCN_DBG(FM_NTC | MAIN, "fm_ops_flush:1\n"); - return ret; -} - -static ssize_t fm_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) -{ - struct fm *fm = g_fm; - ssize_t length = 0; - char tmpbuf[3]; - unsigned long pos = *ppos; - - WCN_DBG(FM_NTC | MAIN, "Enter fm_proc_read.\n"); - /* WCN_DBG(FM_NTC | MAIN, "count = %d\n", count); */ - /* WCN_DBG(FM_NTC | MAIN, "ppos = %d\n", pos); */ - - if (pos != 0) - return 0; - - if (!fm) { - WCN_DBG(FM_ALT | MAIN, "para err\n"); - return 0; - } - - if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_RX_ON)) { - length = sprintf(tmpbuf, "1\n"); - WCN_DBG(FM_NTC | MAIN, " FM_PWR_RX_ON\n"); - } else if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_TX_ON)) { - length = sprintf(tmpbuf, "2\n"); - WCN_DBG(FM_NTC | MAIN, " FM_PWR_TX_ON\n"); - } else { - length = sprintf(tmpbuf, "0\n"); - WCN_DBG(FM_NTC | MAIN, " FM POWER OFF\n"); - } - - if (copy_to_user(buf, tmpbuf, length)) { - WCN_DBG(FM_NTC | MAIN, " Read FM status fail!\n"); - return 0; - } - - pos += length; - *ppos = pos; - WCN_DBG(FM_NTC | MAIN, "Leave fm_proc_read. length = %zu\n", length); - - return length; -} - -/* -static fm_s32 fm_proc_read(char *page, char **start, off_t off, fm_s32 count, fm_s32 *eof, void *data) -{ - fm_s32 cnt = 0; - struct fm *fm = g_fm; - - WCN_DBG(FM_NTC | MAIN, "Enter fm_proc_read.\n"); - - if (off != 0) - return 0; - - if (!fm) { - WCN_DBG(FM_ALT | MAIN, "para err\n"); - return 0; - } - - if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_RX_ON)) - { - cnt = sprintf(page, "1\n"); - WCN_DBG(FM_NTC | MAIN, " FM_PWR_RX_ON\n"); - } - else if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_TX_ON)) - { - WCN_DBG(FM_NTC | MAIN, " FM_PWR_TX_ON\n"); - cnt = sprintf(page, "2\n"); - } - else - { - cnt = sprintf(page, "0\n"); - } - - *eof = 1; - WCN_DBG(FM_NTC | MAIN, "Leave fm_proc_read. cnt = %d\n", cnt); - return cnt; -} -*/ -static ssize_t fm_proc_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) -{ - fm_s8 tmp_buf[50] = { 0 }; - fm_u32 copysize; - - copysize = (count < (sizeof(tmp_buf) - 1)) ? count : (sizeof(tmp_buf) - 1); - - WCN_DBG(FM_NTC | MAIN, "fm_proc_write:0\n"); - if (copy_from_user(tmp_buf, buffer, copysize)) { - WCN_DBG(FM_ERR | MAIN, "failed copy_from_user\n"); - return -EFAULT; - } - - if (strncmp(tmp_buf, "subsys reset", strlen("subsys reset")) == 0) { - fm_subsys_reset(g_fm); - return count; - } - - if (!fm_cust_config_setup(tmp_buf)) { - WCN_DBG(FM_NTC | MAIN, "get config form %s ok\n", tmp_buf); - return count; - } - - if (sscanf(tmp_buf, "%x", &g_dbg_level) != 1) { - WCN_DBG(FM_ERR | MAIN, "failed g_dbg_level = 0x%x\n", g_dbg_level); - return -EFAULT; - } - - WCN_DBG(FM_NTC | MAIN, "fm_proc_write:1 g_dbg_level = 0x%x\n", g_dbg_level); - return count; -} - -//#define FM_DEV_STATIC_ALLOC -//#define FM_DEV_MAJOR 193 -//static int FM_major = FM_DEV_MAJOR; /* dynamic allocation */ - -static fm_s32 fm_cdev_setup(struct fm *fm) -{ - fm_s32 ret = 0; - struct fm_platform *plat = &fm->platform; - -#ifdef FM_DEV_STATIC_ALLOC - /*static allocate chrdev */ - plat->dev_t = MKDEV(FM_major, 0); - ret = register_chrdev_region(plat->dev_t, 1, FM_NAME); - - if (ret) { - WCN_DBG(FM_ERR | MAIN, "%s():fail to register chrdev\n", __func__); - return ret; - } -#endif - -#ifndef FM_DEV_STATIC_ALLOC - ret = alloc_chrdev_region(&plat->dev_t, 0, 1, FM_NAME); - - if (ret) { - WCN_DBG(FM_ALT | MAIN, "alloc dev_t failed\n"); - return ret; - } -#endif - - WCN_DBG(FM_NTC | MAIN, "alloc %s:%d:%d\n", FM_NAME, MAJOR(plat->dev_t), MINOR(plat->dev_t)); - - cdev_init(&plat->cdev, &fm_ops); - - plat->cdev.owner = THIS_MODULE; - plat->cdev.ops = &fm_ops; - - ret = cdev_add(&plat->cdev, plat->dev_t, 1); - - if (ret) { - WCN_DBG(FM_ALT | MAIN, "add dev_t failed\n"); - return ret; - } -#ifndef FM_DEV_STATIC_ALLOC - plat->cls = class_create(THIS_MODULE, FM_NAME); - - if (IS_ERR(plat->cls)) { - ret = PTR_ERR(plat->cls); - WCN_DBG(FM_ALT | MAIN, "class_create err:%d\n", ret); - return ret; - } - - plat->dev = device_create(plat->cls, NULL, plat->dev_t, NULL, FM_NAME); -#endif - - return ret; -} - -static fm_s32 fm_cdev_destroy(struct fm *fm) -{ - FMR_ASSERT(fm); - - device_destroy(fm->platform.cls, fm->platform.dev_t); - class_destroy(fm->platform.cls); - cdev_del(&fm->platform.cdev); - unregister_chrdev_region(fm->platform.dev_t, 1); - - return 0; -} - -static fm_s32 fm_mod_init(fm_u32 arg) -{ - fm_s32 ret = 0; - struct fm *fm = NULL; - - fm = fm_dev_init(0); - - if (!fm) { - ret = -ENOMEM; - goto ERR_EXIT; - } - - if ((ret = fm_cdev_setup(fm))) { - goto ERR_EXIT; - } - /* fm proc file create "/proc/fm" */ - g_fm_proc = proc_create(FM_PROC_FILE, 0444, NULL, &fm_proc_ops); - - if (g_fm_proc == NULL) { - WCN_DBG(FM_ALT | MAIN, "create_proc_entry failed\n"); - ret = -ENOMEM; - goto ERR_EXIT; - } else { - WCN_DBG(FM_NTC | MAIN, "create_proc_entry success\n"); - } - - g_fm = fm; - return 0; - - ERR_EXIT: - - if (fm) { - fm_cdev_destroy(fm); - fm_dev_destroy(fm); - } - - remove_proc_entry(FM_PROC_FILE, NULL); - return ret; -} - -static fm_s32 fm_mod_destroy(struct fm *fm) -{ - fm_s32 ret = 0; - - FMR_ASSERT(fm); - - WCN_DBG(FM_NTC | MAIN, "%s\n", __func__); - remove_proc_entry(FM_PROC_FILE, NULL); - fm_cdev_destroy(fm); - fm_dev_destroy(fm); - - return ret; -} - -static fm_s32 mt_fm_probe(struct platform_device *pdev) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_NTC | MAIN, "%s\n", __func__); - - ret = fm_mod_init(0); - - if (ret) { - WCN_DBG(FM_ERR | MAIN, "fm mod init err\n"); - return -ENOMEM; - } - - return ret; -} - -static fm_s32 mt_fm_remove(struct platform_device *pdev) -{ - WCN_DBG(FM_NTC | MAIN, "%s\n", __func__); - - fm_mod_destroy(g_fm); - g_fm = NULL; - return 0; -} - -static struct platform_device mt_fm_device = { - .name = FM_NAME, - .id = -1, -}; - -/* platform driver entry */ -static struct platform_driver mt_fm_dev_drv = { - .probe = mt_fm_probe, - .remove = mt_fm_remove, - .driver = { - .name = FM_NAME, - .owner = THIS_MODULE, - } -}; - -static fm_s32 mt_fm_init(void) -{ - fm_s32 ret = 0; - - ret = fm_env_setup(); - - if (ret) { - fm_env_destroy(); - return ret; - } - /* register fm device to platform bus */ - ret = platform_device_register(&mt_fm_device); - - if (ret) { - return ret; - } - /* register fm driver to platform bus */ - ret = platform_driver_register(&mt_fm_dev_drv); - - if (ret) { - return ret; - } - - WCN_DBG(FM_NTC | MAIN, "6. fm platform driver registered\n"); - return ret; -} - -static void mt_fm_exit(void) -{ - platform_driver_unregister(&mt_fm_dev_drv); - fm_env_destroy(); -} - -#ifdef MTK_WCN_REMOVE_KERNEL_MODULE -int mtk_wcn_fm_init(void) -{ - return mt_fm_init(); -} - -void mtk_wcn_fm_exit(void) -{ - mt_fm_exit(); -} -EXPORT_SYMBOL(mtk_wcn_fm_init); -EXPORT_SYMBOL(mtk_wcn_fm_exit); -#else -module_init(mt_fm_init); -module_exit(mt_fm_exit); -#endif -EXPORT_SYMBOL(g_dbg_level); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("MediaTek FM Driver"); -MODULE_AUTHOR("Hongcheng <hongcheng.xia@MediaTek.com>"); diff --git a/drivers/misc/mediatek/fmradio/core/fm_patch.c b/drivers/misc/mediatek/fmradio/core/fm_patch.c deleted file mode 100644 index 049a528ed..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_patch.c +++ /dev/null @@ -1,146 +0,0 @@ -/* fm_patch.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver -- patch functions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/fs.h> -#include <asm/uaccess.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" - -/* - * fm_file_exist - test file - * @filename - source file name - * If exsit, return 0, else error code - */ -fm_s32 fm_file_exist(const fm_s8 *filename) -{ - fm_s32 ret = 0; - mm_segment_t old_fs; - struct file *fp = NULL; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - fp = filp_open(filename, O_RDONLY, 0); - - if (IS_ERR(fp)) { - WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename); - set_fs(old_fs); - return -FM_EPATCH; - } else { - WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename); - } - - if (fp) { - filp_close(fp, NULL); - } - - set_fs(old_fs); - - return ret; -} - - -/* - * fm_file_read - read FM DSP patch/coeff/hwcoeff/rom binary file - * @filename - source file name - * @dst - target buffer - * @len - desired read length - * @position - the read position - * If success, return read length in bytes, else error code - */ -fm_s32 fm_file_read(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 position) -{ - fm_s32 ret = 0; - loff_t pos = position; - mm_segment_t old_fs; - struct file *fp = NULL; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - fp = filp_open(filename, O_RDONLY, 0); - - if (IS_ERR(fp)) { - WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename); - set_fs(old_fs); - return -FM_EPATCH; - } else { - WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename); - } - - ret = vfs_read(fp, (char __user *)dst, len, &pos); - - if (ret < 0) { - WCN_DBG(FM_ERR | CHIP, "read \"%s\" failed\n", filename); - } else if (ret < len) { - WCN_DBG(FM_NTC | CHIP, "read \"%s\" part data\n", filename); - } else { - WCN_DBG(FM_NTC | CHIP, "read \"%s\" full data\n", filename); - } - - if (fp) { - filp_close(fp, NULL); - } - - set_fs(old_fs); - - return ret; -} - - -fm_s32 fm_file_write(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 *ppos) -{ - fm_s32 ret = 0; - loff_t pos = *ppos; - mm_segment_t old_fs; - struct file *fp = NULL; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - fp = filp_open(filename, O_CREAT | O_RDWR, 0); - - if (IS_ERR(fp)) { - WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename); - set_fs(old_fs); - return -FM_EPATCH; - } else { - WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename); - } - - WCN_DBG(FM_NTC | CHIP, "\"%s\" old pos %d\n", filename, (int)pos); - ret = vfs_write(fp, (char __user *)dst, len, &pos); - WCN_DBG(FM_NTC | CHIP, "\"%s\" new pos %d\n", filename, (int)pos); - *ppos = pos; - if (ret < 0) { - WCN_DBG(FM_ERR | CHIP, "write \"%s\" failed\n", filename); - } else if (ret < len) { - WCN_DBG(FM_NTC | CHIP, "write \"%s\" data\n", filename); - } - - if (fp) { - filp_close(fp, NULL); - } - - set_fs(old_fs); - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/core/fm_rds_parser.c b/drivers/misc/mediatek/fmradio/core/fm_rds_parser.c deleted file mode 100644 index 68541bcdc..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_rds_parser.c +++ /dev/null @@ -1,2022 +0,0 @@ -/* fm_rds_parser.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/string.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" - -/* static rds_ps_state_machine_t ps_state_machine = RDS_PS_START; */ -/* static rds_rt_state_machine_t rt_state_machine = RDS_RT_START; */ -struct fm_state_machine { - fm_s32 state; - fm_s32(*state_get) (struct fm_state_machine *thiz); - fm_s32(*state_set) (struct fm_state_machine *thiz, fm_s32 new_state); -}; - -static fm_s32 fm_state_get(struct fm_state_machine *thiz) -{ - return thiz->state; -} - -static fm_s32 fm_state_set(struct fm_state_machine *thiz, fm_s32 new_state) -{ - return thiz->state = new_state; -} - -#define STATE_SET(a, s) \ -{ \ - if ((a)->state_set) { \ - (a)->state_set((a), (s)); \ - } \ -} - -#define STATE_GET(a) \ -({ \ - fm_s32 __ret = 0; \ - if ((a)->state_get) { \ - __ret = (a)->state_get((a)); \ - } \ - __ret; \ -}) - -static fm_u16(*rds_get_freq) (void); - -/* RDS spec related handle flow */ -/* - * rds_cnt_get - * To get rds group count form raw data - * If success return 0, else return error code -*/ -static fm_s32 rds_cnt_get(struct rds_rx_t *rds_raw, fm_s32 raw_size, fm_s32 *cnt) -{ - fm_s32 gap = sizeof(rds_raw->cos) + sizeof(rds_raw->sin); - - FMR_ASSERT(rds_raw); - FMR_ASSERT(cnt); - *cnt = (raw_size - gap) / sizeof(rds_packet_t); - WCN_DBG(FM_INF | RDSC, "group cnt=%d\n", *cnt); - - return 0; -} - -/* - * rds_grp_get - * To get rds group[n] data form raw data with index - * If success return 0, else return error code -*/ -static fm_s32 rds_grp_get(fm_u16 *dst, struct rds_rx_t *raw, fm_s32 idx) -{ - FMR_ASSERT(dst); - FMR_ASSERT(raw); - - if (idx > (MAX_RDS_RX_GROUP_CNT - 1)) { - return -FM_EPARA; - } - - dst[0] = raw->data[idx].blkA; - dst[1] = raw->data[idx].blkB; - dst[2] = raw->data[idx].blkC; - dst[3] = raw->data[idx].blkD; - dst[4] = raw->data[idx].crc; - dst[5] = raw->data[idx].cbc; - - WCN_DBG(FM_NTC | RDSC, "BLOCK:%04x %04x %04x %04x, CRC:%04x CBC:%04x\n", dst[0], dst[1], - dst[2], dst[3], dst[4], dst[5]); - - return 0; -} - -/* - * rds_checksum_check - * To check CRC rerult, if OK, *valid=fm_true, else *valid=fm_false - * If success return 0, else return error code -*/ -static fm_s32 rds_checksum_check(fm_u16 crc, fm_s32 mask, fm_bool *valid) -{ - FMR_ASSERT(valid); - - if ((crc & mask) == mask) { - *valid = fm_true; - } else { - *valid = fm_false; - } - - return 0; -} - -/* - * rds_cbc_get - To get block_n's correct bit count form cbc - * @cbc, the group's correct bit count - * @blk, target the block - * - * If success, return block_n's cbc, else error code -*/ -/* -static fm_s32 rds_cbc_get(fm_u16 cbc, enum rds_blk_t blk) -{ - int ret = 0; - - switch (blk) { - case RDS_BLK_A: - ret = (cbc & 0xF000) >> 12; - break; - case RDS_BLK_B: - ret = (cbc & 0x0F00) >> 8; - break; - case RDS_BLK_C: - ret = (cbc & 0x00F0) >> 4; - break; - case RDS_BLK_D: - ret = (cbc & 0x000F) >> 0; - break; - default: - break; - } - - WCN_DBG(FM_INF | RDSC, "group cbc=0x%04x\n", cbc); - return ret; -} -*/ -/* - * rds_event_set - * To set rds event, and user space can use this flag to juge which event happened - * If success return 0, else return error code -*/ -static fm_s32 rds_event_set(fm_u16 *events, fm_s32 event_mask) -{ - FMR_ASSERT(events); - WCN_DBG(FM_NTC | RDSC, "rds set event[%x->%x]\n", event_mask, *events); - *events |= event_mask; - - return 0; -} - -/* - * rds_flag_set - * To set rds event flag, and user space can use this flag to juge which event happened - * If success return 0, else return error code -*/ -static fm_s32 rds_flag_set(fm_u32 *flags, fm_s32 flag_mask) -{ - FMR_ASSERT(flags); - *flags |= flag_mask; - WCN_DBG(FM_NTC | RDSC, "rds set flag[%x->%x]\n", flag_mask, *flags); - - return 0; -} - -/* - * rds_grp_type_get - * To get rds group type form blockB - * If success return 0, else return error code -*/ -static fm_s32 rds_grp_type_get(fm_u16 crc, fm_u16 blk, fm_u8 *type, fm_u8 *subtype) -{ - fm_bool valid = fm_false; - - FMR_ASSERT(type); - FMR_ASSERT(subtype); - /* to get the group type from block B */ - rds_checksum_check(crc, FM_RDS_GDBK_IND_B, &valid); - - if (valid == fm_true) { - *type = (blk & 0xF000) >> 12; /* Group type(4bits) */ - *subtype = (blk & 0x0800) >> 11; /* version code(1bit), 0=vesionA, 1=versionB */ - } else { - WCN_DBG(FM_WAR | RDSC, "Block1 CRC err\n"); - return -FM_ECRC; - } - - WCN_DBG(FM_DBG | RDSC, "Type=%d, subtype:%s\n", (fm_s32) *type, - *subtype ? "version B" : "version A"); - return 0; -} - -/* - * rds_grp_counter_add - * @type -- group type, rang: 0~15 - * @subtype -- sub group type, rang:0~1 - * - * add group counter, g0a~g15b - * we use type value as the index - * If success return 0, else return error code -*/ -static fm_s32 rds_grp_counter_add(fm_u8 type, fm_u8 subtype, struct rds_group_cnt_t *gc) -{ - FMR_ASSERT(gc); - - if (type > 15) { - return -FM_EPARA; - } - - switch (subtype) { - case RDS_GRP_VER_A: - gc->groupA[type]++; - break; - case RDS_GRP_VER_B: - gc->groupB[type]++; - break; - default: - return -FM_EPARA; - break; - } - - gc->total++; - WCN_DBG(FM_INF | RDSC, "group counter:%d\n", (fm_s32) gc->total); - return 0; -} - -/* - * rds_grp_counter_get - * - * read group counter , g0a~g15b - * If success return 0, else return error code -*/ -extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src) -{ - FMR_ASSERT(dst); - FMR_ASSERT(src); - fm_memcpy(dst, src, sizeof(struct rds_group_cnt_t)); - WCN_DBG(FM_DBG | RDSC, "rds gc get[total=%d]\n", (fm_s32) dst->total); - return 0; -} - -/* - * rds_grp_counter_reset - * - * clear group counter to 0, g0a~g15b - * If success return 0, else return error code -*/ -extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc) -{ - FMR_ASSERT(gc); - fm_memset(gc, 0, sizeof(struct rds_group_cnt_t)); - return 0; -} - -extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len) -{ - FMR_ASSERT(new_log); - - if (thiz->len < thiz->size) { - new_len = (new_len < sizeof(struct rds_rx_t)) ? new_len : sizeof(struct rds_rx_t); - fm_memcpy(&(thiz->rds_log[thiz->in]), new_log, new_len); - thiz->log_len[thiz->in] = new_len; - thiz->in = (thiz->in + 1) % thiz->size; - thiz->len++; - WCN_DBG(FM_DBG | RDSC, "add a new log[len=%d]\n", thiz->len); - } else { - WCN_DBG(FM_WAR | RDSC, "rds log buf is full\n"); - return -FM_ENOMEM; - } - - return 0; -} - -extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len) -{ - FMR_ASSERT(dst); - FMR_ASSERT(dst_len); - - if (thiz->len > 0) { - *dst_len = thiz->log_len[thiz->out]; - *dst_len = - (*dst_len < sizeof(struct rds_rx_t)) ? *dst_len : sizeof(struct rds_rx_t); - fm_memcpy(dst, &(thiz->rds_log[thiz->out]), *dst_len); - thiz->out = (thiz->out + 1) % thiz->size; - thiz->len--; - WCN_DBG(FM_DBG | RDSC, "del a new log[len=%d]\n", thiz->len); - } else { - *dst_len = 0; - WCN_DBG(FM_WAR | RDSC, "rds log buf is empty\n"); - } - - return 0; -} - -/* - * rds_grp_pi_get - * To get rds group pi code form blockA - * If success return 0, else return error code -*/ -static fm_s32 rds_grp_pi_get(fm_u16 crc, fm_u16 blk, fm_u16 *pi, fm_bool *dirty) -{ - fm_s32 ret = 0; - fm_bool valid = fm_false; - - FMR_ASSERT(pi); - FMR_ASSERT(dirty); - - /* to get the group pi code from block A */ - ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_A, &valid); - - if (valid == fm_true) { - if (*pi != blk) { - /* PI=program Identication */ - *pi = blk; - *dirty = fm_true; /* yes, we got new PI code */ - } else { - *dirty = fm_false; /* PI is the same as last one */ - } - } else { - WCN_DBG(FM_WAR | RDSC, "Block0 CRC err\n"); - return -FM_ECRC; - } - - WCN_DBG(FM_INF | RDSC, "PI=0x%04x, %s\n", *pi, *dirty ? "new" : "old"); - return ret; -} - -/* - * rds_grp_pty_get - * To get rds group pty code form blockB - * If success return 0, else return error code -*/ -static fm_s32 rds_grp_pty_get(fm_u16 crc, fm_u16 blk, fm_u8 *pty, fm_bool *dirty) -{ - fm_s32 ret = 0; -/* fm_bool valid = fm_false; */ - - FMR_ASSERT(pty); - FMR_ASSERT(dirty); - - /* to get PTY code from block B */ -/* ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_B, &valid); */ - -/* if (valid == fm_false) { */ -/* WCN_DBG(FM_WAR | RDSC, "Block1 CRC err\n"); */ -/* return -FM_ECRC; */ -/* } */ - - if (*pty != ((blk & 0x03E0) >> 5)) { - /* PTY=Program Type Code */ - *pty = (blk & 0x03E0) >> 5; - *dirty = fm_true; /* yes, we got new PTY code */ - } else { - *dirty = fm_false; /* PTY is the same as last one */ - } - - WCN_DBG(FM_INF | RDSC, "PTY=%d, %s\n", (fm_s32) *pty, *dirty ? "new" : "old"); - return ret; -} - -/* - * rds_grp_tp_get - * To get rds group tp code form blockB - * If success return 0, else return error code -*/ -static fm_s32 rds_grp_tp_get(fm_u16 crc, fm_u16 blk, fm_u8 *tp, fm_bool *dirty) -{ - fm_s32 ret = 0; -/* fm_bool valid = fm_false; */ - - FMR_ASSERT(tp); - FMR_ASSERT(dirty); - - /* to get TP code from block B */ -/* ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_B, &valid); */ - -/* if (valid == fm_false) { */ -/* WCN_DBG(FM_WAR | RDSC, "Block1 CRC err\n"); */ -/* return -FM_ECRC; */ -/* } */ - - if (*tp != ((blk & 0x0400) >> 10)) { - /* Tranfic Program Identification */ - *tp = (blk & 0x0400) >> 10; - *dirty = fm_true; /* yes, we got new TP code */ - } else { - *dirty = fm_false; /* TP is the same as last one */ - } - - WCN_DBG(FM_NTC | RDSC, "TP=%d, %s\n", (fm_s32) *tp, *dirty ? "new" : "old"); - return ret; -} - -/* - * rds_g0_ta_get - * To get rds group ta code form blockB - * If success return 0, else return error code -*/ -static fm_s32 rds_g0_ta_get(fm_u16 blk, fm_u8 *ta, fm_bool *dirty) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ta); - FMR_ASSERT(dirty); - - /* TA=Traffic Announcement code */ - if (*ta != ((blk & 0x0010) >> 4)) { - *ta = (blk & 0x0010) >> 4; - *dirty = fm_true; /* yes, we got new TA code */ - } else { - *dirty = fm_false; /* TA is the same as last one */ - } - - WCN_DBG(FM_INF | RDSC, "TA=%d, %s\n", (fm_s32) *ta, *dirty ? "new" : "old"); - return ret; -} - -/* - * rds_g0_music_get - * To get music-speech switch code form blockB - * If success return 0, else return error code -*/ -static fm_s32 rds_g0_music_get(fm_u16 blk, fm_u8 *music, fm_bool *dirty) -{ - fm_s32 ret = 0; - - FMR_ASSERT(music); - FMR_ASSERT(dirty); - - /* M/S=music speech switch code */ - if (*music != ((blk & 0x0008) >> 3)) { - *music = (blk & 0x0008) >> 3; - *dirty = fm_true; /* yes, we got new music code */ - } else { - *dirty = fm_false; /* music is the same as last one */ - } - - WCN_DBG(FM_INF | RDSC, "Music=%d, %s\n", (fm_s32) *music, *dirty ? "new" : "old"); - return ret; -} - -/* - * rds_g0_ps_addr_get - * To get ps addr form blockB, blkB b0~b1 - * If success return 0, else return error code -*/ -static fm_s32 rds_g0_ps_addr_get(fm_u16 blkB, fm_u8 *addr) -{ - FMR_ASSERT(addr); - *addr = (fm_u8) blkB & 0x03; - - WCN_DBG(FM_INF | RDSC, "addr=0x%02x\n", *addr); - return 0; -} - -/* - * rds_g0_di_flag_get - * To get DI segment flag form blockB, blkB b2 - * If success return 0, else return error code -*/ -static fm_s32 rds_g0_di_flag_get(fm_u16 blkB, fm_u8 *flag) -{ - FMR_ASSERT(flag); - *flag = (fm_u8) ((blkB & 0x0004) >> 2); - - WCN_DBG(FM_INF | RDSC, "flag=0x%02x\n", *flag); - return 0; -} - -static fm_s32 rds_g0_ps_get(fm_u16 crc, fm_u16 blkD, fm_u8 addr, fm_u8 *buf) -{ -/* fm_bool valid = fm_false; */ - fm_s32 idx = 0; - - FMR_ASSERT(buf); - - /* ps segment addr rang 0~3 */ - if (addr > 0x03) { - WCN_DBG(FM_ERR | RDSC, "addr invalid(0x%02x)\n", addr); - return -FM_EPARA; - } else { - idx = 2 * addr; - } - - buf[idx] = blkD >> 8; - buf[idx + 1] = blkD & 0xFF; -#if 0 - rds_checksum_check(crc, FM_RDS_GDBK_IND_D, &valid); - - if (valid == fm_true) { - buf[idx] = blkD >> 8; - buf[idx + 1] = blkD & 0xFF; - } else { - WCN_DBG(FM_ERR | RDSC, "ps crc check err\n"); - return -FM_ECRC; - } -#endif - - WCN_DBG(FM_NTC | RDSC, "PS:addr[%02x]:0x%02x 0x%02x\n", addr, buf[idx], buf[idx + 1]); - return 0; -} - -/* - * rds_g0_ps_cmp - * this function is the most importent flow for PS parsing - * 1.Compare fresh buf with once buf per byte, if eque copy this byte to twice buf, else copy it to once buf - * 2.Check wether we got a full segment - * If success return 0, else return error code -*/ -static fm_s32 rds_g0_ps_cmp(fm_u8 addr, fm_u16 cbc, fm_u8 *fresh, - fm_u8 *once, fm_u8 *twice, /*fm_bool *valid, */ fm_u8 *bm) -{ - fm_s32 ret = 0, indx; - /* fm_s32 i = 0; */ - /* fm_s32 j = 0; */ - /* fm_s32 cnt = 0; */ - fm_u8 AF_H, AF_L, PS_Num; - /* fm_u8 corrBitCnt_BlkB, corrBitCnt_BlkD; */ - static fm_s8 Pre_PS_Num = -1; - - FMR_ASSERT(fresh); - FMR_ASSERT(once); - FMR_ASSERT(twice); - - if (addr > 3) { /* ps limited in 8 chars */ - WCN_DBG(FM_NTC | RDSC, "PS Address error, addr=%x\n", addr); - return -1; - } - - /* j = 2; // PS segment width */ - PS_Num = addr; - /* corrBitCnt_BlkB = rds_cbc_get(cbc, RDS_BLK_B); */ - /* corrBitCnt_BlkD = rds_cbc_get(cbc, RDS_BLK_D); */ - - AF_H = once[2 * PS_Num]; - AF_L = once[2 * PS_Num + 1]; - if ((AF_H == fresh[2 * PS_Num]) && (AF_L == fresh[2 * PS_Num + 1])) { - twice[2 * PS_Num] = once[2 * PS_Num]; - twice[2 * PS_Num + 1] = once[2 * PS_Num + 1]; - *bm |= 1 << PS_Num; - } else { - if (PS_Num - Pre_PS_Num > 1) { - for (indx = Pre_PS_Num + 1; indx < PS_Num; indx++) { - *bm &= ~(1 << indx); - once[2 * indx] = 0x00; - once[2 * indx + 1] = 0x00; - twice[2 * indx] = 0x00; - twice[2 * indx + 1] = 0x00; - } - } else if (PS_Num - Pre_PS_Num < 1) { - for (indx = 0; indx < PS_Num; indx++) { - *bm &= ~(1 << indx); - once[2 * indx] = 0x00; - once[2 * indx + 1] = 0x00; - twice[2 * indx] = 0x00; - twice[2 * indx + 1] = 0x00; - } - } - - if ((once[2 * PS_Num] != 0) || (once[2 * PS_Num + 1] != 0)) { - for (indx = PS_Num; indx < 4; indx++) { - *bm &= ~(1 << indx); - } - } - /* if((corrBitCnt_BlkB == 0) && (corrBitCnt_BlkD == 0)) */ - /* ALPS00523685:6627 CBC sometime is unreliable */ -#ifdef RDS_CBC_DEPENDENCY - if (cbc == 0) { - *bm |= 1 << PS_Num; - once[2 * PS_Num] = fresh[2 * PS_Num]; - once[2 * PS_Num + 1] = fresh[2 * PS_Num + 1]; - twice[2 * PS_Num] = fresh[2 * PS_Num]; - twice[2 * PS_Num + 1] = fresh[2 * PS_Num + 1]; - } else -#endif - { - once[2 * PS_Num] = fresh[2 * PS_Num]; - once[2 * PS_Num + 1] = fresh[2 * PS_Num + 1]; - } - } - - Pre_PS_Num = PS_Num; -#if 0 - if (rds_cbc_get(cbc, RDS_BLK_D) == 0) { - once[j * addr] = fresh[j * addr]; - once[j * addr + 1] = fresh[j * addr + 1]; - } - if ((once[j * addr] == fresh[j * addr]) && (once[j * addr + 1] == fresh[j * addr + 1])) { - twice[j * addr] = once[j * addr]; - twice[j * addr + 1] = once[j * addr + 1]; - *valid = fm_true; - } else { - once[j * addr] = fresh[j * addr]; - once[j * addr + 1] = fresh[j * addr + 1]; - *valid = fm_false; - } -#endif -#if 0 - for (i = 0; i < j; i++) { - if (fresh[j * addr + i] == once[j * addr + i]) { - twice[j * addr + i] = once[j * addr + i]; /* get the same byte 2 times */ - cnt++; - } else { - once[j * addr + i] = fresh[j * addr + i]; /* use new val */ - } - } - - /* check if we got a valid segment */ - if (cnt == j) { - *valid = fm_true; - } else { - *valid = fm_false; - } -#endif - /* WCN_DBG(FM_NTC | RDSC, "PS seg=%s\n", *valid == fm_true ? "fm_true" : "fm_false"); */ - WCN_DBG(FM_NTC | RDSC, "bitmap=%x\n", *bm); - WCN_DBG(FM_NTC | RDSC, "PS[1]=%x %x %x %x %x %x %x %x\n", once[0], once[1], once[2], - once[3], once[4], once[5], once[6], once[7]); - WCN_DBG(FM_NTC | RDSC, "PS[2]=%x %x %x %x %x %x %x %x\n", twice[0], twice[1], twice[2], - twice[3], twice[4], twice[5], twice[6], twice[7]); - return ret; -} - -struct rds_bitmap { - fm_u16 bm; - fm_s32 cnt; - fm_s32 max_addr; - fm_u16(*bm_get) (struct rds_bitmap *thiz); - fm_s32(*bm_cnt_get) (struct rds_bitmap *thiz); - fm_s32(*bm_get_pos) (struct rds_bitmap *thiz); - fm_s32(*bm_clr) (struct rds_bitmap *thiz); - fm_s32(*bm_cmp) (struct rds_bitmap *thiz, struct rds_bitmap *that); - fm_s32(*bm_set) (struct rds_bitmap *thiz, fm_u8 addr); -}; - -static fm_u16 rds_bm_get(struct rds_bitmap *thiz) -{ - return thiz->bm; -} - -static fm_s32 rds_bm_cnt_get(struct rds_bitmap *thiz) -{ - return thiz->cnt; -} - -#define FM_RDS_USE_SOLUTION_B - -static fm_s32 rds_bm_get_pos(struct rds_bitmap *thiz) -{ - fm_s32 i = thiz->max_addr; - fm_s32 j; - - j = 0; - - while (!(thiz->bm & (1 << i)) && (i > -1)) { - i--; - } - -#ifdef FM_RDS_USE_SOLUTION_B - for (j = i; j >= 0; j--) { - if (!(thiz->bm & (1 << j))) { - WCN_DBG(FM_NTC | RDSC, "uncomplete msg 0x%04x, delete it\n", thiz->bm); - return -1; - } - } -#endif - - return i; -} - -static fm_s32 rds_bm_clr(struct rds_bitmap *thiz) -{ - thiz->bm = 0x0000; - thiz->cnt = 0; - return 0; -} - -static fm_s32 rds_bm_cmp(struct rds_bitmap *bitmap1, struct rds_bitmap *bitmap2) -{ - return (fm_s32) (bitmap1->bm - bitmap2->bm); -} - -static fm_s32 rds_bm_set(struct rds_bitmap *thiz, fm_u8 addr) -{ - struct rds_bitmap bm_old; - - /* text segment addr rang */ - if (addr > thiz->max_addr) { - WCN_DBG(FM_ERR | RDSC, "addr invalid(0x%02x)\n", addr); - return -FM_EPARA; - } - - bm_old.bm = thiz->bm; - thiz->bm |= (1 << addr); /* set bitmap */ - - if (!rds_bm_cmp(&bm_old, thiz)) { - thiz->cnt++; /* multi get a segment */ - } else if (thiz->cnt > 0) { - thiz->cnt--; - } - - return 0; -} - - -/* - * rds_g2_rt_addr_get - * To get rt addr form blockB - * If success return 0, else return error code -*/ -static fm_s32 rds_g2_rt_addr_get(fm_u16 blkB, fm_u8 *addr) -{ - fm_s32 ret = 0; - - FMR_ASSERT(addr); - *addr = (fm_u8) blkB & 0x0F; - - WCN_DBG(FM_INF | RDSC, "addr=0x%02x\n", *addr); - return ret; -} - -static fm_s32 rds_g2_txtAB_get(fm_u16 blk, fm_u8 *txtAB, fm_bool *dirty) -{ - fm_s32 ret = 0; - static fm_bool once_dirty = fm_false; - - FMR_ASSERT(txtAB); - FMR_ASSERT(dirty); - - *dirty = fm_false; - if (*txtAB != ((blk & 0x0010) >> 4)) { - if (once_dirty) { - *txtAB = (blk & 0x0010) >> 4; - *dirty = fm_true; /* yes, we got new txtAB code */ - once_dirty = fm_false; - WCN_DBG(FM_NTC | RDSC, "changed! txtAB=%d\n", *txtAB); - return ret; - } - once_dirty = fm_true; - } else { - once_dirty = fm_false; /* txtAB is the same as last one */ - } - - WCN_DBG(FM_INF | RDSC, "txtAB=%d, %s\n", *txtAB, *dirty ? "new" : "old"); - return ret; -} - -static fm_s32 rds_g2_rt_get(fm_u16 crc, fm_u8 subtype, fm_u16 blkC, fm_u16 blkD, fm_u8 addr, - fm_u8 *buf) -{ - fm_s32 ret = 0; - fm_bool valid = fm_false; - fm_s32 idx = 0; - - FMR_ASSERT(buf); - - /* text segment addr rang 0~15 */ - if (addr > 0x0F) { - WCN_DBG(FM_ERR | RDSC, "addr invalid(0x%02x)\n", addr); - ret = -FM_EPARA; - return ret; - } - - switch (subtype) { - case RDS_GRP_VER_A: - idx = 4 * addr; - ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_C | FM_RDS_GDBK_IND_D, &valid); - - if (valid == fm_true) { - buf[idx] = blkC >> 8; - buf[idx + 1] = blkC & 0xFF; - buf[idx + 2] = blkD >> 8; - buf[idx + 3] = blkD & 0xFF; - } else { - WCN_DBG(FM_ERR | RDSC, "rt crc check err\n"); - ret = -FM_ECRC; - } - - break; - case RDS_GRP_VER_B: - idx = 2 * addr; - ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_D, &valid); - - if (valid == fm_true) { - buf[idx] = blkD >> 8; - buf[idx + 1] = blkD & 0xFF; - } else { - WCN_DBG(FM_ERR | RDSC, "rt crc check err\n"); - ret = -FM_ECRC; - } - - break; - default: - break; - } - - WCN_DBG(FM_NTC | RDSC, "fresh addr[%02x]:0x%02x%02x 0x%02x%02x\n", addr, buf[idx], - buf[idx + 1], buf[idx + 2], buf[idx + 3]); - return ret; -} - -static fm_s32 rds_g2_rt_get_len(fm_u8 subtype, fm_s32 pos, fm_s32 *len) -{ - fm_s32 ret = 0; - - FMR_ASSERT(len); - - if (subtype == RDS_GRP_VER_A) { - *len = 4 * (pos + 1); - } else { - *len = 2 * (pos + 1); - } - - return ret; -} - -/* - * rds_g2_rt_cmp - * this function is the most importent flow for RT parsing - * 1.Compare fresh buf with once buf per byte, if eque copy this byte to twice buf, else copy it to once buf - * 2.Check wether we got a full segment, for typeA if copyed 4bytes to twice buf, for typeB 2bytes copyed to twice buf - * 3.Check wether we got the end of RT, if we got 0x0D - * 4.If we got the end, then caculate the RT lenth - * If success return 0, else return error code -*/ -static fm_s32 rds_g2_rt_cmp(fm_u8 addr, fm_u16 cbc, fm_u8 subtype, fm_u8 *fresh, - fm_u8 *once, fm_u8 *twice, - fm_bool *valid /*, fm_bool *end, fm_s32 *len */) -{ - fm_s32 ret = 0; - fm_s32 i = 0; - fm_s32 j = 0; - fm_s32 cnt = 0; - - FMR_ASSERT(fresh); - FMR_ASSERT(once); - FMR_ASSERT(twice); - FMR_ASSERT(valid); -/* FMR_ASSERT(end); */ - - j = (subtype == RDS_GRP_VER_A) ? 4 : 2; /* RT segment width */ - - if (subtype == RDS_GRP_VER_A) { - /* if (rds_cbc_get(cbc, RDS_BLK_C) == 0) */ -#ifdef RDS_CBC_DEPENDENCY - if (cbc == 0) -#endif - { - once[j * addr + 0] = fresh[j * addr + 0]; - once[j * addr + 1] = fresh[j * addr + 1]; - /* } */ - - /* if (rds_cbc_get(cbc, RDS_BLK_D) == 0) */ - /* { */ - once[j * addr + 2] = fresh[j * addr + 2]; - once[j * addr + 3] = fresh[j * addr + 3]; - } - } else if (subtype == RDS_GRP_VER_B) { - /* if (rds_cbc_get(cbc, RDS_BLK_D) == 0) */ -#ifdef RDS_CBC_DEPENDENCY - if (cbc == 0) -#endif - { - once[j * addr + 0] = fresh[j * addr + 0]; - once[j * addr + 1] = fresh[j * addr + 1]; - } - } -#ifdef RDS_CBC_DEPENDENCY - for (i = 0; i < j; i++) { - if (fresh[j * addr + i] == once[j * addr + i]) { - twice[j * addr + i] = once[j * addr + i]; /* get the same byte 2 times */ - cnt++; - WCN_DBG(FM_NTC | RDSC, "twice=%d\n", j * addr + i); - } else { - once[j * addr + i] = fresh[j * addr + i]; /* use new val */ - WCN_DBG(FM_NTC | RDSC, "once=%d\n", j * addr + i); - } - } -#else - for (i = 0; i < j; i++) { - if (twice[j * addr + i] == once[j * addr + i]) { - cnt++; - WCN_DBG(FM_NTC | RDSC, "twice=%d\n", j * addr + i); - } else { - twice[j * addr + i] = once[j * addr + i]; - WCN_DBG(FM_NTC | RDSC, "once=%d\n", j * addr + i); - } - } -#endif - - /* check if we got a valid segment 4bytes for typeA, 2bytes for typeB */ - if (cnt == j) { - *valid = fm_true; - } else { - *valid = fm_false; - } - - WCN_DBG(FM_INF | RDSC, "RT seg=%s\n", *valid == fm_true ? "fm_true" : "fm_false"); -/* WCN_DBG(FM_INF | RDSC, "RT end=%s\n", *end == fm_true ? "fm_true" : "fm_false"); */ -/* WCN_DBG(FM_INF | RDSC, "RT len=%d\n", *len); */ - return ret; -} - -/* - * rds_g2_rt_check_end - * check 0x0D end flag - * If we got the end, then caculate the RT lenth - * If success return 0, else return error code -*/ -static fm_s32 rds_g2_rt_check_end(fm_u8 addr, fm_u8 subtype, fm_u8 *twice, fm_bool *end) -{ - fm_s32 i = 0; - fm_s32 j = 0; - - FMR_ASSERT(twice); - FMR_ASSERT(end); - - j = (subtype == RDS_GRP_VER_A) ? 4 : 2; /* RT segment width */ - *end = fm_false; - - for (i = 0; i < j; i++) { - /* if we got 0x0D twice, it means a RT end */ - if (twice[j * addr + i] == 0x0D) { - *end = fm_true; - WCN_DBG(FM_NTC | RDSC, "get 0x0D\n"); - break; - } - } - - return 0; -} - -static fm_s32 rds_retrieve_g0_af(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - static fm_s16 preAF_Num; - fm_u8 indx, indx2, AF_H, AF_L, num; - fm_s32 ret = 0; - fm_bool valid = fm_false; - fm_bool dirty = fm_false; - fm_u16 *event = &pstRDSData->event_status; - fm_u32 *flag = &pstRDSData->RDSFlag.flag_status; - -/* ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_D, &valid); */ - -/* if (valid == fm_false) { */ -/* WCN_DBG(FM_WAR | RDSC, "Group0 BlockD crc err\n"); */ -/* return -FM_ECRC; */ -/* } */ - - ret = rds_g0_ta_get(block_data[1], &pstRDSData->RDSFlag.TA, &dirty); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get ta failed[ret=%d]\n", ret); - } else if (dirty == fm_true) { - ret = rds_event_set(event, RDS_EVENT_FLAGS); /* yes, we got new TA code */ - ret = rds_flag_set(flag, RDS_FLAG_IS_TA); - } - - ret = rds_g0_music_get(block_data[1], &pstRDSData->RDSFlag.Music, &dirty); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get music failed[ret=%d]\n", ret); - } else if (dirty == fm_true) { - ret = rds_event_set(event, RDS_EVENT_FLAGS); /* yes, we got new MUSIC code */ - ret = rds_flag_set(flag, RDS_FLAG_IS_MUSIC); - } - - if ((pstRDSData->Switch_TP) && (pstRDSData->RDSFlag.TP) && !(pstRDSData->RDSFlag.TA)) { - ret = rds_event_set(event, RDS_EVENT_TAON_OFF); - } - - if (!SubType) { - /* Type A */ - ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_C, &valid); - - if (valid == fm_false) { - WCN_DBG(FM_WAR | RDSC, "Group0 BlockC crc err\n"); - return -FM_ECRC; - } else { - AF_H = (block_data[2] & 0xFF00) >> 8; - AF_L = block_data[2] & 0x00FF; - - if ((AF_H > 224) && (AF_H < 250)) { - /* Followed AF Number, see RDS spec Table 11, valid(224-249) */ - WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 AF_H:%d, AF_L:%d\n", AF_H, - AF_L); - preAF_Num = AF_H - 224; /* AF Number */ - - if (preAF_Num != pstRDSData->AF_Data.AF_Num) { - pstRDSData->AF_Data.AF_Num = preAF_Num; - pstRDSData->AF_Data.isAFNum_Get = 0; - } else { - /* Get the same AFNum two times */ - pstRDSData->AF_Data.isAFNum_Get = 1; - } - - if ((AF_L < 205) && (AF_L > 0)) { - /* See RDS Spec table 10, valid VHF */ - pstRDSData->AF_Data.AF[0][0] = AF_L + 875; /* convert to 100KHz */ -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT - pstRDSData->AF_Data.AF[0][0] *= 10; -#endif - WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 AF[0][0]:%d\n", - pstRDSData->AF_Data.AF[0][0]); - - if ((pstRDSData->AF_Data.AF[0][0]) != - (pstRDSData->AF_Data.AF[1][0])) { - pstRDSData->AF_Data.AF[1][0] = - pstRDSData->AF_Data.AF[0][0]; - } else { - if (pstRDSData->AF_Data.AF[1][0] != rds_get_freq()) - pstRDSData->AF_Data.isMethod_A = 1; - else - pstRDSData->AF_Data.isMethod_A = 0; - } - - WCN_DBG(FM_NTC | RDSC, - "RetrieveGroup0 isAFNum_Get:%d, isMethod_A:%d\n", - pstRDSData->AF_Data.isAFNum_Get, - pstRDSData->AF_Data.isMethod_A); - - /* only one AF handle */ - if ((pstRDSData->AF_Data.isAFNum_Get) - && (pstRDSData->AF_Data.AF_Num == 1)) { - pstRDSData->AF_Data.Addr_Cnt = 0xFF; - pstRDSData->event_status |= RDS_EVENT_AF_LIST; - WCN_DBG(FM_NTC | RDSC, - "RetrieveGroup0 RDS_EVENT_AF_LIST update\n"); - } - } - } else if ((pstRDSData->AF_Data.isAFNum_Get) - && (pstRDSData->AF_Data.Addr_Cnt != 0xFF)) { - /* AF Num correct */ - num = pstRDSData->AF_Data.AF_Num; - num = (num > 25) ? 25 : num; - num = num >> 1; - WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 +num:%d\n", num); - - /* Put AF freq fm_s32o buffer and check if AF freq is repeat again */ - for (indx = 1; indx < (num + 1); indx++) { - if ((AF_H == (pstRDSData->AF_Data.AF[0][2 * indx - 1])) - && (AF_L == (pstRDSData->AF_Data.AF[0][2 * indx]))) { - WCN_DBG(FM_ERR | RDSC, - "RetrieveGroup0 AF same as indx:%d\n", - indx); - break; - } else if (!(pstRDSData->AF_Data.AF[0][2 * indx - 1])) { - /* null buffer */ - pstRDSData->AF_Data.AF[0][2 * indx - 1] = AF_H + 875; /* convert to 100KHz */ - pstRDSData->AF_Data.AF[0][2 * indx] = AF_L + 875; - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT - pstRDSData->AF_Data.AF[0][2 * indx - 1] *= 10; - pstRDSData->AF_Data.AF[0][2 * indx] *= 10; -#endif - WCN_DBG(FM_NTC | RDSC, - "RetrieveGroup0 AF[0][%d]:%d, AF[0][%d]:%d\n", - 2 * indx - 1, - pstRDSData->AF_Data.AF[0][2 * indx - 1], - 2 * indx, - pstRDSData->AF_Data.AF[0][2 * indx]); - break; - } - } - - num = pstRDSData->AF_Data.AF_Num; - num = (num > 25) ? 25 : num; - WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 ++num:%d\n", num); - - if (num > 0) { - if ((pstRDSData->AF_Data.AF[0][num - 1]) != 0) { - num = num >> 1; - WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 +++num:%d\n", - num); - - /* arrange frequency from low to high:start */ - for (indx = 1; indx < num; indx++) { - for (indx2 = indx + 1; indx2 < (num + 1); - indx2++) { - AF_H = - pstRDSData->AF_Data.AF[0][2 * - indx - - 1]; - AF_L = - pstRDSData->AF_Data.AF[0][2 * - indx]; - - if (AF_H > - (pstRDSData->AF_Data. - AF[0][2 * indx2 - 1])) { - pstRDSData->AF_Data. - AF[0][2 * indx - 1] = - pstRDSData->AF_Data. - AF[0][2 * indx2 - 1]; - pstRDSData->AF_Data. - AF[0][2 * indx] = - pstRDSData->AF_Data. - AF[0][2 * indx2]; - pstRDSData->AF_Data. - AF[0][2 * indx2 - 1] = - AF_H; - pstRDSData->AF_Data. - AF[0][2 * indx2] = AF_L; - } else if (AF_H == - (pstRDSData->AF_Data. - AF[0][2 * indx2 - 1])) { - if (AF_L > - (pstRDSData->AF_Data. - AF[0][2 * indx2])) { - pstRDSData->AF_Data. - AF[0][2 * indx - - 1] = - pstRDSData-> - AF_Data. - AF[0][2 * - indx2 - - 1]; - pstRDSData->AF_Data. - AF[0][2 * - indx] = - pstRDSData-> - AF_Data. - AF[0][2 * - indx2]; - pstRDSData->AF_Data. - AF[0][2 * - indx2 - - 1] = AF_H; - pstRDSData->AF_Data. - AF[0][2 * - indx2] = - AF_L; - } - } - } - } - - /* arrange frequency from low to high:end */ - /* compare AF buff0 and buff1 data:start */ - num = pstRDSData->AF_Data.AF_Num; - num = (num > 25) ? 25 : num; - indx2 = 0; - - for (indx = 0; indx < num; indx++) { - if ((pstRDSData->AF_Data.AF[1][indx]) == - (pstRDSData->AF_Data.AF[0][indx])) { - if (pstRDSData->AF_Data. - AF[1][indx] != 0) - indx2++; - } else - pstRDSData->AF_Data.AF[1][indx] = - pstRDSData->AF_Data.AF[0][indx]; - } - - WCN_DBG(FM_NTC | RDSC, - "RetrieveGroup0 indx2:%d, num:%d\n", indx2, - num); - - /* compare AF buff0 and buff1 data:end */ - if (indx2 == num) { - pstRDSData->AF_Data.Addr_Cnt = 0xFF; - pstRDSData->event_status |= - RDS_EVENT_AF_LIST; - WCN_DBG(FM_NTC | RDSC, - "RetrieveGroup0 AF_Num:%d\n", - pstRDSData->AF_Data.AF_Num); - - for (indx = 0; indx < num; indx++) { - if ((pstRDSData->AF_Data. - AF[1][indx]) == 0) { - pstRDSData->AF_Data. - Addr_Cnt = 0x0F; - pstRDSData->event_status &= - (~RDS_EVENT_AF_LIST); - } - } - } else - pstRDSData->AF_Data.Addr_Cnt = 0x0F; - } - } - } - } - } - - return ret; -} - -static fm_s32 rds_retrieve_g0_di(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - fm_u8 DI_Code, DI_Flag; - fm_s32 ret = 0; -/* fm_bool valid = fm_false; */ - - fm_u16 *event = &pstRDSData->event_status; - fm_u32 *flag = &pstRDSData->RDSFlag.flag_status; - - /* parsing Program service name segment (in BlockD) */ -/* ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_D, &valid); */ - -/* if (valid == fm_false) { */ -/* WCN_DBG(FM_WAR | RDSC, "Group0 BlockD crc err\n"); */ -/* return -FM_ECRC; */ -/* } */ - - rds_g0_ps_addr_get(block_data[1], &DI_Code); - rds_g0_di_flag_get(block_data[1], &DI_Flag); - - switch (DI_Code) { - case 3: - - if (pstRDSData->RDSFlag.Stereo != DI_Flag) { - pstRDSData->RDSFlag.Stereo = DI_Flag; - ret = rds_event_set(event, RDS_EVENT_FLAGS); - ret = rds_flag_set(flag, RDS_FLAG_IS_STEREO); - } - - break; - case 2: - - if (pstRDSData->RDSFlag.Artificial_Head != DI_Flag) { - pstRDSData->RDSFlag.Artificial_Head = DI_Flag; - ret = rds_event_set(event, RDS_EVENT_FLAGS); - ret = rds_flag_set(flag, RDS_FLAG_IS_ARTIFICIAL_HEAD); - } - - break; - case 1: - - if (pstRDSData->RDSFlag.Compressed != DI_Flag) { - pstRDSData->RDSFlag.Compressed = DI_Flag; - ret = rds_event_set(event, RDS_EVENT_FLAGS); - ret = rds_flag_set(flag, RDS_FLAG_IS_COMPRESSED); - } - - break; - case 0: - - if (pstRDSData->RDSFlag.Dynamic_PTY != DI_Flag) { - pstRDSData->RDSFlag.Dynamic_PTY = DI_Flag; - ret = rds_event_set(event, RDS_EVENT_FLAGS); - ret = rds_flag_set(flag, RDS_FLAG_IS_DYNAMIC_PTY); - } - - break; - default: - break; - } - - return ret; -} - -static fm_s32 rds_retrieve_g0_ps(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - fm_u8 ps_addr; - fm_s32 ret = 0, i, num; - fm_bool valid = fm_false; -/* fm_s32 pos = 0; */ - static struct fm_state_machine ps_sm = { - .state = RDS_PS_START, - .state_get = fm_state_get, - .state_set = fm_state_set, - }; -#if 0 - static struct rds_bitmap ps_bm = { - .bm = 0, - .cnt = 0, - .max_addr = 0x03, - .bm_get = rds_bm_get, - .bm_cnt_get = rds_bm_cnt_get, - .bm_set = rds_bm_set, - .bm_get_pos = rds_bm_get_pos, - .bm_clr = rds_bm_clr, - .bm_cmp = rds_bm_cmp, - }; -#endif - fm_u16 *event = &pstRDSData->event_status; - - /* parsing Program service name segment (in BlockD) */ - ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_D, &valid); - - if (valid == fm_false) { - WCN_DBG(FM_WAR | RDSC, "Group0 BlockD crc err\n"); - return -FM_ECRC; - } - - rds_g0_ps_addr_get(block_data[1], &ps_addr); - - /* PS parsing state machine run */ - while (1) { - switch (STATE_GET(&ps_sm)) { - case RDS_PS_START: - - if (rds_g0_ps_get - (block_data[4], block_data[3], ps_addr, pstRDSData->PS_Data.PS[0])) { - STATE_SET(&ps_sm, RDS_PS_FINISH); /* if CRC error, we should not do parsing */ - break; - } - - rds_g0_ps_cmp(ps_addr, block_data[5], pstRDSData->PS_Data.PS[0], - pstRDSData->PS_Data.PS[1], pstRDSData->PS_Data.PS[2], - /*&valid, */ &pstRDSData->PS_Data.Addr_Cnt); - - /* if (valid == fm_true) { */ - /* ps_bm.bm_set(&ps_bm, ps_addr); */ - /* } */ - - STATE_SET(&ps_sm, RDS_PS_DECISION); - break; - case RDS_PS_DECISION: - - if (pstRDSData->PS_Data.Addr_Cnt == 0x000F) /* get max 8 chars */ - /* ps shouldn't check bm_cnt */ - /* || (ps_bm.bm_cnt_get(&ps_bm) > RDS_RT_MULTI_REV_TH)) { //repeate many times, but no end char get */ - { - /* pos = ps_bm.bm_get_pos(&ps_bm); */ - STATE_SET(&ps_sm, RDS_PS_GETLEN); - } else { - STATE_SET(&ps_sm, RDS_PS_FINISH); - } - - break; - case RDS_PS_GETLEN: - - /* if (pos == ps_bm.max_addr) */ - { - num = 0; - WCN_DBG(FM_NTC | RDSC, "PS[3]=%x %x %x %x %x %x %x %x\n", - pstRDSData->PS_Data.PS[3][0], - pstRDSData->PS_Data.PS[3][1], - pstRDSData->PS_Data.PS[3][2], - pstRDSData->PS_Data.PS[3][3], - pstRDSData->PS_Data.PS[3][4], - pstRDSData->PS_Data.PS[3][5], - pstRDSData->PS_Data.PS[3][6], pstRDSData->PS_Data.PS[3][7]); - for (i = 0; i < 8; i++) /* compare with last PS. */ - { - if (pstRDSData->PS_Data.PS[3][i] == - pstRDSData->PS_Data.PS[2][i]) { - num++; - } - } - if (num != 8) { - num = 0; - for (i = 0; i < 8; i++) { - /* even ps=0x20 and bitmap=0xF, send event to host to cover last ps. */ - if (/*(pstRDSData->PS_Data.PS[2][i]==0x20)|| */ - (pstRDSData->PS_Data.PS[2][i] == 0x0)) { - num++; - } - } - if (num != 8) { - fm_memcpy(pstRDSData->PS_Data.PS[3], - pstRDSData->PS_Data.PS[2], 8); - rds_event_set(event, RDS_EVENT_PROGRAMNAME); /* yes we got a new PS */ - WCN_DBG(FM_NTC | RDSC, "Yes, get an PS!\n"); - } else { - /* clear bitmap */ - pstRDSData->PS_Data.Addr_Cnt = 0; - } - } else { - /* if px3==ps2,clear bitmap */ - pstRDSData->PS_Data.Addr_Cnt = 0; - /* clear buf */ - fm_memset(pstRDSData->PS_Data.PS[0], 0x00, 8); - fm_memset(pstRDSData->PS_Data.PS[1], 0x00, 8); - fm_memset(pstRDSData->PS_Data.PS[2], 0x00, 8); - } - } -#if 0 - ps_bm.bm_clr(&ps_bm); - /* clear buf */ - fm_memset(pstRDSData->PS_Data.PS[0], 0x20, 8); - fm_memset(pstRDSData->PS_Data.PS[1], 0x20, 8); - fm_memset(pstRDSData->PS_Data.PS[2], 0x20, 8); -#endif - STATE_SET(&ps_sm, RDS_PS_FINISH); - break; - case RDS_PS_FINISH: - STATE_SET(&ps_sm, RDS_PS_START); - goto out; - break; - default: - break; - } - } - - out: - return ret; -} - -static fm_s32 rds_retrieve_g0(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - fm_s32 ret = 0; - - ret = rds_retrieve_g0_af(block_data, SubType, pstRDSData); - - if (ret) { - return ret; - } - - ret = rds_retrieve_g0_di(block_data, SubType, pstRDSData); - - if (ret) { - return ret; - } - - ret = rds_retrieve_g0_ps(block_data, SubType, pstRDSData); - - if (ret) { - return ret; - } - - return ret; -} - -static fm_s32 rds_retrieve_g1(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - fm_u8 variant_code = (block_data[2] & 0x7000) >> 12; - fm_s32 ret = 0; - - if (variant_code == 0) { - pstRDSData->Extend_Country_Code = (fm_u8) block_data[2] & 0xFF; - WCN_DBG(FM_DBG | RDSC, "Extend_Country_Code:%d\n", pstRDSData->Extend_Country_Code); - } else if (variant_code == 3) { - pstRDSData->Language_Code = block_data[2] & 0xFFF; - WCN_DBG(FM_DBG | RDSC, "Language_Code:%d\n", pstRDSData->Language_Code); - } - - pstRDSData->Radio_Page_Code = block_data[1] & 0x001F; - pstRDSData->Program_Item_Number_Code = block_data[3]; - - return ret; -} - -static fm_s32 rds_retrieve_g2(fm_u16 *source, fm_u8 subtype, rds_t *target) -{ - fm_s32 ret = 0; - fm_u16 crc, cbc; - fm_u16 blkA, blkB, blkC, blkD; - fm_u8 *fresh, *once, *twice, *display; - fm_u16 *event; - fm_u32 *flag; - fm_u16 i = 0; - static struct fm_state_machine rt_sm = { - .state = RDS_RT_START, - .state_get = fm_state_get, - .state_set = fm_state_set, - }; - static struct rds_bitmap rt_bm = { - .bm = 0, - .cnt = 0, - .max_addr = 0xF, - .bm_get = rds_bm_get, - .bm_cnt_get = rds_bm_cnt_get, - .bm_set = rds_bm_set, - .bm_get_pos = rds_bm_get_pos, - .bm_clr = rds_bm_clr, - .bm_cmp = rds_bm_cmp, - }; - fm_u8 rt_addr = 0; - fm_bool txtAB_change = fm_false; /* text AB flag 0 --> 1 or 1-->0 meas new RT incoming */ - fm_bool txt_end = fm_false; /* 0x0D means text end */ - fm_bool seg_ok = 0; - fm_s32 pos = 0; - fm_s32 rt_len = 0, indx = 0, invalid_cnt = 0; - fm_s32 bufsize = 0; - - FMR_ASSERT(source); - FMR_ASSERT(target); - /* source */ - blkA = source[0]; - blkB = source[1]; - blkC = source[2]; - blkD = source[3]; - crc = source[4]; - cbc = source[5]; - /* target */ - fresh = target->RT_Data.TextData[0]; - once = target->RT_Data.TextData[1]; - twice = target->RT_Data.TextData[2]; - display = target->RT_Data.TextData[3]; - event = &target->event_status; - flag = &target->RDSFlag.flag_status; - bufsize = sizeof(target->RT_Data.TextData[0]); - rt_bm.bm = target->RT_Data.Addr_Cnt; - - /* get basic info: addr, txtAB */ - if (rds_g2_rt_addr_get(blkB, &rt_addr)) - return ret; - - if (rds_g2_txtAB_get(blkB, &target->RDSFlag.Text_AB, &txtAB_change)) - return ret; - if (txtAB_change == fm_true) { - /* clear buf */ - fm_memset(fresh, 0x20, bufsize); - fm_memset(once, 0x20, bufsize); - fm_memset(twice, 0x20, bufsize); - rt_bm.bm_clr(&rt_bm); - } - /* RT parsing state machine run */ - while (1) { - switch (STATE_GET(&rt_sm)) { - case RDS_RT_START: - { -#if 0 - if (txtAB_change == fm_true) { - STATE_SET(&rt_sm, RDS_RT_DECISION); - } else -#endif - { - if (rds_g2_rt_get(crc, subtype, blkC, blkD, rt_addr, fresh) - == 0) { - /* STATE_SET(&rt_sm, RDS_RT_FINISH); //if CRC error, we should not do parsing */ - /* break; */ - rds_g2_rt_cmp(rt_addr, cbc, subtype, fresh, once, - twice, - &seg_ok /*, &txt_end, &rt_len */); - - if (seg_ok == fm_true) { - rt_bm.bm_set(&rt_bm, rt_addr); - } else /* clear bitmap of rt_addr */ - { - rt_bm.bm &= ~(1 << rt_addr); - } - } - WCN_DBG(FM_NTC | RDSC, "bitmap=0x%04x, bmcnt=%d\n", - rt_bm.bm, rt_bm.cnt); - rds_g2_rt_check_end(rt_addr, subtype, twice, &txt_end); - - STATE_SET(&rt_sm, RDS_RT_DECISION); - } - break; - } - case RDS_RT_DECISION: - { - if ((txt_end == fm_true) - || (rt_bm.bm_get(&rt_bm) == 0xFFFF) /* get max 64 chars */ - || (rt_bm.bm_cnt_get(&rt_bm) > RDS_RT_MULTI_REV_TH)) /* repeate many times, but no end char get */ - { - pos = rt_bm.bm_get_pos(&rt_bm); - rds_g2_rt_get_len(subtype, pos, &rt_len); - - if (pos == -1) { - STATE_SET(&rt_sm, RDS_RT_FINISH); - } else { - if (rt_addr == pos) { - STATE_SET(&rt_sm, RDS_RT_GETLEN); - } else if (pos > rt_addr) { - rt_bm.bm &= ~(1 << (rt_addr + 1)); - STATE_SET(&rt_sm, RDS_RT_FINISH); - } else - STATE_SET(&rt_sm, RDS_RT_FINISH); - } - - if (txt_end == fm_true) { - for (i = rt_addr + 1; i < rt_bm.max_addr; i++) { - rt_bm.bm &= ~(1 << i); - } - } - } else { - STATE_SET(&rt_sm, RDS_RT_FINISH); - } - - break; - } - case RDS_RT_GETLEN: - - if (rt_len > - 0 /*&& ((txt_end == fm_true) || (rt_bm.bm_get(&rt_bm) == 0xFFFF)) */) { - for (indx = 0; indx < rt_len; indx++) { - if (twice[indx] == 0x20) - invalid_cnt++; - } - if (invalid_cnt != rt_len) { - if (memcmp(display, twice, bufsize) != 0) { - fm_memcpy(display, twice, bufsize); - target->RT_Data.TextLength = rt_len; - rds_event_set(event, RDS_EVENT_LAST_RADIOTEXT); /* yes we got a new RT */ - WCN_DBG(FM_NTC | RDSC, "Yes, get an RT! [len=%d]\n", - rt_len); - } - rt_bm.bm_clr(&rt_bm); - /* clear buf */ - fm_memset(fresh, 0x20, bufsize); - fm_memset(once, 0x20, bufsize); - fm_memset(twice, 0x20, bufsize); - } else - WCN_DBG(FM_NTC | RDSC, "Get 0x20 RT %d\n", invalid_cnt); - } -#if 0 - if (txtAB_change == fm_true) { - txtAB_change = fm_false; - /* we need get new RT after show the old RT to the display */ - STATE_SET(&rt_sm, RDS_RT_START); - } else -#endif - { - STATE_SET(&rt_sm, RDS_RT_FINISH); - } - break; - case RDS_RT_FINISH: - STATE_SET(&rt_sm, RDS_RT_START); - goto out; - break; - default: - break; - } - } - - out: - target->RT_Data.Addr_Cnt = rt_bm.bm; - return ret; -} - -static fm_s32 rds_retrieve_g4(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - fm_u16 year, month, k = 0, D2, minute; - fm_u32 MJD, D1; - fm_s32 ret = 0; - WCN_DBG(FM_DBG | RDSC, "RetrieveGroup4 %d\n", SubType); - - if (!SubType) { - /* Type A */ - if ((block_data[4] & FM_RDS_GDBK_IND_C) && (block_data[4] & FM_RDS_GDBK_IND_D)) { - MJD = - (fm_u32) (((block_data[1] & 0x0003) << 15) + - ((block_data[2] & 0xFFFE) >> 1)); - year = (MJD * 100 - 1507820) / 36525; - month = (MJD * 10000 - 149561000 - 3652500 * year) / 306001; - - if ((month == 14) || (month == 15)) - k = 1; - - D1 = (fm_u32) ((36525 * year) / 100); - D2 = (fm_u16) ((306001 * month) / 10000); - pstRDSData->CT.Year = 1900 + year + k; - pstRDSData->CT.Month = month - 1 - k * 12; - pstRDSData->CT.Day = (fm_u16) (MJD - 14956 - D1 - D2); - pstRDSData->CT.Hour = - ((block_data[2] & 0x0001) << 4) + ((block_data[3] & 0xF000) >> 12); - minute = (block_data[3] & 0x0FC0) >> 6; - - if (block_data[3] & 0x0020) { - pstRDSData->CT.Local_Time_offset_signbit = 1; /* 0=+, 1=- */ - } - - pstRDSData->CT.Local_Time_offset_half_hour = block_data[3] & 0x001F; - - if (pstRDSData->CT.Minute != minute) { - pstRDSData->CT.Minute = (block_data[3] & 0x0FC0) >> 6; - pstRDSData->event_status |= RDS_EVENT_UTCDATETIME; - } - } - } - - return ret; -} - -static fm_s32 rds_retrieve_g14(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData) -{ - static fm_s16 preAFON_Num; - fm_u8 TP_ON, TA_ON, PI_ON, PS_Num, AF_H, AF_L, indx, indx2, num; - fm_s32 ret = 0; - WCN_DBG(FM_DBG | RDSC, "RetrieveGroup14 %d\n", SubType); - /* SubType = (*(block_data+1)&0x0800)>>11; */ - PI_ON = block_data[3]; - TP_ON = block_data[1] & 0x0010; - - if ((!SubType) && (block_data[4] & FM_RDS_GDBK_IND_C)) { - /* Type A */ - PS_Num = block_data[1] & 0x000F; - - if (PS_Num < 4) { - for (indx = 0; indx < 2; indx++) { - pstRDSData->PS_ON[2 * PS_Num] = block_data[2] >> 8; - pstRDSData->PS_ON[2 * PS_Num + 1] = block_data[2] & 0xFF; - } - } else if (PS_Num == 4) { - AF_H = (block_data[2] & 0xFF00) >> 8; - AF_L = block_data[2] & 0x00FF; - - if ((AF_H > 224) && (AF_H < 250)) { - /* Followed AF Number */ - pstRDSData->AFON_Data.isAFNum_Get = 0; - preAFON_Num = AF_H - 224; - - if (pstRDSData->AFON_Data.AF_Num != preAFON_Num) { - pstRDSData->AFON_Data.AF_Num = preAFON_Num; - } else - pstRDSData->AFON_Data.isAFNum_Get = 1; - - if (AF_L < 205) { - pstRDSData->AFON_Data.AF[0][0] = AF_L + 875; - - if ((pstRDSData->AFON_Data.AF[0][0]) != - (pstRDSData->AFON_Data.AF[1][0])) { - pstRDSData->AFON_Data.AF[1][0] = - pstRDSData->AFON_Data.AF[0][0]; - } else { - pstRDSData->AFON_Data.isMethod_A = 1; - } - } - } else if ((pstRDSData->AFON_Data.isAFNum_Get) - && ((pstRDSData->AFON_Data.Addr_Cnt) != 0xFF)) { - /* AF Num correct */ - num = pstRDSData->AFON_Data.AF_Num; - num = (num > 25) ? 25 : num; - num = num >> 1; - - /* Put AF freq fm_s32o buffer and check if AF freq is repeat again */ - for (indx = 1; indx < (num + 1); indx++) { - if ((AF_H == (pstRDSData->AFON_Data.AF[0][2 * indx - 1])) - && (AF_L == (pstRDSData->AFON_Data.AF[0][2 * indx]))) { - WCN_DBG(FM_NTC | RDSC, - "RetrieveGroup14 AFON same as indx:%d\n", - indx); - break; - } else if (!(pstRDSData->AFON_Data.AF[0][2 * indx - 1])) { - /* null buffer */ - pstRDSData->AFON_Data.AF[0][2 * indx - 1] = - AF_H + 875; - pstRDSData->AFON_Data.AF[0][2 * indx] = AF_L + 875; - break; - } - } - - num = pstRDSData->AFON_Data.AF_Num; - num = (num > 25) ? 25 : num; - if (num > 0) { - if ((pstRDSData->AFON_Data.AF[0][num - 1]) != 0) { - num = num >> 1; - - /* arrange frequency from low to high:start */ - for (indx = 1; indx < num; indx++) { - for (indx2 = indx + 1; indx2 < (num + 1); - indx2++) { - AF_H = - pstRDSData->AFON_Data.AF[0][2 * - indx - - - 1]; - AF_L = - pstRDSData->AFON_Data.AF[0][2 * - indx]; - - if (AF_H > - (pstRDSData->AFON_Data. - AF[0][2 * indx2 - 1])) { - pstRDSData->AFON_Data. - AF[0][2 * indx - 1] = - pstRDSData->AFON_Data. - AF[0][2 * indx2 - 1]; - pstRDSData->AFON_Data. - AF[0][2 * indx] = - pstRDSData->AFON_Data. - AF[0][2 * indx2]; - pstRDSData->AFON_Data. - AF[0][2 * indx2 - 1] = - AF_H; - pstRDSData->AFON_Data. - AF[0][2 * indx2] = AF_L; - } else if (AF_H == - (pstRDSData->AFON_Data. - AF[0][2 * indx2 - 1])) { - if (AF_L > - (pstRDSData->AFON_Data. - AF[0][2 * indx2])) { - pstRDSData-> - AFON_Data. - AF[0][2 * indx - - 1] = - pstRDSData-> - AFON_Data. - AF[0][2 * - indx2 - - 1]; - pstRDSData-> - AFON_Data. - AF[0][2 * - indx] = - pstRDSData-> - AFON_Data. - AF[0][2 * - indx2]; - pstRDSData-> - AFON_Data. - AF[0][2 * - indx2 - - 1] = AF_H; - pstRDSData-> - AFON_Data. - AF[0][2 * - indx2] = - AF_L; - } - } - } - } - - /* arrange frequency from low to high:end */ - /* compare AF buff0 and buff1 data:start */ - num = pstRDSData->AFON_Data.AF_Num; - num = (num > 25) ? 25 : num; - indx2 = 0; - - for (indx = 0; indx < num; indx++) { - if ((pstRDSData->AFON_Data.AF[1][indx]) == - (pstRDSData->AFON_Data.AF[0][indx])) { - if (pstRDSData->AFON_Data. - AF[1][indx] != 0) - indx2++; - } else - pstRDSData->AFON_Data.AF[1][indx] = - pstRDSData->AFON_Data. - AF[0][indx]; - } - - /* compare AF buff0 and buff1 data:end */ - if (indx2 == num) { - pstRDSData->AFON_Data.Addr_Cnt = 0xFF; - pstRDSData->event_status |= - RDS_EVENT_AFON_LIST; - - for (indx = 0; indx < num; indx++) { - if ((pstRDSData->AFON_Data. - AF[1][indx]) == 0) { - pstRDSData->AFON_Data. - Addr_Cnt = 0x0F; - pstRDSData->event_status &= - (~RDS_EVENT_AFON_LIST); - } - } - } else - pstRDSData->AFON_Data.Addr_Cnt = 0x0F; - } - } - } - } - } else { - /* Type B */ - TA_ON = block_data[1] & 0x0008; - WCN_DBG(FM_DBG | RDSC, - "TA g14 typeB pstRDSData->RDSFlag.TP=%d pstRDSData->RDSFlag.TA=%d TP_ON=%d TA_ON=%d\n", - pstRDSData->RDSFlag.TP, pstRDSData->RDSFlag.TA, TP_ON, TA_ON); - - if ((!pstRDSData->RDSFlag.TP) && (pstRDSData->RDSFlag.TA) && TP_ON && TA_ON) { - fm_s32 TA_num = 0; - - for (num = 0; num < 25; num++) { - if (pstRDSData->AFON_Data.AF[1][num] != 0) { - TA_num++; - } else { - break; - } - } - - WCN_DBG(FM_NTC | RDSC, "TA set RDS_EVENT_TAON"); - - if (TA_num == pstRDSData->AFON_Data.AF_Num) { - pstRDSData->event_status |= RDS_EVENT_TAON; - } - } - } - - return ret; -} - -/* - * rds_parser - * Block0: PI code(16bits) - * Block1: Group type(4bits), B0=version code(1bit), TP=traffic program code(1bit), - * PTY=program type code(5bits), other(5bits) - * Block2: 16bits - * Block3: 16bits - * @rds_dst - target buffer that record RDS parsing result - * @rds_raw - rds raw data - * @rds_size - size of rds raw data - * @getfreq - function pointer, AF need get current freq - */ -fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - fm_s32 ret = 0; - /* block_data[0] = blockA, block_data[1] = blockB, block_data[2] = blockC, block_data[3] = blockD, */ - /* block_data[4] = CRC, block_data[5] = CBC */ - fm_u16 block_data[6]; - fm_u8 GroupType, SubType = 0; - fm_s32 rds_cnt = 0; - fm_s32 i = 0; - fm_bool dirty = fm_false; - /* target buf to fill the result in */ - fm_u16 *event = &rds_dst->event_status; - fm_u32 *flag = &rds_dst->RDSFlag.flag_status; - - FMR_ASSERT(getfreq); - rds_get_freq = getfreq; - - ret = rds_cnt_get(rds_raw, rds_size, &rds_cnt); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get cnt err[ret=%d]\n", ret); - return ret; - } - - while (rds_cnt > 0) { - ret = rds_grp_get(&block_data[0], rds_raw, i); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get group err[ret=%d]\n", ret); - goto do_next; - } - - ret = rds_grp_type_get(block_data[4], block_data[1], &GroupType, &SubType); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get group type err[ret=%d]\n", ret); - goto do_next; - } - - ret = rds_grp_counter_add(GroupType, SubType, &rds_dst->gc); - - ret = rds_grp_pi_get(block_data[4], block_data[0], &rds_dst->PI, &dirty); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get group pi err[ret=%d]\n", ret); - goto do_next; - } else if (dirty == fm_true) { - ret = rds_event_set(event, RDS_EVENT_PI_CODE); /* yes, we got new PI code */ - } - - ret = rds_grp_pty_get(block_data[4], block_data[1], &rds_dst->PTY, &dirty); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get group pty err[ret=%d]\n", ret); - goto do_next; - } else if (dirty == fm_true) { - ret = rds_event_set(event, RDS_EVENT_PTY_CODE); /* yes, we got new PTY code */ - } - - ret = rds_grp_tp_get(block_data[4], block_data[1], &rds_dst->RDSFlag.TP, &dirty); - - if (ret) { - WCN_DBG(FM_WAR | RDSC, "get group tp err[ret=%d]\n", ret); - goto do_next; - } else if (dirty == fm_true) { - ret = rds_event_set(event, RDS_EVENT_FLAGS); /* yes, we got new TP code */ - ret = rds_flag_set(flag, RDS_FLAG_IS_TP); - } - - switch (GroupType) { - case 0: - - if ((ret = rds_retrieve_g0(&block_data[0], SubType, rds_dst))) - goto do_next; - - break; - case 1: - - if ((ret = rds_retrieve_g1(&block_data[0], SubType, rds_dst))) - goto do_next; - - break; - case 2: - - if ((ret = rds_retrieve_g2(&block_data[0], SubType, rds_dst))) - goto do_next; - - break; - case 4: - - if ((ret = rds_retrieve_g4(&block_data[0], SubType, rds_dst))) - goto do_next; - - break; - case 14: - - if ((ret = rds_retrieve_g14(&block_data[0], SubType, rds_dst))) - goto do_next; - - break; - default: - break; - } - - do_next: - - if (ret && (ret != -FM_ECRC)) { - WCN_DBG(FM_ERR | RDSC, "parsing err[ret=%d]\n", ret); - return ret; - } - - rds_cnt--; - i++; - } - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/core/fm_utils.c b/drivers/misc/mediatek/fmradio/core/fm_utils.c deleted file mode 100644 index cc0ed365d..000000000 --- a/drivers/misc/mediatek/fmradio/core/fm_utils.c +++ /dev/null @@ -1,689 +0,0 @@ -/* fm_event.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver -- a common event - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/sched.h> -#include <linux/slab.h> -#include <linux/version.h> -#include <linux/interrupt.h> -#include <linux/wait.h> -#include <asm/uaccess.h> -#include <linux/semaphore.h> -#include <linux/timer.h> -#include <linux/delay.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_utils.h" - -static fm_u32 fm_event_send(struct fm_flag_event *thiz, fm_u32 mask) -{ - thiz->flag |= mask; - /* WCN_DBG(FM_DBG|MAIN, "%s set 0x%08x\n", thiz->name, thiz->flag); */ - wake_up((wait_queue_head_t *) (thiz->priv)); - - return thiz->flag; -} - -static fm_s32 fm_event_wait(struct fm_flag_event *thiz, fm_u32 mask) -{ - return wait_event_interruptible(*(wait_queue_head_t *) (thiz->priv), - ((thiz->flag & mask) == mask)); -} - -/** - * fm_event_check - sleep until a condition gets true or a timeout elapses - * @thiz: the pointer of current object - * @mask: bitmap in fm_u32 - * @timeout: timeout, in jiffies - * - * fm_event_set() has to be called after changing any variable that could - * change the result of the wait condition. - * - * The function returns 0 if the @timeout elapsed, and the remaining - * jiffies if the condition evaluated to true before the timeout elapsed. - */ -long fm_event_wait_timeout(struct fm_flag_event *thiz, fm_u32 mask, long timeout) -{ - return wait_event_timeout(*((wait_queue_head_t *) (thiz->priv)), - ((thiz->flag & mask) == mask), timeout * HZ); -} - -static fm_u32 fm_event_clr(struct fm_flag_event *thiz, fm_u32 mask) -{ - thiz->flag &= ~mask; - /* WCN_DBG(FM_DBG|MAIN, "%s clr 0x%08x\n", thiz->name, thiz->flag); */ - return thiz->flag; -} - -static fm_u32 fm_event_get(struct fm_flag_event *thiz) -{ - return thiz->flag; - -} - -static fm_u32 fm_event_rst(struct fm_flag_event *thiz) -{ - return thiz->flag = 0; -} - -struct fm_flag_event *fm_flag_event_create(const fm_s8 *name) -{ - struct fm_flag_event *tmp; - wait_queue_head_t *wq; - - if (!(tmp = fm_zalloc(sizeof(struct fm_flag_event)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_event) -ENOMEM\n"); - return NULL; - } - - if (!(wq = fm_zalloc(sizeof(wait_queue_head_t)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(wait_queue_head_t) -ENOMEM\n"); - fm_free(tmp); - return NULL; - } - - fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name))); - tmp->priv = wq; - init_waitqueue_head(wq); - tmp->ref = 0; - - tmp->send = fm_event_send; - tmp->wait = fm_event_wait; - tmp->wait_timeout = fm_event_wait_timeout; - tmp->clr = fm_event_clr; - tmp->get = fm_event_get; - tmp->rst = fm_event_rst; - - tmp->rst(tmp); /* set flag to 0x00000000 */ - - return tmp; -} - -fm_s32 fm_flag_event_get(struct fm_flag_event *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref++; - return 0; -} - -fm_s32 fm_flag_event_put(struct fm_flag_event *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref--; - - if (thiz->ref == 0) { - fm_free(thiz->priv); - fm_free(thiz); - return 0; - } else if (thiz->ref > 0) { - return -FM_EINUSE; - } else { - return -FM_EPARA; - } -} - -/* fm lock methods */ -static fm_s32 fm_lock_try(struct fm_lock *thiz, fm_s32 retryCnt) -{ - fm_s32 retry_cnt = 0; - struct semaphore *sem; - struct task_struct *task = current; - FMR_ASSERT(thiz); - FMR_ASSERT(thiz->priv); - - while (down_trylock((struct semaphore *)thiz->priv)) { - WCN_DBG(FM_WAR | MAIN, "down_trylock failed\n"); - if (++retry_cnt < retryCnt) { - WCN_DBG(FM_WAR | MAIN, "[retryCnt=%d]\n", retry_cnt); - msleep_interruptible(50); - continue; - } else { - WCN_DBG(FM_CRT | MAIN, "down_trylock retry failed\n"); - return -FM_ELOCK; - } - } - - sem = (struct semaphore *)thiz->priv; - FM_LOG_DBG(MAIN, "%s --->trylock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count, - task->pid); - return 0; -} - -/* fm try lock methods */ -static fm_s32 fm_lock_lock(struct fm_lock *thiz) -{ - struct semaphore *sem; - struct task_struct *task = current; - FMR_ASSERT(thiz); - FMR_ASSERT(thiz->priv); - - if (down_interruptible((struct semaphore *)thiz->priv)) { - WCN_DBG(FM_CRT | MAIN, "get mutex failed\n"); - return -FM_ELOCK; - } - - sem = (struct semaphore *)thiz->priv; - FM_LOG_DBG(MAIN, "%s --->lock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count, task->pid); - return 0; -} - -static fm_s32 fm_lock_unlock(struct fm_lock *thiz) -{ - struct semaphore *sem; - struct task_struct *task = current; - FMR_ASSERT(thiz); - FMR_ASSERT(thiz->priv); - sem = (struct semaphore *)thiz->priv; - FM_LOG_DBG(MAIN, "%s <---unlock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count + 1, - task->pid); - up((struct semaphore *)thiz->priv); - return 0; -} - -struct fm_lock *fm_lock_create(const fm_s8 *name) -{ - struct fm_lock *tmp; - struct semaphore *mutex; - - if (!(tmp = fm_zalloc(sizeof(struct fm_lock)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_lock) -ENOMEM\n"); - return NULL; - } - - if (!(mutex = fm_zalloc(sizeof(struct semaphore)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct semaphore) -ENOMEM\n"); - fm_free(tmp); - return NULL; - } - - tmp->priv = mutex; - sema_init(mutex, 1); - tmp->ref = 0; - fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name))); - - tmp->lock = fm_lock_lock; - tmp->trylock = fm_lock_try; - tmp->unlock = fm_lock_unlock; - - return tmp; -} - -fm_s32 fm_lock_get(struct fm_lock *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref++; - return 0; -} - -fm_s32 fm_lock_put(struct fm_lock *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref--; - - if (thiz->ref == 0) { - fm_free(thiz->priv); - fm_free(thiz); - return 0; - } else if (thiz->ref > 0) { - return -FM_EINUSE; - } else { - return -FM_EPARA; - } -} - -/* fm lock methods */ -static fm_s32 fm_spin_lock_lock(struct fm_lock *thiz) -{ - struct task_struct *task = current; - FMR_ASSERT(thiz); - FMR_ASSERT(thiz->priv); - - spin_lock_bh((spinlock_t *) thiz->priv); - - FM_LOG_DBG(MAIN, "%s --->lock pid=%d\n", thiz->name, task->pid); - return 0; -} - -static fm_s32 fm_spin_lock_unlock(struct fm_lock *thiz) -{ - struct task_struct *task = current; - FMR_ASSERT(thiz); - FMR_ASSERT(thiz->priv); - - FM_LOG_DBG(MAIN, "%s <---unlock, pid=%d\n", thiz->name, task->pid); - spin_unlock_bh((spinlock_t *) thiz->priv); - return 0; -} - -struct fm_lock *fm_spin_lock_create(const fm_s8 *name) -{ - struct fm_lock *tmp; - spinlock_t *spin_lock; - - if (!(tmp = fm_zalloc(sizeof(struct fm_lock)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_lock) -ENOMEM\n"); - return NULL; - } - - if (!(spin_lock = fm_zalloc(sizeof(spinlock_t)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(spinlock_t) -ENOMEM\n"); - fm_free(tmp); - return NULL; - } - - tmp->priv = spin_lock; - spin_lock_init(spin_lock); - tmp->ref = 0; - fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name))); - - tmp->lock = fm_spin_lock_lock; - tmp->unlock = fm_spin_lock_unlock; - - return tmp; -} - - -fm_s32 fm_spin_lock_get(struct fm_lock *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref++; - return 0; -} - -fm_s32 fm_spin_lock_put(struct fm_lock *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref--; - - if (thiz->ref == 0) { - fm_free(thiz->priv); - fm_free(thiz); - return 0; - } else if (thiz->ref > 0) { - return -FM_EINUSE; - } else { - return -FM_EPARA; - } -} - -/* - * fm timer - * - */ -static fm_s32 fm_timer_init(struct fm_timer *thiz, void (*timeout) (unsigned long data), - unsigned long data, signed long time, fm_s32 flag) -{ - struct timer_list *timerlist = (struct timer_list *)thiz->priv; - - thiz->flag = flag; - thiz->flag &= ~FM_TIMER_FLAG_ACTIVATED; - thiz->timeout_func = timeout; - thiz->data = data; - thiz->timeout_ms = time; - - timerlist->expires = jiffies + (thiz->timeout_ms) / (1000 / HZ); - timerlist->function = thiz->timeout_func; - timerlist->data = (unsigned long)thiz->data; - - return 0; -} - -static fm_s32 fm_timer_start(struct fm_timer *thiz) -{ - struct timer_list *timerlist = (struct timer_list *)thiz->priv; - - thiz->flag |= FM_TIMER_FLAG_ACTIVATED; - mod_timer(timerlist, jiffies + (thiz->timeout_ms) / (1000 / HZ)); - - return 0; -} - -static fm_s32 fm_timer_update(struct fm_timer *thiz) -{ - struct timer_list *timerlist = (struct timer_list *)thiz->priv; - - if (thiz->flag & FM_TIMER_FLAG_ACTIVATED) { - mod_timer(timerlist, jiffies + (thiz->timeout_ms) / (1000 / HZ)); - return 0; - } else { - return 1; - } -} - -static fm_s32 fm_timer_stop(struct fm_timer *thiz) -{ - struct timer_list *timerlist = (struct timer_list *)thiz->priv; - - thiz->flag &= ~FM_TIMER_FLAG_ACTIVATED; - del_timer(timerlist); - - return 0; -} - -static fm_s32 fm_timer_control(struct fm_timer *thiz, enum fm_timer_ctrl cmd, void *arg) -{ - - return 0; -} - -struct fm_timer *fm_timer_create(const fm_s8 *name) -{ - struct fm_timer *tmp; - struct timer_list *timerlist; - - if (!(tmp = fm_zalloc(sizeof(struct fm_timer)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_timer) -ENOMEM\n"); - return NULL; - } - - if (!(timerlist = fm_zalloc(sizeof(struct timer_list)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct timer_list) -ENOMEM\n"); - fm_free(tmp); - return NULL; - } - - init_timer(timerlist); - - fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name))); - tmp->priv = timerlist; - tmp->ref = 0; - tmp->init = fm_timer_init; - tmp->start = fm_timer_start; - tmp->stop = fm_timer_stop; - tmp->update = fm_timer_update; - tmp->control = fm_timer_control; - - return tmp; -} - -fm_s32 fm_timer_get(struct fm_timer *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref++; - return 0; -} - -fm_s32 fm_timer_put(struct fm_timer *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref--; - - if (thiz->ref == 0) { - fm_free(thiz->priv); - fm_free(thiz); - return 0; - } else if (thiz->ref > 0) { - return -FM_EINUSE; - } else { - return -FM_EPARA; - } -} - - -/* - * FM work thread mechanism - */ -static fm_s32 fm_work_init(struct fm_work *thiz, void (*work_func) (unsigned long data), - unsigned long data) -{ - struct work_struct *sys_work = (struct work_struct *)thiz->priv; - work_func_t func; - - thiz->work_func = work_func; - thiz->data = data; - func = (work_func_t) thiz->work_func; - - INIT_WORK(sys_work, func); - - return 0; - -} - -struct fm_work *fm_work_create(const fm_s8 *name) -{ - struct fm_work *my_work; - struct work_struct *sys_work; - - if (!(my_work = fm_zalloc(sizeof(struct fm_work)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_work) -ENOMEM\n"); - return NULL; - } - - if (!(sys_work = fm_zalloc(sizeof(struct work_struct)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct work_struct) -ENOMEM\n"); - fm_free(my_work); - return NULL; - } - - fm_memcpy(my_work->name, name, - (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name))); - my_work->priv = sys_work; - my_work->init = fm_work_init; - - return my_work; -} - -fm_s32 fm_work_get(struct fm_work *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref++; - return 0; -} - -fm_s32 fm_work_put(struct fm_work *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref--; - - if (thiz->ref == 0) { - fm_free(thiz->priv); - fm_free(thiz); - return 0; - } else if (thiz->ref > 0) { - return -FM_EINUSE; - } else { - return -FM_EPARA; - } -} - - -static fm_s32 fm_workthread_add_work(struct fm_workthread *thiz, struct fm_work *work) -{ - FMR_ASSERT(thiz); - FMR_ASSERT(work); - - queue_work((struct workqueue_struct *)thiz->priv, (struct work_struct *)work->priv); - return 0; -} - -struct fm_workthread *fm_workthread_create(const fm_s8 *name) -{ - struct fm_workthread *my_thread; - struct workqueue_struct *sys_thread; - - if (!(my_thread = fm_zalloc(sizeof(struct fm_workthread)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_workthread) -ENOMEM\n"); - return NULL; - } - - sys_thread = create_singlethread_workqueue(name); - - fm_memcpy(my_thread->name, name, - (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name))); - my_thread->priv = sys_thread; - my_thread->add_work = fm_workthread_add_work; - - return my_thread; -} - -fm_s32 fm_workthread_get(struct fm_workthread *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref++; - return 0; -} - -fm_s32 fm_workthread_put(struct fm_workthread *thiz) -{ - FMR_ASSERT(thiz); - thiz->ref--; - - if (thiz->ref == 0) { - destroy_workqueue((struct workqueue_struct *)thiz->priv); - fm_free(thiz); - return 0; - } else if (thiz->ref > 0) { - return -FM_EINUSE; - } else { - return -FM_EPARA; - } -} - - -fm_s32 fm_fifo_in(struct fm_fifo *thiz, void *item) -{ - FMR_ASSERT(item); - - if (thiz->len < thiz->size) { - fm_memcpy((thiz->obj.priv + (thiz->item_size * thiz->in)), item, thiz->item_size); - thiz->in = (thiz->in + 1) % thiz->size; - thiz->len++; - /* WCN_DBG(FM_DBG | MAIN, "add a new item[len=%d]\n", thiz->len); */ - } else { - WCN_DBG(FM_WAR | MAIN, "%s fifo is full\n", thiz->obj.name); - return -FM_ENOMEM; - } - - return 0; -} - -fm_s32 fm_fifo_out(struct fm_fifo *thiz, void *item) -{ - if (thiz->len > 0) { - if (item) { - fm_memcpy(item, (thiz->obj.priv + (thiz->item_size * thiz->out)), - thiz->item_size); - fm_memset((thiz->obj.priv + (thiz->item_size * thiz->out)), 0, - thiz->item_size); - } - thiz->out = (thiz->out + 1) % thiz->size; - thiz->len--; - /* WCN_DBG(FM_DBG | MAIN, "del an item[len=%d]\n", thiz->len); */ - } else { - WCN_DBG(FM_WAR | MAIN, "%s fifo is empty\n", thiz->obj.name); - } - - return 0; -} - -fm_bool fm_fifo_is_full(struct fm_fifo *thiz) -{ - return (thiz->len == thiz->size) ? fm_true : fm_false; -} - -fm_bool fm_fifo_is_empty(struct fm_fifo *thiz) -{ - return (thiz->len == 0) ? fm_true : fm_false; -} - -fm_s32 fm_fifo_get_total_len(struct fm_fifo *thiz) -{ - return thiz->size; -} - -fm_s32 fm_fifo_get_valid_len(struct fm_fifo *thiz) -{ - return thiz->len; -} - -fm_s32 fm_fifo_reset(struct fm_fifo *thiz) -{ - fm_memset(thiz->obj.priv, 0, thiz->item_size * thiz->size); - thiz->in = 0; - thiz->out = 0; - thiz->len = 0; - - return 0; -} - -struct fm_fifo *fm_fifo_init(struct fm_fifo *fifo, void *buf, const fm_s8 *name, fm_s32 item_size, - fm_s32 item_num) -{ - fm_memcpy(fifo->obj.name, name, 20); - fifo->size = item_num; - fifo->in = 0; - fifo->out = 0; - fifo->len = 0; - fifo->item_size = item_size; - fifo->obj.priv = buf; - - fifo->input = fm_fifo_in; - fifo->output = fm_fifo_out; - fifo->is_full = fm_fifo_is_full; - fifo->is_empty = fm_fifo_is_empty; - fifo->get_total_len = fm_fifo_get_total_len; - fifo->get_valid_len = fm_fifo_get_valid_len; - fifo->reset = fm_fifo_reset; - - WCN_DBG(FM_NTC | LINK, "%s inited\n", fifo->obj.name); - - return fifo; -} - -struct fm_fifo *fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num) -{ - struct fm_fifo *tmp; - void *buf; - - if (!(tmp = fm_zalloc(sizeof(struct fm_fifo)))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_fifo) -ENOMEM\n"); - return NULL; - } - - if (!(buf = fm_zalloc(item_size * item_num))) { - WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_fifo) -ENOMEM\n"); - fm_free(tmp); - return NULL; - } - - tmp = fm_fifo_init(tmp, buf, name, item_size, item_num); - - WCN_DBG(FM_NTC | LINK, "%s created\n", tmp->obj.name); - - return tmp; -} - - -fm_s32 fm_fifo_release(struct fm_fifo *fifo) -{ - if (fifo) { - WCN_DBG(FM_NTC | LINK, "%s released\n", fifo->obj.name); - if (fifo->obj.priv) { - fm_free(fifo->obj.priv); - } - fm_free(fifo); - } - - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/dummy.c b/drivers/misc/mediatek/fmradio/dummy.c deleted file mode 100644 index 351c747c2..000000000 --- a/drivers/misc/mediatek/fmradio/dummy.c +++ /dev/null @@ -1,3 +0,0 @@ -/* dummy.c - * This dummy file is just for meetting the build system's rule. - */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_config.h b/drivers/misc/mediatek/fmradio/inc/fm_config.h deleted file mode 100644 index 6f3036411..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_config.h +++ /dev/null @@ -1,217 +0,0 @@ -/* fm_config.h - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __FM_CONFIG_H__ -#define __FM_CONFIG_H__ - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_interface.h" -/* band */ -#define FM_BAND_UNKNOWN 0 -#define FM_BAND_UE 1 /* US/Europe band 87.5MHz ~ 108MHz (DEFAULT) */ -#define FM_BAND_JAPAN 2 /* Japan band 76MHz ~ 90MHz */ -#define FM_BAND_JAPANW 3 /* Japan wideband 76MHZ ~ 108MHz */ -#define FM_BAND_SPECIAL 4 /* special band between 76MHZ and 108MHz */ -#define FM_BAND_DEFAULT FM_BAND_UE -#define FM_RAIDO_BAND FM_BAND_UE -#define FM_FREQ_MIN FM_RX_BAND_FREQ_L -#define FM_FREQ_MAX FM_RX_BAND_FREQ_H - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define FM_UE_FREQ_MIN 8750 -#define FM_UE_FREQ_MAX 10800 -#define FM_JP_FREQ_MIN 7600 -#define FM_JP_FREQ_MAX 10800 - -#define FM_RX_BAND_FREQ_L 8750 /* FM radio special band low freq(Default 87.5MHz) */ -#define FM_RX_BAND_FREQ_H 10800 /* FM radio special band high freq(Default 108.0MHz) */ -/* TX */ -#define FM_TX_SCAN_HOLE_LOW 9230 /* 92.3MHz~95.4MHz should not show to user */ -#define FM_TX_SCAN_HOLE_HIGH 9540 /* 92.3MHz~95.4MHz should not show to user */ - -#else -#define FM_UE_FREQ_MIN 875 -#define FM_UE_FREQ_MAX 1080 -#define FM_JP_FREQ_MIN 760 -#define FM_JP_FREQ_MAX 1080 - -#define FM_RX_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define FM_RX_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -/* TX */ -#define FM_TX_SCAN_HOLE_LOW 923 /* 92.30MHz~95.40MHz should not show to user */ -#define FM_TX_SCAN_HOLE_HIGH 954 /* 92.30MHz~95.40MHz should not show to user */ - -#endif /* CONFIG_MTK_FM_50KHZ_SUPPORT */ - -/* space */ -#define FM_SPACE_UNKNOWN 0 -#define FM_SPACE_100K 1 -#define FM_SPACE_200K 2 -#define FM_SPACE_50K 5 - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define FM_SPACE_DEFAULT FM_SPACE_50K -#else -#define FM_SPACE_DEFAULT FM_SPACE_100K -#endif - -#define FM_TX_SCAN_UP (0) -#define FM_TX_SCAN_DOWN (1) -#define FM_TX_SCAN_MAX 10 -#define FM_TX_SCAN_MIN 1 - -/* seek direction */ -#define FM_SEEK_UP 0 -#define FM_SEEK_DOWN 1 - -#define FM_CHIP_AR1000 0x1000 -#define FM_CHIP_MT5192 0x91 -#define FM_CHIP_MT5193 0x92 -#define FM_CHIP_MT6616 0x6616 -#define FM_CHIP_MT6626 0x6626 -#define FM_CHIP_MT6628 0x6628 -#define FM_CHIP_MT6620 0x6620 -#define FM_CHIP_MT6627 0x6627 -#define FM_CHIP_MT6580 0x6580 -#define FM_CHIP_UNSUPPORTED 0xffff - -enum fm_cfg_parser_state { - FM_CFG_STAT_NONE = 0, - FM_CFG_STAT_GROUP, - FM_CFG_STAT_KEY, - FM_CFG_STAT_VALUE, - FM_CFG_STAT_COMMENT -}; - -typedef enum fm_cfg_parser_state fm_cfg_parser_state_t; - -#define COMMENT_CHAR '#' -#define DELIMIT_CHAR '=' - -#define isspace(a) ((a) == 0x20) - -#define FAKE_CH_MAX 10 -#define FM_CUST_CFG_PATH "/etc/fm_cust.cfg" - -struct fm_rx_cust_cfg { - fm_s32 desene_rssi_th; - fm_s32 pamd_th; - fm_s32 mr_th; - fm_s32 atdc_th; - fm_s32 prx_th; - fm_s32 atdev_th; - fm_s32 short_ana_rssi_th; - fm_s32 long_ana_rssi_th; - fm_s32 cqi_th; -/* fm_u16 mr_th; */ - fm_s32 smg_th; - fm_s32 scan_ch_size; - fm_s32 seek_space; - fm_s32 band; - fm_s32 band_freq_l; - fm_s32 band_freq_h; - fm_s32 scan_sort; - fm_s32 fake_ch[FAKE_CH_MAX]; - fm_s32 fake_ch_num; - fm_s32 fake_ch_rssi_th; - fm_s32 deemphasis; - fm_s32 osc_freq; -}; - -struct fm_tx_cust_cfg { - fm_s32 scan_hole_low; - fm_s32 scan_hole_high; - fm_s32 power_level; - fm_s32 pamd_th; - fm_s32 mr_th; - fm_s32 smg_th; -}; -typedef struct { - struct fm_rx_cust_cfg rx_cfg; - struct fm_tx_cust_cfg tx_cfg; - fm_audio_info_t aud_cfg; -} fm_cust_cfg; - -enum fm_cust_cfg_op { - FM_CFG_RX_RSSI_TH_LONG = 0, - FM_CFG_RX_RSSI_TH_SHORT, - FM_CFG_RX_CQI_TH, - FM_CFG_RX_MR_TH, - FM_CFG_RX_SMG_TH, - FM_CFG_RX_SCAN_CH_SIZE, - FM_CFG_RX_SEEK_SPACE, - FM_CFG_RX_BAND, - FM_CFG_RX_BAND_FREQ_L, - FM_CFG_RX_BAND_FREQ_H, - FM_CFG_RX_SCAN_SORT, - FM_CFG_RX_FAKE_CH_NUM, - FM_CFG_RX_FAKE_CH_RSSI, - FM_CFG_RX_FAKE_CH, - FM_CFG_RX_DEEMPHASIS, - FM_CFG_RX_OSC_FREQ, - - FM_CFG_TX_SCAN_HOLE_LOW, - FM_CFG_TX_SCAN_HOLE_HIGH, - FM_CFG_TX_PWR_LEVEL, - FM_CFG_MAX -}; - -typedef fm_s32(*CFG_HANDLER) (fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg); -extern fm_s32 to_upper_n(fm_s8 *str, fm_s32 len); -extern fm_s32 check_hex_str(fm_s8 *str, fm_s32 len); -extern fm_s32 check_dec_str(fm_s8 *str, fm_s32 len); -extern fm_s32 ascii_to_hex(fm_s8 *in_ascii, fm_u16 *out_hex); -extern fm_s32 ascii_to_dec(fm_s8 *in_ascii, fm_s32 *out_dec); -extern fm_s32 trim_string(fm_s8 **start); -extern fm_s32 trim_path(fm_s8 **start); -extern fm_s32 cfg_parser(fm_s8 *buffer, CFG_HANDLER handler, fm_cust_cfg *cfg); -extern fm_s32 cfg_item_match(fm_s8 *src_key, fm_s8 *src_val, fm_s8 *dst_key, fm_s32 *dst_val); - -extern fm_s32 fm_cust_config(const fm_s8 *filepath); -extern fm_u16 fm_cust_config_fetch(enum fm_cust_cfg_op op_code); -#ifdef MT6628_FM -extern fm_s32 MT6628fm_cust_config_setup(const fm_s8 *filepath); -extern fm_u16 MT6628fm_cust_config_fetch(enum fm_cust_cfg_op op_code); -#endif -#ifdef MT6620_FM -extern fm_s32 MT6620fm_cust_config_setup(const fm_s8 *filepath); -extern fm_u16 MT6620fm_cust_config_fetch(enum fm_cust_cfg_op op_code); -#endif -#ifdef MT6627_FM -extern fm_s32 MT6627fm_cust_config_setup(const fm_s8 *filepath); -extern fm_u16 MT6627fm_cust_config_fetch(enum fm_cust_cfg_op op_code); -#endif -#ifdef MT6580_FM -extern fm_s32 MT6580fm_cust_config_setup(const fm_s8 *filepath); -extern fm_u16 MT6580fm_cust_config_fetch(enum fm_cust_cfg_op op_code); -#endif -#ifdef MT6630_FM -extern fm_s32 MT6630fm_cust_config_setup(const fm_s8 *filepath); -extern fm_u16 MT6630fm_cust_config_fetch(enum fm_cust_cfg_op op_code); -#endif - -#endif /* __FM_CONFIG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_dbg.h b/drivers/misc/mediatek/fmradio/inc/fm_dbg.h deleted file mode 100644 index 75fbcf3a0..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_dbg.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef __FM_DBG_H__ -#define __FM_DBG_H__ - -/* #include <linux/kernel.h> //for printk() */ -/* #include <linux/xlog.h> */ -#include <linux/printk.h> - -/* DBG zone */ -#define BASE 4 -#define MAIN (1 << (BASE+0)) -#define LINK (1 << (BASE+1)) -#define EINT (1 << (BASE+2)) -#define CHIP (1 << (BASE+3)) -#define RDSC (1 << (BASE+4)) -#define G0 (1 << (BASE+5)) -#define G1 (1 << (BASE+6)) -#define G2 (1 << (BASE+7)) -#define G3 (1 << (BASE+8)) -#define G4 (1 << (BASE+9)) -#define G14 (1 << (BASE+10)) -#define RAW (1 << (BASE+11)) -#define OPEN (1 << (BASE+12)) -#define IOCTL (1 << (BASE+13)) -#define READ_ (1 << (BASE+14)) -#define CLOSE (1 << (BASE+15)) -#define CQI (1 << (BASE+16)) -#define ALL 0xfffffff0 - -/* DBG level */ -#define L0 0x00000000 /* EMERG, system will crush */ -#define L1 0x00000001 /* ALERT, need action in time */ -#define L2 0x00000002 /* CRIT, important HW or SW operation failed */ -#define L3 0x00000003 /* ERR, normal HW or SW ERR */ -#define L4 0x00000004 /* WARNING, importan path or somewhere may occurs err */ -#define L5 0x00000005 /* NOTICE, normal case */ -#define L6 0x00000006 /* INFO, print info if need */ -#define L7 0x00000007 /* DEBUG, for debug info */ - -#define FM_EMG L0 -#define FM_ALT L1 -#define FM_CRT L2 -#define FM_ERR L3 -#define FM_WAR L4 -#define FM_NTC L5 -#define FM_INF L6 -#define FM_DBG L7 - -extern fm_u32 g_dbg_level; -#if 0 -#define WCN_DBG(flag, fmt, args...) \ - do { \ - if ((((flag)&0x0000000f) <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_INFO, "[" #flag "]", fmt, ## args);\ - } \ - } while (0) -#else -#define WCN_DBG(flag, fmt, args...) \ - do { \ - if ((((flag)&0x0000000f) <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_notice("[" #flag "]" fmt, ## args); \ - } \ - } while (0) -#endif - -/* #define FM_USE_XLOG */ - -#ifdef FM_USE_XLOG -#define FM_DRV_LOG_TAG "FM_DRV" - -#define FM_LOG_DBG(flag, fmt, args...) \ - do { \ - if ((FM_DBG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_INFO, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_INF(flag, fmt, args...) \ - do { \ - if ((FM_INF <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_INFO, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_NTC(flag, fmt, args...) \ - do { \ - if ((FM_NTC <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_WARN, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_WAR(flag, fmt, args...) \ - do { \ - if ((FM_WAR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_WARN, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_ERR(flag, fmt, args...) \ - do { \ - if ((FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_ERROR, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_CRT(flag, fmt, args...) \ - do { \ - if ((FM_CRT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_ALT(flag, fmt, args...) \ - do { \ - if ((FM_ALT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_EMG(flag, fmt, args...) \ - do { \ - if ((FM_EMG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#else - -#define FM_LOG_DBG(flag, fmt, args...) \ - do { \ - if ((FM_DBG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_debug("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_INF(flag, fmt, args...) \ - do { \ - if ((FM_INF <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_info("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_NTC(flag, fmt, args...) \ - do { \ - if ((FM_NTC <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_notice("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_WAR(flag, fmt, args...) \ - do { \ - if ((FM_WAR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_warn("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_ERR(flag, fmt, args...) \ - do { \ - if ((FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_err("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_CRT(flag, fmt, args...) \ - do { \ - if ((FM_CRT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_crit("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_ALT(flag, fmt, args...) \ - do { \ - if ((FM_ALT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_alert("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_EMG(flag, fmt, args...) \ - do { \ - if ((FM_EMG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pr_emerg("[" #flag "]" fmt, ## args); \ - } \ - } while (0) -#endif - -#endif /* __FM_DBG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_eint.h b/drivers/misc/mediatek/fmradio/inc/fm_eint.h deleted file mode 100644 index d77ce896d..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_eint.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __FM_EINT_H__ -#define __FM_EINT_H__ - -#include "fm_typedef.h" - -enum { - FM_EINT_PIN_EINT_MODE, - FM_EINT_PIN_GPIO_MODE, - FM_EINT_PIN_MAX_MODE -}; - -extern fm_s32 fm_enable_eint(void); -extern fm_s32 fm_disable_eint(void); -extern fm_s32 fm_request_eint(void (*parser) (void)); -extern fm_s32 fm_eint_pin_cfg(fm_s32 mode); - -#endif /* __FM_EINT_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_err.h b/drivers/misc/mediatek/fmradio/inc/fm_err.h deleted file mode 100644 index b7a59a70c..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_err.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __FM_ERR_H__ -#define __FM_ERR_H__ - -#include <linux/kernel.h> /* for printk() */ - -#define FM_ERR_BASE 1000 -typedef enum fm_drv_err_t { - FM_EOK = FM_ERR_BASE, - FM_EBUF, - FM_EPARA, - FM_ELINK, - FM_ELOCK, - FM_EFW, - FM_ECRC, - FM_EWRST, /* wholechip reset */ - FM_ESRST, /* subsystem reset */ - FM_EPATCH, - FM_ENOMEM, - FM_EINUSE, /* other client is using this object */ - FM_EMAX -} fm_drv_err_t; - -#define FMR_ASSERT(a) { \ - if ((a) == NULL) { \ - pr_err("%s,invalid pointer\n", __func__);\ - return -FM_EPARA; \ - } \ - } - -#endif /* __FM_ERR_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_interface.h b/drivers/misc/mediatek/fmradio/inc/fm_interface.h deleted file mode 100644 index 62adbe3fb..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_interface.h +++ /dev/null @@ -1,291 +0,0 @@ -#ifndef __FM_INTERFACE_H__ -#define __FM_INTERFACE_H__ - -#include <linux/cdev.h> -#include <linux/workqueue.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_utils.h" - -/****************************************************************************** - * STRUCTURE DEFINITIONS - *****************************************************************************/ -enum fm_op_state { - FM_STA_STOP = 0, - FM_STA_PLAY = 1, - FM_STA_TUNE = 2, - FM_STA_SEEK = 3, - FM_STA_SCAN = 4, - FM_STA_RAMPDOWN = 5, - FM_STA_UNKOWN = 100, - FM_STA_MAX -}; - -enum fm_pwr_state { - FM_PWR_OFF = 0, - FM_PWR_RX_ON = 1, - FM_PWR_TX_ON = 2, - FM_PWR_MAX -}; - -enum fm_antenna_type { - FM_ANA_LONG = 0, /* long antenna */ - FM_ANA_SHORT = 1, /* short antenna */ - FM_ANA_MAX -}; - -struct fm_hw_info { - fm_s32 chip_id; /* chip ID, eg. 6620 */ - fm_s32 eco_ver; /* chip ECO version, eg. E3 */ - fm_s32 rom_ver; /* FM DSP rom code version, eg. V2 */ - fm_s32 patch_ver; /* FM DSP patch version, eg. 1.11 */ - fm_s32 reserve; -}; - -struct fm_i2s_setting { - fm_s32 onoff; - fm_s32 mode; - fm_s32 sample; -}; - -typedef enum { - FM_I2S_ON = 0, - FM_I2S_OFF, - FM_I2S_STATE_ERR -} fm_i2s_state_e; - -typedef enum { - FM_I2S_MASTER = 0, - FM_I2S_SLAVE, - FM_I2S_MODE_ERR -} fm_i2s_mode_e; - -typedef enum { - FM_I2S_32K = 0, - FM_I2S_44K, - FM_I2S_48K, - FM_I2S_SR_ERR -} fm_i2s_sample_e; - -typedef struct fm_i2s_info { - fm_s32 status; /*0:FM_I2S_ON, 1:FM_I2S_OFF,2:error */ - fm_s32 mode; /*0:FM_I2S_MASTER, 1:FM_I2S_SLAVE,2:error */ - fm_s32 rate; /*0:FM_I2S_32K:32000,1:FM_I2S_44K:44100,2:FM_I2S_48K:48000,3:error */ -} fm_i2s_info_t; - -typedef enum { - FM_AUD_ANALOG = 0, - FM_AUD_I2S = 1, - FM_AUD_MRGIF = 2, - FM_AUD_ERR -} fm_audio_path_e; - -typedef enum { - FM_I2S_PAD_CONN = 0, /* sco fm chip: e.g.6627 */ - FM_I2S_PAD_IO = 1, /* combo fm chip: e.g.6628 */ - FM_I2S_PAD_ERR -} fm_i2s_pad_sel_e; - -typedef struct fm_audio_info { - fm_audio_path_e aud_path; - fm_i2s_info_t i2s_info; - fm_i2s_pad_sel_e i2s_pad; -} fm_audio_info_t; - - -struct fm_platform { - struct cdev cdev; - dev_t dev_t; - struct class *cls; - struct device *dev; -}; - -struct fm { - /* chip info */ - fm_u16 chip_id; /* chip id, such as 6616/6620/6626/6628 */ - fm_u16 device_id; /* chip version */ - /* basic run time info */ - fm_s32 ref; /* fm driver can be multi opened */ - fm_bool chipon; /* Chip power state */ - enum fm_pwr_state pwr_sta; /* FM module power state */ - enum fm_op_state op_sta; /* current operation state: tune, seek, scan ... */ - /* enum fm_audio_path aud_path; //I2S or Analog */ - fm_s32 vol; /* current audio volume from chip side */ - fm_bool mute; /* true: mute, false: playing */ - fm_bool rds_on; /* true: on, false: off */ - enum fm_antenna_type ana_type; /* long/short antenna */ - fm_bool via_bt; /* true: fm over bt controller; false: fm over host */ - fm_u16 min_freq; /* for UE, 875KHz */ - fm_u16 max_freq; /* for UE, 1080KHz */ - fm_u16 cur_freq; /* current frequency */ - fm_u8 band; /* UE/JAPAN/JPANWD */ - /*FM Tx */ - fm_u32 vcoon; /* TX VCO tracking ON duiration(ms) */ - fm_u32 vcooff; /* TX RTC VCO tracking interval(s) */ - fm_u32 txpwrctl; /* TX power contrl interval(s) */ - fm_u32 tx_pwr; - fm_bool rdstx_on; /* false:rds tx off, true:rds tx on */ - fm_bool wholechiprst; - /* RDS data */ - struct fm_flag_event *rds_event; /* pointer to rds event */ - struct rds_t *pstRDSData; /* rds spec data buffer */ - /* platform data */ - struct fm_platform platform; /* platform related members */ - - struct fm_workthread *eint_wkthd; - struct fm_workthread *timer_wkthd; - struct fm_work *eint_wk; - struct fm_work *rds_wk; - struct fm_work *rst_wk; /* work for subsystem reset */ - /* Tx */ - struct fm_work *fm_tx_desense_wifi_work; - struct fm_work *fm_tx_power_ctrl_work; - -}; - -struct fm_callback { - /* call backs */ - fm_u16(*cur_freq_get) (void); - fm_s32(*cur_freq_set) (fm_u16 new_freq); -/* fm_u16(*chan_para_get)(fm_u16 freq); //get channel parameter, HL side/ FA / ATJ */ -}; - -struct fm_basic_interface { - /* mt66x6 lib interfaces */ - fm_s32(*low_pwr_wa) (fm_s32 onoff); - fm_s32(*pwron) (fm_s32 data); - fm_s32(*pwroff) (fm_s32 data); - fm_s32(*msdelay) (fm_u32 val); - fm_s32(*usdelay) (fm_u32 val); - fm_s32(*read) (fm_u8 addr, fm_u16 *val); - fm_s32(*write) (fm_u8 addr, fm_u16 val); - fm_s32(*top_read) (fm_u16 addr, fm_u32 *val); - fm_s32(*top_write) (fm_u16 addr, fm_u32 val); - fm_s32(*host_read) (fm_u32 addr, fm_u32 *val); - fm_s32(*host_write) (fm_u32 addr, fm_u32 val); - fm_s32(*setbits) (fm_u8 addr, fm_u16 bits, fm_u16 msk); - fm_u16(*chipid_get) (void); - fm_s32(*mute) (fm_bool mute); - fm_s32(*rampdown) (void); - fm_s32(*pwrupseq) (fm_u16 *chip_id, fm_u16 *device_id); - fm_s32(*pwrdownseq) (void); - fm_bool(*setfreq) (fm_u16 freq); - fm_bool(*seek) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 dir, fm_u16 space); - fm_s32(*seekstop) (void); - fm_bool(*scan) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 *tbl, - fm_u16 *tblsize, fm_u16 dir, fm_u16 space); - fm_bool(*jammer_scan) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 *tbl, - fm_u16 *tblsize, fm_u16 dir, fm_u16 space); - fm_s32(*cqi_get) (fm_s8 *buf, fm_s32 buf_len); - fm_s32(*scanstop) (void); - fm_s32(*rssiget) (fm_s32 *rssi); - fm_s32(*volset) (fm_u8 vol); - fm_s32(*volget) (fm_u8 *vol); - fm_s32(*dumpreg) (void); - fm_bool(*msget) (fm_u16 *ms); /* mono/stereo indicator get */ - fm_s32(*msset) (fm_s32 ms); /* mono/stereo force set */ - fm_bool(*pamdget) (fm_u16 *pamd); - fm_bool(*em) (fm_u16 group, fm_u16 item, fm_u32 val); - fm_s32(*anaswitch) (fm_s32 ana); - fm_s32(*anaget) (void); - fm_s32(*caparray_get) (fm_s32 *ca); - fm_s32(*i2s_set) (fm_s32 onoff, fm_s32 mode, fm_s32 sample); - fm_s32(*i2s_get) (fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample); - fm_s32(*hwinfo_get) (struct fm_hw_info *req); - fm_s32(*is_dese_chan) (fm_u16 freq); /* check if this is a de-sense channel */ - fm_s32(*softmute_tune) (fm_u16 freq, fm_s32 *rssi, fm_bool *valid); - fm_s32(*pre_search) (void); - fm_s32(*restore_search) (void); - fm_s32(*desense_check) (fm_u16 freq, fm_s32 rssi); /* check if this is a valid channel */ - fm_s32(*get_freq_cqi) (fm_u16 freq, fm_s32 *cqi); - fm_s32(*cqi_log) (fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt); /* cqi log tool */ - fm_s32(*fm_via_bt) (fm_bool flag); /* fm over BT:1:enable,0:disable */ - fm_s32(*set_search_th) (fm_s32 idx, fm_s32 val, fm_s32 reserve); - fm_s32(*get_aud_info) (fm_audio_info_t *data); - /*tx function */ - fm_s32(*tx_support) (fm_s32 *sup); - fm_s32(*rdstx_enable) (fm_s32 *flag); - fm_bool(*tune_tx) (fm_u16 freq); - fm_s32(*pwrupseq_tx) (void); - fm_s32(*pwrdownseq_tx) (void); - fm_s32(*tx_pwr_ctrl) (fm_u16 freq, fm_s32 *ctr); - fm_s32(*rtc_drift_ctrl) (fm_u16 freq, fm_s32 *ctr); - fm_s32(*tx_desense_wifi) (fm_u16 freq, fm_s32 *ctr); - fm_s32(*tx_scan) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL, - fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space); -}; - -struct fm_rds_interface { - /* rds lib interfaces */ - fm_s32(*rds_blercheck) (rds_t *dst); - fm_bool(*rds_onoff) (rds_t *dst, fm_bool onoff); - fm_s32(*rds_parser) (rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)); - fm_u16(*rds_gbc_get) (void); /* good block counter */ - fm_u16(*rds_bbc_get) (void); /* bad block counter */ - fm_u8(*rds_bbr_get) (void); /* bad block ratio */ - fm_s32(*rds_bc_reset) (void); /* reset block counter */ - fm_u32(*rds_bci_get) (void); /* bler check interval */ - fm_s32(*rds_log_get) (struct rds_rx_t *dst, fm_s32 *dst_len); - fm_s32(*rds_gc_get) (struct rds_group_cnt_t *dst, rds_t *rdsp); - fm_s32(*rds_gc_reset) (rds_t *rdsp); - /*Tx */ - fm_s32(*rds_tx) (fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt); - fm_s32(*rds_tx_enable) (void); - fm_s32(*rds_tx_disable) (void); - fm_s32(*rdstx_support) (fm_s32 *sup); -}; - -struct fm_lowlevel_ops { - struct fm_callback cb; - struct fm_basic_interface bi; - struct fm_rds_interface ri; -}; - -#if (!defined(MT6620_FM) && !defined(MT6628_FM) && !defined(MT6627_FM) && !defined(MT6580_FM) && !defined(MT6630_FM)) -extern fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops); -extern fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops); -#endif -#ifdef MT6620_FM -extern fm_s32 MT6620fm_low_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6620fm_low_ops_unregister(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6620fm_rds_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6620fm_rds_ops_unregister(struct fm_lowlevel_ops *ops); -#endif -#ifdef MT6628_FM -extern fm_s32 MT6628fm_low_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6628fm_low_ops_unregister(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6628fm_rds_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6628fm_rds_ops_unregister(struct fm_lowlevel_ops *ops); -#endif -#ifdef MT6627_FM -extern fm_s32 MT6627fm_low_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6627fm_low_ops_unregister(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6627fm_rds_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6627fm_rds_ops_unregister(struct fm_lowlevel_ops *ops); -#endif -#ifdef MT6580_FM -extern fm_s32 MT6580fm_low_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6580fm_low_ops_unregister(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6580fm_rds_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6580fm_rds_ops_unregister(struct fm_lowlevel_ops *ops); -#endif -#ifdef MT6630_FM -extern fm_s32 MT6630fm_low_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6630fm_low_ops_unregister(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6630fm_rds_ops_register(struct fm_lowlevel_ops *ops); -extern fm_s32 MT6630fm_rds_ops_unregister(struct fm_lowlevel_ops *ops); -#endif - -/* - * fm_get_channel_space - get the spcace of gived channel - * @freq - value in 760~1080 or 7600~10800 - * - * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0 - */ - -extern fm_s32 fm_get_channel_space(int freq); -#endif /* __FM_INTERFACE_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_ioctl.h b/drivers/misc/mediatek/fmradio/inc/fm_ioctl.h deleted file mode 100644 index 32cf9be09..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_ioctl.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef __FM_IOCTL_H__ -#define __FM_IOCTL_H__ -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_main.h" - -#define FM_IOC_MAGIC 0xf5 /* FIXME: any conflict? */ - -#define FM_IOCTL_POWERUP _IOWR(FM_IOC_MAGIC, 0, struct fm_tune_parm) -#define FM_IOCTL_POWERDOWN _IOWR(FM_IOC_MAGIC, 1, int32_t) -#define FM_IOCTL_TUNE _IOWR(FM_IOC_MAGIC, 2, struct fm_tune_parm) -#define FM_IOCTL_SEEK _IOWR(FM_IOC_MAGIC, 3, struct fm_seek_parm) -#define FM_IOCTL_SETVOL _IOWR(FM_IOC_MAGIC, 4, uint32_t) -#define FM_IOCTL_GETVOL _IOWR(FM_IOC_MAGIC, 5, uint32_t) -#define FM_IOCTL_MUTE _IOWR(FM_IOC_MAGIC, 6, uint32_t) -#define FM_IOCTL_GETRSSI _IOWR(FM_IOC_MAGIC, 7, int32_t) -#define FM_IOCTL_SCAN _IOWR(FM_IOC_MAGIC, 8, struct fm_scan_parm) -#define FM_IOCTL_STOP_SCAN _IO(FM_IOC_MAGIC, 9) - -/* IOCTL and struct for test */ -#define FM_IOCTL_GETCHIPID _IOWR(FM_IOC_MAGIC, 10, uint16_t) -#define FM_IOCTL_EM_TEST _IOWR(FM_IOC_MAGIC, 11, struct fm_em_parm) -#define FM_IOCTL_RW_REG _IOWR(FM_IOC_MAGIC, 12, struct fm_ctl_parm) -#define FM_IOCTL_GETMONOSTERO _IOWR(FM_IOC_MAGIC, 13, uint16_t) -#define FM_IOCTL_GETCURPAMD _IOWR(FM_IOC_MAGIC, 14, uint16_t) -#define FM_IOCTL_GETGOODBCNT _IOWR(FM_IOC_MAGIC, 15, uint16_t) -#define FM_IOCTL_GETBADBNT _IOWR(FM_IOC_MAGIC, 16, uint16_t) -#define FM_IOCTL_GETBLERRATIO _IOWR(FM_IOC_MAGIC, 17, uint16_t) - -/* IOCTL for RDS */ -#define FM_IOCTL_RDS_ONOFF _IOWR(FM_IOC_MAGIC, 18, uint16_t) -#define FM_IOCTL_RDS_SUPPORT _IOWR(FM_IOC_MAGIC, 19, int32_t) - -#define FM_IOCTL_POWERUP_TX _IOWR(FM_IOC_MAGIC, 20, struct fm_tune_parm) -#define FM_IOCTL_TUNE_TX _IOWR(FM_IOC_MAGIC, 21, struct fm_tune_parm) -#define FM_IOCTL_RDS_TX _IOWR(FM_IOC_MAGIC, 22, struct fm_rds_tx_parm) - -#define FM_IOCTL_RDS_SIM_DATA _IOWR(FM_IOC_MAGIC, 23, uint32_t) -#define FM_IOCTL_IS_FM_POWERED_UP _IOWR(FM_IOC_MAGIC, 24, uint32_t) - -/* IOCTL for FM Tx */ -#define FM_IOCTL_TX_SUPPORT _IOWR(FM_IOC_MAGIC, 25, int32_t) -#define FM_IOCTL_RDSTX_SUPPORT _IOWR(FM_IOC_MAGIC, 26, int32_t) -#define FM_IOCTL_RDSTX_ENABLE _IOWR(FM_IOC_MAGIC, 27, int32_t) -#define FM_IOCTL_TX_SCAN _IOWR(FM_IOC_MAGIC, 28, struct fm_tx_scan_parm) - -/* IOCTL for FM over BT */ -#define FM_IOCTL_OVER_BT_ENABLE _IOWR(FM_IOC_MAGIC, 29, int32_t) - -/* IOCTL for FM ANTENNA SWITCH */ -#define FM_IOCTL_ANA_SWITCH _IOWR(FM_IOC_MAGIC, 30, int32_t) -#define FM_IOCTL_GETCAPARRAY _IOWR(FM_IOC_MAGIC, 31, int32_t) - -/* IOCTL for FM compensation by GPS RTC */ -#define FM_IOCTL_GPS_RTC_DRIFT _IOWR(FM_IOC_MAGIC, 32, struct fm_gps_rtc_info) - -/* IOCTL for FM I2S Setting */ -#define FM_IOCTL_I2S_SETTING _IOWR(FM_IOC_MAGIC, 33, struct fm_i2s_setting) - -#define FM_IOCTL_RDS_GROUPCNT _IOWR(FM_IOC_MAGIC, 34, struct rds_group_cnt_req_t) -#define FM_IOCTL_RDS_GET_LOG _IOWR(FM_IOC_MAGIC, 35, struct rds_raw_t) - -#define FM_IOCTL_SCAN_GETRSSI _IOWR(FM_IOC_MAGIC, 36, struct fm_rssi_req) -#define FM_IOCTL_SETMONOSTERO _IOWR(FM_IOC_MAGIC, 37, int32_t) - -#define FM_IOCTL_RDS_BC_RST _IOWR(FM_IOC_MAGIC, 38, int32_t) -#define FM_IOCTL_CQI_GET _IOWR(FM_IOC_MAGIC, 39, struct fm_cqi_req) -#define FM_IOCTL_GET_HW_INFO _IOWR(FM_IOC_MAGIC, 40, struct fm_hw_info) -#define FM_IOCTL_GET_I2S_INFO _IOWR(FM_IOC_MAGIC, 41, struct fm_i2s_info) -#define FM_IOCTL_IS_DESE_CHAN _IOWR(FM_IOC_MAGIC, 42, int32_t) - -#define FM_IOCTL_TOP_RDWR _IOWR(FM_IOC_MAGIC, 43, struct fm_top_rw_parm) -#define FM_IOCTL_HOST_RDWR _IOWR(FM_IOC_MAGIC, 44, struct fm_host_rw_parm) - -#define FM_IOCTL_PRE_SEARCH _IOWR(FM_IOC_MAGIC, 45, int32_t) -#define FM_IOCTL_RESTORE_SEARCH _IOWR(FM_IOC_MAGIC, 46, int32_t) - -#define FM_IOCTL_SET_SEARCH_THRESHOLD _IOWR(FM_IOC_MAGIC, 47, struct fm_search_threshold_t) - -#define FM_IOCTL_GET_AUDIO_INFO _IOWR(FM_IOC_MAGIC, 48, fm_audio_info_t) -#define FM_IOCTL_FM_SET_STATUS _IOWR(FM_IOC_MAGIC, 49, fm_status_t) -#define FM_IOCTL_FM_GET_STATUS _IOWR(FM_IOC_MAGIC, 50, fm_status_t) - -#define FM_IOCTL_SCAN_NEW _IOWR(FM_IOC_MAGIC, 60, struct fm_scan_t) -#define FM_IOCTL_SEEK_NEW _IOWR(FM_IOC_MAGIC, 61, struct fm_seek_t) -#define FM_IOCTL_TUNE_NEW _IOWR(FM_IOC_MAGIC, 62, struct fm_tune_t) -#define FM_IOCTL_SOFT_MUTE_TUNE _IOWR(FM_IOC_MAGIC, 63, struct fm_softmute_tune_t) /*for soft mute tune */ -#define FM_IOCTL_DESENSE_CHECK _IOWR(FM_IOC_MAGIC, 64, fm_desense_check_t) - -#define COMPAT_FM_IOCTL_GET_AUDIO_INFO _IOWR(FM_IOC_MAGIC, 48, int32_t) - -#define FM_IOCTL_DUMP_REG _IO(FM_IOC_MAGIC, 0xFF) - -#endif /* __FM_IOCTL_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_link.h b/drivers/misc/mediatek/fmradio/inc/fm_link.h deleted file mode 100644 index 5859d29a9..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_link.h +++ /dev/null @@ -1,227 +0,0 @@ -#ifndef __FM_LINK_H__ -#define __FM_LINK_H__ - -#include "fm_typedef.h" -#include "fm_rds.h" - -typedef enum { - FM_TASK_RX_PARSER_PKT_TYPE = 0, - FM_TASK_RX_PARSER_OPCODE, - FM_TASK_RX_PARSER_PKT_LEN_1, - FM_TASK_RX_PARSER_PKT_LEN_2, - FM_TASK_RX_PARSER_PKT_PAYLOAD, - FM_TASK_RX_PARSER_BUFFER_CONGESTION -} fm_task_parser_state; - -enum { - FM_TASK_COMMAND_PKT_TYPE = 0x01, - FM_TASK_EVENT_PKT_TYPE = 0x04 -}; - -enum { - FM_STP_TEST_OPCODE = 0x00, - FSPI_ENABLE_OPCODE = 0x01, - FSPI_MUX_SEL_OPCODE = 0x02, - FSPI_READ_OPCODE = 0x03, - FSPI_WRITE_OPCODE = 0x04, - FI2C_READ_OPCODE = 0x05, - FI2C_WRITE_OPCODE = 0x06, - FM_ENABLE_OPCODE = 0x07, - FM_RESET_OPCODE = 0x08, - FM_TUNE_OPCODE = 0x09, - FM_SEEK_OPCODE = 0x0a, - FM_SCAN_OPCODE = 0x0b, - RDS_RX_ENABLE_OPCODE = 0x0c, - RDS_RX_DATA_OPCODE = 0x0d, - FM_RAMPDOWN_OPCODE = 0x0e, - FM_MCUCLK_SEL_OPCODE = 0x0f, - FM_MODEMCLK_SEL_OPCODE = 0x10, - RDS_TX_OPCODE = 0x11, - FM_PATCH_DOWNLOAD_OPCODE = 0x12, - FM_COEFF_DOWNLOAD_OPCODE = 0x13, - FM_HWCOEFF_DOWNLOAD_OPCODE = 0x14, - FM_ROM_DOWNLOAD_OPCODE = 0x15, - FM_SOFT_MUTE_TUNE_OPCODE = 0x17, - FM_HOST_READ_OPCODE = 0x18, /* mcu register read */ - FM_HOST_WRITE_OPCODE = 0x19, - CSPI_WRITE_OPCODE = 0x20, - CSPI_READ_OPCODE = 0x21, /* common SPI read */ -}; - -enum { - FLAG_TEST = (1 << FM_STP_TEST_OPCODE), - FLAG_FSPI_EN = (1 << FSPI_ENABLE_OPCODE), - FLAG_FSPI_MUXSEL = (1 << FSPI_MUX_SEL_OPCODE), - FLAG_FSPI_RD = (1 << FSPI_READ_OPCODE), - FLAG_FSPI_WR = (1 << FSPI_WRITE_OPCODE), - FLAG_I2C_RD = (1 << FI2C_READ_OPCODE), - FLAG_I2C_WR = (1 << FI2C_WRITE_OPCODE), - FLAG_EN = (1 << FM_ENABLE_OPCODE), - FLAG_RST = (1 << FM_RESET_OPCODE), - FLAG_TUNE = (1 << FM_TUNE_OPCODE), - FLAG_SEEK = (1 << FM_SEEK_OPCODE), - FLAG_SCAN = (1 << FM_SCAN_OPCODE), - FLAG_RDS_RX_EN = (1 << RDS_RX_ENABLE_OPCODE), - FLAG_RDS_DATA = (1 << RDS_RX_DATA_OPCODE), - FLAG_RAMPDOWN = (1 << FM_RAMPDOWN_OPCODE), - FLAG_MCUCLK = (1 << FM_MCUCLK_SEL_OPCODE), - FLAG_MODEMCLK = (1 << FM_MODEMCLK_SEL_OPCODE), - FLAG_RDS_TX = (1 << RDS_TX_OPCODE), - FLAG_PATCH = (1 << FM_PATCH_DOWNLOAD_OPCODE), - FLAG_COEFF = (1 << FM_COEFF_DOWNLOAD_OPCODE), - FLAG_HWCOEFF = (1 << FM_HWCOEFF_DOWNLOAD_OPCODE), - FLAG_ROM = (1 << FM_ROM_DOWNLOAD_OPCODE), - FLAG_CSPI_READ = (1 << 22), /* 22 */ - FLAG_SM_TUNE = (1 << FM_SOFT_MUTE_TUNE_OPCODE), /* 23 */ - FLAG_HOST_READ = (1 << FM_HOST_READ_OPCODE), /* 24 */ - FLAG_HOST_WRITE = (1 << FM_HOST_WRITE_OPCODE), /* 25 */ - FLAG_CSPI_WRITE = (1 << 26), /* 26 */ - FLAG_CQI_DONE = (1 << 27), - FLAG_TUNE_DONE = (1 << 28), - FLAG_SEEK_DONE = (1 << 29), - FLAG_SCAN_DONE = (1 << 30), - FLAG_TERMINATE = (1 << 31) -}; - -#define FM_SCANTBL_SIZE 16 -#define FM_CQI_BUF_SIZE 96 -struct fm_res_ctx { - fm_u16 fspi_rd; - fm_u16 seek_result; - fm_u16 scan_result[FM_SCANTBL_SIZE]; - fm_s8 cqi[FM_CQI_BUF_SIZE]; - struct rds_rx_t rds_rx_result; - fm_u32 cspi_rd; /* common spi read data */ -}; - -#define FM_TRACE_ENABLE - -#define FM_TRACE_FIFO_SIZE 200 -#define FM_TRACE_PKT_SIZE 60 -struct fm_trace_t { - fm_s32 type; - fm_s32 opcode; - fm_s32 len; - fm_u8 pkt[FM_TRACE_PKT_SIZE]; /* full packet */ - unsigned long time; - fm_s32 tid; -}; - -struct fm_trace_fifo_t { - fm_s8 name[20 + 1]; - struct fm_trace_t trace[FM_TRACE_FIFO_SIZE]; - fm_u32 size; - fm_u32 in; - fm_u32 out; - fm_u32 len; - fm_s32(*trace_in) (struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra); - fm_s32(*trace_out) (struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra); - fm_bool(*is_full) (struct fm_trace_fifo_t *thiz); - fm_bool(*is_empty) (struct fm_trace_fifo_t *thiz); -}; - -#define FM_TRACE_IN(fifop, tracep) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->trace_in) { \ - __ret = (fifop)->trace_in(fifop, tracep); \ - } \ - __ret; \ -}) - -#define FM_TRACE_OUT(fifop, tracep) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->trace_out) { \ - __ret = (fifop)->trace_out(fifop, tracep); \ - } \ - __ret; \ -}) - -#define FM_TRACE_FULL(fifop) \ -({ \ - fm_bool __ret = (fm_bool)fm_false; \ - if (fifop && (fifop)->is_full) { \ - __ret = (fifop)->is_full(fifop); \ - } \ - __ret; \ -}) - -#define FM_TRACE_EMPTY(fifop) \ -({ \ - fm_bool __ret = (fm_bool)fm_false; \ - if (fifop && (fifop)->is_empty) { \ - __ret = (fifop)->is_empty(fifop); \ - } \ - __ret; \ -}) - -#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM)) -#include "fm_utils.h" - -#define RX_BUF_SIZE 128 -#define TX_BUF_SIZE 1024 - -#define SW_RETRY_CNT (1) -#define SW_RETRY_CNT_MAX (5) -#define SW_WAIT_TIMEOUT_MAX (100) -/* FM operation timeout define for error handle */ -#define TEST_TIMEOUT (3) -#define FSPI_EN_TIMEOUT (3) -#define FSPI_MUXSEL_TIMEOUT (3) -#define FSPI_RD_TIMEOUT (3) -#define FSPI_WR_TIMEOUT (3) -#define I2C_RD_TIMEOUT (3) -#define I2C_WR_TIMEOUT (3) -#define EN_TIMEOUT (3) -#define RST_TIMEOUT (3) -#define TUNE_TIMEOUT (3) -#define SM_TUNE_TIMEOUT (6) -#define SEEK_TIMEOUT (15) -#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */ -#define RDS_RX_EN_TIMEOUT (3) -#define RDS_DATA_TIMEOUT (100) -#define RAMPDOWN_TIMEOUT (3) -#define MCUCLK_TIMEOUT (3) -#define MODEMCLK_TIMEOUT (3) -#define RDS_TX_TIMEOUT (3) -#define PATCH_TIMEOUT (3) -#define COEFF_TIMEOUT (3) -#define HWCOEFF_TIMEOUT (3) -#define ROM_TIMEOUT (3) - -struct fm_link_event { - struct fm_flag_event *ln_event; - struct fm_res_ctx result; /* seek/scan/read/RDS */ -}; -#endif - -/* - * FM data and ctrl link APIs: platform related and bus related - */ -extern fm_s32 fm_link_setup(void *data); - -extern fm_s32 fm_link_release(void); - -extern fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, - fm_s32(*callback) (struct fm_res_ctx *result)); - -extern fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32)); - -extern fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val); - -extern fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val); - -extern fm_s32 fm_force_active_event(fm_u32 mask); - -extern fm_bool fm_wait_stc_done(fm_u32 sec); - -extern struct fm_trace_fifo_t *fm_trace_fifo_create(const fm_s8 *name); - -extern fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo); - -extern fm_s32 fm_print_cmd_fifo(void); - -extern fm_s32 fm_print_evt_fifo(void); - -#endif /* __FM_LINK_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_main.h b/drivers/misc/mediatek/fmradio/inc/fm_main.h deleted file mode 100644 index 932cdbeae..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_main.h +++ /dev/null @@ -1,400 +0,0 @@ -#ifndef __FM_MAIN_H__ -#define __FM_MAIN_H__ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" -#include "fm_eint.h" -#include "fm_link.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_private.h" - -#define FM_NAME "fm" -#define FM_DEVICE_NAME "/dev/fm" - -#define FM_VOL_MAX 0x2B /* 43 volume(0-15) */ -#define FM_TIMER_TIMEOUT_DEFAULT 1000 -#define FM_TIMER_TIMEOUT_MIN 1000 -#define FM_TIMER_TIMEOUT_MAX 1000000 -/* FM Tx */ -#define FM_TX_PWR_LEVEL_MAX 120 /* FM transmitter power level, rang: 85db~120db, default 120db */ - -#define FM_TX_PWR_CTRL_INVAL_DEFAULT 10 -#define FM_TX_PWR_CTRL_INVAL_MIN 5 -#define FM_TX_PWR_CTRL_INVAL_MAX 10000 - -#define FM_TX_VCO_OFF_DEFAULT 5 -#define FM_TX_VCO_OFF_MIN 1 -#define FM_TX_VCO_OFF_MAX 10000 - -#define FM_TX_VCO_ON_DEFAULT 100 -#define FM_TX_VCO_ON_MIN 10 -#define FM_TX_VCO_ON_MAX 10000 - -#define FM_GPS_RTC_AGE_TH 2 -#define FM_GPS_RTC_DRIFT_TH 0 -#define FM_GPS_RTC_TIME_DIFF_TH 10 -#define FM_GPS_RTC_RETRY_CNT 1 -#define FM_GPS_RTC_DRIFT_MAX 5000 -enum { - FM_GPS_RTC_INFO_OLD = 0, - FM_GPS_RTC_INFO_NEW = 1, - FM_GPS_RTC_INFO_MAX -}; - -typedef enum { - FM_OVER_BT_DISABLE = 0, - FM_OVER_BT_ENABLE -} fm_over_bt_enable_state; - -#define FM_RDS_ENABLE 0x01 /* 1: enable RDS, 0:disable RDS */ -#define FM_RDS_DATA_READY (1 << 0) - -/* errno */ -#define FM_SUCCESS 0 -#define FM_FAILED 1 -#define FM_EPARM 2 -#define FM_BADSTATUS 3 -#define FM_TUNE_FAILED 4 -#define FM_SEEK_FAILED 5 -#define FM_BUSY 6 -#define FM_SCAN_FAILED 7 - -struct fm_tune_parm { - fm_u8 err; - fm_u8 band; - fm_u8 space; - fm_u8 hilo; - fm_u16 freq; /* IN/OUT parameter */ -}; - -struct fm_seek_parm { - fm_u8 err; - fm_u8 band; - fm_u8 space; - fm_u8 hilo; - fm_u8 seekdir; - fm_u8 seekth; - fm_u16 freq; /* IN/OUT parameter */ -}; - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -struct fm_scan_parm { - fm_u8 err; - fm_u8 band; - fm_u8 space; - fm_u8 hilo; - fm_u16 freq; /* OUT parameter */ - fm_u16 ScanTBL[26]; /* need no less than the chip */ - fm_u16 ScanTBLSize; /* IN/OUT parameter */ -}; -#else -struct fm_scan_parm { - fm_u8 err; - fm_u8 band; - fm_u8 space; - fm_u8 hilo; - fm_u16 freq; /* OUT parameter */ - fm_u16 ScanTBL[16]; /* need no less than the chip */ - fm_u16 ScanTBLSize; /* IN/OUT parameter */ -}; -#endif - -struct fm_cqi { - fm_s32 ch; - fm_s32 rssi; - fm_s32 reserve; -}; - -struct fm_cqi_req { - fm_u16 ch_num; - fm_s32 buf_size; - fm_s8 *cqi_buf; -}; - -struct fm_ch_rssi { - fm_u16 freq; - fm_s32 rssi; -}; - -enum fm_scan_cmd_t { - FM_SCAN_CMD_INIT = 0, - FM_SCAN_CMD_START, - FM_SCAN_CMD_GET_NUM, - FM_SCAN_CMD_GET_CH, - FM_SCAN_CMD_GET_RSSI, - FM_SCAN_CMD_GET_CH_RSSI, - FM_SCAN_CMD_MAX -}; - -struct fm_scan_t { - enum fm_scan_cmd_t cmd; - fm_s32 ret; /* 0, success; else error code */ - fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */ - fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */ - fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */ - fm_s32 num; /* valid channel number */ - void *priv; - fm_s32 sr_size; /* scan result buffer size in bytes */ - union { - fm_u16 *ch_buf; /* channel buffer */ - fm_s32 *rssi_buf; /* rssi buffer */ - struct fm_ch_rssi *ch_rssi_buf; /* channel and RSSI buffer */ - } sr; -}; - -struct fm_seek_t { - fm_s32 ret; /* 0, success; else error code */ - fm_u16 freq; - fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */ - fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */ - fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */ - fm_s32 dir; /* 0: up; 1: down */ - fm_s32 th; /* seek threshold in dbm(Eg, -95dbm) */ - void *priv; -}; - -struct fm_tune_t { - fm_s32 ret; /* 0, success; else error code */ - fm_u16 freq; - fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */ - fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */ - fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */ - void *priv; -}; - - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -struct fm_rssi_req { - fm_u16 num; - fm_u16 read_cnt; - struct fm_ch_rssi cr[26 * 16]; -}; -#else -struct fm_rssi_req { - fm_u16 num; - fm_u16 read_cnt; - struct fm_ch_rssi cr[16 * 16]; -}; -#endif - -struct fm_rds_tx_parm { - fm_u8 err; - fm_u16 pi; - fm_u16 ps[12]; /* 4 ps */ - fm_u16 other_rds[87]; /* 0~29 other groups */ - fm_u8 other_rds_cnt; /* # of other group */ -}; - -typedef struct fm_rds_tx_req { - unsigned char pty; /* 0~31 integer */ - unsigned char rds_rbds; /* 0:RDS, 1:RBDS */ - unsigned char dyn_pty; /* 0:static, 1:dynamic */ - unsigned short pi_code; /* 2-byte hex */ - unsigned char ps_buf[8]; /* hex buf of PS */ - unsigned char ps_len; /* length of PS, must be 0 / 8" */ - unsigned char af; /* 0~204, 0:not used, 1~204:(87.5+0.1*af)MHz */ - unsigned char ah; /* Artificial head, 0:no, 1:yes */ - unsigned char stereo; /* 0:mono, 1:stereo */ - unsigned char compress; /* Audio compress, 0:no, 1:yes */ - unsigned char tp; /* traffic program, 0:no, 1:yes */ - unsigned char ta; /* traffic announcement, 0:no, 1:yes */ - unsigned char speech; /* 0:music, 1:speech */ -} fm_rds_tx_req; - -#define TX_SCAN_MAX 10 -#define TX_SCAN_MIN 1 - -struct fm_tx_scan_parm { - fm_u8 err; - fm_u8 band; /* 87.6~108MHz */ - fm_u8 space; - fm_u8 hilo; - fm_u16 freq; /* start freq, if less than band min freq, then will use band min freq */ - fm_u8 scandir; - fm_u16 ScanTBL[TX_SCAN_MAX]; /* need no less than the chip */ - fm_u16 ScanTBLSize; /* IN: desired size, OUT: scan result size */ -}; - -struct fm_gps_rtc_info { - fm_s32 err; /* error number, 0: success, other: err code */ - fm_s32 retryCnt; /* GPS mnl can decide retry times */ - fm_s32 ageThd; /* GPS 3D fix time diff threshold */ - fm_s32 driftThd; /* GPS RTC drift threshold */ - struct timeval tvThd; /* time value diff threshold */ - fm_s32 age; /* GPS 3D fix time diff */ - fm_s32 drift; /* GPS RTC drift */ - union { - unsigned long stamp; /* time stamp in jiffies */ - struct timeval tv; /* time stamp value in RTC */ - }; - fm_s32 flag; /* rw flag */ -}; - -typedef struct { - fm_s32 freq; - fm_s32 rssi; -} fm_desense_check_t; - -typedef struct { - uint16_t lower; /* lower band, Eg, 7600 -> 76.0Mhz */ - uint16_t upper; /* upper band, Eg, 10800 -> 108.0Mhz */ - int space; /* 0x1: 50KHz, 0x2: 100Khz, 0x4: 200Khz */ - int cycle; /* repeat times */ -} fm_full_cqi_log_t; - -typedef enum { - FM_RX = 0, - FM_TX = 1 -} FM_PWR_T; - -struct fm_ctl_parm { - fm_u8 err; - fm_u8 addr; - fm_u16 val; - fm_u16 rw_flag; /* 0:write, 1:read */ -}; -struct fm_em_parm { - fm_u16 group_idx; - fm_u16 item_idx; - fm_u32 item_value; -}; -struct fm_top_rw_parm { - fm_u8 err; - fm_u8 rw_flag; /* 0:write, 1:read */ - fm_u16 addr; - fm_u32 val; -}; -struct fm_host_rw_parm { - fm_u8 err; - fm_u8 rw_flag; /* 0:write, 1:read */ - fm_u32 addr; - fm_u32 val; -}; - -enum { - FM_SUBSYS_RST_OFF, - FM_SUBSYS_RST_START, - FM_SUBSYS_RST_END, - FM_SUBSYS_RST_MAX -}; -enum { - FM_TX_PWR_CTRL_DISABLE, - FM_TX_PWR_CTRL_ENABLE, - FM_TX_PWR_CTRL_MAX -}; - -enum { - FM_TX_RTC_CTRL_DISABLE, - FM_TX_RTC_CTRL_ENABLE, - FM_TX_RTC_CTRL_MAX -}; - -enum { - FM_TX_DESENSE_DISABLE, - FM_TX_DESENSE_ENABLE, - FM_TX_DESENSE_MAX -}; - -struct fm_softmute_tune_t { - fm_s32 rssi; /* RSSI of current channel */ - fm_u16 freq; /* current frequency */ - fm_bool valid; /* current channel is valid(true) or not(false) */ -}; -struct fm_search_threshold_t { - fm_s32 th_type; /* 0, RSSI. 1,desense RSSI. 2,SMG. */ - fm_s32 th_val; /* threshold value */ - fm_s32 reserve; -}; - -typedef struct -{ - int which; - bool stat; -}fm_status_t; - -/* init and deinit APIs */ -extern fm_s32 fm_env_setup(void); -extern fm_s32 fm_env_destroy(void); -extern struct fm *fm_dev_init(fm_u32 arg); -extern fm_s32 fm_dev_destroy(struct fm *fm); - - -/* fm main basic APIs */ -extern enum fm_pwr_state fm_pwr_state_get(struct fm *fmp); -extern enum fm_pwr_state fm_pwr_state_set(struct fm *fmp, enum fm_pwr_state sta); -extern fm_s32 fm_open(struct fm *fmp); -extern fm_s32 fm_close(struct fm *fmp); -extern fm_s32 fm_rds_read(struct fm *fmp, fm_s8 *dst, fm_s32 len); -extern fm_s32 fm_powerup(struct fm *fm, struct fm_tune_parm *parm); -extern fm_s32 fm_powerdown(struct fm *fm, int type); -extern fm_s32 fm_seek(struct fm *fm, struct fm_seek_parm *parm); -extern fm_s32 fm_scan(struct fm *fm, struct fm_scan_parm *parm); -extern fm_s32 fm_cqi_get(struct fm *fm, fm_s32 ch_num, fm_s8 *buf, fm_s32 buf_size); -extern fm_s32 fm_get_hw_info(struct fm *pfm, struct fm_hw_info *req); -extern fm_s32 fm_hwscan_stop(struct fm *fm); -extern fm_s32 fm_ana_switch(struct fm *fm, fm_s32 antenna); -extern fm_s32 fm_setvol(struct fm *fm, fm_u32 vol); -extern fm_s32 fm_getvol(struct fm *fm, fm_u32 *vol); -extern fm_s32 fm_mute(struct fm *fm, fm_u32 bmute); -extern fm_s32 fm_getrssi(struct fm *fm, fm_s32 *rssi); -extern fm_s32 fm_reg_read(struct fm *fm, fm_u8 addr, fm_u16 *val); -extern fm_s32 fm_reg_write(struct fm *fm, fm_u8 addr, fm_u16 val); -extern fm_s32 fm_top_read(struct fm *fm, fm_u16 addr, fm_u32 *val); -extern fm_s32 fm_top_write(struct fm *fm, fm_u16 addr, fm_u32 val); -extern fm_s32 fm_host_read(struct fm *fm, fm_u32 addr, fm_u32 *val); -extern fm_s32 fm_host_write(struct fm *fm, fm_u32 addr, fm_u32 val); -extern fm_s32 fm_chipid_get(struct fm *fm, fm_u16 *chipid); -extern fm_s32 fm_monostereo_get(struct fm *fm, fm_u16 *ms); -extern fm_s32 fm_monostereo_set(struct fm *fm, fm_s32 ms); -extern fm_s32 fm_pamd_get(struct fm *fm, fm_u16 *pamd); -extern fm_s32 fm_caparray_get(struct fm *fm, fm_s32 *ca); -extern fm_s32 fm_em_test(struct fm *fm, fm_u16 group, fm_u16 item, fm_u32 val); -extern fm_s32 fm_rds_onoff(struct fm *fm, fm_u16 rdson_off); -extern fm_s32 fm_rds_good_bc_get(struct fm *fm, fm_u16 *gbc); -extern fm_s32 fm_rds_bad_bc_get(struct fm *fm, fm_u16 *bbc); -extern fm_s32 fm_rds_bler_ratio_get(struct fm *fm, fm_u16 *bbr); -extern fm_s32 fm_rds_group_cnt_get(struct fm *fm, struct rds_group_cnt_t *dst); -extern fm_s32 fm_rds_group_cnt_reset(struct fm *fm); -extern fm_s32 fm_rds_log_get(struct fm *fm, struct rds_rx_t *dst, fm_s32 *dst_len); -extern fm_s32 fm_rds_block_cnt_reset(struct fm *fm); -extern fm_s32 fm_i2s_set(struct fm *fm, fm_s32 onoff, fm_s32 mode, fm_s32 sample); -extern fm_s32 fm_get_i2s_info(struct fm *pfm, struct fm_i2s_info *req); -extern fm_s32 fm_tune(struct fm *fm, struct fm_tune_parm *parm); -extern fm_s32 fm_is_dese_chan(struct fm *pfm, fm_u16 freq); -extern fm_s32 fm_desense_check(struct fm *pfm, fm_u16 freq, fm_s32 rssi); -extern fm_s32 fm_sys_state_get(struct fm *fmp); -extern fm_s32 fm_sys_state_set(struct fm *fmp, fm_s32 sta); -extern fm_s32 fm_set_stat(struct fm *fmp, int which, bool stat); -extern fm_s32 fm_get_stat(struct fm *fmp, int which, bool *stat); -extern fm_s32 fm_subsys_reset(struct fm *fm); - -extern fm_s32 fm_scan_new(struct fm *fm, struct fm_scan_t *parm); -extern fm_s32 fm_seek_new(struct fm *fm, struct fm_seek_t *parm); -extern fm_s32 fm_tune_new(struct fm *fm, struct fm_tune_t *parm); - -extern fm_s32 fm_cust_config_setup(fm_s8 *filename); -extern fm_s32 fm_cqi_log(void); -extern fm_s32 fm_soft_mute_tune(struct fm *fm, struct fm_softmute_tune_t *parm); -extern fm_s32 fm_pre_search(struct fm *fm); -extern fm_s32 fm_restore_search(struct fm *fm); - -extern fm_s32 fm_dump_reg(void); -extern fm_s32 fm_get_gps_rtc_info(struct fm_gps_rtc_info *src); -extern fm_s32 fm_over_bt(struct fm *fm, fm_s32 flag); -extern fm_s32 fm_set_search_th(struct fm *fm, struct fm_search_threshold_t parm); -extern fm_s32 fm_get_aud_info(fm_audio_info_t *data); -/*tx function*/ -extern fm_s32 fm_tx_support(struct fm *fm, fm_s32 *support); - -extern fm_s32 fm_powerup_tx(struct fm *fm, struct fm_tune_parm *parm); -extern fm_s32 fm_tune_tx(struct fm *fm, struct fm_tune_parm *parm); -extern fm_s32 fm_powerdowntx(struct fm *fm); -extern fm_s32 fm_rds_tx(struct fm *fm, struct fm_rds_tx_parm *parm); -extern fm_s32 fm_rdstx_support(struct fm *fm, fm_s32 *support); -extern fm_s32 fm_rdstx_enable(struct fm *fm, fm_s32 enable); -extern fm_s32 fm_tx_scan(struct fm *fm, struct fm_tx_scan_parm *parm); -fm_s32 fm_full_cqi_logger(fm_full_cqi_log_t *setting); - -#endif /* __FM_MAIN_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_patch.h b/drivers/misc/mediatek/fmradio/inc/fm_patch.h deleted file mode 100644 index 0db191b8f..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_patch.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __FM_PATCH_H__ -#define __FM_PATCH_H__ - -enum { - FM_ROM_V1 = 0, - FM_ROM_V2 = 1, - FM_ROM_V3 = 2, - FM_ROM_V4 = 3, - FM_ROM_V5 = 4, - FM_ROM_MAX -}; - -struct fm_patch_tbl { - fm_s32 idx; - fm_s8 *patch; - fm_s8 *coeff; - fm_s8 *rom; - fm_s8 *hwcoeff; -}; - -extern fm_s32 fm_file_exist(const fm_s8 *filename); - -extern fm_s32 fm_file_read(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 position); - -extern fm_s32 fm_file_write(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 *ppos); - - -#endif /* __FM_PATCH_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_priv_log.h b/drivers/misc/mediatek/fmradio/inc/fm_priv_log.h deleted file mode 100644 index 634d3d667..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_priv_log.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef __FM_PRIV_LOG_H__ -#define __FM_PRIV_LOG_H__ -#if 0 -#include "fm_typedef.h" - -/******************DBG level ************************/ -#define D_BASE 4 -#define D_IOCTL (1 << (D_BASE+0)) -#define D_RX (1 << (D_BASE+1)) -#define D_TIMER (1 << (D_BASE+2)) -#define D_BLKC (1 << (D_BASE+3)) -#define D_G0 (1 << (D_BASE+4)) -#define D_G1 (1 << (D_BASE+5)) -#define D_G2 (1 << (D_BASE+6)) -#define D_G3 (1 << (D_BASE+7)) -#define D_G4 (1 << (D_BASE+8)) -#define D_G14 (1 << (D_BASE+9)) -#define D_RAW (1 << (D_BASE+10)) -#define D_RDS (1 << (D_BASE+11)) -#define D_INIT (1 << (D_BASE+12)) -#define D_MAIN (1 << (D_BASE+13)) -#define D_CMD (1 << (D_BASE+14)) -#define D_ALL 0xfffffff0 - -#define L0 0x00000000 /* EMERG, system will crush */ -#define L1 0x00000001 /* ALERT, need action in time */ -#define L2 0x00000002 /* CRIT, important HW or SW operation failed */ -#define L3 0x00000003 /* ERR, normal HW or SW ERR */ -#define L4 0x00000004 /* WARNING, importan path or somewhere may occurs err */ -#define L5 0x00000005 /* NOTICE, normal case */ -#define L6 0x00000006 /* INFO, print info if need */ -#define L7 0x00000007 /* DEBUG, for debug info */ - -#define FM_EMERG L0 -#define FM_ALERT L1 -#define FM_CRIT L2 -#define FM_ERR L3 -#define FM_WARNING L4 -#define FM_NOTICE L5 -#define FM_INFO L6 -#define FM_DEBUG L7 - -extern fm_u32 g_dbg_level; - -#define FM_LOG_DBG(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_DEBUG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_INF(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_INFO <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_NTC(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_NOTICE <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_WAR(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_WARNING <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_ERR(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_CRT(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_CRIT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_ALT(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_ALERT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) - -#define FM_LOG_EMG(flag, fmt, args...) \ - do { \ - if (pub_cb->log && (FM_EMERG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \ - pub_cb->log("[" #flag "]" fmt, ## args); \ - } \ - } while (0) -#endif -#endif /* __FM_PRIV_LOG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_private.h b/drivers/misc/mediatek/fmradio/inc/fm_private.h deleted file mode 100644 index 80129e9a0..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_private.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef __FM_PRIVATE_H__ -#define __FM_PRIVATE_H__ - -#include "fm_typedef.h" - -typedef enum fm_priv_state { - UNINITED, - INITED -} fm_priv_state_t; - -typedef enum fm_adpll_state { - FM_ADPLL_ON, - FM_ADPLL_OFF -} fm_adpll_state_t; - -typedef enum fm_hl_dese { - FM_HL_DESE_LOW, - FM_HL_DESE_HIGH -} fm_hl_dese_t; - -typedef enum fm_adpll_clk { - FM_ADPLL_16M, - FM_ADPLL_15M -} fm_adpll_clk_t; - -typedef enum fm_mcu_desense { - FM_MCU_DESE_ENABLE, - FM_MCU_DESE_DISABLE -} fm_mcu_desense_t; - -typedef enum fm_gps_desense { - FM_GPS_DESE_ENABLE, - FM_GPS_DESE_DISABLE -} fm_gps_desense_t; - -/* 6620 */ -typedef struct MT6620fm_priv_cb { - /* Basic functions. */ - int (*hl_side) (uint16_t freq, int *hl); - int (*adpll_freq_avoid) (uint16_t freq, int *freqavoid); - int (*mcu_freq_avoid) (uint16_t freq, int *freqavoid); - int (*tx_pwr_ctrl) (uint16_t freq, int *ctr); - int (*rtc_drift_ctrl) (uint16_t freq, int *ctr); - int (*tx_desense_wifi) (uint16_t freq, int *ctr); - int (*is_dese_chan) (fm_u16 freq); /* check if this is a de-sense channel */ -} MT6620fm_priv_cb_t; - -typedef struct MT6620fm_priv { - int state; - void *data; - MT6620fm_priv_cb_t priv_tbl; -} MT6620fm_priv_t; - -/* 6628 */ -typedef struct fm_priv_cb { - /* De-sense functions. */ - fm_s32(*is_dese_chan) (fm_u16 freq); /* check if this is a de-sense channel */ - fm_s32(*hl_dese) (fm_u16 freq, void *arg); /* return value: 0, low side; 1, high side; else error no */ - fm_s32(*fa_dese) (fm_u16 freq, void *arg); /* return value: 0, fa off; 1, fa on; else error no */ - fm_s32(*mcu_dese) (fm_u16 freq, void *arg); /* return value: 0, mcu dese disable; 1, enable; else error no */ - fm_s32(*gps_dese) (fm_u16 freq, void *arg); /* return value: 0,mcu dese disable; 1, enable; else error no */ - fm_u16(*chan_para_get) (fm_u16 freq); /* get channel parameter, HL side/ FA / ATJ */ -} fm_priv_cb_t; - -typedef struct fm_priv { - fm_s32 state; - fm_priv_cb_t priv_tbl; - void *data; -} fm_priv_t; - -typedef struct fm_pub_cb { - /* Basic functions. */ - fm_s32(*read) (fm_u8 addr, fm_u16 *val); - fm_s32(*write) (fm_u8 addr, fm_u16 val); - fm_s32(*setbits) (fm_u8 addr, fm_u16 bits, fm_u16 mask); - fm_s32(*rampdown) (void); - fm_s32(*msdelay) (fm_u32 val); - fm_s32(*usdelay) (fm_u32 val); - fm_s32(*log) (const fm_s8 *arg1, ...); -} fm_pub_cb_t; - -typedef struct fm_pub { - fm_s32 state; - void *data; - struct fm_pub_cb pub_tbl; -} fm_pub_t; - - -#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */ -extern fm_s32 fm_priv_register(struct fm_priv *pri, struct fm_pub *pub); -extern fm_s32 fm_priv_unregister(struct fm_priv *pri, struct fm_pub *pub); -#endif -#endif /* __FM_PRIVATE_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_rds.h b/drivers/misc/mediatek/fmradio/inc/fm_rds.h deleted file mode 100644 index 4763f3200..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_rds.h +++ /dev/null @@ -1,221 +0,0 @@ -#ifndef __FM_RDS_H__ -#define __FM_RDS_H__ -#include "fm_typedef.h" - -/* FM_RDS_DATA_CRC_FFOST */ -#define FM_RDS_GDBK_IND_A (0x08) -#define FM_RDS_GDBK_IND_B (0x04) -#define FM_RDS_GDBK_IND_C (0x02) -#define FM_RDS_GDBK_IND_D (0x01) -#define FM_RDS_DCO_FIFO_OFST (0x01E0) -#define FM_RDS_READ_DELAY (0x80) - -#define RDS_RX_BLOCK_PER_GROUP (4) -#define RDS_RX_GROUP_SIZE (2*RDS_RX_BLOCK_PER_GROUP) -#define MAX_RDS_RX_GROUP_CNT (12) -#define RDS_RT_MULTI_REV_TH 80 /* 100 */ -/* #define RDS_CBC_DEPENDENCY */ - -typedef struct rds_packet_t { - fm_u16 blkA; - fm_u16 blkB; - fm_u16 blkC; - fm_u16 blkD; - fm_u16 cbc; /* correct bit cnt */ - fm_u16 crc; /* crc checksum */ -} rds_packet_t; - -typedef struct rds_rx_t { - fm_u16 sin; - fm_u16 cos; - rds_packet_t data[MAX_RDS_RX_GROUP_CNT]; -} rds_rx_t; - -typedef enum rds_ps_state_machine_t { - RDS_PS_START = 0, - RDS_PS_DECISION, - RDS_PS_GETLEN, - RDS_PS_DISPLAY, - RDS_PS_FINISH, - RDS_PS_MAX -} rds_ps_state_machine_t; - -typedef enum rds_rt_state_machine_t { - RDS_RT_START = 0, - RDS_RT_DECISION, - RDS_RT_GETLEN, - RDS_RT_DISPLAY, - RDS_RT_FINISH, - RDS_RT_MAX -} rds_rt_state_machine_t; - - -enum { - RDS_GRP_VER_A = 0, /* group version A */ - RDS_GRP_VER_B -}; - -typedef enum rds_blk_t { - RDS_BLK_A = 0, - RDS_BLK_B, - RDS_BLK_C, - RDS_BLK_D, - RDS_BLK_MAX -} rds_blk_t; - -/* For RDS feature, these strcutures also be defined in "fm.h" */ -typedef struct rds_flag_t { - fm_u8 TP; - fm_u8 TA; - fm_u8 Music; - fm_u8 Stereo; - fm_u8 Artificial_Head; - fm_u8 Compressed; - fm_u8 Dynamic_PTY; - fm_u8 Text_AB; - fm_u32 flag_status; -} rds_flag_t; - -typedef struct rds_ct_t { - fm_u16 Month; - fm_u16 Day; - fm_u16 Year; - fm_u16 Hour; - fm_u16 Minute; - fm_u8 Local_Time_offset_signbit; - fm_u8 Local_Time_offset_half_hour; -} rds_ct_t; - -typedef struct rds_af_t { - fm_s16 AF_Num; - fm_s16 AF[2][25]; /* 100KHz */ - fm_u8 Addr_Cnt; - fm_u8 isMethod_A; - fm_u8 isAFNum_Get; -} rds_af_t; - -typedef struct rds_ps_t { - fm_u8 PS[4][8]; - fm_u8 Addr_Cnt; -} rds_ps_t; - -typedef struct rds_rt_t { - fm_u8 TextData[4][64]; - fm_u8 GetLength; - fm_u8 isRTDisplay; - fm_u8 TextLength; - fm_u8 isTypeA; - fm_u8 BufCnt; - fm_u16 Addr_Cnt; -} rds_rt_t; - -typedef struct rds_raw_t { - fm_s32 dirty; /* indicate if the data changed or not */ - fm_s32 len; /* the data len form chip */ - fm_u8 data[146]; -} rds_raw_t; - -typedef struct rds_group_cnt_t { - unsigned int total; - unsigned int groupA[16]; /* RDS groupA counter */ - unsigned int groupB[16]; /* RDS groupB counter */ -} rds_group_cnt_t; - -typedef enum rds_group_cnt_op_t { - RDS_GROUP_CNT_READ = 0, - RDS_GROUP_CNT_WRITE, - RDS_GROUP_CNT_RESET, - RDS_GROUP_CNT_MAX -} rds_group_cnt_op_t; - -typedef struct rds_group_cnt_req_t { - fm_s32 err; - enum rds_group_cnt_op_t op; - struct rds_group_cnt_t gc; -} rds_group_cnt_req_t; - -typedef struct rds_t { - struct rds_ct_t CT; - struct rds_flag_t RDSFlag; - fm_u16 PI; - fm_u8 Switch_TP; - fm_u8 PTY; - struct rds_af_t AF_Data; - fm_u8 Radio_Page_Code; - fm_u16 Program_Item_Number_Code; - struct rds_af_t AFON_Data; - fm_u8 Extend_Country_Code; - fm_u16 Language_Code; - struct rds_ps_t PS_Data; - fm_u8 PS_ON[8]; - fm_u16 event_status; /* will use RDSFlag_Struct RDSFlag->flag_status to check which event, is that ok? */ - struct rds_rt_t RT_Data; - fm_u8 PAD1; //padding for data aligh - struct rds_group_cnt_t gc; -} rds_t; - - -/* Need care the following definition. */ -/* valid Rds Flag for notify */ -typedef enum rds_flag_status_t { - RDS_FLAG_IS_TP = 0x0001, /* Program is a traffic program */ - RDS_FLAG_IS_TA = 0x0002, /* Program currently broadcasts a traffic ann. */ - RDS_FLAG_IS_MUSIC = 0x0004, /* Program currently broadcasts music */ - RDS_FLAG_IS_STEREO = 0x0008, /* Program is transmitted in stereo */ - RDS_FLAG_IS_ARTIFICIAL_HEAD = 0x0010, /* Program is an artificial head recording */ - RDS_FLAG_IS_COMPRESSED = 0x0020, /* Program content is compressed */ - RDS_FLAG_IS_DYNAMIC_PTY = 0x0040, /* Program type can change */ - RDS_FLAG_TEXT_AB = 0x0080 /* If this flag changes state, a new radio text string begins */ -} rds_flag_status_t; - -typedef enum rds_event_status_t { - RDS_EVENT_FLAGS = 0x0001, /* One of the RDS flags has changed state */ - RDS_EVENT_PI_CODE = 0x0002, /* The program identification code has changed */ - RDS_EVENT_PTY_CODE = 0x0004, /* The program type code has changed */ - RDS_EVENT_PROGRAMNAME = 0x0008, /* The program name has changed */ - RDS_EVENT_UTCDATETIME = 0x0010, /* A new UTC date/time is available */ - RDS_EVENT_LOCDATETIME = 0x0020, /* A new local date/time is available */ - RDS_EVENT_LAST_RADIOTEXT = 0x0040, /* A radio text string was completed */ - RDS_EVENT_AF = 0x0080, /* Current Channel RF signal strength too weak, need do AF switch */ - RDS_EVENT_AF_LIST = 0x0100, /* An alternative frequency list is ready */ - RDS_EVENT_AFON_LIST = 0x0200, /* An alternative frequency list is ready */ - RDS_EVENT_TAON = 0x0400, /* Other Network traffic announcement start */ - RDS_EVENT_TAON_OFF = 0x0800, /* Other Network traffic announcement finished. */ - RDS_EVENT_RDS = 0x2000, /* RDS Interrupt had arrived durint timer period */ - RDS_EVENT_NO_RDS = 0x4000, /* RDS Interrupt not arrived durint timer period */ - RDS_EVENT_RDS_TIMER = 0x8000 /* Timer for RDS Bler Check. ---- BLER block error rate */ -} rds_event_status_t; - - -#define RDS_LOG_SIZE 2 -struct rds_log_t { - struct rds_rx_t rds_log[RDS_LOG_SIZE]; - fm_s32 log_len[RDS_LOG_SIZE]; - fm_u32 size; - fm_u32 in; - fm_u32 out; - fm_u32 len; - fm_s32(*log_in) (struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len); - fm_s32(*log_out) (struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len); -}; - -extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)); -extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src); -extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc); -extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len); -extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len); - - -#define DEFINE_RDSLOG(name) \ - struct rds_log_t name = { \ - .size = RDS_LOG_SIZE, \ - .in = 0, \ - .out = 0, \ - .len = 0, \ - .log_in = rds_log_in, \ - .log_out = rds_log_out, \ - } - - -#endif /* __FM_RDS_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_stdlib.h b/drivers/misc/mediatek/fmradio/inc/fm_stdlib.h deleted file mode 100644 index 1f4bbc05b..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_stdlib.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef __FM_STDLIB_H__ -#define __FM_STDLIB_H__ - -#include "fm_typedef.h" -#include <linux/string.h> -#include <linux/slab.h> - -#if 1 -#define fm_memset(buf, a, len) \ -({ \ - void *__ret = (void *)0; \ - __ret = memset((buf), (a), (len)); \ - __ret; \ -}) - -#define fm_memcpy(dst, src, len) \ -({ \ - void *__ret = (void *)0; \ - __ret = memcpy((dst), (src), (len)); \ - __ret; \ -}) - -#define fm_malloc(len) \ -({ \ - void *__ret = (void *)0; \ - __ret = kmalloc(len, GFP_KERNEL); \ - __ret; \ -}) - -#define fm_zalloc(len) \ -({ \ - void *__ret = (void *)0; \ - __ret = kzalloc(len, GFP_KERNEL); \ - __ret; \ -}) - -#define fm_free(ptr) kfree(ptr) - -#define fm_vmalloc(len) \ -({ \ - void *__ret = (void *)0; \ - __ret = vmalloc(len); \ - __ret; \ -}) - -#define fm_vfree(ptr) vfree(ptr) - -#else -inline void *fm_memset(void *buf, fm_s8 val, fm_s32 len) -{ - return memset(buf, val, len); -} - -inline void *fm_memcpy(void *dst, const void *src, fm_s32 len) -{ - return memcpy(dst, src, len); -} - -#endif - -#endif /* __FM_STDLIB_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_typedef.h b/drivers/misc/mediatek/fmradio/inc/fm_typedef.h deleted file mode 100644 index cb55657bc..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_typedef.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __FM_TYPEDEF_H__ -#define __FM_TYPEDEF_H__ - -typedef signed char fm_s8; -typedef signed short fm_s16; -typedef signed int fm_s32; -typedef signed long long fm_s64; -typedef unsigned char fm_u8; -typedef unsigned short fm_u16; -typedef unsigned int fm_u32; -typedef unsigned long long fm_u64; - -#ifndef FALSE -#define FALSE (0) -#endif - -#ifndef TRUE -#define TRUE (1) -#endif - -#ifndef NULL -#define NULL (0) -#endif - -#ifndef BOOL -typedef unsigned char BOOL; -#endif - -typedef enum fm_bool { - fm_false = 0, - fm_true = 1 -} fm_bool; - - -#endif /* __FM_TYPEDEF_H__ */ diff --git a/drivers/misc/mediatek/fmradio/inc/fm_utils.h b/drivers/misc/mediatek/fmradio/inc/fm_utils.h deleted file mode 100644 index 0f306d624..000000000 --- a/drivers/misc/mediatek/fmradio/inc/fm_utils.h +++ /dev/null @@ -1,311 +0,0 @@ -#ifndef __FM_UTILS_H__ -#define __FM_UTILS_H__ - -#include "fm_typedef.h" - - -/** - * Base structure of fm object - */ -#define FM_NAME_MAX 20 -struct fm_object { - fm_s8 name[FM_NAME_MAX + 1]; /* name of fm object */ - fm_u8 type; /* type of fm object */ - fm_u8 flag; /* flag of fm object */ - fm_s32 ref; - void *priv; - /* struct fm_list *list; // list node of fm object */ -}; - - -/* - * FM FIFO - */ -struct fm_fifo { - struct fm_object obj; - fm_s32 size; - fm_s32 in; - fm_s32 out; - fm_s32 len; - fm_s32 item_size; - fm_s32(*input) (struct fm_fifo *thiz, void *item); - fm_s32(*output) (struct fm_fifo *thiz, void *item); - fm_bool(*is_full) (struct fm_fifo *thiz); - fm_bool(*is_empty) (struct fm_fifo *thiz); - fm_s32(*get_total_len) (struct fm_fifo *thiz); - fm_s32(*get_valid_len) (struct fm_fifo *thiz); - fm_s32(*reset) (struct fm_fifo *thiz); -}; - -extern struct fm_fifo *fm_fifo_init(struct fm_fifo *fifo, void *buf, const fm_s8 *name, - fm_s32 item_size, fm_s32 item_num); - -extern struct fm_fifo *fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num); - -extern fm_s32 fm_fifo_release(struct fm_fifo *fifo); - -#define FM_FIFO_INPUT(fifop, item) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->input) { \ - __ret = (fifop)->input(fifop, item); \ - } \ - __ret; \ -}) - -#define FM_FIFO_OUTPUT(fifop, item) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->output) { \ - __ret = (fifop)->output(fifop, item); \ - } \ - __ret; \ -}) - -#define FM_FIFO_IS_FULL(fifop) \ -({ \ - fm_bool __ret = fm_false; \ - if (fifop && (fifop)->is_full) { \ - __ret = (fifop)->is_full(fifop); \ - } \ - __ret; \ -}) - -#define FM_FIFO_IS_EMPTY(fifop) \ -({ \ - fm_bool __ret = fm_false; \ - if (fifop && (fifop)->is_empty) { \ - __ret = (fifop)->is_empty(fifop); \ - } \ - __ret; \ -}) - -#define FM_FIFO_RESET(fifop) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->reset) { \ - __ret = (fifop)->reset(fifop); \ - } \ - __ret; \ -}) - -#define FM_FIFO_GET_TOTAL_LEN(fifop) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->get_total_len) { \ - __ret = (fifop)->get_total_len(fifop); \ - } \ - __ret; \ -}) - -#define FM_FIFO_GET_VALID_LEN(fifop) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (fifop && (fifop)->get_valid_len) { \ - __ret = (fifop)->get_valid_len(fifop); \ - } \ - __ret; \ -}) - - -/* - * FM asynchronous information mechanism - */ -struct fm_flag_event { - fm_s32 ref; - fm_s8 name[FM_NAME_MAX + 1]; - void *priv; - - volatile fm_u32 flag; - - /* flag methods */ - fm_u32(*send) (struct fm_flag_event *thiz, fm_u32 mask); - fm_s32(*wait) (struct fm_flag_event *thiz, fm_u32 mask); - long (*wait_timeout) (struct fm_flag_event *thiz, fm_u32 mask, long timeout); - fm_u32(*clr) (struct fm_flag_event *thiz, fm_u32 mask); - fm_u32(*get) (struct fm_flag_event *thiz); - fm_u32(*rst) (struct fm_flag_event *thiz); -}; - -extern struct fm_flag_event *fm_flag_event_create(const fm_s8 *name); - -extern fm_s32 fm_flag_event_get(struct fm_flag_event *thiz); - -extern fm_s32 fm_flag_event_put(struct fm_flag_event *thiz); - -#define FM_EVENT_SEND(eventp, mask) \ -({ \ - fm_u32 __ret = (fm_u32)0; \ - if (eventp && (eventp)->send) { \ - __ret = (eventp)->send(eventp, mask); \ - } \ - __ret; \ -}) - -#define FM_EVENT_WAIT(eventp, mask) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (eventp && (eventp)->wait) { \ - __ret = (eventp)->wait(eventp, mask); \ - } \ - __ret; \ -}) - -#define FM_EVENT_WAIT_TIMEOUT(eventp, mask, timeout) \ -({ \ - long __ret = (long)0; \ - if (eventp && (eventp)->wait_timeout) { \ - __ret = (eventp)->wait_timeout(eventp, mask, timeout); \ - } \ - __ret; \ -}) - -#define FM_EVENT_GET(eventp) \ -({ \ - fm_u32 __ret = (fm_u32)0; \ - if (eventp && (eventp)->get) { \ - __ret = (eventp)->get(eventp); \ - } \ - __ret; \ -}) - -#define FM_EVENT_RESET(eventp) \ -({ \ - fm_u32 __ret = (fm_u32)0; \ - if (eventp && (eventp)->rst) { \ - __ret = (eventp)->rst(eventp); \ - } \ - __ret; \ -}) - -#define FM_EVENT_CLR(eventp, mask) \ -({ \ - fm_u32 __ret = (fm_u32)0; \ - if (eventp && (eventp)->clr) { \ - __ret = (eventp)->clr(eventp, mask); \ - } \ - __ret; \ -}) - -/* - * FM lock mechanism - */ -struct fm_lock { - fm_s8 name[FM_NAME_MAX + 1]; - fm_s32 ref; - void *priv; - - /* lock methods */ - fm_s32(*lock) (struct fm_lock *thiz); - fm_s32(*trylock) (struct fm_lock *thiz, fm_s32 retryCnt); - fm_s32(*unlock) (struct fm_lock *thiz); -}; - -extern struct fm_lock *fm_lock_create(const fm_s8 *name); - -extern fm_s32 fm_lock_get(struct fm_lock *thiz); - -extern fm_s32 fm_lock_put(struct fm_lock *thiz); - -extern struct fm_lock *fm_spin_lock_create(const fm_s8 *name); - -extern fm_s32 fm_spin_lock_get(struct fm_lock *thiz); - -extern fm_s32 fm_spin_lock_put(struct fm_lock *thiz); - -#define FM_LOCK(a) \ -({ \ - fm_s32 __ret = (fm_s32)0; \ - if (a && (a)->lock) { \ - __ret = (a)->lock(a); \ - } \ - __ret; \ -}) - -#define FM_UNLOCK(a) \ -{ \ - if ((a)->unlock) { \ - (a)->unlock(a); \ - } \ -} - - -/* - * FM timer mechanism - */ -enum fm_timer_ctrl { - FM_TIMER_CTRL_GET_TIME = 0, - FM_TIMER_CTRL_SET_TIME = 1, - FM_TIMER_CTRL_MAX -}; - -#define FM_TIMER_FLAG_ACTIVATED (1<<0) - -struct fm_timer { - fm_s32 ref; - fm_s8 name[FM_NAME_MAX + 1]; - void *priv; /* platform detail impliment */ - - fm_s32 flag; /* timer active/inactive */ - void (*timeout_func) (unsigned long data); /* timeout function */ - unsigned long data; /* timeout function's parameter */ - signed long timeout_ms; /* timeout tick */ - /* Tx parameters */ - volatile fm_u32 count; - volatile fm_u8 tx_pwr_ctrl_en; - volatile fm_u8 tx_rtc_ctrl_en; - volatile fm_u8 tx_desense_en; - - /* timer methods */ - fm_s32(*init) (struct fm_timer *thiz, void (*timeout) (unsigned long data), - unsigned long data, signed long time, fm_s32 flag); - fm_s32(*start) (struct fm_timer *thiz); - fm_s32(*update) (struct fm_timer *thiz); - fm_s32(*stop) (struct fm_timer *thiz); - fm_s32(*control) (struct fm_timer *thiz, enum fm_timer_ctrl cmd, void *arg); -}; - -extern struct fm_timer *fm_timer_create(const fm_s8 *name); - -extern fm_s32 fm_timer_get(struct fm_timer *thiz); - -extern fm_s32 fm_timer_put(struct fm_timer *thiz); - -/* - * FM work thread mechanism - */ -struct fm_work { - fm_s32 ref; - fm_s8 name[FM_NAME_MAX + 1]; - void *priv; - - void (*work_func) (unsigned long data); - unsigned long data; - /* work methods */ - fm_s32(*init) (struct fm_work *thiz, void (*work_func) (unsigned long data), - unsigned long data); -}; - -extern struct fm_work *fm_work_create(const fm_s8 *name); - -extern fm_s32 fm_work_get(struct fm_work *thiz); - -extern fm_s32 fm_work_put(struct fm_work *thiz); - - -struct fm_workthread { - fm_s32 ref; - fm_s8 name[FM_NAME_MAX + 1]; - void *priv; - - /* workthread methods */ - fm_s32(*add_work) (struct fm_workthread *thiz, struct fm_work *work); -}; - -extern struct fm_workthread *fm_workthread_create(const fm_s8 *name); - -extern fm_s32 fm_workthread_get(struct fm_workthread *thiz); - -extern fm_s32 fm_workthread_put(struct fm_workthread *thiz); - -#endif /* __FM_UTILS_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h deleted file mode 100644 index fb0cdeb93..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * (C) Copyright 20011 - * MediaTek <www.MediaTek.com> - * Hongcheng Xia<Hongcheng.Xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __FM_CUST_CFG_H__ -#define __FM_CUST_CFG_H__ - -/* scan sort algorithm */ -enum { - FM_SCAN_SORT_NON = 0, - FM_SCAN_SORT_UP, - FM_SCAN_SORT_DOWN, - FM_SCAN_SORT_MAX -}; - -/* ***************************************************************************************** */ -/* ***********************************FM config for customer *********************************** */ -/* ***************************************************************************************** */ -/* RX */ -#define FM_RX_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define FM_RX_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define FM_RX_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define FM_RX_MR_TH 0x01BD /* FM radio MR threshold */ -#define FM_RX_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define FM_RX_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define FM_RX_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define FM_RX_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define FM_RX_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define FM_RX_SCAN_SORT_SELECT FM_SCAN_SORT_NON -#define FM_RX_FAKE_CH_NUM 1 -#define FM_RX_FAKE_CH_RSSI 40 -#define FM_RX_FAKE_CH_1 1075 -#define FM_RX_FAKE_CH_2 0 -#define FM_RX_FAKE_CH_3 0 -#define FM_RX_FAKE_CH_4 0 -#define FM_RX_FAKE_CH_5 0 - -/* TX */ -#define FM_TX_PWR_LEVEL_MAX 120 -#define FM_TX_SCAN_HOLE_LOW 923 /* 92.3MHz~95.4MHz should not show to user */ -#define FM_TX_SCAN_HOLE_HIGH 954 /* 92.3MHz~95.4MHz should not show to user */ - -#endif /* __FM_CUST_CFG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h deleted file mode 100644 index 749a38a32..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h +++ /dev/null @@ -1,972 +0,0 @@ - -const unsigned char channel_parameter[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 -}; - -#if defined(MT6626_FPGA) -const unsigned short bin_rom[] = { - 0x0000, 0x1FFF, 0xBC00, 0x0010, 0xBC00, 0x0271, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, - 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0xBC02, 0x0906, 0xBC20, 0x2019, - 0x4021, 0xFB11, 0xBC02, 0x0807, 0xBC20, 0x2019, 0x4041, 0xFB11, 0xBC22, 0x0480, 0xBC20, - 0x0080, 0x4001, 0x8B02, 0xE401, 0xBC21, 0x0367, 0xA301, 0x0080, 0xBC20, 0x201A, 0x41E1, - 0xFA12, 0xA302, 0x0082, 0x0891, 0x2620, 0x8FF9, 0x3D02, 0xBC21, 0x2018, 0x481E, 0xBC22, - 0x2019, 0x8C69, 0x40C0, 0xA203, 0x0082, 0x2631, 0x8F4B, 0x2634, 0x8F3E, 0x2632, 0x8F1D, - 0xB306, 0x0008, 0x8F0A, 0x40E0, 0xFB50, 0xBC02, 0x1E58, 0xBC22, 0x2019, 0xBC21, 0x2018, - 0x481E, 0x8C53, 0x40C0, 0xFB50, 0xFA33, 0x26B0, 0x8F08, 0xBC02, 0x072A, 0xBC21, 0x2018, - 0x4020, 0x7207, 0xBB30, 0x40C0, 0xBC22, 0x2019, 0xA31E, 0x0082, 0x8D41, 0x40A0, 0x70E0, - 0x3B50, 0xBC21, 0x201D, 0xBC22, 0x201B, 0xFA31, 0xFA52, 0x0810, 0xBC3E, 0x00E4, 0xBC3A, - 0x0692, 0xB400, 0x0002, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0408, 0xBC02, 0x0131, 0x40C0, - 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D23, 0x4080, 0xFB50, 0xBC02, 0x016B, 0x40C0, - 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D18, 0x4060, 0xBC21, 0x201F, 0xFB50, 0xFA30, - 0xBC3E, 0x00C8, 0xBC3A, 0x0652, 0xBC21, 0x03FF, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0801, - 0xBC02, 0x0131, 0x40C0, 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0xA203, 0x0082, 0xB316, - 0x0040, 0x8F91, 0xBC00, 0x001C, 0x6915, 0xA902, 0x8E00, 0xA30E, 0x0085, 0xDFD5, 0xBC02, - 0x0607, 0xBC02, 0x077A, 0xBC20, 0x2019, 0x7040, 0x4FD5, 0xBC22, 0x2008, 0xFB11, 0xFA51, - 0xBC23, 0x4000, 0x0ACB, 0xBC21, 0x2100, 0xFB53, 0xFA32, 0xB314, 0x0020, 0x8FFB, 0x4121, - 0xE9FE, 0xFB11, 0xBC00, 0x1D52, 0xE902, 0xBC20, 0x2019, 0x7060, 0x5FD5, 0x8C02, 0xFB11, - 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, 0x3E02, 0xA200, 0x008C, 0x6980, 0x4FD5, 0x8F02, - 0xA200, 0x0086, 0x2681, 0x8F02, 0x4080, 0xA300, 0x0082, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, - 0xBC20, 0x2019, 0x7068, 0x5FD5, 0x8C02, 0xFB11, 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, - 0x3E02, 0xA200, 0x008C, 0xA201, 0x0088, 0x2681, 0x8F06, 0x4020, 0xA202, 0x008A, 0x1401, - 0x0A10, 0xA300, 0x008A, 0x3409, 0xA300, 0x0088, 0xA201, 0x0086, 0xB300, 0x0010, 0x8F01, - 0x2691, 0x8F09, 0x401C, 0xBC20, 0x2041, 0xA202, 0x008A, 0xA31C, 0x0088, 0xA31C, 0x008A, - 0xFB12, 0x2691, 0x8F16, 0xBC20, 0x2019, 0x41C1, 0x7008, 0x7B11, 0xBC22, 0x2018, 0xBC20, - 0x201A, 0x8C05, 0xFB51, 0x8E00, 0xBC20, 0x201A, 0x8E00, 0xFA10, 0xB310, 0x0008, 0x8FF6, - 0x7040, 0x0FD5, 0x8C03, 0xA300, 0x0082, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, - 0x8E00, 0xDFC0, 0xDFF5, 0xBC02, 0x05A2, 0xA200, 0x0087, 0x2680, 0x8F0C, 0xBC20, 0x2040, - 0x7000, 0x4FC3, 0x700F, 0xBB11, 0x4042, 0xA303, 0x0089, 0xA31E, 0x0087, 0xA301, 0x0086, - 0xFB12, 0xA200, 0x0084, 0x8EA0, 0xBC20, 0x02C7, 0xA300, 0x009B, 0xBC02, 0x00A7, 0x3E01, - 0xBC20, 0x2008, 0xBC21, 0x033D, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7000, - 0x4FF5, 0xBC22, 0x201A, 0x7040, 0x3B11, 0xFA51, 0x2248, 0x8F00, 0xA300, 0x0082, 0x8EC0, - 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0480, 0xBC20, 0x02B3, 0xA300, 0x009B, - 0xBC02, 0x00A7, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0x03F7, 0xBC22, 0x2018, 0x7008, 0x3B11, - 0x7050, 0x3B50, 0xBC21, 0x2019, 0x8C2E, 0xFB30, 0xA200, 0x0081, 0x2601, 0x8F04, 0xBC21, - 0x8000, 0xBC20, 0x2023, 0x8C24, 0xFB11, 0xBC02, 0x01BE, 0xA200, 0x0085, 0x4001, 0xA301, - 0x0081, 0x2682, 0x8F02, 0x4100, 0xA300, 0x0082, 0xBC02, 0x1E58, 0xBC20, 0x201A, 0x8E00, - 0xFA10, 0xB310, 0x0008, 0x8F05, 0xBC20, 0x2019, 0x4161, 0x7008, 0x3B11, 0xA300, 0x0085, - 0xBC02, 0x077A, 0xBC20, 0x2023, 0xBC21, 0x8000, 0xFB11, 0xA200, 0x0082, 0x2604, 0x8FCE, - 0x3E02, 0x7000, 0x4FD5, 0xBC20, 0x2008, 0x8EC0, 0xE9FE, 0xFB11, 0xE902, 0xA200, 0x0098, - 0x6CE0, 0x1FD5, 0x8F57, 0xBC02, 0x0918, 0xBC20, 0x01AE, 0xBC02, 0x09F0, 0xA200, 0x02A7, - 0x2682, 0x8F02, 0xBC20, 0x01AE, 0xBC02, 0x0D50, 0xA200, 0x008E, 0x2606, 0x8F1E, 0x2604, - 0x8F17, 0x2602, 0x8F0B, 0x2600, 0x8F05, 0xA200, 0x008D, 0x2680, 0x8F20, 0xBC02, 0x0BDE, - 0x8D1F, 0xBC02, 0x0E6E, 0x8D1C, 0xBC20, 0x2032, 0x4101, 0xFA10, 0x0801, 0xA300, 0x01E3, - 0xBC02, 0x0A17, 0x8D12, 0xBC02, 0x0AA2, 0xBC02, 0x0CA4, 0x8D0D, 0xA200, 0x0085, 0x2601, - 0x8F05, 0xA200, 0x02C7, 0x2601, 0x8F01, 0xBC02, 0x0B48, 0x8D02, 0xBC02, 0x0B2B, 0xA201, - 0x01BE, 0xBC20, 0x01AE, 0xBC02, 0x0A72, 0xBC20, 0x01E7, 0xBC02, 0x0B04, 0xA200, 0x0266, - 0x2680, 0xBC20, 0x01E7, 0x8F03, 0xBC21, 0x7FFF, 0xBC02, 0x0B8C, 0x8D04, 0xA201, 0x01FF, - 0xBC02, 0x0B8C, 0xBC02, 0x0C54, 0xA200, 0x0099, 0x2600, 0x8F02, 0xBC02, 0x195E, 0xBC02, - 0x1926, 0xA200, 0x009A, 0x2600, 0x8F02, 0xB000, 0xFFFF, 0xA300, 0x009A, 0xBC20, 0x2040, - 0x4021, 0xFA10, 0x0801, 0x2600, 0x8F0A, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, - 0x2680, 0x8F02, 0xA200, 0x009A, 0x2600, 0x8F15, 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, - 0xBC20, 0x2008, 0xBC21, 0x0080, 0xFA12, 0x0851, 0x2610, 0x8F0B, 0xFA11, 0xBC22, 0xFF7F, - 0x084A, 0x7000, 0x3B11, 0xBC02, 0x05B3, 0x8D03, 0x4020, 0xA300, 0x0099, 0x7038, 0x4FD5, - 0xA200, 0x008E, 0xE9FE, 0x3401, 0x8EC0, 0x0801, 0xA300, 0x008E, 0x4020, 0xBC21, 0x00C0, - 0xA300, 0x0091, 0xA300, 0x0092, 0xA301, 0x0098, 0x8EC0, 0xA300, 0x0090, 0xA300, 0x008F, - 0xE918, 0x8E00, 0xDD05, 0xBC25, 0x2096, 0xDD5B, 0xFAB5, 0xA205, 0x009B, 0xDD7A, 0xDD9F, - 0xDDBE, 0xDDDD, 0xDDFC, 0xDE0B, 0xDE2C, 0xDE49, 0xDE68, 0xDE8F, 0xDEAE, 0xDED5, 0xDEE6, - 0xDF04, 0xDF23, 0xDF42, 0xDF61, 0xDF80, 0xDD27, 0xF9FC, 0x8EA5, 0xBC20, 0x2096, 0xBC21, - 0x00FF, 0xFA10, 0x6220, 0x4D05, 0xA203, 0x0096, 0x6854, 0xCD27, 0x6624, 0xCF80, 0xA302, - 0x0096, 0xCF61, 0xCF42, 0xCF23, 0xCF04, 0xCEE6, 0xCDFC, 0xCDDD, 0xCDBE, 0xCD9F, 0xCD7A, - 0xCD5B, 0xF8FC, 0xCED5, 0xCEAE, 0xCE8F, 0xCE68, 0xCE49, 0xCE2C, 0xCE0B, 0xE9E8, 0x8EC8, - 0xBC20, 0x2102, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, - 0x02DB, 0xBC20, 0x02DB, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2104, - 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, 0x0423, 0xBC20, - 0x0423, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xE906, 0xA202, 0x0090, 0x69A8, - 0x1F95, 0x8F19, 0xBC24, 0x2081, 0xBC23, 0x2082, 0xFA95, 0xBC24, 0x2015, 0xFA73, 0xA21A, - 0x0461, 0xA21E, 0x046B, 0xA210, 0x0361, 0xFA94, 0xA305, 0x02CA, 0xA303, 0x02CB, 0xA310, - 0x02C8, 0xA31A, 0x02C9, 0xA304, 0x02CC, 0xA31E, 0x02CD, 0x26A6, 0x8F32, 0xBC23, 0x027F, - 0xBC24, 0x026F, 0x4022, 0xBD10, 0x0306, 0xE205, 0xE585, 0xA21C, 0x02C8, 0xA21A, 0x02CA, - 0xA21E, 0x02CB, 0xA210, 0x02C9, 0xA205, 0x02CC, 0xA203, 0x02CD, 0xA204, 0x0081, 0xA31C, - 0x02C2, 0xA310, 0x02C3, 0xA31A, 0x02C4, 0xA31E, 0x02C5, 0xA305, 0x02C6, 0xA303, 0x02C7, - 0x2640, 0x8F03, 0xA203, 0x0095, 0x34D9, 0xA303, 0x0095, 0xA203, 0x0098, 0xA302, 0x0081, - 0x3230, 0x8F02, 0xB026, 0xFFFF, 0xA302, 0x0098, 0xA200, 0x028F, 0x421E, 0x403A, 0xBC3C, - 0x027F, 0xBC22, 0x2033, 0xE064, 0xBC23, 0x2034, 0xE065, 0xFB54, 0xFB75, 0xA300, 0x028F, - 0xBC02, 0x1BC3, 0xBC22, 0x3105, 0xA200, 0x0313, 0x700E, 0xBA52, 0x3BC2, 0xBC22, 0x2139, - 0xBC3C, 0x02E0, 0xBD05, 0x0352, 0xFA53, 0xE463, 0xA202, 0x0099, 0x2620, 0xA300, 0x0313, - 0x385A, 0x8F10, 0xBC23, 0x2008, 0xBC24, 0x0080, 0xFA75, 0x0B2C, 0xBC25, 0x2103, 0xFB74, - 0xFAB3, 0xBC24, 0x4000, 0x08DC, 0x2630, 0x8F01, 0xBC02, 0x15BE, 0x4022, 0xA203, 0x0091, - 0x26B0, 0x8F05, 0xBC20, 0x2012, 0xBC21, 0x2014, 0xBC02, 0x106C, 0x4022, 0xA203, 0x0093, - 0xB306, 0x0011, 0x4003, 0x1893, 0xA204, 0x0091, 0x6D28, 0x5FA2, 0x4244, 0x2214, 0x18DA, - 0xA202, 0x008F, 0x2620, 0xA303, 0x0091, 0x8F67, 0x2621, 0x8F53, 0x2622, 0x8F2B, 0x26A3, - 0x8F26, 0xBC02, 0x118C, 0xCFA2, 0x2620, 0xBC20, 0x2015, 0x8F0E, 0xA201, 0x0097, 0xBC02, - 0x101D, 0xBC02, 0x1391, 0xBC02, 0x1DAA, 0xA202, 0x0097, 0x2622, 0x4043, 0x8F00, 0x34D1, - 0xA303, 0x0097, 0xA202, 0x0093, 0x3511, 0x4242, 0x21E2, 0xA203, 0x0094, 0x4005, 0x34D9, - 0x192C, 0x4062, 0x08DA, 0xA304, 0x0093, 0x8C51, 0xA303, 0x0094, 0x8C4E, 0x4062, 0x3854, - 0xB004, 0xFFFB, 0xDFC0, 0xBC02, 0x121B, 0x6E15, 0x0FC0, 0xB014, 0xFFFA, 0xDFC1, 0xBC02, - 0x1277, 0xBC02, 0x12BC, 0xCFC0, 0xBC21, 0x0464, 0xBC02, 0x1326, 0x7018, 0x8FA3, 0x2630, - 0x8F33, 0xA201, 0x0097, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, - 0xBC02, 0x1092, 0x4062, 0x8D27, 0xBC02, 0x118C, 0xBC02, 0x11E4, 0xBC02, 0x1B03, 0x7018, - 0x8FA3, 0x2630, 0x8F1B, 0xA201, 0x0097, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x4062, 0x8D15, - 0xBC02, 0x12BC, 0xCFA2, 0x2620, 0x8F00, 0xBC02, 0x1E00, 0xBC02, 0x10FF, 0xA202, 0x0094, - 0x26A0, 0x4062, 0x8F05, 0xA203, 0x047B, 0x2630, 0x8F01, 0xBC02, 0x115E, 0x4062, 0xA204, - 0x008F, 0xA203, 0x0090, 0x6D48, 0x4F95, 0x34D9, 0x40E6, 0xA205, 0x008D, 0x08DE, 0x08A2, - 0x26D0, 0xA303, 0x0090, 0xA302, 0x008F, 0x8F04, 0xBC22, 0x31F8, 0xDF95, 0xFA52, 0x8EA2, - 0xCF95, 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xA200, 0x0092, 0xDFC0, 0xDFF5, 0xBC02, - 0x10DC, 0xCFC0, 0xB300, 0x0044, 0x8F2B, 0xA201, 0x0097, 0xB300, 0x0045, 0x8F21, 0xB300, - 0x0046, 0x8F14, 0xCFC0, 0xB310, 0x0047, 0x8F21, 0xA200, 0x0470, 0x2680, 0x8F00, 0xBC02, - 0x0F91, 0xBC02, 0x1DAA, 0xA200, 0x0097, 0x2602, 0x4041, 0x8F00, 0x3441, 0xA301, 0x0097, - 0x8D12, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, 0xBC02, 0x1092, - 0x8D07, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x8D02, 0xBC02, 0x1E00, 0x7240, 0x4FC0, 0x6D00, - 0x4FF5, 0x21C1, 0x4001, 0x1808, 0xA201, 0x008D, 0x2690, 0xA300, 0x0092, 0x8F04, 0xBC20, - 0x31F8, 0xDFD5, 0xFA10, 0x8EA0, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x009C, - 0xBC21, 0x047C, 0x0448, 0x3489, 0x32A0, 0x4001, 0x8F01, 0x8B02, 0xE401, 0x8EB8, 0xE902, - 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0xBC20, 0x3173, 0xBC21, 0x3010, 0xBC24, 0x02A8, 0xBC22, - 0x2032, 0x7014, 0x3A10, 0x4085, 0x700F, 0x3A31, 0xA300, 0x01E5, 0xFA53, 0xBC40, 0x1605, - 0xA301, 0x0467, 0x4100, 0xBC40, 0x1E10, 0xBC40, 0x2610, 0x6206, 0x2610, 0xFA51, 0x6213, - 0x6650, 0xBC3A, 0x0184, 0xBC3E, 0x01C0, 0x4503, 0x4444, 0xBC2E, 0x0160, 0xBC2F, 0x0170, - 0xB048, 0x009C, 0xB056, 0x009C, 0xA300, 0x01E3, 0xA301, 0x01F7, 0xA31C, 0x0468, 0xA31C, - 0x0461, 0xA31C, 0x045C, 0xA30E, 0x016E, 0xA30F, 0x017E, 0xA31A, 0x01AC, 0xA31A, 0x01AD, - 0xA31E, 0x01E0, 0xA31E, 0x01E1, 0xA304, 0x015E, 0xA305, 0x015F, 0xBC20, 0x3136, 0xBC21, - 0x3163, 0xBD04, 0x04D2, 0xFA04, 0xFB24, 0xFA0C, 0xFB24, 0xBD04, 0x04D8, 0xFA0C, 0xFB24, - 0xBC20, 0x31B2, 0x7717, 0xBA51, 0x7006, 0xBA14, 0x38BC, 0x084D, 0xB048, 0x319C, 0xA301, - 0x0266, 0xBC20, 0x0200, 0xFA91, 0xB040, 0x0050, 0xB060, 0x0010, 0xA304, 0x0261, 0xA300, - 0x0260, 0xA306, 0x0262, 0xFA52, 0x4044, 0x1609, 0x41E6, 0x0894, 0x1406, 0xB4F2, 0x0001, - 0x0B07, 0xBC20, 0x01F9, 0xA302, 0x02A7, 0xBC40, 0x1C01, 0xBC40, 0x3401, 0x144E, 0x24A1, - 0xBC24, 0x029A, 0xBC40, 0x140C, 0xBC21, 0x0267, 0xBC22, 0x0294, 0xBC3C, 0x4000, 0x6D79, - 0x640E, 0xBC3F, 0x0285, 0xBC3B, 0x0290, 0xBC30, 0x2000, 0x7000, 0x244F, 0xBC40, 0x6607, - 0xA31F, 0x028F, 0xA31B, 0x0293, 0xBC40, 0x0C9C, 0xBC40, 0x149C, 0xBC40, 0x151E, 0xBC40, - 0x2C80, 0xBC40, 0x3490, 0xBC40, 0x3C9A, 0xBC40, 0x2D10, 0xBC40, 0x1D03, 0x40A7, 0xBC02, - 0x05B3, 0xB04A, 0x0318, 0xBC23, 0x30FD, 0xBC22, 0x30FF, 0xA304, 0x0325, 0xFA74, 0xFA52, - 0x04F2, 0xBC21, 0x02E0, 0x3589, 0xB00E, 0x0318, 0xA306, 0x0312, 0xA300, 0x0326, 0xBC26, - 0x30FC, 0xBC20, 0x3102, 0xFAD6, 0xFA10, 0xA306, 0x0360, 0x14AA, 0x1428, 0x14EB, 0xA304, - 0x035F, 0xBC26, 0x2021, 0x35CD, 0xBC25, 0x0327, 0xBC24, 0x07C0, 0xBC3E, 0x7FFF, 0xBC3A, - 0x0320, 0xB012, 0x0019, 0xB024, 0xFFFF, 0xB000, 0xFFFF, 0x6D4B, 0x3BD4, 0xA305, 0x0354, - 0xA31E, 0x047A, 0xA31A, 0x02DC, 0xA301, 0x0314, 0xA307, 0x0313, 0xA304, 0x0353, 0xA302, - 0x0363, 0xA303, 0x0364, 0xA300, 0x0365, 0xBC02, 0x0263, 0xBC02, 0x07A4, 0xBC20, 0x2023, - 0xBC21, 0x4000, 0x700F, 0xBA10, 0x0801, 0x2680, 0x8F09, 0xBC20, 0x2040, 0x7008, 0x4FD5, - 0xFA10, 0x0801, 0x2600, 0x8F10, 0xA301, 0x0099, 0x8D0F, 0xBC20, 0x2008, 0xBC21, 0xFF7F, - 0x7007, 0x3A12, 0x6214, 0x4FD5, 0xA31C, 0x0099, 0xA31C, 0x02A7, 0xA31E, 0x008D, 0xFB11, - 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0x6914, 0x4FD5, 0x4020, - 0xE9FE, 0xA309, 0x008B, 0xA309, 0x008C, 0xA300, 0x00A0, 0xBC00, 0x0263, 0xBC22, 0x036A, - 0xBC21, 0x044C, 0x044A, 0x3509, 0x32C0, 0x4001, 0x4023, 0x8F01, 0x8B04, 0xE501, 0x2680, - 0x8F02, 0xBC22, 0x2040, 0x8E00, 0xFB51, 0xBC22, 0x305A, 0x40BC, 0x703F, 0xBA52, 0xBC3A, - 0x0376, 0xBC2E, 0x0399, 0x4FEF, 0xBC28, 0x03A8, 0x2680, 0x149A, 0x4270, 0xA31E, 0x0372, - 0xA31A, 0x0375, 0xA310, 0x0395, 0xA31C, 0x0396, 0xA31C, 0x0397, 0xA30E, 0x0398, 0xA30F, - 0x03B8, 0xA308, 0x03A6, 0xA302, 0x03A5, 0xBC20, 0x2040, 0x8F01, 0x4042, 0xFB12, 0xBC20, - 0x3079, 0xBC3E, 0x03DC, 0xBC3A, 0x041A, 0xBC24, 0x2044, 0xFA03, 0xBC30, 0x03F1, 0xA31E, - 0x03DB, 0xA31A, 0x0442, 0xA310, 0x03F0, 0xFB91, 0xA301, 0x03E2, 0xA303, 0x03E0, 0xBC22, - 0x2043, 0x8EC0, 0xA300, 0x03E1, 0xFB51, 0xE902, 0xA200, 0x008C, 0xA201, 0x0082, 0x6980, - 0x5FD5, 0x8F16, 0x2611, 0x8F14, 0x2612, 0x8F11, 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, - 0x2680, 0x8F00, 0xBC02, 0x06A8, 0xBC20, 0x201F, 0xBC21, 0x03FF, 0xFA10, 0x0801, 0xBC22, - 0x2002, 0x8C06, 0xFB50, 0xBC20, 0x2002, 0xA201, 0x0089, 0xFB11, 0xBC20, 0x2000, 0x4021, - 0xFB11, 0xFA11, 0x2693, 0x8FFC, 0x8E00, 0xBC20, 0x2000, 0x4001, 0xBC22, 0x2020, 0x7010, - 0x3B11, 0xFA51, 0x0808, 0x2600, 0x4021, 0x8F0C, 0xBC20, 0x2001, 0x8E00, 0xFB11, 0xFA11, - 0x2693, 0x8FFC, 0x8E00, 0x7000, 0x4FD5, 0xBC20, 0x2001, 0x8C02, 0xFB11, 0xCFD5, 0x8E00, - 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x201B, 0x4022, 0xFA10, 0x4381, 0x0902, 0x0841, 0x4043, - 0x2640, 0x0803, 0x124B, 0xA204, 0x0089, 0xBC23, 0x201D, 0x8F10, 0x0461, 0xFA73, 0xA301, - 0x0089, 0x218B, 0x8F1A, 0x2600, 0xBC20, 0x201C, 0x8F03, 0xFA10, 0x8C15, 0xA300, 0x0089, - 0xA302, 0x0086, 0x8D10, 0xBC25, 0x201C, 0x0061, 0xFAB4, 0xA301, 0x0089, 0x208C, 0x8F07, - 0x2600, 0x8F03, 0xFA70, 0x8C04, 0xA300, 0x0089, 0xA302, 0x0086, 0xBC20, 0x201F, 0xBC21, - 0x03FF, 0xFA10, 0xA203, 0x0089, 0x0801, 0x2258, 0x8F03, 0x8EC0, 0xA302, 0x0086, 0x8E00, - 0x8EB8, 0xBC20, 0x201B, 0x4381, 0xFA10, 0x0801, 0xA201, 0x0089, 0xB480, 0x0002, 0xBC22, - 0x201C, 0x0008, 0xFA51, 0x2001, 0xA300, 0x0089, 0x8F03, 0x8EC0, 0x4020, 0xA300, 0x0086, - 0x8EB8, 0xE902, 0xBC22, 0x2000, 0xDFD5, 0x41A3, 0xBC02, 0x0723, 0x4344, 0xBC25, 0x0400, - 0x2620, 0x8F05, 0xBC02, 0x07F0, 0x5404, 0x4025, 0xBC02, 0x07F0, 0x8D06, 0xBC02, 0x07FB, - 0x5404, 0x4025, 0xBC02, 0x07FB, 0xBC02, 0x072A, 0x4E20, 0xBC02, 0x07B8, 0xBC20, 0x0001, - 0x0848, 0xB412, 0x0000, 0xBC22, 0x1000, 0x4183, 0xBC02, 0x0723, 0x220A, 0x8F3F, 0xDFE2, - 0xBC21, 0x2098, 0x41C2, 0xFA33, 0x0ADA, 0xFB33, 0x4060, 0x4841, 0xBC02, 0x07D8, 0xBC21, - 0x2098, 0x4202, 0xBC20, 0xFFFE, 0x0ADA, 0xFB33, 0x08D8, 0xFB33, 0x4E20, 0xBC02, 0x07B8, - 0xBC22, 0xFFFE, 0x084A, 0xCFE2, 0x0A4A, 0xBC02, 0x07CA, 0x4224, 0xBC25, 0x4000, 0xBC02, - 0x07FB, 0x4044, 0x4045, 0xBC02, 0x07FB, 0x4284, 0x4105, 0xBC02, 0x07FB, 0x4284, 0x4105, - 0xBC02, 0x07F0, 0xCFE0, 0xBC02, 0x0733, 0x4E24, 0x4045, 0xBC02, 0x07FB, 0x4E24, 0x4045, - 0xBC02, 0x07F0, 0xBC20, 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0xBC22, 0x4000, 0x41C3, - 0xBC02, 0x0723, 0x38A2, 0x4E20, 0xBC02, 0x07B8, 0xB55A, 0x0002, 0x0A4D, 0xBC02, 0x07CA, - 0xCFD5, 0xE9FE, 0x8EB8, 0xBC20, 0x201F, 0x8E00, 0xFA10, 0x0890, 0x1093, 0x8EB8, 0xE902, - 0x4E24, 0xDFD5, 0x4085, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, 0xBC21, 0x202D, - 0xDFD5, 0xDFE0, 0x4280, 0xBC02, 0x07CA, 0xBC22, 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, - 0x1853, 0x42C0, 0xBC02, 0x07CA, 0x4240, 0xBC21, 0xE419, 0xBC02, 0x07CA, 0x4260, 0xBC21, - 0x9010, 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FFB, 0xBC02, 0x07CA, 0x4220, 0xBC21, 0x2020, - 0xBC02, 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x1020, 0xBC02, - 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07CA, - 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07D8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07CA, 0xCFD5, - 0xE9FE, 0x8EB8, 0xE902, 0xBC20, 0x2023, 0xDFD5, 0xFA16, 0xBC20, 0x2000, 0x09B0, 0xDFE6, - 0x4060, 0xBC02, 0x07B8, 0xBC22, 0x39AE, 0xBC23, 0x19AE, 0xCFE6, 0x2660, 0x195A, 0x220D, - 0x8F02, 0x3825, 0xBC02, 0x07CA, 0x4480, 0xBC02, 0x07B8, 0xBC22, 0x0000, 0xBC23, 0x0001, - 0xCFE6, 0x2660, 0x195A, 0x220D, 0x8F02, 0x3825, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, - 0xE902, 0x4E04, 0x4805, 0xDFD5, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, 0x2600, - 0x8F01, 0xBC02, 0x07FB, 0x8D02, 0xBC02, 0x07F0, 0xCFD5, 0xE9FE, 0x8EB8, 0xBC22, 0x209A, - 0xBC23, 0x0100, 0x0AD8, 0xBC21, 0x209D, 0xFB53, 0x4043, 0xFA32, 0x0893, 0x26A0, 0x8FFA, - 0xBC22, 0x209C, 0x8E00, 0xFA51, 0x8EB8, 0xBC22, 0x209A, 0xBC23, 0x209B, 0xFB50, 0xBC22, - 0x209D, 0xFB71, 0x4023, 0xFA51, 0x084B, 0x2690, 0x8FFB, 0x8EB8, 0xBC08, 0x07E6, 0x8E00, - 0xBDC8, 0x07E5, 0x8E00, 0xBC09, 0x07E4, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, - 0x8E00, 0x8EB8, 0xBC08, 0x07EE, 0x8E00, 0xBC09, 0x07ED, 0x8E00, 0x8E00, 0x8EB8, 0xE902, - 0x3804, 0xDFD5, 0xBC02, 0x07B8, 0x0A4D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, - 0x1745, 0xDFD5, 0x3804, 0xBC02, 0x07B8, 0x084D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, - 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, 0x2600, 0x8F00, 0x8EB8, 0xE902, 0x4020, 0xDFD5, - 0xBC21, 0x1F2A, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, - 0x402D, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, 0x5FED, 0xBC02, - 0x07CA, 0x4020, 0xBC21, 0x1F6A, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, - 0xBC21, 0x7FED, 0xBC02, 0x07CA, 0x4500, 0x4461, 0xBC02, 0x07E8, 0xBC20, 0x2023, 0xBC22, - 0x39AE, 0xBC23, 0x19AE, 0xFA10, 0xBC21, 0x2000, 0x0841, 0x38C1, 0x2610, 0x185A, 0x4060, - 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FF9, 0xBC02, 0x07CA, 0xBC20, 0x000A, 0x4461, 0xBC02, - 0x07E8, 0x4022, 0x4003, 0x2660, 0x1853, 0x4480, 0xBC02, 0x07CA, 0x4540, 0xBC02, 0x07B8, - 0xDFE1, 0x40C0, 0x4202, 0x41E3, 0x4104, 0xBC25, 0x31EC, 0x41E6, 0xBC02, 0x08EC, 0x41C0, - 0xBC24, 0x87FF, 0x4166, 0xBC02, 0x08F9, 0xCFE1, 0x4000, 0x4402, 0x43E3, 0x4164, 0xBC25, - 0x31ED, 0x43E6, 0xBC02, 0x08EC, 0xDFE5, 0x4180, 0xBC24, 0xFF07, 0x4066, 0xBC02, 0x08F9, - 0xCFE5, 0x40E0, 0xBC24, 0xFFE0, 0x4006, 0xBC02, 0x08F9, 0x4000, 0xBC02, 0x0733, 0xBC20, - 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0x4500, 0x4401, 0xBC02, 0x07CA, 0x4140, 0xBC21, - 0x0841, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4841, 0xBC02, 0x07E8, 0x4140, 0xBC21, 0x0840, - 0xBC02, 0x07CA, 0x4500, 0x4001, 0xBC02, 0x07CA, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, - 0x084A, 0x2610, 0x8F0A, 0x5364, 0x4065, 0xBC02, 0x07F0, 0x4AC0, 0x4021, 0xBC02, 0x07CA, - 0xBC21, 0x1FFA, 0x8D02, 0xBC21, 0x1FFB, 0x4040, 0xBC02, 0x07CA, 0x4C80, 0x4841, 0xBC02, - 0x07E8, 0x41E0, 0xBC21, 0x4042, 0xBC02, 0x07CA, 0xBC02, 0x07A4, 0x4E80, 0x4021, 0xBC02, - 0x07CA, 0x4E60, 0xBC21, 0x0480, 0xBC02, 0x07CA, 0x5380, 0xBC21, 0xAB40, 0xBC02, 0x07CA, - 0x4102, 0x4503, 0xBC24, 0x2023, 0xBC25, 0x0400, 0xFA94, 0x0925, 0x2640, 0x1853, 0x53C0, - 0xBC02, 0x07CA, 0x4E04, 0x4025, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0x1048, 0x0891, - 0x08D9, 0x2620, 0x1863, 0xFAB2, 0x004A, 0x4002, 0x3210, 0x1851, 0x210E, 0x1971, 0x8EB8, - 0xE901, 0x8E00, 0xDFF5, 0xBC02, 0x07B8, 0x0861, 0x316E, 0x0A4D, 0xBC02, 0x07CA, 0xCFF5, - 0xE9FF, 0x8EB8, 0xBC20, 0x209F, 0xBC21, 0x31DB, 0xA300, 0x047E, 0xA301, 0x047D, 0xBD11, - 0x0911, 0xFA22, 0xFB02, 0x8EC0, 0xA300, 0x047E, 0xA301, 0x047D, 0x0000, 0x6915, 0xA908, - 0xA21B, 0x0180, 0xA21E, 0x017E, 0xA21D, 0x016E, 0xBC3C, 0x3116, 0xBC30, 0x311D, 0x7016, - 0xDF1B, 0xA204, 0x017F, 0xA202, 0x0181, 0xA203, 0x0182, 0xA201, 0x01AD, 0x6915, 0x1F3D, - 0x77F6, 0x9F5E, 0xBC26, 0x3106, 0xDF70, 0xDF9C, 0xBD08, 0x09DB, 0xA200, 0x015E, 0xBC3C, - 0x009C, 0xBC3E, 0x00C2, 0xA304, 0x017F, 0x6E7B, 0x9FA1, 0x6E43, 0xBAC5, 0x6E4B, 0xBE18, - 0x396C, 0x8A0E, 0xBF95, 0x8A18, 0x77E6, 0x9FC6, 0x6A91, 0x7AD5, 0x7077, 0xFE18, 0x6A91, - 0x4F86, 0x88D0, 0x6E62, 0xFAC7, 0x6E7A, 0x5FE0, 0x39C8, 0x8890, 0xBC3D, 0x0170, 0x6FCA, - 0x4F41, 0x6910, 0xBAC5, 0x6910, 0xFF38, 0x7016, 0xBE38, 0x2A47, 0x6A91, 0xFE38, 0xBF95, - 0x8A38, 0x6A91, 0x7AC7, 0xBF95, 0x8A38, 0xBF9D, 0x8E38, 0xBF95, 0xAA38, 0x2A47, 0x6A91, - 0xFE38, 0x2A45, 0x88D0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xB06C, 0xFFFA, 0x613E, 0xDF86, - 0xBC26, 0x7ADD, 0xBCB7, 0x8000, 0x04AA, 0xBC26, 0x7ADD, 0xBCA5, 0x8000, 0xA300, 0x015E, - 0x6025, 0x0F00, 0x6FCB, 0xCFC4, 0x6036, 0x0FE0, 0xB048, 0xFFF1, 0x6910, 0xBF38, 0x6910, - 0xDF41, 0xFA86, 0x6960, 0x3E18, 0x8A0E, 0xBF99, 0x0C18, 0x7076, 0x9F07, 0x6A91, 0xBA96, - 0x7016, 0xBE18, 0x2A46, 0x88E0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xA300, 0x015E, 0x7077, - 0x8F20, 0xBC3C, 0x0160, 0x6FCD, 0xCF66, 0x6910, 0xBF18, 0x6910, 0xFAC7, 0x7147, 0xFE18, - 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0xBF9D, - 0x8E18, 0x2A47, 0xBF9D, 0xAE18, 0x2A47, 0x88F0, 0xB06C, 0xFFFA, 0x6E62, 0xDF66, 0x39E9, - 0x39C8, 0x88E0, 0x0E7A, 0x3F3E, 0x63EC, 0xFF18, 0x6FC3, 0x8FA1, 0xBC3D, 0x0184, 0xB068, - 0xFFF1, 0x6915, 0xBF38, 0x6915, 0x1F20, 0x5FDA, 0x3885, 0xCF1E, 0xCF50, 0xA310, 0x017E, - 0xA301, 0x01AD, 0xA304, 0x017F, 0xA302, 0x0181, 0xA31E, 0x0180, 0xA303, 0x0182, 0xCF3B, - 0x8EC0, 0xE9F8, 0xA31B, 0x016E, 0x0000, 0x2451, 0xA201, 0x01AC, 0x3909, 0xBC22, 0x3124, - 0x2453, 0xBC3D, 0x0184, 0x451F, 0xBD08, 0x0A11, 0x77F6, 0xFA43, 0x2442, 0x6960, 0x3E38, - 0x8A0C, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x439B, 0x6E18, - 0x2403, 0xB024, 0xFFF3, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01AC, 0x8E00, - 0xBC20, 0x3131, 0xA201, 0x02C2, 0xFA10, 0x2600, 0x8F3E, 0xA200, 0x01E2, 0x2680, 0x8F39, - 0x2610, 0xA200, 0x01BE, 0xB010, 0xFFFF, 0x8F2C, 0xA202, 0x01E3, 0x26A0, 0x8F28, 0xBC22, - 0x02A8, 0xBC23, 0x3133, 0xBC24, 0x3132, 0xBC40, 0x3906, 0xFA73, 0xBC25, 0x3134, 0xBC27, - 0x3135, 0xBC40, 0x3102, 0xFA94, 0x04F3, 0xFAB5, 0xFAF6, 0x04A2, 0x1095, 0x10DE, 0x1D1A, - 0x4003, 0x3240, 0x3843, 0x8F02, 0xB228, 0x0040, 0x4803, 0x18DC, 0x2103, 0x8F05, 0x2183, - 0x8F18, 0x3401, 0xA300, 0x01BE, 0x8D15, 0x8C14, 0xA301, 0x01BE, 0x3280, 0x4002, 0x8F0D, - 0xA301, 0x01BE, 0x8D0C, 0x8C0B, 0x4002, 0x2690, 0x4800, 0x4002, 0x8F03, 0x8E00, 0x8C04, - 0xA302, 0x01BE, 0xA300, 0x01BE, 0xA200, 0x01BE, 0x2600, 0xBC21, 0x2035, 0x4020, 0x8EC0, - 0x1810, 0xFB30, 0x0000, 0x38E0, 0xA200, 0x01E1, 0xB202, 0x0040, 0x405A, 0xBC3C, 0x01C0, - 0x441E, 0x8F0F, 0x6E11, 0xE800, 0xBD08, 0x0A88, 0x6D74, 0xA103, 0xE142, 0x1B1A, 0x0E9A, - 0x3F14, 0x6E11, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xB522, 0x0009, 0x3867, - 0xBD08, 0x0A9D, 0x6D76, 0xA184, 0xE1C3, 0xBCB6, 0x8000, 0x8E00, 0x1B63, 0x0EE3, 0x3F1D, - 0x6E19, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xA200, 0x01F7, 0x2600, 0xA200, - 0x01E4, 0x8F44, 0xA201, 0x01F8, 0x2690, 0x8F41, 0xBC21, 0x3173, 0xA202, 0x01E5, 0xFA31, - 0x2191, 0x8F02, 0x3491, 0xA302, 0x01E5, 0xA202, 0x01E5, 0x2251, 0x8F33, 0xBC21, 0x02A8, - 0xBC23, 0x316F, 0xBC25, 0x316C, 0xBC40, 0x4086, 0xFA73, 0xBC22, 0x316D, 0xBC24, 0x316E, - 0x680C, 0xFAB3, 0xFA52, 0xFA94, 0x38A3, 0x8F04, 0xBC23, 0x3170, 0x8E00, 0xFA73, 0x2033, - 0x18D4, 0xBC26, 0x3171, 0xBC40, 0x4881, 0xFAD6, 0x210E, 0x8F04, 0xBC25, 0x3172, 0x8E00, - 0xFAB5, 0x210D, 0x1954, 0x1E5D, 0x2208, 0x401E, 0x8F0A, 0x2108, 0xA31E, 0x01E5, 0x8F03, - 0x8E00, 0x8C05, 0xB000, 0xFFFF, 0x3401, 0x8D01, 0x4000, 0x40A1, 0x2801, 0xA300, 0x01E4, - 0x382E, 0xB012, 0x3136, 0xBC20, 0x3163, 0xBD04, 0x0AFB, 0xFA22, 0xFB02, 0xFA2A, 0xFB02, - 0xBD04, 0x0B01, 0xFA2A, 0xFB02, 0x8EB8, 0x0000, 0x2451, 0xA201, 0x01E0, 0x3909, 0xBC22, - 0x3163, 0x2453, 0xBC3D, 0x01C0, 0x441F, 0xBD08, 0x0B25, 0x77F6, 0xFA43, 0x2442, 0x6960, - 0x3E38, 0x8A08, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x429B, - 0x6E18, 0x2403, 0xB024, 0xFFF7, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01E0, - 0x8E00, 0xBC20, 0x31B2, 0x5FE1, 0xFA10, 0xB020, 0x319C, 0xB012, 0x319C, 0x0008, 0xBC23, - 0x01F9, 0xFA10, 0xBC40, 0x1981, 0x6862, 0x3A52, 0xBC40, 0x3582, 0x8F06, 0xA200, 0x0085, - 0x2681, 0x8F03, 0x8EC0, 0x4040, 0xA300, 0x0085, 0x8EB8, 0x0000, 0xBC21, 0x02A8, 0xBC23, - 0x0263, 0xBC40, 0x4880, 0xBC40, 0x5084, 0x6E10, 0xE580, 0x7000, 0x25C4, 0xA203, 0x0266, - 0xBC40, 0x5881, 0x2630, 0xBC40, 0x1501, 0x401C, 0x8F28, 0x3820, 0xB532, 0x0002, 0xB036, - 0x3174, 0x3882, 0x6910, 0xBA65, 0x6960, 0x2206, 0x8A02, 0xBBD4, 0xCA86, 0x6A3D, 0x7A73, - 0x88C0, 0x3215, 0x00E3, 0x8F05, 0xB416, 0x0002, 0x0441, 0x3214, 0x1801, 0x8C0A, 0x3B80, - 0x3330, 0x8F04, 0x2614, 0x8F04, 0x8E00, 0x8CE1, 0x3449, 0x344D, 0x8DDE, 0xBC20, 0x31B2, - 0x383C, 0xFA10, 0x2108, 0x1801, 0xB000, 0x319C, 0x8EC0, 0xFA10, 0xA300, 0x01FF, 0xBC25, - 0x01F9, 0x34AB, 0xE904, 0xE143, 0x6122, 0xDF82, 0x3320, 0x8F02, 0xBC23, 0x31B4, 0x8C05, - 0xFA73, 0xBC23, 0x31B3, 0x8E00, 0xFA73, 0x2813, 0xA201, 0x0260, 0xBC40, 0x268E, 0xBC40, - 0x2E8F, 0x6D4A, 0xA29E, 0x700E, 0xE2DC, 0x7307, 0xDFDE, 0x6E7F, 0x224C, 0xCFCE, 0x6A34, - 0xDFA5, 0x6E28, 0x2800, 0xBC3D, 0x0200, 0x6EE3, 0xE287, 0x88E0, 0xBD07, 0x0BC7, 0x6D00, - 0x9FCE, 0xBCFF, 0x8000, 0x8E00, 0xE4E7, 0xE2C5, 0xBCDB, 0x8000, 0x6E7F, 0x0FCE, 0x6A34, - 0xE4E5, 0x38A0, 0x88E0, 0x6EE3, 0xE287, 0xDFCE, 0xBCFF, 0x8000, 0xCF82, 0xE4E7, 0xE2C5, - 0xBCDB, 0x8000, 0xE64C, 0xE4E5, 0xCFDF, 0xE546, 0xA301, 0x0260, 0xA31F, 0x01F9, 0xCFA3, - 0x8EC0, 0xE9FC, 0xE5DC, 0x0000, 0xBC22, 0x31B7, 0x8E00, 0xFA52, 0x26A0, 0x8F04, 0x8EC0, - 0xBC22, 0x6568, 0xA302, 0x0268, 0xA200, 0x0261, 0x403A, 0xBC3C, 0x0200, 0x4C1E, 0x8E00, - 0xE062, 0xA300, 0x0261, 0x6904, 0xBC1B, 0x241B, 0xBD1E, 0x0BFA, 0x67A6, 0xBC1B, 0x241B, - 0x1E9A, 0xBC3D, 0x0290, 0xA201, 0x0293, 0x3B7A, 0x407F, 0xBC23, 0x31B6, 0x6EE7, 0x64E2, - 0xFA73, 0xA204, 0x02B0, 0xA300, 0x0261, 0xA301, 0x0293, 0x21A3, 0x8F2C, 0xA200, 0x0293, - 0x407E, 0xBC23, 0x31B5, 0x7016, 0xBC1C, 0x1EA2, 0xB800, 0xE61C, 0x1EA2, 0x1E93, 0xB124, - 0x0001, 0xBC23, 0x2000, 0xBCA4, 0xC000, 0xBC24, 0x3FFF, 0x24DA, 0xB056, 0xFFFF, 0x3095, - 0x0562, 0xA300, 0x0293, 0x4004, 0xBD0B, 0x0C39, 0x33D0, 0xB56A, 0x0001, 0x8F02, 0xB548, - 0x0001, 0x8C05, 0x0172, 0x3521, 0x0572, 0xB548, 0x0001, 0x8E00, 0x30A3, 0xA302, 0x0269, - 0xA202, 0x0269, 0xA203, 0x0268, 0x0493, 0x3220, 0xBC23, 0x0400, 0x8F02, 0xBC23, 0x31B8, - 0x8E00, 0xFA73, 0xBC24, 0x0267, 0x281A, 0xE643, 0x8EC0, 0xBC40, 0x260F, 0xBC40, 0x1E0E, - 0x0000, 0xBC23, 0x0267, 0x349D, 0xE904, 0x6D57, 0xA15F, 0x6D27, 0xDF82, 0x700E, 0xA2DD, - 0xBC40, 0x2184, 0x6E7F, 0x5FDF, 0xBC40, 0x1983, 0x7307, 0xA14C, 0xCFCE, 0x6AA7, 0x1FA5, - 0xA200, 0x0262, 0xBC3C, 0x0200, 0x88E0, 0x6EEB, 0xFC1F, 0x6960, 0x1FCE, 0xBC25, 0x026F, - 0xBCFD, 0xC000, 0xBD07, 0x0C8C, 0xB51E, 0x0002, 0x6D7A, 0xA681, 0xE061, 0xBC9C, 0x4000, - 0x6E7F, 0x4FCE, 0xB512, 0x0002, 0x6AA7, 0x26C1, 0x88E0, 0x6E29, 0xDFCE, 0x6EEB, 0xFC1F, - 0xBCFD, 0xC000, 0x8E00, 0xB51E, 0x0002, 0xE681, 0xE061, 0xBC9C, 0x4000, 0xCFA3, 0xB512, - 0x0002, 0xBC24, 0x0267, 0xE6C1, 0xE5DD, 0xE54C, 0xA300, 0x0262, 0xBC40, 0x0E06, 0xCF85, - 0xCFDE, 0x8EC0, 0xE9FC, 0xE6DE, 0xA200, 0x02A7, 0x2600, 0xBC01, 0x0D4B, 0xA203, 0x0294, - 0x2630, 0xA202, 0x02C5, 0xBC25, 0x1000, 0xA200, 0x02C6, 0xA204, 0x02C3, 0xA201, 0x01BE, - 0xBCA5, 0x4000, 0xBC23, 0x0294, 0x8F33, 0xBC26, 0x31CE, 0xBC40, 0x1185, 0x6990, 0x7AD4, - 0x0495, 0xBCA5, 0x0000, 0xBC26, 0x31CF, 0x00AA, 0xBC25, 0x31D0, 0xBC40, 0x1984, 0xBC40, - 0x2187, 0x0404, 0xFAD6, 0x044F, 0xFAB5, 0xBC81, 0x8000, 0xBC93, 0x4000, 0x0020, 0x0079, - 0xA204, 0x0299, 0xBC40, 0x1582, 0xBC40, 0x1D80, 0xBC40, 0x2581, 0x8F07, 0x32C0, 0x4000, - 0x8F00, 0xB008, 0xFFFF, 0x8C13, 0xA300, 0x0299, 0xBC20, 0x4000, 0x21A0, 0x8F00, 0x3421, - 0x8C0B, 0xA300, 0x0299, 0x403E, 0xBC40, 0x1D80, 0xA31E, 0x0294, 0xBC40, 0x2581, 0xBC40, - 0x1582, 0xBC20, 0x31D1, 0xBC40, 0x1185, 0xFA10, 0x20A8, 0x4020, 0xBC40, 0x1981, 0x3840, - 0x8F06, 0xBC20, 0x31D2, 0x8E00, 0xFA10, 0x2088, 0x3802, 0x8F00, 0x4000, 0xBC24, 0x31D3, - 0xBC40, 0x2183, 0xFA94, 0xBC27, 0x31EE, 0x4006, 0x6867, 0x3AF3, 0x1932, 0x202B, 0x8F04, - 0xBC23, 0x31EF, 0x8E00, 0xFA73, 0x218B, 0x8F00, 0x3886, 0x2640, 0xBC21, 0x029A, 0x8F0B, - 0xBC23, 0x31D4, 0xA204, 0x0299, 0xFA73, 0x2023, 0x8F01, 0x2600, 0x8F03, 0x8E00, 0x8C13, - 0xA306, 0x0295, 0xBC20, 0x31F7, 0xBC40, 0x2083, 0xFA10, 0x2118, 0x1803, 0xA302, 0x0295, - 0xBC40, 0x1C86, 0xBC40, 0x1486, 0xBC40, 0x5C86, 0xBC40, 0x2480, 0xBC40, 0x2080, 0xB230, - 0x7530, 0x4C02, 0x8EC0, 0x1810, 0xBC40, 0x2480, 0x8EC0, 0x4000, 0xA300, 0x0294, 0x0000, - 0xBC22, 0x31F0, 0xE91C, 0xBC24, 0x029A, 0x7007, 0x3A52, 0x6E11, 0x1C82, 0x6E7F, 0x3C85, - 0xBC26, 0x31F4, 0xBC23, 0x31F3, 0x77FE, 0xDCA4, 0xBC27, 0x31F2, 0xB801, 0xA891, 0x7027, - 0xFA73, 0xFAF6, 0xDCC3, 0xBC27, 0x31D5, 0xBC23, 0x31DA, 0xDD26, 0xDD04, 0xFAF6, 0xBC24, - 0x31F5, 0xFA73, 0xDD66, 0xDD43, 0xFA96, 0xB074, 0x000B, 0xBC23, 0x31D8, 0xDDA6, 0xDD87, - 0xBC26, 0x31D7, 0xB800, 0xE6F7, 0xDCE1, 0xBC24, 0x31D6, 0x6D34, 0x9DC3, 0xDDE7, 0xBC21, - 0x8000, 0xFAD6, 0xBC27, 0x31D9, 0xFA94, 0x6163, 0x9E46, 0xE1DE, 0x6D34, 0xDE03, 0x6143, - 0x1E24, 0xDE86, 0xDE63, 0xB801, 0xEE73, 0xB064, 0x000C, 0xBC21, 0x31F6, 0xDEA7, 0xDEE3, - 0xDF06, 0xBC27, 0x31F1, 0xB034, 0x0009, 0x6D45, 0x1EC4, 0xB800, 0x6CD1, 0x6E81, 0xBAF6, - 0xB024, 0x000A, 0xDFA6, 0xDF42, 0xDF23, 0xE1C3, 0xE142, 0xE246, 0xDF64, 0xDF8F, 0xBC3D, - 0x029F, 0xBD08, 0x0E56, 0x6CD8, 0x1FC1, 0x7003, 0x0E27, 0x6915, 0xA044, 0x8F01, 0x2640, - 0x8F6F, 0x6A3B, 0xCCE5, 0x6D6C, 0x4EC7, 0x6A3B, 0xDFE6, 0x88D0, 0xB20C, 0x0060, 0xDCE5, - 0xCDC5, 0x8F65, 0x6A09, 0x4D65, 0x88FC, 0x6910, 0x8C86, 0x28DD, 0x28FD, 0x8890, 0xBCFF, - 0xC000, 0xBC92, 0x4000, 0x2442, 0x28D5, 0x6A3F, 0x4CE5, 0x88F0, 0x686B, 0x8D26, 0x611E, - 0x4DE7, 0x2409, 0x8F05, 0xCFA6, 0x686B, 0x8CC5, 0xCD06, 0x666B, 0x8CE5, 0x6113, 0x5DFC, - 0x2409, 0x32F0, 0xBCEC, 0x4000, 0x8F05, 0xCD41, 0x686E, 0x5DFC, 0x8F01, 0x35F9, 0xDDE7, - 0x686D, 0x4EE6, 0x401F, 0x8F12, 0x6CB8, 0x0DC5, 0x3BBC, 0x8F09, 0x38FE, 0xBC21, 0x2666, - 0xBCFE, 0x4000, 0xB06C, 0xFFFF, 0x3BA6, 0x3BE7, 0x0F27, 0x6EF7, 0xDEFD, 0xBC3D, 0x029F, - 0x8C26, 0x409F, 0xCDE5, 0x69B4, 0x0EA6, 0x8F01, 0x3569, 0xDDE5, 0x684B, 0x9EFC, 0x7027, - 0xCDC5, 0xBC3D, 0x029F, 0x8F16, 0x6910, 0x8FC1, 0x5BE5, 0x28E5, 0xBC25, 0x31CA, 0x403B, - 0xFAA6, 0xE0E7, 0x8A03, 0xBBF9, 0x4C3F, 0x6A3F, 0x9EF0, 0x88D0, 0x77FE, 0xDFC1, 0x66EB, - 0x0DC5, 0x0F26, 0x3BC6, 0x8D02, 0xDFE6, 0xCDC5, 0x6A09, 0x4E47, 0x88EC, 0x6915, 0x0F8F, - 0x6915, 0x8E85, 0x28F7, 0x28DD, 0x88B0, 0xBC9D, 0x8000, 0xBCE6, 0xC000, 0x6915, 0x0F8F, - 0x2456, 0x6A33, 0xCFC1, 0x28D5, 0x88A0, 0x8E00, 0x0556, 0x242D, 0x26D0, 0x8F04, 0xCFE6, - 0xCDA7, 0x2137, 0x19BE, 0xDFE6, 0x6D00, 0xA444, 0x6915, 0xEA38, 0xE4C4, 0xCFE6, 0xCF44, - 0xCF27, 0xCF00, 0xE7C3, 0xE642, 0xA305, 0x029A, 0xCE02, 0xCD83, 0xCF65, 0xE441, 0xCDE7, - 0xCE64, 0xCEFB, 0xCCF0, 0xCCA1, 0xE9E4, 0xE6C6, 0xE5C7, 0xE55E, 0x8EC0, 0xE65B, 0xE4D0, - 0xBC21, 0x02A8, 0xE90E, 0x6E18, 0x7C22, 0xA204, 0x02C4, 0x6C28, 0xA0C5, 0xA200, 0x02C2, - 0x6C49, 0x5F04, 0xB050, 0x31BD, 0x6E0D, 0x1F55, 0x6980, 0x3AB6, 0xB012, 0xFFF2, 0xA21E, - 0x02C6, 0xB000, 0x31BF, 0x616C, 0xA4DE, 0x7000, 0x5F21, 0xFA12, 0x4025, 0x180D, 0x0554, - 0xB020, 0x31BB, 0xA204, 0x02C5, 0xBC40, 0x2187, 0x31E7, 0xFA52, 0x0497, 0xB000, 0x31B9, - 0xBC40, 0x1987, 0x3127, 0x6C88, 0x3A10, 0x0504, 0x38F4, 0xB00E, 0xFFF7, 0x6622, 0x9F60, - 0x6D37, 0x6446, 0xB06E, 0xFFF6, 0x6C90, 0x1F86, 0x6643, 0x2745, 0xB05E, 0xFFF5, 0xB07E, - 0xFFF4, 0xE1C6, 0x6998, 0x66C4, 0xE7C2, 0xDFC7, 0xDFA5, 0x8F54, 0xBC20, 0x02A8, 0x700F, - 0x8E44, 0x65E3, 0x0EC5, 0xB5A8, 0x000F, 0x65B3, 0x65DE, 0xBC40, 0xBC02, 0xBC40, 0x5404, - 0xB4AA, 0x0001, 0xB5B6, 0x000F, 0xB4C8, 0x0001, 0xB5EC, 0x000F, 0x62B6, 0x8EA2, 0x0BB4, - 0x170A, 0xBC40, 0xC406, 0xB4E4, 0x0001, 0xB5C8, 0x000F, 0xBC40, 0x9403, 0x62C9, 0x8E83, - 0x178B, 0xB4F6, 0x0001, 0xB5EC, 0x000F, 0x0BB7, 0xBC40, 0x8404, 0xCEE4, 0xB5FA, 0x000F, - 0xBC40, 0x4405, 0x174C, 0xBC40, 0x8C07, 0xB4F8, 0x0001, 0xB5DA, 0x000F, 0xBC40, 0x3C02, - 0xBC40, 0x4C03, 0xB5A4, 0x000F, 0xB5B6, 0x000F, 0xBC40, 0x3404, 0x0B6F, 0xB5C8, 0x000F, - 0xBC40, 0x7C02, 0xBC40, 0x9C03, 0xBC40, 0x5C01, 0xBC40, 0xAC01, 0xBC40, 0xB401, 0xBC40, - 0x7405, 0xBC40, 0xA406, 0x8C69, 0xA304, 0x02B5, 0xBC23, 0x02B5, 0xBC22, 0x31C4, 0xB046, - 0xFFF9, 0xFA52, 0xDFE4, 0xBC02, 0x1E36, 0x7000, 0x4FE0, 0xB030, 0x000B, 0xBC20, 0x31C3, - 0xB046, 0xFFF7, 0xFA12, 0xCF80, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0x6D31, 0xCFA0, - 0xBC22, 0x31C6, 0xB046, 0xFFF8, 0xFA52, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0xB030, - 0x000C, 0xBC20, 0x31C5, 0xB046, 0xFFF6, 0xFA12, 0xCFC0, 0xDF84, 0xBC02, 0x1E36, 0x6E05, - 0x0F81, 0xB032, 0x000E, 0xBC40, 0x788F, 0x7000, 0x61CE, 0xB040, 0xFFF3, 0x88D8, 0xBC22, - 0x31C7, 0xB066, 0xFFF3, 0xCF20, 0xFA52, 0xDE65, 0xDF26, 0xDF83, 0xBC02, 0x1E36, 0xCF80, - 0xCF01, 0xBC47, 0xA803, 0xBC47, 0x5804, 0x6112, 0xCE7E, 0x6C33, 0x0F21, 0x241B, 0xBC47, - 0xA004, 0x6847, 0x24DE, 0xDEE3, 0x8F03, 0xBC23, 0x31C9, 0x4001, 0x8C05, 0xFA72, 0xBC23, - 0x31C8, 0x4001, 0xFA72, 0xB030, 0xFFFE, 0xB046, 0xFFF6, 0xCF60, 0xBC02, 0x1E36, 0xBC21, - 0x02A8, 0xBC20, 0x31C1, 0xCF1E, 0xBC40, 0x4083, 0xFA10, 0xBC40, 0x649E, 0x2098, 0x8F09, - 0xBC20, 0x31C2, 0xBC40, 0x5083, 0xFA10, 0x6406, 0x0F55, 0x0018, 0x8C03, 0xBC40, 0x5480, - 0xCF55, 0x8E00, 0x8EC0, 0xE9F2, 0x8E00, 0xBC23, 0x00A5, 0xBC20, 0x3054, 0x6E10, 0xE181, - 0xB800, 0x2074, 0x24A1, 0xA201, 0x045F, 0x28C8, 0x6911, 0x2902, 0xBC21, 0x00A3, 0x6E10, - 0x654E, 0xBC24, 0x2081, 0xE085, 0xBC26, 0x2083, 0xB801, 0x2837, 0x692F, 0x65CF, 0xDFC3, - 0xFAD3, 0x28D8, 0x2444, 0xBC23, 0x00A1, 0x6E10, 0xE54E, 0xE185, 0xE1C6, 0x692D, 0x64CF, - 0x28E0, 0x2444, 0xA200, 0x00A0, 0x7008, 0xA54E, 0x6220, 0xA5CF, 0xBC24, 0x2080, 0x26A0, - 0xFA94, 0xBC22, 0x00A7, 0x8F0E, 0x38A2, 0x8E00, 0xE286, 0xE2C7, 0x24BE, 0xBC26, 0x3055, - 0x8E00, 0xFAD6, 0x28E6, 0x2444, 0x8E00, 0xA30E, 0x00A7, 0xE6CF, 0xBC24, 0x3053, 0x8E00, - 0xFA94, 0x2244, 0x8F3A, 0x7007, 0x8FC4, 0xA20E, 0x00A5, 0xE24F, 0x88C8, 0xA20E, 0x00A1, - 0x690B, 0x21CF, 0x88B8, 0xA20E, 0x00A3, 0xE0CF, 0x8898, 0xBC26, 0x3056, 0xE10E, 0xFAD6, - 0x6807, 0xA14F, 0x88A8, 0x8F10, 0xBC26, 0x3057, 0x8E00, 0xFAD6, 0x200E, 0x8F0A, 0xBC26, - 0x3059, 0x8E00, 0xFAD6, 0x212E, 0x8F04, 0xBC25, 0x3058, 0x8E00, 0xFAB5, 0x2095, 0x8F03, - 0x8E00, 0x8C06, 0xA31E, 0x008C, 0x403E, 0x8E00, 0xA31E, 0x008C, 0x403C, 0xA303, 0x009C, - 0xA301, 0x009D, 0xA304, 0x009E, 0xA302, 0x009F, 0xA31C, 0x008B, 0xE9FE, 0x8EC0, 0x3401, - 0xA300, 0x00A0, 0x6C84, 0xA904, 0xFA13, 0x6E0D, 0x1FD5, 0xBC22, 0x3104, 0xB002, 0xFFFD, - 0xFA52, 0xBC21, 0x7FFF, 0x6622, 0xA443, 0x40A1, 0xBC23, 0x02CE, 0xBC24, 0x045A, 0xBC02, - 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xE906, 0xA202, 0x02D3, 0x6E0D, 0x1F81, - 0xB012, 0xFFFB, 0x6988, 0x5FA1, 0xDFD5, 0x8F04, 0xBC20, 0x2080, 0x4021, 0x8C0F, 0xA301, - 0x02D3, 0xFA11, 0xBC02, 0x1E46, 0xA201, 0x0474, 0x1A41, 0x7007, 0x9F61, 0xBC20, 0x2080, - 0xA31E, 0x02D3, 0xFB11, 0x7040, 0x4F83, 0xBC22, 0x3104, 0x6C8C, 0xBA10, 0xFA52, 0xBC23, - 0x7FFF, 0x6626, 0x9F60, 0xCFA0, 0xBC23, 0x02D1, 0xBC24, 0x045B, 0xBC02, 0x1E36, 0xCFD5, - 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xFA31, 0xDFC0, 0xDFF5, 0xBC02, 0x1E46, 0xCFC1, - 0xDFC0, 0xFA31, 0xBC02, 0x1E46, 0xCFC1, 0x1A48, 0xA200, 0x02D5, 0xA202, 0x045C, 0x0E41, - 0x26A0, 0xA301, 0x02D5, 0x8F06, 0xBC21, 0x2082, 0x401E, 0xA200, 0x02D5, 0xA31E, 0x02D5, - 0xFB30, 0x6D14, 0x4FF5, 0xE9FE, 0x40E0, 0x8EC0, 0x0848, 0xA301, 0x045C, 0x6C84, 0xBA10, - 0xE904, 0xB580, 0x0002, 0xA201, 0x0474, 0xB100, 0x00BE, 0xBC23, 0x2081, 0x66C2, 0x1FD5, - 0xBC22, 0x3104, 0x6E2D, 0x3B74, 0xB00A, 0xFFFD, 0xFA52, 0xBC23, 0x7FFF, 0x6626, 0xA444, - 0x40C1, 0xBC23, 0x02D6, 0xBC24, 0x045D, 0xBC02, 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, - 0x8E00, 0xE904, 0xFA10, 0x6E08, 0x1FC1, 0xDFF5, 0xBC02, 0x1E46, 0xA201, 0x0474, 0xBC22, - 0x3104, 0x6692, 0x0FC0, 0xBC23, 0x2083, 0x6C80, 0xBA52, 0xBC24, 0x7FFF, 0x6E05, 0x3B71, - 0x6628, 0x9FA1, 0xB000, 0xFFFD, 0x40E1, 0xBC23, 0x02D9, 0xBC24, 0x045E, 0xBC02, 0x1E36, - 0xCFF5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0x0000, 0xBC21, 0x00A9, 0x4402, 0xE083, 0xE0C4, - 0x24A3, 0xBC23, 0x213F, 0x8E00, 0x6960, 0x3A74, 0x8A0E, 0x6A38, 0xBA74, 0xB300, 0x0044, - 0x28E2, 0x8F0B, 0x2600, 0x8F04, 0x2444, 0x8EC0, 0xA30E, 0x00A9, 0xE4CF, 0x4000, 0x8EC0, - 0xA300, 0x00A9, 0xE4C0, 0x8880, 0x8EC0, 0x8E00, 0xA300, 0x045F, 0xE904, 0xBC21, 0x2022, - 0x6E05, 0x1FD5, 0xA21C, 0x047A, 0xB000, 0xFFFD, 0xFA35, 0x7000, 0x6445, 0xDFFC, 0xBC22, - 0x0780, 0xBC23, 0x02DD, 0xBC24, 0x02DF, 0xBC02, 0x1E36, 0xA201, 0x02DF, 0xA200, 0x02DC, - 0xCFE2, 0xA092, 0x8000, 0xB000, 0xFFFF, 0xA301, 0x047A, 0x2680, 0xA300, 0x02DC, 0x8F34, - 0xBC20, 0x304D, 0xBC3E, 0x0320, 0xBC3A, 0x7FFF, 0xFA10, 0xA202, 0x047C, 0xA31E, 0x02DC, - 0xA31A, 0x047A, 0x21C8, 0x8F14, 0xBC20, 0x304E, 0xBC23, 0x304F, 0xFA10, 0x6872, 0x3A70, - 0x8F03, 0x2048, 0x8F01, 0x26A0, 0x8F05, 0x21C8, 0x8F0A, 0x4000, 0xA300, 0x047C, 0x8D07, - 0x4040, 0x8C05, 0xA300, 0x047C, 0x4020, 0xA300, 0x047C, 0xA200, 0x047C, 0x2242, 0x4000, - 0x8F02, 0xA300, 0x047B, 0x8C07, 0xCFD5, 0x7008, 0x0FD5, 0x8C03, 0xA300, 0x047B, 0xCFD5, - 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xBC20, 0x2021, 0xA201, 0x047C, 0x6984, 0x3A12, 0x8F1B, - 0x2611, 0xB034, 0xFFE0, 0x8F10, 0x2692, 0x8F1B, 0xBC21, 0x3051, 0x8E00, 0xFA31, 0x20D1, - 0x8F00, 0xA026, 0x4000, 0x21D1, 0x8F11, 0xB024, 0x0020, 0xA0A4, 0x4000, 0x8D0E, 0xBC21, - 0x3052, 0x8E00, 0xFA31, 0x8C09, 0xA026, 0x4000, 0xBC21, 0x3050, 0xB024, 0x0020, 0xFA31, - 0xA0A4, 0x4000, 0x8EC0, 0xFB12, 0x8E00, 0x0000, 0xBC22, 0x3105, 0xE902, 0xA21C, 0x0326, - 0x77FE, 0xBA52, 0x6EF0, 0x9FDC, 0xA200, 0x0312, 0xBC3C, 0x02E0, 0xBC22, 0x30C2, 0xBC23, - 0x8EE4, 0xBC24, 0x771E, 0xBC25, 0x88E2, 0x403B, 0x706F, 0xE800, 0xBD05, 0x11DA, 0x6E30, - 0xBC19, 0x2442, 0x6960, 0x3AC7, 0x8A08, 0xBB3D, 0x8E19, 0x28CF, 0xA207, 0x0315, 0xBC21, - 0x12EB, 0xA206, 0x0316, 0x28F9, 0x28F3, 0xA307, 0x0316, 0x88F0, 0x2442, 0x28FC, 0x28F5, - 0xA307, 0x0315, 0x417A, 0x88E0, 0xA207, 0x0317, 0x699C, 0xEA18, 0x2442, 0x4001, 0x8F00, - 0xB01E, 0xFFFF, 0x6A3C, 0x4FC1, 0x88E4, 0xBC3D, 0x0318, 0x5FFA, 0x7007, 0x64E6, 0xA206, - 0x0317, 0x6998, 0xDFC1, 0x8F02, 0x35B1, 0x3BA6, 0x8E00, 0xA31D, 0x0317, 0xA300, 0x0312, - 0xCFC2, 0x8EC0, 0xE9FE, 0xA302, 0x0326, 0x0000, 0xA200, 0x0325, 0xA201, 0x0354, 0xBC3D, - 0x0327, 0x459F, 0x403B, 0xBC3C, 0x0318, 0x41BE, 0xBC22, 0x30CB, 0xBD05, 0x1200, 0x5FFA, - 0x3862, 0x6910, 0xBC1D, 0x6960, 0x3A64, 0x8A03, 0xBBB0, 0xC81D, 0x28EC, 0x88B0, 0x40DA, - 0xE4E3, 0xEA18, 0xA300, 0x0325, 0xA200, 0x0353, 0x3B9D, 0x459E, 0xBC22, 0x30CF, 0x5FFA, - 0xA301, 0x0354, 0x6910, 0xBA43, 0xE064, 0x8A27, 0xBB8C, 0x861C, 0x403A, 0x28E3, 0x88A0, - 0xEA18, 0x8EC0, 0xA300, 0x0353, 0xA302, 0x0355, 0xBC25, 0x0357, 0xBC22, 0x30F8, 0x6E09, - 0x7CA4, 0xB800, 0xA6B6, 0x24B4, 0xA206, 0x0356, 0x33B0, 0x4FE4, 0xBC27, 0x01FF, 0x35B1, - 0x1927, 0x09F4, 0xBC24, 0x0100, 0x4806, 0x1926, 0xA206, 0x0355, 0x2670, 0xA307, 0x0356, - 0x243E, 0x28FC, 0x2444, 0x4004, 0x7008, 0x64CE, 0x6673, 0x26CF, 0x2670, 0x8F2C, 0xBC27, - 0x30F7, 0xE2CF, 0xFAF7, 0x6CDC, 0x26C4, 0xA20E, 0x0357, 0xA304, 0x0357, 0x88D8, 0x8F1C, - 0x3230, 0x8F01, 0xB036, 0xFFFF, 0xFB53, 0xA202, 0x0359, 0x2620, 0x8F0D, 0x2622, 0x4043, - 0x8F05, 0xB20A, 0x099A, 0x189A, 0xB22A, 0x21EC, 0x8C08, 0x18A2, 0xB22A, 0x13D7, 0x8C04, - 0x188A, 0xB20A, 0x17AE, 0x188A, 0x8C07, 0xA302, 0x0359, 0xBC22, 0x30F7, 0xB03E, 0xFFFF, - 0xFB53, 0xA202, 0x0359, 0x144A, 0x2442, 0x28F1, 0x8894, 0x8EC0, 0x8E00, 0xE441, 0xBC22, - 0x2131, 0xBC23, 0x00B0, 0xBC24, 0x2135, 0x6915, 0x3B53, 0xFA93, 0xBC22, 0x2136, 0xE4C3, - 0xB800, 0xA210, 0xBC80, 0x4000, 0x6915, 0xE902, 0xBC21, 0x30F9, 0xA203, 0x035B, 0xBC22, - 0x035C, 0x6E73, 0xFA31, 0xBC24, 0x30FA, 0x28C1, 0xA300, 0x035B, 0xFA94, 0x6E08, 0xBC40, - 0x6A37, 0x2143, 0x2A83, 0x88C0, 0xDFCE, 0xDFEF, 0xBC20, 0x0A30, 0xBC88, 0x0000, 0xCFCE, - 0xA300, 0x035A, 0xCFEF, 0x2444, 0xA203, 0x035E, 0xB580, 0x0001, 0x6000, 0xE4CE, 0xB000, - 0x2000, 0xE54F, 0xA300, 0x035E, 0xBC21, 0x3244, 0xBC80, 0x4000, 0xBC21, 0x2111, 0x8EC0, - 0xE9FE, 0xFB30, 0xBC22, 0x3105, 0xBC24, 0x30FB, 0xE906, 0xA203, 0x035A, 0xBC25, 0xF000, - 0xFA52, 0xFA94, 0xA21E, 0x0314, 0xA21C, 0x015F, 0x66BA, 0xDF84, 0xDFA2, 0x7050, 0xDF63, - 0xDFDC, 0xDF5E, 0xBC22, 0x0CCD, 0xBC24, 0x2131, 0xBC25, 0x199A, 0xBC3B, 0x009C, 0xBC3D, - 0x02E0, 0xBD0A, 0x131D, 0xA206, 0x035F, 0x700E, 0x8F67, 0x63ED, 0xCFBE, 0xB47C, 0x000E, - 0xB11E, 0x0005, 0xA200, 0x0360, 0x0E08, 0x2810, 0xB5FE, 0x000E, 0x380E, 0x1BB7, 0xB000, - 0x0400, 0xBCF0, 0xC000, 0xA306, 0x035F, 0xBCED, 0x4000, 0x283A, 0xA307, 0x0360, 0x888C, - 0xBC27, 0x00B1, 0x6EE7, 0x7B97, 0x606C, 0x0F40, 0xBC27, 0x3244, 0xBCED, 0xC000, 0x7016, - 0xBC1F, 0x6EE6, 0xDF40, 0xBC20, 0x2135, 0xBC21, 0x2111, 0xFA10, 0xBC8E, 0x0000, 0xFB36, - 0xB560, 0x0001, 0xCF80, 0xBC8C, 0x0000, 0xBC3E, 0x00C2, 0x63E1, 0x8FC0, 0x3F3E, 0xFF18, - 0xDFC0, 0xCFC2, 0xA302, 0x015F, 0xCF43, 0x8EC0, 0xE9FA, 0xA303, 0x0314, 0xA203, 0x0366, - 0x6D06, 0x6044, 0xBC22, 0x0367, 0xA203, 0x0363, 0x08C3, 0xA206, 0x0355, 0x6E00, 0xBC45, - 0xBCC9, 0x8000, 0x698C, 0x2146, 0x24B5, 0xA205, 0x0364, 0x28E5, 0x2444, 0xA303, 0x0366, - 0x7000, 0x244E, 0x7008, 0xE54F, 0x1918, 0x2640, 0x8F4A, 0xE14F, 0xA20E, 0x0367, 0xE540, - 0xA300, 0x0367, 0xBC22, 0x3101, 0xE0C1, 0x2409, 0xFA52, 0x88C8, 0x218A, 0x240C, 0x3840, - 0x8F0B, 0xBC20, 0x2004, 0x8E00, 0xFA10, 0x2680, 0x3802, 0x8F04, 0xBC20, 0x3100, 0x5FE4, - 0xFA10, 0x2108, 0x181C, 0xA201, 0x0369, 0xA204, 0x0365, 0x3449, 0x084C, 0xBC24, 0x30FE, - 0x2610, 0xA301, 0x0369, 0xA201, 0x0362, 0xFA94, 0x195A, 0x0048, 0x3340, 0x8F12, 0x2650, - 0x8F14, 0xBC20, 0x3103, 0xA204, 0x0361, 0x69B0, 0x3A10, 0x8F02, 0x2188, 0x8C04, 0x185A, - 0x0410, 0x2088, 0x1853, 0xA301, 0x0361, 0x3822, 0x8D05, 0xBC20, 0x30FE, 0xB028, 0xFFFF, - 0xFB12, 0x8EC0, 0xA301, 0x0362, 0x8E00, 0x8EB8, 0xBC20, 0x303D, 0x4021, 0xFA10, 0xA202, - 0x0462, 0x1408, 0x3491, 0xB000, 0xFFFF, 0x0810, 0x2680, 0xA300, 0x0462, 0xA200, 0x0460, - 0x8F36, 0xBC23, 0x3041, 0xBC22, 0x3040, 0x6980, 0x3A73, 0xA204, 0x045B, 0xA21C, 0x045A, - 0xFA52, 0x8F06, 0x21A3, 0x8F02, 0x387C, 0x201A, 0x8F07, 0x4000, 0x8D06, 0x21A3, 0x8F03, - 0x387C, 0x219A, 0x8F00, 0x3801, 0xBC22, 0x3043, 0x8E00, 0xFA52, 0x2620, 0x8F17, 0xA202, - 0x0465, 0x26A0, 0x8F12, 0xBC22, 0x2004, 0x8E00, 0xFA52, 0x26A0, 0x8F0C, 0xBC22, 0x303F, - 0xA203, 0x045E, 0xFA52, 0x209A, 0x8F05, 0xBC22, 0x303E, 0xA203, 0x045D, 0xFA52, 0x211A, - 0x8F00, 0x4000, 0xBC22, 0x3044, 0xA300, 0x0460, 0xFA50, 0xA202, 0x0463, 0x2680, 0x8F03, - 0x4000, 0x8C42, 0xA300, 0x0461, 0xBC20, 0x2015, 0xBC23, 0x3048, 0xFA10, 0xFA73, 0x2003, - 0x4000, 0x3860, 0x8F1A, 0xBC20, 0x2080, 0xBC24, 0x3046, 0xFA10, 0xFA94, 0x2184, 0x3803, - 0x8F07, 0xBC20, 0x3047, 0xBC24, 0x2015, 0xFA10, 0xFA94, 0x2020, 0x3803, 0x8F08, 0xBC20, - 0x2083, 0xBC24, 0x3045, 0xFA10, 0xFA94, 0x2004, 0x3803, 0x8F00, 0x3801, 0x2680, 0x8F02, - 0xBC20, 0x304A, 0x8C05, 0xFA10, 0xBC20, 0x3049, 0x8E00, 0xFA10, 0xBC24, 0x304B, 0x0E10, - 0xFA92, 0x2102, 0x8F04, 0xBC22, 0x304C, 0x8E00, 0xFA52, 0x2002, 0x1890, 0x33A0, 0x180B, - 0xA300, 0x0461, 0xBC20, 0x3042, 0xA201, 0x0461, 0xA203, 0x0460, 0xB512, 0x0001, 0xFA10, - 0xA302, 0x0463, 0x0059, 0x2600, 0x8F0A, 0x2601, 0x8F07, 0x2602, 0x4042, 0x8F02, 0x2603, - 0x8C04, 0x1851, 0x8C02, 0x4001, 0x4021, 0xBC20, 0x200D, 0x8EC0, 0x8E00, 0xFB11, 0xBC20, - 0x0375, 0xBC21, 0x0372, 0xBC22, 0x036A, 0xBC3C, 0x0376, 0x700E, 0xA0C1, 0x70CF, 0xA040, - 0xBC23, 0x038F, 0xBC09, 0x1482, 0x2442, 0xE104, 0xBC26, 0x1180, 0x6A39, 0xA185, 0xBC21, - 0xF2C0, 0x6A3A, 0x61C7, 0x6A3F, 0xA5A5, 0xE584, 0xE184, 0xE185, 0xBC21, 0x1CF0, 0x6A3A, - 0x61C7, 0xBC21, 0x8620, 0x6A3E, 0x65A5, 0x88C0, 0x2442, 0x6A39, 0xA584, 0xBC21, 0x0840, - 0x6A3A, 0x6184, 0x6A3F, 0xA185, 0xBC21, 0x0A40, 0x6A3A, 0x61C7, 0xBC21, 0x8620, 0x6A3E, - 0x65A5, 0x88C0, 0x8E00, 0xE584, 0xE464, 0xBC23, 0x038F, 0xBC21, 0x0375, 0x8E00, 0xE4C0, - 0x8EB8, 0x0000, 0xA202, 0x0372, 0xA203, 0x0395, 0x009A, 0xB214, 0x0014, 0x8F16, 0xB024, - 0xFFEC, 0x5FC3, 0x04DA, 0x3B43, 0xA200, 0x0375, 0xBC3C, 0x0376, 0x433E, 0xBC23, 0x305B, - 0x77F6, 0xAA18, 0x6910, 0xBA64, 0xE065, 0x8A05, 0xBBB0, 0xC81D, 0x4023, 0x8880, 0xA303, - 0x0373, 0x8EC0, 0xA302, 0x0395, 0x8E00, 0xBC20, 0x03BA, 0xA203, 0x03B9, 0x6D20, 0xA00E, - 0xB206, 0x0080, 0xE04F, 0xE14C, 0x8F36, 0x88B0, 0x40A4, 0xB226, 0x01B0, 0x40C5, 0x1925, - 0x401C, 0xB226, 0x06C0, 0x7007, 0xA45C, 0x4083, 0x6607, 0x255E, 0xA205, 0x0396, 0xA202, - 0x03BE, 0xA31C, 0x03B9, 0xA31C, 0x03BA, 0x2268, 0x8F03, 0x8E00, 0x8C03, 0xB034, 0xFFFF, - 0x34D1, 0xA300, 0x0396, 0xA202, 0x03BD, 0xB236, 0x000A, 0x8F05, 0xB226, 0xFFF6, 0x3B83, - 0x8F04, 0x4002, 0x401C, 0x8D02, 0x4022, 0x401C, 0x26A1, 0x8F00, 0x40A0, 0xA31C, 0x03BE, - 0xA302, 0x03BD, 0x8C0D, 0xA300, 0x0397, 0x2421, 0xBC25, 0x1000, 0x28E5, 0x34D9, 0xA303, - 0x03B9, 0xA30E, 0x03BA, 0xE44F, 0xE54C, 0xA200, 0x0397, 0x3048, 0xBC20, 0x7E7E, 0x8EC0, - 0xBC82, 0x0000, 0x8E00, 0xBC22, 0x2131, 0xBC24, 0x00B2, 0x77F6, 0xBB54, 0xBC23, 0x2135, - 0xBC22, 0x2136, 0x7087, 0xBA73, 0x6910, 0xFA52, 0xBCB2, 0xC000, 0xBCA2, 0x8000, 0xA200, - 0x03A6, 0x3F1A, 0xBC22, 0x3060, 0xBC3C, 0x03A8, 0x6910, 0xBF10, 0xE902, 0xFA43, 0x6960, - 0x3E18, 0x8A06, 0xBF8C, 0x8618, 0xBF8C, 0xA410, 0x2A42, 0xBC23, 0x03C4, 0x88D0, 0x6D26, - 0xA19E, 0xBC27, 0x03C7, 0x6E62, 0xE15A, 0x6E7A, 0x5FC2, 0x6E72, 0x21DC, 0x88A0, 0x6D4E, - 0xA38E, 0xA206, 0x03A5, 0xA300, 0x03A6, 0x6998, 0x23CF, 0xE24C, 0xDFE5, 0x8F03, 0x8E00, - 0x8C16, 0xB06C, 0xFFFF, 0x88E0, 0x39FC, 0x39DE, 0x399A, 0x8880, 0xBC21, 0x2045, 0x2442, - 0x7007, 0xBB30, 0xBC20, 0x2046, 0xBC21, 0x305A, 0x7009, 0xBB16, 0x7007, 0x3A30, 0x3B4C, - 0x15B0, 0x240A, 0x4020, 0x28C8, 0xBC21, 0x03BF, 0xE7CF, 0xA30E, 0x03C7, 0xBCAA, 0x8000, - 0xA306, 0x03A5, 0x690B, 0x60C6, 0x6E20, 0x664C, 0x6E7F, 0x2482, 0x6E77, 0xA0C7, 0x6E66, - 0xA4C6, 0x6A3A, 0x0FC1, 0xBC20, 0x3068, 0x6915, 0x24CC, 0xA30E, 0x03C4, 0x6915, 0xE5CF, - 0x6915, 0xBA01, 0x6A34, 0x7A02, 0x6A3C, 0xBA02, 0xBC40, 0x1205, 0x6A3E, 0xBA02, 0x6A3A, - 0xBA16, 0xBC40, 0x1A03, 0x6A3A, 0x8FE0, 0x28DE, 0x88A0, 0xBC40, 0x1E05, 0xBC40, 0x1602, - 0xBC23, 0x28BE, 0xA204, 0x03C3, 0xBCA4, 0xC000, 0xB038, 0x4000, 0x009A, 0xA302, 0x03C3, - 0xBC23, 0x3244, 0xBCA4, 0xC000, 0xBC23, 0x2111, 0x8EC0, 0xE9FE, 0xFB72, 0xA200, 0x0398, - 0x2457, 0xBC22, 0x306D, 0x77FE, 0xA441, 0xBC3C, 0x0399, 0x7067, 0xBA43, 0x6E73, 0xE800, - 0x6915, 0x3C1C, 0x8A0A, 0xBB8C, 0x861C, 0xBB8C, 0xA413, 0x28DA, 0xA300, 0x0398, 0x8EC0, - 0x8880, 0x8E00, 0xE902, 0xA203, 0x0372, 0x6CAC, 0x1FD5, 0x8F06, 0xBC20, 0x036A, 0xBC21, - 0x213E, 0xBC0B, 0x15CB, 0xFA32, 0xE402, 0xBC02, 0x1445, 0xBC02, 0x148A, 0xA201, 0x0372, - 0x41E3, 0xA202, 0x0373, 0x0459, 0x2621, 0xA301, 0x0372, 0x8F07, 0x26A2, 0x8F1A, 0xA200, - 0x0374, 0xBC02, 0x1AEC, 0x4002, 0x8D16, 0x3820, 0xBC02, 0x14AE, 0x3820, 0xBC02, 0x1504, - 0xA201, 0x03B8, 0x2610, 0x8F04, 0xB002, 0xFFFF, 0x4002, 0x8C08, 0xA300, 0x03B8, 0x3820, - 0xBC02, 0x15A4, 0xA300, 0x0374, 0x4042, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0xA302, 0x0373, - 0x3E02, 0xBC20, 0x03E5, 0x3820, 0xE002, 0xE003, 0xE044, 0xE402, 0xE484, 0xE042, 0xE482, - 0x7008, 0xA443, 0xA200, 0x03E4, 0x0C10, 0xA300, 0x03E4, 0x3E01, 0x8EB8, 0xBC20, 0x30BF, - 0xA201, 0x0447, 0xFA10, 0x6852, 0x2902, 0xBC22, 0x30BB, 0xBC23, 0x30BD, 0x18D3, 0xA202, - 0x0449, 0xFA64, 0x3491, 0x6835, 0x3A73, 0x8F65, 0xA202, 0x0448, 0x2153, 0x8F07, 0x3449, - 0x3401, 0xA080, 0x4000, 0x4002, 0x8C5B, 0xA300, 0x0447, 0xBC20, 0x30C1, 0xA201, 0x03CF, - 0xBC22, 0x30BA, 0x6114, 0x5FF5, 0x701F, 0x3A10, 0x4023, 0x6220, 0xDFDC, 0xB412, 0x0001, - 0x2620, 0x8F04, 0x7000, 0x5FC1, 0xA301, 0x03CB, 0xA301, 0x03CC, 0xBC22, 0x30C0, 0xA201, - 0x03D6, 0x3449, 0xFA52, 0x20CA, 0xA301, 0x03D6, 0x8F19, 0x4041, 0x0801, 0x2600, 0x8F13, - 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0xFF7F, 0xFA12, 0x0851, - 0x7008, 0x3B11, 0xBC02, 0x05B3, 0x7010, 0x4FC0, 0x8C05, 0xA301, 0x009A, 0x8C02, 0x4060, - 0xCFC0, 0x3302, 0x8F18, 0x3541, 0xBC21, 0x1111, 0x2829, 0x3200, 0x380E, 0x8F0D, 0x70F0, - 0x4FF5, 0xBC22, 0x2042, 0xBC23, 0x2041, 0xBC24, 0xEEEF, 0xBC0D, 0x1681, 0xFB51, 0x6008, - 0x3B70, 0x8C06, 0x4002, 0x8C04, 0x7000, 0x8FF5, 0x7000, 0x8FF5, 0xA302, 0x0448, 0x8EC0, - 0xE9FE, 0xA302, 0x0449, 0xA200, 0x03CE, 0xB300, 0x6600, 0x4020, 0x3820, 0x8F00, 0xA200, - 0x044A, 0x2681, 0xA300, 0x044A, 0x8F27, 0xA200, 0x03D2, 0x2600, 0xBC22, 0x2044, 0x4000, - 0x1801, 0xFA53, 0x0118, 0xBC23, 0x2043, 0xFB54, 0xFA72, 0x0448, 0x0091, 0xA204, 0x03D5, - 0xFB72, 0xB5C8, 0x0001, 0x0061, 0xA202, 0x044C, 0x004A, 0xBC23, 0x2042, 0xA204, 0x0448, - 0xA300, 0x03D2, 0xBC22, 0x2041, 0xA205, 0x03CA, 0x0020, 0xFB71, 0xA300, 0x0448, 0xFB55, - 0xBC00, 0x1612, 0x8EB8, 0xA201, 0x03D5, 0x3312, 0xA201, 0x03CE, 0x8F0A, 0xB312, 0x3F00, - 0x8F07, 0xA202, 0x03D4, 0x224A, 0x8F04, 0x4001, 0x7008, 0x2441, 0xA300, 0x03D0, 0x8EB8, - 0x2680, 0xA200, 0x03CF, 0x8F0A, 0xFA11, 0xB312, 0x0198, 0x8F05, 0xA201, 0x03D3, 0x1641, - 0x40A2, 0x2E4A, 0x8F00, 0x3401, 0x3402, 0xBC21, 0x30BB, 0x2041, 0x8F04, 0x4000, 0xA300, - 0x03D0, 0xBC20, 0x30B3, 0xA201, 0x03D0, 0x2611, 0x4001, 0x8F00, 0xFA11, 0xA300, 0x03CF, - 0x8EC0, 0xB592, 0x0006, 0xA301, 0x03CE, 0x6EF5, 0x6080, 0xE906, 0x7007, 0x20C1, 0xA204, - 0x03CE, 0x6313, 0x1F83, 0x65B0, 0x5FA2, 0x65C0, 0x1FE3, 0x7000, 0x9FC0, 0x4020, 0x4207, - 0x5FE6, 0xBC23, 0xC6C0, 0xBC21, 0x6E40, 0x38A2, 0xBC0F, 0x1720, 0x2F68, 0x2F20, 0x8F00, - 0x0D6B, 0x2FB0, 0x8F00, 0x0D69, 0x1785, 0x3491, 0x4044, 0x6815, 0x0FE4, 0x4147, 0x8FEE, - 0x6E1D, 0x0FA2, 0xB036, 0xFFFB, 0x69A8, 0x5FE3, 0x8F08, 0xB42A, 0x0006, 0xBC23, 0x03FF, - 0x0893, 0xA31C, 0x03D5, 0xDF62, 0xA302, 0x03D2, 0x7000, 0x8F83, 0xBC21, 0x7F80, 0x3882, - 0xBD10, 0x174F, 0x2E90, 0x2F68, 0x2FB0, 0x8F0B, 0x26B1, 0x8F02, 0x09E9, 0x2670, 0x8F03, - 0xBC26, 0x6E40, 0x0D6E, 0x8C03, 0x1785, 0x3521, 0x3491, 0x8E00, 0xCFA0, 0x2601, 0xBC20, - 0x03FF, 0x8F27, 0xB41A, 0x0006, 0x0808, 0x2680, 0x8F01, 0x32C2, 0x8F00, 0x403C, 0x26B0, - 0xDF7C, 0x8F12, 0xBC22, 0x30B3, 0x6E20, 0x8FC3, 0xBC21, 0x30BB, 0xBD04, 0x1772, 0xFA86, - 0x6881, 0xBA86, 0x8F01, 0x2246, 0x8F03, 0x21E1, 0x1914, 0xA304, 0x03CF, 0x8E00, 0x8D0B, - 0xCFC0, 0x6330, 0x8FE0, 0xA305, 0x03D4, 0xA304, 0x03D5, 0xBC02, 0x16C7, 0x8D01, 0xCFC3, - 0x6EAF, 0x8F60, 0xA303, 0x03D3, 0x8EC0, 0xE9FA, 0xA305, 0x03D4, 0xB022, 0x3098, 0xA200, - 0x03D2, 0x6980, 0x3A45, 0x8F26, 0x4343, 0x0519, 0x4003, 0xBC0C, 0x1799, 0xFA46, 0x0DAE, - 0x2246, 0x8F01, 0x3882, 0x3803, 0x8E00, 0x2680, 0x8F18, 0x2610, 0x4046, 0x4022, 0x1996, - 0x4205, 0x3290, 0x0569, 0xA306, 0x03D5, 0x8F02, 0x3250, 0x8F00, 0x14D5, 0xBC21, 0x30A9, - 0x044C, 0x3210, 0x8F01, 0x1451, 0x00D9, 0xA201, 0x03D3, 0x0C4B, 0xA301, 0x03D3, 0x8EC0, - 0xA300, 0x03D2, 0x8E00, 0xE904, 0xA201, 0x03CC, 0xA200, 0x03CD, 0x7000, 0x9F81, 0xB000, - 0xFFFF, 0xA302, 0x03CE, 0x6984, 0x1FB5, 0x8F4C, 0x2680, 0x8F47, 0xA201, 0x03CF, 0x344A, - 0xBC20, 0x30BB, 0x21C8, 0xBC20, 0x30B3, 0x1841, 0x6E18, 0x9FC1, 0xBC21, 0x03D7, 0xBC02, - 0x1700, 0xA201, 0x03CF, 0x7000, 0x8FC0, 0xA204, 0x0444, 0x6882, 0x1FC1, 0x4023, 0x8F06, - 0xB018, 0xFFFF, 0x6CC7, 0x9FC0, 0x6626, 0x9FE1, 0x8C20, 0xDF82, 0x3422, 0x6CE1, 0x1FE0, - 0x181A, 0x2681, 0xA300, 0x03CB, 0x8F15, 0xBC20, 0x0444, 0x8A09, 0xE402, 0xFA31, 0xA21E, - 0x03D3, 0xB592, 0x0006, 0xA302, 0x03D0, 0xA303, 0x03D1, 0xA302, 0x03D5, 0xA302, 0x03D2, - 0xA301, 0x03CE, 0xA31E, 0x03CA, 0xBC02, 0x1690, 0xCFE2, 0xCFC1, 0xA302, 0x0444, 0xA301, - 0x03CF, 0x8C26, 0x71A0, 0x0F85, 0x8C23, 0xCF85, 0x2600, 0x4681, 0x1848, 0x7008, 0x1FC1, - 0x2C48, 0x401E, 0xBC21, 0x03D9, 0xBC20, 0x03D7, 0xA31E, 0x03CF, 0x1848, 0x3862, 0xBC02, - 0x1700, 0xA202, 0x03CF, 0x6988, 0x0FC0, 0x4025, 0x8F09, 0x0885, 0x2620, 0x4006, 0x8F00, - 0xBC02, 0x15FE, 0xA306, 0x0444, 0x8C02, 0x4680, 0xCF85, 0xCFB5, 0xA305, 0x03CC, 0x8EC0, - 0xE9FC, 0xA300, 0x03CD, 0xE902, 0xA203, 0x03CD, 0xB036, 0xFFFF, 0x698C, 0x1FC3, 0xDFF5, - 0xBC01, 0x190F, 0xA201, 0x03D1, 0x2690, 0xBC01, 0x1920, 0xB016, 0xFFE6, 0x4340, 0x2048, - 0xBC01, 0x190A, 0xB306, 0x0019, 0xBC01, 0x18F4, 0xA201, 0x03D2, 0xB306, 0x0018, 0x8F7E, - 0xB306, 0x0017, 0x8F4E, 0xCFC3, 0xB316, 0x0016, 0xBC01, 0x1920, 0xA203, 0x044B, 0x26B0, - 0xBC01, 0x1920, 0x4023, 0x2610, 0xA303, 0x044B, 0x4002, 0x8F0F, 0xBC21, 0x03D7, 0xBC02, - 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F07, 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, - 0x03CA, 0xA303, 0x0444, 0xA203, 0x0444, 0xB236, 0x0080, 0x8F19, 0xA203, 0x0446, 0xB236, - 0x0080, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8F09, 0xA200, 0x0445, 0xB200, 0x0080, 0x8F12, - 0x8A03, 0xE483, 0x3569, 0xBC02, 0x15FE, 0x8D0D, 0x8A03, 0xE483, 0xB05A, 0xFFFF, 0xBC02, - 0x15FE, 0x8D06, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8A03, 0xE483, 0xA200, 0x03D2, 0xDFC5, - 0xBC02, 0x16DA, 0xBC02, 0x1690, 0x8D73, 0x2610, 0xBC21, 0x03D7, 0x8F24, 0xBC40, 0x1880, - 0x4023, 0x2E03, 0xBC40, 0x1C80, 0x4002, 0x185A, 0xA200, 0x03D9, 0x2E03, 0x0001, 0xA300, - 0x03D9, 0xBC21, 0x03D9, 0x441A, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F0B, 0xA203, - 0x0445, 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31A, 0x044C, 0xA303, 0x0445, 0x8C04, - 0x4003, 0x8C02, 0x4003, 0x4003, 0x8C47, 0xA303, 0x044B, 0x2610, 0xBC21, 0x03D9, 0x4002, - 0x4023, 0x8F3D, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F37, 0xA203, 0x0446, 0x441E, - 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31E, 0x044C, 0xA303, 0x0446, 0x8D2C, 0xA203, - 0x03D4, 0x2630, 0xBC20, 0x03D2, 0x8F00, 0xBC02, 0x16C7, 0xA203, 0x03D2, 0x26B0, 0x8F1E, - 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, 0x03CA, 0xA303, 0x0444, 0x8D16, 0x4661, - 0x044B, 0xBC02, 0x1787, 0x8D11, 0xA200, 0x03D7, 0x4010, 0x4023, 0xA300, 0x03CA, 0xA310, - 0x03D1, 0xBC21, 0x03D7, 0x3843, 0xBC02, 0x1700, 0x4683, 0xA310, 0x044C, 0xDFC3, 0xCFF5, - 0xCFC3, 0x8EC0, 0xE9FE, 0xA303, 0x03CD, 0xE902, 0x8E00, 0xDFD5, 0x3E02, 0xA200, 0x03E3, - 0x7000, 0x5FE0, 0xA301, 0x03E3, 0x2600, 0x8F12, 0xA200, 0x03CB, 0x2680, 0x8F02, 0xA200, - 0x03CC, 0x2600, 0x8F02, 0xA200, 0x03CD, 0x2681, 0x8F06, 0xBC20, 0x03E5, 0xBC21, 0x03D7, - 0xBD04, 0x1945, 0xE002, 0xE482, 0x3E01, 0x8C0E, 0xCFE0, 0xA200, 0x03CB, 0x2601, 0x8F02, - 0xBC02, 0x17B9, 0x8C04, 0xCFE0, 0xBC02, 0x183D, 0xCFE0, 0xB000, 0xFFFF, 0x69A0, 0x1FE0, - 0x8FEF, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2048, 0x8E00, 0xFA10, 0x2600, - 0x8F06, 0xBC20, 0x2043, 0xBC22, 0x2044, 0x4001, 0x8EC0, 0xFB11, 0xFB51, 0x8EB8, 0xA201, - 0x03E1, 0xBC22, 0x3079, 0xFA20, 0xB030, 0xFFD8, 0xB302, 0x308C, 0xA303, 0x03EE, 0x8EC0, - 0x1851, 0xA301, 0x03E1, 0xA203, 0x03E3, 0x34D9, 0xA200, 0x03FD, 0x5FFA, 0xBC3C, 0x03FA, - 0x407E, 0xA303, 0x03E3, 0x7009, 0x2461, 0x6CE4, 0x3C1E, 0x4003, 0xA205, 0x03E4, 0x19E3, - 0x0C95, 0x2131, 0x6555, 0x2042, 0x1863, 0xA300, 0x03FD, 0x33A0, 0xB05A, 0x03E6, 0x1823, - 0x637E, 0x22C0, 0x2E04, 0xB5FE, 0x0005, 0x01C7, 0x6678, 0xE6A7, 0x684C, 0xA2C2, 0x18E3, - 0x0C0B, 0x2E94, 0x8EC0, 0x0097, 0xE6C2, 0xA200, 0x03DB, 0xBC3C, 0x03DC, 0x409E, 0x405A, - 0xBC22, 0x03EA, 0x77FE, 0xAA18, 0xE05F, 0xBC23, 0x308C, 0xE51F, 0xBD03, 0x19C3, 0x6910, - 0xBC1C, 0xFA65, 0x8A03, 0xBBB0, 0xCA1C, 0x28EC, 0x88C0, 0x8E00, 0xE504, 0x8EC0, 0xEA18, - 0xA300, 0x03DB, 0xBC26, 0x03E2, 0xA202, 0x03E9, 0xE343, 0x698C, 0x2902, 0xA203, 0x03E0, - 0xBC01, 0x1A6F, 0xA204, 0x03F6, 0x69B0, 0x5FD5, 0x3883, 0x8F02, 0x4004, 0xA304, 0x03F6, - 0x3342, 0x8F68, 0xBC26, 0x03F7, 0x602D, 0x215F, 0x26C0, 0xE55F, 0x8F61, 0x6E11, 0xBCC5, - 0x6CF4, 0x2341, 0x4004, 0x4026, 0x19B4, 0x3210, 0x8F00, 0x35B1, 0xBC40, 0x1102, 0x3220, - 0x8F00, 0x35B1, 0x2663, 0xA207, 0x03F1, 0x8F01, 0x26E0, 0x8F09, 0x2435, 0x2429, 0x2412, - 0x20B5, 0x8F00, 0x35F9, 0x2095, 0x8F00, 0xB07E, 0xFFFF, 0xA202, 0x03F2, 0x3551, 0xB20A, - 0x004C, 0x3844, 0x8F0B, 0xB23E, 0x0008, 0x38A7, 0x4024, 0x38E2, 0x8F05, 0x38E5, 0x3378, - 0x3882, 0x8F01, 0x5FE4, 0x38E2, 0x38A2, 0x00E3, 0xA305, 0x03F2, 0xA307, 0x03F1, 0xDFE3, - 0xBC02, 0x197C, 0xA203, 0x03F5, 0xA202, 0x03F3, 0x6056, 0x0FE4, 0x3491, 0xB438, 0x0001, - 0xA305, 0x03F5, 0xB204, 0x0208, 0x8F14, 0xA202, 0x03F5, 0xA205, 0x03F4, 0xB524, 0x0001, - 0x20AA, 0x401D, 0x8F06, 0xA202, 0x03E4, 0x4024, 0x0C94, 0x3883, 0xA302, 0x03E4, 0x4643, - 0xA31D, 0x03F5, 0xA31D, 0x03F4, 0x4002, 0xA303, 0x03EF, 0xA302, 0x03F3, 0xA202, 0x03EF, - 0x2222, 0x8F09, 0x3491, 0x2262, 0x8F11, 0xA202, 0x03E9, 0x8E00, 0xE142, 0xA302, 0x03F0, - 0x8D0C, 0xA201, 0x03F0, 0x7008, 0x9FE4, 0xBC02, 0x197C, 0xA202, 0x03F4, 0x6024, 0x0FE4, - 0xA302, 0x03F4, 0xB008, 0xFFFF, 0x69A0, 0x0FD5, 0x8F79, 0x700F, 0xDFD5, 0xBC02, 0x196D, - 0xA31F, 0x03F6, 0xCFD5, 0x8D73, 0x7766, 0xE145, 0xA202, 0x03F0, 0x3822, 0xBC3D, 0x03F1, - 0x453F, 0xA204, 0x0442, 0x69AC, 0x64E5, 0x6E28, 0x6A38, 0x8F02, 0xA207, 0x03EE, 0x26F0, - 0x8F15, 0xE142, 0xE2C5, 0x6175, 0x60C2, 0x615A, 0xA242, 0x243F, 0x242D, 0x017D, 0xB05A, - 0x0008, 0xB4DA, 0x0004, 0x356A, 0xB4DA, 0x0002, 0x016A, 0x206A, 0x5FE2, 0x1955, 0x8C02, - 0xE605, 0x5FE2, 0xB006, 0xFFFF, 0x2680, 0x8F3F, 0xA203, 0x0443, 0x34D9, 0xA303, 0x0443, - 0xB236, 0x00F0, 0x8F08, 0xDFC1, 0xDFF5, 0xBC24, 0x041A, 0xBC02, 0x196D, 0xCFF5, 0x8C31, - 0xCFC1, 0xBC24, 0x041A, 0x4003, 0x6E38, 0xE200, 0x4005, 0xA071, 0xC000, 0xBD27, 0x1ABA, - 0x6659, 0x6200, 0xA071, 0xC000, 0x1965, 0xA207, 0x03EE, 0xB0DA, 0x041A, 0x003D, 0xB450, - 0x0001, 0xA305, 0x03EF, 0x26D0, 0x4685, 0x4667, 0x405F, 0x19EF, 0xE71F, 0xA307, 0x03CD, - 0xBC25, 0x03F0, 0x8A06, 0xE703, 0x8A0A, 0xE683, 0x8A03, 0xE682, 0xBC3F, 0x03FA, 0xA303, - 0x03CC, 0xA31F, 0x03FD, 0xA303, 0x03CB, 0xA304, 0x0442, 0xA301, 0x03F0, 0xE9FE, 0xA300, - 0x03E0, 0xA202, 0x03E9, 0x8EC0, 0x3491, 0xA302, 0x03E9, 0x0000, 0xE902, 0xA201, 0x03DB, - 0xDFD5, 0x6960, 0x24C0, 0xBC02, 0x19AA, 0xBC20, 0x03EA, 0xA300, 0x03E9, 0xBD04, 0x1AFD, - 0xBC02, 0x19C8, 0x8E00, 0x8E00, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0xA200, - 0x0466, 0x6980, 0x1FC0, 0xBC01, 0x1BB4, 0xB310, 0x00FF, 0xBC01, 0x1BBA, 0xA201, 0x0468, - 0xA202, 0x0467, 0xB034, 0xFFFF, 0x3310, 0xBC20, 0x0450, 0xBC01, 0x1BAA, 0x3880, 0x4021, - 0xE20E, 0xE24F, 0xBC24, 0x3002, 0x88D8, 0xFA94, 0xBCDB, 0x0000, 0xBC24, 0x3009, 0x2435, - 0xFA94, 0x2134, 0x4004, 0x19CC, 0xA307, 0x0465, 0xBC27, 0x3013, 0xA305, 0x0464, 0xFAF7, - 0x21B7, 0x198C, 0x26E0, 0x8F04, 0xBC26, 0x2004, 0x8E00, 0xFAD6, 0x2660, 0x8F03, 0xA206, - 0x046A, 0x35B1, 0xA306, 0x046A, 0xBC27, 0x3011, 0xA206, 0x0469, 0x35B1, 0xFAF7, 0x2037, - 0xA306, 0x0469, 0x8F0F, 0xBC26, 0x3012, 0xA207, 0x046A, 0xFAD6, 0x21BE, 0x8F03, 0x8E00, - 0x8C04, 0xA304, 0x046B, 0xA301, 0x046B, 0xA304, 0x046A, 0xA304, 0x0469, 0xBC26, 0x300A, - 0x8E00, 0xFAD6, 0x212E, 0x0526, 0x19B5, 0x202C, 0xBC25, 0x2017, 0x1926, 0x6CA8, 0x3AB2, - 0xBC25, 0x3006, 0x8F02, 0xA303, 0x0467, 0xBC25, 0x3003, 0xBC23, 0x300C, 0x8E00, 0xFA73, - 0x2013, 0x8F13, 0xBC26, 0x300D, 0x34E9, 0xFAD6, 0x2016, 0x8F0C, 0xBC26, 0x300E, 0x8E00, - 0xFAD6, 0x2016, 0x8F05, 0xBC26, 0x300F, 0x8E00, 0xFAD6, 0x2016, 0x8C02, 0x18DD, 0x34EA, - 0x38A3, 0x2442, 0xFAB2, 0x28E2, 0x88A0, 0xBC23, 0x300B, 0xB524, 0x0006, 0xFA73, 0xB424, - 0x0006, 0x32B0, 0x8F01, 0x4003, 0x049A, 0xBC23, 0x2020, 0xB524, 0x0001, 0xFA73, 0x0859, - 0x2690, 0xBC23, 0x2003, 0x8F02, 0x4001, 0x8C0C, 0xFB71, 0x3451, 0x8C09, 0x7000, 0x7B71, - 0xB012, 0xFFFF, 0xA301, 0x0468, 0xA303, 0x0467, 0x4001, 0xE401, 0xE441, 0x8D06, 0xBC20, - 0x2003, 0x5FC1, 0xFA12, 0x0851, 0xFB11, 0xCFC0, 0x3401, 0xE9FE, 0xBC21, 0x00FF, 0x8EC0, - 0x0801, 0xA300, 0x0466, 0xE904, 0xBC21, 0x2016, 0x6E05, 0x1FD5, 0xB000, 0xFFFD, 0xBC22, - 0x3000, 0xFA31, 0x7000, 0x6441, 0xFA52, 0xBC23, 0x044D, 0xBC24, 0x044F, 0xBC02, 0x1E36, - 0xA200, 0x044F, 0x7003, 0x0FD5, 0xBC22, 0x4444, 0x6915, 0xE9FC, 0x2456, 0x28C2, 0xBC20, - 0x3001, 0x8890, 0xBC22, 0x0450, 0x6910, 0xBA10, 0x28C8, 0x6E00, 0xBC41, 0x88B4, 0x7101, - 0x2145, 0x24A9, 0x28DC, 0x2444, 0x8EC0, 0xE54F, 0xE44E, 0xBC21, 0x3033, 0xBC22, 0x201E, - 0xB580, 0x0001, 0xFA31, 0x4043, 0xFA54, 0x0923, 0xB012, 0xFFFF, 0x2220, 0x8F01, 0x3310, - 0x8FF7, 0x8EB8, 0xA200, 0x0470, 0x3280, 0xBC21, 0x0477, 0xBC22, 0x0474, 0x184A, 0xA202, - 0x046D, 0xBC40, 0x1083, 0x6CE8, 0xE084, 0x66B7, 0x20C1, 0x8F04, 0xB044, 0x3014, 0x8E00, - 0xFA94, 0x211C, 0x8F0B, 0x32A0, 0xB044, 0xFFFF, 0x8F07, 0xB058, 0x3017, 0x8E00, 0xFAB5, - 0x219D, 0x8F02, 0x3844, 0x8D01, 0x3491, 0xB034, 0x301A, 0xA302, 0x046D, 0xFA73, 0xBC22, - 0x3023, 0x1A59, 0x2419, 0xFA52, 0x211A, 0x8F05, 0x3300, 0x8F02, 0xBC20, 0x301F, 0x8C05, - 0xFA10, 0xBC20, 0x301E, 0x8E00, 0xFA10, 0x4202, 0x0490, 0xA203, 0x0473, 0x2442, 0x28DA, - 0x28C8, 0x8884, 0xBC21, 0x0200, 0xBC90, 0x4000, 0xBC22, 0x0800, 0xBC80, 0x8000, 0xBC22, - 0x3024, 0x2690, 0x4004, 0xA203, 0x0454, 0x1820, 0xFA52, 0x0E4B, 0x210A, 0xA300, 0x0473, - 0x8F04, 0xBC20, 0x3025, 0x8E00, 0xFA10, 0x2008, 0x1881, 0x8EC0, 0xA302, 0x0454, 0x8E00, - 0xBC20, 0x200F, 0xA201, 0x046E, 0xFA10, 0x2680, 0x8F00, 0x3449, 0x2682, 0x4000, 0x8F00, - 0xB012, 0xFFFF, 0x3210, 0x8F02, 0x3317, 0x40E0, 0x1801, 0x8EC0, 0xA300, 0x046E, 0x8E00, - 0xBC20, 0x3031, 0xBC21, 0x2000, 0xFA12, 0x0811, 0x2241, 0xA200, 0x046E, 0x8F03, 0x4E00, - 0x0810, 0xB400, 0x0004, 0xB010, 0x3026, 0xA203, 0x0454, 0xFA31, 0xBC24, 0x1000, 0x0994, - 0x1AD9, 0x2274, 0x34D9, 0x4025, 0x111D, 0x8F01, 0x41E3, 0x0913, 0x4002, 0x3240, 0x3862, - 0x8F02, 0x4103, 0x2123, 0x18DC, 0xB5C6, 0x0001, 0xBC26, 0x302E, 0x0E4C, 0x6980, 0x3AD6, - 0xBC24, 0x200B, 0xB5F0, 0x0004, 0xA303, 0x046F, 0x1895, 0x0E4E, 0xA300, 0x046E, 0x00FB, - 0x6988, 0x3B91, 0x8F01, 0x2681, 0x8F00, 0x4002, 0x2620, 0x8F01, 0x2682, 0x8F00, 0x4002, - 0x2620, 0x8F01, 0x2683, 0x8F00, 0x4002, 0x2620, 0x8F40, 0x2604, 0x8F3E, 0x2620, 0x8F01, - 0x2685, 0x8F00, 0x4002, 0x2620, 0x8F33, 0x2606, 0x8F31, 0x2620, 0x8F01, 0x2687, 0x8F33, - 0xBC20, 0x2005, 0xBC21, 0x0200, 0xFA10, 0x0801, 0x2680, 0x8F20, 0xA200, 0x0452, 0x2602, - 0x8F11, 0x2603, 0x8F03, 0x4060, 0x8C25, 0xA300, 0x0452, 0xBC20, 0x3036, 0xBC21, 0x2081, - 0xFA10, 0xFA31, 0x2088, 0x4040, 0x8F18, 0xA300, 0x0452, 0x8D17, 0xBC20, 0x3037, 0xBC21, - 0x2081, 0xFA10, 0xFA31, 0x2188, 0x4060, 0x8F0C, 0xA300, 0x0452, 0x8D0B, 0x4060, 0xA300, - 0x0452, 0x8D07, 0x4020, 0x8C05, 0xA300, 0x0452, 0x4000, 0xA300, 0x0452, 0xA200, 0x0452, - 0xB000, 0x3039, 0xBC21, 0x2006, 0xFA10, 0x8EC0, 0x0003, 0xFB30, 0xA200, 0x0474, 0xA201, - 0x0453, 0xB500, 0x0007, 0xBC22, 0x302F, 0x1AC8, 0x241B, 0xFA52, 0x211A, 0x8F02, 0xBC22, - 0x3021, 0x8C05, 0xFA52, 0xBC22, 0x3020, 0x8E00, 0xFA52, 0xA204, 0x046C, 0xBC23, 0x8000, - 0x04DA, 0x3340, 0x2457, 0x2456, 0x8F04, 0x2454, 0x28CB, 0x28C2, 0x8C03, 0x8880, 0xA30E, - 0x046C, 0xBC21, 0x3030, 0xBC22, 0x3032, 0xA300, 0x0453, 0xFA31, 0xFA52, 0xBC23, 0x1000, - 0x0913, 0x1A08, 0xBC25, 0x0400, 0x2263, 0xBC81, 0x4000, 0x8F01, 0xBC20, 0x0FFF, 0x0810, - 0xBC21, 0x200C, 0x8EC0, 0x8E00, 0xFB30, 0x0000, 0xBC20, 0x3022, 0xBC21, 0x3038, 0x7017, - 0xBA10, 0x700C, 0x3A31, 0xA310, 0x046C, 0xA31E, 0x0470, 0xA300, 0x0454, 0xA301, 0x0452, - 0x6EE5, 0x6800, 0xBD0F, 0x1D81, 0xBC20, 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, - 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3034, 0xBC21, - 0x2005, 0xFA10, 0xB000, 0x0201, 0x7000, 0x3B30, 0xBC02, 0x1BF3, 0x8E00, 0x8E00, 0xBC20, - 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, - 0x1C65, 0xBC02, 0x1C7B, 0xA201, 0x046E, 0xBC20, 0x3034, 0xB012, 0x3026, 0x6EAF, 0x3A10, - 0xBC22, 0x3035, 0xBC23, 0x2005, 0xFA31, 0xB000, 0x0201, 0xFA52, 0xA301, 0x0454, 0xFB70, - 0xBC24, 0x2009, 0x8EC0, 0x7008, 0x3B72, 0xFB90, 0xE902, 0xA200, 0x0470, 0x6CC0, 0x1FD5, - 0x8F34, 0xA200, 0x0472, 0xA201, 0x0471, 0x2680, 0x8F0F, 0xB312, 0x007F, 0xBC20, 0x3035, - 0x8F07, 0xFA10, 0xB000, 0x0101, 0xBC21, 0x2005, 0x8C03, 0x7008, 0x3B30, 0x4020, 0x8C1E, - 0xA300, 0x0472, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0x3300, 0xA300, 0x0471, 0x8F0A, - 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3035, 0xBC21, 0x2005, 0xFA10, 0x8C07, 0x7000, - 0x3B30, 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0x4000, 0xA300, 0x0472, 0xBC02, 0x1D12, 0x8D13, - 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0xA200, 0x0470, 0xB000, 0xFFFF, 0xA201, 0x0471, 0xA300, - 0x0470, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0xA300, 0x0471, 0x7008, 0x4FD5, 0xBC20, - 0x2009, 0x8EC0, 0xE9FE, 0xFB11, 0xBC21, 0x2010, 0xE908, 0xBC20, 0x200E, 0xFA31, 0xFA12, - 0xBC24, 0x7F00, 0x6E1D, 0x1F95, 0xB036, 0xFFF9, 0x0894, 0xB444, 0x0008, 0x6E10, 0xE581, - 0xFA10, 0x73F8, 0x65C4, 0x0801, 0xBC21, 0x0474, 0xBC40, 0x1500, 0xDFA1, 0xBD03, 0x1E2E, - 0xE0DC, 0xE101, 0xDFC2, 0xDFFC, 0xBC02, 0x1E46, 0xCFE1, 0x63A0, 0x4FA1, 0x6D34, 0x4FC2, - 0x6E20, 0x6480, 0xB406, 0x0001, 0xBC40, 0x1E00, 0xDFA1, 0x7000, 0x0F95, 0xBC21, 0x2009, - 0x8EC0, 0xE9F8, 0xFB30, 0xE040, 0x6C00, 0x6246, 0x6E08, 0xE185, 0x6681, 0xA1C6, 0x24B5, - 0x28C2, 0x2444, 0x8E00, 0xE5CF, 0x88B8, 0x8EC0, 0xE4CE, 0xE643, 0x3291, 0x8F0C, 0x24C1, - 0x1448, 0x41A2, 0x2442, 0x4403, 0x0410, 0x28CB, 0xB580, 0x0004, 0x8890, 0x8EC0, 0x0001, - 0x8E00, 0x8EC0, 0x4000, 0x8E00, 0xBC20, 0x2092, 0x4041, 0xFA10, 0xBC22, 0x2093, 0x0841, - 0x6984, 0xBA51, 0x8F0F, 0x4022, 0x0802, 0x2681, 0x8F17, 0xBC20, 0x2000, 0x21C8, 0xBC20, - 0x2095, 0x8F02, 0x8EC0, 0xE0C1, 0xFB11, 0xFA31, 0xFB11, 0x8EB8, 0xBC20, 0x2094, 0xBC22, - 0x2000, 0x6872, 0xBA10, 0x8F02, 0x8EC0, 0xE4C0, 0x8E00, 0x8EC0, 0xFB30, 0x8E00, 0x8EB8, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; -#endif - -const unsigned short bin_patch_E1[] = { - 0x2000, 0x21FF, 0xBC24, 0x20A0, 0x8E00, 0xFA95, 0xB30A, 0x06AF, 0x8F2E, 0xB30A, 0x08E5, - 0x8F07, 0xBC25, 0x08E5, 0xFB95, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x0841, 0xBC25, - 0x06AF, 0xFB95, 0x5400, 0xBC21, 0xD0B1, 0xBC02, 0x07CA, 0x5500, 0xBC21, 0x07C2, 0xBC02, - 0x07CA, 0x40A0, 0xBC21, 0x0359, 0xBC02, 0x07CA, 0x41A0, 0xBC21, 0x00A0, 0xBC02, 0x07CA, - 0x41C0, 0xBC21, 0x4208, 0xBC02, 0x07CA, 0x4380, 0xBC21, 0x2800, 0xBC02, 0x07CA, 0x4E04, - 0xBC00, 0x08E6, 0x4344, 0xBC25, 0x0400, 0x2620, 0x8F06, 0xBC02, 0x07F0, 0x5404, 0x4025, - 0xBC02, 0x07FB, 0xBC00, 0x06C1, 0xBC02, 0x07FB, 0x5404, 0x4025, 0xBC02, 0x07F0, 0xBC00, - 0x06C1, 0xBDC8, 0x404E, 0x8E00, 0xFA11, 0xBC00, 0x0630, 0x8E00, 0x8E00, 0x8E00, 0xBC21, - 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01BB, 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, - 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, 0x201A, 0xBC00, 0x0161, 0x4044, 0xBC25, 0x1000, - 0xBC02, 0x07F0, 0x4E24, 0xBC00, 0x0705, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x078A, - 0xBC24, 0x2080, 0x6C88, 0x3A10, 0xFA94, 0xB548, 0x0005, 0xBC00, 0x0E9F, 0xE902, 0xBC26, - 0x2023, 0xDFE4, 0xBC24, 0x2000, 0xFAD6, 0x0934, 0x26C0, 0x8F01, 0xBC26, 0x3056, 0x8D02, - 0xBC26, 0x31F9, 0xCFE4, 0xE9FE, 0xBC00, 0x0FED, 0xBC20, 0x2090, 0xBC21, 0x0100, 0xFA12, - 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, 0x8E00, 0xBC20, 0x2090, 0xBC21, - 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, 0xBC21, 0x2091, 0x714F, 0xBA10, - 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, 0x0457, 0x0802, 0xA204, 0x0458, - 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x0459, 0xFB32, 0x8F0C, 0x2601, 0x4FE1, - 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, 0x8F05, 0xBC02, 0x40E7, 0x8D04, - 0xBC21, 0x03FF, 0xA301, 0x0456, 0xA301, 0x0455, 0xA200, 0x0458, 0xA201, 0x0457, 0x260F, - 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, 0xA300, 0x0458, 0x8EC0, 0xE9FE, - 0xA301, 0x0457, 0xBC22, 0x3105, 0xA200, 0x0313, 0x77DE, 0xBA52, 0x3BC2, 0xBC22, 0x2091, - 0xBC3C, 0x02E0, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, 0xAA18, 0xBC24, 0x0B12, 0xFB54, - 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0355, 0xFB53, 0xA203, 0x035A, 0xFB53, - 0xA203, 0x0464, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, 0x047F, 0xFB54, 0xFB53, 0xA204, - 0x0480, 0xFB54, 0xA203, 0x0481, 0xFB53, 0xA204, 0x0361, 0xA203, 0x0362, 0xFB54, 0xFB53, - 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_patch_E2[] = { - 0x2000, 0x21FF, 0x8E00, 0x8E00, 0x8E00, 0xBC21, 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01A9, - 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, - 0x201A, 0xBC00, 0x014F, 0x240C, 0xA301, 0x047F, 0xA30F, 0x0480, 0xA30E, 0x0481, 0xBC00, - 0x1353, 0x5380, 0xBC21, 0xAC40, 0xBC02, 0x07EA, 0x4380, 0xBC21, 0x2C00, 0xBC02, 0x07EA, - 0x43A0, 0xBC21, 0xFB40, 0xBC02, 0x07EA, 0x43C0, 0xBC21, 0x0546, 0xBC02, 0x07EA, 0x43E0, - 0xBC21, 0xFB3C, 0xBC02, 0x07EA, 0x4400, 0xBC21, 0x0537, 0xBC02, 0x07EA, 0x4E04, 0xBC00, - 0x092A, 0x4025, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, 0x084A, 0x2610, 0x8F01, 0xBC02, - 0x081B, 0x8D02, 0xBC02, 0x0810, 0x4E24, 0xBC00, 0x0722, 0x4280, 0xBC02, 0x07EA, 0xBC22, - 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, 0x1853, 0x42C0, 0xBC02, 0x07EA, 0x4240, 0xBC21, - 0xE400, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x0010, 0xBC02, 0x07EA, 0x4040, 0xBC21, 0x0FFB, - 0xBC02, 0x07EA, 0x4220, 0xBC21, 0x2020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, - 0x07F8, 0x4220, 0xBC21, 0x1020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07F8, - 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07EA, 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07F8, 0x4240, - 0xBC21, 0xE407, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x7010, 0xBC02, 0x07EA, 0xBC20, 0x0064, - 0x4461, 0xBC02, 0x07F8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07EA, 0xBC00, 0x0794, 0xBC20, - 0x2090, 0xBC21, 0x0100, 0xFA12, 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, - 0x8E00, 0xBC20, 0x2090, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, - 0xBC21, 0x2091, 0x714F, 0xBA10, 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, - 0x045B, 0x0802, 0xA204, 0x045C, 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x045D, - 0xFB32, 0x8F0C, 0x2601, 0x4FE1, 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, - 0x8F05, 0xBC02, 0x40F6, 0x8D04, 0xBC21, 0x03FF, 0xA301, 0x045A, 0xA301, 0x0459, 0xA200, - 0x045C, 0xA201, 0x045B, 0x260F, 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, - 0xA300, 0x045C, 0x8EC0, 0xE9FE, 0xA301, 0x045B, 0xBC22, 0x3105, 0xA200, 0x0314, 0x77DE, - 0xBA52, 0x3BC2, 0xBC22, 0x2091, 0xBC3C, 0x02E1, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, - 0xAA18, 0xBC24, 0x0B12, 0xFB54, 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0356, - 0xFB53, 0xA203, 0x035D, 0xFB53, 0xA203, 0x0468, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, - 0x0483, 0xFB54, 0xFB53, 0xA204, 0x0484, 0xFB54, 0xA203, 0x0485, 0xFB53, 0xA204, 0x0364, - 0xA203, 0x0365, 0xFB54, 0xFB53, 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_coeff_E1[] = { - 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C, - 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0008, 0x0001, 0x0001, 0x0CCD, - 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E, - 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008, - 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008, - 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000, - 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF, - 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000, - 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47, - 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA, - 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92, - 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, - 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C, - 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C, - 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, - 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC, - 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350, - 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0, - 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715, - 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139, - 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC, - 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43, - 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5, - 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C, - 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B, - 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6, - 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2, - 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001, - 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100, - 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00, - 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200, - 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900, - 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680, - 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0, - 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026, - 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214, - 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848, - 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F, - 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A, - 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800, - 0x0400, 0x000C, 0x0005, 0x000C, 0x00FF, 0x083D, 0x4000, 0x062F, 0x404C, 0x01B9, 0x4052, - 0x0155, 0x405B, 0x0704, 0x4069, 0x0786, 0x4071, 0x0E9A, 0x4077, 0x0FEB, 0x4080, 0x0000, - 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E, - 0x4093, 0xFEE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_coeff_E2[] = { - 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C, - 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0020, 0x0001, 0x0001, 0x0CCD, - 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E, - 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008, - 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008, - 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000, - 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF, - 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000, - 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47, - 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA, - 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92, - 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, - 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C, - 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C, - 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, - 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC, - 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350, - 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0, - 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715, - 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139, - 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC, - 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43, - 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5, - 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C, - 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B, - 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6, - 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2, - 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001, - 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100, - 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00, - 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200, - 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900, - 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680, - 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0, - 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026, - 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214, - 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848, - 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F, - 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A, - 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800, - 0x0400, 0x000C, 0x0005, 0x000C, 0x0038, 0x01A7, 0x4000, 0x0143, 0x4009, 0x0000, 0x0000, - 0x0929, 0x4020, 0x0721, 0x4041, 0x0755, 0x4052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E, - 0x0001, 0xFEE0, 0xFED8, 0xFED8, 0x0000, 0x0040, 0x40A2, 0x0000 -}; - -const unsigned short bin_hw_coeff[] = { - 0x0000, 0x0027, 0xfffd, 0xfffc, 0x0002, 0x000a, 0x0005, 0xfff4, 0xffed, 0x0004, 0x0024, - 0x0018, 0xffd8, 0xffb1, 0x0006, 0x00cd, 0x0179, 0x0001, 0xfffd, 0x0004, 0x0000, 0x000b, - 0xffe0, 0x0047, 0xff75, 0x0134, 0x04c4, 0xff9c, 0x000f, 0x0007, 0xfff7, 0x0006, 0x0001, - 0x0008, 0xffdf, 0x005d, 0xff18, 0x034a, 0xff81, 0x03d9, 0x00a6, 0xfffe, 0x0012, 0xffa6, - 0x0000 -}; diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h deleted file mode 100644 index 828360649..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h +++ /dev/null @@ -1,80 +0,0 @@ -/* mt6628_fm.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- head file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __MT6616_FM_H__ -#define __MT6616_FM_H__ - -#include "fm_typedef.h" - -/* #define FM_PowerOn_with_ShortAntenna */ -#define MT6626_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define MT6626_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define MT6626_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define MT6626_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define MT6626_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define MT6626_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define MT6626_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define MT6626_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define MT6626_DEEMPHASIS_50us TRUE - -/* customer need customize the I2C port */ -#if 0 /* def MT6516 */ -#define MT6626_I2C_PORT 2 -#else -#define MT6626_I2C_PORT 0 -/* #endif */ - -#define MT6626_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */ -#define MT6626_MAX_COUNT 100 -#define MT6626_SCANTBL_SIZE 16 /* 16*uinit16_t */ - -#define AFC_ON 0x01 -#if AFC_ON -#define FM_MAIN_CTRL_INIT 0x480 -#else -#define FM_MAIN_CTRL_INIT 0x080 -#endif - -/* FM_MAIN_EXTINTRMASK */ -#define FM_EXT_STC_DONE_MASK 0x01 -#define FM_EXT_RDS_MASK 0x20 - -#define MT6626_FM_STC_DONE_TIMEOUT 12 /* second */ - -/* FM_MAIN_CHANDETSTAT */ -#define FM_MAIN_CHANDET_MASK 0x3FF0 /* D4~D15 in address 3FH */ -#define FM_MAIN_CHANDET_SHIFT 0x04 - -/* FM_MAIN_CFG1(0x36) && FM_MAIN_CFG2(0x37) */ -#define MT6626_FM_SEEK_UP 0x0 -#define MT6626_FM_SEEK_DOWN 0x01 -#define MT6626_FM_SCAN_UP 0x0 -#define MT6626_FM_SCAN_DOWN 0x01 -#define MT6626_FM_SPACE_INVALID 0x0 -#define MT6626_FM_SPACE_50K 0x01 -#define MT6626_FM_SPACE_100K 0x02 -#define MT6626_FM_SPACE_200K 0x04 - -#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */ -#define MT6626_DEV "MT6626" - -#endif /* end of #ifndef __MT6626_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h deleted file mode 100644 index d95df49aa..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __MT6626_FM_CMD_H__ -#define __MT6626_FM_CMD_H__ - -#include <linux/types.h> -#include "fm_typedef.h" - -/* FM basic-operation's opcode */ -#define FM_BOP_BASE (0x80) -enum { - FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00), - FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01), - FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02), - FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03), - FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04), - FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05) -}; - -/* FM BOP's size */ -#define FM_WRITE_BASIC_OP_SIZE (3) -#define FM_UDELAY_BASIC_OP_SIZE (4) -#define FM_RD_UNTIL_BASIC_OP_SIZE (5) -#define FM_MODIFY_BASIC_OP_SIZE (5) -#define FM_MSLEEP_BASIC_OP_SIZE (4) - -fm_s32 mt6626_pwrup_clock_on(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_pwrdown(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_rampdown(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq); -fm_s32 mt6626_seek(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 seekdir, fm_u16 space, - fm_u16 max_freq, fm_u16 min_freq); -fm_s32 mt6626_scan(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 scandir, fm_u16 space, - fm_u16 max_freq, fm_u16 min_freq); -fm_s32 mt6626_get_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr); -fm_s32 mt6626_set_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr, fm_u16 value); -fm_s32 mt6626_patch_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6626_coeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6626_hwcoeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6626_rom_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h deleted file mode 100644 index ce9ae5a2f..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef __MT6626_FM_LIB_H__ -#define __MT6626_FM_LIB_H__ - -#include "fm_typedef.h" - -enum { - DSPPATCH = 0xFFF9, - USDELAY = 0xFFFA, - MSDELAY = 0xFFFB, - HW_VER = 0xFFFD, - POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */ - POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */ -}; - -enum { - FM_PUS_DSPPATCH = DSPPATCH, - FM_PUS_USDELAY = USDELAY, - FM_PUS_MSDELAY = MSDELAY, - FM_PUS_HW_VER = HW_VER, - FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */ - FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */ - FM_PUS_MAX -}; - -enum { - DSP_PATH = 0x02, - DSP_COEFF = 0x03, - DSP_HW_COEFF = 0x04 -}; - -enum IMG_TYPE { - IMG_WRONG = 0, - IMG_ROM, - IMG_PATCH, - IMG_COEFFICIENT, - IMG_HW_COEFFICIENT -}; - -enum { - mt6626_E1 = 0, - mt6626_E2 -}; - -enum { - FM_LONG_ANA = 0, - FM_SHORT_ANA -}; - -struct ctrl_word_operation { - fm_u16 addr; - fm_u16 and; - fm_u16 or; -}; - -enum { - MT66x6_BT = 0, - MT66x6_FM, - MT66x6_MAX -}; - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h deleted file mode 100644 index c318b59d1..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h +++ /dev/null @@ -1,74 +0,0 @@ -/* mt6626_fm_ctrl_link.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- setup data link - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MT6626_FM_LINK_H__ -#define __MT6626_FM_LINK_H__ - -#include <linux/wait.h> -#include "fm_link.h" - -#define RX_BUF_SIZE 128 -#define TX_BUF_SIZE 1024 - -#define SW_RETRY_CNT (2) -#define SW_RETRY_CNT_MAX (5) -#define SW_WAIT_TIMEOUT_MAX (100) - -/* FM operation timeout define for error handle */ -#define TEST_TIMEOUT (3) -#define FSPI_EN_TIMEOUT (3) -#define FSPI_MUXSEL_TIMEOUT (3) -#define FSPI_RD_TIMEOUT (3) -#define FSPI_WR_TIMEOUT (3) -#define I2C_RD_TIMEOUT (3) -#define I2C_WR_TIMEOUT (3) -#define EN_TIMEOUT (5) -#define RST_TIMEOUT (3) -#define TUNE_TIMEOUT (3) -#define SEEK_TIMEOUT (10) -#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */ -#define RDS_RX_EN_TIMEOUT (3) -#define RDS_DATA_TIMEOUT (100) -#define RAMPDOWN_TIMEOUT (3) -#define MCUCLK_TIMEOUT (3) -#define MODEMCLK_TIMEOUT (3) -#define RDS_TX_TIMEOUT (3) -#define PATCH_TIMEOUT (5) -#define COEFF_TIMEOUT (5) -#define HWCOEFF_TIMEOUT (5) -#define ROM_TIMEOUT (5) - -struct fm_link_event { - /* data */ - volatile fm_u32 flag; - wait_queue_head_t wq; - struct fm_res_ctx result; /* seek/scan/read/RDS */ - /* methods */ - fm_u32(*set) (struct fm_link_event *thiz, fm_u32 mask); - fm_u32(*clr) (struct fm_link_event *thiz, fm_u32 mask); - long (*check) (struct fm_link_event *thiz, fm_u32 mask, long timeout); - fm_u32(*get) (struct fm_link_event *thiz); - fm_u32(*rst) (struct fm_link_event *thiz); -}; - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h deleted file mode 100644 index bc2c9e50b..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __MT6626_FM_REG_H__ -#define __MT6626_FM_REG_H__ - -enum MT6626_REG { - FM_MAIN_CG1_CTRL = 0x60, - FM_MAIN_CG2_CTRL = 0x61, - FM_MAIN_HWVER = 0x62, - FM_MAIN_CTRL = 0x63, - FM_CHANNEL_SET = 0x65, - FM_MAIN_CFG1 = 0x66, - FM_MAIN_CFG2 = 0x67, - FM_MAIN_MCLKDESENSE = 0x38, - FM_MAIN_INTR = 0x69, - FM_MAIN_INTRMASK = 0x6A, - FM_MAIN_EXTINTRMASK = 0x6B, - FM_RSSI_IND = 0x6C, - FM_RSSI_TH = 0x6D, - FM_MAIN_RESET = 0x6E, - FM_MAIN_CHANDETSTAT = 0x6F, - FM_RDS_CFG0 = 0x80, - FM_RDS_INFO = 0x81, - FM_RDS_DATA_REG = 0x82, - FM_RDS_GOODBK_CNT = 0x83, - FM_RDS_BADBK_CNT = 0x84, - FM_RDS_PWDI = 0x85, - FM_RDS_PWDQ = 0x86, - FM_RDS_FIFO_STATUS0 = 0x87, - FM_FT_CON9 = 0x8F, - FM_DSP_PATCH_CTRL = 0x90, - FM_DSP_PATCH_OFFSET = 0x91, - FM_DSP_PATCH_DATA = 0x92, - FM_DSP_MEM_CTRL4 = 0x93, - FM_ADDR_PAMD = 0xB4, - FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6, - FM_RDS_POINTER = 0xF0, -}; - -/* RDS_BDGRP_ABD_CTRL_REG */ -enum { - BDGRP_ABD_EN = 0x0001, - BER_RUN = 0x2000 -}; -#define FM_DAC_CON1 0x83 -#define FM_DAC_CON2 0x84 -#define FM_FT_CON0 0x86 -enum { - FT_EN = 0x0001 -}; - -#define FM_I2S_CON0 0x90 -enum { - I2S_EN = 0x0001, - FORMAT = 0x0002, - WLEN = 0x0004, - I2S_SRC = 0x0008 -}; - -/* FM_MAIN_CTRL */ -enum { - TUNE = 0x0001, - SEEK = 0x0002, - SCAN = 0x0004, - RDS_MASK = 0x0010, - MUTE = 0x0020, - RDS_BRST = 0x0040, - RAMP_DOWN = 0x0100, -}; - -/* FM_MAIN_INTR */ -enum { - FM_INTR_STC_DONE = 0x0001, - FM_INTR_IQCAL_DONE = 0x0002, - FM_INTR_DESENSE_HIT = 0x0004, - FM_INTR_CHNL_CHG = 0x0008, - FM_INTR_SW_INTR = 0x0010, - FM_INTR_RDS = 0x0020 -}; - -enum { - ANTENNA_TYPE = 0x0010, -}; - -#endif /* __MT6626_FM_REG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c b/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c deleted file mode 100644 index e69de29bb..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c +++ /dev/null diff --git a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h b/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h deleted file mode 100644 index 99407933e..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef __MTK_FM_H__ -#define __MTK_FM_H__ - - -#endif /* __MTK_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c deleted file mode 100644 index cdc989453..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c +++ /dev/null @@ -1,692 +0,0 @@ -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/fm.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" - -#include "mt6626_fm_reg.h" -#include "mt6626_fm_link.h" -#include "mt6626_fm.h" -#include "mt6626_fm_cmd.h" - - -static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_WRITE_BASIC_OP; - buf[1] = FM_WRITE_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((value) & 0x00FF); - buf[4] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - - return (FM_WRITE_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_UDELAY_BASIC_OP; - buf[1] = FM_UDELAY_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_UDELAY_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_RD_UNTIL_BASIC_OP; - buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask) & 0x00FF); - buf[4] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_RD_UNTIL_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MODIFY_BASIC_OP; - buf[1] = FM_MODIFY_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask_and) & 0x00FF); - buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask_or) & 0x00FF); - buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_MODIFY_BASIC_OP_SIZE + 2); -} - -#if 0 -static fm_s32 fm_bop_msleep(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MSLEEP_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MSLEEP_BASIC_OP; - buf[1] = FM_MSLEEP_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_MSLEEP_BASIC_OP_SIZE + 2); -} -#endif - -/* - * mt6626_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* FM Digital Clock enable */ - pkt_size += fm_bop_write(0x60, 0x3000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3000 */ - pkt_size += fm_bop_write(0x60, 0x3001, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3001 */ - pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */ - pkt_size += fm_bop_write(0x60, 0x3003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3003 */ - pkt_size += fm_bop_write(0x60, 0x3007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3007 */ - /* no low power mode, analog line in, long antenna */ - pkt_size += fm_bop_modify(0x61, 0xFF63, 0x0000, &buf[pkt_size], buf_size - pkt_size); - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_patch_download - Wholechip FM Power Up: step 3, download patch to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_PATCH_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_COEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_rom_download - Wholechip FM Power Up: step 3,download rom to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ROM_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */ - pkt_size += fm_bop_write(0x6A, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 0020 */ - pkt_size += fm_bop_write(0x6B, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0020 */ - pkt_size += fm_bop_write(0xA0, 0xD0B1, &buf[pkt_size], buf_size - pkt_size); /* wr a0 D0B1 */ - pkt_size += fm_bop_write(0x60, 0x300F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 300F */ - pkt_size += fm_bop_write(0x61, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 61 3 */ - pkt_size += fm_bop_write(0x61, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 2 */ - /* pkt_size += fm_bop_modify(0x61, 0xFFFF, 0x0002, &buf[pkt_size], buf_size - pkt_size); */ - /* pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_pwrdown - Wholechip FM Power down: Digital Modem Power Down - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Disable HW clock control */ - pkt_size += fm_bop_write(0x60, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 330F */ - /* Reset ASIP */ - pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */ - /* digital core + digital rgf reset */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - /* Disable all clock */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - /* Reset rgfrf */ - pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_rampdown - f/w will wait for STC_DONE interrupt - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_rampdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - /* Clear DSP state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */ - /* Set DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */ - /* @Wait for STC_DONE interrupt@ */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Clear DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_tune - execute tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6626_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - freq = (freq - 640) * 2; - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* Set desired channel & channel parameter */ - pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* Enable hardware controlled tuning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFE, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - /* Wait for STC_DONE interrupt */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_seek - execute seek action, - * @buf - target buf - * @buf_size - buffer size - * @seekdir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6626_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (seekdir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - min_freq = (min_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_scan - execute scan action, - * @buf - target buf - * @buf_size - buffer size - * @scandir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6626_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (scandir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */ - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - min_freq = (min_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled scanning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6626_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_READ_OPCODE; - buf[2] = 0x01; - buf[3] = 0x00; - buf[4] = addr; - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - return 5; -} - -fm_s32 mt6626_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_WRITE_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = addr; - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c deleted file mode 100644 index f43ea99a9..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c +++ /dev/null @@ -1,129 +0,0 @@ -/* mt6626_fm_eint.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6626 FM Radio Driver -- EINT functions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_eint.h" - -#if 0 /* def MT6516 */ -#include <mach/mt6516_eint.h> -#include <mach/mt6516_gpio.h> -#else -#include <mach/mt6573_eint.h> -#include <mach/mt6573_gpio.h> -#endif -#include <cust_eint.h> -#include <cust_gpio_usage.h> - -struct fm_eint_interface { - void (*mask) (fm_u32 eint_num); - void (*unmask) (fm_u32 eint_num); - void (*set_hw_debounce) (fm_u32 eint_num, fm_u32 ms); - void (*set_polarity) (fm_u32 eint_num, fm_u32 pol); - fm_u32(*set_sens) (fm_u32 eint_num, fm_u32 sens); - void (*registration) (fm_u32 eint_num, fm_u32 is_deb_en, fm_u32 pol, - void (EINT_FUNC_PTR) (void), fm_u32 is_auto_umask); - fm_s32(*init) (void); -}; - - -#if 0 /* def MT6516 */ -extern void MT6516_EINTIRQUnmask(fm_u32 line); -extern void MT6516_EINTIRQMask(fm_u32 line); -extern void MT6516_EINT_Set_HW_Debounce(fm_u8 eintno, fm_u32 ms); -extern fm_u32 MT6516_EINT_Set_Sensitivity(fm_u8 eintno, kal_bool sens); -extern void MT6516_EINT_Registration(fm_u8 eintno, kal_bool Dbounce_En, - kal_bool ACT_Polarity, void (EINT_FUNC_PTR) (void), - kal_bool auto_umask); -#endif - -static struct fm_eint_interface fm_eint_ops = { -#if 0 /* def MT6516 */ - .mask = MT6516_EINTIRQMask, - .unmask = MT6516_EINTIRQUnmask, - .set_hw_debounce = MT6516_EINT_Set_HW_Debounce, - .set_polarity = NULL, - .set_sens = MT6516_EINT_Set_Sensitivity, - .registration = MT6516_EINT_Registration, - .init = NULL, -#else - .mask = mt65xx_eint_mask, - .unmask = mt65xx_eint_unmask, - .set_hw_debounce = mt65xx_eint_set_hw_debounce, - .set_polarity = mt65xx_eint_set_polarity, - .set_sens = mt65xx_eint_set_sens, - .registration = mt65xx_eint_registration, - .init = mt65xx_eint_init, -#endif -}; - -fm_s32 fm_enable_eint(void) -{ - WCN_DBG(FM_INF | EINT, "%s\n", __func__); - fm_eint_ops.unmask(CUST_EINT_FM_RDS_NUM); - return 0; -} - -fm_s32 fm_disable_eint(void) -{ - WCN_DBG(FM_INF | EINT, "%s\n", __func__); - fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM); - return 0; -} - -fm_s32 fm_request_eint(void (*parser) (void)) -{ - WCN_DBG(FM_NTC | EINT, "%s\n", __func__); - fm_eint_ops.set_sens(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_SENSITIVE); - fm_eint_ops.set_hw_debounce(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_DEBOUNCE_CN); - fm_eint_ops.registration(CUST_EINT_FM_RDS_NUM, - CUST_EINT_FM_RDS_DEBOUNCE_EN, - CUST_EINT_FM_RDS_POLARITY, parser, 0); - fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM); - return 0; -} - -fm_s32 fm_eint_pin_cfg(fm_s32 mode) -{ - int ret = 0; - - WCN_DBG(FM_NTC | EINT, "%s\n", __func__); - - switch (mode) { - case FM_EINT_PIN_EINT_MODE: - mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO); - mt_set_gpio_pull_enable(GPIO_FM_RDS_PIN, GPIO_PULL_ENABLE); - mt_set_gpio_pull_select(GPIO_FM_RDS_PIN, GPIO_PULL_UP); - mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_EINT); - break; - case FM_EINT_PIN_GPIO_MODE: - mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_FM_RDS_PIN, GPIO_DIR_IN); - break; - default: - ret = -1; - break; - } - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c deleted file mode 100644 index 47774aa0c..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c +++ /dev/null @@ -1,968 +0,0 @@ -#include <linux/semaphore.h> -#include <linux/delay.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_patch.h" - -#include "mt6626_fm_reg.h" -#include "mt6626_fm.h" -#include "mt6626_drv_dsp.h" -#include "mt6626_fm_link.h" -#include "mt6626_fm_lib.h" -#include "mt6626_fm_cmd.h" - -#define MT6626_FM_PATCH_PATH "/etc/firmware/mt6626_fm_patch.bin" -#define MT6626_FM_COEFF_PATH "/etc/firmware/mt6626_fm_coeff.bin" -#define MT6626_FM_HWCOEFF_PATH "/etc/firmware/mt6626_fm_hwcoeff.bin" -#define MT6626_FM_ROM_PATH "/etc/firmware/mt6626_fm_rom.bin" - -extern void fm_low_power_wa(int fmon); -extern void mt66x6_poweron(int idx); -extern void mt66x6_poweroff(int idx); - -static struct fm_callback *fm_cb_op; - -/* mt6626 FM Receiver Power Up Sequence*/ -static const struct ctrl_word_operation PowerOnSetting[] = { - /* @Wholechip FM Power Up: FM Digital Clock enable */ - {0x60, 0x0, 0x3000}, - {0x60, 0x0, 0x3001}, - {MSDELAY, 0x0, 0x0003}, /* Delay 3ms */ - {0x60, 0x0, 0x3003}, - {0x60, 0x0, 0x3007}, - {HW_VER, 0x99, 0x0000}, - /* antenna and audio path config */ -#ifdef FMRADIO_I2S_SUPPORT -#ifdef FM_PowerOn_with_ShortAntenna - {0x61, 0xFF73, 0x0090}, /* no low power mode, I2S, short antenna */ -#else - {0x61, 0xFF73, 0x0080}, /* no low power mode, I2S, long antenna */ -#endif - {0x9B, 0xFFF7, 0x0008}, /* 0000->master, 0008->slave */ - {0x5F, 0xE7FF, 0x0000}, /* 0000->32K, 0800->44.1K, 1000->48K */ - /* {0x61, 0xFF73, 0x0080},//no low power mode, I2S, long antenna, 0xff63 */ - /* {0x9B, 0xFFF7, 0x0008},//0000->master, 0008->slave */ - /* {0x5F, 0xE7FF, 0x0000},//0000->32K, 0800->44.1K, 1000->48K */ -#else -#ifdef FM_PowerOn_with_ShortAntenna - {0x61, 0xFF63, 0x0010}, /* no low power mode, analog line in, short antenna */ -#else - {0x61, 0xFF63, 0x0000}, /* no low power mode, analog line in, long antenna */ -#endif -#endif - {HW_VER, 0x0062, 0x0000}, /* read the HW version */ - - /* @Wholechip FM Power Up: FM Digital Init: download patch/DSP coefficient/HWACC coefficient */ - {DSPPATCH, 0x0, DSP_PATH}, - {DSPPATCH, 0x0, DSP_COEFF}, - {DSPPATCH, 0x0, DSP_HW_COEFF}, - {0x90, 0x0, 0x0040}, - {0x90, 0x0, 0x0000}, - - /* @Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */ - {0x6A, 0x0, 0x0020}, - {0x6B, 0x0, 0x0020}, - {0x60, 0x0, 0x300F}, - {0x61, 0xFFFF, 0x0002}, - {0x61, 0xFFFE, 0x0000}, - {POLL_P, 0x64, 0x2} -}; - -#define POWER_ON_COMMAND_COUNT (sizeof(PowerOnSetting)/sizeof(PowerOnSetting[0])) - -static int Chip_Version = mt6626_E1; - - -static fm_s32 mt6626_pwron(fm_s32 data) -{ - mt66x6_poweron(MT66x6_FM); - return 0; -} - - -static fm_s32 mt6626_pwroff(fm_s32 data) -{ - mt66x6_poweroff(MT66x6_FM); - return 0; -} - -static fm_s32 Delayms(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data); - msleep(data); - return 0; -} - -static fm_s32 Delayus(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data); - udelay(data); - return 0; -} - -static fm_s32 mt6626_read(fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - - ret = fm_ctrl_rx(addr, val); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "rd 0x%02x err\n", addr); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "rd 0x%02x 0x%04x\n", addr, *val); - return ret; -} - -static fm_s32 mt6626_write(fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - - ret = fm_ctrl_tx(addr, val); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "wr 0x%02x err\n", addr); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "wr 0x%02x 0x%04x\n", addr, val); - return ret; -} - -static fm_s32 mt6626_write1(fm_u8 addr, fm_u16 val) -{ - return fm_ctrl_tx(addr, val); -} - -static fm_s32 mt6626_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 ret = 0; - fm_u16 val; - - ret = mt6626_read(addr, &val); - - if (ret) - return ret; - - val = ((val & (mask)) | bits); - ret = mt6626_write(addr, val); - - return ret; -} - -static fm_u16 mt6626_get_chipid(void) -{ - return 0x6626; -} - -static void mt6626_TUNE_ON(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "tune on\n"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFFE) | TUNE); -} - -static void mt6626_SEEK_ON(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "seek on\n"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFFD) | SEEK); -} - -static void mt6626_SCAN_ON(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "scan on\n"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFFB) | SCAN); -} - -/* MT6628_SetAntennaType - set Antenna type - * @type - 1,Short Antenna; 0, Long Antenna - */ -static fm_s32 mt6626_SetAntennaType(fm_s32 type) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long"); - mt6626_read(FM_MAIN_CG2_CTRL, &dataRead); - - if (type) { - dataRead |= ANTENNA_TYPE; - } else { - dataRead &= (~ANTENNA_TYPE); - } - - mt6626_write(FM_MAIN_CG2_CTRL, dataRead); - - return 0; -} - -static fm_s32 mt6626_GetAntennaType(void) -{ - fm_u16 dataRead; - - mt6626_read(FM_MAIN_CG2_CTRL, &dataRead); - WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long"); - - if (dataRead & ANTENNA_TYPE) - return FM_SHORT_ANA; /* short antenna */ - else - return FM_LONG_ANA; /* long antenna */ -} - - -static fm_s32 mt6626_writeFA(fm_u16 *buff, fm_u8 fa) -{ - fm_u8 i = 0; - - for (i = 0; i < 3; i++) { - if ((fa >> i) & 0x1) - *buff |= (1 << (12 + i)); - else - *buff &= ~(1 << (12 + i)); - } - - return 0; -} - -static fm_s32 mt6626_Mute(fm_bool mute) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - - if (mute == 1) { - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF) | 0x0020); - } else { - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF)); - } - - return 0; -} - -/* - * mt6626_WaitSTCDone - wait for stc done flag change to '1' - * @waittime - the total wait time in ms - * @interval - the delay time of every polling loop in ms - * if success, return 0; else error code - */ -static fm_s32 mt6626_WaitSTCDone(fm_u32 waittime, fm_u32 interval) -{ - fm_u16 dataRead; - fm_s32 cnt; - - if (interval) { - cnt = waittime / interval; - } else { - cnt = 0; - } - - do { - if (cnt-- < 0) { - return -1; /* wait for STC done failed */ - } - - Delayms(interval); - mt6626_read(FM_MAIN_INTR, &dataRead); - } while ((dataRead & FM_INTR_STC_DONE) == 0); - - return 0; -} - -static fm_s32 mt6626_ClearSTCDone(void) -{ - fm_u16 dataRead; - - mt6626_read(FM_MAIN_INTR, &dataRead); - mt6626_write(FM_MAIN_INTR, dataRead | FM_INTR_STC_DONE); /* clear status flag */ - return 0; -} - -static fm_s32 mt6626_RampDown(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "ramp down\n"); - /* Clear DSP state */ - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF0)); /* clear rgf_tune/seek/scan/dsp_init */ - - /* Set DSP ramp down state */ - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead | RAMP_DOWN)); - - /* Check STC_DONE status flag (not the interrupt flag!) */ - if (mt6626_WaitSTCDone(1000, 1)) { - WCN_DBG(FM_ALT | CHIP, "ramp down failed\n"); - return -1; - } - /* Clear DSP ramp down state */ - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & (~RAMP_DOWN))); - - mt6626_ClearSTCDone(); - return 0; -} - -/* -* mt6626_DspPatch - DSP download procedure -* @img - source dsp bin code -* @type - rom/patch/coefficient/hw_coefficient -* -*/ -static fm_s32 mt6626_DspPatch(const fm_u16 *img, enum IMG_TYPE type) -{ - fm_u32 ctrl_code = 0; - fm_u16 data_len = 0; /* in words */ - fm_u16 i; - - FMR_ASSERT(img); - - WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d (1-rom, 2-patch, 3-coe, 4-hwcoe)\n", type); - - switch (type) { - case IMG_ROM: /* rom code */ - case IMG_PATCH: /* patch */ - ctrl_code = 0x10; - break; - case IMG_COEFFICIENT: /* coeff */ - ctrl_code = 0xe; - break; - case IMG_HW_COEFFICIENT: /* HW coeff */ - ctrl_code = 0xd; - break; - default: - break; - } - - data_len = img[1] - img[0] + 1; - WCN_DBG(FM_DBG | CHIP, "patch len: %d\n", data_len); - - if (!(data_len > 0)) { - ; /* error */ - return -FM_EPARA; - } - - mt6626_write(FM_DSP_PATCH_CTRL, 0); - mt6626_write(FM_DSP_PATCH_OFFSET, img[0]); /* Start address */ - mt6626_write(FM_DSP_PATCH_CTRL, 0x40); /* Reset download control */ - mt6626_write(FM_DSP_PATCH_CTRL, ctrl_code); /* Set download control */ - - switch (type) { - case IMG_ROM: - case IMG_PATCH: - case IMG_HW_COEFFICIENT: - WCN_DBG(FM_DBG | CHIP, "rom/patch/hw_coefficient downloading......\n"); - - for (i = 0; i < data_len; i++) { - mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]); - } - - break; - case IMG_COEFFICIENT: - WCN_DBG(FM_DBG | CHIP, "coefficient downloading......\n"); - - if (MT6626_DEEMPHASIS_50us) { - for (i = 0; i < data_len; i++) { - if (i == 86) { - mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_LONG); - } else if (i == 292) { - mt6626_write1(FM_DSP_PATCH_DATA, 0x332B); - mt6626_write1(FM_DSP_PATCH_DATA, 0x2545); - mt6626_write1(FM_DSP_PATCH_DATA, 0x1344); - mt6626_write1(FM_DSP_PATCH_DATA, 0x09F5); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0526); - mt6626_write1(FM_DSP_PATCH_DATA, 0x02A9); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0160); - mt6626_write1(FM_DSP_PATCH_DATA, 0x00B6); - mt6626_write1(FM_DSP_PATCH_DATA, 0x005E); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0031); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0000); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0000); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0000); - i += 12; - } else if (i == 505) { - mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_SHORT); - } else { - mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]); - } - } - } else { - for (i = 0; i < data_len; i++) { - if (i == 86) { - mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_LONG); - } else if (i == 505) { - mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_SHORT); - } else { - mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]); - } - } - } - - break; - default: - break; - } - - WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d ok\n", type); - return 0; -} - -static fm_s32 mt6626_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) -{ - fm_s32 ret = 0; - fm_s32 i; - fm_u16 tmp_reg, cnt = 0; - - const fm_u16 *bin_patch = NULL; - const fm_u16 *bin_coeff = NULL; - - FMR_ASSERT(chip_id); - FMR_ASSERT(device_id); - - WCN_DBG(FM_DBG | CHIP, "pwr on seq\n"); - - /* mt6626 FM power on sequence */ - for (i = 0; i < POWER_ON_COMMAND_COUNT; i++) { - switch (PowerOnSetting[i].addr) { - case FM_PUS_DSPPATCH: - - switch (PowerOnSetting[i].or) { - case DSP_PATH: /* DSP path download */ - mt6626_DspPatch(bin_patch, IMG_PATCH); - break; - case DSP_COEFF: /* DSP coefficient download */ - mt6626_DspPatch(bin_coeff, IMG_COEFFICIENT); - break; - case DSP_HW_COEFF: /* DSP HW coefficient download */ - mt6626_DspPatch(bin_hw_coeff, IMG_HW_COEFFICIENT); - break; - default: - break; - } - - break; - case FM_PUS_POLL_P: - cnt = 0; - - do { - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - tmp_reg &= PowerOnSetting[i].or; - - if (tmp_reg == 0) { - Delayms(10); - cnt++; - } - } while ((tmp_reg == 0) && (cnt < (MT6626_MAX_COUNT << 1))); - - if (cnt == (MT6626_MAX_COUNT << 1)) { - WCN_DBG(FM_ALT | CHIP, "polling status Active failed:0x%02X\n", - (fm_u8) PowerOnSetting[i].and); - return -FM_EPARA; - } - - break; - case FM_PUS_POLL_N: - cnt = 0; - - do { - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - tmp_reg &= PowerOnSetting[i].or; - - if (tmp_reg != 0) { - Delayms(10); - cnt++; - } - } while ((tmp_reg != 0) && (cnt < MT6626_MAX_COUNT)); - - if (cnt == MT6626_MAX_COUNT) { - WCN_DBG(FM_ALT | CHIP, "polling status Negative failed:0x%02X\n", - (fm_u8) PowerOnSetting[i].and); - return -FM_EPARA; - } - - break; - case FM_PUS_USDELAY: - Delayus(PowerOnSetting[i].or); - break; - case FM_PUS_MSDELAY: - Delayms(PowerOnSetting[i].or); - break; - case FM_PUS_HW_VER: - - switch (PowerOnSetting[i].and) { - case 0x99: - - switch (tmp_reg) { - case 0x0: - Chip_Version = mt6626_E1; - bin_patch = bin_patch_E1; - bin_coeff = bin_coeff_E1; - break; - case 0x8A01: - default: - Chip_Version = mt6626_E2; - bin_patch = bin_patch_E2; - bin_coeff = bin_coeff_E2; - break; - } - - break; - case 0x62: - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - /* record chip id & device id */ - *chip_id = tmp_reg; - *device_id = tmp_reg; - WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg); - break; - case 0x1C: - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - - if (PowerOnSetting[i].or) { - mt6626_write(PowerOnSetting[i].and, (tmp_reg | 0x8000)); - } else { - mt6626_write(PowerOnSetting[i].and, (tmp_reg & 0x7FFF)); - } - - break; - default: - break; - } - - break; - default: - - if (PowerOnSetting[i].and != 0) { - if (mt6626_read((fm_u8) PowerOnSetting[i].addr, &tmp_reg)) { - WCN_DBG(FM_ALT | CHIP, - "power up failed, can't read reg %02X\n", - (fm_u8) PowerOnSetting[i].and); - return -FM_EPARA; - } - - tmp_reg &= PowerOnSetting[i].and; - tmp_reg |= PowerOnSetting[i].or; - } else { - tmp_reg = PowerOnSetting[i].or; - } - - if (mt6626_write((fm_u8) PowerOnSetting[i].addr, tmp_reg)) { - WCN_DBG(FM_ALT | CHIP, "power up failed, can't write reg %02X\n", - (fm_u8) PowerOnSetting[i].addr); - return -FM_EPARA; - } - - break; - } - } - - WCN_DBG(FM_DBG | CHIP, "pwr on seq done\n"); - return ret; -} - -static fm_s32 mt6626_PowerDown(void) -{ - fm_s32 ret = 0; - fm_s16 i; - fm_u16 dataRead; - - /*SW work around for MCUFA issue. - *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well. - * In case read interrupt, and clean if interrupt found before rampdown. - */ - WCN_DBG(FM_DBG | CHIP, "pwr down seq\n"); - mt6626_read(FM_MAIN_INTR, &dataRead); - - if (dataRead & 0x1) { - mt6626_write(FM_MAIN_INTR, dataRead); /* clear status flag */ - } - - mt6626_RampDown(); - - mt6626_write(0x60, 0x330F); - mt6626_write(FM_MAIN_CG2_CTRL, 1); - - for (i = 0; i < 4; i++) { - mt6626_read(0x6E, &dataRead); - mt6626_write(0x6E, (dataRead & 0xFFF8)); - } - - mt6626_write(FM_MAIN_CG1_CTRL, 0); - mt6626_write(FM_MAIN_CG1_CTRL, 0x4000); - mt6626_write(FM_MAIN_CG1_CTRL, 0); - - return ret; -} - -static fm_bool mt6626_SetFreq(fm_u16 freq) -{ - fm_u32 CHAN = 0x0000; - fm_u16 dataRead, cnt = 0, tempbuff = 0; - - Rampdown_again: - mt6626_RampDown(); - - fm_cb_op->cur_freq_set(freq); - CHAN = (freq - 640) << 1; - mt6626_read(FM_CHANNEL_SET, &dataRead); - - switch (Chip_Version) { - case mt6626_E1: - - if (((fm_u8) ((dataRead & 0x1000) >> 12)) ^ (channel_parameter[freq - 760] & 0x1)) { - mt6626_read(0x61, &tempbuff); - mt6626_write(0x60, 0x330F); - mt6626_write(0x61, 1); - mt6626_write(0x6e, 0x0); - mt6626_write(0x6e, 0x0); - mt6626_write(0x6e, 0x0); - mt6626_write(0x6e, 0x0); - mt6626_write(0x60, 0x0); - mt6626_write(0x60, 0x4000); - mt6626_write(0x60, 0x0); - mt6626_write(0x60, 0x3000); - mt6626_write(0x60, 0x3001); - Delayms(3); - mt6626_write(0x60, 0x3003); - mt6626_write(0x60, 0x3007); - mt6626_write(0x60, 0x300f); - mt6626_write(0x61, tempbuff | 0x3); - mt6626_write(0x61, tempbuff | 0x2); - mt6626_write(0x6A, 0x20); - mt6626_write(0x6B, 0x20); - Delayms(200); - } - - break; - case mt6626_E2: - break; - default: - break; - - } - - mt6626_writeFA(&dataRead, (channel_parameter[freq - 760])); - mt6626_write(FM_CHANNEL_SET, (dataRead & 0xFC00) | CHAN); - - mt6626_TUNE_ON(); - - if (mt6626_WaitSTCDone(5000, 15)) { - if (cnt++ > 100) { - WCN_DBG(FM_ALT | CHIP, "set freq failed\n"); - return FALSE; - } else { - WCN_DBG(FM_WAR | CHIP, "set freq retry, cnt=%d\n", cnt); - goto Rampdown_again; - } - } - - mt6626_ClearSTCDone(); /* clear status flag */ - - WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq); - return TRUE; -} - -/* -* mt6626_Seek -* pFreq: IN/OUT parm, IN start freq/OUT seek valid freq -* return fm_true:seek success; fm_false:seek failed -*/ -static fm_bool mt6626_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir, - fm_u16 space) -{ - fm_u16 tmp_reg; - fm_u16 startfreq = *pFreq; - fm_u16 dataRead; - - mt6626_Mute(fm_true); - - if (fm_cb_op->cur_freq_get() != startfreq) { - /* set freq */ - if (fm_false == mt6626_SetFreq(startfreq)) { - WCN_DBG(FM_ALT | CHIP, "seek, failed set freq\n"); - return -1; - } - } - - mt6626_RampDown(); - - /* Setting before seek */ - mt6626_read(FM_MAIN_CFG2, &dataRead); - mt6626_write(FM_MAIN_CFG2, (dataRead & 0xFC00) | ((min_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - mt6626_write(FM_MAIN_CFG1, (dataRead & 0x8800) | (seekdir << 10) | (1 << (12 + space)) | ((max_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - mt6626_write(FM_MAIN_CFG1, (dataRead & 0xF7FF) | 0x0800); /* enable wrap , if it is not auto scan function */ - - /* Enable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE); - mt6626_SEEK_ON(); - - if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) { - WCN_DBG(FM_ALT | CHIP, "seek, get stc done failed\n"); - mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF); - mt6626_RampDown(); - return fm_false; - } - /* Disable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE); - mt6626_RampDown(); - mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg); - *pFreq = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1)); - fm_cb_op->cur_freq_set(*pFreq); - /* get the result freq */ - WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq); - mt6626_Mute(fm_false); - - return fm_true; -} - -static fm_bool mt6626_Scan(fm_u16 min_freq, fm_u16 max_freq, - fm_u16 *pFreq, - fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_u16 tmp_reg, space_val, startfreq, offset = 0; - fm_u16 tmp_scanTBLsize = *ScanTBLsize; - fm_u16 dataRead; - - if ((!pScanTBL) || (tmp_scanTBLsize == 0)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n"); - return fm_false; - } - - WCN_DBG(FM_DBG | CHIP, - "scan start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - if (tmp_scanTBLsize > MT6626_SCANTBL_SIZE) { - tmp_scanTBLsize = MT6626_SCANTBL_SIZE; - } - - if (space == MT6626_FM_SPACE_200K) { - space_val = 2; /* 200K */ - } else if (space == MT6626_FM_SPACE_100K) { - space_val = 1; /* 100K */ - } else { - space_val = 1; /* 100K */ - } - - /* scan up */ - if (scandir == MT6626_FM_SCAN_UP) { - startfreq = min_freq - space_val; - } else { - startfreq = max_freq + space_val; /* max_freq compare need or not */ - } - - mt6626_Mute(fm_true); - mt6626_RampDown(); - - /* set freq */ - if (fm_false == mt6626_SetFreq(startfreq)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed set freq\n"); - return fm_false; - } - - mt6626_RampDown(); - - /* set space(100k/200k)and band(min_freq~max_freq) and up/down and disable wrap */ - mt6626_read(FM_MAIN_CFG2, &dataRead); - mt6626_write(FM_MAIN_CFG2, (dataRead & 0xFC00) | ((min_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - mt6626_write(FM_MAIN_CFG1, (dataRead & 0x8800) | (scandir << 10) | (1 << (12 + space)) | ((max_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - mt6626_write(FM_MAIN_CFG1, dataRead & 0xF7FF); /* disable wrap , if it is auto scan function */ - - /* Enable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE); - /* scan on */ - mt6626_SCAN_ON(); - - if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) { - WCN_DBG(FM_ALT | CHIP, "scan, get stc done failed\n"); - mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF); - mt6626_RampDown(); - - /* get the valid freq after scan */ - mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg); - tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1)); - *pFreq = tmp_reg; - WCN_DBG(FM_DBG | CHIP, "scan, failed freq:%d\n", *pFreq); - return fm_false; - } - /* Disable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE); - - /* get scan Table */ - WCN_DBG(FM_DBG | CHIP, "mt6626_Scan tbl:"); - - for (offset = 0; offset < tmp_scanTBLsize; offset++) { - mt6626_read(FM_RDS_DATA_REG, &tmp_reg); - *(pScanTBL + offset) = tmp_reg; - } - - *ScanTBLsize = tmp_scanTBLsize; - - /* get the valid freq after scan */ - mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg); - tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1)); - *pFreq = tmp_reg; - WCN_DBG(FM_DBG | CHIP, "scan, after scan freq:%d\n", *pFreq); - mt6626_Mute(fm_false); - - return fm_true; -} - -/* - * mt6626_GetCurRSSI - get current freq's RSSI value - * RS=RSSI - * If RS>511, then RSSI(dBm)= (RS-1024)/16*6 - * else RSSI(dBm)= RS/16*6 dBuV - */ -static fm_s32 mt6626_GetCurRSSI(fm_u16 *pRSSI) -{ - fm_u16 tmp_reg, rssi; - - mt6626_read(FM_RSSI_IND, &tmp_reg); - rssi = tmp_reg & 0x03ff; - - if (pRSSI) { - *pRSSI = - (rssi > 511) ? ((fm_s16) (((rssi - 1024) * 6) >> 4) + 113) : ((rssi * 6) >> 4); - } - - WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBuV:%d\n", rssi, *pRSSI); - return 0; -} - -static fm_s32 mt6626_SetVol(fm_u8 vol) -{ - return 0; -} - -static fm_s32 mt6626_GetVol(fm_u8 *pVol) -{ - return 0; - -} - -static fm_s32 mt6626_dump_reg(void) -{ - return 0; -} - -static fm_bool mt6626_GetMonoStereo(fm_u16 *pMonoStereo) -{ -#define FM_BF_STEREO 0x1000 - fm_u16 TmpReg, value; - mt6626_read(FM_RSSI_IND, &TmpReg); - value = (TmpReg & FM_BF_STEREO) >> 12; - return value; -} - - -/* - * mt6626_GetCurPamd - get current freq's PAMD value - * PA=PAMD - * If PA>511 then PAMD(dB)= (PA-1024)/16*6, - * else PAMD(dB)=PA/16*6 - */ -static fm_bool mt6626_GetCurPamd(fm_u16 *pPamdLevl) -{ - fm_u16 tmp_reg; - fm_u16 dBvalue; - - if (mt6626_read(FM_ADDR_PAMD, &tmp_reg)) - return fm_false; - - tmp_reg &= 0x03FF; - dBvalue = (tmp_reg > 511) ? ((1024 - tmp_reg) * 6 / 16) : 0; - - *pPamdLevl = dBvalue; - return fm_true; -} - -static fm_s32 mt6626_ScanStop(void) -{ - return fm_force_active_event(FLAG_SCAN); -} - -static fm_s32 mt6626_SeekStop(void) -{ - return fm_force_active_event(FLAG_SEEK); -} - -static fm_bool mt6626_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value) -{ - return fm_true; -} - -static fm_s32 fm_low_power_wa_default(fm_s32 fmon) -{ - return 0; -} - -fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb_op = &ops->cb; - - /* ops->bi.low_pwr_wa = mt6626_low_pwr_wa; */ - ops->bi.low_pwr_wa = fm_low_power_wa_default; - ops->bi.pwron = mt6626_pwron; - ops->bi.pwroff = mt6626_pwroff; - ops->bi.msdelay = Delayms; - ops->bi.usdelay = Delayus; - ops->bi.read = mt6626_read; - ops->bi.write = mt6626_write; - ops->bi.setbits = mt6626_set_bits; - ops->bi.chipid_get = mt6626_get_chipid; - ops->bi.mute = mt6626_Mute; - ops->bi.rampdown = mt6626_RampDown; - ops->bi.pwrupseq = mt6626_PowerUp; - ops->bi.pwrdownseq = mt6626_PowerDown; - ops->bi.setfreq = mt6626_SetFreq; - ops->bi.seek = mt6626_Seek; - ops->bi.seekstop = mt6626_SeekStop; - ops->bi.scan = mt6626_Scan; - ops->bi.scanstop = mt6626_ScanStop; - ops->bi.rssiget = mt6626_GetCurRSSI; - ops->bi.volset = mt6626_SetVol; - ops->bi.volget = mt6626_GetVol; - ops->bi.dumpreg = mt6626_dump_reg; - ops->bi.msget = mt6626_GetMonoStereo; - ops->bi.pamdget = mt6626_GetCurPamd; - ops->bi.em = mt6626_em_test; - ops->bi.anaswitch = mt6626_SetAntennaType; - ops->bi.anaget = mt6626_GetAntennaType; - - return ret; -} - -fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - - fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c deleted file mode 100644 index 86d4db77d..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c +++ /dev/null @@ -1,282 +0,0 @@ -/* mt6626_fm_link.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- setup data link - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/slab.h> -#include <linux/version.h> -#include <linux/interrupt.h> -#include <linux/cdev.h> -#include <asm/uaccess.h> -#include <linux/i2c.h> -#include <linux/fm.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" - -#include "mt6626_fm.h" -#include "mt6626_fm_link.h" -#include "mt6626_fm_reg.h" - -/* these functions are defined after Linux2.6.32 */ -static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); -static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); -static int fm_i2c_remove(struct i2c_client *client); - - -static const struct i2c_device_id fm_i2c_id = { MT6626_DEV, 0 }; -static unsigned short force[] = - { MT6626_I2C_PORT, MT6626_SLAVE_ADDR, I2C_CLIENT_END, I2C_CLIENT_END }; -static const unsigned short *const forces[] = { force, NULL }; - -static struct i2c_client_address_data addr_data = { - .forces = forces -}; - -struct i2c_driver MT6626_driver = { - .probe = fm_i2c_probe, - .remove = fm_i2c_remove, - .detect = fm_i2c_detect, - .driver.name = MT6626_DEV, - .id_table = &fm_i2c_id, - .address_data = &addr_data, -}; - -static struct i2c_client *g_client; - -static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - int ret = 0; - - WCN_DBG(FM_NTC | LINK, "%s\n", __func__); - g_client = client; - - return ret; -} - -static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info) -{ - WCN_DBG(FM_NTC | LINK, "%s\n", __func__); - strcpy(info->type, MT6626_DEV); - return 0; -} - -static int fm_i2c_remove(struct i2c_client *client) -{ - WCN_DBG(FM_NTC | LINK, "%s\n", __func__); - return 0; -} - -static fm_u32 fm_event_set(struct fm_link_event *thiz, fm_u32 mask) -{ - thiz->flag |= mask; - wake_up(&thiz->wq); - - return thiz->flag; -} - -static fm_u32 fm_event_clr(struct fm_link_event *thiz, fm_u32 mask) -{ - return thiz->flag &= ~mask; -} - -/** - * fm_event_check - sleep until a condition gets true or a timeout elapses - * @thiz: the pointer of current object - * @mask: bitmap in fm_u32 - * @timeout: timeout, in jiffies - * - * fm_event_set() has to be called after changing any variable that could - * change the result of the wait condition. - * - * The function returns 0 if the @timeout elapsed, and the remaining - * jiffies if the condition evaluated to true before the timeout elapsed. - */ -static long fm_event_check(struct fm_link_event *thiz, fm_u32 mask, long timeout) -{ - return wait_event_timeout(thiz->wq, ((thiz->flag & mask) == mask), timeout * HZ); -} - -static fm_u32 fm_event_get(struct fm_link_event *thiz) -{ - return thiz->flag; - -} - -static fm_u32 fm_event_rst(struct fm_link_event *thiz) -{ - return thiz->flag = 0; -} - -static struct fm_link_event *stcdone_event; - -fm_s32 fm_link_setup(void *data) -{ - if (!(stcdone_event = kzalloc(sizeof(struct fm_link_event), GFP_KERNEL))) { - WCN_DBG(FM_ALT | LINK, "kzalloc(fm_link_event) -ENOMEM\n"); - return -1; - } - - stcdone_event->rst = fm_event_rst; - stcdone_event->get = fm_event_get; - stcdone_event->clr = fm_event_clr; - stcdone_event->check = fm_event_check; - stcdone_event->set = fm_event_set; - init_waitqueue_head(&stcdone_event->wq); - stcdone_event->rst(stcdone_event); /* set flag to 0x00000000 */ - - WCN_DBG(FM_NTC | LINK, "fm link setup\n"); - return i2c_add_driver(&MT6626_driver); -} - -fm_s32 fm_link_release(void) -{ - if (stcdone_event) { - kfree(stcdone_event); - } - - WCN_DBG(FM_NTC | LINK, "fm link release\n"); - i2c_del_driver(&MT6626_driver); - return 0; -} - -/* - * fm_ctrl_rx - * the low level func to read a rigister - * @addr - rigister address - * @val - the pointer of target buf - * If success, return 0; else error code - */ -fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val) -{ - fm_s32 n; - fm_s8 b[2] = { 0 }; - - /* first, send addr to MT6626 */ - n = i2c_master_send(g_client, (char *)&addr, 1); - - if (n < 0) { - WCN_DBG(FM_ALT | LINK, "rx 1, [addr=0x%02X] [err=%d]\n", addr, n); - return -1; - } - /* second, receive two byte from MT6626 */ - n = i2c_master_recv(g_client, b, 2); - - if (n < 0) { - WCN_DBG(FM_ALT | LINK, "rx 2, [addr=0x%02X] [err=%d]\n", addr, n); - return -2; - } - - *val = ((uint16_t) b[0] << 8 | (uint16_t) b[1]); - - return 0; -} - -/* - * fm_ctrl_tx - * the low level func to write a rigister - * @addr - rigister address - * @val - value will be writed in the rigister - * If success, return 0; else error code - */ -fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val) -{ - fm_s32 n; - fm_s8 b[3]; - - b[0] = addr; - b[1] = (char)(val >> 8); - b[2] = (char)(val & 0xFF); - - n = i2c_master_send(g_client, b, 3); - - if (n < 0) { - WCN_DBG(FM_ALT | LINK, "tx, [addr=0x%02X] [err=%d]\n", addr, n); - return -1; - } - - return 0; -} - -/* - * fm_cmd_tx() - send cmd to FM firmware and wait event - * @buf - send buffer - * @len - the length of cmd - * @mask - the event flag mask - * @ cnt - the retry conter - * @timeout - timeout per cmd - * Return 0, if success; error code, if failed - */ -fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, - fm_s32(*callback) (struct fm_res_ctx *result)) -{ - return 0; -} - -fm_bool fm_wait_stc_done(fm_u32 sec) -{ - fm_s32 ret_time = 0; - - ret_time = stcdone_event->check(stcdone_event, FLAG_TEST, sec); - - if (!ret_time) { - WCN_DBG(FM_WAR | LINK, "wait stc done fail\n"); - return fm_false; - } else { - WCN_DBG(FM_DBG | LINK, "wait stc done ok\n"); - } - - stcdone_event->clr(stcdone_event, FLAG_TEST); - return fm_true; -} - -fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32)) -{ - fm_u16 tmp_reg; - - fm_ctrl_rx(FM_MAIN_INTR, &tmp_reg); - - if (tmp_reg & 0x0001) { - /* clear status flag */ - fm_ctrl_tx(FM_MAIN_INTR, (tmp_reg & 0xFFFF) | 0x0001); - stcdone_event->set(stcdone_event, FLAG_TEST); - } - - if (tmp_reg & 0x0020) { - /* clear status flag */ - fm_ctrl_tx(FM_MAIN_INTR, (tmp_reg & 0xFFFF) | 0x0020); - - /*Handle the RDS data that we get */ - if (rds_parser) { - rds_parser(NULL, 0); /* mt6626 rds lib will get rds raw data by itself */ - } else { - WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n"); - } - } - - return 0; -} - -fm_s32 fm_force_active_event(fm_u32 mask) -{ - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c deleted file mode 100644 index 06519c599..000000000 --- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c +++ /dev/null @@ -1,299 +0,0 @@ -/* mt6626_rds.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6626 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" - -#include "mt6626_fm_reg.h" - - -static fm_bool bRDS_FirstIn = fm_false; -static fm_u32 gBLER_CHK_INTERVAL = 5000; -static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT; -static fm_u8 BAD_BLK_RATIO; - -static struct fm_callback *fm_cb; -static struct fm_basic_interface *fm_bi; - - -static fm_bool mt6626_RDS_support(void); -static fm_s32 mt6626_RDS_enable(void); -static fm_s32 mt6626_RDS_disable(void); -static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void); -static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void); -static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void); -static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void); -static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen); -static void mt6626_RDS_Init_Data(rds_t *pstRDSData); - - - -static fm_bool mt6626_RDS_support(void) -{ - return fm_true; -} - -static fm_s32 mt6626_RDS_enable(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | RDSC, "rds enable\n"); - fm_bi->read(FM_RDS_CFG0, &dataRead); - fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */ - fm_bi->read(FM_MAIN_CTRL, &dataRead); - fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK)); - - return 0; -} - -static fm_s32 mt6626_RDS_disable(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | RDSC, "rds disable\n"); - fm_bi->read(FM_MAIN_CTRL, &dataRead); - fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK)); - - return 0; -} - -static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg); - GOOD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg); - BAD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void) -{ - fm_u16 tmp_reg; - fm_u16 gbc; - fm_u16 bbc; - - gbc = mt6626_RDS_Get_GoodBlock_Counter(); - bbc = mt6626_RDS_Get_BadBlock_Counter(); - tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc)); - BAD_BLK_RATIO = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void) -{ - return gBLER_CHK_INTERVAL; -} - -void mt6626_RDS_BlerCheck(struct fm *fm) -{ - return; -} - -static void RDS_Recovery_Handler(void) -{ - fm_u16 tempData = 0; - - do { - fm_bi->read(FM_RDS_DATA_REG, &tempData); - fm_bi->read(FM_RDS_POINTER, &tempData); - } while (tempData & 0x3); -} - -static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen) -{ -#define RDS_GROUP_DIFF_OFS 0x007C -#define RDS_FIFO_DIFF 0x007F -#define RDS_CRC_BLK_ADJ 0x0020 -#define RDS_CRC_CORR_CNT 0x001E -#define RDS_CRC_INFO 0x0001 - - fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0; - fm_u16 temp = 0, OutputPofm_s32 = 0; - - WCN_DBG(FM_DBG | RDSC, "get data\n"); - fm_bi->read(FM_RDS_FIFO_STATUS0, &temp); - RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2); - - if ((temp & RDS_FIFO_DIFF) >= 4) { - /* block A data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10; - CRC |= (temp & RDS_CRC_INFO) << 3; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11); - fm_bi->read(FM_RDS_DATA_REG, &data[0]); - - /* block B data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9; - CRC |= (temp & RDS_CRC_INFO) << 2; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7); - fm_bi->read(FM_RDS_DATA_REG, &data[1]); - - /* block C data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8; - CRC |= (temp & RDS_CRC_INFO) << 1; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3); - fm_bi->read(FM_RDS_DATA_REG, &data[2]); - - /* block D data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7; - CRC |= (temp & RDS_CRC_INFO); - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1); - fm_bi->read(FM_RDS_DATA_REG, &data[3]); - - data[4] = (CRC | RDS_adj | RDSDataCount); - data[5] = FM_WARorrCnt; - - fm_bi->read(FM_RDS_PWDI, &data[6]); - fm_bi->read(FM_RDS_PWDQ, &data[7]); - - fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32); - - /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */ - if (OutputPofm_s32 & 0x3) { - RDS_Recovery_Handler(); - } - - } else { - for (; i < 8; i++) - data[i] = 0; - } -} - -static void mt6626_RDS_Init_Data(rds_t *pstRDSData) -{ - fm_u8 indx; - - fm_memset(pstRDSData, 0, sizeof(rds_t)); - bRDS_FirstIn = fm_true; - - for (indx = 0; indx < 64; indx++) { - pstRDSData->RT_Data.TextData[0][indx] = 0x20; - pstRDSData->RT_Data.TextData[1][indx] = 0x20; - } - - for (indx = 0; indx < 8; indx++) { - pstRDSData->PS_Data.PS[0][indx] = '\0'; - pstRDSData->PS_Data.PS[1][indx] = '\0'; - pstRDSData->PS_Data.PS[2][indx] = '\0'; - pstRDSData->PS_ON[indx] = 0x20; - } -} - -fm_bool mt6626_RDS_OnOff(struct fm *fm, fm_bool bFlag) -{ - rds_t *pstRDSData = fm->pstRDSData; - - if (mt6626_RDS_support() == fm_false) { - WCN_DBG(FM_ALT | RDSC, "mt6626_RDS_OnOff failed, RDS not support\n"); - return fm_false; - } - - if (bFlag) { - mt6626_RDS_Init_Data(pstRDSData); - mt6626_RDS_enable(); - } else { - mt6626_RDS_disable(); - } - - return fm_true; -} - -extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)); - -/* mt6626_RDS_Efm_s32_Handler - response FM RDS fm_s32errupt - * @fm - main data structure of FM driver - * This function first get RDS raw data, then call RDS spec parser - */ -fm_s32 mt6628_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - struct rds_rx_t raw; - fm_u16 fifo_offset; - - do { - mt6626_RDS_GetData(&raw.data[0].blkA, sizeof(rds_packet_t) + 2); - fifo_offset = (raw.data[0].crc & FM_RDS_DCO_FIFO_OFST) >> 5; /* FM_RDS_DATA_CRC_FFOST */ - WCN_DBG(FM_DBG | RDSC, "RDS fifo_offset:%d\n", fifo_offset); - rds_parser(rds_dst, &raw, sizeof(rds_packet_t) + 2 * sizeof(fm_u16), getfreq); - } while (fifo_offset > 1); - - return 0; -} - -fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - FMR_ASSERT(ops->bi.write); - FMR_ASSERT(ops->bi.read); - FMR_ASSERT(ops->bi.setbits); - FMR_ASSERT(ops->bi.usdelay); - fm_bi = &ops->bi; - - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb = &ops->cb; - - ops->ri.rds_blercheck = mt6626_RDS_BlerCheck; - ops->ri.rds_onoff = mt6626_RDS_OnOff; - ops->ri.rds_parser = mt6628_rds_parser; - ops->ri.rds_gbc_get = mt6626_RDS_Get_GoodBlock_Counter; - ops->ri.rds_bbc_get = mt6626_RDS_Get_BadBlock_Counter; - ops->ri.rds_bbr_get = mt6626_RDS_Get_BadBlock_Ratio; - ops->ri.rds_bci_get = mt6626_RDS_Get_BlerCheck_Interval; - - return ret; -} - -fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - - fm_bi = NULL; - fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h deleted file mode 100644 index e69de29bb..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h +++ /dev/null diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h deleted file mode 100644 index 822e65de5..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h +++ /dev/null @@ -1,53 +0,0 @@ -/* mt6620_fm.h - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6620 FM Radio Driver -- head file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __MT6620_FM_H__ -#define __MT6620_FM_H__ - -#include "fm_typedef.h" - -/* #define FM_PowerOn_with_ShortAntenna */ -#define MT6620_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define MT6620_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define MT6620_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define MT6620_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define MT6620_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define MT6620_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define MT6620_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define MT6620_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define MT6620_DEEMPHASIS_50us TRUE - -#define MT6620_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */ -#define MT6620_MAX_COUNT 100 -#define MT6620_SCANTBL_SIZE 16 /* 16*uinit16_t */ - -#define AFC_ON 0x01 -#if AFC_ON -#define FM_MAIN_CTRL_INIT 0x480 -#else -#define FM_MAIN_CTRL_INIT 0x080 -#endif - -#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */ -#define MT6620_DEV "MT6620" - -#endif /* end of #ifndef __MT6620_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h deleted file mode 100644 index 9e8f9deb9..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef __MT6620_FM_CMD_H__ -#define __MT6620_FM_CMD_H__ - -#include <linux/types.h> -#include "fm_typedef.h" - -/* FM basic-operation's opcode */ -#define FM_BOP_BASE (0x80) -enum { - FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00), - FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01), - FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02), - FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03), - FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04), - FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05) -}; - -/* FM BOP's size */ -#define FM_WRITE_BASIC_OP_SIZE (3) -#define FM_UDELAY_BASIC_OP_SIZE (4) -#define FM_RD_UNTIL_BASIC_OP_SIZE (5) -#define FM_MODIFY_BASIC_OP_SIZE (5) -#define FM_MSLEEP_BASIC_OP_SIZE (4) - -fm_s32 mt6620_off_2_longANA_1(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6620_off_2_longANA_2(fm_u8 *buf, fm_s32 buf_size); - -fm_s32 mt6620_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6620_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6620_pwrup_digital_init_3(fm_u8 *buf, fm_s32 buf_size); - -fm_s32 mt6620_pwrdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6620_rampdown(fm_u8 *buf, fm_s32 buf_size); - -fm_s32 mt6620_tune_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq); -fm_s32 mt6620_tune_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq); -fm_s32 mt6620_tune_3(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq); -fm_s32 mt6620_fast_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq); -fm_s32 mt6620_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_s32 cnt, fm_s32 type); - -fm_s32 mt6620_seek_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6620_seek_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); - -fm_s32 mt6620_scan_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6620_scan_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); - -fm_s32 mt6620_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr); -fm_s32 mt6620_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value); -fm_s32 mt6620_rampdown_tx(unsigned char *tx_buf, int tx_buf_size); -fm_s32 mt6620_tune_txscan(unsigned char *tx_buf, int tx_buf_size, uint16_t freq); -fm_s32 mt6620_tune_tx(unsigned char *tx_buf, int tx_buf_size, uint16_t freq); -fm_s32 mt6620_rds_rx_enable(unsigned char *tx_buf, int tx_buf_size); -fm_s32 mt6620_rds_rx_disable(unsigned char *tx_buf, int tx_buf_size); -fm_s32 mt6620_rds_tx(unsigned char *tx_buf, int tx_buf_size, uint16_t pi, uint16_t *ps, - uint16_t *other_rds, uint8_t other_rds_cnt); -fm_s32 mt6620_off_2_tx_shortANA(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6620_dig_init(fm_u8 *tx_buf, fm_s32 tx_buf_size); - -extern fm_s32 fm_get_channel_space(int freq); - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h deleted file mode 100644 index 5751ea50e..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * William Chung <William.Chung@MediaTek.com> - * - * MT6516 AR10x0 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __FM_CUST_CFG_H__ -#define __FM_CUST_CFG_H__ - -/* scan sort algorithm */ -enum { - FM_SCAN_SORT_NON = 0, - FM_SCAN_SORT_UP, - FM_SCAN_SORT_DOWN, - FM_SCAN_SORT_MAX -}; -/* ***********************************FM config for customer *********************************** */ -/* RX */ -#define FMR_RSSI_TH_LONG_MT6620 0x0301 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define FMR_RSSI_TH_SHORT_MT6620 0x02E0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define FMR_CQI_TH_MT6620 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -/* ***********************************FM config for engineer *********************************** */ -/* RX */ -#define FMR_MR_TH_MT6620 0x01BD /* FM radio MR threshold */ -#if 0 -/* ***************************************************************************************** */ -/* ***********************************FM config for customer *********************************** */ -/* ***************************************************************************************** */ -#define FMR_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define FMR_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define FMR_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define FM_SCAN_SORT_SELECT FM_SCAN_SORT_NON -#define FM_FAKE_CH_NUM 1 -#define FM_FAKE_CH_RSSI 40 -#define FM_FAKE_CH_1 1075 -#define FM_FAKE_CH_2 0 -#define FM_FAKE_CH_3 0 -#define FM_FAKE_CH_4 0 -#define FM_FAKE_CH_5 0 - -/* TX */ -#define FMTX_PWR_LEVEL_MAX 120 - -/* ***************************************************************************************** */ -#define ADDR_SCAN_TH 0xE0 /* scan thrshold register */ -#define ADDR_CQI_TH 0xE1 /* scan CQI register */ - -/* TX */ -#define FMTX_SCAN_HOLE_LOW 923 /* 92.3MHz~95.4MHz should not show to user */ -#define FMTX_SCAN_HOLE_HIGH 954 /* 92.3MHz~95.4MHz should not show to user */ -/* ***************************************************************************************** */ - -/* errno */ -#define FM_SUCCESS 0 -#define FM_FAILED 1 -#define FM_EPARM 2 -#define FM_BADSTATUS 3 -#define FM_TUNE_FAILED 4 -#define FM_SEEK_FAILED 5 -#define FM_BUSY 6 -#define FM_SCAN_FAILED 7 - -/* max scan chl num */ -#define FM_MAX_CHL_SIZE FMR_SCAN_CH_SIZE -/* auto HiLo */ -#define FM_AUTO_HILO_OFF 0 -#define FM_AUTO_HILO_ON 1 - -#define FM_CHIP_AR1000 0x1000 -#define FM_CHIP_MT5192 0x91 -#define FM_CHIP_MT5193 0x92 -#define FM_CHIP_MT6616 0x6616 -#define FM_CHIP_MT6626 0x6626 -#define FM_CHIP_MT6628 0x6628 -#define FM_CHIP_MT6620 0x6620 -#define FM_CHIP_UNSUPPORTED 0xffff - -/* seek threshold */ -#define FM_SEEKTH_LEVEL_DEFAULT 4 -#endif -/* RX */ -#define FM_RX_RSSI_TH_LONG_MT6620 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */ -#define FM_RX_RSSI_TH_SHORT_MT6620 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */ -#define FM_RX_DESENSE_RSSI_MT6620 -245 -#define FM_RX_PAMD_TH_MT6620 -12 -#define FM_RX_MR_TH_MT6620 -67 -#define FM_RX_ATDC_TH_MT6620 219 -#define FM_RX_PRX_TH_MT6620 64 -#define FM_RX_SMG_TH_MT6620 6 /* FM soft-mute gain threshold */ -#define FM_RX_DEEMPHASIS_MT6620 0 /* 0-50us, China Mainland; 1-75us China Taiwan */ -#define FM_RX_OSC_FREQ_MT6620 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */ -#if 0 -#define FM_RX_RSSI_TH_LONG_MT6620 0xF2D8 /* FM radio long antenna RSSI threshold(-4dBuV) */ -#define FM_RX_RSSI_TH_SHORT_MT6620 0xF2D8 /* FM radio short antenna RSSI threshold(-4dBuV) */ -#define FM_RX_CQI_TH_MT6620 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define FM_RX_MR_TH_MT6620 0x01BD /* FM radio MR threshold */ -#define FM_RX_SMG_TH_MT6620 0x4025 /* FM soft-mute gain threshold */ -#define FM_RX_SEEK_SPACE_MT6620 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define FM_RX_SCAN_CH_SIZE_MT6620 40 /* FM radio scan max channel size */ -#define FM_RX_BAND_MT6620 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ - -#define FM_RX_SCAN_SORT_SELECT_MT6620 FM_SCAN_SORT_NON -#define FM_RX_FAKE_CH_NUM_MT6620 1 -#define FM_RX_FAKE_CH_RSSI_MT6620 40 -#define FM_RX_FAKE_CH_1_MT6620 1075 -#define FM_RX_FAKE_CH_2_MT6620 0 -#define FM_RX_FAKE_CH_3_MT6620 0 -#define FM_RX_FAKE_CH_4_MT6620 0 -#define FM_RX_FAKE_CH_5_MT6620 0 -#endif -/* TX */ -#define FM_TX_PWR_LEVEL_MAX_MT6620 120 -#define FM_TX_SCAN_HOLE_LOW_MT6620 923 /* 92.3MHz~95.4MHz should not show to user */ -#define FM_TX_SCAN_HOLE_HIGH_MT6620 954 /* 92.3MHz~95.4MHz should not show to user */ - -#endif /* __FM_CUST_CFG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h deleted file mode 100644 index 474894096..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef __MT6620_FM_LIB_H__ -#define __MT6620_FM_LIB_H__ - -#include "fm_typedef.h" - -#define MT6620_VOL_MAX 0x2B /* 43 volume(0-15) */ -enum { - DSPPATCH = 0xFFF9, - USDELAY = 0xFFFA, - MSDELAY = 0xFFFB, - HW_VER = 0xFFFD, - POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */ - POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */ -}; - -enum { - FM_PUS_DSPPATCH = DSPPATCH, - FM_PUS_USDELAY = USDELAY, - FM_PUS_MSDELAY = MSDELAY, - FM_PUS_HW_VER = HW_VER, - FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */ - FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */ - FM_PUS_MAX -}; - -enum { - DSP_PATH = 0x02, - DSP_COEFF = 0x03, - DSP_HW_COEFF = 0x04 -}; - -enum IMG_TYPE { - IMG_WRONG = 0, - IMG_ROM, - IMG_PATCH, - IMG_COEFFICIENT, - IMG_HW_COEFFICIENT -}; - -enum { - mt6620_E1 = 0, - mt6620_E2 -}; - -struct mt6620_fm_softmute_tune_cqi_t { - fm_u16 ch; /* current frequency */ - fm_u16 rssi; /* RSSI of current channel (raw data) */ - fm_u16 pamd; /* PAMD of current channel (raw data) */ - fm_u16 mr; /* MR of current channel (raw data) */ - fm_u16 atdc; /* ATDC of current channel (raw data) */ - fm_u16 prx; /* PRX of current channel (raw data) */ - fm_u16 smg; /* soft mute gain of current channel (raw data) */ -}; - -#define BITn(n) (uint16_t)(1<<(n)) -#define MASK(n) (uint16_t)(~(1<<(n))) -/* #define HiSideTableSize 1 */ -#define FM_TX_PWR_CTRL_FREQ_THR 890 -#define FM_TX_PWR_CTRL_TMP_THR_UP 45 -#define FM_TX_PWR_CTRL_TMP_THR_DOWN 0 - -#define FM_TX_TRACKING_TIME_MAX 10000 /* TX VCO tracking time, default 100ms */ - -/* #define MT6620_FPGA */ -/* #define FM_MAIN_PGSEL (0x9F) */ -/* -#define FM_MAIN_BASE (0x0) -#define FM_MAIN_BITMAP0 (FM_MAIN_BASE + 0x80) -#define FM_MAIN_BITMAP1 (FM_MAIN_BASE + 0x81) -#define FM_MAIN_BITMAP2 (FM_MAIN_BASE + 0x82) -#define FM_MAIN_BITMAP3 (FM_MAIN_BASE + 0x83) -#define FM_MAIN_BITMAP4 (FM_MAIN_BASE + 0x84) -#define FM_MAIN_BITMAP5 (FM_MAIN_BASE + 0x85) -#define FM_MAIN_BITMAP6 (FM_MAIN_BASE + 0x86) -#define FM_MAIN_BITMAP7 (FM_MAIN_BASE + 0x87) -#define FM_MAIN_BITMAP8 (FM_MAIN_BASE + 0x88) -#define FM_MAIN_BITMAP9 (FM_MAIN_BASE + 0x89) -#define FM_MAIN_BITMAPA (FM_MAIN_BASE + 0x8a) -#define FM_MAIN_BITMAPB (FM_MAIN_BASE + 0x8b) -#define FM_MAIN_BITMAPC (FM_MAIN_BASE + 0x8c) -#define FM_MAIN_BITMAPD (FM_MAIN_BASE + 0x8d) -#define FM_MAIN_BITMAPE (FM_MAIN_BASE + 0x8e) -#define FM_MAIN_BITMAPF (FM_MAIN_BASE + 0x8f) -*/ -enum group_idx { - mono = 0, - stereo, - RSSI_threshold, - HCC_Enable, - PAMD_threshold, - Softmute_Enable, - De_emphasis, - HL_Side, - Demod_BW, - Dynamic_Limiter, - Softmute_Rate, - AFC_Enable, - Softmute_Level, - Analog_Volume, - GROUP_TOTAL_NUMS -}; - -enum item_idx { - Sblend_OFF = 0, - Sblend_ON, - ITEM_TOTAL_NUMS -}; - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h deleted file mode 100644 index 920ed7b12..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h +++ /dev/null @@ -1,74 +0,0 @@ -/* mt6620_fm_link.h - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6620 FM Radio Driver -- setup data link - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MT6620_FM_LINK_H__ -#define __MT6620_FM_LINK_H__ -#if 0 -#include <linux/wait.h> -#include "fm_link.h" - -#define RX_BUF_SIZE 128 -#define TX_BUF_SIZE 1024 - -#define SW_RETRY_CNT (2) -#define SW_RETRY_CNT_MAX (5) -#define SW_WAIT_TIMEOUT_MAX (100) - -/* FM operation timeout define for error handle */ -#define TEST_TIMEOUT (3) -#define FSPI_EN_TIMEOUT (3) -#define FSPI_MUXSEL_TIMEOUT (3) -#define FSPI_RD_TIMEOUT (3) -#define FSPI_WR_TIMEOUT (3) -#define I2C_RD_TIMEOUT (3) -#define I2C_WR_TIMEOUT (3) -#define EN_TIMEOUT (10) -#define RST_TIMEOUT (3) -#define TUNE_TIMEOUT (3) -#define SEEK_TIMEOUT (15) -#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */ -#define RDS_RX_EN_TIMEOUT (3) -#define RDS_DATA_TIMEOUT (100) -#define RAMPDOWN_TIMEOUT (3) -#define MCUCLK_TIMEOUT (3) -#define MODEMCLK_TIMEOUT (3) -#define RDS_TX_TIMEOUT (3) -#define PATCH_TIMEOUT (5) -#define COEFF_TIMEOUT (5) -#define HWCOEFF_TIMEOUT (5) -#define ROM_TIMEOUT (5) - -struct fm_link_event { - /* data */ - volatile fm_u32 flag; - wait_queue_head_t wq; - struct fm_res_ctx result; /* seek/scan/read/RDS */ - /* methods */ - fm_u32(*set) (struct fm_link_event *thiz, fm_u32 mask); - fm_u32(*clr) (struct fm_link_event *thiz, fm_u32 mask); - long (*check) (struct fm_link_event *thiz, fm_u32 mask, long timeout); - fm_u32(*get) (struct fm_link_event *thiz); - fm_u32(*rst) (struct fm_link_event *thiz); -}; -#endif -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h deleted file mode 100644 index 2c0e978fb..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef __MT6620_FM_REG_H__ -#define __MT6620_FM_REG_H__ - -enum MT6620_REG { - FM_MAIN_CG1_CTRL = 0x60, - FM_MAIN_CG2_CTRL = 0x61, - FM_MAIN_HWVER = 0x62, - FM_MAIN_CTRL = 0x63, - FM_CHANNEL_SET = 0x65, - FM_MAIN_CFG1 = 0x66, - FM_MAIN_CFG2 = 0x67, - FM_MAIN_MCLKDESENSE = 0x38, - FM_MAIN_INTR = 0x69, - FM_MAIN_INTRMASK = 0x6A, - FM_MAIN_EXTINTRMASK = 0x6B, - FM_RSSI_IND = 0xE8, - FM_RSSI_TH = 0x6D, - FM_MAIN_RESET = 0x6E, - FM_MAIN_CHANDETSTAT = 0x6F, - FM_RDS_CFG0 = 0x80, - FM_RDS_INFO = 0x81, - FM_RDS_DATA_REG = 0x82, - FM_RDS_GOODBK_CNT = 0xC6, /* page3 0xC6 */ - FM_RDS_BADBK_CNT = 0xC7, /* page3 0xC7 */ - FM_RDS_PWDI = 0x85, - FM_RDS_PWDQ = 0x86, - FM_RDS_FIFO_STATUS0 = 0x87, - FM_FT_CON9 = 0x8F, - FM_DSP_PATCH_CTRL = 0x90, - FM_DSP_PATCH_OFFSET = 0x91, - FM_DSP_PATCH_DATA = 0x92, - FM_DSP_MEM_CTRL4 = 0x93, - FM_MAIN_PGSEL = 0x9F, - FM_ADDR_PAMD = 0xE9, - FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6, - FM_RDS_POINTER = 0xF0, - FM_MR_IND = 0xF2, -}; -#define FM_TXSCAN_RSSI_TH (-250) -#define FM_TXSCAN_PAMD_TH (-20) -#define FM_TXSCAN_MR_TH (-38) - -/* RDS_BDGRP_ABD_CTRL_REG */ -enum { - BDGRP_ABD_EN = 0x0001, - BER_RUN = 0x2000 -}; -#define FM_DAC_CON1 0x83 -#define FM_DAC_CON2 0x84 -#define FM_FT_CON0 0x86 -#define FM_I2S_CON0 0x90 -#define FM_STEROMONO_CTR (0xE0) -enum { - FT_EN = 0x0001 -}; - -enum { - I2S_EN = 0x0001, - FORMAT = 0x0002, - WLEN = 0x0004, - I2S_SRC = 0x0008 -}; - -/* FM_MAIN_CTRL */ -enum { - TUNE = 0x0001, - SEEK = 0x0002, - SCAN = 0x0004, - RDS_MASK = 0x0010, - MUTE = 0x0020, - RDS_BRST = 0x0040, - RAMP_DOWN = 0x0100, -}; - -/* FM_MAIN_INTR */ -enum { - FM_INTR_STC_DONE = 0x0001, - FM_INTR_IQCAL_DONE = 0x0002, - FM_INTR_DESENSE_HIT = 0x0004, - FM_INTR_CHNL_CHG = 0x0008, - FM_INTR_SW_INTR = 0x0010, - FM_INTR_RDS = 0x0020 -}; - -enum { - ANTENNA_TYPE = 0x0010, -}; -/* FM reg page */ -enum FM_PAGE { - FM_PG0 = 0, - FM_PG1, - FM_PG2, - FM_PG3, - FM_PGMAX -}; - -#endif /* __MT6620_FM_REG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c deleted file mode 100644 index 3ef13c4e8..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c +++ /dev/null @@ -1,1487 +0,0 @@ -#include <linux/kernel.h> -#include <linux/types.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" -#include "fm_link.h" - -#include "mt6620_fm_reg.h" -/* #include "mt6620_fm_link.h" */ -#include "mt6620_fm.h" -#include "mt6620_fm_cmd.h" -#include "mt6620_fm_cust_cfg.h" - -static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 * buf, fm_s32 size) -{ - if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_WRITE_BASIC_OP; - buf[1] = FM_WRITE_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((value) & 0x00FF); - buf[4] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - - return (FM_WRITE_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_UDELAY_BASIC_OP; - buf[1] = FM_UDELAY_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_UDELAY_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_RD_UNTIL_BASIC_OP; - buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask) & 0x00FF); - buf[4] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_RD_UNTIL_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MODIFY_BASIC_OP; - buf[1] = FM_MODIFY_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask_and) & 0x00FF); - buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask_or) & 0x00FF); - buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_MODIFY_BASIC_OP_SIZE + 2); -} - - -/* - * mt6620_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6620_off_2_longANA_1(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* A01 Turn on the bandgap and central biasing core */ - pkt_size += fm_bop_write(0x01, 0x4A00, &buf[pkt_size], buf_size - pkt_size); /* wr 1 4A00 */ - pkt_size += fm_bop_udelay(30, &buf[pkt_size], buf_size - pkt_size); /* delay 30 */ - pkt_size += fm_bop_write(0x01, 0x6A00, &buf[pkt_size], buf_size - pkt_size); /* wr 1 6A00 */ - pkt_size += fm_bop_udelay(50, &buf[pkt_size], buf_size - pkt_size); /* delay 50 */ - /* A02 Initialise the LDO's Output */ - pkt_size += fm_bop_write(0x02, 0x299C, &buf[pkt_size], buf_size - pkt_size); /* wr 2 299C */ - /* A03 Enable RX, ADC and ADPLL LDO */ - pkt_size += fm_bop_write(0x01, 0x6B82, &buf[pkt_size], buf_size - pkt_size); /* wr 1 6B82 */ - /* A04 Update FMRF optimized register settings */ - pkt_size += fm_bop_write(0x04, 0x0142, &buf[pkt_size], buf_size - pkt_size); /* wr 4 0142 */ - pkt_size += fm_bop_write(0x05, 0x00E7, &buf[pkt_size], buf_size - pkt_size); /* wr 5 00E7 */ - pkt_size += fm_bop_write(0x0A, 0x0060, &buf[pkt_size], buf_size - pkt_size); /* wr a 0060 */ - pkt_size += fm_bop_write(0x0C, 0xA88C, &buf[pkt_size], buf_size - pkt_size); /* wr c A88C */ - pkt_size += fm_bop_write(0x0D, 0x0888, &buf[pkt_size], buf_size - pkt_size); /* wr d 0888 */ - pkt_size += fm_bop_write(0x10, 0x1E8D, &buf[pkt_size], buf_size - pkt_size); /* wr 10 1E8D */ - pkt_size += fm_bop_write(0x27, 0x0005, &buf[pkt_size], buf_size - pkt_size); /* wr 27 0005 */ - pkt_size += fm_bop_write(0x0E, 0x0040, &buf[pkt_size], buf_size - pkt_size); /* wr e 0040 */ - pkt_size += fm_bop_write(0x03, 0x50F0, &buf[pkt_size], buf_size - pkt_size); /* wr 3 50f0 */ - pkt_size += fm_bop_write(0x3F, 0xAD06, &buf[pkt_size], buf_size - pkt_size); /* wr 3f AD06 */ - pkt_size += fm_bop_write(0x3E, 0x3280, &buf[pkt_size], buf_size - pkt_size); /* wr 3e 3280 */ - pkt_size += fm_bop_write(0x06, 0x0124, &buf[pkt_size], buf_size - pkt_size); /* wr 6 0124 */ - pkt_size += fm_bop_write(0x08, 0x15B8, &buf[pkt_size], buf_size - pkt_size); /* wr 8 15B8 */ - /* A05 Enable RX related blocks */ - pkt_size += fm_bop_write(0x28, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 28 0000 */ - pkt_size += fm_bop_write(0x00, 0x0166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0166 */ - pkt_size += fm_bop_write(0x3A, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* wr 3a 0004 */ - pkt_size += fm_bop_write(0x37, 0x2590, &buf[pkt_size], buf_size - pkt_size); /* wr 37 2590 */ - /* FM ADPLL Power Up */ - /* () for 16.384M mode, otherwise 15.36M */ - pkt_size += fm_bop_write(0x25, 0x040F, &buf[pkt_size], buf_size - pkt_size); /* wr 25 040f */ - pkt_size += fm_bop_write(0x20, 0x2720, &buf[pkt_size], buf_size - pkt_size); /* wr 20 2720 */ - /* XHC, 2011/03/18, [wr 22 9980->6680] */ - pkt_size += fm_bop_write(0x22, 0x6680, &buf[pkt_size], buf_size - pkt_size); /* wr 22 9980 */ - pkt_size += fm_bop_write(0x25, 0x080F, &buf[pkt_size], buf_size - pkt_size); /* wr 25 080f */ - pkt_size += fm_bop_write(0x1E, 0x0863, &buf[pkt_size], buf_size - pkt_size); /* wr 1e 0863(0A63) */ - pkt_size += fm_bop_udelay(5000, &buf[pkt_size], buf_size - pkt_size); /* delay 5000 */ - pkt_size += fm_bop_write(0x1E, 0x0865, &buf[pkt_size], buf_size - pkt_size); /* wr 1e 0865 (0A65) */ - pkt_size += fm_bop_udelay(5000, &buf[pkt_size], buf_size - pkt_size); /* delay 5000 */ - pkt_size += fm_bop_write(0x1E, 0x0871, &buf[pkt_size], buf_size - pkt_size); /* wr 1e 0871 (0A71) */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_off_2_longANA_2(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100000 */ - pkt_size += fm_bop_write(0x2A, 0x1026, &buf[pkt_size], buf_size - pkt_size); /* wr 2a 1026 */ - /* FM RC Calibration */ - pkt_size += fm_bop_write(0x00, 0x01E6, &buf[pkt_size], buf_size - pkt_size); /* wr 0 01E6 */ - pkt_size += fm_bop_udelay(1, &buf[pkt_size], buf_size - pkt_size); /* delay 1 */ - pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size); /* wr 1b 0094 */ - pkt_size += fm_bop_write(0x1B, 0x0095, &buf[pkt_size], buf_size - pkt_size); /* wr 1b 0095 */ - pkt_size += fm_bop_udelay(200, &buf[pkt_size], buf_size - pkt_size); /* delay 200 */ - pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size); /* wr 1b 0094 */ - pkt_size += fm_bop_write(0x00, 0x0166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0166 */ - /* FM VCO Enable */ - pkt_size += fm_bop_write(0x01, 0x6B8A, &buf[pkt_size], buf_size - pkt_size); /* wr 1 6B8A */ - pkt_size += fm_bop_udelay(1, &buf[pkt_size], buf_size - pkt_size); /* delay 1 */ - pkt_size += fm_bop_write(0x00, 0xC166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 C166 */ - pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3000 */ - pkt_size += fm_bop_write(0x00, 0xF166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 F166 */ - pkt_size += fm_bop_write(0x09, 0x2964, &buf[pkt_size], buf_size - pkt_size); /* wr 9 2964 */ - /* FM RFDIG settings */ - pkt_size += fm_bop_write(0x2E, 0x0008, &buf[pkt_size], buf_size - pkt_size); /* wr 2e 8 */ - pkt_size += fm_bop_write(0x2B, 0x0064, &buf[pkt_size], buf_size - pkt_size); /* wr 2b 64 */ - pkt_size += fm_bop_write(0x2C, 0x0032, &buf[pkt_size], buf_size - pkt_size); /* wr 2c 32 */ - pkt_size += fm_bop_write(0x11, 0x17d4, &buf[pkt_size], buf_size - pkt_size); /* wr 11 17d4 */ - /* Update dynamic subband switching setting, XHC 2011/05/17 */ - pkt_size += fm_bop_write(0x13, 0xFA00, &buf[pkt_size], buf_size - pkt_size); /* wr 13 FA00 */ - pkt_size += fm_bop_write(0x14, 0x0580, &buf[pkt_size], buf_size - pkt_size); /* wr 14 0580 */ - pkt_size += fm_bop_write(0x15, 0xFA80, &buf[pkt_size], buf_size - pkt_size); /* wr 15 FA80 */ - pkt_size += fm_bop_write(0x16, 0x0580, &buf[pkt_size], buf_size - pkt_size); /* wr 16 0580 */ - pkt_size += fm_bop_write(0x33, 0x0008, &buf[pkt_size], buf_size - pkt_size); /* wr 33 0008 */ - /* FM DCOC Calibration */ - pkt_size += fm_bop_write(0x64, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 64 1 */ - pkt_size += fm_bop_write(0x63, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 63 20 */ - pkt_size += fm_bop_write(0x9C, 0x0044, &buf[pkt_size], buf_size - pkt_size); /* wr 9C 0044 */ - /* pkt_size += fm_bop_write(0x6B, 0x0100, &buf[pkt_size], buf_size - pkt_size);//"Disable other interrupts except for STC_DONE(dependent on interrupt output source selection)" */ - pkt_size += fm_bop_write(0x0F, 0x1A08, &buf[pkt_size], buf_size - pkt_size); /* wr F 1A08 */ - pkt_size += fm_bop_write(0x63, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 63 21 */ - pkt_size += fm_bop_rd_until(0x69, 0x0001, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* Poll fm_intr_stc_done (69H D0) = 1 */ - pkt_size += fm_bop_write(0x69, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 69 1 */ - pkt_size += fm_bop_write(0x63, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 0 */ - pkt_size += fm_bop_rd_until(0x6F, 0x0001, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* Poll stc_done (6FH D0)= 0 */ - /* Others */ - pkt_size += fm_bop_write(0x00, 0xF167, &buf[pkt_size], buf_size - pkt_size); /* wr 0 F167 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_rx_digital_init(fm_u8 *tx_buf, fm_s32 tx_buf_size) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* fm_rgf_maincon */ - /* rd 62 */ - pkt_size += fm_bop_write(0x65, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 0 */ - pkt_size += fm_bop_write(0x64, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 64 1 */ - pkt_size += fm_bop_write(0x63, 0x0480, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 63 480 */ - pkt_size += fm_bop_write(0x6D, 0x1AB2, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6d 1ab2 */ - pkt_size += fm_bop_write(0x6B, 0x2100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 2100 */ - pkt_size += fm_bop_write(0x68, 0xE100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E100 */ - pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000 */ - pkt_size += fm_bop_write(0x68, 0xE000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E000 */ - /* fm_rgf_dac */ - pkt_size += fm_bop_write(0x9C, 0xab48, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9c ab48 */ - pkt_size += fm_bop_write(0x9E, 0x000C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9e c */ - pkt_size += fm_bop_write(0x71, 0x807f, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 71 807f */ - pkt_size += fm_bop_write(0x72, 0x878f, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 72 878f */ - /* XHC, 2011/04/29 update 0x73 form 0x07C3 to 0x07C1 speed up I/Q calibration */ - pkt_size += fm_bop_write(0x73, 0x07c1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 73 7c3 */ - /* fm_rgf_front */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */ - pkt_size += fm_bop_write(0xCB, 0x00B0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cb b0 */ - /* XHC, 2011/05/06 FM RSSI config */ -/* pkt_size += fm_bop_write(0xE0, ((0xA301 & 0xFC00) | (FMR_RSSI_TH_LONG & 0x03FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr e0 a301 */ -/* pkt_size += fm_bop_write(0xE1, ((0x00E9 & 0xFF00) | (FMR_CQI_TH & 0x00FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr e1 D0~D7, PAMD TH */ - /* Run,2013/01 smt scan, ignore this */ - pkt_size += fm_bop_write(0xE0, ((0xA301 & 0xFC00) | (0x0301 & 0x03FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e0 a301 */ - pkt_size += fm_bop_write(0xE1, ((0x00E9 & 0xFF00) | (0x00E9 & 0x00FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e1 D0~D7, PAMD TH */ - /* XHC, 2011/04/15 update search MR threshold */ -/* pkt_size += fm_bop_write(0xE3, FMR_MR_TH, &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr e3 1B0 */ - /* Run,2013/01 smt scan, ignore this */ - pkt_size += fm_bop_write(0xE3, 0x01BD, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e3 1B0 */ - pkt_size += fm_bop_write(0xE4, 0x008F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e4 8f */ - pkt_size += fm_bop_write(0xCC, 0x0488, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cc 488 */ - pkt_size += fm_bop_write(0xD6, 0x036A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d6 36a */ - pkt_size += fm_bop_write(0xD7, 0x836a, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d7 836a */ - pkt_size += fm_bop_write(0xDD, 0x0080, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr dd 80 */ - pkt_size += fm_bop_write(0xB0, 0xcd00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b0 cd00 */ - /* XHC, 2011/03/18 Update AFC gain[wr 96 41E2->4000][wr 97 049A->021F] */ - /* [wr 98 0B66->0D00][wr 99 0E1E->0E7F][wr D0 8233->8192][wr D1 20BC->2086] */ - /* [wr 90 03FF->0192][wr 91 01BE->0086][wr 92 03FF->0192][wr 93 0354->0086] */ - /* [wr 94 03FF->0192][wr 95 0354->0086][wr 52 17F3] */ - pkt_size += fm_bop_write(0x96, 0x4000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 96 41E2 */ - pkt_size += fm_bop_write(0x97, 0x021F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 97 049A */ - pkt_size += fm_bop_write(0x98, 0x0D00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 98 0B66 */ - pkt_size += fm_bop_write(0x99, 0x0E7F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 99 0E1E */ - pkt_size += fm_bop_write(0xD0, 0x8192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr D0 8233 */ - pkt_size += fm_bop_write(0xD1, 0x2086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr D1 20BC */ - pkt_size += fm_bop_write(0x90, 0x0192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 90 03ff */ - pkt_size += fm_bop_write(0x91, 0x0086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 91 01BE */ - pkt_size += fm_bop_write(0x92, 0x0192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 92 03FF */ - pkt_size += fm_bop_write(0x93, 0x0086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 93 0354 */ - pkt_size += fm_bop_write(0x94, 0x0192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 94 03FF */ - pkt_size += fm_bop_write(0x95, 0x0086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 95 0354 */ - pkt_size += fm_bop_write(0x52, 0x17F3, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 95 0354 */ - /* fm_rgf_fmx */ - pkt_size += fm_bop_write(0x9F, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 1 */ - pkt_size += fm_bop_write(0xDE, 0x3388, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr de 3388 */ - pkt_size += fm_bop_write(0xC2, 0x0180, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c2 180 */ - pkt_size += fm_bop_write(0xC3, 0x0180, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c3 180 */ - pkt_size += fm_bop_write(0xDB, 0x0181, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr db 181 */ - pkt_size += fm_bop_write(0xDC, 0x0184, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr dc 184 */ - pkt_size += fm_bop_write(0xA2, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a2 3c0 */ - pkt_size += fm_bop_write(0xA3, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a3 3c0 */ - pkt_size += fm_bop_write(0xA4, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a4 3c0 */ - pkt_size += fm_bop_write(0xA5, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a5 3c0 */ - pkt_size += fm_bop_write(0xA6, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a6 3c0 */ - pkt_size += fm_bop_write(0xA7, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a7 3c0 */ - pkt_size += fm_bop_write(0xE3, 0x0280, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e3 280 */ - pkt_size += fm_bop_write(0xE4, 0x0280, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e4 280 */ - pkt_size += fm_bop_write(0xE5, 0x0280, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e5 280 */ - pkt_size += fm_bop_write(0xE6, 0x026C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e6 26c */ - pkt_size += fm_bop_write(0xE7, 0x026C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e7 26c */ - pkt_size += fm_bop_write(0xEA, 0x026C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ea 26c */ - pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */ - pkt_size += fm_bop_write(0xB6, 0x03FC, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b6 3fc */ - pkt_size += fm_bop_write(0xB7, 0x02C1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b7 2c1 */ - pkt_size += fm_bop_write(0xA8, 0x0820, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 820 */ - pkt_size += fm_bop_write(0xAC, 0x065E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ac 65e */ - pkt_size += fm_bop_write(0xAD, 0x09AD, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ad 9ad */ - pkt_size += fm_bop_write(0xAE, 0x0CF8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ae cf8 */ - pkt_size += fm_bop_write(0xAF, 0x0302, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr af 302 */ - pkt_size += fm_bop_write(0xB0, 0x04A6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b0 4a6 */ - pkt_size += fm_bop_write(0xB1, 0x062C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b1 62c */ - pkt_size += fm_bop_write(0xEC, 0x014A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ec 14a */ - pkt_size += fm_bop_write(0xC8, 0x0232, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c8 232 */ - pkt_size += fm_bop_write(0xC7, 0x0184, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c7 0184 */ - pkt_size += fm_bop_write(0xD8, 0x00E8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d8 0e8 */ - pkt_size += fm_bop_write(0xFB, 0x051F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fb 51f */ - pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */ - /* XHC,2011/03/18 [wr C9 01F0][wr CA 0250][wr D4 2657] */ - pkt_size += fm_bop_write(0xC9, 0x01F0, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0xCA, 0x0250, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0xD4, 0x2657, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0x9F, 0x0002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 2 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0xFF80, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff80 */ - pkt_size += fm_bop_write(0xA8, 0x0061, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 61 */ - pkt_size += fm_bop_write(0xA8, 0xFF22, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff22 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 100 */ - pkt_size += fm_bop_write(0xA8, 0x009A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 9a */ - pkt_size += fm_bop_write(0xA8, 0xFF80, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff80 */ - pkt_size += fm_bop_write(0xA8, 0x0140, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 140 */ - pkt_size += fm_bop_write(0xA8, 0xFF42, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff42 */ - pkt_size += fm_bop_write(0xA8, 0xFFE0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ffe0 */ - pkt_size += fm_bop_write(0xA8, 0x0114, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 114 */ - pkt_size += fm_bop_write(0xA8, 0xFF4E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff4e */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x003E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 3e */ - pkt_size += fm_bop_write(0xA8, 0xFF6E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff6e */ - pkt_size += fm_bop_write(0xA8, 0x0087, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 87 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0xFEDC, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 fedc */ - pkt_size += fm_bop_write(0xA8, 0x0015, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 15 */ - pkt_size += fm_bop_write(0xA8, 0x00CF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 cf */ - pkt_size += fm_bop_write(0xA8, 0xFF6B, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff6b */ - pkt_size += fm_bop_write(0xA8, 0x0164, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 164 */ - pkt_size += fm_bop_write(0xA8, 0x002B, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 2b */ - pkt_size += fm_bop_write(0xA8, 0xFF7E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff7e */ - pkt_size += fm_bop_write(0xA8, 0x0065, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 65 */ - pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000 */ - pkt_size += fm_bop_write(0x9F, 0x0002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 2 */ - pkt_size += fm_bop_write(0xA9, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 0 */ - pkt_size += fm_bop_write(0xA9, 0xFFEE, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ffee */ - pkt_size += fm_bop_write(0xA9, 0xFF81, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ff81 */ - /* XHC,2011/03/18 [wr A9 FFC3] */ - pkt_size += fm_bop_write(0xA9, 0xFFC3, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0xA9, 0x0022, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 22 */ - pkt_size += fm_bop_write(0xA9, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 0 */ - pkt_size += fm_bop_write(0xA9, 0xFFCC, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ffcc */ - pkt_size += fm_bop_write(0xA9, 0x0023, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 23 */ - pkt_size += fm_bop_write(0xA9, 0xFFDA, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ffda */ - pkt_size += fm_bop_write(0xA9, 0xFFF7, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 fff7 */ - pkt_size += fm_bop_udelay(10, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10 */ - pkt_size += fm_bop_write(0x9F, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 1 */ - pkt_size += fm_bop_write(0xD3, 0x250b, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d3 250b */ - pkt_size += fm_bop_write(0xBB, 0x2320, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bb 2320 */ - pkt_size += fm_bop_write(0xD0, 0x02f8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d0 02f8 */ - pkt_size += fm_bop_write(0xEC, 0x019a, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ec 19a */ - pkt_size += fm_bop_write(0xFE, 0x2140, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fe 2140 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */ - /* fm_rgf_rds */ - pkt_size += fm_bop_write(0x9F, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 3 */ - pkt_size += fm_bop_write(0xBD, 0x37EB, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bd 37eb */ - pkt_size += fm_bop_write(0xBC, 0x0404, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bc 404 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6620_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6620_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - - /* fm_rgf_maincon */ - /* rd 62 */ - pkt_size += fm_bop_write(0x65, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 65 0 */ - pkt_size += fm_bop_write(0x64, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 64 1 */ - pkt_size += fm_bop_write(0x63, 0x0480, &buf[pkt_size], buf_size - pkt_size); /* wr 63 480 */ - pkt_size += fm_bop_write(0x6D, 0x1AB2, &buf[pkt_size], buf_size - pkt_size); /* wr 6d 1ab2 */ - pkt_size += fm_bop_write(0x6B, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6b 2100 */ - pkt_size += fm_bop_write(0x68, 0xE100, &buf[pkt_size], buf_size - pkt_size); /* wr 68 E100 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_write(0x68, 0xE000, &buf[pkt_size], buf_size - pkt_size); /* wr 68 E000 */ - /* fm_rgf_dac */ - pkt_size += fm_bop_write(0x9C, 0xab48, &buf[pkt_size], buf_size - pkt_size); /* wr 9c ab48 */ - pkt_size += fm_bop_write(0x9E, 0x000C, &buf[pkt_size], buf_size - pkt_size); /* wr 9e c */ - pkt_size += fm_bop_write(0x71, 0x807f, &buf[pkt_size], buf_size - pkt_size); /* wr 71 807f */ - pkt_size += fm_bop_write(0x72, 0x878f, &buf[pkt_size], buf_size - pkt_size); /* wr 72 878f */ - /* XHC, 2011/04/29 update 0x73 form 0x07C3 to 0x07C1 speed up I/Q calibration */ - pkt_size += fm_bop_write(0x73, 0x07c1, &buf[pkt_size], buf_size - pkt_size); /* wr 73 7c3 */ - /* fm_rgf_front */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */ - pkt_size += fm_bop_write(0xCB, 0x00B0, &buf[pkt_size], buf_size - pkt_size); /* wr cb b0 */ - /* XHC, 2011/05/06 FM RSSI config */ - pkt_size += fm_bop_write(0xE0, ((0xA301 & 0xFC00) | (FMR_RSSI_TH_LONG_MT6620 & 0x03FF)), &buf[pkt_size], buf_size - pkt_size); /* wr e0 a301 */ - pkt_size += fm_bop_write(0xE1, ((0x00E9 & 0xFF00) | (FMR_CQI_TH_MT6620 & 0x00FF)), &buf[pkt_size], buf_size - pkt_size); /* wr e1 D0~D7, PAMD TH */ - /* XHC, 2011/04/15 update search MR threshold */ - pkt_size += fm_bop_write(0xE3, FMR_MR_TH_MT6620, &buf[pkt_size], buf_size - pkt_size); /* wr e3 1B0 */ - pkt_size += fm_bop_write(0xE4, 0x008F, &buf[pkt_size], buf_size - pkt_size); /* wr e4 8f */ - pkt_size += fm_bop_write(0xCC, 0x0488, &buf[pkt_size], buf_size - pkt_size); /* wr cc 488 */ - pkt_size += fm_bop_write(0xD6, 0x036A, &buf[pkt_size], buf_size - pkt_size); /* wr d6 36a */ - pkt_size += fm_bop_write(0xD7, 0x836a, &buf[pkt_size], buf_size - pkt_size); /* wr d7 836a */ - pkt_size += fm_bop_write(0xDD, 0x0080, &buf[pkt_size], buf_size - pkt_size); /* wr dd 80 */ - pkt_size += fm_bop_write(0xB0, 0xcd00, &buf[pkt_size], buf_size - pkt_size); /* wr b0 cd00 */ - /* XHC, 2011/03/18 Update AFC gain[wr 96 41E2->4000][wr 97 049A->021F] */ - /* [wr 98 0B66->0D00][wr 99 0E1E->0E7F][wr D0 8233->8192][wr D1 20BC->2086] */ - /* [wr 90 03FF->0192][wr 91 01BE->0086][wr 92 03FF->0192][wr 93 0354->0086] */ - /* [wr 94 03FF->0192][wr 95 0354->0086][wr 52 17F3] */ - pkt_size += fm_bop_write(0x96, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 96 41E2 */ - pkt_size += fm_bop_write(0x97, 0x021F, &buf[pkt_size], buf_size - pkt_size); /* wr 97 049A */ - pkt_size += fm_bop_write(0x98, 0x0D00, &buf[pkt_size], buf_size - pkt_size); /* wr 98 0B66 */ - pkt_size += fm_bop_write(0x99, 0x0E7F, &buf[pkt_size], buf_size - pkt_size); /* wr 99 0E1E */ - pkt_size += fm_bop_write(0xD0, 0x8192, &buf[pkt_size], buf_size - pkt_size); /* wr D0 8233 */ - pkt_size += fm_bop_write(0xD1, 0x2086, &buf[pkt_size], buf_size - pkt_size); /* wr D1 20BC */ - pkt_size += fm_bop_write(0x90, 0x0192, &buf[pkt_size], buf_size - pkt_size); /* wr 90 03ff */ - pkt_size += fm_bop_write(0x91, 0x0086, &buf[pkt_size], buf_size - pkt_size); /* wr 91 01BE */ - pkt_size += fm_bop_write(0x92, 0x0192, &buf[pkt_size], buf_size - pkt_size); /* wr 92 03FF */ - pkt_size += fm_bop_write(0x93, 0x0086, &buf[pkt_size], buf_size - pkt_size); /* wr 93 0354 */ - pkt_size += fm_bop_write(0x94, 0x0192, &buf[pkt_size], buf_size - pkt_size); /* wr 94 03FF */ - pkt_size += fm_bop_write(0x95, 0x0086, &buf[pkt_size], buf_size - pkt_size); /* wr 95 0354 */ - pkt_size += fm_bop_write(0x52, 0x17F3, &buf[pkt_size], buf_size - pkt_size); /* wr 95 0354 */ - /* fm_rgf_fmx */ - pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 1 */ - pkt_size += fm_bop_write(0xDE, 0x3388, &buf[pkt_size], buf_size - pkt_size); /* wr de 3388 */ - pkt_size += fm_bop_write(0xC2, 0x0180, &buf[pkt_size], buf_size - pkt_size); /* wr c2 180 */ - pkt_size += fm_bop_write(0xC3, 0x0180, &buf[pkt_size], buf_size - pkt_size); /* wr c3 180 */ - pkt_size += fm_bop_write(0xDB, 0x0181, &buf[pkt_size], buf_size - pkt_size); /* wr db 181 */ - pkt_size += fm_bop_write(0xDC, 0x0184, &buf[pkt_size], buf_size - pkt_size); /* wr dc 184 */ - pkt_size += fm_bop_write(0xA2, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a2 3c0 */ - pkt_size += fm_bop_write(0xA3, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a3 3c0 */ - pkt_size += fm_bop_write(0xA4, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a4 3c0 */ - pkt_size += fm_bop_write(0xA5, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a5 3c0 */ - pkt_size += fm_bop_write(0xA6, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a6 3c0 */ - pkt_size += fm_bop_write(0xA7, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a7 3c0 */ - pkt_size += fm_bop_write(0xE3, 0x0280, &buf[pkt_size], buf_size - pkt_size); /* wr e3 280 */ - pkt_size += fm_bop_write(0xE4, 0x0280, &buf[pkt_size], buf_size - pkt_size); /* wr e4 280 */ - pkt_size += fm_bop_write(0xE5, 0x0280, &buf[pkt_size], buf_size - pkt_size); /* wr e5 280 */ - pkt_size += fm_bop_write(0xE6, 0x026C, &buf[pkt_size], buf_size - pkt_size); /* wr e6 26c */ - pkt_size += fm_bop_write(0xE7, 0x026C, &buf[pkt_size], buf_size - pkt_size); /* wr e7 26c */ - pkt_size += fm_bop_write(0xEA, 0x026C, &buf[pkt_size], buf_size - pkt_size); /* wr ea 26c */ - pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1000 */ - pkt_size += fm_bop_write(0xB6, 0x03FC, &buf[pkt_size], buf_size - pkt_size); /* wr b6 3fc */ - pkt_size += fm_bop_write(0xB7, 0x02C1, &buf[pkt_size], buf_size - pkt_size); /* wr b7 2c1 */ - pkt_size += fm_bop_write(0xA8, 0x0820, &buf[pkt_size], buf_size - pkt_size); /* wr a8 820 */ - pkt_size += fm_bop_write(0xAC, 0x065E, &buf[pkt_size], buf_size - pkt_size); /* wr ac 65e */ - pkt_size += fm_bop_write(0xAD, 0x09AD, &buf[pkt_size], buf_size - pkt_size); /* wr ad 9ad */ - pkt_size += fm_bop_write(0xAE, 0x0CF8, &buf[pkt_size], buf_size - pkt_size); /* wr ae cf8 */ - pkt_size += fm_bop_write(0xAF, 0x0302, &buf[pkt_size], buf_size - pkt_size); /* wr af 302 */ - pkt_size += fm_bop_write(0xB0, 0x04A6, &buf[pkt_size], buf_size - pkt_size); /* wr b0 4a6 */ - pkt_size += fm_bop_write(0xB1, 0x062C, &buf[pkt_size], buf_size - pkt_size); /* wr b1 62c */ - pkt_size += fm_bop_write(0xEC, 0x014A, &buf[pkt_size], buf_size - pkt_size); /* wr ec 14a */ - pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr c8 232 */ - pkt_size += fm_bop_write(0xC7, 0x0184, &buf[pkt_size], buf_size - pkt_size); /* wr c7 0184 */ - pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr d8 0e8 */ - pkt_size += fm_bop_write(0xFB, 0x051F, &buf[pkt_size], buf_size - pkt_size); /* wr fb 51f */ - pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1000 */ - /* XHC,2011/03/18 [wr C9 01F0][wr CA 0250][wr D4 2657] */ - pkt_size += fm_bop_write(0xC9, 0x01F0, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xCA, 0x0250, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xD4, 0x2657, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x9F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 2 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0xFF80, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff80 */ - pkt_size += fm_bop_write(0xA8, 0x0061, &buf[pkt_size], buf_size - pkt_size); /* wr a8 61 */ - pkt_size += fm_bop_write(0xA8, 0xFF22, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff22 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0100, &buf[pkt_size], buf_size - pkt_size); /* wr a8 100 */ - pkt_size += fm_bop_write(0xA8, 0x009A, &buf[pkt_size], buf_size - pkt_size); /* wr a8 9a */ - pkt_size += fm_bop_write(0xA8, 0xFF80, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff80 */ - pkt_size += fm_bop_write(0xA8, 0x0140, &buf[pkt_size], buf_size - pkt_size); /* wr a8 140 */ - pkt_size += fm_bop_write(0xA8, 0xFF42, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff42 */ - pkt_size += fm_bop_write(0xA8, 0xFFE0, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ffe0 */ - pkt_size += fm_bop_write(0xA8, 0x0114, &buf[pkt_size], buf_size - pkt_size); /* wr a8 114 */ - pkt_size += fm_bop_write(0xA8, 0xFF4E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff4e */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0x003E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 3e */ - pkt_size += fm_bop_write(0xA8, 0xFF6E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff6e */ - pkt_size += fm_bop_write(0xA8, 0x0087, &buf[pkt_size], buf_size - pkt_size); /* wr a8 87 */ - pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */ - pkt_size += fm_bop_write(0xA8, 0xFEDC, &buf[pkt_size], buf_size - pkt_size); /* wr a8 fedc */ - pkt_size += fm_bop_write(0xA8, 0x0015, &buf[pkt_size], buf_size - pkt_size); /* wr a8 15 */ - pkt_size += fm_bop_write(0xA8, 0x00CF, &buf[pkt_size], buf_size - pkt_size); /* wr a8 cf */ - pkt_size += fm_bop_write(0xA8, 0xFF6B, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff6b */ - pkt_size += fm_bop_write(0xA8, 0x0164, &buf[pkt_size], buf_size - pkt_size); /* wr a8 164 */ - pkt_size += fm_bop_write(0xA8, 0x002B, &buf[pkt_size], buf_size - pkt_size); /* wr a8 2b */ - pkt_size += fm_bop_write(0xA8, 0xFF7E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff7e */ - pkt_size += fm_bop_write(0xA8, 0x0065, &buf[pkt_size], buf_size - pkt_size); /* wr a8 65 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_pwrup_digital_init_3(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_write(0x9F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 2 */ - pkt_size += fm_bop_write(0xA9, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a9 0 */ - pkt_size += fm_bop_write(0xA9, 0xFFEE, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ffee */ - pkt_size += fm_bop_write(0xA9, 0xFF81, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ff81 */ - /* XHC,2011/03/18 [wr A9 FFC3] */ - pkt_size += fm_bop_write(0xA9, 0xFFC3, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xA9, 0x0022, &buf[pkt_size], buf_size - pkt_size); /* wr a9 22 */ - pkt_size += fm_bop_write(0xA9, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a9 0 */ - pkt_size += fm_bop_write(0xA9, 0xFFCC, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ffcc */ - pkt_size += fm_bop_write(0xA9, 0x0023, &buf[pkt_size], buf_size - pkt_size); /* wr a9 23 */ - pkt_size += fm_bop_write(0xA9, 0xFFDA, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ffda */ - pkt_size += fm_bop_write(0xA9, 0xFFF7, &buf[pkt_size], buf_size - pkt_size); /* wr a9 fff7 */ - pkt_size += fm_bop_udelay(10, &buf[pkt_size], buf_size - pkt_size); /* delay 10 */ - pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 1 */ - pkt_size += fm_bop_write(0xD3, 0x250b, &buf[pkt_size], buf_size - pkt_size); /* wr d3 250b */ - pkt_size += fm_bop_write(0xBB, 0x2320, &buf[pkt_size], buf_size - pkt_size); /* wr bb 2320 */ - pkt_size += fm_bop_write(0xD0, 0x02f8, &buf[pkt_size], buf_size - pkt_size); /* wr d0 02f8 */ - pkt_size += fm_bop_write(0xEC, 0x019a, &buf[pkt_size], buf_size - pkt_size); /* wr ec 19a */ - pkt_size += fm_bop_write(0xFE, 0x2140, &buf[pkt_size], buf_size - pkt_size); /* wr fe 2140 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */ - /* fm_rgf_rds */ - pkt_size += fm_bop_write(0x9F, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 3 */ - pkt_size += fm_bop_write(0xBD, 0x37EB, &buf[pkt_size], buf_size - pkt_size); /* wr bd 37eb */ - pkt_size += fm_bop_write(0xBC, 0x0404, &buf[pkt_size], buf_size - pkt_size); /* wr bc 808 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6620_pwrdown - Wholechip FM Power down: Digital Modem Power Down - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6620_pwrdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Digital Modem Power Down */ - pkt_size += fm_bop_write(0x63, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round1 */ - pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round2 */ - pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round3 */ - pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round4 */ - /* ADPLL Power Off Sequence */ - pkt_size += fm_bop_write(0x2A, 0x0022, &buf[pkt_size], buf_size - pkt_size); /* wr 2a 22 */ - pkt_size += fm_bop_write(0x1E, 0x0860, &buf[pkt_size], buf_size - pkt_size); /* wr 1E 0860 */ - pkt_size += fm_bop_write(0x20, 0x0720, &buf[pkt_size], buf_size - pkt_size); /* wr 20 0720 */ - pkt_size += fm_bop_write(0x20, 0x2720, &buf[pkt_size], buf_size - pkt_size); /* wr 20 2720 */ - /* ANALOG/RF Power Off Sequence */ - pkt_size += fm_bop_write(0x00, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0 */ - pkt_size += fm_bop_write(0x01, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 1 0 */ - pkt_size += fm_bop_write(0x04, 0x0141, &buf[pkt_size], buf_size - pkt_size); /* wr 4 0141 */ - pkt_size += fm_bop_write(0x09, 0x0964, &buf[pkt_size], buf_size - pkt_size); /* wr 9 0964 */ - pkt_size += fm_bop_write(0x0C, 0x288C, &buf[pkt_size], buf_size - pkt_size); /* wr c 288c */ - pkt_size += fm_bop_write(0x26, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* wr 26 0004 */ - pkt_size += fm_bop_write(0x3A, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 3A 0000 */ - pkt_size += fm_bop_write(0x3B, 0x00C3, &buf[pkt_size], buf_size - pkt_size); /* wr 3B 00C3 */ - pkt_size += fm_bop_write(0x3E, 0x3280, &buf[pkt_size], buf_size - pkt_size); /* wr 3E 3280 */ - pkt_size += fm_bop_write(0x3F, 0x4E16, &buf[pkt_size], buf_size - pkt_size); /* wr 3F 4E16 */ - pkt_size += fm_bop_write(0x41, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* wr 41 0004 */ - /* clear TX settings */ - pkt_size += fm_bop_write(0x12, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 12 0000 */ - pkt_size += fm_bop_write(0x47, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 47 0000 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6620_rampdown - f/w will wait for STC_DONE interrupt - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6620_rampdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(0x9C, 0xFF87, 0x0068, &buf[pkt_size], buf_size - pkt_size); /* wr 9c[3] = 1, ramp down */ - pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 1 */ - pkt_size += fm_bop_write(0xC8, 0x0101, &buf[pkt_size], buf_size - pkt_size); /* wr c8 101 */ - pkt_size += fm_bop_write(0xDD, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr dd 0 */ - pkt_size += fm_bop_write(0xD8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr d8 0 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */ - pkt_size += fm_bop_udelay(35000, &buf[pkt_size], buf_size - pkt_size); /* delay 35000 */ - /* disable interrupt before rampdown */ - pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6b 0000 */ - pkt_size += fm_bop_modify(0x63, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0, ramp down */ - pkt_size += fm_bop_rd_until(0x6f, 0x0001, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* Poll 6f[0] = b'0 */ - pkt_size += fm_bop_write(0x6B, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6b 2100 */ - /* enable interrupt after rampdown */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -#if 0 /* ramp down tx will do in tx tune flow */ -fm_s32 mt6620_rampdown_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_write(0x3B, 0x0500, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3b 0500 */ - pkt_size += fm_bop_write(0x3A, 0x00FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3a ff */ - pkt_size += fm_bop_write(0x65, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 1 */ - pkt_size += fm_bop_write(0x48, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 48 0 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} -#endif -/* - * mt6620_tune - execute tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6620_tune_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x0F[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_tune_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } -/* - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 640) * 2 / 10; -*/ - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(0x9C, 0xFFF7, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* set 0x9C[3] = 0 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_tune_3(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } -/* - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 640) * 2 / 10; -*/ - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 1 */ - pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr C8 232 */ - pkt_size += fm_bop_write(0xDD, 0x8833, &buf[pkt_size], buf_size - pkt_size); /* wr DD 8833 */ - pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr D8 E8 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 0 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_fast_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(0x63, 0xFFF0, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x63[3:0] = 0 */ - pkt_size += fm_bop_modify(0x6F, 0xFFFE, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x6F[0] = 0 */ - pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x0F[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* disable interrupt before rampdown */ - pkt_size += fm_bop_write(0x6B, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 0000 */ - pkt_size += fm_bop_modify(0x63, 0xFFFE, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x63[0] = 1 */ - pkt_size += fm_bop_rd_until(0x69, 0x0001, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Poll 69[0] = b'1 */ - pkt_size += fm_bop_modify(0x69, 0xFFFE, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x69[0] = 1 */ - pkt_size += fm_bop_write(0x6B, 0x2100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 2100 */ - /* enable interrupt after rampdown */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6620_full_cqi_req - execute request cqi info action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 7600 ~ 10800, freq array - * @cnt - channel count - * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step - * - * return package size - */ - -fm_s32 mt6620_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_s32 cnt, fm_s32 type) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SOFT_MUTE_TUNE_OPCODE; - pkt_size = 4; - - switch (type) { - case 1: - buf[pkt_size] = 0x0001; - pkt_size++; - buf[pkt_size] = (fm_u8) (freq & 0x00FF); - pkt_size++; - buf[pkt_size] = (fm_u8) ((freq >> 8) & 0x00FF); - pkt_size++; - break; - default: - buf[pkt_size] = (fm_u16) type; - pkt_size++; - break; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; - -} - -/* freq: 760 ~ 1080, 100KHz unit */ -fm_s32 mt6620_tune_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* XHC, 2011/04/20, ramp down before tune */ - pkt_size += fm_bop_write(0x3B, 0x0500, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3b 0500 */ - pkt_size += fm_bop_write(0x3A, 0x00FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3a ff */ - pkt_size += fm_bop_write(0x65, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 1 */ - pkt_size += fm_bop_write(0x48, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 48 0 */ - /* XHC, 2011/04/14 */ - pkt_size += fm_bop_modify(0x41, 0xFFFE, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x41[0] = 1 */ - /* XHC, 2011/04/18 */ - pkt_size += fm_bop_modify(0x12, 0x7FFF, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x12[15] = 0 */ - /* XHC, 2011/04/22, clear RTC compensation info */ - pkt_size += fm_bop_modify(0x47, 0x003F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x47[15:6] = 0 */ - pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x0F[9:0] = freq */ - pkt_size += fm_bop_write(0x26, 0x002C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 002C --> SCAL Related --> SCAL_EN and SCAL_GM_EN */ - pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000us */ - pkt_size += fm_bop_write(0x26, 0x003C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 003C --> SCAL_BUF_EN */ - pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000us */ - pkt_size += fm_bop_write(0x10, 0x1E8D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 10 1e8d */ - pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000us */ - pkt_size += fm_bop_write(0x10, 0x9E8D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 10 9e8d */ - pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000us */ - pkt_size += fm_bop_write(0x26, 0x0024, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 0024 --> Turn off SCAL gm and BUF */ - pkt_size += fm_bop_write(0x65, 0x400F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 400f */ - pkt_size += fm_bop_write(0x48, 0x8000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 48 8000 */ - pkt_size += fm_bop_write(0x3B, 0x0420, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3b 0420 */ - pkt_size += fm_bop_write(0x3A, 0x01FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3a 1ff */ - /* XHC, 2011/04/14 */ - /* pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size);//delay 10000us */ - /* pkt_size += fm_bop_modify(0x41, 0xFFFE, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size);// set 0x41[0] = 0 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* freq: 760 ~ 1080, 100KHz unit */ -fm_s32 mt6620_tune_txscan(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* rampdown */ - /* disable interrupt before rampdown */ - pkt_size += fm_bop_write(0x6B, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 0000 */ - pkt_size += fm_bop_modify(0x63, 0xFFF0, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 63[3:0] = 0, ramp down */ - pkt_size += fm_bop_rd_until(0x6f, 0x0001, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Poll 6f[0] = b'0 */ - pkt_size += fm_bop_modify(0x9C, 0xFFFF, 0x0008, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9c[3] = 1, ramp down */ - pkt_size += fm_bop_write(0x6B, 0x2100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 2100 */ - /* enable interrupt after rampdown */ - - /* set desired channel */ - pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x0F[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - - /* only for short antennal tune */ -#ifdef MT6620_FM_USE_SHORT_ANTENNA - pkt_size += fm_bop_write(0x28, 0x3800, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 28 3800 */ - pkt_size += fm_bop_write(0x03, 0x90F0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3 90f0 */ - pkt_size += fm_bop_write(0x2E, 0x0028, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2e 28 */ - pkt_size += fm_bop_write(0x2F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2f 0 */ - pkt_size += fm_bop_write(0x26, 0x003C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 3c */ - pkt_size += fm_bop_write(0x2E, 0x002C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2e 2c */ - pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wait 10ms */ - pkt_size += fm_bop_write(0x26, 0x0024, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 24 */ - pkt_size += fm_bop_write(0x28, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 28 00 */ -#endif - - /* only for E1 */ -#ifdef MT6620E1 - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 0 */ - pkt_size += fm_bop_write(0xAF, 0x2210, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr AF 2210 */ -#endif - - /* mask STC_DONE interrupt, 6a(D0) 0 */ - /* pkt_size += fm_bop_modify(0x6A, 0xFFFE, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); */ - - /* enable hardware are controlled tuning sequence */ - pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set rgf_tune (63H D0) =1 */ - - /* check STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_rd_until(0x69, 0x0001, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size);//Poll fm_intr_stc_done (69H D0) = 1 */ - - /* write 1 clear the STC_DONE status flag */ - /* pkt_size += fm_bop_modify(0x69, 0xFFFF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size);// set stc_done (6FH D0) =1 */ - - /* unmask STC_DONE interrupt, 6a(D0) 1 */ - /* pkt_size += fm_bop_modify(0x6A, 0xFFFF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); */ - - /* only for E1 */ -#ifdef MT6620E1 - /* pkt_size += fm_bop_write(0xAF, 0x7710, &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr AF 7710 */ -#endif - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6620_seek - execute seek action, - * @buf - target buf - * @buf_size - buffer size - * @seekdir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6620_seek_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* A1 Program seek direction, 0x66[10]: 0=seek up, 1=seek down */ - if (seekdir == 0) { - pkt_size += fm_bop_modify(0x66, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* A2 Program scan channel spacing, 0x66[14:12] step 50KHz:001/100KHz:010/200KHz:100 */ - if (space == 4) { - pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else { - pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } - - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - pkt_size += fm_bop_modify(0x66, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - - /* 0x67[9:0] freq lower bound */ - min_freq = (min_freq - 640) * 2; - pkt_size += fm_bop_modify(0x67, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* A3 Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_seek_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* A10 Set softmute to normal mode */ - pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 1 */ - pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr C8 232 */ - pkt_size += fm_bop_write(0xDD, 0x8833, &buf[pkt_size], buf_size - pkt_size); /* wr DD 8833 */ - pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr D8 E8 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 0 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6620_scan - execute scan action, - * @buf - target buf - * @buf_size - buffer size - * @scandir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6620_scan_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* A1 Program seek direction, 0x66[10]: 0=seek up, 1=seek down */ - if (scandir == 0) { - pkt_size += fm_bop_modify(0x66, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* A2 Program scan channel spacing, 0x66[14:12] step 50KHz:001/100KHz:010/200KHz:100 */ - if (space == 4) { - pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else { - pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } - - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - pkt_size += fm_bop_modify(0x66, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - - /* 0x67[9:0] freq lower bound */ - min_freq = (min_freq - 640) * 2; - pkt_size += fm_bop_modify(0x67, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* A3 Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_scan_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* A10 Set softmute to normal mode */ - pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 1 */ - pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr C8 232 */ - pkt_size += fm_bop_write(0xDD, 0x8833, &buf[pkt_size], buf_size - pkt_size); /* wr DD 8833 */ - pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr D8 E8 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 0 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_READ_OPCODE; - buf[2] = 0x01; - buf[3] = 0x00; - buf[4] = addr; - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - return 5; -} - -fm_s32 mt6620_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_WRITE_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = addr; - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} - -fm_s32 mt6620_rds_rx_enable(fm_u8 *tx_buf, fm_s32 tx_buf_size) /* IC version */ -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = RDS_RX_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_write(0x9F, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0x9f 3 */ - pkt_size += fm_bop_write(0xCB, 0xE016, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Wr 0xcb e016 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0x9f 0 */ - pkt_size += fm_bop_write(0x63, 0x0491, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Wr 0x63 491 */ - pkt_size += fm_bop_modify(0x6B, 0xFFFF, 0x2000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* Wr 0x6b [13] = 1 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6620_rds_rx_disable(fm_u8 *tx_buf, fm_s32 tx_buf_size) /* IC version */ -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = RDS_RX_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(0x6B, 0xDFFF, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* Wr 0x6b [13] = 0 */ - pkt_size += fm_bop_write(0x63, 0x0481, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Wr 0x63 481 */ - - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* TBD for IC */ -fm_s32 mt6620_rds_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, - fm_u8 other_rds_cnt) -{ - fm_s32 pkt_size = 0; - fm_s32 i; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (other_rds_cnt > 29) { - return (-2); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = RDS_TX_OPCODE; - pkt_size = 4; - - /* RDS Tx config */ - pkt_size += fm_bop_modify(0x65, 0xFFFF, 0x0010, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 65[4] = b'1, enable RDS Tx */ - pkt_size += fm_bop_write(0x9F, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 3 */ - pkt_size += fm_bop_write(0xA2, 0x0005, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a2 5, repeat + PI_reg mode */ - pkt_size += fm_bop_write(0xA1, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a1 0 */ - /* pkt_size += fm_bop_write(0xA0, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr a0 1 */ - pkt_size += fm_bop_write(0xA4, pi, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* write PI to PI_reg */ - /* program PS buf */ - pkt_size += fm_bop_rd_until(0xAA, 0x0001, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* rd until aa[0] = b'0, ptr in normal buf */ - /* program normal buf, workaround that PS buf can't work while normal buf is empty */ - for (i = 0; i < 12; i++) { - pkt_size += fm_bop_write(0xA8, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */ - } - pkt_size += fm_bop_modify(0xA2, 0xFFFF, 0x0002, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[1] = b'1, mem_addr mode */ - for (i = 0; i < 12; i++) { - pkt_size += fm_bop_write(0xA7, (0x0063 + i), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a7 = mem_addr */ - pkt_size += fm_bop_write(0xA8, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */ - } - pkt_size += fm_bop_modify(0xA2, 0xFFFF, 0x0010, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[4] = b'1, switch to ps buf */ - /* program normal buf */ - pkt_size += fm_bop_rd_until(0xAA, 0x0001, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* rd until aa[0] = b'1, ptr in ps buf */ - pkt_size += fm_bop_modify(0xA2, 0xFFFD, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[1] = b'0, h/w addr mode */ - for (i = 0; i < 12; i++) { - pkt_size += fm_bop_write(0xA8, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */ - } - for (i = 0; i < (other_rds_cnt * 3); i++) { - pkt_size += fm_bop_write(0xA8, other_rds[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */ - } - pkt_size += fm_bop_modify(0xA2, 0xFFEF, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[4] = b'0, switch to normal buf */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 0 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* TBD for IC */ -fm_s32 mt6620_off_2_tx_shortANA(fm_u8 *tx_buf, fm_s32 tx_buf_size) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_write(0x01, 0x4A00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 4A00 --> Turn on Central Bias + FC */ - pkt_size += fm_bop_udelay(30, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 30 */ - pkt_size += fm_bop_write(0x01, 0x6A00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 6A00 --> Turn off FC */ - pkt_size += fm_bop_udelay(50, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 50 */ - pkt_size += fm_bop_write(0x02, 0x299C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2 299C --> Set the LDOs Output Voltages */ - pkt_size += fm_bop_write(0x01, 0x6B82, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 6B82 --> Turn on DCO, RX and ADDA LDO */ - pkt_size += fm_bop_write(0x3B, 0x0500, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3B 0500 --> Turn on PA LDO --> LDO PA = 2.5V [0000 010x xxx0 000] {xxxx} - 0001 = 2.5V */ - pkt_size += fm_bop_write(0x04, 0x0548, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 4 0548 --> Set the RX LDO to Low Power Mode + TR Switch Off */ - pkt_size += fm_bop_write(0x37, 0x2000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 37 2000 --> Set the Short Antenna Bias */ - pkt_size += fm_bop_write(0x42, 0xC002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 42 C002 --> Set the Short Antenna Bias */ - pkt_size += fm_bop_write(0x0A, 0x0060, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr A 0060 --> Update AFCDAC LPF Setting */ - pkt_size += fm_bop_write(0x0E, 0x0040, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr E 0040 --> Update SX_VDC_CBANK */ - pkt_size += fm_bop_write(0x0C, 0xA88C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c A88C */ - pkt_size += fm_bop_write(0x10, 0x1E8D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 10 1e8d */ - pkt_size += fm_bop_write(0x27, 0x0005, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 27 0005 --> Update ACAL and Enable RMS_DET */ - pkt_size += fm_bop_write(0x11, 0x07D8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 11 07D8 --> Set VCO_DIVRST_N = 0 */ - pkt_size += fm_bop_write(0x41, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 41 0003 --> Set TX_FVCO_EN = 1 and FVCO_SEL=1 */ - pkt_size += fm_bop_write(0x08, 0x25B8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 8 25b8 --> ADC = TX Mode (AU_ADC) */ - pkt_size += fm_bop_write(0x09, 0x2964, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9 2964 --> ADC DWA ON */ - pkt_size += fm_bop_write(0x3F, 0xAD86, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3F AD86 --> TX DAc RX_TX_SEL = TX MOde */ - pkt_size += fm_bop_write(0x3A, 0x01EF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3A 01EF --> Turn on TX Chain [PA+D2S+HRM+AUPGA+TXDAC+LODIV] */ - pkt_size += fm_bop_write(0x3E, 0x3181, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3E 3181 --> TX LPF EN + CSEL from RCCAL */ - pkt_size += fm_bop_write(0x00, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 0100 --> Turn on SDADC */ - pkt_size += fm_bop_write(0x37, 0x2000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 37 2000 --> Control Signal for DAC_CK output clock gate */ - /* FM ADPLL Power Up */ - pkt_size += fm_bop_write(0x25, 0x040F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 25 040f --> Turn off DIG_CK_EN */ - pkt_size += fm_bop_write(0x20, 0x2720, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 20 2720 --> Turn on ADPLL 2320 CW32 */ - /* XHC,2011/03/18, [wr 22 9980-> 6680] */ - pkt_size += fm_bop_write(0x22, 0x6680, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 22 9980 --> Update DLF Gain */ - pkt_size += fm_bop_write(0x25, 0x080F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 25 080f --> Update I_CODE_CCAL + ADC_CK_EN + 32KCLKPLL_EN 0803 CW37 */ - pkt_size += fm_bop_write(0x1E, 0x0863, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1e 0863 --> Turn on DCO + CAL_COARSE_EN */ - pkt_size += fm_bop_udelay(5000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 5000 */ - pkt_size += fm_bop_write(0x1E, 0x0865, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1e 0865 --> Change the CAL_COARSE to CAL_FINE */ - pkt_size += fm_bop_udelay(5000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 5000 */ - pkt_size += fm_bop_write(0x1E, 0x0871, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1e 0871 --> Off the CAL_COARSE and CAL_FINE + Turn on PLL */ - pkt_size += fm_bop_udelay(100000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 100000 */ - pkt_size += fm_bop_write(0x2A, 0x1026, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2a 1022 --> Enable TOP_CG */ - /* FM RC Calibration */ - pkt_size += fm_bop_write(0x00, 0x0080, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 0080 --> RCCAL */ - pkt_size += fm_bop_udelay(1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */ - pkt_size += fm_bop_write(0x1B, 0x0094, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1b 0094 --> Update RCCAL Target Count */ - pkt_size += fm_bop_write(0x1B, 0x0095, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1b 0095 --> Start RCCAL */ - pkt_size += fm_bop_udelay(200, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */ - pkt_size += fm_bop_write(0x1B, 0x0094, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1b 0094 --> Off RCCAL */ - pkt_size += fm_bop_write(0x00, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 0100 --> Turn off RCCAL Analog Block */ - /* FM VCO Enable */ - pkt_size += fm_bop_write(0x01, 0x6B8A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 6B8A --> Turn on VCO LDO */ - pkt_size += fm_bop_udelay(1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */ - pkt_size += fm_bop_write(0x00, 0xC100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 C100 --> Turn on VCO, AFCDAC */ - pkt_size += fm_bop_write(0x0C, 0xB88C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c B88c --> Turn on Const gm */ - pkt_size += fm_bop_udelay(3000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 3000 */ - pkt_size += fm_bop_write(0x3A, 0x01FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3A 01FF --> Enable TX Divider */ - /* Short Antenna Setting */ - pkt_size += fm_bop_write(0x42, 0xF002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 42 F002 --> MSB of HRM_Gain <5> ****>> For Max Pout */ - pkt_size += fm_bop_write(0x3C, 0xABE9, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3C ABE9 --> Max HRM Gain<4:0> - xxxxx [1010 10xx xxx0 1001] */ - pkt_size += fm_bop_write(0x3D, 0x027E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3D 027E --> Max PA Gain<4:0> - [0000 0010 0xxx xx10] */ - pkt_size += fm_bop_write(0x33, 0x0008, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 33 0008 --> Use old VCO calibration routine to save calibration time */ - pkt_size += fm_bop_write(0x28, 0xFFFF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 28 FFFF */ - pkt_size += fm_bop_write(0x2E, 0x0020, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2E 0020 --> Turn on SCAL_HWTRIG_DIS --> VCO CAL and SCAL are done separately */ - pkt_size += fm_bop_write(0x2F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2F 0000 --> Disable Capbank manual enter mode [4A40 previously] */ - pkt_size += fm_bop_write(0x44, 0x006E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 44 6e */ - pkt_size += fm_bop_write(0x46, 0xDC22, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 46 DC22 */ - pkt_size += fm_bop_write(0x49, 0x0080, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 49 80 */ - pkt_size += fm_bop_write(0x4A, 0x0004, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 4A 4 */ - pkt_size += fm_bop_write(0x4B, 0x0040, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 4B 40 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* TBD for IC */ -fm_s32 mt6620_dig_init(fm_u8 *tx_buf, fm_s32 tx_buf_size) -{ - fm_s32 pkt_size = 0; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - -/* fm_rgf_maincon */ - pkt_size += fm_bop_write(0x64, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 64 0 */ - pkt_size += fm_bop_write(0x65, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 1 */ - pkt_size += fm_bop_write(0x68, 0xE100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E100 */ - pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000 */ - pkt_size += fm_bop_write(0x68, 0xE000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E000 */ -/* fm_rgf_dac */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 0 */ - pkt_size += fm_bop_write(0x9E, 0x001C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9E 1C */ - pkt_size += fm_bop_write(0x9C, 0xA540, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9c A540 */ -/* fm_rgf_front */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 --> start rgf_front */ - pkt_size += fm_bop_write(0xB8, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b8 1 */ - pkt_size += fm_bop_write(0xAB, 0x39B6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ab 39b6 */ - pkt_size += fm_bop_write(0xAC, 0x3C3E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ac 3c3e */ - pkt_size += fm_bop_write(0xAD, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ad 0 */ - pkt_size += fm_bop_write(0xAE, 0x03C2, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ae 3c2 */ - pkt_size += fm_bop_write(0xAF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr af 1 */ - pkt_size += fm_bop_write(0xB1, 0x623D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b1 623d */ - pkt_size += fm_bop_write(0xF4, 0x0020, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr f4 20 */ - pkt_size += fm_bop_write(0xF5, 0xBF16, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr f5 bf16 */ - pkt_size += fm_bop_write(0xB9, 0x0050, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b9 0050 */ - pkt_size += fm_bop_write(0xBA, 0x00C3, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ba 00c3 */ - pkt_size += fm_bop_write(0xBB, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bb 0 */ - pkt_size += fm_bop_write(0xBC, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bc 0 */ - pkt_size += fm_bop_write(0xBD, 0x0056, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bd 56 */ - pkt_size += fm_bop_write(0xBE, 0x0089, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr be 89 */ - pkt_size += fm_bop_write(0xBF, 0x004C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bf 4c */ - pkt_size += fm_bop_write(0xC0, 0x0171, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c0 171 */ - pkt_size += fm_bop_write(0xC1, 0x002B, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c1 2b */ - pkt_size += fm_bop_write(0xC2, 0x001F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c2 1f */ - pkt_size += fm_bop_write(0xC3, 0x0066, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c3 66 */ - pkt_size += fm_bop_write(0xC4, 0x00F6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c4 f6 */ - pkt_size += fm_bop_write(0xC5, 0x0066, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c5 66 */ - pkt_size += fm_bop_write(0xC6, 0x001F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c6 1f */ - pkt_size += fm_bop_write(0xC7, 0x0007, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c7 7 */ - pkt_size += fm_bop_write(0xFE, 0x0039, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fe 39 */ - pkt_size += fm_bop_write(0xFF, 0x3907, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ff 3907 */ -/* fm_rgf_fmx */ - pkt_size += fm_bop_write(0x9F, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 1 --> start rgf_outer */ - pkt_size += fm_bop_write(0xC0, 0x076C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c0 76c */ - pkt_size += fm_bop_write(0xB7, 0x0004, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b7 4 */ - pkt_size += fm_bop_write(0xD8, 0x006A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d8 6a */ - pkt_size += fm_bop_write(0xC8, 0x2828, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c8 2828 */ - pkt_size += fm_bop_write(0xCE, 0x0090, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ce 90 */ - pkt_size += fm_bop_write(0xFE, 0x000F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fe f */ - pkt_size += fm_bop_write(0xA2, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a2 100 */ - pkt_size += fm_bop_write(0xA3, 0x0111, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a3 111 */ - pkt_size += fm_bop_write(0xA4, 0x0122, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a4 122 */ - pkt_size += fm_bop_write(0xA5, 0x0135, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a5 135 */ - pkt_size += fm_bop_write(0xA6, 0x0149, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a6 149 */ - pkt_size += fm_bop_write(0xA7, 0x015E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a7 15e */ - pkt_size += fm_bop_write(0xDB, 0x0174, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr db 174 */ - pkt_size += fm_bop_write(0xDC, 0x018D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr dc 18d */ - pkt_size += fm_bop_write(0xC9, 0x01A6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c9 1a6 */ - pkt_size += fm_bop_write(0xCA, 0x01C1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ca 1c1 */ - pkt_size += fm_bop_write(0xCB, 0x01DE, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cb 1de */ - pkt_size += fm_bop_write(0xCC, 0x01FD, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cc 1fd */ - pkt_size += fm_bop_write(0xD4, 0x2657, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d4 2657 */ - pkt_size += fm_bop_write(0xA0, 0x85B2, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a0 85b2 */ - pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c deleted file mode 100644 index fce9fd2b1..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c +++ /dev/null @@ -1,345 +0,0 @@ -/* fm_config.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/string.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_config.h" -/* #include "fm_cust_cfg.h" */ -#include "mt6620_fm_cust_cfg.h" - -fm_cust_cfg mt6620_fm_config; -/* static fm_s32 fm_index = 0; */ - -static fm_s32 MT6620fm_cust_config_print(fm_cust_cfg *cfg) -{ - /* fm_s32 i; */ - - WCN_DBG(FM_NTC | MAIN, "MT6620 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 mr_th:\t%d\n", cfg->rx_cfg.mr_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 prx_th:\t%d\n", cfg->rx_cfg.prx_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 smg_th:\t%d\n", cfg->rx_cfg.smg_th); - WCN_DBG(FM_NTC | MAIN, "MT6620 de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis); - WCN_DBG(FM_NTC | MAIN, "MT6620 osc_freq:\t%d\n", cfg->rx_cfg.osc_freq); - - WCN_DBG(FM_NTC | MAIN, "MT6620 scan_hole_low:\t%d\n", cfg->tx_cfg.scan_hole_low); - WCN_DBG(FM_NTC | MAIN, "MT6620 scan_hole_high:\t%d\n", cfg->tx_cfg.scan_hole_high); - WCN_DBG(FM_NTC | MAIN, "MT6620 power_level:\t%d\n", cfg->tx_cfg.power_level); - - WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path, - cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode, - cfg->aud_cfg.i2s_info.rate); - return 0; -} - -static fm_s32 MT6620cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg; - struct fm_tx_cust_cfg *tx_cfg = &cfg->tx_cfg; - - if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6620", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */ - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6620", - &rx_cfg->short_ana_rssi_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6620", - &rx_cfg->desene_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6620", &rx_cfg->pamd_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6620", &rx_cfg->mr_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6620", &rx_cfg->atdc_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6620", &rx_cfg->prx_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6620", &rx_cfg->smg_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6620", &rx_cfg->deemphasis))) { - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6620", &rx_cfg->osc_freq))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FMT_SCAN_HOLE_L_MT6620", &tx_cfg->scan_hole_low))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FMT_SCAN_HOLE_H_MT6620", &tx_cfg->scan_hole_high))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FMT_PWR_LVL_MAX_MT6620", &tx_cfg->power_level))) { - return ret; - } else { - WCN_DBG(FM_WAR | MAIN, "invalid key\n"); - return -1; - } -/* if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_L_MT6620", &rx_cfg->long_ana_rssi_th))) {//FMR_RSSI_TH_L = 0x0301 - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_S_MT6620", &rx_cfg->short_ana_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_CQI_TH_MT6620", &rx_cfg->cqi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_MR_TH_MT6620", &rx_cfg->mr_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SMG_TH_MT6620", &rx_cfg->smg_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_CH_SIZE_MT6620", &rx_cfg->scan_ch_size))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_SORT_MT6620", &rx_cfg->scan_sort))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SEEK_SPACE_MT6620", &rx_cfg->seek_space))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_MT6620", &rx_cfg->band))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_L_MT6620", &rx_cfg->band_freq_l))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_H_MT6620", &rx_cfg->band_freq_h))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH_MT6620", &rx_cfg->fake_ch[fm_index]))) { - fm_index += 1; - rx_cfg->fake_ch_num = (rx_cfg->fake_ch_num < fm_index) ? fm_index : rx_cfg->fake_ch_num; - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH_RSSI_MT6620", &rx_cfg->fake_ch_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_DEEMPHASIS_MT6620", &rx_cfg->deemphasis))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FMR_OSC_FREQ_MT6620", &rx_cfg->osc_freq))) { - return ret; - } */ -} - -static fm_s32 MT6620fm_cust_config_default(fm_cust_cfg *cfg) -{ - FMR_ASSERT(cfg); - - cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6620; - cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6620; - cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6620; - cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6620; - cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6620; - cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6620; - cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6620; - cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6620; - cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6620; - cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6620; - - cfg->tx_cfg.scan_hole_low = FM_TX_SCAN_HOLE_LOW_MT6620; - cfg->tx_cfg.scan_hole_high = FM_TX_SCAN_HOLE_HIGH_MT6620; - cfg->tx_cfg.power_level = FM_TX_PWR_LEVEL_MAX_MT6620; - -#if (defined CONFIG_MTK_MERGE_INTERFACE_SUPPORT) || (defined FM_DIGITAL_INPUT) - cfg->aud_cfg.aud_path = FM_AUD_I2S; - cfg->aud_cfg.i2s_info.status = FM_I2S_OFF; - cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - cfg->aud_cfg.i2s_info.rate = FM_I2S_44K; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO; -#elif defined FM_ANALOG_INPUT - cfg->aud_cfg.aud_path = FM_AUD_ANALOG; - cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR; - cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR; -#else - cfg->aud_cfg.aud_path = FM_AUD_ERR; - cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR; - cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR; -#endif - return 0; -} - -static fm_s32 MT6620fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - fm_s8 *buf = NULL; - fm_s32 file_len = 0; - - if (!(buf = fm_zalloc(4096))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n"); - return -ENOMEM; - } -/* fm_index = 0; */ - - file_len = fm_file_read(filename, buf, 4096, 0); - - if (file_len <= 0) { - ret = -1; - goto out; - } - - ret = cfg_parser(buf, MT6620cfg_item_handler, cfg); - - out: - - if (buf) { - fm_free(buf); - } - - return ret; -} - -#define MT6620_FM_CUST_CFG_PATH "etc/fmr/mt6620_fm_cust.cfg" -fm_s32 MT6620fm_cust_config_setup(const fm_s8 *filepath) -{ - fm_s32 ret = 0; - fm_s8 *filep = NULL; - fm_s8 file_path[51] = { 0 }; - - MT6620fm_cust_config_default(&mt6620_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6620 FM default config\n"); - MT6620fm_cust_config_print(&mt6620_fm_config); - - if (!filepath) { - filep = MT6620_FM_CUST_CFG_PATH; - } else { - memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath)); - filep = file_path; - trim_path(&filep); - } - - ret = MT6620fm_cust_config_file(filep, &mt6620_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6620 FM cust config\n"); - MT6620fm_cust_config_print(&mt6620_fm_config); - - return ret; -} - -fm_u16 MT6620fm_cust_config_fetch(enum fm_cust_cfg_op op_code) -{ -#if 0 - fm_u16 tmp = 0; - fm_s32 i; - static fm_s32 fake_ch_idx; - - switch (op_code) { - /* For FM RX */ - case FM_CFG_RX_RSSI_TH_LONG:{ - tmp = mt6620_fm_config.rx_cfg.long_ana_rssi_th; - break; - } - case FM_CFG_RX_RSSI_TH_SHORT:{ - tmp = mt6620_fm_config.rx_cfg.short_ana_rssi_th; - break; - } - case FM_CFG_RX_CQI_TH:{ - tmp = mt6620_fm_config.rx_cfg.cqi_th; - break; - } - case FM_CFG_RX_MR_TH:{ - tmp = mt6620_fm_config.rx_cfg.mr_th; - break; - } - case FM_CFG_RX_SMG_TH:{ - tmp = mt6620_fm_config.rx_cfg.smg_th; - break; - } - case FM_CFG_RX_SCAN_CH_SIZE:{ - tmp = mt6620_fm_config.rx_cfg.scan_ch_size; - break; - } - case FM_CFG_RX_SEEK_SPACE:{ - tmp = mt6620_fm_config.rx_cfg.seek_space; - break; - } - case FM_CFG_RX_BAND:{ - tmp = mt6620_fm_config.rx_cfg.band; - break; - } - case FM_CFG_RX_BAND_FREQ_L:{ - tmp = mt6620_fm_config.rx_cfg.band_freq_l; - break; - } - case FM_CFG_RX_BAND_FREQ_H:{ - tmp = mt6620_fm_config.rx_cfg.band_freq_h; - break; - } - case FM_CFG_RX_SCAN_SORT:{ - tmp = mt6620_fm_config.rx_cfg.scan_sort; - break; - } - case FM_CFG_RX_FAKE_CH_NUM:{ - tmp = mt6620_fm_config.rx_cfg.fake_ch_num; - break; - } - case FM_CFG_RX_FAKE_CH:{ - tmp = mt6620_fm_config.rx_cfg.fake_ch[fake_ch_idx]; - i = (mt6620_fm_config.rx_cfg.fake_ch_num > - 0) ? mt6620_fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX; - fake_ch_idx++; - fake_ch_idx = fake_ch_idx % i; - break; - } - case FM_CFG_RX_FAKE_CH_RSSI:{ - tmp = mt6620_fm_config.rx_cfg.fake_ch_rssi_th; - break; - } - case FM_CFG_RX_DEEMPHASIS:{ - tmp = mt6620_fm_config.rx_cfg.deemphasis; - break; - } - case FM_CFG_RX_OSC_FREQ:{ - tmp = mt6620_fm_config.rx_cfg.osc_freq; - break; - } - /* For FM TX */ - case FM_CFG_TX_SCAN_HOLE_LOW:{ - tmp = mt6620_fm_config.tx_cfg.scan_hole_low; - break; - } - case FM_CFG_TX_SCAN_HOLE_HIGH:{ - tmp = mt6620_fm_config.tx_cfg.scan_hole_high; - break; - } - case FM_CFG_TX_PWR_LEVEL:{ - tmp = mt6620_fm_config.tx_cfg.power_level; - break; - } - default: - break; - } - - WCN_DBG(FM_DBG | MAIN, "mt6620_cust cfg %d: 0x%04x\n", op_code, tmp); - return tmp; -#endif - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c deleted file mode 100644 index 6289a4c8c..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c +++ /dev/null @@ -1,2256 +0,0 @@ -#include <linux/semaphore.h> -#include <linux/delay.h> -#include <linux/slab.h> - -#include "stp_exp.h" -#include "wmt_exp.h" - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_utils.h" -#include "fm_patch.h" -#include "fm_link.h" -#include "fm_config.h" -#include "fm_private.h" - -#include "mt6620_fm_reg.h" -#include "mt6620_fm.h" -/* #include "mt6620_drv_dsp.h" */ -/* #include "mt6620_fm_link.h" */ -#include "mt6620_fm_lib.h" -#include "mt6620_fm_cmd.h" -#include "mt6620_fm_cust_cfg.h" -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -static struct fm_fifo *cqi_fifo; -#endif -extern fm_cust_cfg mt6620_fm_config; -static struct fm_hw_info mt6620_hw_info = { - .chip_id = 0x00006620, - .eco_ver = 0x00000000, - .rom_ver = 0x00000002, - .patch_ver = 0x00000111, - .reserve = 0x00000000, -}; - -fm_s32 MT6620_HL_Side_Adj(fm_u16 freq, fm_s32 *hl); -fm_s32 MT6620_ADPLL_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid); -fm_s32 MT6620_MCU_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid); -fm_s32 MT6620_ADPLL_Power_OnOff(fm_s32 onoff, fm_s32 ADPLL_clk); -fm_s32 MT6620_TX_PWR_CTRL(fm_u16 freq, fm_s32 *ctr); -fm_s32 MT6620_RTC_Drift_CTRL(fm_u16 freq, fm_s32 *ctr); -fm_s32 MT6620_TX_DESENSE(fm_u16 freq, fm_s32 *ctr); - -static fm_s32 mt6620_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample); -static fm_s32 mt6620_desense_check(fm_u16 freq, fm_s32 rssi); -static fm_s32 MT6620_Rds_Tx(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt); -static fm_s32 MT6620_Rds_Tx_Enable(void); -static fm_s32 MT6620_Rds_Tx_Disable(void); - -static fm_u8 *cmd_buf; -static struct fm_lock *cmd_buf_lock; -static struct fm_callback *fm_cb_op; -/* static struct MT6620fm_priv priv_adv_6620; */ -static ENUM_WMTHWVER_TYPE_T hw_ver = WMTHWVER_E3; -static fm_s32 mt6620_pwron(fm_s32 data) -{ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) { - WCN_DBG(FM_ALT | CHIP, "WMT turn on FM Fail!\n"); - return -FM_ELINK; - } else { - /* GeorgeKuo: turn on function before check stp ready */ - if (fm_false == mtk_wcn_stp_is_ready()) { - WCN_DBG(FM_ALT | MAIN, "6620 stp is not ready, please retry later\n"); - return -FM_ELINK; - } - hw_ver = mtk_wcn_wmt_hwver_get(); - WCN_DBG(FM_ALT | CHIP, "WMT turn on FM OK!\n"); - return 0; - } -} - - -static fm_s32 mt6620_pwroff(fm_s32 data) -{ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) { - WCN_DBG(FM_ALT | CHIP, "WMT turn off FM Fail!\n"); - return -FM_ELINK; - } else { - WCN_DBG(FM_NTC | CHIP, "WMT turn off FM OK!\n"); - return 0; - } -} - -static fm_s32 Delayms(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data); - msleep(data); - return 0; -} - -static fm_s32 Delayus(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data); - udelay(data); - return 0; -} - -static struct fm_res_ctx *res; - -fm_s32 mt6620_get_read_result(struct fm_res_ctx *result) -{ - FMR_ASSERT(result); - res = result; - - return 0; -} - -static fm_s32 mt6620_read(fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6620_get_read_result); - - if (!ret && res) { - *val = res->fspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6620_write(fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6620_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 ret = 0; - fm_u16 val; - - ret = mt6620_read(addr, &val); - - if (ret) - return ret; - - val = ((val & (mask)) | bits); - ret = mt6620_write(addr, val); - - return ret; -} - -static fm_u16 mt6620_get_chipid(void) -{ - return 0x6620; -} - -/* mt6620_SetAntennaType - set Antenna type - * @type - 1,Short Antenna; 0, Long Antenna - */ -static fm_s32 mt6620_SetAntennaType(fm_s32 type) -{ - WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long"); - - if (type == FM_ANA_LONG) { - /* Long Antenna RSSI threshold, 0xE0 D0~D9 */ - /* mt6620_write(0xE0, ((0xA301 & 0xFC00) | (FMR_RSSI_TH_LONG_MT6620 & 0x03FF))); */ - /* Turn on Short Antenna LNA and Off TR Switch */ - mt6620_write(0x04, 0x0142); - /* Turn off the Short Antenna Capbank biasing */ - mt6620_write(0x05, 0x00E7); - /* Turn off the Short Antenna Capbank biasing */ - mt6620_write(0x26, 0x0004); - /* Disable concurrent calibration for VCO and SCAL */ - mt6620_write(0x2E, 0x0008); - } else if (type == FM_ANA_SHORT) { - /* Short Antenna RSSI threshold, 0xE0 D0~D9 */ - /* mt6620_write(0xE0, ((0xA2E0 & 0xFC00) | (FMR_RSSI_TH_SHORT_MT6620 & 0x03FF))); */ - /* Turn on Short Antenna LNA and TR Switch */ - mt6620_write(0x04, 0x0145); - /* Turn on the Short Antenna Capbank biasing */ - mt6620_write(0x05, 0x00FF); - /* Turn on the Short Antenna Capbank biasing */ - mt6620_write(0x26, 0x0024); - /* Enable concurrent calibration for VCO and SCAL */ - mt6620_write(0x2E, 0x0000); - } else { - WCN_DBG(FM_ERR | CHIP, "%s()\n", __func__); - return -FM_EPARA; - } - - return 0; -} - -static fm_s32 mt6620_GetAntennaType(void) -{ - fm_u16 dataRead; - - mt6620_read(0x2E, &dataRead); - - if (dataRead == 0x0000) - return FM_ANA_SHORT; /* short antenna */ - else - return FM_ANA_LONG; /* long antenna */ -} - -static fm_s32 mt6620_Mute(fm_bool mute) -{ - WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute"); - - if (mute) { - return mt6620_set_bits(0x9C, 0x0008, 0xFFF7); /* 1:9C D3 = 1 */ - } else { - return mt6620_set_bits(0x9c, 0x0000, 0xFFF7); /* 1:9C D3 = 0 */ - } -} - -static fm_s32 mt6620_RampDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - WCN_DBG(FM_NTC | CHIP, "ramp down\n"); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_rampdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down failed\n"); - } - - return ret; -} - -#if 0 /* ramp down tx will do in tx tune flow */ -static fm_s32 MT6620_RampDown_Tx(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size = 0; - - WCN_DBG(FM_NTC | CHIP, "ramp down TX\n"); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - - pkt_size = mt6620_rampdown_tx(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL); - - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down TX failed\n"); - } - return ret; -} -#endif -static fm_s32 mt6620_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - FMR_ASSERT(chip_id); - FMR_ASSERT(device_id); - - WCN_DBG(FM_DBG | CHIP, "pwr on seq......\n"); - - /* Wholechip FM Power Up: step 1, mt6620_off_2_longANA */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_off_2_longANA_1(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_off_2_longANA_1 failed\n"); - return ret; - } - - Delayms(100); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_off_2_longANA_2(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_off_2_longANA_2 failed\n"); - return ret; - } - - Delayms(50); - - /* *chip_id = 0x6620; */ - /* *device_id = 0x6620; */ - /* WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", 0x6620); */ - - /* Wholechip FM Power Up: step 2, FM Digital Init: fm_rgf_maincon */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_pwrup_digital_init_1(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_pwrup_digital_init_2 failed\n"); - return ret; - } - - Delayms(10); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_pwrup_digital_init_2(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_pwrup_digital_init_2 failed\n"); - return ret; - } - - Delayms(10); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_pwrup_digital_init_3(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_pwrup_digital_init_3 failed\n"); - return ret; - } - if ((mt6620_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF) - || (mt6620_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) { - mt6620_I2s_Setting(FM_I2S_ON, mt6620_fm_config.aud_cfg.i2s_info.mode, - mt6620_fm_config.aud_cfg.i2s_info.rate); - /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */ - mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) CMB_STUB_AIF_2); - WCN_DBG(FM_NTC | CHIP, "pwron set I2S on ok\n"); - } - - mt6620_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get(); - WCN_DBG(FM_DBG | CHIP, "pwr on seq ok\n"); - return ret; -} - -static fm_s32 mt6620_PowerUpTx(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "pwr on Tx seq......\n"); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_off_2_tx_shortANA(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_off_2_tx_shortANA failed\n"); - return ret; - } - - - mt6620_read(0x62, &dataRead); - WCN_DBG(FM_NTC | CHIP, "Tx on chipid=%x\n", dataRead); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_dig_init(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_dig_init failed\n"); - return ret; - } - /* get temprature */ - if (mtk_wcn_wmt_therm_ctrl(WMTTHERM_ENABLE) != fm_true) { - WCN_DBG(FM_ERR | MAIN, "wmt_therm_ctrl, WMTTHERM_ENABLE failed\n"); - ret = -FM_ELINK; - return ret; - } -#ifdef FM_DIGITAL_INPUT - ret = mt6620_I2s_Setting(FM_I2S_ON, FM_I2S_SLAVE, FM_I2S_48K); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "pwron tx set I2S on error\n"); - return ret; - } - /* we will disable 6620 fm chip analog output when use I2S path, set 0x3A bit2 = 0 */ - /* mt6620_set_bits(0x3A, 0, MASK(2)); */ - WCN_DBG(FM_NTC | CHIP, "pwron set I2S on ok\n"); -#endif - - WCN_DBG(FM_DBG | CHIP, "pwr on tx seq ok\n"); - return ret; -} - -static fm_s32 mt6620_PowerDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - WCN_DBG(FM_DBG | CHIP, "pwr down seq\n"); - - /* mt6620_RampDown(); */ - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_pwrdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_pwrdown failed\n"); - return ret; - } - - return ret; -} - -static fm_s32 mt6620_PowerDownTx(void) -{ - fm_s32 ret = 0; - - mt6620_PowerDown(); - - if (mtk_wcn_wmt_therm_ctrl(WMTTHERM_DISABLE) != fm_true) { - WCN_DBG(FM_ERR | MAIN, "wmt_therm_ctrl, WMTTHERM_DISABLE failed\n"); - ret = -FM_ELINK; - } - - return ret; -} - -static fm_bool MT6620_SetFreq_Tx(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - fm_cb_op->cur_freq_set(freq); - /* start tune */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_tune_tx(cmd_buf, TX_BUF_SIZE, freq); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_tune_tx failed\n"); - return ret; - } - - Delayms(125); - - WCN_DBG(FM_DBG | CHIP, "mt6620_tune_tx to %d ok\n", freq); - - return fm_true; -} - -/* - * fm_print_curCQI -- print cur freq's CQI - * @cur_freq, current frequency - * If OK, return 0, else error code - */ -static fm_s32 mt6620_print_curCQI(fm_u16 cur_freq) -{ - fm_s32 ret = 0; - fm_u16 rssi = 0; - fm_u16 pamd = 0; - fm_u16 mr = 0; - - if ((ret = mt6620_write(FM_MAIN_PGSEL, FM_PG0))) - return ret; - if ((ret = mt6620_read(FM_RSSI_IND, &rssi))) - return ret; - if ((ret = mt6620_read(FM_ADDR_PAMD, &pamd))) - return ret; - if ((ret = mt6620_read(FM_MR_IND, &mr))) - return ret; - - WCN_DBG(FM_NTC | CHIP, "FREQ=%d, RSSI=0x%04x, PAMD=0x%04x, MR=0x%04x\n", (fm_s32) cur_freq, - rssi, pamd, mr); - return ret; -} - -static fm_bool mt6620_SetFreq(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_s32 hl_side = -1; - fm_s32 freq_avoid = -1; - fm_u16 pkt_size; - - fm_cb_op->cur_freq_set(freq); - - if ((ret = MT6620_HL_Side_Adj(freq, &hl_side))) - return ret; - WCN_DBG(FM_NTC | CHIP, "%s, [hl_side=%d]\n", __func__, hl_side); - - if ((ret = MT6620_ADPLL_Freq_Avoid(freq, &freq_avoid))) - return ret; - WCN_DBG(FM_NTC | CHIP, "%s, adpll [freq_avoid=%d]\n", __func__, freq_avoid); - -/* hw_ver = mtk_wcn_wmt_hwver_get(); */ - if (hw_ver >= WMTHWVER_E3) { - if ((ret = MT6620_MCU_Freq_Avoid(freq, &freq_avoid))) - return ret; - WCN_DBG(FM_NTC | CHIP, "%s, mcu [freq_avoid=%d]\n", __func__, freq_avoid); - } else { - WCN_DBG(FM_NTC | CHIP, "%s, no need do mcu freq avoid[hw_ver=%d]\n", __func__, - hw_ver); - } - - /* start tune */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_tune_1(cmd_buf, TX_BUF_SIZE, freq); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_tune_1 failed\n"); - return ret; - } - - Delayms(200); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_tune_2(cmd_buf, TX_BUF_SIZE, freq); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_tune_2 failed\n"); - return ret; - } - - Delayms(35); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_tune_3(cmd_buf, TX_BUF_SIZE, freq); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_tune_3 failed\n"); - return ret; - } - - ret = mt6620_print_curCQI(freq); - WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq); - - return fm_true; -} - - -static fm_s32 mt6620_TxScan_SetFreq(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size = 0; - - WCN_DBG(FM_NTC | CHIP, "+%s():[freq=%d]\n", __func__, freq); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - - pkt_size = mt6620_tune_txscan(cmd_buf, TX_BUF_SIZE, freq); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - FM_UNLOCK(cmd_buf_lock); - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; -} - -static fm_s32 mt6620_TxScan_GetCQI(fm_s16 *pRSSI, fm_s16 *pPAMD, fm_s16 *pMR) -{ - fm_s32 cnt = 0; - fm_s32 ret = 0; - fm_s16 tmp_reg = 0; - fm_s16 aRSSI = 0; - fm_s16 aPAMD = 0; - fm_s16 aMR = 0; - - WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__); - - if ((pRSSI == NULL) || (pPAMD == NULL) || (pMR == NULL)) { - WCN_DBG(FM_ERR | CHIP, "%s():para error, [pRSSI=%p],[aPAMD=%p],[pMR=%p]\n", - __func__, pRSSI, pPAMD, pMR); - ret = -FM_EPARA; - goto out; - } - - for (cnt = 0; cnt < 8; cnt++) { - Delayms(3); - if ((ret = mt6620_read(FM_RSSI_IND, &tmp_reg))) - goto out; - tmp_reg = tmp_reg & 0x03ff; - tmp_reg = (tmp_reg > 511) ? ((fm_s16) (tmp_reg - 1024)) : tmp_reg; - aRSSI += tmp_reg; - - if ((ret = mt6620_read(FM_ADDR_PAMD, &tmp_reg))) - goto out; - tmp_reg = tmp_reg & 0x00ff; - tmp_reg = (tmp_reg > 127) ? ((fm_s16) (tmp_reg - 256)) : tmp_reg; - aPAMD += tmp_reg; - - if ((ret = mt6620_read(FM_MR_IND, &tmp_reg))) - goto out; - tmp_reg = tmp_reg & 0x01ff; - tmp_reg = (tmp_reg > 255) ? ((fm_s16) (tmp_reg - 512)) : tmp_reg; - aMR += tmp_reg; - } - - *pRSSI = aRSSI >> 3; - *pPAMD = aPAMD >> 3; - *pMR = aMR >> 3; - - WCN_DBG(FM_NTC | CHIP, "%s():[RSSI=%d],[PAMD=%d],[MR=%d]\n", - __func__, *pRSSI, *pPAMD, *pMR); - - out: - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; -} - -static fm_s32 mt6620_TxScan_IsEmptyChannel(fm_s16 RSSI, fm_s16 PAMD, fm_s16 MR, fm_s32 *empty) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_NTC | CHIP, "+%s():[RSSI=%d],[PAMD=%d],[MR=%d]\n", __func__, RSSI, PAMD, MR); - - if (empty == NULL) { - WCN_DBG(FM_NTC | CHIP, "invalid pointer [empty=0x%x]!\n", (fm_u32) empty); - ret = -FM_EPARA; - goto out; - } - - *empty = fm_true; - if (RSSI > FM_TXSCAN_RSSI_TH) { - *empty = fm_false; - goto out; - } - - if (PAMD < FM_TXSCAN_PAMD_TH) { - *empty = fm_false; - goto out; - } - - if (MR < FM_TXSCAN_MR_TH) { - *empty = fm_false; - goto out; - } - - out: - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; -} - -static fm_s32 mt6620_TxScan(fm_u16 min_freq, - fm_u16 max_freq, - fm_u16 *pFreq, - fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 freq = *pFreq; - fm_u16 scan_cnt = *ScanTBLsize; - fm_u16 cnt = 0; - fm_s16 rssi = 0; - fm_s16 pamd = 0; - fm_s16 mr = 0; - fm_s32 counter = 0; - fm_s32 empty = -1; - fm_s32 step; - - WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__); - - if ((!pScanTBL) || (*ScanTBLsize < FM_TX_SCAN_MIN) || (*ScanTBLsize > FM_TX_SCAN_MAX)) { - WCN_DBG(FM_ERR | CHIP, "+%s():invalid scan table\n", __func__); - ret = -FM_EPARA; - goto out; - } - - WCN_DBG(FM_NTC | CHIP, - "[freq=%d], [max_freq=%d],[min_freq=%d],[scan BTL size=%d],[scandir=%d],[space=%d]\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - cnt = 0; - /* if (space == MT6620_FM_SPACE_100K) { - step = 1; - } else if (space == MT6620_FM_SPACE_50K) { - step = 5; - } else if (space == MT6620_FM_SPACE_200K) { - step = 2; - } else { - //default - step = 1; - } */ - step = space; - while (!(!(cnt < scan_cnt) || (freq > max_freq) || (freq < min_freq))) { - /* MT6620_RampDown(); */ - /* Set desired channel, tune to the channel, and perform fast AGC */ - counter++; /* just for debug */ - - ret = mt6620_TxScan_SetFreq(freq); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "%s():set freq failed\n", __func__); - goto out; - } - /* wait 8~10ms for RF setting */ - Delayms(10); - /* wait 4 AAGC period for AAGC setting, AAGC period = 1024/480k = 2.13ms */ - Delayms(9); - - ret = mt6620_TxScan_GetCQI(&rssi, &pamd, &mr); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "%s():get CQI failed\n", __func__); - goto out; - } - - ret = mt6620_TxScan_IsEmptyChannel(rssi, pamd, mr, &empty); - if (!ret) { - if ((empty == fm_true) - && ((freq < FM_TX_SCAN_HOLE_LOW) || (freq > FM_TX_SCAN_HOLE_HIGH))) { - *(pScanTBL + cnt) = freq; /* strore the valid empty channel */ - cnt++; - WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", freq, - cnt); - } - } else { - WCN_DBG(FM_ERR | CHIP, "%s():IsEmptyChannel failed\n", __func__); - goto out; - } - - if (scandir == FM_TX_SCAN_UP) { - if (freq == FM_TX_SCAN_HOLE_LOW) { - freq += (FM_TX_SCAN_HOLE_HIGH - FM_TX_SCAN_HOLE_LOW + step); - } else { - freq += step; - } - } else if (scandir == FM_TX_SCAN_DOWN) { - if (freq == FM_TX_SCAN_HOLE_HIGH) { - freq -= (FM_TX_SCAN_HOLE_HIGH - FM_TX_SCAN_HOLE_LOW + step); - } else { - freq -= step; - } - } else { - WCN_DBG(FM_ERR | CHIP, "%s():scandir para error\n", __func__); - ret = -FM_EPARA; - goto out; - } - } - - *ScanTBLsize = cnt; - *pFreq = *(pScanTBL + cnt); - WCN_DBG(FM_NTC | CHIP, "completed, [cnt=%d],[freq=%d],[counter=%d]\n", cnt, freq, counter); - - out: - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; -} - -/* -* mt6620_Seek -* @pFreq - IN/OUT parm, IN start freq/OUT seek valid freq -* @seekdir - 0:up, 1:down -* @space - 1:50KHz, 2:100KHz, 4:200KHz -* return fm_true:seek success; fm_false:seek failed -*/ -static fm_bool mt6620_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir, - fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 pkt_size, temp; - - mt6620_RampDown(); - mt6620_read(0x9C, &temp); - mt6620_Mute(fm_true); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_seek_1(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT, - mt6620_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - *pFreq = res->seek_result; - fm_cb_op->cur_freq_set(*pFreq); - } else { - WCN_DBG(FM_ALT | CHIP, "mt6620_seek_1 failed\n"); - return ret; - } - - Delayms(35); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_seek_2(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT, - mt6620_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_seek_2 failed\n"); - return ret; - } - /* get the result freq */ - WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq); - if ((temp & 0x0008) == 0) { - mt6620_Mute(fm_false); - } - - return fm_true; -} - -static fm_bool mt6620_Scan(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL, - fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 pkt_size, temp; - fm_u16 offset = 0; - fm_u16 tmp_scanTBLsize = *ScanTBLsize; - - if ((!pScanTBL) || (tmp_scanTBLsize == 0)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n"); - return fm_false; - } - - WCN_DBG(FM_DBG | CHIP, - "start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - mt6620_RampDown(); - mt6620_read(0x9C, &temp); - mt6620_Mute(fm_true); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_scan_1(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_SCAN_DONE, SW_RETRY_CNT, SCAN_TIMEOUT, - mt6620_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - fm_memcpy(pScanTBL, res->scan_result, sizeof(fm_u16) * FM_SCANTBL_SIZE); - WCN_DBG(FM_INF | CHIP, "Rx Scan Result:\n"); - - for (offset = 0; offset < tmp_scanTBLsize; offset++) { - WCN_DBG(FM_INF | CHIP, "%d: %04x\n", (fm_s32) offset, *(pScanTBL + offset)); - } - - *ScanTBLsize = tmp_scanTBLsize; - } else { - WCN_DBG(FM_ALT | CHIP, "mt6620_scan_1 failed\n"); - return ret; - } - - Delayms(35); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_scan_2(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT, - mt6620_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_scan_2 failed\n"); - return ret; - } - - if ((temp & 0x0008) == 0) { - mt6620_Mute(fm_false); - } - - return fm_true; -} - -/* - * mt6620_GetCurRSSI - get current freq's RSSI value - * RS=RSSI - * If RS>511, then RSSI(dBm)= (RS-1024)/16*6 - * else RSSI(dBm)= RS/16*6 - */ -static fm_s32 mt6620_GetCurRSSI(fm_s32 *pRSSI) -{ - fm_u16 tmp_reg; - - mt6620_read(FM_RSSI_IND, &tmp_reg); - tmp_reg = tmp_reg & 0x03ff; - - if (pRSSI) { - *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4); - WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI); - } else { - WCN_DBG(FM_ERR | CHIP, "get rssi para error\n"); - return -FM_EPARA; - } - - return 0; -} - -static fm_s32 MT6620_Fast_SetFreq(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size = 0; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_fast_tune(cmd_buf, TX_BUF_SIZE, freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, SEEK_TIMEOUT, - mt6620_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6620_fast_tune failed\n"); - return ret; - } - return ret; -} - -/* - * mt6620_get_RSSI - set freq and return RSSI value -* - */ -static fm_s32 mt6620_GetFreqCQI(fm_u16 freq, fm_s32 *pRSSI) -{ - if (MT6620_Fast_SetFreq(freq)) { - mt6620_GetCurRSSI(pRSSI); - } - - return 0; -} - -static fm_u8 mt6620_vol_tbl[16] = { - 0, 1, 2, 3, 4, 5, 7, 9, 11, 14, 17, 21, 25, 30, 36, 43 -}; - -static fm_s32 mt6620_SetVol(fm_u8 vol) -{ - fm_s32 ret = 0; - fm_u8 tmp_vol; /* = vol & 0x3f; */ - - vol = (vol > 15) ? 15 : vol; - tmp_vol = mt6620_vol_tbl[vol] & 0x3f; - if (tmp_vol > MT6620_VOL_MAX) - tmp_vol = MT6620_VOL_MAX; - - ret = mt6620_set_bits(0x9C, (tmp_vol << 8), 0xC0FF); - - if (ret) { - WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", tmp_vol); - return ret; - } else { - WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", tmp_vol); - } - - return 0; -} - -static fm_s32 mt6620_GetVol(fm_u8 *pVol) -{ - fm_s32 ret = 0; - fm_u16 tmp_reg; - - FMR_ASSERT(pVol); - - ret = mt6620_read(0x9C, &tmp_reg); - - if (ret) { - *pVol = 0; - WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n"); - return ret; - } else { - *pVol = (tmp_reg >> 8) & 0x3f; - if (*pVol == MT6620_VOL_MAX) - *pVol = 15; - else - *pVol = (*pVol / 3); - WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol); - } - - return 0; - -} - -static fm_s32 mt6620_dump_reg(void) -{ - fm_s32 i; - fm_u16 TmpReg; - for (i = 0; i < 0xff; i++) { - mt6620_read(i, &TmpReg); - WCN_DBG(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg); - } - return 0; -} - - -static fm_bool mt6620_GetMonoStereo(fm_u16 *pMonoStereo) -{ - fm_u16 tmp_reg; - - mt6620_write(FM_MAIN_PGSEL, 0x0001); - - if (pMonoStereo) { - mt6620_read(0xF8, &tmp_reg); - *pMonoStereo = (tmp_reg & 0x0400) >> 10; - } else { - WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n"); - return fm_false; - } - - mt6620_write(FM_MAIN_PGSEL, 0x0000); - - *pMonoStereo = (*pMonoStereo) ? 0 : 1; /* return true: stereo, false: mono */ - - WCN_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo); - return fm_true; -} - -/* - * MT6620_SetMonoStereo - * Force set to stero/mono mode - * @MonoStereo -- 0, auto; 1, force mono - * If success, return 0; else error code - */ -static fm_s32 MT6620_SetMonoStereo(fm_s32 MonoStereo) -{ - fm_u16 tmp_reg; - fm_s32 ret = 0; - - if ((ret = mt6620_write(FM_MAIN_PGSEL, FM_PG1))) - goto out; - - tmp_reg = MonoStereo ? BITn(1) : 0; /* MonoStereo, 1: force mono; 0:auto */ - if ((ret = mt6620_set_bits(FM_STEROMONO_CTR, tmp_reg, MASK(1)))) /* set E0 D1=0 */ - goto out; - - if ((ret = mt6620_write(FM_MAIN_PGSEL, FM_PG0))) - goto out; - - WCN_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "auto" : "force mono"); - - out: - return ret; -} - -static fm_s32 mt6620_GetCapArray(fm_s32 *ca) -{ - fm_u16 dataRead; - - FMR_ASSERT(ca); - - mt6620_read(0x26, &dataRead); - *ca = dataRead; - - return 0; -} - -/* - * mt6620_GetCurPamd - get current freq's PAMD value - * PA=PAMD - * If PA>511 then PAMD(dB)= (PA-1024)/16*6, - * else PAMD(dB)=PA/16*6 - */ -static fm_bool mt6620_GetCurPamd(fm_u16 *pPamdLevl) -{ - fm_u16 tmp_reg; - fm_u16 dBvalue = 0, valid_cnt = 0; - fm_s32 i, total = 0; - - for (i = 0; i < 8; i++) { - if (mt6620_read(FM_ADDR_PAMD, &tmp_reg)) { - *pPamdLevl = 0; - return fm_false; - } - - tmp_reg &= 0x00FF; - dBvalue = (tmp_reg > 127) ? ((256 - tmp_reg) * 6 / 16) : 0; - if (dBvalue != 0) { - total += dBvalue; - valid_cnt++; - WCN_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue); - } - Delayms(3); - } - if (valid_cnt != 0) { - *pPamdLevl = total / valid_cnt; - } else { - *pPamdLevl = 0; - } - WCN_DBG(FM_DBG | CHIP, "PamdLevl=%d\n", *pPamdLevl); - return fm_true; -} - -static fm_s32 mt6620_ScanStop(void) -{ - return fm_force_active_event(FLAG_SCAN); -} - -static fm_s32 mt6620_SeekStop(void) -{ - return fm_force_active_event(FLAG_SEEK); -} - -/* - * mt6620_I2s_Setting - set the I2S state on MT6620 - * @onoff - I2S on/off - * @mode - I2S mode: Master or Slave - * - * Return:0, if success; error code, if failed - */ -static fm_s32 mt6620_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample) -{ - fm_u16 tmp_state = 0; - fm_u16 tmp_mode = 0; - fm_u16 tmp_sample = 0; - fm_s32 ret = 0; - - if (onoff == FM_I2S_ON) { - tmp_state = 0x01; /* I2S Frequency tracking on */ - mt6620_fm_config.aud_cfg.i2s_info.status = FM_I2S_ON; - } else if (onoff == FM_I2S_OFF) { - tmp_state = 0x00; /* I2S Frequency tracking off */ - mt6620_fm_config.aud_cfg.i2s_info.status = FM_I2S_OFF; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff); - ret = -FM_EPARA; - goto out; - } - - if (mode == FM_I2S_MASTER) { - tmp_mode = 0x03; /* 6620 as I2S master */ - mt6620_fm_config.aud_cfg.i2s_info.mode = FM_I2S_MASTER; - } else if (mode == FM_I2S_SLAVE) { - tmp_mode = 0x0B; /* 6620 as I2S slave */ - mt6620_fm_config.aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode); - ret = -FM_EPARA; - goto out; - } - - if (sample == FM_I2S_32K) { - tmp_sample = 0x0000; /* 6620 I2S 32KHz sample rate */ - mt6620_fm_config.aud_cfg.i2s_info.rate = FM_I2S_32K; - } else if (sample == FM_I2S_44K) { - tmp_sample = 0x0800; /* 6620 I2S 44.1KHz sample rate */ - mt6620_fm_config.aud_cfg.i2s_info.rate = FM_I2S_44K; - } else if (sample == FM_I2S_48K) { - tmp_sample = 0x1000; /* 6620 I2S 48KHz sample rate */ - mt6620_fm_config.aud_cfg.i2s_info.rate = FM_I2S_48K; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample); - ret = -FM_EPARA; - goto out; - } - - if ((ret = mt6620_set_bits(0x5F, tmp_sample, 0xE7FF))) - goto out; - - if ((ret = mt6620_write(0x9B, tmp_mode))) - goto out; - - if ((ret = mt6620_set_bits(0x56, tmp_state, 0xFF7F))) - goto out; - - WCN_DBG(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n", - (onoff == FM_I2S_ON) ? "On" : "Off", - (mode == FM_I2S_MASTER) ? "Master" : "Slave", sample); - out: - return ret; -} - -static fm_s32 mt6620_Tx_Support(fm_s32 *sup) -{ - *sup = 1; - return 0; -} - -static fm_s32 mt6620_rdsTx_Support(fm_s32 *sup) -{ - *sup = 1; - return 0; -} - -static fm_s32 MT6620_FMOverBT(fm_bool enable) -{ - fm_s32 ret = 0; - static fm_u16 state; - static fm_u16 mode; - static fm_u16 sample; - static fm_u16 inited = fm_false; - - WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__); - if (inited == fm_false) { - /* record priv val */ - if ((ret = mt6620_read(0x56, &state))) - goto out; - if ((ret = mt6620_read(0x9B, &mode))) - goto out; - if ((ret = mt6620_read(0x5F, &sample))) - goto out; - inited = fm_true; - WCN_DBG(FM_NTC | CHIP, "init, record priv seetings\n"); - } - - if (enable == fm_true) { - /* disable analog output when FM over BT */ - if ((ret = mt6620_set_bits(0x3A, 0, MASK(2)))) - goto out; - /* set FM over BT */ - if ((ret = mt6620_write(0x56, 0x0001))) - goto out; - if ((ret = mt6620_write(0x9B, 0x000b))) - goto out; - if ((ret = mt6620_write(0x5F, 0x1175))) - goto out; - WCN_DBG(FM_NTC | CHIP, "set FM via BT controller\n"); - } else if (enable == fm_false) { - /* enable analog output when FM normal mode */ - if ((ret = mt6620_set_bits(0x3A, BITn(2), MASK(2)))) - goto out; - /* recover to priv val */ - if ((ret = mt6620_write(0x56, state))) - goto out; - if ((ret = mt6620_write(0x9B, mode))) - goto out; - if ((ret = mt6620_write(0x5F, sample))) - goto out; - WCN_DBG(FM_NTC | CHIP, "set FM via Host\n"); - } else { - WCN_DBG(FM_ERR | CHIP, "%s()\n", __func__); - ret = -FM_EPARA; - goto out; - } - out: - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; -} - -static fm_s32 mt6620_pre_search(void) -{ - mt6620_RampDown(); - mt6620_Mute(fm_true); - - FM_LOG_NTC(FM_NTC | CHIP, "search threshold: RSSI=%d,de-RSSI=%d,smg=%d %d\n", - mt6620_fm_config.rx_cfg.long_ana_rssi_th, mt6620_fm_config.rx_cfg.desene_rssi_th, - mt6620_fm_config.rx_cfg.smg_th); - return 0; -} - -static fm_s32 mt6620_restore_search(void) -{ - mt6620_RampDown(); - mt6620_Mute(fm_false); - return 0; -} - -/*fm soft mute tune function*/ -static fm_s32 mt6620_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_s32 hilo_side = -1; - struct mt6620_fm_softmute_tune_cqi_t *p_cqi; - fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0; - fm_u32 PRX = 0; - fm_u16 softmuteGainLvl = 0; - - /*set hilo side first(f/w won't do this), need to check whether work if set before rampdown */ - if ((ret = MT6620_HL_Side_Adj(freq, &hilo_side))) - return ret; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_full_cqi_req(cmd_buf, TX_BUF_SIZE, freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT, - mt6620_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", res->cqi[0]); - p_cqi = (struct mt6620_fm_softmute_tune_cqi_t *)&res->cqi[2]; - /* just for debug */ - WCN_DBG(FM_NTC | CHIP, "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi->ch, - p_cqi->rssi, p_cqi->pamd, p_cqi->mr, p_cqi->atdc, p_cqi->prx, p_cqi->smg); - RSSI = - ((p_cqi->rssi & 0x03FF) >= - 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF); - PAMD = - ((p_cqi->pamd & 0xFF) >= - 128) ? ((p_cqi->pamd & 0x0FF) - 256) : (p_cqi->pamd & 0x0FF); - MR = ((p_cqi->mr & 0x01FF) >= - 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF); - ATDC = - ((p_cqi->atdc & 0x0FFF) >= - 2048) ? ((p_cqi->atdc & 0x0FFF) - 4096) : (p_cqi->atdc & 0x0FFF); - if (ATDC < 0) { - ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */ - } - PRX = (p_cqi->prx & 0x00FF); - softmuteGainLvl = p_cqi->smg; - /* check if the channel is valid according to each CQIs */ - if ((RSSI >= mt6620_fm_config.rx_cfg.long_ana_rssi_th) - && (PAMD <= mt6620_fm_config.rx_cfg.pamd_th) - && (ATDC <= mt6620_fm_config.rx_cfg.atdc_th) - && (MR >= mt6620_fm_config.rx_cfg.mr_th) - && (PRX >= mt6620_fm_config.rx_cfg.prx_th) - && (softmuteGainLvl <= mt6620_fm_config.rx_cfg.smg_th)) { - *valid = fm_true; - } else { - *valid = fm_false; - } - *rssi = RSSI; - } else { - WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n"); - return fm_false; - } - WCN_DBG(FM_NTC | CHIP, "valid=%d\n", *valid); - return fm_true; -} - -static fm_s32 mt6620fm_get_audio_info(fm_audio_info_t *data) -{ - memcpy(data, &mt6620_fm_config.aud_cfg, sizeof(fm_audio_info_t)); - return 0; -} - -static fm_s32 mt6620_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample) -{ - FMR_ASSERT(ponoff); - FMR_ASSERT(pmode); - FMR_ASSERT(psample); - - *ponoff = mt6620_fm_config.aud_cfg.i2s_info.status; - *pmode = mt6620_fm_config.aud_cfg.i2s_info.mode; - *psample = mt6620_fm_config.aud_cfg.i2s_info.rate; - - return 0; -} - -static fm_s32 mt6620_hw_info_get(struct fm_hw_info *req) -{ - FMR_ASSERT(req); - - req->chip_id = mt6620_hw_info.chip_id; - req->eco_ver = mt6620_hw_info.eco_ver; - req->patch_ver = mt6620_hw_info.patch_ver; - req->rom_ver = mt6620_hw_info.rom_ver; - - return 0; -} - -static fm_bool mt6620_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_NTC | CHIP, "+%s():[group_idx=%d],[item_idx=%d],[item_value=%d]\n", - __func__, group_idx, item_idx, item_value); - - switch (group_idx) { - case mono: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - - if (item_value == 1) { - if ((ret = mt6620_set_bits(0xE0, 0x02, 0xFFFF))) - goto out; - } else { - if ((ret = mt6620_set_bits(0xE0, 0x0, 0xFFFD))) - goto out; - } - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - case stereo: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - if (item_value == 0) { - if ((ret = mt6620_set_bits(0xE0, 0x0, 0xFFFD))) - goto out; - } else { - switch (item_idx) { - case Sblend_ON: - if ((ret = mt6620_set_bits(0xD8, item_idx << 15, 0x7FFF))) - goto out; - break; - case Sblend_OFF: - if ((ret = mt6620_set_bits(0xD8, 0, 0x7FFF))) - goto out; - break; - } - } - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - case RSSI_threshold: - if ((ret = mt6620_set_bits(0xe0, item_value, 0xFC00))) - goto out; - break; - case HCC_Enable: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - if (item_idx) { - if ((ret = mt6620_set_bits(0xCF, 0x10, 0xFFFF))) - goto out; - } else { - if ((ret = mt6620_set_bits(0xCF, 0x0, 0xFFEF))) - goto out; - } - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - case PAMD_threshold: - if ((ret = mt6620_set_bits(0xE1, item_value, 0xFF00))) - goto out; - break; - case Softmute_Enable: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - if (item_idx) { - if ((ret = mt6620_set_bits(0xCF, 0x0020, 0xFFFF))) /* 1:CF[5] = 1 */ - goto out; - } else { - if ((ret = mt6620_set_bits(0xCF, 0x0000, 0xFFDF))) /* 1:CF[5] = 0 */ - goto out; - } - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - case De_emphasis: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - if (item_idx == 2) { - if ((ret = mt6620_set_bits(0xd4, 0x2000, 0xCFFF))) - goto out; - } else if (item_idx == 1) { - if ((ret = mt6620_set_bits(0xd4, 0x1000, 0xCFFF))) - goto out; - } else if (item_idx == 0) { - if ((ret = mt6620_set_bits(0xd4, 0x0000, 0xCFFF))) - goto out; - } - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - case HL_Side: - if (item_idx == 2) { - /* H-Side */ - if ((ret = mt6620_set_bits(0xCB, 0x11, 0xFFFE))) - goto out; - if ((ret = mt6620_set_bits(0xF, 0x0400, 0xFBFF))) - goto out; - } else if (item_idx == 1) { - /* L-Side */ - if ((ret = mt6620_set_bits(0xCB, 0x10, 0xFFFE))) - goto out; - if ((ret = mt6620_set_bits(0xF, 0x0, 0xFBFF))) - goto out; - } - break; - - case Dynamic_Limiter: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - if (item_idx) { - if ((ret = mt6620_set_bits(0xFA, 0x0, 0xFFF7))) - goto out; - } else { - if ((ret = mt6620_set_bits(0xFA, 0x08, 0xFFF7))) - goto out; - } - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - - case Softmute_Rate: - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01))) - goto out; - if ((ret = mt6620_set_bits(0xc8, item_value << 8, 0x80FF))) - goto out; - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0))) - goto out; - break; - - case AFC_Enable: - if (item_idx) { - if ((ret = mt6620_set_bits(0x63, 0x0400, 0xFBFF))) - goto out; - } else { - if ((ret = mt6620_set_bits(0x63, 0x0, 0xFBFF))) - goto out; - } - break; - -#if 0 - case Softmute_Level: - mt6620_write(FM_MAIN_PGSEL, 0x01); - if (item_value > 0x24) - item_value = 0x24; - mt6620_set_bits(0xD1, item_value, 0xFFC0); - mt6620_write(FM_MAIN_PGSEL, 0x0); - break; -#endif - case Analog_Volume: - if ((ret = mt6620_set_bits(0x9C, item_value << 8, 0xC0FF))) - goto out; - break; - - default: - break; - } - - out: - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; - return fm_true; -} - -/* -parm: - parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG. - parm.th_val: threshold value -*/ -static fm_s32 mt6620_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve) -{ - switch (idx) { - case 0: - { - mt6620_fm_config.rx_cfg.long_ana_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val); - break; - } - case 1: - { - mt6620_fm_config.rx_cfg.desene_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val); - break; - } - case 2: - { - mt6620_fm_config.rx_cfg.smg_th = val; - WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val); - break; - } - default: - break; - } - return 0; -} - -static const fm_u16 DesenseChMap[] = { - 0x0000, 0x0000, 0x0000, 0x0000, /* 7675~7600, 7755~7680, 7835~7760, 7915~7840 */ - 0x0000, 0x0000, 0x0000, 0x0000, /* 7995~7920, 8075~8000, 8155~8080, 8235~8160 */ - 0x0000, 0x0000, 0x0000, 0x0000, /* 8315~8240, 8395~8320, 8475~8400, 8555~8480 */ - 0x0000, 0x0000, 0x0000, 0x0400, /* 8635~8560, 8715~8640, 8795~8720, 8875~8800 */ - 0x0000, 0x0000, 0x0000, 0x0000, /* 8955~8880, 9035~8960, 9115~9040, 9195~9120 */ - 0x00FC, 0x0000, 0x0000, 0x1C00, /* 9275~9200, 9355~9280, 9435~9360, 9515~9440 */ - 0x0000, 0x0001, 0x0000, 0x0000, /* 9595~9520, 9675~9600, 9755~9680, 9835~9760 */ - 0x0000, 0x7800, 0x0000, 0x0000, /* 9915~9840, 9995~9920, 10075~10000, 10155~10080 */ - 0x0000, 0x0000, 0x0000, 0x0000, /* 10235~10160, 10315~10240, 10395~10320, 10475~10400 */ - 0x0000, 0x0000, 0x0000, 0x0000, /* 10555~10480, 10635~10560, 10715~10640, 10795~10720 */ - 0x0000 /* 10875~10800 */ -}; - -/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */ -static fm_s32 mt6620_is_dese_chan(fm_u16 freq) -{ - fm_u8 bDesenseCh = 0; - - /* caculate and applye compensation */ - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - WCN_DBG(FM_NTC | CHIP, "%s, freq=%d\n", __func__, freq); - - bDesenseCh = - ((0x0001 << (((freq - 7600) % 80) / 5)) & DesenseChMap[((freq - 7600) / 80)]) >> - (((freq - 7600) % 80) / 5); - WCN_DBG(FM_NTC | CHIP, "freq[%d] desense=[%d]\n", freq, bDesenseCh); - - return bDesenseCh; -} - -/* return value: -1, is desense channel and rssi is less than threshold; -0, not desense channel or it is but rssi is more than threshold.*/ -static fm_s32 mt6620_desense_check(fm_u16 freq, fm_s32 rssi) -{ - if (mt6620_is_dese_chan(freq)) { - if (rssi < mt6620_fm_config.rx_cfg.desene_rssi_th) { - return 1; - } - } - return 0; -} - -static fm_s32 MT6620fm_low_power_wa_default(fm_s32 fmon) -{ - return 0; -} - -fm_s32 MT6620fm_low_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb_op = &ops->cb; - - ops->bi.low_pwr_wa = MT6620fm_low_power_wa_default; - ops->bi.pwron = mt6620_pwron; - ops->bi.pwroff = mt6620_pwroff; - ops->bi.msdelay = Delayms; - ops->bi.usdelay = Delayus; - ops->bi.read = mt6620_read; - ops->bi.write = mt6620_write; - ops->bi.setbits = mt6620_set_bits; - ops->bi.chipid_get = mt6620_get_chipid; - ops->bi.mute = mt6620_Mute; - ops->bi.rampdown = mt6620_RampDown; - ops->bi.pwrupseq = mt6620_PowerUp; - ops->bi.pwrdownseq = mt6620_PowerDown; - ops->bi.setfreq = mt6620_SetFreq; - ops->bi.seek = mt6620_Seek; - ops->bi.seekstop = mt6620_SeekStop; - ops->bi.scan = mt6620_Scan; - ops->bi.scanstop = mt6620_ScanStop; - ops->bi.rssiget = mt6620_GetCurRSSI; - ops->bi.volset = mt6620_SetVol; - ops->bi.volget = mt6620_GetVol; - ops->bi.dumpreg = mt6620_dump_reg; - ops->bi.msget = mt6620_GetMonoStereo; - ops->bi.msset = MT6620_SetMonoStereo; - ops->bi.pamdget = mt6620_GetCurPamd; - ops->bi.em = mt6620_em_test; - ops->bi.anaswitch = mt6620_SetAntennaType; - ops->bi.anaget = mt6620_GetAntennaType; - ops->bi.caparray_get = mt6620_GetCapArray; - ops->bi.i2s_set = mt6620_I2s_Setting; - ops->bi.i2s_get = mt6620_i2s_info_get; - ops->bi.is_dese_chan = mt6620_is_dese_chan; - ops->bi.softmute_tune = mt6620_soft_mute_tune; - ops->bi.desense_check = mt6620_desense_check; - ops->bi.get_freq_cqi = mt6620_GetFreqCQI; - ops->bi.hwinfo_get = mt6620_hw_info_get; - ops->bi.fm_via_bt = MT6620_FMOverBT; - ops->bi.set_search_th = mt6620_set_search_th; - ops->bi.get_aud_info = mt6620fm_get_audio_info; - /*****tx function****/ - ops->bi.tx_support = mt6620_Tx_Support; - ops->bi.pwrupseq_tx = mt6620_PowerUpTx; - ops->bi.tune_tx = MT6620_SetFreq_Tx; - ops->bi.pwrdownseq_tx = mt6620_PowerDownTx; - ops->bi.tx_scan = mt6620_TxScan; - ops->ri.rds_tx = MT6620_Rds_Tx; - ops->ri.rds_tx_enable = MT6620_Rds_Tx_Enable; - ops->ri.rds_tx_disable = MT6620_Rds_Tx_Disable; - ops->ri.rdstx_support = mt6620_rdsTx_Support; - ops->bi.tx_pwr_ctrl = MT6620_TX_PWR_CTRL; - ops->bi.rtc_drift_ctrl = MT6620_RTC_Drift_CTRL; - ops->bi.tx_desense_wifi = MT6620_TX_DESENSE; - ops->bi.pre_search = mt6620_pre_search; - ops->bi.restore_search = mt6620_restore_search; - - cmd_buf_lock = fm_lock_create("20_cmd"); - ret = fm_lock_get(cmd_buf_lock); - - cmd_buf = fm_zalloc(TX_BUF_SIZE + 1); - - if (!cmd_buf) { - WCN_DBG(FM_ALT | CHIP, "6620 fm lib alloc tx buf failed\n"); - ret = -1; - } -#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */ - cqi_fifo = fm_fifo_create("6620_cqi_fifo", sizeof(struct adapt_fm_cqi), 640); - if (!cqi_fifo) { - WCN_DBG(FM_ALT | CHIP, "6620 fm lib create cqi fifo failed\n"); - ret = -1; - } -#endif - - return ret; -} - -fm_s32 MT6620fm_low_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ -#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */ - fm_fifo_release(cqi_fifo); -#endif - - if (cmd_buf) { - fm_free(cmd_buf); - cmd_buf = NULL; - } - - ret = fm_lock_put(cmd_buf_lock); - - FMR_ASSERT(ops); - - fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface)); - return ret; -} - - -/*********************************************************************** -* Hi-Lo Side Injection -* -***********************************************************************/ -fm_s32 MT6620_HL_Side_Adj(fm_u16 freq, fm_s32 *hl) -{ - fm_s32 ret = 0; - fm_s32 isHiSide = 0; - fm_s32 tblsize = 0; - fm_s32 indx = 0; - fm_u16 tmp; - static fm_u16 Hi_Channels[] = { 7950, 8070, 8210, 10640 }; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq); - - *hl = 0; - - if (sizeof(Hi_Channels) == 0) - goto out; - - tblsize = sizeof(Hi_Channels) / sizeof(Hi_Channels[0]); - for (indx = 0; indx < tblsize; indx++) { - if (Hi_Channels[indx] == freq) { - isHiSide = 1; - *hl = 1; - /* goto set_HL; */ - break; - } - } - - if (isHiSide) { - /* Set high-side injection (AFC) */ - if ((ret = mt6620_read(0x0F, &tmp))) - goto out; - if ((ret = mt6620_write(0x0F, tmp | 0x0400))) - goto out; - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0))) - goto out; - /* Set high-side injection (DFE) */ - if ((ret = mt6620_read(0xCB, &tmp))) - goto out; - if ((ret = mt6620_write(0xCB, tmp | 0x01))) - goto out; - /* mt6620_write(0xCB, dataRead&0xFFFE); */ - } else { - /* Set low-side injection (AFC) */ - if ((ret = mt6620_read(0x0F, &tmp))) - goto out; - if ((ret = mt6620_write(0x0F, tmp & 0xFBFF))) - goto out; - if ((ret = mt6620_write(FM_MAIN_PGSEL, 0))) - goto out; - /* Set low-side injection (DFE) */ - if ((ret = mt6620_read(0xCB, &tmp))) - goto out; - /* mt6620_write(0xCB, dataRead | 0x01); */ - if ((ret = mt6620_write(0xCB, tmp & 0xFFFE))) - goto out; - } - out: - WCN_DBG(FM_NTC | CHIP, "-%s, [isHiSide=%d][ret=%d]\n", __func__, (fm_s32) isHiSide, ret); - return ret; -} - -/*********************************************************************** -* ADPLL Power On or Off -* -***********************************************************************/ -fm_s32 MT6620_ADPLL_Power_OnOff(fm_s32 onoff, fm_s32 ADPLL_clk) -{ - fm_s32 ret = 0; - - - switch (onoff) { - case FM_ADPLL_ON: - if ((ret = mt6620_write(0x25, 0x040F))) - goto out; - /* Remove the Reset_N */ - if ((ret = mt6620_write(0x20, 0x2720))) - goto out; - /* change DLF loop gain */ - /* Set FMCR_DLF_GAIN_A = "9" */ - /* Set FMCR_DLF_GAIN_B = "9" */ - if ((ret = mt6620_write(0x22, 0x9980))) - goto out; - /* Configure initial I_CODE for calibration */ - if ((ret = mt6620_write(0x25, 0x080F))) - goto out; - /* Enable ADPLL DCO */ - /* Set FMCR_DCO_ EN = "1 */ - if (ADPLL_clk == FM_ADPLL_16M) { - if ((ret = mt6620_write(0x1E, 0x0A63))) - goto out; - /* wait 5ms */ - Delayms(5); - if ((ret = mt6620_write(0x1E, 0x0A65))) - goto out; - /* wait 5ms */ - Delayms(5); - if ((ret = mt6620_write(0x1E, 0x0A71))) - goto out; - } else if (ADPLL_clk == FM_ADPLL_15M) { - if ((ret = mt6620_write(0x1E, 0x0863))) - goto out; - /* wait 5ms */ - Delayms(5); - if ((ret = mt6620_write(0x1E, 0x0865))) - goto out; - /* wait 5ms */ - Delayms(5); - if ((ret = mt6620_write(0x1E, 0x0871))) - goto out; - } else { - ret = -FM_EPARA; - goto out; - } - /* wait 100ms */ - Delayms(100); - if ((ret = mt6620_write(0x2A, 0x1026))) - goto out; - break; - - /* ADPLL Power Off Sequence */ - case FM_ADPLL_OFF: - /* Set rgfrf_top_ck = "0" */ - if ((ret = mt6620_set_bits(0x2A, 0, MASK(12)))) /* set 2A D12=0 */ - goto out; - /* Set FMCR_OPEN_LOOP_EN = "0" */ - /* Set FMCR_PLL_EN = "0" */ - /* Set FMCR_DCO_EN = "0" */ - if ((ret = mt6620_set_bits(0x1E, 0, MASK(7) & MASK(4) & MASK(0)))) /* set 1E D7 D4 D0=0 */ - goto out; - /* Set rgfrf_adpll_reset_n = "0" */ - if ((ret = mt6620_set_bits(0x20, 0, MASK(13)))) /* set 20 D13=0 */ - goto out; - /* Set rgfrf_adpll_reset_n = "1" */ - if ((ret = mt6620_set_bits(0x20, BITn(13), MASK(13)))) /* set 20 D13=1 */ - goto out; - break; - default: - break; - } - out: - return ret; -} - -/*********************************************************************** -* Frequency Avoidance -* -***********************************************************************/ -fm_s32 MT6620_ADPLL_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid) -{ - fm_s32 ret = 0; - fm_s32 ADPLL_clk = FM_ADPLL_15M; - fm_u16 dataRead = 0; - fm_u16 indx = 0; - static fm_u16 Avoid_Channels[] = { - 7670, 7680, 7690, 7700, 8060, 8070, 8080, 8440, 8450, 8460, 8720, 8830, 8840, 9200, - 9210, 9220, 9230, 9360, 9490, 9600, 9610, 9980, 9990, 10000, 10130, 10360, 10370, - 10380, 10740, - 10750, 10760, 10770 - }; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq); - - *freqavoid = 0; - - dataRead = sizeof(Avoid_Channels) / sizeof(Avoid_Channels[0]); - indx = 0; - while ((indx < dataRead) && (ADPLL_clk != FM_ADPLL_16M)) { - if (Avoid_Channels[indx] == freq) { - ADPLL_clk = FM_ADPLL_16M; - *freqavoid = 1; - } - indx++; - } - /* isADPLL_16M = 1; */ - if ((ret = mt6620_read(0x1E, &dataRead))) - goto out; - if (((dataRead & BITn(9)) && (ADPLL_clk == FM_ADPLL_16M)) || (!(dataRead & BITn(9)) && (ADPLL_clk == FM_ADPLL_15M))) /* 1EH, D9 */ - goto out; /* we need not do freq avoid at these caes */ - - if (ADPLL_clk == FM_ADPLL_16M) { - /* Set rgf_f16mode_en = X */ - if ((ret = mt6620_set_bits(0x61, BITn(0), MASK(0)))) /* set 61H D0=1, 16.384MHZ */ - goto out; - } else if (ADPLL_clk == FM_ADPLL_15M) { - /* Set rgf_f16mode_en = X */ - if ((ret = mt6620_set_bits(0x61, 0, MASK(0)))) /* set 61H D0=0, 15.36MHZ */ - goto out; - } else { - ret = -FM_EPARA; - goto out; - } - - /* Disable ADPLL */ - ret = MT6620_ADPLL_Power_OnOff(FM_ADPLL_OFF, ADPLL_clk); - if (ret) { - WCN_DBG(FM_NTC | CHIP, "%s, ADPLL OFF failed, [ret=%d]n", __func__, ret); - goto out; - } - /* Set FMCR_DCO_CK_SEL = ? (default = 0, 15.36) */ - if (ADPLL_clk == FM_ADPLL_16M) { - if ((ret = mt6620_set_bits(0x1E, BITn(9), MASK(9)))) /* set 1EH D9=1, 16.384MHZ */ - goto out; - } else if (ADPLL_clk == FM_ADPLL_15M) { - if ((ret = mt6620_set_bits(0x1E, 0, MASK(9)))) /* set 1EH D9=0, 15.36MHZ */ - goto out; - } else { - ret = -FM_EPARA; - goto out; - } - - /* Ensable ADPLL */ - ret = MT6620_ADPLL_Power_OnOff(FM_ADPLL_ON, ADPLL_clk); - if (ret) { - WCN_DBG(FM_NTC | CHIP, "%s, ADPLL ON failed, [ret=%d]\n", __func__, ret); - goto out; - } - /* Set rgfrf_cnt_resync_b = 0 */ - if ((ret = mt6620_set_bits(0x2A, 0, MASK(1)))) /* set 2AH D1=0 */ - goto out; - /* Set rgfrf_cnt_resync_b = 1 */ - if ((ret = mt6620_set_bits(0x2A, BITn(1), MASK(1)))) /* set 2AH D1=1 */ - goto out; - out: - WCN_DBG(FM_NTC | CHIP, "-%s, [ADPLL_clk=%d][ret=%d]\n", __func__, (fm_s32) ADPLL_clk, ret); - return ret; -} - -/*********************************************************************** -* Frequency Avoidance -* -***********************************************************************/ -fm_s32 MT6620_MCU_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid) -{ - fm_s32 ret = 0; - fm_s32 mcuDsense = FM_MCU_DESE_DISABLE; - fm_u16 len = 0; - fm_u16 indx = 0; - static fm_u16 FreqList[] = { 7800, 7940, 8320, 9260, 9600, 10400 }; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq); - - *freqavoid = 0; - - len = sizeof(FreqList) / sizeof(FreqList[0]); - indx = 0; - while ((indx < len) && (mcuDsense != FM_MCU_DESE_ENABLE)) { - if (FreqList[indx] == freq) { - mcuDsense = FM_MCU_DESE_ENABLE; - *freqavoid = 1; - } - indx++; - } - - if (mcuDsense == FM_MCU_DESE_DISABLE) { - if (mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_DISABLE)) { - ret = 0; - } else { - ret = -FM_ELINK; - } - } else if (mcuDsense == FM_MCU_DESE_ENABLE) { - if (mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_ENABLE)) { - ret = 0; - } else { - ret = -FM_ELINK; - } - } else { - WCN_DBG(FM_ERR | CHIP, "para error!\n"); - ret = -FM_EPARA; - } - - WCN_DBG(FM_NTC | CHIP, "-%s, [mcuDsense=%d][ret=%d]\n", __func__, (fm_s32) mcuDsense, ret); - return ret; -} - -/*********************************************************************** -* TX PWR CTRL -* -***********************************************************************/ -fm_s32 MT6620_TX_PWR_CTRL(fm_u16 freq, fm_s32 *ctr) -{ -#define MT6620_TX_PWR_LEV_MAX 120 -#define MT6620_TX_PWR_LEV_MIN 85 - fm_s32 ret = 0; - fm_s32 tmp = 0; - fm_u16 reg = 0; - fm_u16 coarse; - fm_u16 fine; - - WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq); - - if (freq < FM_TX_PWR_CTRL_FREQ_THR) { - /* Power setting - 1dB, 3C(HEX)=A9E9 */ - *ctr -= 1; - } else { - /* Power setting -2 dB, 3C(HEX)=A8E9 */ - *ctr -= 2; - } - - if (*ctr > MT6620_TX_PWR_LEV_MAX) { - *ctr = MT6620_TX_PWR_LEV_MAX; - } else if (*ctr < MT6620_TX_PWR_LEV_MIN) { - *ctr = MT6620_TX_PWR_LEV_MIN; - } - fine = 43017 + ((1 << ((*ctr - 85) % 6)) - 1) * 32; - WCN_DBG(FM_DBG | CHIP, "0x3C = 0x%04x\n", fine); - coarse = 514 + ((1 << ((*ctr - 85) / 6)) - 1) * 4; - WCN_DBG(FM_DBG | CHIP, "0x3D = 0x%04x\n", coarse); - - if ((ret = mt6620_write(0x3C, fine))) - goto out; - if ((ret = mt6620_write(0x3D, coarse))) - goto out; - - tmp = mtk_wcn_wmt_therm_ctrl(WMTTHERM_READ); - if ((ret = mt6620_read(0x9C, ®))) - goto out; - reg &= 0xC0FF; - if (tmp < FM_TX_PWR_CTRL_TMP_THR_DOWN) { - reg |= (0x1C << 8); /* 9CH, D13~D8 = 1C */ - } else if (tmp > FM_TX_PWR_CTRL_TMP_THR_UP) { - reg |= (0x33 << 8); /* 9CH, D13~D8 ==33 */ - } else { - reg |= (0x25 << 8); /* 9CH, D13~D8 =25 */ - } - if ((ret = mt6620_write(0x9C, reg))) - goto out; - - out: - WCN_DBG(FM_NTC | CHIP, "-%s, [temp=%d][ret=%d]\n", __func__, (fm_s32) tmp, ret); - return ret; -} - -/*********************************************************************** -* TX RTC PWR CTRL -* -***********************************************************************/ -fm_s32 MT6620_RTC_Drift_CTRL(fm_u16 freq, fm_s32 *ctr) -{ - fm_s32 ret = 0; - fm_u16 reg = 0; - fm_s32 chanel_resolution = 1; - fm_s16 compensation_int16 = 0; - fm_s32 tmp = 0; - fm_s32 drift = *ctr; - - WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq); - - /* turn off VCO tracking */ - if ((ret = mt6620_set_bits(0x48, 0, MASK(15)))) /* set 48 D15=0 */ - goto out; - - /* get channel resolution */ - if ((ret = mt6620_read(0x46, ®))) - goto out; - reg &= 0xC000; - switch (reg >> 14) { - case 0: - chanel_resolution = 1024; - break; - case 1: - chanel_resolution = 512; - break; - case 2: - chanel_resolution = 256; - break; - case 3: - chanel_resolution = 128; - break; - default: - WCN_DBG(FM_ERR | CHIP, "chanel_resolution error[%d]\n", (fm_s32) (reg >> 14)); - break; - } - - /* caculate and applye compensation */ - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - WCN_DBG(FM_DBG | CHIP, "[resolution=%d][freq=%d][drift=%d]\n", chanel_resolution, - (fm_s32) (freq / 100), (*ctr)); - tmp = (2 * drift * (freq / 100)) / chanel_resolution; - compensation_int16 = (fm_s16) tmp; - if (compensation_int16 >= 511) { - compensation_int16 = 511; - } else if (compensation_int16 <= -512) { - compensation_int16 = -512; - } - if ((ret = mt6620_read(0x47, ®))) - goto out; - reg &= 0x003F; - reg |= (compensation_int16 << 6); - if ((ret = mt6620_write(0x47, reg))) - goto out; - - /* - //turn on VCO tracking - if((ret = mt6620_set_bits(0x48, BITn(15), MASK(15))))//set 48 D15=1 - goto out; - */ - out: - WCN_DBG(FM_NTC | CHIP, "-%s, [compensation=%d][ret=%d]\n", __func__, - (fm_s32) (compensation_int16), ret); - return ret; -} - -/*********************************************************************** -* TX desense with WIFI/BT -* -***********************************************************************/ -fm_s32 MT6620_TX_DESENSE(fm_u16 freq, fm_s32 *ctr) -{ - fm_s32 ret = 0; - fm_u16 dataRead = 0; - fm_u16 tmp = 0; - - WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq); - - /* enable FM TX VCO tracking */ - if ((ret = mt6620_read(0x29, &dataRead))) /* read 29 */ - goto out; - WCN_DBG(FM_NTC | CHIP, "Before VCO On, [0x29=0x%04x]\n", dataRead); - if ((ret = mt6620_read(0x12, &dataRead))) /* read 12 */ - goto out; - WCN_DBG(FM_NTC | CHIP, "Before VCO On, [0x12=0x%04x]\n", dataRead); - - if ((ret = mt6620_set_bits(0x12, 0, MASK(15)))) /* set 12 D15=0 */ - goto out; - if ((ret = mt6620_set_bits(0x41, BITn(0), MASK(0)))) /* set 41 D0=1 */ - goto out; - if ((ret = mt6620_set_bits(0x48, BITn(15), MASK(15)))) /* set 48 D15=1 */ - goto out; - - /* wait 100ms (VCO tracking 100ms) */ - if (*ctr > FM_TX_TRACKING_TIME_MAX) { - *ctr = FM_TX_TRACKING_TIME_MAX; - } - Delayms(*ctr); - - /* disable FM TX VCO tracking */ - if ((ret = mt6620_set_bits(0x28, BITn(2), MASK(2)))) /* set 28 D2=1 */ - goto out; - if ((ret = mt6620_read(0x29, &dataRead))) /* read 29 D11~D0 */ - goto out; - WCN_DBG(FM_NTC | CHIP, "Before VCO Off, [0x29=0x%04x]\n", dataRead); - tmp = dataRead & 0x0FFF; /* Read 0x29 D11~D0 */ - if ((ret = mt6620_read(0x12, &dataRead))) /* read 12 */ - goto out; - /* Set 0x12 D15 to 1, D11:D0 to read(0x29 D11~D0) */ - dataRead &= 0xF000; - dataRead |= tmp; - dataRead |= 1 << 15; - if ((ret = mt6620_write(0x12, dataRead))) - goto out; - WCN_DBG(FM_NTC | CHIP, "Before VCO Off, [0x12=0x%04x]\n", dataRead); - if ((ret = mt6620_set_bits(0x48, 0, MASK(15)))) /* set 48 D15=0 */ - goto out; - if ((ret = mt6620_set_bits(0x41, 0, MASK(0)))) /* set 41 D0=0 */ - goto out; - - out: - WCN_DBG(FM_DBG | CHIP, "-%s, [freq=%d][delay=%dms][ret=%d]\n", __func__, (fm_s32) freq, - *ctr, ret); - return ret; -} - -static fm_s32 MT6620_Rds_Tx_Enable(void) -{ - mt6620_write(0x9F, 0x0000); - mt6620_write(0xAB, 0x3872); - mt6620_write(0xAC, 0x3B3A); - mt6620_write(0xAD, 0x0113); - mt6620_write(0xAE, 0x03B2); - mt6620_write(0xAF, 0x0001); - mt6620_write(0xB1, 0x63EB); - mt6620_write(0xF4, 0x0020); - mt6620_write(0xF5, 0x3222); - - return 0; -} - -static fm_s32 MT6620_Rds_Tx_Disable(void) -{ - mt6620_write(0x9F, 0x0000); - mt6620_write(0xAB, 0x39B6); - mt6620_write(0xAC, 0x3C3E); - mt6620_write(0xAD, 0x0000); - mt6620_write(0xAE, 0x03C2); - mt6620_write(0xAF, 0x0001); - mt6620_write(0xF4, 0x0020); - mt6620_write(0xF5, 0xBF16); - mt6620_write(0xB1, 0x623D); - - return 0; -} - -static fm_s32 MT6620_Rds_Tx(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt) -{ - fm_s32 ret = 0; - fm_u16 pkt_size = 0; - - WCN_DBG(FM_NTC | RDSC, "+%s():PI=0x%04x, PS=0x%04x/0x%04x/0x%04x, other_rds_cnt=%d\n", - __func__, pi, ps[0], ps[1], ps[2], other_rds_cnt); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6620_rds_tx(cmd_buf, TX_BUF_SIZE, pi, ps, other_rds, other_rds_cnt); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RDS_TX, SW_RETRY_CNT, RDS_TX_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c deleted file mode 100644 index 293d1c39c..000000000 --- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c +++ /dev/null @@ -1,365 +0,0 @@ -/* mt6620_rds.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6620 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_rds.h" -#include "mt6620_fm_reg.h" - - -#define MT6620_RDS_BLER_TH1 90 -#define MT6620_RDS_BLER_TH2 60 -#define MT6620_RDS_BLER_C1 12 -#define MT6620_RDS_BLER_C2 6 -#define MT6620_RDS_BLER_T1 5000 -#define MT6620_RDS_BLER_T2 5000 - -static fm_bool bRDS_FirstIn = fm_false; -static fm_u32 gBLER_CHK_INTERVAL = 5000; -static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT; -static fm_u8 BAD_BLK_RATIO; - -static struct fm_callback *fm_cb; -static struct fm_basic_interface *fm_bi; - -/* static fm_bool mt6620_RDS_support(void); */ -static fm_s32 mt6620_RDS_enable(void); -static fm_s32 mt6620_RDS_disable(void); -static fm_u16 mt6620_RDS_Get_GoodBlock_Counter(void); -static fm_u16 mt6620_RDS_Get_BadBlock_Counter(void); -static fm_u8 mt6620_RDS_Get_BadBlock_Ratio(void); -static fm_u32 mt6620_RDS_Get_BlerCheck_Interval(void); -static void mt6620_RDS_Init_Data(rds_t *pstRDSData); - -#if 0 -static fm_bool mt6620_RDS_support(void) -{ - return fm_true; -} -#endif -static fm_s32 mt6620_RDS_enable(void) -{ - fm_u16 page; - - WCN_DBG(FM_DBG | RDSC, "rds enable\n"); - fm_bi->read(FM_MAIN_PGSEL, &page); - fm_bi->write(FM_MAIN_PGSEL, 0x0003); /* sleect page3 */ - - fm_bi->write(0xCB, 0xE016); - - fm_bi->write(FM_MAIN_PGSEL, 0x0000); /* sleect page0 */ - - fm_bi->write(0x63, 0x0491); - fm_bi->setbits(0x6B, 0x2000, 0xFFFF); - - fm_bi->write(FM_MAIN_PGSEL, page); /* recover page */ - return 0; -} - -static fm_s32 mt6620_RDS_disable(void) -{ - WCN_DBG(FM_DBG | RDSC, "rds disable\n"); - fm_bi->setbits(0x6B, 0x0000, 0xDFFF); - fm_bi->write(0x63, 0x0481); - - return 0; -} - -static fm_u16 mt6620_RDS_Get_GoodBlock_Counter(void) -{ - fm_u16 tmp_reg; - fm_u16 page; - - fm_bi->read(FM_MAIN_PGSEL, &page); - fm_bi->write(FM_MAIN_PGSEL, 0x0003); - - fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg); - GOOD_BLK_CNT = tmp_reg; - - fm_bi->write(FM_MAIN_PGSEL, page); - WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u16 mt6620_RDS_Get_BadBlock_Counter(void) -{ - fm_u16 tmp_reg; - fm_u16 page; - - fm_bi->read(FM_MAIN_PGSEL, &page); - fm_bi->write(FM_MAIN_PGSEL, 0x0003); - - fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg); - BAD_BLK_CNT = tmp_reg; - - fm_bi->write(FM_MAIN_PGSEL, page); - WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u8 mt6620_RDS_Get_BadBlock_Ratio(void) -{ - fm_u16 tmp_reg; - fm_u16 gbc; - fm_u16 bbc; - - gbc = mt6620_RDS_Get_GoodBlock_Counter(); - bbc = mt6620_RDS_Get_BadBlock_Counter(); - - if ((gbc + bbc) > 0) { - tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc)); - } else { - tmp_reg = 0; - } - - BAD_BLK_RATIO = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_s32 mt6620_RDS_BlockCounter_Reset(void) -{ - fm_u16 page; - - fm_bi->read(FM_MAIN_PGSEL, &page); - fm_bi->write(FM_MAIN_PGSEL, 0x0003); - - fm_bi->write(0xC8, 0x0001); - fm_bi->write(0xC8, 0x0002); - - fm_bi->write(FM_MAIN_PGSEL, page); - - return 0; -} - -static fm_u32 mt6620_RDS_Get_BlerCheck_Interval(void) -{ - return gBLER_CHK_INTERVAL; -} - -static fm_s32 mt6620_RDS_Reset(void) -{ - fm_u16 page; - - fm_bi->read(FM_MAIN_PGSEL, &page); - fm_bi->write(FM_MAIN_PGSEL, 0x0003); - - fm_bi->write(0xB0, 0x0001); - - fm_bi->write(FM_MAIN_PGSEL, page); - - return 0; -} - -static fm_s32 mt6620_RDS_Reset_Block(void) -{ - fm_u16 page; - - fm_bi->read(FM_MAIN_PGSEL, &page); - fm_bi->write(FM_MAIN_PGSEL, 0x0003); - - fm_bi->write(0xDD, 0x0001); - - fm_bi->write(FM_MAIN_PGSEL, page); - - return 0; -} - -static fm_s32 mt6620_RDS_BlerCheck(rds_t *dst) -{ - fm_s32 ret = 0; - fm_u16 TOTAL_CNT; - static fm_u16 RDS_Sync_Cnt; - static fm_u16 RDS_Block_Reset_Cnt; -#if 0 - if (dst->AF_Data.Addr_Cnt == 0xFF) { - /* AF List Finished */ - dst->event_status |= RDS_EVENT_AF; /* Need notfiy application */ - /* loop dst->event_status then act */ - if (dst->event_status != 0) { - /* fm->RDS_Data_ready = true; */ - /* wake_up_interruptible(&fm->read_wait); */ - /* FIXME */ - WCN_DBG(FM_DBG | RDSC, "RDS_EVENT_AF, trigger read\n"); - } - } -#endif - gBLER_CHK_INTERVAL = MT6620_RDS_BLER_T1; - GOOD_BLK_CNT = mt6620_RDS_Get_GoodBlock_Counter(); - BAD_BLK_CNT = mt6620_RDS_Get_BadBlock_Counter(); - TOTAL_CNT = GOOD_BLK_CNT + BAD_BLK_CNT; - - mt6620_RDS_BlockCounter_Reset(); - - if ((GOOD_BLK_CNT == 0) && (BAD_BLK_CNT == 0)) { - BAD_BLK_RATIO = 0; - } else { - BAD_BLK_RATIO = (BAD_BLK_CNT * 100) / TOTAL_CNT; - } - - if ((BAD_BLK_RATIO < MT6620_RDS_BLER_TH2) && (RDS_Sync_Cnt > MT6620_RDS_BLER_C1)) { - gBLER_CHK_INTERVAL = MT6620_RDS_BLER_T2; - - if (RDS_Block_Reset_Cnt > 1) - RDS_Block_Reset_Cnt--; - } else { - if (BAD_BLK_RATIO > MT6620_RDS_BLER_TH1) { - /* >90% */ - mt6620_RDS_BlockCounter_Reset(); - RDS_Sync_Cnt = 0; /* need clear or not, Question, LCH. */ - RDS_Block_Reset_Cnt++; - - if ((RDS_Block_Reset_Cnt > MT6620_RDS_BLER_C2) || bRDS_FirstIn) { - if (bRDS_FirstIn) - bRDS_FirstIn = false; - - if ((ret = mt6620_RDS_Reset())) - return ret; - - RDS_Block_Reset_Cnt = 0; - WCN_DBG(FM_DBG | RDSC, "RDS Reset, blk_cnt:%d, RDS_FirstIn:%d\n", - RDS_Block_Reset_Cnt, bRDS_FirstIn); - } else if (TOTAL_CNT > 12) { - /* LCH question 2, why 12??? */ - WCN_DBG(FM_DBG | RDSC, "RDS Block Reset: %x\n", - RDS_Block_Reset_Cnt); - - if ((ret = mt6620_RDS_Reset_Block())) - return ret; - } - } else { - RDS_Sync_Cnt++; /* (60%-90%) */ - WCN_DBG(FM_DBG | RDSC, "RDS Sync Cnt: %d\n", RDS_Block_Reset_Cnt); - - if (RDS_Block_Reset_Cnt > 1) - RDS_Block_Reset_Cnt--; - - if (RDS_Sync_Cnt > MT6620_RDS_BLER_C1) { - gBLER_CHK_INTERVAL = MT6620_RDS_BLER_T2; - } - } - } - - return ret; -} - -static void mt6620_RDS_Init_Data(rds_t *pstRDSData) -{ - fm_memset(pstRDSData, 0, sizeof(rds_t)); - bRDS_FirstIn = fm_true; - - fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData)); - fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS)); - fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON)); -} - -fm_bool mt6620_RDS_OnOff(rds_t *dst, fm_bool bFlag) -{ -#if 0 - if (mt6620_RDS_support() == fm_false) { - WCN_DBG(FM_ALT | RDSC, "mt6620_RDS_OnOff failed, RDS not support\n"); - return fm_false; - } -#endif - if (bFlag) { - mt6620_RDS_Init_Data(dst); - mt6620_RDS_enable(); - } else { - mt6620_RDS_disable(); - } - - return fm_true; -} - -DEFINE_RDSLOG(mt6620_rds_log); - -/* mt6620_RDS_Efm_s32_Handler - response FM RDS interrupt - * @fm - main data structure of FM driver - * This function first get RDS raw data, then call RDS spec parser - */ -static fm_s32 mt6620_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - mt6620_rds_log.log_in(&mt6620_rds_log, rds_raw, rds_size); - return rds_parser(rds_dst, rds_raw, rds_size, getfreq); -} - -static fm_s32 mt6620_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len) -{ - return mt6620_rds_log.log_out(&mt6620_rds_log, dst, dst_len); -} - -static fm_s32 mt6620_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp) -{ - return rds_grp_counter_get(dst, &rdsp->gc); -} - -static fm_s32 mt6620_rds_gc_reset(rds_t *rdsp) -{ - return rds_grp_counter_reset(&rdsp->gc); -} - -fm_s32 MT6620fm_rds_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - FMR_ASSERT(ops->bi.write); - FMR_ASSERT(ops->bi.read); - FMR_ASSERT(ops->bi.setbits); - FMR_ASSERT(ops->bi.usdelay); - fm_bi = &ops->bi; - - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb = &ops->cb; - - ops->ri.rds_blercheck = mt6620_RDS_BlerCheck; - ops->ri.rds_onoff = mt6620_RDS_OnOff; - ops->ri.rds_parser = mt6620_rds_parser; - ops->ri.rds_gbc_get = mt6620_RDS_Get_GoodBlock_Counter; - ops->ri.rds_bbc_get = mt6620_RDS_Get_BadBlock_Counter; - ops->ri.rds_bbr_get = mt6620_RDS_Get_BadBlock_Ratio; - ops->ri.rds_bc_reset = mt6620_RDS_BlockCounter_Reset; - ops->ri.rds_bci_get = mt6620_RDS_Get_BlerCheck_Interval; - ops->ri.rds_log_get = mt6620_rds_log_get; - ops->ri.rds_gc_get = mt6620_rds_gc_get; - ops->ri.rds_gc_reset = mt6620_rds_gc_reset; - return ret; -} - -fm_s32 MT6620fm_rds_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - - fm_bi = NULL; - fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h deleted file mode 100644 index 3dc895d3f..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * (C) Copyright 20011 - * MediaTek <www.MediaTek.com> - * Hongcheng Xia<Hongcheng.Xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __FM_CUST_CFG_H__ -#define __FM_CUST_CFG_H__ - -/* scan sort algorithm */ -enum { - FM_SCAN_SORT_NON = 0, - FM_SCAN_SORT_UP, - FM_SCAN_SORT_DOWN, - FM_SCAN_SORT_MAX -}; - -/* ***************************************************************************************** */ -/* ***********************************FM config for customer: start****************************** */ -/* ***************************************************************************************** */ -/* RX */ -#define FM_RX_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define FM_RX_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define FM_RX_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define FM_RX_MR_TH 0x01BD /* FM radio MR threshold */ -#define FM_RX_SMG_TH 0x4025 /* FM soft-mute gain threshold */ -#define FM_RX_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define FM_RX_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define FM_RX_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define FM_RX_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define FM_RX_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define FM_RX_SCAN_SORT_SELECT FM_SCAN_SORT_NON -#define FM_RX_FAKE_CH_NUM 1 -#define FM_RX_FAKE_CH_RSSI 40 -#define FM_RX_FAKE_CH_1 1075 -#define FM_RX_FAKE_CH_2 0 -#define FM_RX_FAKE_CH_3 0 -#define FM_RX_FAKE_CH_4 0 -#define FM_RX_FAKE_CH_5 0 -#define FM_RX_DEEMPHASIS 0 /* 0-50us, China Mainland; 1-75us China Taiwan */ -#define FM_RX_OSC_FREQ 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */ - -/* TX */ -#define FM_TX_PWR_LEVEL_MAX 120 -#define FM_TX_SCAN_HOLE_LOW 923 /* 92.3MHz~95.4MHz should not show to user */ -#define FM_TX_SCAN_HOLE_HIGH 954 /* 92.3MHz~95.4MHz should not show to user */ - - -/* ***************************************************************************************** */ -/* ***********************************FM config for customer:end ******************************* */ -/* ***************************************************************************************** */ -/* band */ -#define FM_BAND_UNKNOWN 0 -#define FM_BAND_UE 1 /* US/Europe band 87.5MHz ~ 108MHz (DEFAULT) */ -#define FM_BAND_JAPAN 2 /* Japan band 76MHz ~ 90MHz */ -#define FM_BAND_JAPANW 3 /* Japan wideband 76MHZ ~ 108MHz */ -#define FM_BAND_SPECIAL 4 /* special band between 76MHZ and 108MHz */ -#define FM_BAND_DEFAULT FM_BAND_UE -#define FM_FREQ_MIN FM_RX_BAND_FREQ_L -#define FM_FREQ_MAX FM_RX_BAND_FREQ_H -#define FM_RAIDO_BAND FM_BAND_UE -/* space */ -#define FM_SPACE_UNKNOWN 0 -#define FM_SPACE_100K 1 -#define FM_SPACE_200K 2 -#define FM_SPACE_DEFAULT FM_RX_SEEK_SPACE -#define FM_SEEK_SPACE FM_RX_SEEK_SPACE -/* max scan chl num */ -#define FM_MAX_CHL_SIZE FM_RX_SCAN_CH_SIZE -/* auto HiLo */ -#define FM_AUTO_HILO_OFF 0 -#define FM_AUTO_HILO_ON 1 -/* seek direction */ -#define FM_SEEK_UP 0 -#define FM_SEEK_DOWN 1 - -#define FM_CHIP_AR1000 0x1000 -#define FM_CHIP_MT5192 0x91 -#define FM_CHIP_MT5193 0x92 -#define FM_CHIP_MT6616 0x6616 -#define FM_CHIP_MT6626 0x6626 -#define FM_CHIP_MT6628 0x6628 -#define FM_CHIP_MT6620 0x6620 -#define FM_CHIP_UNSUPPORTED 0xffff - -/* seek threshold */ -#define FM_SEEKTH_LEVEL_DEFAULT 4 -#endif /* __FM_CUST_CFG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h deleted file mode 100644 index 749a38a32..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h +++ /dev/null @@ -1,972 +0,0 @@ - -const unsigned char channel_parameter[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 -}; - -#if defined(MT6626_FPGA) -const unsigned short bin_rom[] = { - 0x0000, 0x1FFF, 0xBC00, 0x0010, 0xBC00, 0x0271, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, - 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0xBC02, 0x0906, 0xBC20, 0x2019, - 0x4021, 0xFB11, 0xBC02, 0x0807, 0xBC20, 0x2019, 0x4041, 0xFB11, 0xBC22, 0x0480, 0xBC20, - 0x0080, 0x4001, 0x8B02, 0xE401, 0xBC21, 0x0367, 0xA301, 0x0080, 0xBC20, 0x201A, 0x41E1, - 0xFA12, 0xA302, 0x0082, 0x0891, 0x2620, 0x8FF9, 0x3D02, 0xBC21, 0x2018, 0x481E, 0xBC22, - 0x2019, 0x8C69, 0x40C0, 0xA203, 0x0082, 0x2631, 0x8F4B, 0x2634, 0x8F3E, 0x2632, 0x8F1D, - 0xB306, 0x0008, 0x8F0A, 0x40E0, 0xFB50, 0xBC02, 0x1E58, 0xBC22, 0x2019, 0xBC21, 0x2018, - 0x481E, 0x8C53, 0x40C0, 0xFB50, 0xFA33, 0x26B0, 0x8F08, 0xBC02, 0x072A, 0xBC21, 0x2018, - 0x4020, 0x7207, 0xBB30, 0x40C0, 0xBC22, 0x2019, 0xA31E, 0x0082, 0x8D41, 0x40A0, 0x70E0, - 0x3B50, 0xBC21, 0x201D, 0xBC22, 0x201B, 0xFA31, 0xFA52, 0x0810, 0xBC3E, 0x00E4, 0xBC3A, - 0x0692, 0xB400, 0x0002, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0408, 0xBC02, 0x0131, 0x40C0, - 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D23, 0x4080, 0xFB50, 0xBC02, 0x016B, 0x40C0, - 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D18, 0x4060, 0xBC21, 0x201F, 0xFB50, 0xFA30, - 0xBC3E, 0x00C8, 0xBC3A, 0x0652, 0xBC21, 0x03FF, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0801, - 0xBC02, 0x0131, 0x40C0, 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0xA203, 0x0082, 0xB316, - 0x0040, 0x8F91, 0xBC00, 0x001C, 0x6915, 0xA902, 0x8E00, 0xA30E, 0x0085, 0xDFD5, 0xBC02, - 0x0607, 0xBC02, 0x077A, 0xBC20, 0x2019, 0x7040, 0x4FD5, 0xBC22, 0x2008, 0xFB11, 0xFA51, - 0xBC23, 0x4000, 0x0ACB, 0xBC21, 0x2100, 0xFB53, 0xFA32, 0xB314, 0x0020, 0x8FFB, 0x4121, - 0xE9FE, 0xFB11, 0xBC00, 0x1D52, 0xE902, 0xBC20, 0x2019, 0x7060, 0x5FD5, 0x8C02, 0xFB11, - 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, 0x3E02, 0xA200, 0x008C, 0x6980, 0x4FD5, 0x8F02, - 0xA200, 0x0086, 0x2681, 0x8F02, 0x4080, 0xA300, 0x0082, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, - 0xBC20, 0x2019, 0x7068, 0x5FD5, 0x8C02, 0xFB11, 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, - 0x3E02, 0xA200, 0x008C, 0xA201, 0x0088, 0x2681, 0x8F06, 0x4020, 0xA202, 0x008A, 0x1401, - 0x0A10, 0xA300, 0x008A, 0x3409, 0xA300, 0x0088, 0xA201, 0x0086, 0xB300, 0x0010, 0x8F01, - 0x2691, 0x8F09, 0x401C, 0xBC20, 0x2041, 0xA202, 0x008A, 0xA31C, 0x0088, 0xA31C, 0x008A, - 0xFB12, 0x2691, 0x8F16, 0xBC20, 0x2019, 0x41C1, 0x7008, 0x7B11, 0xBC22, 0x2018, 0xBC20, - 0x201A, 0x8C05, 0xFB51, 0x8E00, 0xBC20, 0x201A, 0x8E00, 0xFA10, 0xB310, 0x0008, 0x8FF6, - 0x7040, 0x0FD5, 0x8C03, 0xA300, 0x0082, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, - 0x8E00, 0xDFC0, 0xDFF5, 0xBC02, 0x05A2, 0xA200, 0x0087, 0x2680, 0x8F0C, 0xBC20, 0x2040, - 0x7000, 0x4FC3, 0x700F, 0xBB11, 0x4042, 0xA303, 0x0089, 0xA31E, 0x0087, 0xA301, 0x0086, - 0xFB12, 0xA200, 0x0084, 0x8EA0, 0xBC20, 0x02C7, 0xA300, 0x009B, 0xBC02, 0x00A7, 0x3E01, - 0xBC20, 0x2008, 0xBC21, 0x033D, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7000, - 0x4FF5, 0xBC22, 0x201A, 0x7040, 0x3B11, 0xFA51, 0x2248, 0x8F00, 0xA300, 0x0082, 0x8EC0, - 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0480, 0xBC20, 0x02B3, 0xA300, 0x009B, - 0xBC02, 0x00A7, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0x03F7, 0xBC22, 0x2018, 0x7008, 0x3B11, - 0x7050, 0x3B50, 0xBC21, 0x2019, 0x8C2E, 0xFB30, 0xA200, 0x0081, 0x2601, 0x8F04, 0xBC21, - 0x8000, 0xBC20, 0x2023, 0x8C24, 0xFB11, 0xBC02, 0x01BE, 0xA200, 0x0085, 0x4001, 0xA301, - 0x0081, 0x2682, 0x8F02, 0x4100, 0xA300, 0x0082, 0xBC02, 0x1E58, 0xBC20, 0x201A, 0x8E00, - 0xFA10, 0xB310, 0x0008, 0x8F05, 0xBC20, 0x2019, 0x4161, 0x7008, 0x3B11, 0xA300, 0x0085, - 0xBC02, 0x077A, 0xBC20, 0x2023, 0xBC21, 0x8000, 0xFB11, 0xA200, 0x0082, 0x2604, 0x8FCE, - 0x3E02, 0x7000, 0x4FD5, 0xBC20, 0x2008, 0x8EC0, 0xE9FE, 0xFB11, 0xE902, 0xA200, 0x0098, - 0x6CE0, 0x1FD5, 0x8F57, 0xBC02, 0x0918, 0xBC20, 0x01AE, 0xBC02, 0x09F0, 0xA200, 0x02A7, - 0x2682, 0x8F02, 0xBC20, 0x01AE, 0xBC02, 0x0D50, 0xA200, 0x008E, 0x2606, 0x8F1E, 0x2604, - 0x8F17, 0x2602, 0x8F0B, 0x2600, 0x8F05, 0xA200, 0x008D, 0x2680, 0x8F20, 0xBC02, 0x0BDE, - 0x8D1F, 0xBC02, 0x0E6E, 0x8D1C, 0xBC20, 0x2032, 0x4101, 0xFA10, 0x0801, 0xA300, 0x01E3, - 0xBC02, 0x0A17, 0x8D12, 0xBC02, 0x0AA2, 0xBC02, 0x0CA4, 0x8D0D, 0xA200, 0x0085, 0x2601, - 0x8F05, 0xA200, 0x02C7, 0x2601, 0x8F01, 0xBC02, 0x0B48, 0x8D02, 0xBC02, 0x0B2B, 0xA201, - 0x01BE, 0xBC20, 0x01AE, 0xBC02, 0x0A72, 0xBC20, 0x01E7, 0xBC02, 0x0B04, 0xA200, 0x0266, - 0x2680, 0xBC20, 0x01E7, 0x8F03, 0xBC21, 0x7FFF, 0xBC02, 0x0B8C, 0x8D04, 0xA201, 0x01FF, - 0xBC02, 0x0B8C, 0xBC02, 0x0C54, 0xA200, 0x0099, 0x2600, 0x8F02, 0xBC02, 0x195E, 0xBC02, - 0x1926, 0xA200, 0x009A, 0x2600, 0x8F02, 0xB000, 0xFFFF, 0xA300, 0x009A, 0xBC20, 0x2040, - 0x4021, 0xFA10, 0x0801, 0x2600, 0x8F0A, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, - 0x2680, 0x8F02, 0xA200, 0x009A, 0x2600, 0x8F15, 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, - 0xBC20, 0x2008, 0xBC21, 0x0080, 0xFA12, 0x0851, 0x2610, 0x8F0B, 0xFA11, 0xBC22, 0xFF7F, - 0x084A, 0x7000, 0x3B11, 0xBC02, 0x05B3, 0x8D03, 0x4020, 0xA300, 0x0099, 0x7038, 0x4FD5, - 0xA200, 0x008E, 0xE9FE, 0x3401, 0x8EC0, 0x0801, 0xA300, 0x008E, 0x4020, 0xBC21, 0x00C0, - 0xA300, 0x0091, 0xA300, 0x0092, 0xA301, 0x0098, 0x8EC0, 0xA300, 0x0090, 0xA300, 0x008F, - 0xE918, 0x8E00, 0xDD05, 0xBC25, 0x2096, 0xDD5B, 0xFAB5, 0xA205, 0x009B, 0xDD7A, 0xDD9F, - 0xDDBE, 0xDDDD, 0xDDFC, 0xDE0B, 0xDE2C, 0xDE49, 0xDE68, 0xDE8F, 0xDEAE, 0xDED5, 0xDEE6, - 0xDF04, 0xDF23, 0xDF42, 0xDF61, 0xDF80, 0xDD27, 0xF9FC, 0x8EA5, 0xBC20, 0x2096, 0xBC21, - 0x00FF, 0xFA10, 0x6220, 0x4D05, 0xA203, 0x0096, 0x6854, 0xCD27, 0x6624, 0xCF80, 0xA302, - 0x0096, 0xCF61, 0xCF42, 0xCF23, 0xCF04, 0xCEE6, 0xCDFC, 0xCDDD, 0xCDBE, 0xCD9F, 0xCD7A, - 0xCD5B, 0xF8FC, 0xCED5, 0xCEAE, 0xCE8F, 0xCE68, 0xCE49, 0xCE2C, 0xCE0B, 0xE9E8, 0x8EC8, - 0xBC20, 0x2102, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, - 0x02DB, 0xBC20, 0x02DB, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2104, - 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, 0x0423, 0xBC20, - 0x0423, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xE906, 0xA202, 0x0090, 0x69A8, - 0x1F95, 0x8F19, 0xBC24, 0x2081, 0xBC23, 0x2082, 0xFA95, 0xBC24, 0x2015, 0xFA73, 0xA21A, - 0x0461, 0xA21E, 0x046B, 0xA210, 0x0361, 0xFA94, 0xA305, 0x02CA, 0xA303, 0x02CB, 0xA310, - 0x02C8, 0xA31A, 0x02C9, 0xA304, 0x02CC, 0xA31E, 0x02CD, 0x26A6, 0x8F32, 0xBC23, 0x027F, - 0xBC24, 0x026F, 0x4022, 0xBD10, 0x0306, 0xE205, 0xE585, 0xA21C, 0x02C8, 0xA21A, 0x02CA, - 0xA21E, 0x02CB, 0xA210, 0x02C9, 0xA205, 0x02CC, 0xA203, 0x02CD, 0xA204, 0x0081, 0xA31C, - 0x02C2, 0xA310, 0x02C3, 0xA31A, 0x02C4, 0xA31E, 0x02C5, 0xA305, 0x02C6, 0xA303, 0x02C7, - 0x2640, 0x8F03, 0xA203, 0x0095, 0x34D9, 0xA303, 0x0095, 0xA203, 0x0098, 0xA302, 0x0081, - 0x3230, 0x8F02, 0xB026, 0xFFFF, 0xA302, 0x0098, 0xA200, 0x028F, 0x421E, 0x403A, 0xBC3C, - 0x027F, 0xBC22, 0x2033, 0xE064, 0xBC23, 0x2034, 0xE065, 0xFB54, 0xFB75, 0xA300, 0x028F, - 0xBC02, 0x1BC3, 0xBC22, 0x3105, 0xA200, 0x0313, 0x700E, 0xBA52, 0x3BC2, 0xBC22, 0x2139, - 0xBC3C, 0x02E0, 0xBD05, 0x0352, 0xFA53, 0xE463, 0xA202, 0x0099, 0x2620, 0xA300, 0x0313, - 0x385A, 0x8F10, 0xBC23, 0x2008, 0xBC24, 0x0080, 0xFA75, 0x0B2C, 0xBC25, 0x2103, 0xFB74, - 0xFAB3, 0xBC24, 0x4000, 0x08DC, 0x2630, 0x8F01, 0xBC02, 0x15BE, 0x4022, 0xA203, 0x0091, - 0x26B0, 0x8F05, 0xBC20, 0x2012, 0xBC21, 0x2014, 0xBC02, 0x106C, 0x4022, 0xA203, 0x0093, - 0xB306, 0x0011, 0x4003, 0x1893, 0xA204, 0x0091, 0x6D28, 0x5FA2, 0x4244, 0x2214, 0x18DA, - 0xA202, 0x008F, 0x2620, 0xA303, 0x0091, 0x8F67, 0x2621, 0x8F53, 0x2622, 0x8F2B, 0x26A3, - 0x8F26, 0xBC02, 0x118C, 0xCFA2, 0x2620, 0xBC20, 0x2015, 0x8F0E, 0xA201, 0x0097, 0xBC02, - 0x101D, 0xBC02, 0x1391, 0xBC02, 0x1DAA, 0xA202, 0x0097, 0x2622, 0x4043, 0x8F00, 0x34D1, - 0xA303, 0x0097, 0xA202, 0x0093, 0x3511, 0x4242, 0x21E2, 0xA203, 0x0094, 0x4005, 0x34D9, - 0x192C, 0x4062, 0x08DA, 0xA304, 0x0093, 0x8C51, 0xA303, 0x0094, 0x8C4E, 0x4062, 0x3854, - 0xB004, 0xFFFB, 0xDFC0, 0xBC02, 0x121B, 0x6E15, 0x0FC0, 0xB014, 0xFFFA, 0xDFC1, 0xBC02, - 0x1277, 0xBC02, 0x12BC, 0xCFC0, 0xBC21, 0x0464, 0xBC02, 0x1326, 0x7018, 0x8FA3, 0x2630, - 0x8F33, 0xA201, 0x0097, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, - 0xBC02, 0x1092, 0x4062, 0x8D27, 0xBC02, 0x118C, 0xBC02, 0x11E4, 0xBC02, 0x1B03, 0x7018, - 0x8FA3, 0x2630, 0x8F1B, 0xA201, 0x0097, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x4062, 0x8D15, - 0xBC02, 0x12BC, 0xCFA2, 0x2620, 0x8F00, 0xBC02, 0x1E00, 0xBC02, 0x10FF, 0xA202, 0x0094, - 0x26A0, 0x4062, 0x8F05, 0xA203, 0x047B, 0x2630, 0x8F01, 0xBC02, 0x115E, 0x4062, 0xA204, - 0x008F, 0xA203, 0x0090, 0x6D48, 0x4F95, 0x34D9, 0x40E6, 0xA205, 0x008D, 0x08DE, 0x08A2, - 0x26D0, 0xA303, 0x0090, 0xA302, 0x008F, 0x8F04, 0xBC22, 0x31F8, 0xDF95, 0xFA52, 0x8EA2, - 0xCF95, 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xA200, 0x0092, 0xDFC0, 0xDFF5, 0xBC02, - 0x10DC, 0xCFC0, 0xB300, 0x0044, 0x8F2B, 0xA201, 0x0097, 0xB300, 0x0045, 0x8F21, 0xB300, - 0x0046, 0x8F14, 0xCFC0, 0xB310, 0x0047, 0x8F21, 0xA200, 0x0470, 0x2680, 0x8F00, 0xBC02, - 0x0F91, 0xBC02, 0x1DAA, 0xA200, 0x0097, 0x2602, 0x4041, 0x8F00, 0x3441, 0xA301, 0x0097, - 0x8D12, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, 0xBC02, 0x1092, - 0x8D07, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x8D02, 0xBC02, 0x1E00, 0x7240, 0x4FC0, 0x6D00, - 0x4FF5, 0x21C1, 0x4001, 0x1808, 0xA201, 0x008D, 0x2690, 0xA300, 0x0092, 0x8F04, 0xBC20, - 0x31F8, 0xDFD5, 0xFA10, 0x8EA0, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x009C, - 0xBC21, 0x047C, 0x0448, 0x3489, 0x32A0, 0x4001, 0x8F01, 0x8B02, 0xE401, 0x8EB8, 0xE902, - 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0xBC20, 0x3173, 0xBC21, 0x3010, 0xBC24, 0x02A8, 0xBC22, - 0x2032, 0x7014, 0x3A10, 0x4085, 0x700F, 0x3A31, 0xA300, 0x01E5, 0xFA53, 0xBC40, 0x1605, - 0xA301, 0x0467, 0x4100, 0xBC40, 0x1E10, 0xBC40, 0x2610, 0x6206, 0x2610, 0xFA51, 0x6213, - 0x6650, 0xBC3A, 0x0184, 0xBC3E, 0x01C0, 0x4503, 0x4444, 0xBC2E, 0x0160, 0xBC2F, 0x0170, - 0xB048, 0x009C, 0xB056, 0x009C, 0xA300, 0x01E3, 0xA301, 0x01F7, 0xA31C, 0x0468, 0xA31C, - 0x0461, 0xA31C, 0x045C, 0xA30E, 0x016E, 0xA30F, 0x017E, 0xA31A, 0x01AC, 0xA31A, 0x01AD, - 0xA31E, 0x01E0, 0xA31E, 0x01E1, 0xA304, 0x015E, 0xA305, 0x015F, 0xBC20, 0x3136, 0xBC21, - 0x3163, 0xBD04, 0x04D2, 0xFA04, 0xFB24, 0xFA0C, 0xFB24, 0xBD04, 0x04D8, 0xFA0C, 0xFB24, - 0xBC20, 0x31B2, 0x7717, 0xBA51, 0x7006, 0xBA14, 0x38BC, 0x084D, 0xB048, 0x319C, 0xA301, - 0x0266, 0xBC20, 0x0200, 0xFA91, 0xB040, 0x0050, 0xB060, 0x0010, 0xA304, 0x0261, 0xA300, - 0x0260, 0xA306, 0x0262, 0xFA52, 0x4044, 0x1609, 0x41E6, 0x0894, 0x1406, 0xB4F2, 0x0001, - 0x0B07, 0xBC20, 0x01F9, 0xA302, 0x02A7, 0xBC40, 0x1C01, 0xBC40, 0x3401, 0x144E, 0x24A1, - 0xBC24, 0x029A, 0xBC40, 0x140C, 0xBC21, 0x0267, 0xBC22, 0x0294, 0xBC3C, 0x4000, 0x6D79, - 0x640E, 0xBC3F, 0x0285, 0xBC3B, 0x0290, 0xBC30, 0x2000, 0x7000, 0x244F, 0xBC40, 0x6607, - 0xA31F, 0x028F, 0xA31B, 0x0293, 0xBC40, 0x0C9C, 0xBC40, 0x149C, 0xBC40, 0x151E, 0xBC40, - 0x2C80, 0xBC40, 0x3490, 0xBC40, 0x3C9A, 0xBC40, 0x2D10, 0xBC40, 0x1D03, 0x40A7, 0xBC02, - 0x05B3, 0xB04A, 0x0318, 0xBC23, 0x30FD, 0xBC22, 0x30FF, 0xA304, 0x0325, 0xFA74, 0xFA52, - 0x04F2, 0xBC21, 0x02E0, 0x3589, 0xB00E, 0x0318, 0xA306, 0x0312, 0xA300, 0x0326, 0xBC26, - 0x30FC, 0xBC20, 0x3102, 0xFAD6, 0xFA10, 0xA306, 0x0360, 0x14AA, 0x1428, 0x14EB, 0xA304, - 0x035F, 0xBC26, 0x2021, 0x35CD, 0xBC25, 0x0327, 0xBC24, 0x07C0, 0xBC3E, 0x7FFF, 0xBC3A, - 0x0320, 0xB012, 0x0019, 0xB024, 0xFFFF, 0xB000, 0xFFFF, 0x6D4B, 0x3BD4, 0xA305, 0x0354, - 0xA31E, 0x047A, 0xA31A, 0x02DC, 0xA301, 0x0314, 0xA307, 0x0313, 0xA304, 0x0353, 0xA302, - 0x0363, 0xA303, 0x0364, 0xA300, 0x0365, 0xBC02, 0x0263, 0xBC02, 0x07A4, 0xBC20, 0x2023, - 0xBC21, 0x4000, 0x700F, 0xBA10, 0x0801, 0x2680, 0x8F09, 0xBC20, 0x2040, 0x7008, 0x4FD5, - 0xFA10, 0x0801, 0x2600, 0x8F10, 0xA301, 0x0099, 0x8D0F, 0xBC20, 0x2008, 0xBC21, 0xFF7F, - 0x7007, 0x3A12, 0x6214, 0x4FD5, 0xA31C, 0x0099, 0xA31C, 0x02A7, 0xA31E, 0x008D, 0xFB11, - 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0x6914, 0x4FD5, 0x4020, - 0xE9FE, 0xA309, 0x008B, 0xA309, 0x008C, 0xA300, 0x00A0, 0xBC00, 0x0263, 0xBC22, 0x036A, - 0xBC21, 0x044C, 0x044A, 0x3509, 0x32C0, 0x4001, 0x4023, 0x8F01, 0x8B04, 0xE501, 0x2680, - 0x8F02, 0xBC22, 0x2040, 0x8E00, 0xFB51, 0xBC22, 0x305A, 0x40BC, 0x703F, 0xBA52, 0xBC3A, - 0x0376, 0xBC2E, 0x0399, 0x4FEF, 0xBC28, 0x03A8, 0x2680, 0x149A, 0x4270, 0xA31E, 0x0372, - 0xA31A, 0x0375, 0xA310, 0x0395, 0xA31C, 0x0396, 0xA31C, 0x0397, 0xA30E, 0x0398, 0xA30F, - 0x03B8, 0xA308, 0x03A6, 0xA302, 0x03A5, 0xBC20, 0x2040, 0x8F01, 0x4042, 0xFB12, 0xBC20, - 0x3079, 0xBC3E, 0x03DC, 0xBC3A, 0x041A, 0xBC24, 0x2044, 0xFA03, 0xBC30, 0x03F1, 0xA31E, - 0x03DB, 0xA31A, 0x0442, 0xA310, 0x03F0, 0xFB91, 0xA301, 0x03E2, 0xA303, 0x03E0, 0xBC22, - 0x2043, 0x8EC0, 0xA300, 0x03E1, 0xFB51, 0xE902, 0xA200, 0x008C, 0xA201, 0x0082, 0x6980, - 0x5FD5, 0x8F16, 0x2611, 0x8F14, 0x2612, 0x8F11, 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, - 0x2680, 0x8F00, 0xBC02, 0x06A8, 0xBC20, 0x201F, 0xBC21, 0x03FF, 0xFA10, 0x0801, 0xBC22, - 0x2002, 0x8C06, 0xFB50, 0xBC20, 0x2002, 0xA201, 0x0089, 0xFB11, 0xBC20, 0x2000, 0x4021, - 0xFB11, 0xFA11, 0x2693, 0x8FFC, 0x8E00, 0xBC20, 0x2000, 0x4001, 0xBC22, 0x2020, 0x7010, - 0x3B11, 0xFA51, 0x0808, 0x2600, 0x4021, 0x8F0C, 0xBC20, 0x2001, 0x8E00, 0xFB11, 0xFA11, - 0x2693, 0x8FFC, 0x8E00, 0x7000, 0x4FD5, 0xBC20, 0x2001, 0x8C02, 0xFB11, 0xCFD5, 0x8E00, - 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x201B, 0x4022, 0xFA10, 0x4381, 0x0902, 0x0841, 0x4043, - 0x2640, 0x0803, 0x124B, 0xA204, 0x0089, 0xBC23, 0x201D, 0x8F10, 0x0461, 0xFA73, 0xA301, - 0x0089, 0x218B, 0x8F1A, 0x2600, 0xBC20, 0x201C, 0x8F03, 0xFA10, 0x8C15, 0xA300, 0x0089, - 0xA302, 0x0086, 0x8D10, 0xBC25, 0x201C, 0x0061, 0xFAB4, 0xA301, 0x0089, 0x208C, 0x8F07, - 0x2600, 0x8F03, 0xFA70, 0x8C04, 0xA300, 0x0089, 0xA302, 0x0086, 0xBC20, 0x201F, 0xBC21, - 0x03FF, 0xFA10, 0xA203, 0x0089, 0x0801, 0x2258, 0x8F03, 0x8EC0, 0xA302, 0x0086, 0x8E00, - 0x8EB8, 0xBC20, 0x201B, 0x4381, 0xFA10, 0x0801, 0xA201, 0x0089, 0xB480, 0x0002, 0xBC22, - 0x201C, 0x0008, 0xFA51, 0x2001, 0xA300, 0x0089, 0x8F03, 0x8EC0, 0x4020, 0xA300, 0x0086, - 0x8EB8, 0xE902, 0xBC22, 0x2000, 0xDFD5, 0x41A3, 0xBC02, 0x0723, 0x4344, 0xBC25, 0x0400, - 0x2620, 0x8F05, 0xBC02, 0x07F0, 0x5404, 0x4025, 0xBC02, 0x07F0, 0x8D06, 0xBC02, 0x07FB, - 0x5404, 0x4025, 0xBC02, 0x07FB, 0xBC02, 0x072A, 0x4E20, 0xBC02, 0x07B8, 0xBC20, 0x0001, - 0x0848, 0xB412, 0x0000, 0xBC22, 0x1000, 0x4183, 0xBC02, 0x0723, 0x220A, 0x8F3F, 0xDFE2, - 0xBC21, 0x2098, 0x41C2, 0xFA33, 0x0ADA, 0xFB33, 0x4060, 0x4841, 0xBC02, 0x07D8, 0xBC21, - 0x2098, 0x4202, 0xBC20, 0xFFFE, 0x0ADA, 0xFB33, 0x08D8, 0xFB33, 0x4E20, 0xBC02, 0x07B8, - 0xBC22, 0xFFFE, 0x084A, 0xCFE2, 0x0A4A, 0xBC02, 0x07CA, 0x4224, 0xBC25, 0x4000, 0xBC02, - 0x07FB, 0x4044, 0x4045, 0xBC02, 0x07FB, 0x4284, 0x4105, 0xBC02, 0x07FB, 0x4284, 0x4105, - 0xBC02, 0x07F0, 0xCFE0, 0xBC02, 0x0733, 0x4E24, 0x4045, 0xBC02, 0x07FB, 0x4E24, 0x4045, - 0xBC02, 0x07F0, 0xBC20, 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0xBC22, 0x4000, 0x41C3, - 0xBC02, 0x0723, 0x38A2, 0x4E20, 0xBC02, 0x07B8, 0xB55A, 0x0002, 0x0A4D, 0xBC02, 0x07CA, - 0xCFD5, 0xE9FE, 0x8EB8, 0xBC20, 0x201F, 0x8E00, 0xFA10, 0x0890, 0x1093, 0x8EB8, 0xE902, - 0x4E24, 0xDFD5, 0x4085, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, 0xBC21, 0x202D, - 0xDFD5, 0xDFE0, 0x4280, 0xBC02, 0x07CA, 0xBC22, 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, - 0x1853, 0x42C0, 0xBC02, 0x07CA, 0x4240, 0xBC21, 0xE419, 0xBC02, 0x07CA, 0x4260, 0xBC21, - 0x9010, 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FFB, 0xBC02, 0x07CA, 0x4220, 0xBC21, 0x2020, - 0xBC02, 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x1020, 0xBC02, - 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07CA, - 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07D8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07CA, 0xCFD5, - 0xE9FE, 0x8EB8, 0xE902, 0xBC20, 0x2023, 0xDFD5, 0xFA16, 0xBC20, 0x2000, 0x09B0, 0xDFE6, - 0x4060, 0xBC02, 0x07B8, 0xBC22, 0x39AE, 0xBC23, 0x19AE, 0xCFE6, 0x2660, 0x195A, 0x220D, - 0x8F02, 0x3825, 0xBC02, 0x07CA, 0x4480, 0xBC02, 0x07B8, 0xBC22, 0x0000, 0xBC23, 0x0001, - 0xCFE6, 0x2660, 0x195A, 0x220D, 0x8F02, 0x3825, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, - 0xE902, 0x4E04, 0x4805, 0xDFD5, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, 0x2600, - 0x8F01, 0xBC02, 0x07FB, 0x8D02, 0xBC02, 0x07F0, 0xCFD5, 0xE9FE, 0x8EB8, 0xBC22, 0x209A, - 0xBC23, 0x0100, 0x0AD8, 0xBC21, 0x209D, 0xFB53, 0x4043, 0xFA32, 0x0893, 0x26A0, 0x8FFA, - 0xBC22, 0x209C, 0x8E00, 0xFA51, 0x8EB8, 0xBC22, 0x209A, 0xBC23, 0x209B, 0xFB50, 0xBC22, - 0x209D, 0xFB71, 0x4023, 0xFA51, 0x084B, 0x2690, 0x8FFB, 0x8EB8, 0xBC08, 0x07E6, 0x8E00, - 0xBDC8, 0x07E5, 0x8E00, 0xBC09, 0x07E4, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, - 0x8E00, 0x8EB8, 0xBC08, 0x07EE, 0x8E00, 0xBC09, 0x07ED, 0x8E00, 0x8E00, 0x8EB8, 0xE902, - 0x3804, 0xDFD5, 0xBC02, 0x07B8, 0x0A4D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, - 0x1745, 0xDFD5, 0x3804, 0xBC02, 0x07B8, 0x084D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, - 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, 0x2600, 0x8F00, 0x8EB8, 0xE902, 0x4020, 0xDFD5, - 0xBC21, 0x1F2A, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, - 0x402D, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, 0x5FED, 0xBC02, - 0x07CA, 0x4020, 0xBC21, 0x1F6A, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, - 0xBC21, 0x7FED, 0xBC02, 0x07CA, 0x4500, 0x4461, 0xBC02, 0x07E8, 0xBC20, 0x2023, 0xBC22, - 0x39AE, 0xBC23, 0x19AE, 0xFA10, 0xBC21, 0x2000, 0x0841, 0x38C1, 0x2610, 0x185A, 0x4060, - 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FF9, 0xBC02, 0x07CA, 0xBC20, 0x000A, 0x4461, 0xBC02, - 0x07E8, 0x4022, 0x4003, 0x2660, 0x1853, 0x4480, 0xBC02, 0x07CA, 0x4540, 0xBC02, 0x07B8, - 0xDFE1, 0x40C0, 0x4202, 0x41E3, 0x4104, 0xBC25, 0x31EC, 0x41E6, 0xBC02, 0x08EC, 0x41C0, - 0xBC24, 0x87FF, 0x4166, 0xBC02, 0x08F9, 0xCFE1, 0x4000, 0x4402, 0x43E3, 0x4164, 0xBC25, - 0x31ED, 0x43E6, 0xBC02, 0x08EC, 0xDFE5, 0x4180, 0xBC24, 0xFF07, 0x4066, 0xBC02, 0x08F9, - 0xCFE5, 0x40E0, 0xBC24, 0xFFE0, 0x4006, 0xBC02, 0x08F9, 0x4000, 0xBC02, 0x0733, 0xBC20, - 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0x4500, 0x4401, 0xBC02, 0x07CA, 0x4140, 0xBC21, - 0x0841, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4841, 0xBC02, 0x07E8, 0x4140, 0xBC21, 0x0840, - 0xBC02, 0x07CA, 0x4500, 0x4001, 0xBC02, 0x07CA, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, - 0x084A, 0x2610, 0x8F0A, 0x5364, 0x4065, 0xBC02, 0x07F0, 0x4AC0, 0x4021, 0xBC02, 0x07CA, - 0xBC21, 0x1FFA, 0x8D02, 0xBC21, 0x1FFB, 0x4040, 0xBC02, 0x07CA, 0x4C80, 0x4841, 0xBC02, - 0x07E8, 0x41E0, 0xBC21, 0x4042, 0xBC02, 0x07CA, 0xBC02, 0x07A4, 0x4E80, 0x4021, 0xBC02, - 0x07CA, 0x4E60, 0xBC21, 0x0480, 0xBC02, 0x07CA, 0x5380, 0xBC21, 0xAB40, 0xBC02, 0x07CA, - 0x4102, 0x4503, 0xBC24, 0x2023, 0xBC25, 0x0400, 0xFA94, 0x0925, 0x2640, 0x1853, 0x53C0, - 0xBC02, 0x07CA, 0x4E04, 0x4025, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0x1048, 0x0891, - 0x08D9, 0x2620, 0x1863, 0xFAB2, 0x004A, 0x4002, 0x3210, 0x1851, 0x210E, 0x1971, 0x8EB8, - 0xE901, 0x8E00, 0xDFF5, 0xBC02, 0x07B8, 0x0861, 0x316E, 0x0A4D, 0xBC02, 0x07CA, 0xCFF5, - 0xE9FF, 0x8EB8, 0xBC20, 0x209F, 0xBC21, 0x31DB, 0xA300, 0x047E, 0xA301, 0x047D, 0xBD11, - 0x0911, 0xFA22, 0xFB02, 0x8EC0, 0xA300, 0x047E, 0xA301, 0x047D, 0x0000, 0x6915, 0xA908, - 0xA21B, 0x0180, 0xA21E, 0x017E, 0xA21D, 0x016E, 0xBC3C, 0x3116, 0xBC30, 0x311D, 0x7016, - 0xDF1B, 0xA204, 0x017F, 0xA202, 0x0181, 0xA203, 0x0182, 0xA201, 0x01AD, 0x6915, 0x1F3D, - 0x77F6, 0x9F5E, 0xBC26, 0x3106, 0xDF70, 0xDF9C, 0xBD08, 0x09DB, 0xA200, 0x015E, 0xBC3C, - 0x009C, 0xBC3E, 0x00C2, 0xA304, 0x017F, 0x6E7B, 0x9FA1, 0x6E43, 0xBAC5, 0x6E4B, 0xBE18, - 0x396C, 0x8A0E, 0xBF95, 0x8A18, 0x77E6, 0x9FC6, 0x6A91, 0x7AD5, 0x7077, 0xFE18, 0x6A91, - 0x4F86, 0x88D0, 0x6E62, 0xFAC7, 0x6E7A, 0x5FE0, 0x39C8, 0x8890, 0xBC3D, 0x0170, 0x6FCA, - 0x4F41, 0x6910, 0xBAC5, 0x6910, 0xFF38, 0x7016, 0xBE38, 0x2A47, 0x6A91, 0xFE38, 0xBF95, - 0x8A38, 0x6A91, 0x7AC7, 0xBF95, 0x8A38, 0xBF9D, 0x8E38, 0xBF95, 0xAA38, 0x2A47, 0x6A91, - 0xFE38, 0x2A45, 0x88D0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xB06C, 0xFFFA, 0x613E, 0xDF86, - 0xBC26, 0x7ADD, 0xBCB7, 0x8000, 0x04AA, 0xBC26, 0x7ADD, 0xBCA5, 0x8000, 0xA300, 0x015E, - 0x6025, 0x0F00, 0x6FCB, 0xCFC4, 0x6036, 0x0FE0, 0xB048, 0xFFF1, 0x6910, 0xBF38, 0x6910, - 0xDF41, 0xFA86, 0x6960, 0x3E18, 0x8A0E, 0xBF99, 0x0C18, 0x7076, 0x9F07, 0x6A91, 0xBA96, - 0x7016, 0xBE18, 0x2A46, 0x88E0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xA300, 0x015E, 0x7077, - 0x8F20, 0xBC3C, 0x0160, 0x6FCD, 0xCF66, 0x6910, 0xBF18, 0x6910, 0xFAC7, 0x7147, 0xFE18, - 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0xBF9D, - 0x8E18, 0x2A47, 0xBF9D, 0xAE18, 0x2A47, 0x88F0, 0xB06C, 0xFFFA, 0x6E62, 0xDF66, 0x39E9, - 0x39C8, 0x88E0, 0x0E7A, 0x3F3E, 0x63EC, 0xFF18, 0x6FC3, 0x8FA1, 0xBC3D, 0x0184, 0xB068, - 0xFFF1, 0x6915, 0xBF38, 0x6915, 0x1F20, 0x5FDA, 0x3885, 0xCF1E, 0xCF50, 0xA310, 0x017E, - 0xA301, 0x01AD, 0xA304, 0x017F, 0xA302, 0x0181, 0xA31E, 0x0180, 0xA303, 0x0182, 0xCF3B, - 0x8EC0, 0xE9F8, 0xA31B, 0x016E, 0x0000, 0x2451, 0xA201, 0x01AC, 0x3909, 0xBC22, 0x3124, - 0x2453, 0xBC3D, 0x0184, 0x451F, 0xBD08, 0x0A11, 0x77F6, 0xFA43, 0x2442, 0x6960, 0x3E38, - 0x8A0C, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x439B, 0x6E18, - 0x2403, 0xB024, 0xFFF3, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01AC, 0x8E00, - 0xBC20, 0x3131, 0xA201, 0x02C2, 0xFA10, 0x2600, 0x8F3E, 0xA200, 0x01E2, 0x2680, 0x8F39, - 0x2610, 0xA200, 0x01BE, 0xB010, 0xFFFF, 0x8F2C, 0xA202, 0x01E3, 0x26A0, 0x8F28, 0xBC22, - 0x02A8, 0xBC23, 0x3133, 0xBC24, 0x3132, 0xBC40, 0x3906, 0xFA73, 0xBC25, 0x3134, 0xBC27, - 0x3135, 0xBC40, 0x3102, 0xFA94, 0x04F3, 0xFAB5, 0xFAF6, 0x04A2, 0x1095, 0x10DE, 0x1D1A, - 0x4003, 0x3240, 0x3843, 0x8F02, 0xB228, 0x0040, 0x4803, 0x18DC, 0x2103, 0x8F05, 0x2183, - 0x8F18, 0x3401, 0xA300, 0x01BE, 0x8D15, 0x8C14, 0xA301, 0x01BE, 0x3280, 0x4002, 0x8F0D, - 0xA301, 0x01BE, 0x8D0C, 0x8C0B, 0x4002, 0x2690, 0x4800, 0x4002, 0x8F03, 0x8E00, 0x8C04, - 0xA302, 0x01BE, 0xA300, 0x01BE, 0xA200, 0x01BE, 0x2600, 0xBC21, 0x2035, 0x4020, 0x8EC0, - 0x1810, 0xFB30, 0x0000, 0x38E0, 0xA200, 0x01E1, 0xB202, 0x0040, 0x405A, 0xBC3C, 0x01C0, - 0x441E, 0x8F0F, 0x6E11, 0xE800, 0xBD08, 0x0A88, 0x6D74, 0xA103, 0xE142, 0x1B1A, 0x0E9A, - 0x3F14, 0x6E11, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xB522, 0x0009, 0x3867, - 0xBD08, 0x0A9D, 0x6D76, 0xA184, 0xE1C3, 0xBCB6, 0x8000, 0x8E00, 0x1B63, 0x0EE3, 0x3F1D, - 0x6E19, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xA200, 0x01F7, 0x2600, 0xA200, - 0x01E4, 0x8F44, 0xA201, 0x01F8, 0x2690, 0x8F41, 0xBC21, 0x3173, 0xA202, 0x01E5, 0xFA31, - 0x2191, 0x8F02, 0x3491, 0xA302, 0x01E5, 0xA202, 0x01E5, 0x2251, 0x8F33, 0xBC21, 0x02A8, - 0xBC23, 0x316F, 0xBC25, 0x316C, 0xBC40, 0x4086, 0xFA73, 0xBC22, 0x316D, 0xBC24, 0x316E, - 0x680C, 0xFAB3, 0xFA52, 0xFA94, 0x38A3, 0x8F04, 0xBC23, 0x3170, 0x8E00, 0xFA73, 0x2033, - 0x18D4, 0xBC26, 0x3171, 0xBC40, 0x4881, 0xFAD6, 0x210E, 0x8F04, 0xBC25, 0x3172, 0x8E00, - 0xFAB5, 0x210D, 0x1954, 0x1E5D, 0x2208, 0x401E, 0x8F0A, 0x2108, 0xA31E, 0x01E5, 0x8F03, - 0x8E00, 0x8C05, 0xB000, 0xFFFF, 0x3401, 0x8D01, 0x4000, 0x40A1, 0x2801, 0xA300, 0x01E4, - 0x382E, 0xB012, 0x3136, 0xBC20, 0x3163, 0xBD04, 0x0AFB, 0xFA22, 0xFB02, 0xFA2A, 0xFB02, - 0xBD04, 0x0B01, 0xFA2A, 0xFB02, 0x8EB8, 0x0000, 0x2451, 0xA201, 0x01E0, 0x3909, 0xBC22, - 0x3163, 0x2453, 0xBC3D, 0x01C0, 0x441F, 0xBD08, 0x0B25, 0x77F6, 0xFA43, 0x2442, 0x6960, - 0x3E38, 0x8A08, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x429B, - 0x6E18, 0x2403, 0xB024, 0xFFF7, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01E0, - 0x8E00, 0xBC20, 0x31B2, 0x5FE1, 0xFA10, 0xB020, 0x319C, 0xB012, 0x319C, 0x0008, 0xBC23, - 0x01F9, 0xFA10, 0xBC40, 0x1981, 0x6862, 0x3A52, 0xBC40, 0x3582, 0x8F06, 0xA200, 0x0085, - 0x2681, 0x8F03, 0x8EC0, 0x4040, 0xA300, 0x0085, 0x8EB8, 0x0000, 0xBC21, 0x02A8, 0xBC23, - 0x0263, 0xBC40, 0x4880, 0xBC40, 0x5084, 0x6E10, 0xE580, 0x7000, 0x25C4, 0xA203, 0x0266, - 0xBC40, 0x5881, 0x2630, 0xBC40, 0x1501, 0x401C, 0x8F28, 0x3820, 0xB532, 0x0002, 0xB036, - 0x3174, 0x3882, 0x6910, 0xBA65, 0x6960, 0x2206, 0x8A02, 0xBBD4, 0xCA86, 0x6A3D, 0x7A73, - 0x88C0, 0x3215, 0x00E3, 0x8F05, 0xB416, 0x0002, 0x0441, 0x3214, 0x1801, 0x8C0A, 0x3B80, - 0x3330, 0x8F04, 0x2614, 0x8F04, 0x8E00, 0x8CE1, 0x3449, 0x344D, 0x8DDE, 0xBC20, 0x31B2, - 0x383C, 0xFA10, 0x2108, 0x1801, 0xB000, 0x319C, 0x8EC0, 0xFA10, 0xA300, 0x01FF, 0xBC25, - 0x01F9, 0x34AB, 0xE904, 0xE143, 0x6122, 0xDF82, 0x3320, 0x8F02, 0xBC23, 0x31B4, 0x8C05, - 0xFA73, 0xBC23, 0x31B3, 0x8E00, 0xFA73, 0x2813, 0xA201, 0x0260, 0xBC40, 0x268E, 0xBC40, - 0x2E8F, 0x6D4A, 0xA29E, 0x700E, 0xE2DC, 0x7307, 0xDFDE, 0x6E7F, 0x224C, 0xCFCE, 0x6A34, - 0xDFA5, 0x6E28, 0x2800, 0xBC3D, 0x0200, 0x6EE3, 0xE287, 0x88E0, 0xBD07, 0x0BC7, 0x6D00, - 0x9FCE, 0xBCFF, 0x8000, 0x8E00, 0xE4E7, 0xE2C5, 0xBCDB, 0x8000, 0x6E7F, 0x0FCE, 0x6A34, - 0xE4E5, 0x38A0, 0x88E0, 0x6EE3, 0xE287, 0xDFCE, 0xBCFF, 0x8000, 0xCF82, 0xE4E7, 0xE2C5, - 0xBCDB, 0x8000, 0xE64C, 0xE4E5, 0xCFDF, 0xE546, 0xA301, 0x0260, 0xA31F, 0x01F9, 0xCFA3, - 0x8EC0, 0xE9FC, 0xE5DC, 0x0000, 0xBC22, 0x31B7, 0x8E00, 0xFA52, 0x26A0, 0x8F04, 0x8EC0, - 0xBC22, 0x6568, 0xA302, 0x0268, 0xA200, 0x0261, 0x403A, 0xBC3C, 0x0200, 0x4C1E, 0x8E00, - 0xE062, 0xA300, 0x0261, 0x6904, 0xBC1B, 0x241B, 0xBD1E, 0x0BFA, 0x67A6, 0xBC1B, 0x241B, - 0x1E9A, 0xBC3D, 0x0290, 0xA201, 0x0293, 0x3B7A, 0x407F, 0xBC23, 0x31B6, 0x6EE7, 0x64E2, - 0xFA73, 0xA204, 0x02B0, 0xA300, 0x0261, 0xA301, 0x0293, 0x21A3, 0x8F2C, 0xA200, 0x0293, - 0x407E, 0xBC23, 0x31B5, 0x7016, 0xBC1C, 0x1EA2, 0xB800, 0xE61C, 0x1EA2, 0x1E93, 0xB124, - 0x0001, 0xBC23, 0x2000, 0xBCA4, 0xC000, 0xBC24, 0x3FFF, 0x24DA, 0xB056, 0xFFFF, 0x3095, - 0x0562, 0xA300, 0x0293, 0x4004, 0xBD0B, 0x0C39, 0x33D0, 0xB56A, 0x0001, 0x8F02, 0xB548, - 0x0001, 0x8C05, 0x0172, 0x3521, 0x0572, 0xB548, 0x0001, 0x8E00, 0x30A3, 0xA302, 0x0269, - 0xA202, 0x0269, 0xA203, 0x0268, 0x0493, 0x3220, 0xBC23, 0x0400, 0x8F02, 0xBC23, 0x31B8, - 0x8E00, 0xFA73, 0xBC24, 0x0267, 0x281A, 0xE643, 0x8EC0, 0xBC40, 0x260F, 0xBC40, 0x1E0E, - 0x0000, 0xBC23, 0x0267, 0x349D, 0xE904, 0x6D57, 0xA15F, 0x6D27, 0xDF82, 0x700E, 0xA2DD, - 0xBC40, 0x2184, 0x6E7F, 0x5FDF, 0xBC40, 0x1983, 0x7307, 0xA14C, 0xCFCE, 0x6AA7, 0x1FA5, - 0xA200, 0x0262, 0xBC3C, 0x0200, 0x88E0, 0x6EEB, 0xFC1F, 0x6960, 0x1FCE, 0xBC25, 0x026F, - 0xBCFD, 0xC000, 0xBD07, 0x0C8C, 0xB51E, 0x0002, 0x6D7A, 0xA681, 0xE061, 0xBC9C, 0x4000, - 0x6E7F, 0x4FCE, 0xB512, 0x0002, 0x6AA7, 0x26C1, 0x88E0, 0x6E29, 0xDFCE, 0x6EEB, 0xFC1F, - 0xBCFD, 0xC000, 0x8E00, 0xB51E, 0x0002, 0xE681, 0xE061, 0xBC9C, 0x4000, 0xCFA3, 0xB512, - 0x0002, 0xBC24, 0x0267, 0xE6C1, 0xE5DD, 0xE54C, 0xA300, 0x0262, 0xBC40, 0x0E06, 0xCF85, - 0xCFDE, 0x8EC0, 0xE9FC, 0xE6DE, 0xA200, 0x02A7, 0x2600, 0xBC01, 0x0D4B, 0xA203, 0x0294, - 0x2630, 0xA202, 0x02C5, 0xBC25, 0x1000, 0xA200, 0x02C6, 0xA204, 0x02C3, 0xA201, 0x01BE, - 0xBCA5, 0x4000, 0xBC23, 0x0294, 0x8F33, 0xBC26, 0x31CE, 0xBC40, 0x1185, 0x6990, 0x7AD4, - 0x0495, 0xBCA5, 0x0000, 0xBC26, 0x31CF, 0x00AA, 0xBC25, 0x31D0, 0xBC40, 0x1984, 0xBC40, - 0x2187, 0x0404, 0xFAD6, 0x044F, 0xFAB5, 0xBC81, 0x8000, 0xBC93, 0x4000, 0x0020, 0x0079, - 0xA204, 0x0299, 0xBC40, 0x1582, 0xBC40, 0x1D80, 0xBC40, 0x2581, 0x8F07, 0x32C0, 0x4000, - 0x8F00, 0xB008, 0xFFFF, 0x8C13, 0xA300, 0x0299, 0xBC20, 0x4000, 0x21A0, 0x8F00, 0x3421, - 0x8C0B, 0xA300, 0x0299, 0x403E, 0xBC40, 0x1D80, 0xA31E, 0x0294, 0xBC40, 0x2581, 0xBC40, - 0x1582, 0xBC20, 0x31D1, 0xBC40, 0x1185, 0xFA10, 0x20A8, 0x4020, 0xBC40, 0x1981, 0x3840, - 0x8F06, 0xBC20, 0x31D2, 0x8E00, 0xFA10, 0x2088, 0x3802, 0x8F00, 0x4000, 0xBC24, 0x31D3, - 0xBC40, 0x2183, 0xFA94, 0xBC27, 0x31EE, 0x4006, 0x6867, 0x3AF3, 0x1932, 0x202B, 0x8F04, - 0xBC23, 0x31EF, 0x8E00, 0xFA73, 0x218B, 0x8F00, 0x3886, 0x2640, 0xBC21, 0x029A, 0x8F0B, - 0xBC23, 0x31D4, 0xA204, 0x0299, 0xFA73, 0x2023, 0x8F01, 0x2600, 0x8F03, 0x8E00, 0x8C13, - 0xA306, 0x0295, 0xBC20, 0x31F7, 0xBC40, 0x2083, 0xFA10, 0x2118, 0x1803, 0xA302, 0x0295, - 0xBC40, 0x1C86, 0xBC40, 0x1486, 0xBC40, 0x5C86, 0xBC40, 0x2480, 0xBC40, 0x2080, 0xB230, - 0x7530, 0x4C02, 0x8EC0, 0x1810, 0xBC40, 0x2480, 0x8EC0, 0x4000, 0xA300, 0x0294, 0x0000, - 0xBC22, 0x31F0, 0xE91C, 0xBC24, 0x029A, 0x7007, 0x3A52, 0x6E11, 0x1C82, 0x6E7F, 0x3C85, - 0xBC26, 0x31F4, 0xBC23, 0x31F3, 0x77FE, 0xDCA4, 0xBC27, 0x31F2, 0xB801, 0xA891, 0x7027, - 0xFA73, 0xFAF6, 0xDCC3, 0xBC27, 0x31D5, 0xBC23, 0x31DA, 0xDD26, 0xDD04, 0xFAF6, 0xBC24, - 0x31F5, 0xFA73, 0xDD66, 0xDD43, 0xFA96, 0xB074, 0x000B, 0xBC23, 0x31D8, 0xDDA6, 0xDD87, - 0xBC26, 0x31D7, 0xB800, 0xE6F7, 0xDCE1, 0xBC24, 0x31D6, 0x6D34, 0x9DC3, 0xDDE7, 0xBC21, - 0x8000, 0xFAD6, 0xBC27, 0x31D9, 0xFA94, 0x6163, 0x9E46, 0xE1DE, 0x6D34, 0xDE03, 0x6143, - 0x1E24, 0xDE86, 0xDE63, 0xB801, 0xEE73, 0xB064, 0x000C, 0xBC21, 0x31F6, 0xDEA7, 0xDEE3, - 0xDF06, 0xBC27, 0x31F1, 0xB034, 0x0009, 0x6D45, 0x1EC4, 0xB800, 0x6CD1, 0x6E81, 0xBAF6, - 0xB024, 0x000A, 0xDFA6, 0xDF42, 0xDF23, 0xE1C3, 0xE142, 0xE246, 0xDF64, 0xDF8F, 0xBC3D, - 0x029F, 0xBD08, 0x0E56, 0x6CD8, 0x1FC1, 0x7003, 0x0E27, 0x6915, 0xA044, 0x8F01, 0x2640, - 0x8F6F, 0x6A3B, 0xCCE5, 0x6D6C, 0x4EC7, 0x6A3B, 0xDFE6, 0x88D0, 0xB20C, 0x0060, 0xDCE5, - 0xCDC5, 0x8F65, 0x6A09, 0x4D65, 0x88FC, 0x6910, 0x8C86, 0x28DD, 0x28FD, 0x8890, 0xBCFF, - 0xC000, 0xBC92, 0x4000, 0x2442, 0x28D5, 0x6A3F, 0x4CE5, 0x88F0, 0x686B, 0x8D26, 0x611E, - 0x4DE7, 0x2409, 0x8F05, 0xCFA6, 0x686B, 0x8CC5, 0xCD06, 0x666B, 0x8CE5, 0x6113, 0x5DFC, - 0x2409, 0x32F0, 0xBCEC, 0x4000, 0x8F05, 0xCD41, 0x686E, 0x5DFC, 0x8F01, 0x35F9, 0xDDE7, - 0x686D, 0x4EE6, 0x401F, 0x8F12, 0x6CB8, 0x0DC5, 0x3BBC, 0x8F09, 0x38FE, 0xBC21, 0x2666, - 0xBCFE, 0x4000, 0xB06C, 0xFFFF, 0x3BA6, 0x3BE7, 0x0F27, 0x6EF7, 0xDEFD, 0xBC3D, 0x029F, - 0x8C26, 0x409F, 0xCDE5, 0x69B4, 0x0EA6, 0x8F01, 0x3569, 0xDDE5, 0x684B, 0x9EFC, 0x7027, - 0xCDC5, 0xBC3D, 0x029F, 0x8F16, 0x6910, 0x8FC1, 0x5BE5, 0x28E5, 0xBC25, 0x31CA, 0x403B, - 0xFAA6, 0xE0E7, 0x8A03, 0xBBF9, 0x4C3F, 0x6A3F, 0x9EF0, 0x88D0, 0x77FE, 0xDFC1, 0x66EB, - 0x0DC5, 0x0F26, 0x3BC6, 0x8D02, 0xDFE6, 0xCDC5, 0x6A09, 0x4E47, 0x88EC, 0x6915, 0x0F8F, - 0x6915, 0x8E85, 0x28F7, 0x28DD, 0x88B0, 0xBC9D, 0x8000, 0xBCE6, 0xC000, 0x6915, 0x0F8F, - 0x2456, 0x6A33, 0xCFC1, 0x28D5, 0x88A0, 0x8E00, 0x0556, 0x242D, 0x26D0, 0x8F04, 0xCFE6, - 0xCDA7, 0x2137, 0x19BE, 0xDFE6, 0x6D00, 0xA444, 0x6915, 0xEA38, 0xE4C4, 0xCFE6, 0xCF44, - 0xCF27, 0xCF00, 0xE7C3, 0xE642, 0xA305, 0x029A, 0xCE02, 0xCD83, 0xCF65, 0xE441, 0xCDE7, - 0xCE64, 0xCEFB, 0xCCF0, 0xCCA1, 0xE9E4, 0xE6C6, 0xE5C7, 0xE55E, 0x8EC0, 0xE65B, 0xE4D0, - 0xBC21, 0x02A8, 0xE90E, 0x6E18, 0x7C22, 0xA204, 0x02C4, 0x6C28, 0xA0C5, 0xA200, 0x02C2, - 0x6C49, 0x5F04, 0xB050, 0x31BD, 0x6E0D, 0x1F55, 0x6980, 0x3AB6, 0xB012, 0xFFF2, 0xA21E, - 0x02C6, 0xB000, 0x31BF, 0x616C, 0xA4DE, 0x7000, 0x5F21, 0xFA12, 0x4025, 0x180D, 0x0554, - 0xB020, 0x31BB, 0xA204, 0x02C5, 0xBC40, 0x2187, 0x31E7, 0xFA52, 0x0497, 0xB000, 0x31B9, - 0xBC40, 0x1987, 0x3127, 0x6C88, 0x3A10, 0x0504, 0x38F4, 0xB00E, 0xFFF7, 0x6622, 0x9F60, - 0x6D37, 0x6446, 0xB06E, 0xFFF6, 0x6C90, 0x1F86, 0x6643, 0x2745, 0xB05E, 0xFFF5, 0xB07E, - 0xFFF4, 0xE1C6, 0x6998, 0x66C4, 0xE7C2, 0xDFC7, 0xDFA5, 0x8F54, 0xBC20, 0x02A8, 0x700F, - 0x8E44, 0x65E3, 0x0EC5, 0xB5A8, 0x000F, 0x65B3, 0x65DE, 0xBC40, 0xBC02, 0xBC40, 0x5404, - 0xB4AA, 0x0001, 0xB5B6, 0x000F, 0xB4C8, 0x0001, 0xB5EC, 0x000F, 0x62B6, 0x8EA2, 0x0BB4, - 0x170A, 0xBC40, 0xC406, 0xB4E4, 0x0001, 0xB5C8, 0x000F, 0xBC40, 0x9403, 0x62C9, 0x8E83, - 0x178B, 0xB4F6, 0x0001, 0xB5EC, 0x000F, 0x0BB7, 0xBC40, 0x8404, 0xCEE4, 0xB5FA, 0x000F, - 0xBC40, 0x4405, 0x174C, 0xBC40, 0x8C07, 0xB4F8, 0x0001, 0xB5DA, 0x000F, 0xBC40, 0x3C02, - 0xBC40, 0x4C03, 0xB5A4, 0x000F, 0xB5B6, 0x000F, 0xBC40, 0x3404, 0x0B6F, 0xB5C8, 0x000F, - 0xBC40, 0x7C02, 0xBC40, 0x9C03, 0xBC40, 0x5C01, 0xBC40, 0xAC01, 0xBC40, 0xB401, 0xBC40, - 0x7405, 0xBC40, 0xA406, 0x8C69, 0xA304, 0x02B5, 0xBC23, 0x02B5, 0xBC22, 0x31C4, 0xB046, - 0xFFF9, 0xFA52, 0xDFE4, 0xBC02, 0x1E36, 0x7000, 0x4FE0, 0xB030, 0x000B, 0xBC20, 0x31C3, - 0xB046, 0xFFF7, 0xFA12, 0xCF80, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0x6D31, 0xCFA0, - 0xBC22, 0x31C6, 0xB046, 0xFFF8, 0xFA52, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0xB030, - 0x000C, 0xBC20, 0x31C5, 0xB046, 0xFFF6, 0xFA12, 0xCFC0, 0xDF84, 0xBC02, 0x1E36, 0x6E05, - 0x0F81, 0xB032, 0x000E, 0xBC40, 0x788F, 0x7000, 0x61CE, 0xB040, 0xFFF3, 0x88D8, 0xBC22, - 0x31C7, 0xB066, 0xFFF3, 0xCF20, 0xFA52, 0xDE65, 0xDF26, 0xDF83, 0xBC02, 0x1E36, 0xCF80, - 0xCF01, 0xBC47, 0xA803, 0xBC47, 0x5804, 0x6112, 0xCE7E, 0x6C33, 0x0F21, 0x241B, 0xBC47, - 0xA004, 0x6847, 0x24DE, 0xDEE3, 0x8F03, 0xBC23, 0x31C9, 0x4001, 0x8C05, 0xFA72, 0xBC23, - 0x31C8, 0x4001, 0xFA72, 0xB030, 0xFFFE, 0xB046, 0xFFF6, 0xCF60, 0xBC02, 0x1E36, 0xBC21, - 0x02A8, 0xBC20, 0x31C1, 0xCF1E, 0xBC40, 0x4083, 0xFA10, 0xBC40, 0x649E, 0x2098, 0x8F09, - 0xBC20, 0x31C2, 0xBC40, 0x5083, 0xFA10, 0x6406, 0x0F55, 0x0018, 0x8C03, 0xBC40, 0x5480, - 0xCF55, 0x8E00, 0x8EC0, 0xE9F2, 0x8E00, 0xBC23, 0x00A5, 0xBC20, 0x3054, 0x6E10, 0xE181, - 0xB800, 0x2074, 0x24A1, 0xA201, 0x045F, 0x28C8, 0x6911, 0x2902, 0xBC21, 0x00A3, 0x6E10, - 0x654E, 0xBC24, 0x2081, 0xE085, 0xBC26, 0x2083, 0xB801, 0x2837, 0x692F, 0x65CF, 0xDFC3, - 0xFAD3, 0x28D8, 0x2444, 0xBC23, 0x00A1, 0x6E10, 0xE54E, 0xE185, 0xE1C6, 0x692D, 0x64CF, - 0x28E0, 0x2444, 0xA200, 0x00A0, 0x7008, 0xA54E, 0x6220, 0xA5CF, 0xBC24, 0x2080, 0x26A0, - 0xFA94, 0xBC22, 0x00A7, 0x8F0E, 0x38A2, 0x8E00, 0xE286, 0xE2C7, 0x24BE, 0xBC26, 0x3055, - 0x8E00, 0xFAD6, 0x28E6, 0x2444, 0x8E00, 0xA30E, 0x00A7, 0xE6CF, 0xBC24, 0x3053, 0x8E00, - 0xFA94, 0x2244, 0x8F3A, 0x7007, 0x8FC4, 0xA20E, 0x00A5, 0xE24F, 0x88C8, 0xA20E, 0x00A1, - 0x690B, 0x21CF, 0x88B8, 0xA20E, 0x00A3, 0xE0CF, 0x8898, 0xBC26, 0x3056, 0xE10E, 0xFAD6, - 0x6807, 0xA14F, 0x88A8, 0x8F10, 0xBC26, 0x3057, 0x8E00, 0xFAD6, 0x200E, 0x8F0A, 0xBC26, - 0x3059, 0x8E00, 0xFAD6, 0x212E, 0x8F04, 0xBC25, 0x3058, 0x8E00, 0xFAB5, 0x2095, 0x8F03, - 0x8E00, 0x8C06, 0xA31E, 0x008C, 0x403E, 0x8E00, 0xA31E, 0x008C, 0x403C, 0xA303, 0x009C, - 0xA301, 0x009D, 0xA304, 0x009E, 0xA302, 0x009F, 0xA31C, 0x008B, 0xE9FE, 0x8EC0, 0x3401, - 0xA300, 0x00A0, 0x6C84, 0xA904, 0xFA13, 0x6E0D, 0x1FD5, 0xBC22, 0x3104, 0xB002, 0xFFFD, - 0xFA52, 0xBC21, 0x7FFF, 0x6622, 0xA443, 0x40A1, 0xBC23, 0x02CE, 0xBC24, 0x045A, 0xBC02, - 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xE906, 0xA202, 0x02D3, 0x6E0D, 0x1F81, - 0xB012, 0xFFFB, 0x6988, 0x5FA1, 0xDFD5, 0x8F04, 0xBC20, 0x2080, 0x4021, 0x8C0F, 0xA301, - 0x02D3, 0xFA11, 0xBC02, 0x1E46, 0xA201, 0x0474, 0x1A41, 0x7007, 0x9F61, 0xBC20, 0x2080, - 0xA31E, 0x02D3, 0xFB11, 0x7040, 0x4F83, 0xBC22, 0x3104, 0x6C8C, 0xBA10, 0xFA52, 0xBC23, - 0x7FFF, 0x6626, 0x9F60, 0xCFA0, 0xBC23, 0x02D1, 0xBC24, 0x045B, 0xBC02, 0x1E36, 0xCFD5, - 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xFA31, 0xDFC0, 0xDFF5, 0xBC02, 0x1E46, 0xCFC1, - 0xDFC0, 0xFA31, 0xBC02, 0x1E46, 0xCFC1, 0x1A48, 0xA200, 0x02D5, 0xA202, 0x045C, 0x0E41, - 0x26A0, 0xA301, 0x02D5, 0x8F06, 0xBC21, 0x2082, 0x401E, 0xA200, 0x02D5, 0xA31E, 0x02D5, - 0xFB30, 0x6D14, 0x4FF5, 0xE9FE, 0x40E0, 0x8EC0, 0x0848, 0xA301, 0x045C, 0x6C84, 0xBA10, - 0xE904, 0xB580, 0x0002, 0xA201, 0x0474, 0xB100, 0x00BE, 0xBC23, 0x2081, 0x66C2, 0x1FD5, - 0xBC22, 0x3104, 0x6E2D, 0x3B74, 0xB00A, 0xFFFD, 0xFA52, 0xBC23, 0x7FFF, 0x6626, 0xA444, - 0x40C1, 0xBC23, 0x02D6, 0xBC24, 0x045D, 0xBC02, 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, - 0x8E00, 0xE904, 0xFA10, 0x6E08, 0x1FC1, 0xDFF5, 0xBC02, 0x1E46, 0xA201, 0x0474, 0xBC22, - 0x3104, 0x6692, 0x0FC0, 0xBC23, 0x2083, 0x6C80, 0xBA52, 0xBC24, 0x7FFF, 0x6E05, 0x3B71, - 0x6628, 0x9FA1, 0xB000, 0xFFFD, 0x40E1, 0xBC23, 0x02D9, 0xBC24, 0x045E, 0xBC02, 0x1E36, - 0xCFF5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0x0000, 0xBC21, 0x00A9, 0x4402, 0xE083, 0xE0C4, - 0x24A3, 0xBC23, 0x213F, 0x8E00, 0x6960, 0x3A74, 0x8A0E, 0x6A38, 0xBA74, 0xB300, 0x0044, - 0x28E2, 0x8F0B, 0x2600, 0x8F04, 0x2444, 0x8EC0, 0xA30E, 0x00A9, 0xE4CF, 0x4000, 0x8EC0, - 0xA300, 0x00A9, 0xE4C0, 0x8880, 0x8EC0, 0x8E00, 0xA300, 0x045F, 0xE904, 0xBC21, 0x2022, - 0x6E05, 0x1FD5, 0xA21C, 0x047A, 0xB000, 0xFFFD, 0xFA35, 0x7000, 0x6445, 0xDFFC, 0xBC22, - 0x0780, 0xBC23, 0x02DD, 0xBC24, 0x02DF, 0xBC02, 0x1E36, 0xA201, 0x02DF, 0xA200, 0x02DC, - 0xCFE2, 0xA092, 0x8000, 0xB000, 0xFFFF, 0xA301, 0x047A, 0x2680, 0xA300, 0x02DC, 0x8F34, - 0xBC20, 0x304D, 0xBC3E, 0x0320, 0xBC3A, 0x7FFF, 0xFA10, 0xA202, 0x047C, 0xA31E, 0x02DC, - 0xA31A, 0x047A, 0x21C8, 0x8F14, 0xBC20, 0x304E, 0xBC23, 0x304F, 0xFA10, 0x6872, 0x3A70, - 0x8F03, 0x2048, 0x8F01, 0x26A0, 0x8F05, 0x21C8, 0x8F0A, 0x4000, 0xA300, 0x047C, 0x8D07, - 0x4040, 0x8C05, 0xA300, 0x047C, 0x4020, 0xA300, 0x047C, 0xA200, 0x047C, 0x2242, 0x4000, - 0x8F02, 0xA300, 0x047B, 0x8C07, 0xCFD5, 0x7008, 0x0FD5, 0x8C03, 0xA300, 0x047B, 0xCFD5, - 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xBC20, 0x2021, 0xA201, 0x047C, 0x6984, 0x3A12, 0x8F1B, - 0x2611, 0xB034, 0xFFE0, 0x8F10, 0x2692, 0x8F1B, 0xBC21, 0x3051, 0x8E00, 0xFA31, 0x20D1, - 0x8F00, 0xA026, 0x4000, 0x21D1, 0x8F11, 0xB024, 0x0020, 0xA0A4, 0x4000, 0x8D0E, 0xBC21, - 0x3052, 0x8E00, 0xFA31, 0x8C09, 0xA026, 0x4000, 0xBC21, 0x3050, 0xB024, 0x0020, 0xFA31, - 0xA0A4, 0x4000, 0x8EC0, 0xFB12, 0x8E00, 0x0000, 0xBC22, 0x3105, 0xE902, 0xA21C, 0x0326, - 0x77FE, 0xBA52, 0x6EF0, 0x9FDC, 0xA200, 0x0312, 0xBC3C, 0x02E0, 0xBC22, 0x30C2, 0xBC23, - 0x8EE4, 0xBC24, 0x771E, 0xBC25, 0x88E2, 0x403B, 0x706F, 0xE800, 0xBD05, 0x11DA, 0x6E30, - 0xBC19, 0x2442, 0x6960, 0x3AC7, 0x8A08, 0xBB3D, 0x8E19, 0x28CF, 0xA207, 0x0315, 0xBC21, - 0x12EB, 0xA206, 0x0316, 0x28F9, 0x28F3, 0xA307, 0x0316, 0x88F0, 0x2442, 0x28FC, 0x28F5, - 0xA307, 0x0315, 0x417A, 0x88E0, 0xA207, 0x0317, 0x699C, 0xEA18, 0x2442, 0x4001, 0x8F00, - 0xB01E, 0xFFFF, 0x6A3C, 0x4FC1, 0x88E4, 0xBC3D, 0x0318, 0x5FFA, 0x7007, 0x64E6, 0xA206, - 0x0317, 0x6998, 0xDFC1, 0x8F02, 0x35B1, 0x3BA6, 0x8E00, 0xA31D, 0x0317, 0xA300, 0x0312, - 0xCFC2, 0x8EC0, 0xE9FE, 0xA302, 0x0326, 0x0000, 0xA200, 0x0325, 0xA201, 0x0354, 0xBC3D, - 0x0327, 0x459F, 0x403B, 0xBC3C, 0x0318, 0x41BE, 0xBC22, 0x30CB, 0xBD05, 0x1200, 0x5FFA, - 0x3862, 0x6910, 0xBC1D, 0x6960, 0x3A64, 0x8A03, 0xBBB0, 0xC81D, 0x28EC, 0x88B0, 0x40DA, - 0xE4E3, 0xEA18, 0xA300, 0x0325, 0xA200, 0x0353, 0x3B9D, 0x459E, 0xBC22, 0x30CF, 0x5FFA, - 0xA301, 0x0354, 0x6910, 0xBA43, 0xE064, 0x8A27, 0xBB8C, 0x861C, 0x403A, 0x28E3, 0x88A0, - 0xEA18, 0x8EC0, 0xA300, 0x0353, 0xA302, 0x0355, 0xBC25, 0x0357, 0xBC22, 0x30F8, 0x6E09, - 0x7CA4, 0xB800, 0xA6B6, 0x24B4, 0xA206, 0x0356, 0x33B0, 0x4FE4, 0xBC27, 0x01FF, 0x35B1, - 0x1927, 0x09F4, 0xBC24, 0x0100, 0x4806, 0x1926, 0xA206, 0x0355, 0x2670, 0xA307, 0x0356, - 0x243E, 0x28FC, 0x2444, 0x4004, 0x7008, 0x64CE, 0x6673, 0x26CF, 0x2670, 0x8F2C, 0xBC27, - 0x30F7, 0xE2CF, 0xFAF7, 0x6CDC, 0x26C4, 0xA20E, 0x0357, 0xA304, 0x0357, 0x88D8, 0x8F1C, - 0x3230, 0x8F01, 0xB036, 0xFFFF, 0xFB53, 0xA202, 0x0359, 0x2620, 0x8F0D, 0x2622, 0x4043, - 0x8F05, 0xB20A, 0x099A, 0x189A, 0xB22A, 0x21EC, 0x8C08, 0x18A2, 0xB22A, 0x13D7, 0x8C04, - 0x188A, 0xB20A, 0x17AE, 0x188A, 0x8C07, 0xA302, 0x0359, 0xBC22, 0x30F7, 0xB03E, 0xFFFF, - 0xFB53, 0xA202, 0x0359, 0x144A, 0x2442, 0x28F1, 0x8894, 0x8EC0, 0x8E00, 0xE441, 0xBC22, - 0x2131, 0xBC23, 0x00B0, 0xBC24, 0x2135, 0x6915, 0x3B53, 0xFA93, 0xBC22, 0x2136, 0xE4C3, - 0xB800, 0xA210, 0xBC80, 0x4000, 0x6915, 0xE902, 0xBC21, 0x30F9, 0xA203, 0x035B, 0xBC22, - 0x035C, 0x6E73, 0xFA31, 0xBC24, 0x30FA, 0x28C1, 0xA300, 0x035B, 0xFA94, 0x6E08, 0xBC40, - 0x6A37, 0x2143, 0x2A83, 0x88C0, 0xDFCE, 0xDFEF, 0xBC20, 0x0A30, 0xBC88, 0x0000, 0xCFCE, - 0xA300, 0x035A, 0xCFEF, 0x2444, 0xA203, 0x035E, 0xB580, 0x0001, 0x6000, 0xE4CE, 0xB000, - 0x2000, 0xE54F, 0xA300, 0x035E, 0xBC21, 0x3244, 0xBC80, 0x4000, 0xBC21, 0x2111, 0x8EC0, - 0xE9FE, 0xFB30, 0xBC22, 0x3105, 0xBC24, 0x30FB, 0xE906, 0xA203, 0x035A, 0xBC25, 0xF000, - 0xFA52, 0xFA94, 0xA21E, 0x0314, 0xA21C, 0x015F, 0x66BA, 0xDF84, 0xDFA2, 0x7050, 0xDF63, - 0xDFDC, 0xDF5E, 0xBC22, 0x0CCD, 0xBC24, 0x2131, 0xBC25, 0x199A, 0xBC3B, 0x009C, 0xBC3D, - 0x02E0, 0xBD0A, 0x131D, 0xA206, 0x035F, 0x700E, 0x8F67, 0x63ED, 0xCFBE, 0xB47C, 0x000E, - 0xB11E, 0x0005, 0xA200, 0x0360, 0x0E08, 0x2810, 0xB5FE, 0x000E, 0x380E, 0x1BB7, 0xB000, - 0x0400, 0xBCF0, 0xC000, 0xA306, 0x035F, 0xBCED, 0x4000, 0x283A, 0xA307, 0x0360, 0x888C, - 0xBC27, 0x00B1, 0x6EE7, 0x7B97, 0x606C, 0x0F40, 0xBC27, 0x3244, 0xBCED, 0xC000, 0x7016, - 0xBC1F, 0x6EE6, 0xDF40, 0xBC20, 0x2135, 0xBC21, 0x2111, 0xFA10, 0xBC8E, 0x0000, 0xFB36, - 0xB560, 0x0001, 0xCF80, 0xBC8C, 0x0000, 0xBC3E, 0x00C2, 0x63E1, 0x8FC0, 0x3F3E, 0xFF18, - 0xDFC0, 0xCFC2, 0xA302, 0x015F, 0xCF43, 0x8EC0, 0xE9FA, 0xA303, 0x0314, 0xA203, 0x0366, - 0x6D06, 0x6044, 0xBC22, 0x0367, 0xA203, 0x0363, 0x08C3, 0xA206, 0x0355, 0x6E00, 0xBC45, - 0xBCC9, 0x8000, 0x698C, 0x2146, 0x24B5, 0xA205, 0x0364, 0x28E5, 0x2444, 0xA303, 0x0366, - 0x7000, 0x244E, 0x7008, 0xE54F, 0x1918, 0x2640, 0x8F4A, 0xE14F, 0xA20E, 0x0367, 0xE540, - 0xA300, 0x0367, 0xBC22, 0x3101, 0xE0C1, 0x2409, 0xFA52, 0x88C8, 0x218A, 0x240C, 0x3840, - 0x8F0B, 0xBC20, 0x2004, 0x8E00, 0xFA10, 0x2680, 0x3802, 0x8F04, 0xBC20, 0x3100, 0x5FE4, - 0xFA10, 0x2108, 0x181C, 0xA201, 0x0369, 0xA204, 0x0365, 0x3449, 0x084C, 0xBC24, 0x30FE, - 0x2610, 0xA301, 0x0369, 0xA201, 0x0362, 0xFA94, 0x195A, 0x0048, 0x3340, 0x8F12, 0x2650, - 0x8F14, 0xBC20, 0x3103, 0xA204, 0x0361, 0x69B0, 0x3A10, 0x8F02, 0x2188, 0x8C04, 0x185A, - 0x0410, 0x2088, 0x1853, 0xA301, 0x0361, 0x3822, 0x8D05, 0xBC20, 0x30FE, 0xB028, 0xFFFF, - 0xFB12, 0x8EC0, 0xA301, 0x0362, 0x8E00, 0x8EB8, 0xBC20, 0x303D, 0x4021, 0xFA10, 0xA202, - 0x0462, 0x1408, 0x3491, 0xB000, 0xFFFF, 0x0810, 0x2680, 0xA300, 0x0462, 0xA200, 0x0460, - 0x8F36, 0xBC23, 0x3041, 0xBC22, 0x3040, 0x6980, 0x3A73, 0xA204, 0x045B, 0xA21C, 0x045A, - 0xFA52, 0x8F06, 0x21A3, 0x8F02, 0x387C, 0x201A, 0x8F07, 0x4000, 0x8D06, 0x21A3, 0x8F03, - 0x387C, 0x219A, 0x8F00, 0x3801, 0xBC22, 0x3043, 0x8E00, 0xFA52, 0x2620, 0x8F17, 0xA202, - 0x0465, 0x26A0, 0x8F12, 0xBC22, 0x2004, 0x8E00, 0xFA52, 0x26A0, 0x8F0C, 0xBC22, 0x303F, - 0xA203, 0x045E, 0xFA52, 0x209A, 0x8F05, 0xBC22, 0x303E, 0xA203, 0x045D, 0xFA52, 0x211A, - 0x8F00, 0x4000, 0xBC22, 0x3044, 0xA300, 0x0460, 0xFA50, 0xA202, 0x0463, 0x2680, 0x8F03, - 0x4000, 0x8C42, 0xA300, 0x0461, 0xBC20, 0x2015, 0xBC23, 0x3048, 0xFA10, 0xFA73, 0x2003, - 0x4000, 0x3860, 0x8F1A, 0xBC20, 0x2080, 0xBC24, 0x3046, 0xFA10, 0xFA94, 0x2184, 0x3803, - 0x8F07, 0xBC20, 0x3047, 0xBC24, 0x2015, 0xFA10, 0xFA94, 0x2020, 0x3803, 0x8F08, 0xBC20, - 0x2083, 0xBC24, 0x3045, 0xFA10, 0xFA94, 0x2004, 0x3803, 0x8F00, 0x3801, 0x2680, 0x8F02, - 0xBC20, 0x304A, 0x8C05, 0xFA10, 0xBC20, 0x3049, 0x8E00, 0xFA10, 0xBC24, 0x304B, 0x0E10, - 0xFA92, 0x2102, 0x8F04, 0xBC22, 0x304C, 0x8E00, 0xFA52, 0x2002, 0x1890, 0x33A0, 0x180B, - 0xA300, 0x0461, 0xBC20, 0x3042, 0xA201, 0x0461, 0xA203, 0x0460, 0xB512, 0x0001, 0xFA10, - 0xA302, 0x0463, 0x0059, 0x2600, 0x8F0A, 0x2601, 0x8F07, 0x2602, 0x4042, 0x8F02, 0x2603, - 0x8C04, 0x1851, 0x8C02, 0x4001, 0x4021, 0xBC20, 0x200D, 0x8EC0, 0x8E00, 0xFB11, 0xBC20, - 0x0375, 0xBC21, 0x0372, 0xBC22, 0x036A, 0xBC3C, 0x0376, 0x700E, 0xA0C1, 0x70CF, 0xA040, - 0xBC23, 0x038F, 0xBC09, 0x1482, 0x2442, 0xE104, 0xBC26, 0x1180, 0x6A39, 0xA185, 0xBC21, - 0xF2C0, 0x6A3A, 0x61C7, 0x6A3F, 0xA5A5, 0xE584, 0xE184, 0xE185, 0xBC21, 0x1CF0, 0x6A3A, - 0x61C7, 0xBC21, 0x8620, 0x6A3E, 0x65A5, 0x88C0, 0x2442, 0x6A39, 0xA584, 0xBC21, 0x0840, - 0x6A3A, 0x6184, 0x6A3F, 0xA185, 0xBC21, 0x0A40, 0x6A3A, 0x61C7, 0xBC21, 0x8620, 0x6A3E, - 0x65A5, 0x88C0, 0x8E00, 0xE584, 0xE464, 0xBC23, 0x038F, 0xBC21, 0x0375, 0x8E00, 0xE4C0, - 0x8EB8, 0x0000, 0xA202, 0x0372, 0xA203, 0x0395, 0x009A, 0xB214, 0x0014, 0x8F16, 0xB024, - 0xFFEC, 0x5FC3, 0x04DA, 0x3B43, 0xA200, 0x0375, 0xBC3C, 0x0376, 0x433E, 0xBC23, 0x305B, - 0x77F6, 0xAA18, 0x6910, 0xBA64, 0xE065, 0x8A05, 0xBBB0, 0xC81D, 0x4023, 0x8880, 0xA303, - 0x0373, 0x8EC0, 0xA302, 0x0395, 0x8E00, 0xBC20, 0x03BA, 0xA203, 0x03B9, 0x6D20, 0xA00E, - 0xB206, 0x0080, 0xE04F, 0xE14C, 0x8F36, 0x88B0, 0x40A4, 0xB226, 0x01B0, 0x40C5, 0x1925, - 0x401C, 0xB226, 0x06C0, 0x7007, 0xA45C, 0x4083, 0x6607, 0x255E, 0xA205, 0x0396, 0xA202, - 0x03BE, 0xA31C, 0x03B9, 0xA31C, 0x03BA, 0x2268, 0x8F03, 0x8E00, 0x8C03, 0xB034, 0xFFFF, - 0x34D1, 0xA300, 0x0396, 0xA202, 0x03BD, 0xB236, 0x000A, 0x8F05, 0xB226, 0xFFF6, 0x3B83, - 0x8F04, 0x4002, 0x401C, 0x8D02, 0x4022, 0x401C, 0x26A1, 0x8F00, 0x40A0, 0xA31C, 0x03BE, - 0xA302, 0x03BD, 0x8C0D, 0xA300, 0x0397, 0x2421, 0xBC25, 0x1000, 0x28E5, 0x34D9, 0xA303, - 0x03B9, 0xA30E, 0x03BA, 0xE44F, 0xE54C, 0xA200, 0x0397, 0x3048, 0xBC20, 0x7E7E, 0x8EC0, - 0xBC82, 0x0000, 0x8E00, 0xBC22, 0x2131, 0xBC24, 0x00B2, 0x77F6, 0xBB54, 0xBC23, 0x2135, - 0xBC22, 0x2136, 0x7087, 0xBA73, 0x6910, 0xFA52, 0xBCB2, 0xC000, 0xBCA2, 0x8000, 0xA200, - 0x03A6, 0x3F1A, 0xBC22, 0x3060, 0xBC3C, 0x03A8, 0x6910, 0xBF10, 0xE902, 0xFA43, 0x6960, - 0x3E18, 0x8A06, 0xBF8C, 0x8618, 0xBF8C, 0xA410, 0x2A42, 0xBC23, 0x03C4, 0x88D0, 0x6D26, - 0xA19E, 0xBC27, 0x03C7, 0x6E62, 0xE15A, 0x6E7A, 0x5FC2, 0x6E72, 0x21DC, 0x88A0, 0x6D4E, - 0xA38E, 0xA206, 0x03A5, 0xA300, 0x03A6, 0x6998, 0x23CF, 0xE24C, 0xDFE5, 0x8F03, 0x8E00, - 0x8C16, 0xB06C, 0xFFFF, 0x88E0, 0x39FC, 0x39DE, 0x399A, 0x8880, 0xBC21, 0x2045, 0x2442, - 0x7007, 0xBB30, 0xBC20, 0x2046, 0xBC21, 0x305A, 0x7009, 0xBB16, 0x7007, 0x3A30, 0x3B4C, - 0x15B0, 0x240A, 0x4020, 0x28C8, 0xBC21, 0x03BF, 0xE7CF, 0xA30E, 0x03C7, 0xBCAA, 0x8000, - 0xA306, 0x03A5, 0x690B, 0x60C6, 0x6E20, 0x664C, 0x6E7F, 0x2482, 0x6E77, 0xA0C7, 0x6E66, - 0xA4C6, 0x6A3A, 0x0FC1, 0xBC20, 0x3068, 0x6915, 0x24CC, 0xA30E, 0x03C4, 0x6915, 0xE5CF, - 0x6915, 0xBA01, 0x6A34, 0x7A02, 0x6A3C, 0xBA02, 0xBC40, 0x1205, 0x6A3E, 0xBA02, 0x6A3A, - 0xBA16, 0xBC40, 0x1A03, 0x6A3A, 0x8FE0, 0x28DE, 0x88A0, 0xBC40, 0x1E05, 0xBC40, 0x1602, - 0xBC23, 0x28BE, 0xA204, 0x03C3, 0xBCA4, 0xC000, 0xB038, 0x4000, 0x009A, 0xA302, 0x03C3, - 0xBC23, 0x3244, 0xBCA4, 0xC000, 0xBC23, 0x2111, 0x8EC0, 0xE9FE, 0xFB72, 0xA200, 0x0398, - 0x2457, 0xBC22, 0x306D, 0x77FE, 0xA441, 0xBC3C, 0x0399, 0x7067, 0xBA43, 0x6E73, 0xE800, - 0x6915, 0x3C1C, 0x8A0A, 0xBB8C, 0x861C, 0xBB8C, 0xA413, 0x28DA, 0xA300, 0x0398, 0x8EC0, - 0x8880, 0x8E00, 0xE902, 0xA203, 0x0372, 0x6CAC, 0x1FD5, 0x8F06, 0xBC20, 0x036A, 0xBC21, - 0x213E, 0xBC0B, 0x15CB, 0xFA32, 0xE402, 0xBC02, 0x1445, 0xBC02, 0x148A, 0xA201, 0x0372, - 0x41E3, 0xA202, 0x0373, 0x0459, 0x2621, 0xA301, 0x0372, 0x8F07, 0x26A2, 0x8F1A, 0xA200, - 0x0374, 0xBC02, 0x1AEC, 0x4002, 0x8D16, 0x3820, 0xBC02, 0x14AE, 0x3820, 0xBC02, 0x1504, - 0xA201, 0x03B8, 0x2610, 0x8F04, 0xB002, 0xFFFF, 0x4002, 0x8C08, 0xA300, 0x03B8, 0x3820, - 0xBC02, 0x15A4, 0xA300, 0x0374, 0x4042, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0xA302, 0x0373, - 0x3E02, 0xBC20, 0x03E5, 0x3820, 0xE002, 0xE003, 0xE044, 0xE402, 0xE484, 0xE042, 0xE482, - 0x7008, 0xA443, 0xA200, 0x03E4, 0x0C10, 0xA300, 0x03E4, 0x3E01, 0x8EB8, 0xBC20, 0x30BF, - 0xA201, 0x0447, 0xFA10, 0x6852, 0x2902, 0xBC22, 0x30BB, 0xBC23, 0x30BD, 0x18D3, 0xA202, - 0x0449, 0xFA64, 0x3491, 0x6835, 0x3A73, 0x8F65, 0xA202, 0x0448, 0x2153, 0x8F07, 0x3449, - 0x3401, 0xA080, 0x4000, 0x4002, 0x8C5B, 0xA300, 0x0447, 0xBC20, 0x30C1, 0xA201, 0x03CF, - 0xBC22, 0x30BA, 0x6114, 0x5FF5, 0x701F, 0x3A10, 0x4023, 0x6220, 0xDFDC, 0xB412, 0x0001, - 0x2620, 0x8F04, 0x7000, 0x5FC1, 0xA301, 0x03CB, 0xA301, 0x03CC, 0xBC22, 0x30C0, 0xA201, - 0x03D6, 0x3449, 0xFA52, 0x20CA, 0xA301, 0x03D6, 0x8F19, 0x4041, 0x0801, 0x2600, 0x8F13, - 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0xFF7F, 0xFA12, 0x0851, - 0x7008, 0x3B11, 0xBC02, 0x05B3, 0x7010, 0x4FC0, 0x8C05, 0xA301, 0x009A, 0x8C02, 0x4060, - 0xCFC0, 0x3302, 0x8F18, 0x3541, 0xBC21, 0x1111, 0x2829, 0x3200, 0x380E, 0x8F0D, 0x70F0, - 0x4FF5, 0xBC22, 0x2042, 0xBC23, 0x2041, 0xBC24, 0xEEEF, 0xBC0D, 0x1681, 0xFB51, 0x6008, - 0x3B70, 0x8C06, 0x4002, 0x8C04, 0x7000, 0x8FF5, 0x7000, 0x8FF5, 0xA302, 0x0448, 0x8EC0, - 0xE9FE, 0xA302, 0x0449, 0xA200, 0x03CE, 0xB300, 0x6600, 0x4020, 0x3820, 0x8F00, 0xA200, - 0x044A, 0x2681, 0xA300, 0x044A, 0x8F27, 0xA200, 0x03D2, 0x2600, 0xBC22, 0x2044, 0x4000, - 0x1801, 0xFA53, 0x0118, 0xBC23, 0x2043, 0xFB54, 0xFA72, 0x0448, 0x0091, 0xA204, 0x03D5, - 0xFB72, 0xB5C8, 0x0001, 0x0061, 0xA202, 0x044C, 0x004A, 0xBC23, 0x2042, 0xA204, 0x0448, - 0xA300, 0x03D2, 0xBC22, 0x2041, 0xA205, 0x03CA, 0x0020, 0xFB71, 0xA300, 0x0448, 0xFB55, - 0xBC00, 0x1612, 0x8EB8, 0xA201, 0x03D5, 0x3312, 0xA201, 0x03CE, 0x8F0A, 0xB312, 0x3F00, - 0x8F07, 0xA202, 0x03D4, 0x224A, 0x8F04, 0x4001, 0x7008, 0x2441, 0xA300, 0x03D0, 0x8EB8, - 0x2680, 0xA200, 0x03CF, 0x8F0A, 0xFA11, 0xB312, 0x0198, 0x8F05, 0xA201, 0x03D3, 0x1641, - 0x40A2, 0x2E4A, 0x8F00, 0x3401, 0x3402, 0xBC21, 0x30BB, 0x2041, 0x8F04, 0x4000, 0xA300, - 0x03D0, 0xBC20, 0x30B3, 0xA201, 0x03D0, 0x2611, 0x4001, 0x8F00, 0xFA11, 0xA300, 0x03CF, - 0x8EC0, 0xB592, 0x0006, 0xA301, 0x03CE, 0x6EF5, 0x6080, 0xE906, 0x7007, 0x20C1, 0xA204, - 0x03CE, 0x6313, 0x1F83, 0x65B0, 0x5FA2, 0x65C0, 0x1FE3, 0x7000, 0x9FC0, 0x4020, 0x4207, - 0x5FE6, 0xBC23, 0xC6C0, 0xBC21, 0x6E40, 0x38A2, 0xBC0F, 0x1720, 0x2F68, 0x2F20, 0x8F00, - 0x0D6B, 0x2FB0, 0x8F00, 0x0D69, 0x1785, 0x3491, 0x4044, 0x6815, 0x0FE4, 0x4147, 0x8FEE, - 0x6E1D, 0x0FA2, 0xB036, 0xFFFB, 0x69A8, 0x5FE3, 0x8F08, 0xB42A, 0x0006, 0xBC23, 0x03FF, - 0x0893, 0xA31C, 0x03D5, 0xDF62, 0xA302, 0x03D2, 0x7000, 0x8F83, 0xBC21, 0x7F80, 0x3882, - 0xBD10, 0x174F, 0x2E90, 0x2F68, 0x2FB0, 0x8F0B, 0x26B1, 0x8F02, 0x09E9, 0x2670, 0x8F03, - 0xBC26, 0x6E40, 0x0D6E, 0x8C03, 0x1785, 0x3521, 0x3491, 0x8E00, 0xCFA0, 0x2601, 0xBC20, - 0x03FF, 0x8F27, 0xB41A, 0x0006, 0x0808, 0x2680, 0x8F01, 0x32C2, 0x8F00, 0x403C, 0x26B0, - 0xDF7C, 0x8F12, 0xBC22, 0x30B3, 0x6E20, 0x8FC3, 0xBC21, 0x30BB, 0xBD04, 0x1772, 0xFA86, - 0x6881, 0xBA86, 0x8F01, 0x2246, 0x8F03, 0x21E1, 0x1914, 0xA304, 0x03CF, 0x8E00, 0x8D0B, - 0xCFC0, 0x6330, 0x8FE0, 0xA305, 0x03D4, 0xA304, 0x03D5, 0xBC02, 0x16C7, 0x8D01, 0xCFC3, - 0x6EAF, 0x8F60, 0xA303, 0x03D3, 0x8EC0, 0xE9FA, 0xA305, 0x03D4, 0xB022, 0x3098, 0xA200, - 0x03D2, 0x6980, 0x3A45, 0x8F26, 0x4343, 0x0519, 0x4003, 0xBC0C, 0x1799, 0xFA46, 0x0DAE, - 0x2246, 0x8F01, 0x3882, 0x3803, 0x8E00, 0x2680, 0x8F18, 0x2610, 0x4046, 0x4022, 0x1996, - 0x4205, 0x3290, 0x0569, 0xA306, 0x03D5, 0x8F02, 0x3250, 0x8F00, 0x14D5, 0xBC21, 0x30A9, - 0x044C, 0x3210, 0x8F01, 0x1451, 0x00D9, 0xA201, 0x03D3, 0x0C4B, 0xA301, 0x03D3, 0x8EC0, - 0xA300, 0x03D2, 0x8E00, 0xE904, 0xA201, 0x03CC, 0xA200, 0x03CD, 0x7000, 0x9F81, 0xB000, - 0xFFFF, 0xA302, 0x03CE, 0x6984, 0x1FB5, 0x8F4C, 0x2680, 0x8F47, 0xA201, 0x03CF, 0x344A, - 0xBC20, 0x30BB, 0x21C8, 0xBC20, 0x30B3, 0x1841, 0x6E18, 0x9FC1, 0xBC21, 0x03D7, 0xBC02, - 0x1700, 0xA201, 0x03CF, 0x7000, 0x8FC0, 0xA204, 0x0444, 0x6882, 0x1FC1, 0x4023, 0x8F06, - 0xB018, 0xFFFF, 0x6CC7, 0x9FC0, 0x6626, 0x9FE1, 0x8C20, 0xDF82, 0x3422, 0x6CE1, 0x1FE0, - 0x181A, 0x2681, 0xA300, 0x03CB, 0x8F15, 0xBC20, 0x0444, 0x8A09, 0xE402, 0xFA31, 0xA21E, - 0x03D3, 0xB592, 0x0006, 0xA302, 0x03D0, 0xA303, 0x03D1, 0xA302, 0x03D5, 0xA302, 0x03D2, - 0xA301, 0x03CE, 0xA31E, 0x03CA, 0xBC02, 0x1690, 0xCFE2, 0xCFC1, 0xA302, 0x0444, 0xA301, - 0x03CF, 0x8C26, 0x71A0, 0x0F85, 0x8C23, 0xCF85, 0x2600, 0x4681, 0x1848, 0x7008, 0x1FC1, - 0x2C48, 0x401E, 0xBC21, 0x03D9, 0xBC20, 0x03D7, 0xA31E, 0x03CF, 0x1848, 0x3862, 0xBC02, - 0x1700, 0xA202, 0x03CF, 0x6988, 0x0FC0, 0x4025, 0x8F09, 0x0885, 0x2620, 0x4006, 0x8F00, - 0xBC02, 0x15FE, 0xA306, 0x0444, 0x8C02, 0x4680, 0xCF85, 0xCFB5, 0xA305, 0x03CC, 0x8EC0, - 0xE9FC, 0xA300, 0x03CD, 0xE902, 0xA203, 0x03CD, 0xB036, 0xFFFF, 0x698C, 0x1FC3, 0xDFF5, - 0xBC01, 0x190F, 0xA201, 0x03D1, 0x2690, 0xBC01, 0x1920, 0xB016, 0xFFE6, 0x4340, 0x2048, - 0xBC01, 0x190A, 0xB306, 0x0019, 0xBC01, 0x18F4, 0xA201, 0x03D2, 0xB306, 0x0018, 0x8F7E, - 0xB306, 0x0017, 0x8F4E, 0xCFC3, 0xB316, 0x0016, 0xBC01, 0x1920, 0xA203, 0x044B, 0x26B0, - 0xBC01, 0x1920, 0x4023, 0x2610, 0xA303, 0x044B, 0x4002, 0x8F0F, 0xBC21, 0x03D7, 0xBC02, - 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F07, 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, - 0x03CA, 0xA303, 0x0444, 0xA203, 0x0444, 0xB236, 0x0080, 0x8F19, 0xA203, 0x0446, 0xB236, - 0x0080, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8F09, 0xA200, 0x0445, 0xB200, 0x0080, 0x8F12, - 0x8A03, 0xE483, 0x3569, 0xBC02, 0x15FE, 0x8D0D, 0x8A03, 0xE483, 0xB05A, 0xFFFF, 0xBC02, - 0x15FE, 0x8D06, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8A03, 0xE483, 0xA200, 0x03D2, 0xDFC5, - 0xBC02, 0x16DA, 0xBC02, 0x1690, 0x8D73, 0x2610, 0xBC21, 0x03D7, 0x8F24, 0xBC40, 0x1880, - 0x4023, 0x2E03, 0xBC40, 0x1C80, 0x4002, 0x185A, 0xA200, 0x03D9, 0x2E03, 0x0001, 0xA300, - 0x03D9, 0xBC21, 0x03D9, 0x441A, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F0B, 0xA203, - 0x0445, 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31A, 0x044C, 0xA303, 0x0445, 0x8C04, - 0x4003, 0x8C02, 0x4003, 0x4003, 0x8C47, 0xA303, 0x044B, 0x2610, 0xBC21, 0x03D9, 0x4002, - 0x4023, 0x8F3D, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F37, 0xA203, 0x0446, 0x441E, - 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31E, 0x044C, 0xA303, 0x0446, 0x8D2C, 0xA203, - 0x03D4, 0x2630, 0xBC20, 0x03D2, 0x8F00, 0xBC02, 0x16C7, 0xA203, 0x03D2, 0x26B0, 0x8F1E, - 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, 0x03CA, 0xA303, 0x0444, 0x8D16, 0x4661, - 0x044B, 0xBC02, 0x1787, 0x8D11, 0xA200, 0x03D7, 0x4010, 0x4023, 0xA300, 0x03CA, 0xA310, - 0x03D1, 0xBC21, 0x03D7, 0x3843, 0xBC02, 0x1700, 0x4683, 0xA310, 0x044C, 0xDFC3, 0xCFF5, - 0xCFC3, 0x8EC0, 0xE9FE, 0xA303, 0x03CD, 0xE902, 0x8E00, 0xDFD5, 0x3E02, 0xA200, 0x03E3, - 0x7000, 0x5FE0, 0xA301, 0x03E3, 0x2600, 0x8F12, 0xA200, 0x03CB, 0x2680, 0x8F02, 0xA200, - 0x03CC, 0x2600, 0x8F02, 0xA200, 0x03CD, 0x2681, 0x8F06, 0xBC20, 0x03E5, 0xBC21, 0x03D7, - 0xBD04, 0x1945, 0xE002, 0xE482, 0x3E01, 0x8C0E, 0xCFE0, 0xA200, 0x03CB, 0x2601, 0x8F02, - 0xBC02, 0x17B9, 0x8C04, 0xCFE0, 0xBC02, 0x183D, 0xCFE0, 0xB000, 0xFFFF, 0x69A0, 0x1FE0, - 0x8FEF, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2048, 0x8E00, 0xFA10, 0x2600, - 0x8F06, 0xBC20, 0x2043, 0xBC22, 0x2044, 0x4001, 0x8EC0, 0xFB11, 0xFB51, 0x8EB8, 0xA201, - 0x03E1, 0xBC22, 0x3079, 0xFA20, 0xB030, 0xFFD8, 0xB302, 0x308C, 0xA303, 0x03EE, 0x8EC0, - 0x1851, 0xA301, 0x03E1, 0xA203, 0x03E3, 0x34D9, 0xA200, 0x03FD, 0x5FFA, 0xBC3C, 0x03FA, - 0x407E, 0xA303, 0x03E3, 0x7009, 0x2461, 0x6CE4, 0x3C1E, 0x4003, 0xA205, 0x03E4, 0x19E3, - 0x0C95, 0x2131, 0x6555, 0x2042, 0x1863, 0xA300, 0x03FD, 0x33A0, 0xB05A, 0x03E6, 0x1823, - 0x637E, 0x22C0, 0x2E04, 0xB5FE, 0x0005, 0x01C7, 0x6678, 0xE6A7, 0x684C, 0xA2C2, 0x18E3, - 0x0C0B, 0x2E94, 0x8EC0, 0x0097, 0xE6C2, 0xA200, 0x03DB, 0xBC3C, 0x03DC, 0x409E, 0x405A, - 0xBC22, 0x03EA, 0x77FE, 0xAA18, 0xE05F, 0xBC23, 0x308C, 0xE51F, 0xBD03, 0x19C3, 0x6910, - 0xBC1C, 0xFA65, 0x8A03, 0xBBB0, 0xCA1C, 0x28EC, 0x88C0, 0x8E00, 0xE504, 0x8EC0, 0xEA18, - 0xA300, 0x03DB, 0xBC26, 0x03E2, 0xA202, 0x03E9, 0xE343, 0x698C, 0x2902, 0xA203, 0x03E0, - 0xBC01, 0x1A6F, 0xA204, 0x03F6, 0x69B0, 0x5FD5, 0x3883, 0x8F02, 0x4004, 0xA304, 0x03F6, - 0x3342, 0x8F68, 0xBC26, 0x03F7, 0x602D, 0x215F, 0x26C0, 0xE55F, 0x8F61, 0x6E11, 0xBCC5, - 0x6CF4, 0x2341, 0x4004, 0x4026, 0x19B4, 0x3210, 0x8F00, 0x35B1, 0xBC40, 0x1102, 0x3220, - 0x8F00, 0x35B1, 0x2663, 0xA207, 0x03F1, 0x8F01, 0x26E0, 0x8F09, 0x2435, 0x2429, 0x2412, - 0x20B5, 0x8F00, 0x35F9, 0x2095, 0x8F00, 0xB07E, 0xFFFF, 0xA202, 0x03F2, 0x3551, 0xB20A, - 0x004C, 0x3844, 0x8F0B, 0xB23E, 0x0008, 0x38A7, 0x4024, 0x38E2, 0x8F05, 0x38E5, 0x3378, - 0x3882, 0x8F01, 0x5FE4, 0x38E2, 0x38A2, 0x00E3, 0xA305, 0x03F2, 0xA307, 0x03F1, 0xDFE3, - 0xBC02, 0x197C, 0xA203, 0x03F5, 0xA202, 0x03F3, 0x6056, 0x0FE4, 0x3491, 0xB438, 0x0001, - 0xA305, 0x03F5, 0xB204, 0x0208, 0x8F14, 0xA202, 0x03F5, 0xA205, 0x03F4, 0xB524, 0x0001, - 0x20AA, 0x401D, 0x8F06, 0xA202, 0x03E4, 0x4024, 0x0C94, 0x3883, 0xA302, 0x03E4, 0x4643, - 0xA31D, 0x03F5, 0xA31D, 0x03F4, 0x4002, 0xA303, 0x03EF, 0xA302, 0x03F3, 0xA202, 0x03EF, - 0x2222, 0x8F09, 0x3491, 0x2262, 0x8F11, 0xA202, 0x03E9, 0x8E00, 0xE142, 0xA302, 0x03F0, - 0x8D0C, 0xA201, 0x03F0, 0x7008, 0x9FE4, 0xBC02, 0x197C, 0xA202, 0x03F4, 0x6024, 0x0FE4, - 0xA302, 0x03F4, 0xB008, 0xFFFF, 0x69A0, 0x0FD5, 0x8F79, 0x700F, 0xDFD5, 0xBC02, 0x196D, - 0xA31F, 0x03F6, 0xCFD5, 0x8D73, 0x7766, 0xE145, 0xA202, 0x03F0, 0x3822, 0xBC3D, 0x03F1, - 0x453F, 0xA204, 0x0442, 0x69AC, 0x64E5, 0x6E28, 0x6A38, 0x8F02, 0xA207, 0x03EE, 0x26F0, - 0x8F15, 0xE142, 0xE2C5, 0x6175, 0x60C2, 0x615A, 0xA242, 0x243F, 0x242D, 0x017D, 0xB05A, - 0x0008, 0xB4DA, 0x0004, 0x356A, 0xB4DA, 0x0002, 0x016A, 0x206A, 0x5FE2, 0x1955, 0x8C02, - 0xE605, 0x5FE2, 0xB006, 0xFFFF, 0x2680, 0x8F3F, 0xA203, 0x0443, 0x34D9, 0xA303, 0x0443, - 0xB236, 0x00F0, 0x8F08, 0xDFC1, 0xDFF5, 0xBC24, 0x041A, 0xBC02, 0x196D, 0xCFF5, 0x8C31, - 0xCFC1, 0xBC24, 0x041A, 0x4003, 0x6E38, 0xE200, 0x4005, 0xA071, 0xC000, 0xBD27, 0x1ABA, - 0x6659, 0x6200, 0xA071, 0xC000, 0x1965, 0xA207, 0x03EE, 0xB0DA, 0x041A, 0x003D, 0xB450, - 0x0001, 0xA305, 0x03EF, 0x26D0, 0x4685, 0x4667, 0x405F, 0x19EF, 0xE71F, 0xA307, 0x03CD, - 0xBC25, 0x03F0, 0x8A06, 0xE703, 0x8A0A, 0xE683, 0x8A03, 0xE682, 0xBC3F, 0x03FA, 0xA303, - 0x03CC, 0xA31F, 0x03FD, 0xA303, 0x03CB, 0xA304, 0x0442, 0xA301, 0x03F0, 0xE9FE, 0xA300, - 0x03E0, 0xA202, 0x03E9, 0x8EC0, 0x3491, 0xA302, 0x03E9, 0x0000, 0xE902, 0xA201, 0x03DB, - 0xDFD5, 0x6960, 0x24C0, 0xBC02, 0x19AA, 0xBC20, 0x03EA, 0xA300, 0x03E9, 0xBD04, 0x1AFD, - 0xBC02, 0x19C8, 0x8E00, 0x8E00, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0xA200, - 0x0466, 0x6980, 0x1FC0, 0xBC01, 0x1BB4, 0xB310, 0x00FF, 0xBC01, 0x1BBA, 0xA201, 0x0468, - 0xA202, 0x0467, 0xB034, 0xFFFF, 0x3310, 0xBC20, 0x0450, 0xBC01, 0x1BAA, 0x3880, 0x4021, - 0xE20E, 0xE24F, 0xBC24, 0x3002, 0x88D8, 0xFA94, 0xBCDB, 0x0000, 0xBC24, 0x3009, 0x2435, - 0xFA94, 0x2134, 0x4004, 0x19CC, 0xA307, 0x0465, 0xBC27, 0x3013, 0xA305, 0x0464, 0xFAF7, - 0x21B7, 0x198C, 0x26E0, 0x8F04, 0xBC26, 0x2004, 0x8E00, 0xFAD6, 0x2660, 0x8F03, 0xA206, - 0x046A, 0x35B1, 0xA306, 0x046A, 0xBC27, 0x3011, 0xA206, 0x0469, 0x35B1, 0xFAF7, 0x2037, - 0xA306, 0x0469, 0x8F0F, 0xBC26, 0x3012, 0xA207, 0x046A, 0xFAD6, 0x21BE, 0x8F03, 0x8E00, - 0x8C04, 0xA304, 0x046B, 0xA301, 0x046B, 0xA304, 0x046A, 0xA304, 0x0469, 0xBC26, 0x300A, - 0x8E00, 0xFAD6, 0x212E, 0x0526, 0x19B5, 0x202C, 0xBC25, 0x2017, 0x1926, 0x6CA8, 0x3AB2, - 0xBC25, 0x3006, 0x8F02, 0xA303, 0x0467, 0xBC25, 0x3003, 0xBC23, 0x300C, 0x8E00, 0xFA73, - 0x2013, 0x8F13, 0xBC26, 0x300D, 0x34E9, 0xFAD6, 0x2016, 0x8F0C, 0xBC26, 0x300E, 0x8E00, - 0xFAD6, 0x2016, 0x8F05, 0xBC26, 0x300F, 0x8E00, 0xFAD6, 0x2016, 0x8C02, 0x18DD, 0x34EA, - 0x38A3, 0x2442, 0xFAB2, 0x28E2, 0x88A0, 0xBC23, 0x300B, 0xB524, 0x0006, 0xFA73, 0xB424, - 0x0006, 0x32B0, 0x8F01, 0x4003, 0x049A, 0xBC23, 0x2020, 0xB524, 0x0001, 0xFA73, 0x0859, - 0x2690, 0xBC23, 0x2003, 0x8F02, 0x4001, 0x8C0C, 0xFB71, 0x3451, 0x8C09, 0x7000, 0x7B71, - 0xB012, 0xFFFF, 0xA301, 0x0468, 0xA303, 0x0467, 0x4001, 0xE401, 0xE441, 0x8D06, 0xBC20, - 0x2003, 0x5FC1, 0xFA12, 0x0851, 0xFB11, 0xCFC0, 0x3401, 0xE9FE, 0xBC21, 0x00FF, 0x8EC0, - 0x0801, 0xA300, 0x0466, 0xE904, 0xBC21, 0x2016, 0x6E05, 0x1FD5, 0xB000, 0xFFFD, 0xBC22, - 0x3000, 0xFA31, 0x7000, 0x6441, 0xFA52, 0xBC23, 0x044D, 0xBC24, 0x044F, 0xBC02, 0x1E36, - 0xA200, 0x044F, 0x7003, 0x0FD5, 0xBC22, 0x4444, 0x6915, 0xE9FC, 0x2456, 0x28C2, 0xBC20, - 0x3001, 0x8890, 0xBC22, 0x0450, 0x6910, 0xBA10, 0x28C8, 0x6E00, 0xBC41, 0x88B4, 0x7101, - 0x2145, 0x24A9, 0x28DC, 0x2444, 0x8EC0, 0xE54F, 0xE44E, 0xBC21, 0x3033, 0xBC22, 0x201E, - 0xB580, 0x0001, 0xFA31, 0x4043, 0xFA54, 0x0923, 0xB012, 0xFFFF, 0x2220, 0x8F01, 0x3310, - 0x8FF7, 0x8EB8, 0xA200, 0x0470, 0x3280, 0xBC21, 0x0477, 0xBC22, 0x0474, 0x184A, 0xA202, - 0x046D, 0xBC40, 0x1083, 0x6CE8, 0xE084, 0x66B7, 0x20C1, 0x8F04, 0xB044, 0x3014, 0x8E00, - 0xFA94, 0x211C, 0x8F0B, 0x32A0, 0xB044, 0xFFFF, 0x8F07, 0xB058, 0x3017, 0x8E00, 0xFAB5, - 0x219D, 0x8F02, 0x3844, 0x8D01, 0x3491, 0xB034, 0x301A, 0xA302, 0x046D, 0xFA73, 0xBC22, - 0x3023, 0x1A59, 0x2419, 0xFA52, 0x211A, 0x8F05, 0x3300, 0x8F02, 0xBC20, 0x301F, 0x8C05, - 0xFA10, 0xBC20, 0x301E, 0x8E00, 0xFA10, 0x4202, 0x0490, 0xA203, 0x0473, 0x2442, 0x28DA, - 0x28C8, 0x8884, 0xBC21, 0x0200, 0xBC90, 0x4000, 0xBC22, 0x0800, 0xBC80, 0x8000, 0xBC22, - 0x3024, 0x2690, 0x4004, 0xA203, 0x0454, 0x1820, 0xFA52, 0x0E4B, 0x210A, 0xA300, 0x0473, - 0x8F04, 0xBC20, 0x3025, 0x8E00, 0xFA10, 0x2008, 0x1881, 0x8EC0, 0xA302, 0x0454, 0x8E00, - 0xBC20, 0x200F, 0xA201, 0x046E, 0xFA10, 0x2680, 0x8F00, 0x3449, 0x2682, 0x4000, 0x8F00, - 0xB012, 0xFFFF, 0x3210, 0x8F02, 0x3317, 0x40E0, 0x1801, 0x8EC0, 0xA300, 0x046E, 0x8E00, - 0xBC20, 0x3031, 0xBC21, 0x2000, 0xFA12, 0x0811, 0x2241, 0xA200, 0x046E, 0x8F03, 0x4E00, - 0x0810, 0xB400, 0x0004, 0xB010, 0x3026, 0xA203, 0x0454, 0xFA31, 0xBC24, 0x1000, 0x0994, - 0x1AD9, 0x2274, 0x34D9, 0x4025, 0x111D, 0x8F01, 0x41E3, 0x0913, 0x4002, 0x3240, 0x3862, - 0x8F02, 0x4103, 0x2123, 0x18DC, 0xB5C6, 0x0001, 0xBC26, 0x302E, 0x0E4C, 0x6980, 0x3AD6, - 0xBC24, 0x200B, 0xB5F0, 0x0004, 0xA303, 0x046F, 0x1895, 0x0E4E, 0xA300, 0x046E, 0x00FB, - 0x6988, 0x3B91, 0x8F01, 0x2681, 0x8F00, 0x4002, 0x2620, 0x8F01, 0x2682, 0x8F00, 0x4002, - 0x2620, 0x8F01, 0x2683, 0x8F00, 0x4002, 0x2620, 0x8F40, 0x2604, 0x8F3E, 0x2620, 0x8F01, - 0x2685, 0x8F00, 0x4002, 0x2620, 0x8F33, 0x2606, 0x8F31, 0x2620, 0x8F01, 0x2687, 0x8F33, - 0xBC20, 0x2005, 0xBC21, 0x0200, 0xFA10, 0x0801, 0x2680, 0x8F20, 0xA200, 0x0452, 0x2602, - 0x8F11, 0x2603, 0x8F03, 0x4060, 0x8C25, 0xA300, 0x0452, 0xBC20, 0x3036, 0xBC21, 0x2081, - 0xFA10, 0xFA31, 0x2088, 0x4040, 0x8F18, 0xA300, 0x0452, 0x8D17, 0xBC20, 0x3037, 0xBC21, - 0x2081, 0xFA10, 0xFA31, 0x2188, 0x4060, 0x8F0C, 0xA300, 0x0452, 0x8D0B, 0x4060, 0xA300, - 0x0452, 0x8D07, 0x4020, 0x8C05, 0xA300, 0x0452, 0x4000, 0xA300, 0x0452, 0xA200, 0x0452, - 0xB000, 0x3039, 0xBC21, 0x2006, 0xFA10, 0x8EC0, 0x0003, 0xFB30, 0xA200, 0x0474, 0xA201, - 0x0453, 0xB500, 0x0007, 0xBC22, 0x302F, 0x1AC8, 0x241B, 0xFA52, 0x211A, 0x8F02, 0xBC22, - 0x3021, 0x8C05, 0xFA52, 0xBC22, 0x3020, 0x8E00, 0xFA52, 0xA204, 0x046C, 0xBC23, 0x8000, - 0x04DA, 0x3340, 0x2457, 0x2456, 0x8F04, 0x2454, 0x28CB, 0x28C2, 0x8C03, 0x8880, 0xA30E, - 0x046C, 0xBC21, 0x3030, 0xBC22, 0x3032, 0xA300, 0x0453, 0xFA31, 0xFA52, 0xBC23, 0x1000, - 0x0913, 0x1A08, 0xBC25, 0x0400, 0x2263, 0xBC81, 0x4000, 0x8F01, 0xBC20, 0x0FFF, 0x0810, - 0xBC21, 0x200C, 0x8EC0, 0x8E00, 0xFB30, 0x0000, 0xBC20, 0x3022, 0xBC21, 0x3038, 0x7017, - 0xBA10, 0x700C, 0x3A31, 0xA310, 0x046C, 0xA31E, 0x0470, 0xA300, 0x0454, 0xA301, 0x0452, - 0x6EE5, 0x6800, 0xBD0F, 0x1D81, 0xBC20, 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, - 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3034, 0xBC21, - 0x2005, 0xFA10, 0xB000, 0x0201, 0x7000, 0x3B30, 0xBC02, 0x1BF3, 0x8E00, 0x8E00, 0xBC20, - 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, - 0x1C65, 0xBC02, 0x1C7B, 0xA201, 0x046E, 0xBC20, 0x3034, 0xB012, 0x3026, 0x6EAF, 0x3A10, - 0xBC22, 0x3035, 0xBC23, 0x2005, 0xFA31, 0xB000, 0x0201, 0xFA52, 0xA301, 0x0454, 0xFB70, - 0xBC24, 0x2009, 0x8EC0, 0x7008, 0x3B72, 0xFB90, 0xE902, 0xA200, 0x0470, 0x6CC0, 0x1FD5, - 0x8F34, 0xA200, 0x0472, 0xA201, 0x0471, 0x2680, 0x8F0F, 0xB312, 0x007F, 0xBC20, 0x3035, - 0x8F07, 0xFA10, 0xB000, 0x0101, 0xBC21, 0x2005, 0x8C03, 0x7008, 0x3B30, 0x4020, 0x8C1E, - 0xA300, 0x0472, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0x3300, 0xA300, 0x0471, 0x8F0A, - 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3035, 0xBC21, 0x2005, 0xFA10, 0x8C07, 0x7000, - 0x3B30, 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0x4000, 0xA300, 0x0472, 0xBC02, 0x1D12, 0x8D13, - 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0xA200, 0x0470, 0xB000, 0xFFFF, 0xA201, 0x0471, 0xA300, - 0x0470, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0xA300, 0x0471, 0x7008, 0x4FD5, 0xBC20, - 0x2009, 0x8EC0, 0xE9FE, 0xFB11, 0xBC21, 0x2010, 0xE908, 0xBC20, 0x200E, 0xFA31, 0xFA12, - 0xBC24, 0x7F00, 0x6E1D, 0x1F95, 0xB036, 0xFFF9, 0x0894, 0xB444, 0x0008, 0x6E10, 0xE581, - 0xFA10, 0x73F8, 0x65C4, 0x0801, 0xBC21, 0x0474, 0xBC40, 0x1500, 0xDFA1, 0xBD03, 0x1E2E, - 0xE0DC, 0xE101, 0xDFC2, 0xDFFC, 0xBC02, 0x1E46, 0xCFE1, 0x63A0, 0x4FA1, 0x6D34, 0x4FC2, - 0x6E20, 0x6480, 0xB406, 0x0001, 0xBC40, 0x1E00, 0xDFA1, 0x7000, 0x0F95, 0xBC21, 0x2009, - 0x8EC0, 0xE9F8, 0xFB30, 0xE040, 0x6C00, 0x6246, 0x6E08, 0xE185, 0x6681, 0xA1C6, 0x24B5, - 0x28C2, 0x2444, 0x8E00, 0xE5CF, 0x88B8, 0x8EC0, 0xE4CE, 0xE643, 0x3291, 0x8F0C, 0x24C1, - 0x1448, 0x41A2, 0x2442, 0x4403, 0x0410, 0x28CB, 0xB580, 0x0004, 0x8890, 0x8EC0, 0x0001, - 0x8E00, 0x8EC0, 0x4000, 0x8E00, 0xBC20, 0x2092, 0x4041, 0xFA10, 0xBC22, 0x2093, 0x0841, - 0x6984, 0xBA51, 0x8F0F, 0x4022, 0x0802, 0x2681, 0x8F17, 0xBC20, 0x2000, 0x21C8, 0xBC20, - 0x2095, 0x8F02, 0x8EC0, 0xE0C1, 0xFB11, 0xFA31, 0xFB11, 0x8EB8, 0xBC20, 0x2094, 0xBC22, - 0x2000, 0x6872, 0xBA10, 0x8F02, 0x8EC0, 0xE4C0, 0x8E00, 0x8EC0, 0xFB30, 0x8E00, 0x8EB8, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; -#endif - -const unsigned short bin_patch_E1[] = { - 0x2000, 0x21FF, 0xBC24, 0x20A0, 0x8E00, 0xFA95, 0xB30A, 0x06AF, 0x8F2E, 0xB30A, 0x08E5, - 0x8F07, 0xBC25, 0x08E5, 0xFB95, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x0841, 0xBC25, - 0x06AF, 0xFB95, 0x5400, 0xBC21, 0xD0B1, 0xBC02, 0x07CA, 0x5500, 0xBC21, 0x07C2, 0xBC02, - 0x07CA, 0x40A0, 0xBC21, 0x0359, 0xBC02, 0x07CA, 0x41A0, 0xBC21, 0x00A0, 0xBC02, 0x07CA, - 0x41C0, 0xBC21, 0x4208, 0xBC02, 0x07CA, 0x4380, 0xBC21, 0x2800, 0xBC02, 0x07CA, 0x4E04, - 0xBC00, 0x08E6, 0x4344, 0xBC25, 0x0400, 0x2620, 0x8F06, 0xBC02, 0x07F0, 0x5404, 0x4025, - 0xBC02, 0x07FB, 0xBC00, 0x06C1, 0xBC02, 0x07FB, 0x5404, 0x4025, 0xBC02, 0x07F0, 0xBC00, - 0x06C1, 0xBDC8, 0x404E, 0x8E00, 0xFA11, 0xBC00, 0x0630, 0x8E00, 0x8E00, 0x8E00, 0xBC21, - 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01BB, 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, - 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, 0x201A, 0xBC00, 0x0161, 0x4044, 0xBC25, 0x1000, - 0xBC02, 0x07F0, 0x4E24, 0xBC00, 0x0705, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x078A, - 0xBC24, 0x2080, 0x6C88, 0x3A10, 0xFA94, 0xB548, 0x0005, 0xBC00, 0x0E9F, 0xE902, 0xBC26, - 0x2023, 0xDFE4, 0xBC24, 0x2000, 0xFAD6, 0x0934, 0x26C0, 0x8F01, 0xBC26, 0x3056, 0x8D02, - 0xBC26, 0x31F9, 0xCFE4, 0xE9FE, 0xBC00, 0x0FED, 0xBC20, 0x2090, 0xBC21, 0x0100, 0xFA12, - 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, 0x8E00, 0xBC20, 0x2090, 0xBC21, - 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, 0xBC21, 0x2091, 0x714F, 0xBA10, - 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, 0x0457, 0x0802, 0xA204, 0x0458, - 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x0459, 0xFB32, 0x8F0C, 0x2601, 0x4FE1, - 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, 0x8F05, 0xBC02, 0x40E7, 0x8D04, - 0xBC21, 0x03FF, 0xA301, 0x0456, 0xA301, 0x0455, 0xA200, 0x0458, 0xA201, 0x0457, 0x260F, - 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, 0xA300, 0x0458, 0x8EC0, 0xE9FE, - 0xA301, 0x0457, 0xBC22, 0x3105, 0xA200, 0x0313, 0x77DE, 0xBA52, 0x3BC2, 0xBC22, 0x2091, - 0xBC3C, 0x02E0, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, 0xAA18, 0xBC24, 0x0B12, 0xFB54, - 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0355, 0xFB53, 0xA203, 0x035A, 0xFB53, - 0xA203, 0x0464, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, 0x047F, 0xFB54, 0xFB53, 0xA204, - 0x0480, 0xFB54, 0xA203, 0x0481, 0xFB53, 0xA204, 0x0361, 0xA203, 0x0362, 0xFB54, 0xFB53, - 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_patch_E2[] = { - 0x2000, 0x21FF, 0x8E00, 0x8E00, 0x8E00, 0xBC21, 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01A9, - 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, - 0x201A, 0xBC00, 0x014F, 0x240C, 0xA301, 0x047F, 0xA30F, 0x0480, 0xA30E, 0x0481, 0xBC00, - 0x1353, 0x5380, 0xBC21, 0xAC40, 0xBC02, 0x07EA, 0x4380, 0xBC21, 0x2C00, 0xBC02, 0x07EA, - 0x43A0, 0xBC21, 0xFB40, 0xBC02, 0x07EA, 0x43C0, 0xBC21, 0x0546, 0xBC02, 0x07EA, 0x43E0, - 0xBC21, 0xFB3C, 0xBC02, 0x07EA, 0x4400, 0xBC21, 0x0537, 0xBC02, 0x07EA, 0x4E04, 0xBC00, - 0x092A, 0x4025, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, 0x084A, 0x2610, 0x8F01, 0xBC02, - 0x081B, 0x8D02, 0xBC02, 0x0810, 0x4E24, 0xBC00, 0x0722, 0x4280, 0xBC02, 0x07EA, 0xBC22, - 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, 0x1853, 0x42C0, 0xBC02, 0x07EA, 0x4240, 0xBC21, - 0xE400, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x0010, 0xBC02, 0x07EA, 0x4040, 0xBC21, 0x0FFB, - 0xBC02, 0x07EA, 0x4220, 0xBC21, 0x2020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, - 0x07F8, 0x4220, 0xBC21, 0x1020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07F8, - 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07EA, 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07F8, 0x4240, - 0xBC21, 0xE407, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x7010, 0xBC02, 0x07EA, 0xBC20, 0x0064, - 0x4461, 0xBC02, 0x07F8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07EA, 0xBC00, 0x0794, 0xBC20, - 0x2090, 0xBC21, 0x0100, 0xFA12, 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, - 0x8E00, 0xBC20, 0x2090, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, - 0xBC21, 0x2091, 0x714F, 0xBA10, 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, - 0x045B, 0x0802, 0xA204, 0x045C, 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x045D, - 0xFB32, 0x8F0C, 0x2601, 0x4FE1, 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, - 0x8F05, 0xBC02, 0x40F6, 0x8D04, 0xBC21, 0x03FF, 0xA301, 0x045A, 0xA301, 0x0459, 0xA200, - 0x045C, 0xA201, 0x045B, 0x260F, 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, - 0xA300, 0x045C, 0x8EC0, 0xE9FE, 0xA301, 0x045B, 0xBC22, 0x3105, 0xA200, 0x0314, 0x77DE, - 0xBA52, 0x3BC2, 0xBC22, 0x2091, 0xBC3C, 0x02E1, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, - 0xAA18, 0xBC24, 0x0B12, 0xFB54, 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0356, - 0xFB53, 0xA203, 0x035D, 0xFB53, 0xA203, 0x0468, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, - 0x0483, 0xFB54, 0xFB53, 0xA204, 0x0484, 0xFB54, 0xA203, 0x0485, 0xFB53, 0xA204, 0x0364, - 0xA203, 0x0365, 0xFB54, 0xFB53, 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_coeff_E1[] = { - 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C, - 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0008, 0x0001, 0x0001, 0x0CCD, - 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E, - 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008, - 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008, - 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000, - 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF, - 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000, - 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47, - 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA, - 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92, - 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, - 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C, - 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C, - 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, - 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC, - 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350, - 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0, - 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715, - 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139, - 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC, - 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43, - 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5, - 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C, - 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B, - 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6, - 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2, - 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001, - 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100, - 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00, - 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200, - 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900, - 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680, - 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0, - 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026, - 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214, - 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848, - 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F, - 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A, - 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800, - 0x0400, 0x000C, 0x0005, 0x000C, 0x00FF, 0x083D, 0x4000, 0x062F, 0x404C, 0x01B9, 0x4052, - 0x0155, 0x405B, 0x0704, 0x4069, 0x0786, 0x4071, 0x0E9A, 0x4077, 0x0FEB, 0x4080, 0x0000, - 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E, - 0x4093, 0xFEE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_coeff_E2[] = { - 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C, - 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0020, 0x0001, 0x0001, 0x0CCD, - 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E, - 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008, - 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008, - 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000, - 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF, - 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000, - 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47, - 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA, - 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92, - 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, - 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C, - 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C, - 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, - 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC, - 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350, - 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0, - 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715, - 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139, - 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC, - 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43, - 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5, - 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C, - 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B, - 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6, - 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2, - 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001, - 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100, - 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00, - 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200, - 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900, - 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680, - 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0, - 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026, - 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214, - 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848, - 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F, - 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A, - 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800, - 0x0400, 0x000C, 0x0005, 0x000C, 0x0038, 0x01A7, 0x4000, 0x0143, 0x4009, 0x0000, 0x0000, - 0x0929, 0x4020, 0x0721, 0x4041, 0x0755, 0x4052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E, - 0x0001, 0xFEE0, 0xFED8, 0xFED8, 0x0000, 0x0040, 0x40A2, 0x0000 -}; - -const unsigned short bin_hw_coeff[] = { - 0x0000, 0x0027, 0xfffd, 0xfffc, 0x0002, 0x000a, 0x0005, 0xfff4, 0xffed, 0x0004, 0x0024, - 0x0018, 0xffd8, 0xffb1, 0x0006, 0x00cd, 0x0179, 0x0001, 0xfffd, 0x0004, 0x0000, 0x000b, - 0xffe0, 0x0047, 0xff75, 0x0134, 0x04c4, 0xff9c, 0x000f, 0x0007, 0xfff7, 0x0006, 0x0001, - 0x0008, 0xffdf, 0x005d, 0xff18, 0x034a, 0xff81, 0x03d9, 0x00a6, 0xfffe, 0x0012, 0xffa6, - 0x0000 -}; diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h deleted file mode 100644 index 0be899f59..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h +++ /dev/null @@ -1,81 +0,0 @@ -/* mt6628_fm.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- head file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __MT6626_FM_H__ -#define __MT6626_FM_H__ - -#include "fm_typedef.h" - -/* #define FM_PowerOn_with_ShortAntenna */ -#define MT6626_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define MT6626_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define MT6626_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define MT6626_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define MT6626_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define MT6626_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define MT6626_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define MT6626_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define MT6626_DEEMPHASIS_50us TRUE - -/* customer need customize the I2C port */ -#if 0 /* def MT6516 */ -#define MT6626_I2C_PORT 2 -#else -#define MT6626_I2C_PORT 0 -#endif - -#define MT6626_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */ -#define MT6626_MAX_COUNT 100 -#define MT6626_SCANTBL_SIZE 16 /* 16*uinit16_t */ - -#define AFC_ON 0x01 -#if AFC_ON -#define FM_MAIN_CTRL_INIT 0x480 -#else -#define FM_MAIN_CTRL_INIT 0x080 -#endif - -/* FM_MAIN_EXTINTRMASK */ -#define FM_EXT_STC_DONE_MASK 0x01 -#define FM_EXT_RDS_MASK 0x20 - -#define MT6626_FM_STC_DONE_TIMEOUT 12 /* second */ - -/* FM_MAIN_CHANDETSTAT */ -#define FM_MAIN_CHANDET_MASK 0x3FF0 /* D4~D13 in address 6FH */ -#define FM_MAIN_CHANDET_SHIFT 0x04 -#define FM_HOST_CHAN 0x3FF0 - -/* FM_MAIN_CFG1(0x36) && FM_MAIN_CFG2(0x37) */ -#define MT6626_FM_SEEK_UP 0x0 -#define MT6626_FM_SEEK_DOWN 0x01 -#define MT6626_FM_SCAN_UP 0x0 -#define MT6626_FM_SCAN_DOWN 0x01 -#define MT6626_FM_SPACE_INVALID 0x0 -#define MT6626_FM_SPACE_50K 0x01 -#define MT6626_FM_SPACE_100K 0x02 -#define MT6626_FM_SPACE_200K 0x04 - -#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */ -#define MT6626_DEV "MT6626" - -#endif /* end of #ifndef __MT6626_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h deleted file mode 100644 index d95df49aa..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __MT6626_FM_CMD_H__ -#define __MT6626_FM_CMD_H__ - -#include <linux/types.h> -#include "fm_typedef.h" - -/* FM basic-operation's opcode */ -#define FM_BOP_BASE (0x80) -enum { - FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00), - FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01), - FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02), - FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03), - FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04), - FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05) -}; - -/* FM BOP's size */ -#define FM_WRITE_BASIC_OP_SIZE (3) -#define FM_UDELAY_BASIC_OP_SIZE (4) -#define FM_RD_UNTIL_BASIC_OP_SIZE (5) -#define FM_MODIFY_BASIC_OP_SIZE (5) -#define FM_MSLEEP_BASIC_OP_SIZE (4) - -fm_s32 mt6626_pwrup_clock_on(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_pwrdown(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_rampdown(fm_u8 *tx_buf, fm_s32 tx_buf_size); -fm_s32 mt6626_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq); -fm_s32 mt6626_seek(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 seekdir, fm_u16 space, - fm_u16 max_freq, fm_u16 min_freq); -fm_s32 mt6626_scan(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 scandir, fm_u16 space, - fm_u16 max_freq, fm_u16 min_freq); -fm_s32 mt6626_get_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr); -fm_s32 mt6626_set_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr, fm_u16 value); -fm_s32 mt6626_patch_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6626_coeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6626_hwcoeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6626_rom_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h deleted file mode 100644 index e401f04f9..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __MT6626_FM_LIB_H__ -#define __MT6626_FM_LIB_H__ - -#include "fm_typedef.h" - -enum { - DSPPATCH = 0xFFF9, - USDELAY = 0xFFFA, - MSDELAY = 0xFFFB, - HW_VER = 0xFFFD, - POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */ - POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */ -}; - -enum { - FM_PUS_DSPPATCH = DSPPATCH, - FM_PUS_USDELAY = USDELAY, - FM_PUS_MSDELAY = MSDELAY, - FM_PUS_HW_VER = HW_VER, - FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */ - FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */ - FM_PUS_MAX -}; - -enum { - DSP_PATH = 0x02, - DSP_COEFF = 0x03, - DSP_HW_COEFF = 0x04 -}; - -enum IMG_TYPE { - IMG_WRONG = 0, - IMG_ROM, - IMG_PATCH, - IMG_COEFFICIENT, - IMG_HW_COEFFICIENT -}; - -enum { - mt6626_E1 = 0, - mt6626_E2 -}; - -enum { - FM_LONG_ANA = 0, - FM_SHORT_ANA -}; - -struct ctrl_word_operation { - fm_u16 addr; - fm_u16 and; - fm_u16 or; -}; - -enum { - MT66x6_BT = 0, - MT66x6_FM, - MT66x6_MAX -}; - -enum { - MT6626_I2S_ON = 0, - MT6626_I2S_OFF -}; - -enum { - MT6626_I2S_MASTER = 0, - MT6626_I2S_SLAVE -}; - -enum { - MT6626_I2S_32K = 0, - MT6626_I2S_44K, - MT6626_I2S_48K -}; - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h deleted file mode 100644 index 85bd4d2ff..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h +++ /dev/null @@ -1,68 +0,0 @@ -/* mt6626_fm_ctrl_link.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- setup data link - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MT6626_FM_LINK_H__ -#define __MT6626_FM_LINK_H__ - -#include <linux/wait.h> -#include "fm_link.h" -#include "fm_utils.h" - -#define RX_BUF_SIZE 128 -#define TX_BUF_SIZE 1024 - -#define SW_RETRY_CNT (2) -#define SW_RETRY_CNT_MAX (5) -#define SW_WAIT_TIMEOUT_MAX (100) - -/* FM operation timeout define for error handle */ -#define TEST_TIMEOUT (3) -#define FSPI_EN_TIMEOUT (3) -#define FSPI_MUXSEL_TIMEOUT (3) -#define FSPI_RD_TIMEOUT (3) -#define FSPI_WR_TIMEOUT (3) -#define I2C_RD_TIMEOUT (3) -#define I2C_WR_TIMEOUT (3) -#define EN_TIMEOUT (5) -#define RST_TIMEOUT (3) -#define TUNE_TIMEOUT (3) -#define SEEK_TIMEOUT (10) -#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */ -#define RDS_RX_EN_TIMEOUT (3) -#define RDS_DATA_TIMEOUT (100) -#define RAMPDOWN_TIMEOUT (3) -#define MCUCLK_TIMEOUT (3) -#define MODEMCLK_TIMEOUT (3) -#define RDS_TX_TIMEOUT (3) -#define PATCH_TIMEOUT (5) -#define COEFF_TIMEOUT (5) -#define HWCOEFF_TIMEOUT (5) -#define ROM_TIMEOUT (5) - -struct fm_link_event { - struct fm_flag_event *ln_event; - struct fm_res_ctx result; /* seek/scan/read/RDS */ -}; - - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h deleted file mode 100644 index bc2c9e50b..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __MT6626_FM_REG_H__ -#define __MT6626_FM_REG_H__ - -enum MT6626_REG { - FM_MAIN_CG1_CTRL = 0x60, - FM_MAIN_CG2_CTRL = 0x61, - FM_MAIN_HWVER = 0x62, - FM_MAIN_CTRL = 0x63, - FM_CHANNEL_SET = 0x65, - FM_MAIN_CFG1 = 0x66, - FM_MAIN_CFG2 = 0x67, - FM_MAIN_MCLKDESENSE = 0x38, - FM_MAIN_INTR = 0x69, - FM_MAIN_INTRMASK = 0x6A, - FM_MAIN_EXTINTRMASK = 0x6B, - FM_RSSI_IND = 0x6C, - FM_RSSI_TH = 0x6D, - FM_MAIN_RESET = 0x6E, - FM_MAIN_CHANDETSTAT = 0x6F, - FM_RDS_CFG0 = 0x80, - FM_RDS_INFO = 0x81, - FM_RDS_DATA_REG = 0x82, - FM_RDS_GOODBK_CNT = 0x83, - FM_RDS_BADBK_CNT = 0x84, - FM_RDS_PWDI = 0x85, - FM_RDS_PWDQ = 0x86, - FM_RDS_FIFO_STATUS0 = 0x87, - FM_FT_CON9 = 0x8F, - FM_DSP_PATCH_CTRL = 0x90, - FM_DSP_PATCH_OFFSET = 0x91, - FM_DSP_PATCH_DATA = 0x92, - FM_DSP_MEM_CTRL4 = 0x93, - FM_ADDR_PAMD = 0xB4, - FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6, - FM_RDS_POINTER = 0xF0, -}; - -/* RDS_BDGRP_ABD_CTRL_REG */ -enum { - BDGRP_ABD_EN = 0x0001, - BER_RUN = 0x2000 -}; -#define FM_DAC_CON1 0x83 -#define FM_DAC_CON2 0x84 -#define FM_FT_CON0 0x86 -enum { - FT_EN = 0x0001 -}; - -#define FM_I2S_CON0 0x90 -enum { - I2S_EN = 0x0001, - FORMAT = 0x0002, - WLEN = 0x0004, - I2S_SRC = 0x0008 -}; - -/* FM_MAIN_CTRL */ -enum { - TUNE = 0x0001, - SEEK = 0x0002, - SCAN = 0x0004, - RDS_MASK = 0x0010, - MUTE = 0x0020, - RDS_BRST = 0x0040, - RAMP_DOWN = 0x0100, -}; - -/* FM_MAIN_INTR */ -enum { - FM_INTR_STC_DONE = 0x0001, - FM_INTR_IQCAL_DONE = 0x0002, - FM_INTR_DESENSE_HIT = 0x0004, - FM_INTR_CHNL_CHG = 0x0008, - FM_INTR_SW_INTR = 0x0010, - FM_INTR_RDS = 0x0020 -}; - -enum { - ANTENNA_TYPE = 0x0010, -}; - -#endif /* __MT6626_FM_REG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c b/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c deleted file mode 100644 index e69de29bb..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c +++ /dev/null diff --git a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h b/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h deleted file mode 100644 index 99407933e..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef __MTK_FM_H__ -#define __MTK_FM_H__ - - -#endif /* __MTK_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c deleted file mode 100644 index 087bf4ce2..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c +++ /dev/null @@ -1,690 +0,0 @@ -#include <linux/kernel.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" -#include "fm_cust_cfg.h" - -#include "mt6626_fm_reg.h" -#include "mt6626_fm_link.h" -#include "mt6626_fm.h" -#include "mt6626_fm_cmd.h" - -static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_WRITE_BASIC_OP; - buf[1] = FM_WRITE_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((value) & 0x00FF); - buf[4] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - - return (FM_WRITE_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_UDELAY_BASIC_OP; - buf[1] = FM_UDELAY_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_UDELAY_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_RD_UNTIL_BASIC_OP; - buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask) & 0x00FF); - buf[4] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_RD_UNTIL_BASIC_OP_SIZE + 2); -} - -static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MODIFY_BASIC_OP; - buf[1] = FM_MODIFY_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask_and) & 0x00FF); - buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask_or) & 0x00FF); - buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_MODIFY_BASIC_OP_SIZE + 2); -} - -#if 0 -static fm_s32 fm_bop_msleep(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MSLEEP_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MSLEEP_BASIC_OP; - buf[1] = FM_MSLEEP_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_MSLEEP_BASIC_OP_SIZE + 2); -} -#endif - -/* - * mt6626_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* FM Digital Clock enable */ - pkt_size += fm_bop_write(0x60, 0x3000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3000 */ - pkt_size += fm_bop_write(0x60, 0x3001, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3001 */ - pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */ - pkt_size += fm_bop_write(0x60, 0x3003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3003 */ - pkt_size += fm_bop_write(0x60, 0x3007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3007 */ - /* no low power mode, analog line in, long antenna */ - pkt_size += fm_bop_modify(0x61, 0xFF63, 0x0000, &buf[pkt_size], buf_size - pkt_size); - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_patch_download - Wholechip FM Power Up: step 3, download patch to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_PATCH_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_COEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_rom_download - Wholechip FM Power Up: step 3,download rom to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6626_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ROM_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */ - pkt_size += fm_bop_write(0x6A, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 0020 */ - pkt_size += fm_bop_write(0x6B, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0020 */ - pkt_size += fm_bop_write(0xA0, 0xD0B1, &buf[pkt_size], buf_size - pkt_size); /* wr a0 D0B1 */ - pkt_size += fm_bop_write(0x60, 0x300F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 300F */ - pkt_size += fm_bop_write(0x61, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 61 3 */ - pkt_size += fm_bop_write(0x61, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 2 */ - /* pkt_size += fm_bop_modify(0x61, 0xFFFF, 0x0002, &buf[pkt_size], buf_size - pkt_size); */ - /* pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_pwrdown - Wholechip FM Power down: Digital Modem Power Down - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_pwrdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Disable HW clock control */ - pkt_size += fm_bop_write(0x60, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 330F */ - /* Reset ASIP */ - pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */ - /* digital core + digital rgf reset */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - /* Disable all clock */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - /* Reset rgfrf */ - pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_rampdown - f/w will wait for STC_DONE interrupt - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6626_rampdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - /* Clear DSP state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */ - /* Set DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */ - /* @Wait for STC_DONE interrupt@ */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Clear DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_tune - execute tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6626_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - freq = (freq - 640) * 2; - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* Set desired channel & channel parameter */ - pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* Enable hardware controlled tuning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFE, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - /* Wait for STC_DONE interrupt */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_seek - execute seek action, - * @buf - target buf - * @buf_size - buffer size - * @seekdir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6626_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (seekdir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - min_freq = (min_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6626_scan - execute scan action, - * @buf - target buf - * @buf_size - buffer size - * @scandir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6626_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (scandir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */ - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - min_freq = (min_freq - 640) * 2; - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled scanning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -fm_s32 mt6626_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_READ_OPCODE; - buf[2] = 0x01; - buf[3] = 0x00; - buf[4] = addr; - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - return 5; -} - -fm_s32 mt6626_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_WRITE_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = addr; - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c deleted file mode 100644 index b6cf3d794..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c +++ /dev/null @@ -1,135 +0,0 @@ -/* mt6626_fm_eint.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6626 FM Radio Driver -- EINT functions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_eint.h" - -#if 0 /* def MT6516 */ -#include <mach/mt6516_eint.h> -#include <mach/mt6516_gpio.h> -#endif -#if 0 /* def MT6573 */ -#include <mach/mt6573_eint.h> -#include <mach/mt6573_gpio.h> -#endif -#if 1 /* def MT6575 */ -#include <mach/eint.h> -#include <mach/mt6575_gpio.h> -#endif - -#include <cust_eint.h> -#include <cust_gpio_usage.h> - -struct fm_eint_interface { - void (*mask) (fm_u32 eint_num); - void (*unmask) (fm_u32 eint_num); - void (*set_hw_debounce) (fm_u32 eint_num, fm_u32 ms); - void (*set_polarity) (fm_u32 eint_num, fm_u32 pol); - fm_u32(*set_sens) (fm_u32 eint_num, fm_u32 sens); - void (*registration) (fm_u32 eint_num, fm_u32 is_deb_en, fm_u32 pol, - void (EINT_FUNC_PTR) (void), fm_u32 is_auto_umask); - fm_s32(*init) (void); -}; - - -#if 0 /* def MT6516 */ -extern void MT6516_EINTIRQUnmask(fm_u32 line); -extern void MT6516_EINTIRQMask(fm_u32 line); -extern void MT6516_EINT_Set_HW_Debounce(fm_u8 eintno, fm_u32 ms); -extern fm_u32 MT6516_EINT_Set_Sensitivity(fm_u8 eintno, kal_bool sens); -extern void MT6516_EINT_Registration(fm_u8 eintno, kal_bool Dbounce_En, - kal_bool ACT_Polarity, void (EINT_FUNC_PTR) (void), - kal_bool auto_umask); -#endif - -static struct fm_eint_interface fm_eint_ops = { -#if 0 /* def MT6516 */ - .mask = MT6516_EINTIRQMask, - .unmask = MT6516_EINTIRQUnmask, - .set_hw_debounce = MT6516_EINT_Set_HW_Debounce, - .set_polarity = NULL, - .set_sens = MT6516_EINT_Set_Sensitivity, - .registration = MT6516_EINT_Registration, - .init = NULL, -#else - .mask = mt65xx_eint_mask, - .unmask = mt65xx_eint_unmask, - .set_hw_debounce = mt65xx_eint_set_hw_debounce, - .set_polarity = mt65xx_eint_set_polarity, - .set_sens = mt65xx_eint_set_sens, - .registration = mt65xx_eint_registration, - .init = mt65xx_eint_init, -#endif -}; - -fm_s32 fm_enable_eint(void) -{ - WCN_DBG(FM_INF | EINT, "%s\n", __func__); - fm_eint_ops.unmask(CUST_EINT_FM_RDS_NUM); - return 0; -} - -fm_s32 fm_disable_eint(void) -{ - WCN_DBG(FM_INF | EINT, "%s\n", __func__); - fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM); - return 0; -} - -fm_s32 fm_request_eint(void (*parser) (void)) -{ - WCN_DBG(FM_NTC | EINT, "%s\n", __func__); - fm_eint_ops.set_sens(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_SENSITIVE); - fm_eint_ops.set_hw_debounce(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_DEBOUNCE_CN); - fm_eint_ops.registration(CUST_EINT_FM_RDS_NUM, - CUST_EINT_FM_RDS_DEBOUNCE_EN, - CUST_EINT_FM_RDS_POLARITY, parser, 0); - fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM); - return 0; -} - -fm_s32 fm_eint_pin_cfg(fm_s32 mode) -{ - int ret = 0; - - WCN_DBG(FM_NTC | EINT, "%s\n", __func__); - - switch (mode) { - case FM_EINT_PIN_EINT_MODE: - mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO); - mt_set_gpio_pull_enable(GPIO_FM_RDS_PIN, GPIO_PULL_ENABLE); - mt_set_gpio_pull_select(GPIO_FM_RDS_PIN, GPIO_PULL_UP); - mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_EINT); - break; - case FM_EINT_PIN_GPIO_MODE: - mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_FM_RDS_PIN, GPIO_DIR_IN); - break; - default: - ret = -1; - break; - } - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c deleted file mode 100644 index b3afd4aad..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c +++ /dev/null @@ -1,1153 +0,0 @@ -#include <linux/semaphore.h> -#include <linux/delay.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_config.h" - -#include "mt6626_fm_reg.h" -#include "mt6626_fm.h" -#include "mt6626_drv_dsp.h" -#include "mt6626_fm_link.h" -#include "mt6626_fm_lib.h" -#include "mt6626_fm_cmd.h" - -#define MT6626_FM_PATCH_PATH "/etc/firmware/mt6626_fm_patch.bin" -#define MT6626_FM_COEFF_PATH "/etc/firmware/mt6626_fm_coeff.bin" -#define MT6626_FM_HWCOEFF_PATH "/etc/firmware/mt6626_fm_hwcoeff.bin" -#define MT6626_FM_ROM_PATH "/etc/firmware/mt6626_fm_rom.bin" - -extern void fm_low_power_wa(int fmon); -extern void mt66x6_poweron(int idx); -extern void mt66x6_poweroff(int idx); - -static struct fm_callback *fm_cb_op; - -/* mt6626 FM Receiver Power Up Sequence*/ -static const struct ctrl_word_operation PowerOnSetting[] = { - /* @Wholechip FM Power Up: FM Digital Clock enable */ - {0x60, 0x0, 0x3000}, - {0x60, 0x0, 0x3001}, - {MSDELAY, 0x0, 0x0003}, /* Delay 3ms */ - {0x60, 0x0, 0x3003}, - {0x60, 0x0, 0x3007}, - {HW_VER, 0x99, 0x0000}, - /* antenna and audio path config */ -#ifdef FMRADIO_I2S_SUPPORT -#ifdef FM_PowerOn_with_ShortAntenna - {0x61, 0xFF73, 0x0090}, /* no low power mode, I2S, short antenna */ -#else - {0x61, 0xFF73, 0x0080}, /* no low power mode, I2S, long antenna */ -#endif - {0x9B, 0xFFF7, 0x0008}, /* 0000->master, 0008->slave */ - {0x5F, 0xE7FF, 0x0000}, /* 0000->32K, 0800->44.1K, 1000->48K */ - /* {0x61, 0xFF73, 0x0080},//no low power mode, I2S, long antenna, 0xff63 */ - /* {0x9B, 0xFFF7, 0x0008},//0000->master, 0008->slave */ - /* {0x5F, 0xE7FF, 0x0000},//0000->32K, 0800->44.1K, 1000->48K */ -#else -#ifdef FM_PowerOn_with_ShortAntenna - {0x61, 0xFF63, 0x0010}, /* no low power mode, analog line in, short antenna */ -#else - {0x61, 0xFF63, 0x0000}, /* no low power mode, analog line in, long antenna */ -#endif -#endif - {HW_VER, 0x0062, 0x0000}, /* read the HW version */ - - /* @Wholechip FM Power Up: FM Digital Init: download patch/DSP coefficient/HWACC coefficient */ - {DSPPATCH, 0x0, DSP_PATH}, - {DSPPATCH, 0x0, DSP_COEFF}, - {DSPPATCH, 0x0, DSP_HW_COEFF}, - {0x90, 0x0, 0x0040}, - {0x90, 0x0, 0x0000}, - - /* @Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */ - {0x6A, 0x0, 0x0020}, - {0x6B, 0x0, 0x0020}, - {0x60, 0x0, 0x300F}, - {0x61, 0xFFFF, 0x0002}, - {0x61, 0xFFFE, 0x0000}, - {POLL_P, 0x64, 0x2} -}; - -#define POWER_ON_COMMAND_COUNT (sizeof(PowerOnSetting)/sizeof(PowerOnSetting[0])) - -static int Chip_Version = mt6626_E1; - - -static fm_s32 mt6626_pwron(fm_s32 data) -{ - mt66x6_poweron(MT66x6_FM); - return 0; -} - - -static fm_s32 mt6626_pwroff(fm_s32 data) -{ - mt66x6_poweroff(MT66x6_FM); - return 0; -} - -static fm_s32 Delayms(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data); - msleep(data); - return 0; -} - -static fm_s32 Delayus(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data); - udelay(data); - return 0; -} - -static fm_s32 mt6626_read(fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - - ret = fm_ctrl_rx(addr, val); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "rd 0x%02x err\n", addr); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "rd 0x%02x 0x%04x\n", addr, *val); - return ret; -} - -static fm_s32 mt6626_write(fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - - ret = fm_ctrl_tx(addr, val); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "wr 0x%02x err\n", addr); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "wr 0x%02x 0x%04x\n", addr, val); - return ret; -} - -static fm_s32 mt6626_write1(fm_u8 addr, fm_u16 val) -{ - return fm_ctrl_tx(addr, val); -} - -static fm_s32 mt6626_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 ret = 0; - fm_u16 val; - - ret = mt6626_read(addr, &val); - - if (ret) - return ret; - - val = ((val & (mask)) | bits); - ret = mt6626_write(addr, val); - - return ret; -} - -static fm_u16 mt6626_get_chipid(void) -{ - return 0x6626; -} - -static void mt6626_TUNE_ON(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "tune on\n"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - /* mt6626_write(FM_MAIN_CTRL, (dataRead&0xFFFE)|TUNE); */ - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF8) | TUNE); -} - -static void mt6626_SEEK_ON(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "seek on\n"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - /* mt6626_write(FM_MAIN_CTRL, (dataRead&0xFFFD)|SEEK); */ - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF8) | SEEK); -} - -static void mt6626_SCAN_ON(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "scan on\n"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - /* mt6626_write(FM_MAIN_CTRL, (dataRead&0xFFFB)|SCAN); */ - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF8) | SCAN); -} - -/* MT6628_SetAntennaType - set Antenna type - * @type - 1,Short Antenna; 0, Long Antenna - */ -static fm_s32 mt6626_SetAntennaType(fm_s32 type) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long"); - mt6626_read(FM_MAIN_CG2_CTRL, &dataRead); - - if (type) { - dataRead |= ANTENNA_TYPE; - } else { - dataRead &= (~ANTENNA_TYPE); - } - - mt6626_write(FM_MAIN_CG2_CTRL, dataRead); - - return 0; -} - -static fm_s32 mt6626_GetAntennaType(void) -{ - fm_u16 dataRead; - - mt6626_read(FM_MAIN_CG2_CTRL, &dataRead); - WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long"); - - if (dataRead & ANTENNA_TYPE) - return FM_SHORT_ANA; /* short antenna */ - else - return FM_LONG_ANA; /* long antenna */ -} - -static fm_s32 mt6626_writeFA(fm_u16 *buff, fm_u8 fa) -{ - fm_u8 i = 0; - - for (i = 0; i < 3; i++) { - if ((fa >> i) & 0x1) - *buff |= (1 << (12 + i)); - else - *buff &= ~(1 << (12 + i)); - } - - return 0; -} - -static fm_s32 mt6626_Mute(fm_bool mute) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute"); - mt6626_read(FM_MAIN_CTRL, &dataRead); - - if (mute == 1) { - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF) | 0x0020); - } else { - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF)); - } - - return 0; -} - -/* - * mt6626_WaitSTCDone - wait for stc done flag change to '1' - * @waittime - the total wait time in ms - * @interval - the delay time of every polling loop in ms - * if success, return 0; else error code - */ -static fm_s32 mt6626_WaitSTCDone(fm_u32 waittime, fm_u32 interval) -{ - fm_u16 dataRead; - fm_s32 cnt; - - if (interval) { - cnt = waittime / interval; - } else { - cnt = 0; - } - - do { - if (cnt-- < 0) { - return -1; /* wait for STC done failed */ - } - - Delayms(interval); - mt6626_read(FM_MAIN_INTR, &dataRead); - } while ((dataRead & FM_INTR_STC_DONE) == 0); - - return 0; -} - -static fm_s32 mt6626_ClearSTCDone(void) -{ - fm_u16 dataRead; - - mt6626_read(FM_MAIN_INTR, &dataRead); - mt6626_write(FM_MAIN_INTR, dataRead | FM_INTR_STC_DONE); /* clear status flag */ - return 0; -} - -static fm_s32 mt6626_RampDown(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "ramp down\n"); - /* Clear DSP state */ - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF0)); /* clear rgf_tune/seek/scan/dsp_init */ - - /* Set DSP ramp down state */ - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead | RAMP_DOWN)); - - /* Check STC_DONE status flag (not the interrupt flag!) */ - if (mt6626_WaitSTCDone(1000, 1)) { - WCN_DBG(FM_ALT | CHIP, "ramp down failed\n"); - return -1; - } - /* Clear DSP ramp down state */ - mt6626_read(FM_MAIN_CTRL, &dataRead); - mt6626_write(FM_MAIN_CTRL, (dataRead & (~RAMP_DOWN))); - - mt6626_ClearSTCDone(); - return 0; -} - -/* -* mt6626_DspPatch - DSP download procedure -* @img - source dsp bin code -* @type - rom/patch/coefficient/hw_coefficient -* -*/ -static fm_s32 mt6626_DspPatch(const fm_u16 *img, enum IMG_TYPE type) -{ - fm_u32 ctrl_code = 0; - fm_u16 data_len = 0; /* in words */ - fm_u16 i; - - FMR_ASSERT(img); - - WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d (1-rom, 2-patch, 3-coe, 4-hwcoe)\n", type); - - switch (type) { - case IMG_ROM: /* rom code */ - case IMG_PATCH: /* patch */ - ctrl_code = 0x10; - break; - case IMG_COEFFICIENT: /* coeff */ - ctrl_code = 0xe; - break; - case IMG_HW_COEFFICIENT: /* HW coeff */ - ctrl_code = 0xd; - break; - default: - break; - } - - data_len = img[1] - img[0] + 1; - WCN_DBG(FM_DBG | CHIP, "patch len: %d\n", data_len); - - if (!(data_len > 0)) { - ; /* error */ - return -FM_EPARA; - } - - mt6626_write(FM_DSP_PATCH_CTRL, 0); - mt6626_write(FM_DSP_PATCH_OFFSET, img[0]); /* Start address */ - mt6626_write(FM_DSP_PATCH_CTRL, 0x40); /* Reset download control */ - mt6626_write(FM_DSP_PATCH_CTRL, ctrl_code); /* Set download control */ - - switch (type) { - case IMG_ROM: - case IMG_PATCH: - case IMG_HW_COEFFICIENT: - WCN_DBG(FM_DBG | CHIP, "rom/patch/hw_coefficient downloading......\n"); - - for (i = 0; i < data_len; i++) { - mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]); - } - - break; - case IMG_COEFFICIENT: - WCN_DBG(FM_DBG | CHIP, "coefficient downloading......\n"); - - if (MT6626_DEEMPHASIS_50us) { - for (i = 0; i < data_len; i++) { - if (i == 86) { - mt6626_write1(FM_DSP_PATCH_DATA, - fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_LONG)); - } else if (i == 292) { - mt6626_write1(FM_DSP_PATCH_DATA, 0x332B); - mt6626_write1(FM_DSP_PATCH_DATA, 0x2545); - mt6626_write1(FM_DSP_PATCH_DATA, 0x1344); - mt6626_write1(FM_DSP_PATCH_DATA, 0x09F5); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0526); - mt6626_write1(FM_DSP_PATCH_DATA, 0x02A9); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0160); - mt6626_write1(FM_DSP_PATCH_DATA, 0x00B6); - mt6626_write1(FM_DSP_PATCH_DATA, 0x005E); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0031); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0000); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0000); - mt6626_write1(FM_DSP_PATCH_DATA, 0x0000); - i += 12; - } else if (i == 505) { - mt6626_write1(FM_DSP_PATCH_DATA, - fm_cust_config_fetch - (FM_CFG_RX_RSSI_TH_SHORT)); - } else { - mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]); - } - } - } else { - for (i = 0; i < data_len; i++) { - if (i == 86) { - mt6626_write1(FM_DSP_PATCH_DATA, - fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_LONG)); - } else if (i == 505) { - mt6626_write1(FM_DSP_PATCH_DATA, - fm_cust_config_fetch - (FM_CFG_RX_RSSI_TH_SHORT)); - } else { - mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]); - } - } - } - - break; - default: - break; - } - - WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d ok\n", type); - return 0; -} - -static fm_s32 mt6626_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) -{ - fm_s32 ret = 0; - fm_s32 i; - fm_u16 tmp_reg, cnt = 0; - - const fm_u16 *bin_patch = NULL; - const fm_u16 *bin_coeff = NULL; - - FMR_ASSERT(chip_id); - FMR_ASSERT(device_id); - - WCN_DBG(FM_DBG | CHIP, "pwr on seq\n"); - - /* mt6626 FM power on sequence */ - for (i = 0; i < POWER_ON_COMMAND_COUNT; i++) { - switch (PowerOnSetting[i].addr) { - case FM_PUS_DSPPATCH: - - switch (PowerOnSetting[i].or) { - case DSP_PATH: /* DSP path download */ - mt6626_DspPatch(bin_patch, IMG_PATCH); - break; - case DSP_COEFF: /* DSP coefficient download */ - mt6626_DspPatch(bin_coeff, IMG_COEFFICIENT); - break; - case DSP_HW_COEFF: /* DSP HW coefficient download */ - mt6626_DspPatch(bin_hw_coeff, IMG_HW_COEFFICIENT); - break; - default: - break; - } - - break; - case FM_PUS_POLL_P: - cnt = 0; - - do { - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - tmp_reg &= PowerOnSetting[i].or; - - if (tmp_reg == 0) { - Delayms(10); - cnt++; - } - } while ((tmp_reg == 0) && (cnt < (MT6626_MAX_COUNT << 1))); - - if (cnt == (MT6626_MAX_COUNT << 1)) { - WCN_DBG(FM_ALT | CHIP, "polling status Active failed:0x%02X\n", - (fm_u8) PowerOnSetting[i].and); - return -FM_EPARA; - } - - break; - case FM_PUS_POLL_N: - cnt = 0; - - do { - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - tmp_reg &= PowerOnSetting[i].or; - - if (tmp_reg != 0) { - Delayms(10); - cnt++; - } - } while ((tmp_reg != 0) && (cnt < MT6626_MAX_COUNT)); - - if (cnt == MT6626_MAX_COUNT) { - WCN_DBG(FM_ALT | CHIP, "polling status Negative failed:0x%02X\n", - (fm_u8) PowerOnSetting[i].and); - return -FM_EPARA; - } - - break; - case FM_PUS_USDELAY: - Delayus(PowerOnSetting[i].or); - break; - case FM_PUS_MSDELAY: - Delayms(PowerOnSetting[i].or); - break; - case FM_PUS_HW_VER: - - switch (PowerOnSetting[i].and) { - case 0x99: - mt6626_read(0x99, &tmp_reg); - - switch (tmp_reg) { - case 0x0: - Chip_Version = mt6626_E1; - bin_patch = bin_patch_E1; - bin_coeff = bin_coeff_E1; - break; - case 0x8A01: - default: - Chip_Version = mt6626_E2; - bin_patch = bin_patch_E2; - bin_coeff = bin_coeff_E2; - break; - } - - break; - case 0x62: - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - /* record chip id & device id */ - *chip_id = tmp_reg; - *device_id = tmp_reg; - WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg); - break; - case 0x1C: - mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg); - - if (PowerOnSetting[i].or) { - mt6626_write(PowerOnSetting[i].and, (tmp_reg | 0x8000)); - } else { - mt6626_write(PowerOnSetting[i].and, (tmp_reg & 0x7FFF)); - } - - break; - default: - break; - } - - break; - default: - - if (PowerOnSetting[i].and != 0) { - if (mt6626_read((fm_u8) PowerOnSetting[i].addr, &tmp_reg)) { - WCN_DBG(FM_ALT | CHIP, - "power up failed, can't read reg %02X\n", - (fm_u8) PowerOnSetting[i].and); - return -FM_EPARA; - } - - tmp_reg &= PowerOnSetting[i].and; - tmp_reg |= PowerOnSetting[i].or; - } else { - tmp_reg = PowerOnSetting[i].or; - } - - if (mt6626_write((fm_u8) PowerOnSetting[i].addr, tmp_reg)) { - WCN_DBG(FM_ALT | CHIP, "power up failed, can't write reg %02X\n", - (fm_u8) PowerOnSetting[i].addr); - return -FM_EPARA; - } - - break; - } - } - - WCN_DBG(FM_DBG | CHIP, "pwr on seq done\n"); - return ret; -} - -static fm_s32 mt6626_PowerDown(void) -{ - fm_s32 ret = 0; - fm_s16 i; - fm_u16 dataRead; - - /*SW work around for MCUFA issue. - *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well. - * In case read interrupt, and clean if interrupt found before rampdown. - */ - WCN_DBG(FM_DBG | CHIP, "pwr down seq\n"); - mt6626_read(FM_MAIN_INTR, &dataRead); - - if (dataRead & 0x1) { - mt6626_write(FM_MAIN_INTR, dataRead); /* clear status flag */ - } - - mt6626_RampDown(); - - mt6626_write(0x60, 0x330F); - mt6626_write(FM_MAIN_CG2_CTRL, 1); - - for (i = 0; i < 4; i++) { - mt6626_read(0x6E, &dataRead); - mt6626_write(0x6E, (dataRead & 0xFFF8)); - } - - mt6626_write(FM_MAIN_CG1_CTRL, 0); - mt6626_write(FM_MAIN_CG1_CTRL, 0x4000); - mt6626_write(FM_MAIN_CG1_CTRL, 0); - - return ret; -} - -static fm_bool mt6626_SetFreq(fm_u16 freq) -{ - fm_u32 CHAN = 0x0000; - fm_u16 dataRead, cnt = 0, tempbuff = 0; - - Rampdown_again: - mt6626_RampDown(); - - fm_cb_op->cur_freq_set(freq); - CHAN = (freq - 640) << 1; - mt6626_read(FM_CHANNEL_SET, &dataRead); - - switch (Chip_Version) { - case mt6626_E1: - - if (((fm_u8) ((dataRead & 0x1000) >> 12)) ^ (channel_parameter[freq - 760] & 0x1)) { - mt6626_read(0x61, &tempbuff); - mt6626_write(0x60, 0x330F); - mt6626_write(0x61, 1); - mt6626_write(0x6e, 0x0); - mt6626_write(0x6e, 0x0); - mt6626_write(0x6e, 0x0); - mt6626_write(0x6e, 0x0); - mt6626_write(0x60, 0x0); - mt6626_write(0x60, 0x4000); - mt6626_write(0x60, 0x0); - mt6626_write(0x60, 0x3000); - mt6626_write(0x60, 0x3001); - Delayms(3); - mt6626_write(0x60, 0x3003); - mt6626_write(0x60, 0x3007); - mt6626_write(0x60, 0x300f); - mt6626_write(0x61, tempbuff | 0x3); - mt6626_write(0x61, tempbuff | 0x2); - mt6626_write(0x6A, 0x20); - mt6626_write(0x6B, 0x20); - Delayms(200); - } - - break; - case mt6626_E2: - break; - default: - break; - - } - - mt6626_writeFA(&dataRead, (channel_parameter[freq - 760])); - mt6626_write(FM_CHANNEL_SET, (dataRead & 0xFC00) | CHAN); - - mt6626_TUNE_ON(); - - if (mt6626_WaitSTCDone(5000, 15)) { - if (cnt++ > 100) { - WCN_DBG(FM_ALT | CHIP, "set freq failed\n"); - return FALSE; - } else { - WCN_DBG(FM_WAR | CHIP, "set freq retry, cnt=%d\n", cnt); - goto Rampdown_again; - } - } - - mt6626_ClearSTCDone(); /* clear status flag */ - - WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq); - return TRUE; -} - -/* -* mt6626_Seek -* pFreq: IN/OUT parm, IN start freq/OUT seek valid freq -* return fm_true:seek success; fm_false:seek failed -*/ -static fm_bool mt6626_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir, - fm_u16 space) -{ - fm_u16 dataRead; - fm_u16 freq_l; - fm_u16 freq_h; - - mt6626_RampDown(); - mt6626_Mute(fm_true); - - WCN_DBG(FM_DBG | CHIP, "min_freq:%d, max_freq:%d\n", min_freq, max_freq); - - /* Program seek direction */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - dataRead &= 0xFBFF; - - if (seekdir == 0) { - dataRead |= 0x0000; - } else { - dataRead |= 0x0400; - } - - WCN_DBG(FM_DBG | CHIP, "seek %s\n", seekdir ? "down" : "up"); - /* Program scan channel spacing */ - dataRead &= 0x8FFF; - - if (space == 4) { - dataRead |= 0x4000; - } else { - dataRead |= 0x2000; - } - - WCN_DBG(FM_DBG | CHIP, "seek space %d\n", space); - /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - dataRead &= 0xF7FF; - dataRead |= 0x0800; - /* 0x66[9:0] freq upper bound */ - max_freq = (max_freq - 640) * 2; - dataRead &= 0xFC00; - dataRead |= max_freq; - mt6626_write(FM_MAIN_CFG1, dataRead); - /* 0x67[9:0] freq lower bound */ - mt6626_read(FM_MAIN_CFG2, &dataRead); - min_freq = (min_freq - 640) * 2; - dataRead &= 0xFC00; - dataRead |= min_freq; - mt6626_write(FM_MAIN_CFG2, dataRead); - /* Enable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE); - mt6626_SEEK_ON(); - - if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) { - WCN_DBG(FM_ALT | CHIP, "seek, get stc done failed\n"); - mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF); - mt6626_RampDown(); - return fm_false; - } - /* Disable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE); - /* get the result freq */ - mt6626_read(FM_MAIN_CHANDETSTAT, &dataRead); - mt6626_write(FM_CHANNEL_SET, (dataRead & FM_HOST_CHAN) >> 4); - *pFreq = 640 + ((dataRead & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1)); - freq_l = fm_cust_config_fetch(FM_CFG_RX_BAND_FREQ_L); - freq_h = fm_cust_config_fetch(FM_CFG_RX_BAND_FREQ_H); - *pFreq = (*pFreq > freq_h) ? freq_h : *pFreq; - *pFreq = (*pFreq < freq_l) ? freq_l : *pFreq; - fm_cb_op->cur_freq_set(*pFreq); - WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq); - mt6626_Mute(fm_false); - - return fm_true; -} - -static fm_bool mt6626_Scan(fm_u16 min_freq, fm_u16 max_freq, - fm_u16 *pFreq, - fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_u16 tmp_reg, space_val, startfreq, offset = 0; - fm_u16 tmp_scanTBLsize = *ScanTBLsize; - fm_u16 dataRead; - - if ((!pScanTBL) || (tmp_scanTBLsize == 0)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n"); - return fm_false; - } - - WCN_DBG(FM_DBG | CHIP, - "scan start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - if (tmp_scanTBLsize > MT6626_SCANTBL_SIZE) { - tmp_scanTBLsize = MT6626_SCANTBL_SIZE; - } - - if (space == MT6626_FM_SPACE_200K) { - space_val = 2; /* 200K */ - } else if (space == MT6626_FM_SPACE_100K) { - space_val = 1; /* 100K */ - } else { - space_val = 1; /* 100K */ - } - - /* scan up */ - if (scandir == MT6626_FM_SCAN_UP) { - startfreq = min_freq - space_val; - } else { - startfreq = max_freq + space_val; /* max_freq compare need or not */ - } - - mt6626_RampDown(); - mt6626_Mute(fm_true); - - /* set freq */ - if (fm_false == mt6626_SetFreq(startfreq)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed set freq\n"); - return fm_false; - } - - mt6626_RampDown(); - - /* set space(100k/200k)and band(min_freq~max_freq) and up/down and disable wrap */ - mt6626_read(FM_MAIN_CFG2, &dataRead); - mt6626_write(FM_MAIN_CFG2, (dataRead & 0xFC00) | ((min_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - mt6626_write(FM_MAIN_CFG1, (dataRead & 0x8800) | (scandir << 10) | (1 << (12 + space)) | ((max_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */ - mt6626_read(FM_MAIN_CFG1, &dataRead); - mt6626_write(FM_MAIN_CFG1, dataRead & 0xF7FF); /* disable wrap , if it is auto scan function */ - - /* Enable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE); - /* scan on */ - mt6626_SCAN_ON(); - - if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) { - WCN_DBG(FM_ALT | CHIP, "scan, get stc done failed\n"); - mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF); - mt6626_RampDown(); - - /* get the valid freq after scan */ - mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg); - tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1)); - *pFreq = tmp_reg; - WCN_DBG(FM_DBG | CHIP, "scan, failed freq:%d\n", *pFreq); - return fm_false; - } - /* Disable STC done intr */ - mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE); - - /* get scan Table */ - WCN_DBG(FM_DBG | CHIP, "mt6626_Scan tbl:"); - - for (offset = 0; offset < tmp_scanTBLsize; offset++) { - mt6626_read(FM_RDS_DATA_REG, &tmp_reg); - *(pScanTBL + offset) = tmp_reg; - } - - *ScanTBLsize = tmp_scanTBLsize; - - /* get the valid freq after scan */ - mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg); - tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1)); - *pFreq = tmp_reg; - WCN_DBG(FM_DBG | CHIP, "scan, after scan freq:%d\n", *pFreq); - mt6626_Mute(fm_false); - - return fm_true; -} - -/* - * mt6626_GetCurRSSI - get current freq's RSSI value - * RS=RSSI - * If RS>511, then RSSI(dBm)= (RS-1024)/16*6 - * else RSSI(dBm)= RS/16*6 - */ -static fm_s32 mt6626_GetCurRSSI(fm_s32 *pRSSI) -{ - fm_u16 tmp_reg; - - mt6626_read(FM_RSSI_IND, &tmp_reg); - tmp_reg = tmp_reg & 0x03ff; - - if (pRSSI) { - *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4); - WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI); - } else { - WCN_DBG(FM_ERR | CHIP, "get rssi para error\n"); - return -FM_EPARA; - } - - return 0; -} - -static fm_s32 mt6626_SetVol(fm_u8 vol) -{ -#define MT6626_VOL_MAX 0x2B /* 43 volume(0-15) */ - int ret = 0; - fm_u8 tmp_vol = vol & 0x3f; - fm_u16 tmp = 0; - - mt6626_read(0x60, &tmp); - mt6626_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */ - - tmp_vol = vol * 3; - if (tmp_vol > MT6626_VOL_MAX) - tmp_vol = MT6626_VOL_MAX; - - ret = mt6626_set_bits(0x9C, (tmp_vol << 8), 0xC0FF); - - if (ret) { - WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", tmp_vol); - return ret; - } else { - WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", tmp_vol); - } - - mt6626_write(0x60, tmp); /* 0x60 D3=1 */ - return 0; -} - -static fm_s32 mt6626_GetVol(fm_u8 *pVol) -{ - int ret = 0; - fm_u16 tmp_reg; - fm_u16 tmp = 0; - - FMR_ASSERT(pVol); - - mt6626_read(0x60, &tmp); - mt6626_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */ - - ret = mt6626_read(0x9C, &tmp_reg); - - if (ret) { - *pVol = 0; - WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n"); - return ret; - } else { - *pVol = (tmp_reg >> 8) & 0x3f; - WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol); - } - - mt6626_write(0x60, tmp); /* 0x60 D3=1 */ - return 0; -} - -static fm_s32 mt6626_dump_reg(void) -{ - return 0; -} - -static fm_bool mt6626_GetMonoStereo(fm_u16 *pMonoStereo) -{ -#define FM_BF_STEREO 0x1000 - fm_u16 TmpReg; - - if (pMonoStereo) { - mt6626_read(FM_RSSI_IND, &TmpReg); - *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12; - } else { - WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n"); - return fm_false; - } - - WCN_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo); - return fm_true; -} - -static fm_s32 mt6626_SetMonoStereo(fm_s32 MonoStereo) -{ - fm_s32 ret = 0; -#define FM_FORCE_MS 0x0008 - - WCN_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "mono" : "auto"); - - mt6626_write(0x60, 0x3007); - - if (MonoStereo) { - ret = mt6626_set_bits(0x75, FM_FORCE_MS, ~FM_FORCE_MS); - } else { - ret = mt6626_set_bits(0x75, 0x0000, ~FM_FORCE_MS); - } - - return ret; -} - -static fm_s32 mt6626_GetCapArray(fm_s32 *ca) -{ - fm_u16 dataRead; - fm_u16 tmp = 0; - - FMR_ASSERT(ca); - mt6626_read(0x60, &tmp); - mt6626_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */ - - mt6626_read(0x25, &dataRead); - *ca = dataRead; - - mt6626_write(0x60, tmp); /* 0x60 D3=1 */ - return 0; -} - - -/* - * mt6626_GetCurPamd - get current freq's PAMD value - * PA=PAMD - * If PA>511 then PAMD(dB)= (PA-1024)/16*6, - * else PAMD(dB)=PA/16*6 - */ -static fm_bool mt6626_GetCurPamd(fm_u16 *pPamdLevl) -{ - fm_u16 tmp_reg; - fm_u16 dBvalue; - - if (mt6626_read(FM_ADDR_PAMD, &tmp_reg)) - return fm_false; - - tmp_reg &= 0x03FF; - dBvalue = (tmp_reg > 511) ? ((1024 - tmp_reg) * 6 / 16) : 0; - - *pPamdLevl = dBvalue; - return fm_true; -} - -static fm_s32 mt6626_ScanStop(void) -{ - return fm_force_active_event(FLAG_SCAN); -} - -static fm_s32 mt6626_SeekStop(void) -{ - return fm_force_active_event(FLAG_SEEK); -} - -/* - * mt6626_I2s_Setting - set the I2S state on MT6626 - * @onoff - I2S on/off - * @mode - I2S mode: Master or Slave - * - * Return:0, if success; error code, if failed - */ -static fm_s32 mt6626_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample) -{ - fm_u16 tmp_state = 0; - fm_u16 tmp_mode = 0; - fm_u16 tmp_sample = 0; - fm_s32 ret = 0; - - if (onoff == MT6626_I2S_ON) { - tmp_state = 0x0080; /* I2S Frequency tracking on, 0x61 D7=1 */ - } else if (onoff == MT6626_I2S_OFF) { - tmp_state = 0x0000; /* I2S Frequency tracking off, 0x61 D7=0 */ - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff); - ret = -FM_EPARA; - goto out; - } - - if (mode == MT6626_I2S_MASTER) { - tmp_mode = 0x03; /* 6620 as I2S master */ - } else if (mode == MT6626_I2S_SLAVE) { - tmp_mode = 0x0B; /* 6620 as I2S slave */ - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode); - ret = -FM_EPARA; - goto out; - } - - if (sample == MT6626_I2S_32K) { - tmp_sample = 0x0000; /* 6620 I2S 32KHz sample rate */ - } else if (sample == MT6626_I2S_44K) { - tmp_sample = 0x0800; /* 6620 I2S 44.1KHz sample rate */ - } else if (sample == MT6626_I2S_48K) { - tmp_sample = 0x1000; /* 6620 I2S 48KHz sample rate */ - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample); - ret = -FM_EPARA; - goto out; - } - - if ((ret = mt6626_set_bits(0x5F, tmp_sample, 0xE7FF))) - goto out; - - if ((ret = mt6626_write(0x9B, tmp_mode))) - goto out; - - if ((ret = mt6626_set_bits(0x61, tmp_state, 0xFF7F))) - goto out; - - WCN_DBG(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n", - (onoff == MT6626_I2S_ON) ? "On" : "Off", - (mode == MT6626_I2S_MASTER) ? "Master" : "Slave", sample); - out: - return ret; -} - -static fm_bool mt6626_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value) -{ - return fm_true; -} - -static fm_s32 fm_low_power_wa_default(fm_s32 fmon) -{ - return 0; -} - -fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb_op = &ops->cb; - - /* ops->bi.low_pwr_wa = mt6626_low_pwr_wa; */ - ops->bi.low_pwr_wa = fm_low_power_wa_default; - ops->bi.pwron = mt6626_pwron; - ops->bi.pwroff = mt6626_pwroff; - ops->bi.msdelay = Delayms; - ops->bi.usdelay = Delayus; - ops->bi.read = mt6626_read; - ops->bi.write = mt6626_write; - ops->bi.setbits = mt6626_set_bits; - ops->bi.chipid_get = mt6626_get_chipid; - ops->bi.mute = mt6626_Mute; - ops->bi.rampdown = mt6626_RampDown; - ops->bi.pwrupseq = mt6626_PowerUp; - ops->bi.pwrdownseq = mt6626_PowerDown; - ops->bi.setfreq = mt6626_SetFreq; - ops->bi.seek = mt6626_Seek; - ops->bi.seekstop = mt6626_SeekStop; - ops->bi.scan = mt6626_Scan; - ops->bi.scanstop = mt6626_ScanStop; - ops->bi.rssiget = mt6626_GetCurRSSI; - ops->bi.volset = mt6626_SetVol; - ops->bi.volget = mt6626_GetVol; - ops->bi.dumpreg = mt6626_dump_reg; - ops->bi.msget = mt6626_GetMonoStereo; - ops->bi.msset = mt6626_SetMonoStereo; - ops->bi.pamdget = mt6626_GetCurPamd; - ops->bi.em = mt6626_em_test; - ops->bi.anaswitch = mt6626_SetAntennaType; - ops->bi.anaget = mt6626_GetAntennaType; - ops->bi.caparray_get = mt6626_GetCapArray; - ops->bi.i2s_set = mt6626_I2s_Setting; - - return ret; -} - -fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - - fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c deleted file mode 100644 index fe49d9a96..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c +++ /dev/null @@ -1,243 +0,0 @@ -/* mt6626_fm_link.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- setup data link - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/slab.h> -#include <linux/version.h> -#include <linux/interrupt.h> -#include <linux/cdev.h> -#include <asm/uaccess.h> -#include <linux/i2c.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" - -#include "mt6626_fm.h" -#include "mt6626_fm_link.h" -#include "mt6626_fm_reg.h" - -/* these functions are defined after Linux2.6.32 */ -static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); -static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); -static int fm_i2c_remove(struct i2c_client *client); - - -static const struct i2c_device_id fm_i2c_id = { MT6626_DEV, 0 }; -static unsigned short force[] = - { MT6626_I2C_PORT, MT6626_SLAVE_ADDR, I2C_CLIENT_END, I2C_CLIENT_END }; -static const unsigned short *const forces[] = { force, NULL }; - -static struct i2c_client_address_data addr_data = { - .forces = forces -}; - -struct i2c_driver MT6626_driver = { - .probe = fm_i2c_probe, - .remove = fm_i2c_remove, - .detect = fm_i2c_detect, - .driver.name = MT6626_DEV, - .id_table = &fm_i2c_id, - .address_data = &addr_data, -}; - -static struct i2c_client *g_client; - -static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - int ret = 0; - - WCN_DBG(FM_NTC | LINK, "%s\n", __func__); - g_client = client; - - return ret; -} - -static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info) -{ - WCN_DBG(FM_NTC | LINK, "%s\n", __func__); - strcpy(info->type, MT6626_DEV); - return 0; -} - -static int fm_i2c_remove(struct i2c_client *client) -{ - WCN_DBG(FM_NTC | LINK, "%s\n", __func__); - return 0; -} - -static struct fm_link_event *link_event; - -fm_s32 fm_link_setup(void *data) -{ - if (!(link_event = kzalloc(sizeof(struct fm_link_event), GFP_KERNEL))) { - WCN_DBG(FM_ALT | LINK, "kzalloc(fm_link_event) -ENOMEM\n"); - return -1; - } - - link_event->ln_event = fm_flag_event_create("ln_evt"); - - if (!link_event->ln_event) { - WCN_DBG(FM_ALT | LINK, "create mt6626_ln_event failed\n"); - fm_free(link_event); - return -1; - } - - fm_flag_event_get(link_event->ln_event); - - WCN_DBG(FM_NTC | LINK, "fm link setup\n"); - return i2c_add_driver(&MT6626_driver); -} - -fm_s32 fm_link_release(void) -{ - fm_flag_event_put(link_event->ln_event); - if (link_event) { - fm_free(link_event); - } - - WCN_DBG(FM_NTC | LINK, "fm link release\n"); - i2c_del_driver(&MT6626_driver); - return 0; -} - -/* - * fm_ctrl_rx - * the low level func to read a rigister - * @addr - rigister address - * @val - the pointer of target buf - * If success, return 0; else error code - */ -fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val) -{ - fm_s32 n; - fm_u8 b[2] = { 0 }; - - /* first, send addr to MT6626 */ - n = i2c_master_send(g_client, (fm_u8 *) &addr, 1); - - if (n < 0) { - WCN_DBG(FM_ALT | LINK, "rx 1, [addr=0x%02X] [err=%d]\n", addr, n); - return -1; - } - /* second, receive two byte from MT6626 */ - n = i2c_master_recv(g_client, b, 2); - - if (n < 0) { - WCN_DBG(FM_ALT | LINK, "rx 2, [addr=0x%02X] [err=%d]\n", addr, n); - return -2; - } - - *val = ((fm_u16) b[0] << 8 | (fm_u16) b[1]); - - return 0; -} - -/* - * fm_ctrl_tx - * the low level func to write a rigister - * @addr - rigister address - * @val - value will be writed in the rigister - * If success, return 0; else error code - */ -fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val) -{ - fm_s32 n; - fm_u8 b[3]; - - b[0] = addr; - b[1] = (fm_u8) (val >> 8); - b[2] = (fm_u8) (val & 0xFF); - - n = i2c_master_send(g_client, b, 3); - - if (n < 0) { - WCN_DBG(FM_ALT | LINK, "tx, [addr=0x%02X] [err=%d]\n", addr, n); - return -1; - } - - return 0; -} - -/* - * fm_cmd_tx() - send cmd to FM firmware and wait event - * @buf - send buffer - * @len - the length of cmd - * @mask - the event flag mask - * @ cnt - the retry conter - * @timeout - timeout per cmd - * Return 0, if success; error code, if failed - */ -fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, - fm_s32(*callback) (struct fm_res_ctx *result)) -{ - return 0; -} - -fm_bool fm_wait_stc_done(fm_u32 sec) -{ - fm_s32 ret_time = 0; - - ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, FLAG_TEST, sec); - if (!ret_time) { - WCN_DBG(FM_WAR | LINK, "wait stc done fail\n"); - return fm_false; - } else { - WCN_DBG(FM_DBG | LINK, "wait stc done ok\n"); - } - - FM_EVENT_CLR(link_event->ln_event, FLAG_TEST); - return fm_true; -} - -fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32)) -{ - fm_u16 tmp_reg; - - fm_ctrl_rx(FM_MAIN_INTR, &tmp_reg); - - if (tmp_reg & FM_INTR_STC_DONE) { - /* clear status flag */ - fm_ctrl_tx(FM_MAIN_INTR, tmp_reg | FM_INTR_STC_DONE); - FM_EVENT_SEND(link_event->ln_event, FLAG_TEST); - } - - if (tmp_reg & FM_INTR_RDS) { - /* clear status flag */ - fm_ctrl_tx(FM_MAIN_INTR, tmp_reg | FM_INTR_RDS); - - /*Handle the RDS data that we get */ - if (rds_parser) { - rds_parser(NULL, 0); /* mt6626 rds lib will get rds raw data by itself */ - } else { - WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n"); - } - } - - return 0; -} - -fm_s32 fm_force_active_event(fm_u32 mask) -{ - FM_EVENT_SEND(link_event->ln_event, FLAG_TEST); - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c deleted file mode 100644 index 2cefc4fb6..000000000 --- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c +++ /dev/null @@ -1,320 +0,0 @@ -/* mt6626_rds.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6626 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_rds.h" - -#include "mt6626_fm_reg.h" - - -static fm_bool bRDS_FirstIn = fm_false; -static fm_u32 gBLER_CHK_INTERVAL = 5000; -static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT; -static fm_u8 BAD_BLK_RATIO; - -static struct fm_callback *fm_cb; -static struct fm_basic_interface *fm_bi; - - -static fm_bool mt6626_RDS_support(void); -static fm_s32 mt6626_RDS_enable(void); -static fm_s32 mt6626_RDS_disable(void); -static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void); -static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void); -static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void); -static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void); -static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen); -static void mt6626_RDS_Init_Data(rds_t *pstRDSData); - - - -static fm_bool mt6626_RDS_support(void) -{ - return fm_true; -} - -static fm_s32 mt6626_RDS_enable(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | RDSC, "rds enable\n"); - fm_bi->read(FM_RDS_CFG0, &dataRead); - fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */ - fm_bi->read(FM_MAIN_CTRL, &dataRead); - fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK)); - - return 0; -} - -static fm_s32 mt6626_RDS_disable(void) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | RDSC, "rds disable\n"); - fm_bi->read(FM_MAIN_CTRL, &dataRead); - fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK)); - - return 0; -} - -static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg); - GOOD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg); - BAD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void) -{ - fm_u16 tmp_reg; - fm_u16 gbc; - fm_u16 bbc; - - gbc = mt6626_RDS_Get_GoodBlock_Counter(); - bbc = mt6626_RDS_Get_BadBlock_Counter(); - - if ((gbc + bbc) > 0) { - tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc)); - } else { - tmp_reg = 0; - } - - BAD_BLK_RATIO = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_s32 mt6626_RDS_BlockCounter_Reset(void) -{ - mt6626_RDS_disable(); - mt6626_RDS_enable(); - - return 0; -} - -static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void) -{ - return gBLER_CHK_INTERVAL; -} - -static fm_s32 mt6626_RDS_BlerCheck(rds_t *dst) -{ - return -1; -} - -static void RDS_Recovery_Handler(void) -{ - fm_u16 tempData = 0; - - do { - fm_bi->read(FM_RDS_DATA_REG, &tempData); - fm_bi->read(FM_RDS_POINTER, &tempData); - } while (tempData & 0x3); -} - -static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen) -{ -#define RDS_GROUP_DIFF_OFS 0x007C -#define RDS_FIFO_DIFF 0x007F -#define RDS_CRC_BLK_ADJ 0x0020 -#define RDS_CRC_CORR_CNT 0x001E -#define RDS_CRC_INFO 0x0001 - - fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0; - fm_u16 temp = 0, OutputPofm_s32 = 0; - - WCN_DBG(FM_DBG | RDSC, "get data\n"); - fm_bi->read(FM_RDS_FIFO_STATUS0, &temp); - RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2); - - if ((temp & RDS_FIFO_DIFF) >= 4) { - /* block A data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10; - CRC |= (temp & RDS_CRC_INFO) << 3; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11); - fm_bi->read(FM_RDS_DATA_REG, &data[0]); - - /* block B data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9; - CRC |= (temp & RDS_CRC_INFO) << 2; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7); - fm_bi->read(FM_RDS_DATA_REG, &data[1]); - - /* block C data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8; - CRC |= (temp & RDS_CRC_INFO) << 1; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3); - fm_bi->read(FM_RDS_DATA_REG, &data[2]); - - /* block D data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7; - CRC |= (temp & RDS_CRC_INFO); - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1); - fm_bi->read(FM_RDS_DATA_REG, &data[3]); - - data[4] = FM_WARorrCnt; /* CBC */ - data[5] = (CRC | RDS_adj | RDSDataCount); /* CRC */ - - fm_bi->read(FM_RDS_PWDI, &data[6]); - fm_bi->read(FM_RDS_PWDQ, &data[7]); - - fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32); - - /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */ - if (OutputPofm_s32 & 0x3) { - RDS_Recovery_Handler(); - } - - } else { - for (; i < 8; i++) - data[i] = 0; - } -} - -static void mt6626_RDS_Init_Data(rds_t *pstRDSData) -{ - fm_memset(pstRDSData, 0, sizeof(rds_t)); - bRDS_FirstIn = fm_true; - - fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData)); - fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS)); - fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON)); -} - -fm_bool mt6626_RDS_OnOff(rds_t *dst, fm_bool bFlag) -{ - if (mt6626_RDS_support() == fm_false) { - WCN_DBG(FM_ALT | RDSC, "mt6626_RDS_OnOff failed, RDS not support\n"); - return fm_false; - } - - if (bFlag) { - mt6626_RDS_Init_Data(dst); - mt6626_RDS_enable(); - } else { - mt6626_RDS_disable(); - } - - return fm_true; -} - -DEFINE_RDSLOG(rds_log); - -/* mt6626_RDS_Efm_s32_Handler - response FM RDS interrupt - * @fm - main data structure of FM driver - * This function first get RDS raw data, then call RDS spec parser - */ -static fm_s32 mt6626_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - struct rds_rx_t raw; - fm_u16 fifo_offset; - - do { - mt6626_RDS_GetData(&raw.data[0].blkA, sizeof(rds_packet_t) + 2); - fifo_offset = (raw.data[0].crc & FM_RDS_DCO_FIFO_OFST) >> 5; /* FM_RDS_DATA_CRC_FFOST */ - WCN_DBG(FM_DBG | RDSC, "RDS fifo_offset:%d\n", fifo_offset); - rds_log.log_in(&rds_log, &raw, sizeof(rds_packet_t) + 2 * sizeof(fm_u16)); - rds_parser(rds_dst, &raw, sizeof(rds_packet_t) + 2 * sizeof(fm_u16), getfreq); - } while (fifo_offset > 1); - - return 0; -} - -static fm_s32 mt6626_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len) -{ - return rds_log.log_out(&rds_log, dst, dst_len); -} - -static fm_s32 mt6626_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp) -{ - return rds_grp_counter_get(dst, &rdsp->gc); -} - -static fm_s32 mt6626_rds_gc_reset(rds_t *rdsp) -{ - return rds_grp_counter_reset(&rdsp->gc); -} - -fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - FMR_ASSERT(ops->bi.write); - FMR_ASSERT(ops->bi.read); - FMR_ASSERT(ops->bi.setbits); - FMR_ASSERT(ops->bi.usdelay); - fm_bi = &ops->bi; - - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb = &ops->cb; - - ops->ri.rds_blercheck = mt6626_RDS_BlerCheck; - ops->ri.rds_onoff = mt6626_RDS_OnOff; - ops->ri.rds_parser = mt6626_rds_parser; - ops->ri.rds_gbc_get = mt6626_RDS_Get_GoodBlock_Counter; - ops->ri.rds_bbc_get = mt6626_RDS_Get_BadBlock_Counter; - ops->ri.rds_bbr_get = mt6626_RDS_Get_BadBlock_Ratio; - ops->ri.rds_bc_reset = mt6626_RDS_BlockCounter_Reset; - ops->ri.rds_bci_get = mt6626_RDS_Get_BlerCheck_Interval; - ops->ri.rds_log_get = mt6626_rds_log_get; - ops->ri.rds_gc_get = mt6626_rds_gc_get; - ops->ri.rds_gc_reset = mt6626_rds_gc_reset; - return ret; -} - -fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - - fm_bi = NULL; - fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h deleted file mode 100644 index ca62e398f..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h +++ /dev/null @@ -1,14 +0,0 @@ - -const unsigned char channel_parameter[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 -}; diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h deleted file mode 100644 index 40bbd7cda..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h +++ /dev/null @@ -1,58 +0,0 @@ -/* mt6627_fm.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6627 FM Radio Driver -- head file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __MT6627_FM_H__ -#define __MT6627_FM_H__ - -#include "fm_typedef.h" - -/* #define FM_PowerOn_with_ShortAntenna */ -#define MT6627_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define MT6627_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define MT6627_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define MT6627_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define MT6627_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define MT6627_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define MT6627_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define MT6627_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define MT6627_DEEMPHASIS_50us TRUE - -#define MT6627_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */ -#define MT6627_MAX_COUNT 100 - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define MT6627_SCANTBL_SIZE 26 /* 16*uinit16_t */ -#else -#define MT6627_SCANTBL_SIZE 16 /* 16*uinit16_t */ -#endif - -#define AFC_ON 0x01 -#if AFC_ON -#define FM_MAIN_CTRL_INIT 0x480 -#else -#define FM_MAIN_CTRL_INIT 0x080 -#endif - -#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */ -#define MT6627_DEV "MT6627" - -#endif /* end of #ifndef __MT6627_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h deleted file mode 100644 index 60eac0e62..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __MT6627_FM_CMD_H__ -#define __MT6627_FM_CMD_H__ - -#include <linux/types.h> -#include "fm_typedef.h" - -/* FM basic-operation's opcode */ -#define FM_BOP_BASE (0x80) -enum { - FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00), - FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01), - FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02), - FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03), - FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04), - FM_TOP_WRITE_BASIC_OP = (FM_BOP_BASE + 0x05), - FM_TOP_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x06), - FM_TOP_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x07), - FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x08) -}; - -/* FM BOP's size */ -#define FM_TOP_WRITE_BOP_SIZE (7) -#define FM_TOP_RD_UNTIL_BOP_SIZE (11) -#define FM_TOP_MODIFY_BOP_SIZE (11) - -#define FM_WRITE_BASIC_OP_SIZE (3) -#define FM_UDELAY_BASIC_OP_SIZE (4) -#define FM_RD_UNTIL_BASIC_OP_SIZE (5) -#define FM_MODIFY_BASIC_OP_SIZE (5) -#define FM_MSLEEP_BASIC_OP_SIZE (4) - -fm_s32 mt6627_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6627_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6627_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6627_pwrdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6627_rampdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6627_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para); -fm_s32 mt6627_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6627_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6627_cqi_get(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6627_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr); -fm_s32 mt6627_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value); -fm_s32 mt6627_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6627_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -#if 0 -fm_s32 mt6627_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6627_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -#endif -fm_s32 mt6627_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type); -fm_s32 mt6627_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr); -fm_s32 mt6627_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value); -fm_s32 mt6627_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr); -fm_s32 mt6627_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value); -fm_s32 mt6627_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask); -fm_s32 mt6627_pwrup_fine_tune(fm_u8 *buf, fm_s32 buf_size); - -/* - * fm_get_channel_space - get the spcace of gived channel - * @freq - value in 760~1080 or 7600~10800 - * - * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0 - */ -extern fm_s32 fm_get_channel_space(int freq); - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h deleted file mode 100644 index c60b8f63d..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * (C) Copyright 20011 - * MediaTek <www.MediaTek.com> - * Hongcheng Xia<Hongcheng.Xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __FM_CUST_CFG_H__ -#define __FM_CUST_CFG_H__ - -/* scan sort algorithm */ -enum { - FM_SCAN_SORT_NON = 0, - FM_SCAN_SORT_UP, - FM_SCAN_SORT_DOWN, - FM_SCAN_SORT_MAX -}; -/*typedef struct { - fm_s32 short_ana_rssi_th; - fm_s32 long_ana_rssi_th; - fm_s32 desene_rssi_th; - fm_s32 pamd_th; - fm_s32 mr_th; - fm_s32 atdc_th; - fm_u32 prx_th; - fm_u32 atdev_th; - fm_u16 smg_th; - fm_u16 deemphasis; - fm_u16 osc_freq; -}mt6628_fm_rx_cust_cfg; - -typedef struct{ - mt6628_fm_rx_cust_cfg rx_cfg; -}mt6628_fm_cust_cfg; -*/ -/* ***************************************************************************************** */ -/* ***********************************FM config for customer: start****************************** */ -/* ***************************************************************************************** */ -/* RX */ -#define FM_RX_RSSI_TH_LONG_MT6627 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */ -#define FM_RX_RSSI_TH_SHORT_MT6627 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */ -#define FM_RX_DESENSE_RSSI_MT6627 -258 -#define FM_RX_PAMD_TH_MT6627 -12 -#define FM_RX_MR_TH_MT6627 -67 -#define FM_RX_ATDC_TH_MT6627 3496 -#define FM_RX_PRX_TH_MT6627 64 -#define FM_RX_SMG_TH_MT6627 16421 /* FM soft-mute gain threshold */ -#define FM_RX_DEEMPHASIS_MT6627 0 /* 0-50us, China Mainland; 1-75us China Taiwan */ -#define FM_RX_OSC_FREQ_MT6627 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */ -/* #define FM_RX_SEEK_SPACE_MT6627 1 //FM radio seek space,1:100KHZ; 2:200KHZ */ -/* #define FM_RX_SCAN_CH_SIZE_MT6627 40 //FM radio scan max channel size */ -/* #define FM_RX_BAND_MT6627 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -/* #define FM_RX_SCAN_SORT_SELECT_MT6627 FM_SCAN_SORT_NON */ -/* #define FM_RX_FAKE_CH_NUM_MT6627 1 */ -/* #define FM_RX_FAKE_CH_RSSI_MT6627 40 */ -/* #define FM_RX_FAKE_CH_1_MT6627 1075 */ -/* #define FM_RX_FAKE_CH_2_MT6627 0 */ -/* #define FM_RX_FAKE_CH_3_MT6627 0 */ -/* #define FM_RX_FAKE_CH_4_MT6627 0 */ -/* #define FM_RX_FAKE_CH_5_MT6627 0 */ - -/* TX */ -/* #define FM_TX_PWR_LEVEL_MAX_MT6627 120 */ -/* #define FM_TX_SCAN_HOLE_LOW_MT6627 923 //92.3MHz~95.4MHz should not show to user */ -/* #define FM_TX_SCAN_HOLE_HIGH_MT6627 954 //92.3MHz~95.4MHz should not show to user */ - - -/* ***************************************************************************************** */ -/* ***********************************FM config for customer:end ******************************* */ -/* ***************************************************************************************** */ - -/* #define FM_SEEK_SPACE_MT6627 FM_RX_SEEK_SPACE_MT6627 */ -/* max scan chl num */ -/* #define FM_MAX_CHL_SIZ_MT6627E FM_RX_SCAN_CH_SIZE_MT6627 */ -/* auto HiLo */ -#define FM_AUTO_HILO_OFF_MT6627 0 -#define FM_AUTO_HILO_ON_MT6627 1 - - -/* seek threshold */ -#define FM_SEEKTH_LEVEL_DEFAULT_MT6627 4 - -#endif /* __FM_CUST_CFG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h deleted file mode 100644 index 899607151..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __MT6627_FM_LIB_H__ -#define __MT6627_FM_LIB_H__ - -#include "fm_typedef.h" - -enum { - DSPPATCH = 0xFFF9, - USDELAY = 0xFFFA, - MSDELAY = 0xFFFB, - HW_VER = 0xFFFD, - POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */ - POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */ -}; - -enum { - FM_PUS_DSPPATCH = DSPPATCH, - FM_PUS_USDELAY = USDELAY, - FM_PUS_MSDELAY = MSDELAY, - FM_PUS_HW_VER = HW_VER, - FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */ - FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */ - FM_PUS_MAX -}; - -enum { - DSP_PATH = 0x02, - DSP_COEFF = 0x03, - DSP_HW_COEFF = 0x04 -}; - -enum IMG_TYPE { - IMG_WRONG = 0, - IMG_ROM, - IMG_PATCH, - IMG_COEFFICIENT, - IMG_HW_COEFFICIENT -}; - -enum { - mt6627_E1 = 0, - mt6627_E2 -}; - -struct mt6627_fm_cqi { - fm_u16 ch; - fm_u16 rssi; - fm_u16 reserve; -}; - -struct adapt_fm_cqi { - fm_s32 ch; - fm_s32 rssi; - fm_s32 reserve; -}; - -struct mt6627_full_cqi { - fm_u16 ch; - fm_u16 rssi; - fm_u16 pamd; - fm_u16 pr; - fm_u16 fpamd; - fm_u16 mr; - fm_u16 atdc; - fm_u16 prx; - fm_u16 atdev; - fm_u16 smg; /* soft-mute gain */ - fm_u16 drssi; /* delta rssi */ -}; - - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h deleted file mode 100644 index d72a14a62..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef __MT6627_FM_REG_H__ -#define __MT6627_FM_REG_H__ - -enum MT6627_REG { - FM_MAIN_CG1_CTRL = 0x60, - FM_MAIN_CG2_CTRL = 0x61, - FM_MAIN_HWVER = 0x62, - FM_MAIN_CTRL = 0x63, - FM_CHANNEL_SET = 0x65, - FM_MAIN_CFG1 = 0x66, - FM_MAIN_CFG2 = 0x67, - FM_MAIN_MCLKDESENSE = 0x38, - FM_MAIN_INTR = 0x69, - FM_MAIN_INTRMASK = 0x6A, - FM_MAIN_EXTINTRMASK = 0x6B, - FM_RSSI_IND = 0x6C, - FM_RSSI_TH = 0x6D, - FM_MAIN_RESET = 0x6E, - FM_MAIN_CHANDETSTAT = 0x6F, - FM_RDS_CFG0 = 0x80, - FM_RDS_INFO = 0x81, - FM_RDS_DATA_REG = 0x82, - FM_RDS_GOODBK_CNT = 0x83, - FM_RDS_BADBK_CNT = 0x84, - FM_RDS_PWDI = 0x85, - FM_RDS_PWDQ = 0x86, - FM_RDS_FIFO_STATUS0 = 0x87, - FM_FT_CON9 = 0x8F, - FM_DSP_PATCH_CTRL = 0x90, - FM_DSP_PATCH_OFFSET = 0x91, - FM_DSP_PATCH_DATA = 0x92, - FM_DSP_MEM_CTRL4 = 0x93, - FM_ADDR_PAMD = 0xB4, - FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6, - FM_RDS_POINTER = 0xF0, -}; - -/* RDS_BDGRP_ABD_CTRL_REG */ -enum { - BDGRP_ABD_EN = 0x0001, - BER_RUN = 0x2000 -}; -#define FM_DAC_CON1 0x83 -#define FM_DAC_CON2 0x84 -#define FM_FT_CON0 0x86 -enum { - FT_EN = 0x0001 -}; - -#define FM_I2S_CON0 0x90 -enum { - I2S_EN = 0x0001, - FORMAT = 0x0002, - WLEN = 0x0004, - I2S_SRC = 0x0008 -}; - -/* FM_MAIN_CTRL */ -enum { - TUNE = 0x0001, - SEEK = 0x0002, - SCAN = 0x0004, - CQI_READ = 0x0008, - RDS_MASK = 0x0010, - MUTE = 0x0020, - RDS_BRST = 0x0040, - RAMP_DOWN = 0x0100, -}; - -/* FM_MAIN_INTR */ -enum { - FM_INTR_STC_DONE = 0x0001, - FM_INTR_IQCAL_DONE = 0x0002, - FM_INTR_DESENSE_HIT = 0x0004, - FM_INTR_CHNL_CHG = 0x0008, - FM_INTR_SW_INTR = 0x0010, - FM_INTR_RDS = 0x0020 -}; - -enum { - ANTENNA_TYPE = 0x0010, /* 0x61 D4, 0:long, 1:short */ - ANALOG_I2S = 0x0080, /* 0x61 D7, 0:lineout, 1:I2S */ - DE_EMPHASIS = 0x1000, /* 0x61 D12,0:50us, 1:75 us */ -}; - -#define OSC_FREQ_BITS 0x0070 /* 0x60 bit4~6 */ -#define OSC_FREQ_MASK (~OSC_FREQ_BITS) - -#endif /* __MT6627_FM_REG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c deleted file mode 100644 index c0d5f6917..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c +++ /dev/null @@ -1,1038 +0,0 @@ -#include <linux/kernel.h> -#include <linux/types.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" -#include "fm_config.h" -#include "fm_link.h" - -#include "mt6627_fm_reg.h" -/* #include "mt6627_fm_link.h" */ -#include "mt6627_fm.h" -#include "mt6627_fm_cmd.h" -#include "mt6627_fm_cust_cfg.h" - -extern fm_cust_cfg mt6627_fm_config; - -static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_WRITE_BASIC_OP; - buf[1] = FM_WRITE_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((value) & 0x00FF); - buf[4] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - - return (FM_WRITE_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_UDELAY_BASIC_OP; - buf[1] = FM_UDELAY_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_UDELAY_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_RD_UNTIL_BASIC_OP; - buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask) & 0x00FF); - buf[4] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_RD_UNTIL_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MODIFY_BASIC_OP; - buf[1] = FM_MODIFY_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask_and) & 0x00FF); - buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask_or) & 0x00FF); - buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_MODIFY_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_top_write(fm_u16 addr, fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_TOP_WRITE_BOP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_TOP_WRITE_BASIC_OP; - buf[1] = FM_TOP_WRITE_BOP_SIZE; - buf[2] = 04; - buf[3] = (fm_u8) ((addr) & 0x00FF); - buf[4] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - buf[7] = (fm_u8) ((value >> 16) & 0x00FF); - buf[8] = (fm_u8) ((value >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], - buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8]); - - return (FM_TOP_WRITE_BOP_SIZE + 2); -} - - -static fm_s32 fm_bop_top_rd_until(fm_u16 addr, fm_u32 mask, fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_TOP_RD_UNTIL_BOP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_TOP_RD_UNTIL_BASIC_OP; - buf[1] = FM_TOP_RD_UNTIL_BOP_SIZE; - buf[2] = 04; - buf[3] = (fm_u8) ((addr) & 0x00FF); - buf[4] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask) & 0x00FF); - buf[6] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[7] = (fm_u8) ((mask >> 16) & 0x00FF); - buf[8] = (fm_u8) ((mask >> 24) & 0x00FF); - buf[9] = (fm_u8) ((value) & 0x00FF); - buf[10] = (fm_u8) ((value >> 8) & 0x00FF); - buf[11] = (fm_u8) ((value >> 16) & 0x00FF); - buf[12] = (fm_u8) ((value >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], - buf[10], buf[11], buf[12]); - - return (FM_TOP_RD_UNTIL_BOP_SIZE + 2); -} - -/* - * mt6627_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6627_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - fm_u16 de_emphasis; - /* fm_u16 osc_freq; */ - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - de_emphasis = mt6627_fm_config.rx_cfg.deemphasis; /* MT6627fm_cust_config_fetch(FM_CFG_RX_DEEMPHASIS); */ - de_emphasis &= 0x0001; /* rang 0~1 */ - /* osc_freq = mt6627_fm_config.rx_cfg.osc_freq;//MT6628fm_cust_config_fetch(FM_CFG_RX_OSC_FREQ); */ - /* osc_freq &= 0x0007; //rang 0~5 */ - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* 2,turn on top clock */ - pkt_size += fm_bop_top_write(0xA10, 0xFFFFFFFF, &buf[pkt_size], buf_size - pkt_size); /* wr a10 ffffffff */ - /* 3,enable MTCMOS */ - pkt_size += fm_bop_top_write(0x60, 0x00000030, &buf[pkt_size], buf_size - pkt_size); /* wr 60 30 */ - pkt_size += fm_bop_top_write(0x60, 0x00000035, &buf[pkt_size], buf_size - pkt_size); /* wr 60 35 */ - pkt_size += fm_bop_top_rd_until(0x60, 0x0000000A, 0xA, &buf[pkt_size], buf_size - pkt_size); /* Poll 60[1]=1,[3]= 1 */ - pkt_size += fm_bop_top_write(0x60, 0x00000015, &buf[pkt_size], buf_size - pkt_size); /* wr 60 15 */ - pkt_size += fm_bop_top_write(0x60, 0x00000005, &buf[pkt_size], buf_size - pkt_size); /* wr 60 5 */ - pkt_size += fm_bop_udelay(10, &buf[pkt_size], buf_size - pkt_size); /* delay 10us */ - pkt_size += fm_bop_top_write(0x60, 0x00000045, &buf[pkt_size], buf_size - pkt_size); /* wr 60 45 */ - /* 4,set CSPI fm slave dummy count */ - pkt_size += fm_bop_top_write(0x68, 0x0000003F, &buf[pkt_size], buf_size - pkt_size); /* wr 68 3F */ - - /* a1 enable digital OSC */ - pkt_size += fm_bop_top_write(0x50, 0x00000001, &buf[pkt_size], buf_size - pkt_size); /* wr 50 1 */ - pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */ - /* a3 set OSC clock output to fm */ - pkt_size += fm_bop_top_write(0x50, 0x00000003, &buf[pkt_size], buf_size - pkt_size); /* wr 50 3 */ - /* a4 release HW clock gating */ - pkt_size += fm_bop_top_write(0x50, 0x00000007, &buf[pkt_size], buf_size - pkt_size); /* wr 50 7 */ - /* set I2S current driving */ - pkt_size += fm_bop_top_write(0x000, 0x00000000, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0 */ - /* a5 enable DSP auto clock gating */ - pkt_size += fm_bop_write(0x70, 0x0040, &buf[pkt_size], buf_size - pkt_size); /* wr 70 0040 */ - /* a7 deemphasis setting */ - pkt_size += - fm_bop_modify(0x61, ~DE_EMPHASIS, (de_emphasis << 12), &buf[pkt_size], - buf_size - pkt_size); - - /* pkt_size += fm_bop_modify(0x60, OSC_FREQ_MASK, (osc_freq << 4), &buf[pkt_size], buf_size - pkt_size); */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_patch_download - Wholechip FM Power Up: step 3, download patch to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6627_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_PATCH_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6627_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6627_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_COEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -#if 0 -/* - * mt6627_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6627_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6627_rom_download - Wholechip FM Power Up: step 3,download rom to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6627_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ROM_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} -#endif - -/* - * mt6627_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6627_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - /* FM RF&ADPLL divider setting */ - /* D2.1 set cell mode */ - /* wr 30 D3:D2 00:FDD(default),01:both.10: TDD, 11 FDD */ - /* pkt_size += fm_bop_modify(0x30, 0xFFF3, 0x0000, &buf[pkt_size], buf_size - pkt_size); */ - /* D2.2 set ADPLL divider */ - pkt_size += fm_bop_write(0x21, 0xE000, &buf[pkt_size], buf_size - pkt_size); /* wr 21 E000 */ - /* D2.3 set SDM coeff0_H */ - pkt_size += fm_bop_write(0xD8, 0x03F0, &buf[pkt_size], buf_size - pkt_size); /* wr D8 0x03F0 */ - /* D2.4 set SDM coeff0_L */ - pkt_size += fm_bop_write(0xD9, 0x3F04, &buf[pkt_size], buf_size - pkt_size); /* wr D9 0x3F04 */ - /* D2.5 set SDM coeff1_H */ - pkt_size += fm_bop_write(0xDA, 0x0014, &buf[pkt_size], buf_size - pkt_size); /* wr DA 0x0014 */ - /* D2.6 set SDM coeff1_L */ - pkt_size += fm_bop_write(0xDB, 0x2A38, &buf[pkt_size], buf_size - pkt_size); /* wr DB 0x2A38 */ - /* D2.7 set 26M clock */ - pkt_size += fm_bop_write(0x23, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 23 4000 */ - - /* FM Digital Init: fm_rgf_maincon */ - /* E4 */ - pkt_size += fm_bop_write(0x6A, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 0021 */ - pkt_size += fm_bop_write(0x6B, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0021 */ - /* E5 */ - pkt_size += fm_bop_top_write(0x50, 0x0000000F, &buf[pkt_size], buf_size - pkt_size); /* wr 50 f */ - /* E6 */ - pkt_size += fm_bop_modify(0x61, 0xFFFD, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D1=1 */ - /* E7 */ - pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D0=0 */ - /* E8 */ - pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */ - /* E9 */ - pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6627_pwrup_fine_tune - Wholechip FM Power Up: step 5, FM RF fine tune setting - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6627_pwrup_fine_tune(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* F1 set host control RF register */ - pkt_size += fm_bop_top_write(0x50, 0x00000007, &buf[pkt_size], buf_size - pkt_size); /* wr 50 7 */ - /* F2 fine tune RF setting */ - pkt_size += fm_bop_write(0x01, 0xBEE8, &buf[pkt_size], buf_size - pkt_size); /* wr 01 0xBEE8 */ - pkt_size += fm_bop_write(0x03, 0xF6ED, &buf[pkt_size], buf_size - pkt_size); /* wr 03 0xF6ED mdy 0315 version */ - pkt_size += fm_bop_write(0x15, 0x0D80, &buf[pkt_size], buf_size - pkt_size); /* wr 15 0x0D80 */ - pkt_size += fm_bop_write(0x16, 0x0068, &buf[pkt_size], buf_size - pkt_size); /* wr 16 0x0068 */ - pkt_size += fm_bop_write(0x17, 0x092A, &buf[pkt_size], buf_size - pkt_size); /* wr 17 0x092A */ - pkt_size += fm_bop_write(0x34, 0x807F, &buf[pkt_size], buf_size - pkt_size); /* wr 34 0x807F */ - pkt_size += fm_bop_write(0x35, 0x311E, &buf[pkt_size], buf_size - pkt_size); /* wr 35 0x311E */ - /* F1 set DSP control RF register */ - pkt_size += fm_bop_top_write(0x50, 0x0000000F, &buf[pkt_size], buf_size - pkt_size); /* wr 50 F */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_pwrdown - Wholechip FM Power down: Digital Modem Power Down - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6627_pwrdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - /* A1:set audio output I2S Tx mode: */ - pkt_size += fm_bop_modify(0x9B, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9B[0~2] 0 */ - - /* B0:Disable HW clock control */ - pkt_size += fm_bop_top_write(0x50, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr top50 330F */ - /* B1:Reset ASIP */ - pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */ - /* B2:digital core + digital rgf reset */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - /* B3:Disable all clock */ - pkt_size += fm_bop_top_write(0x50, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr top50 0000 */ - /* B4:Reset rgfrf */ - pkt_size += fm_bop_top_write(0x50, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr top50 4000 */ - pkt_size += fm_bop_top_write(0x50, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr top50 0000 */ - /* MTCMOS power off */ - /* C0:disable MTCMOS */ - pkt_size += fm_bop_top_write(0x60, 0x0005, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0005 */ - pkt_size += fm_bop_top_write(0x60, 0x0015, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0015 */ - pkt_size += fm_bop_top_write(0x60, 0x0035, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0035 */ - pkt_size += fm_bop_top_write(0x60, 0x0030, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0030 */ - pkt_size += fm_bop_top_rd_until(0x60, 0x0000000A, 0x0, &buf[pkt_size], buf_size - pkt_size); /* Poll 60[1]=0,[3]= 0 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_rampdown - f/w will wait for STC_DONE interrupt - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6627_rampdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - /* Clear DSP state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */ - /* Set DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */ - /* @Wait for STC_DONE interrupt@ */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Clear DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_tune - execute tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6627_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para) -{ - /* #define FM_TUNE_USE_POLL */ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } -/* - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; -*/ - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* Set desired channel & channel parameter */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_write(0x6A, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size); -#endif - /* pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size);// set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* channel para setting, D15~D12, D15: ATJ, D13: HL, D12: FA */ - /* pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size], buf_size - pkt_size); */ - /* Enable hardware controlled tuning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - /* Wait for STC_DONE interrupt */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ -#endif - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_full_cqi_req - execute request cqi info action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 7600 ~ 10800, freq array - * @cnt - channel count - * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step - * - * return package size - */ -fm_s32 mt6627_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SOFT_MUTE_TUNE_OPCODE; - pkt_size = 4; - - switch (type) { - case 1: - buf[pkt_size] = 0x0001; - pkt_size++; - buf[pkt_size] = (fm_u8) ((*freq) & 0x00FF); - pkt_size++; - buf[pkt_size] = (fm_u8) ((*freq >> 8) & 0x00FF); - pkt_size++; - break; - case 2: - buf[pkt_size] = 0x0002; - pkt_size++; - break; - case 3: - buf[pkt_size] = 0x0003; - pkt_size++; - break; - case 4: - buf[pkt_size] = 0x0004; - pkt_size++; - break; - default: - buf[pkt_size] = (fm_u16) type; - pkt_size++; - break; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_seek - execute seek action, - * @buf - target buf - * @buf_size - buffer size - * @seekdir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6627_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (seekdir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* 0x66[9:0] freq upper bound */ - - max_freq = (max_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - - min_freq = (min_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6627_scan - execute scan action, - * @buf - target buf - * @buf_size - buffer size - * @scandir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6627_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (scandir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */ - /* 0x66[9:0] freq upper bound */ - - max_freq = (max_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - - min_freq = (min_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled scanning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -fm_s32 mt6627_cqi_get(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit0~2 0 */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, ~CQI_READ, CQI_READ, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit3 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -fm_s32 mt6627_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_READ_OPCODE; - buf[2] = 0x01; - buf[3] = 0x00; - buf[4] = addr; - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - return 5; -} - - -fm_s32 mt6627_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_WRITE_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = addr; - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} - - -fm_s32 mt6627_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 pkt_size = 0; - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = 0x11; /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */ - pkt_size = 4; - pkt_size += fm_bop_modify(addr, mask, bits, &buf[pkt_size], buf_size - pkt_size); - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/*top register read*/ -fm_s32 mt6627_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = CSPI_READ_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = 0x04; /* top 04,fm 02 */ - buf[5] = (fm_u8) ((addr) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} - - -fm_s32 mt6627_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = CSPI_WRITE_OPCODE; - buf[2] = 0x07; - buf[3] = 0x00; - buf[4] = 0x04; /* top 04,fm 02 */ - buf[5] = (fm_u8) ((addr) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[7] = (fm_u8) ((value) & 0x00FF); - buf[8] = (fm_u8) ((value >> 8) & 0x00FF); - buf[9] = (fm_u8) ((value >> 16) & 0x00FF); - buf[10] = (fm_u8) ((value >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], - buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]); - return 11; -} - -/*host register read*/ -fm_s32 mt6627_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HOST_READ_OPCODE; - buf[2] = 0x04; - buf[3] = 0x00; - buf[4] = (fm_u8) ((addr) & 0x00FF); - buf[5] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 16) & 0x00FF); - buf[7] = (fm_u8) ((addr >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6], buf[7]); - return 8; -} - - -fm_s32 mt6627_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HOST_WRITE_OPCODE; - buf[2] = 0x08; - buf[3] = 0x00; - buf[4] = (fm_u8) ((addr) & 0x00FF); - buf[5] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 16) & 0x00FF); - buf[7] = (fm_u8) ((addr >> 24) & 0x00FF); - buf[8] = (fm_u8) ((value) & 0x00FF); - buf[9] = (fm_u8) ((value >> 8) & 0x00FF); - buf[10] = (fm_u8) ((value >> 16) & 0x00FF); - buf[11] = (fm_u8) ((value >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], - buf[10], buf[11]); - return 12; -} diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c deleted file mode 100644 index cde6e66ef..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c +++ /dev/null @@ -1,180 +0,0 @@ -/* mt6627_fm_config.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/string.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_config.h" -/* #include "fm_cust_cfg.h" */ -#include "mt6627_fm_cust_cfg.h" -fm_cust_cfg mt6627_fm_config; -/* static fm_s32 fm_index = 0; */ - -static fm_s32 MT6627fm_cust_config_print(fm_cust_cfg *cfg) -{ - WCN_DBG(FM_NTC | MAIN, "MT6627 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 mr_th:\t%d\n", cfg->rx_cfg.mr_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 prx_th:\t%d\n", cfg->rx_cfg.prx_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th); - WCN_DBG(FM_NTC | MAIN, "MT6627 smg_th:\t%d\n", cfg->rx_cfg.smg_th); - WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis); - WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq); - - WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path, - cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode, - cfg->aud_cfg.i2s_info.rate); - return 0; -} - -static fm_s32 MT6627cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg; - - if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6627", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */ - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6627", - &rx_cfg->short_ana_rssi_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6627", - &rx_cfg->desene_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6627", &rx_cfg->pamd_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6627", &rx_cfg->mr_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6627", &rx_cfg->atdc_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6627", &rx_cfg->prx_th))) { - return ret; - } - /*else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDEV_TH_MT6627", &rx_cfg->atdev_th))) - { - return ret; - } */ - else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6627", &rx_cfg->smg_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6627", &rx_cfg->deemphasis))) { - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6627", &rx_cfg->osc_freq))) { - return ret; - } else { - WCN_DBG(FM_WAR | MAIN, "MT6627 invalid key\n"); - return -1; - } -} - -static fm_s32 MT6627fm_cust_config_default(fm_cust_cfg *cfg) -{ - FMR_ASSERT(cfg); - - cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6627; - cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6627; - cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6627; - cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6627; - cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6627; - cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6627; - cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6627; - cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6627; - cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6627; - cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6627; - - cfg->aud_cfg.aud_path = FM_AUD_I2S; - cfg->aud_cfg.i2s_info.status = FM_I2S_OFF; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MASTER; - cfg->aud_cfg.i2s_info.rate = FM_I2S_32K; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_CONN; - - return 0; -} - -static fm_s32 MT6627fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - fm_s8 *buf = NULL; - fm_s32 file_len = 0; - - if (!(buf = fm_zalloc(4096))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n"); - return -ENOMEM; - } -/* fm_index = 0; */ - - file_len = fm_file_read(filename, buf, 4096, 0); - - if (file_len <= 0) { - ret = -1; - goto out; - } - - ret = cfg_parser(buf, MT6627cfg_item_handler, cfg); - - out: - - if (buf) { - fm_free(buf); - } - - return ret; -} - -#define MT6627_FM_CUST_CFG_PATH "etc/fmr/mt6627_fm_cust.cfg" -fm_s32 MT6627fm_cust_config_setup(const fm_s8 *filepath) -{ - fm_s32 ret = 0; - fm_s8 *filep = NULL; - fm_s8 file_path[51] = { 0 }; - - MT6627fm_cust_config_default(&mt6627_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6627 FM default config\n"); - MT6627fm_cust_config_print(&mt6627_fm_config); - - if (!filepath) { - filep = MT6627_FM_CUST_CFG_PATH; - } else { - memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath)); - filep = file_path; - trim_path(&filep); - } - - ret = MT6627fm_cust_config_file(filep, &mt6627_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6627 FM cust config\n"); - MT6627fm_cust_config_print(&mt6627_fm_config); - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c deleted file mode 100644 index fa958cf32..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c +++ /dev/null @@ -1,2126 +0,0 @@ -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/vmalloc.h> - -#include "osal_typedef.h" -#include "stp_exp.h" -#include "wmt_exp.h" - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_utils.h" -#include "fm_link.h" -#include "fm_config.h" -#include "fm_private.h" - -#include "mt6627_fm_reg.h" -#include "mt6627_fm.h" -#include "mt6627_fm_lib.h" -#include "mt6627_fm_cmd.h" -#include "mt6627_fm_cust_cfg.h" -/* #include "mach/mt_gpio.h" */ -extern fm_cust_cfg mt6627_fm_config; - -/* #define MT6627_FM_PATCH_PATH "/etc/firmware/mt6627/mt6627_fm_patch.bin" */ -/* #define MT6627_FM_COEFF_PATH "/etc/firmware/mt6627/mt6627_fm_coeff.bin" */ -/* #define MT6627_FM_HWCOEFF_PATH "/etc/firmware/mt6627/mt6627_fm_hwcoeff.bin" */ -/* #define MT6627_FM_ROM_PATH "/etc/firmware/mt6627/mt6627_fm_rom.bin" */ - -static struct fm_patch_tbl mt6627_patch_tbl[5] = { - {FM_ROM_V1, "/etc/firmware/mt6627/mt6627_fm_v1_patch.bin", - "/etc/firmware/mt6627/mt6627_fm_v1_coeff.bin", NULL, NULL}, - {FM_ROM_V2, "/etc/firmware/mt6627/mt6627_fm_v2_patch.bin", - "/etc/firmware/mt6627/mt6627_fm_v2_coeff.bin", NULL, NULL}, - {FM_ROM_V3, "/etc/firmware/mt6627/mt6627_fm_v3_patch.bin", - "/etc/firmware/mt6627/mt6627_fm_v3_coeff.bin", NULL, NULL}, - {FM_ROM_V4, "/etc/firmware/mt6627/mt6627_fm_v4_patch.bin", - "/etc/firmware/mt6627/mt6627_fm_v4_coeff.bin", NULL, NULL}, - {FM_ROM_V5, "/etc/firmware/mt6627/mt6627_fm_v5_patch.bin", - "/etc/firmware/mt6627/mt6627_fm_v5_coeff.bin", NULL, NULL}, -}; - -static struct fm_hw_info mt6627_hw_info = { - .chip_id = 0x00006627, - .eco_ver = 0x00000000, - .rom_ver = 0x00000000, - .patch_ver = 0x00000000, - .reserve = 0x00000000, -}; - -#define PATCH_SEG_LEN 512 - -static fm_u8 *cmd_buf; -static struct fm_lock *cmd_buf_lock; -static struct fm_callback *fm_cb_op; -static struct fm_res_ctx *mt6627_res; -/* static fm_s32 Chip_Version = mt6627_E1; */ - -/* static fm_bool rssi_th_set = fm_false; */ - - -#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */ -static struct fm_fifo *cqi_fifo; -#endif -static fm_s32 mt6627_is_dese_chan(fm_u16 freq); -static fm_bool mt6627_I2S_hopping_check(fm_u16 freq); - -#if 0 -static fm_s32 mt6627_mcu_dese(fm_u16 freq, void *arg); -static fm_s32 mt6627_gps_dese(fm_u16 freq, void *arg); -static fm_s32 mt6627_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample); -#endif -static fm_u16 mt6627_chan_para_get(fm_u16 freq); -static fm_s32 mt6627_desense_check(fm_u16 freq, fm_s32 rssi); -static fm_bool mt6627_TDD_chan_check(fm_u16 freq); -static fm_s32 mt6627_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid); -static fm_s32 mt6627_pwron(fm_s32 data) -{ - /*//Turn on FM on 6627 chip by WMT driver - if(MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_LPBK)){ - WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK Fail!\n"); - return -FM_ELINK; - }else{ - WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK OK!\n"); - //return 0; - } */ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) { - WCN_DBG(FM_ALT | CHIP, "WMT turn on FM Fail!\n"); - return -FM_ELINK; - } else { - WCN_DBG(FM_ALT | CHIP, "WMT turn on FM OK!\n"); - return 0; - } -} - - -static fm_s32 mt6627_pwroff(fm_s32 data) -{ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) { - WCN_DBG(FM_ALT | CHIP, "WMT turn off FM Fail!\n"); - return -FM_ELINK; - } else { - WCN_DBG(FM_NTC | CHIP, "WMT turn off FM OK!\n"); - return 0; - } -} - -static fm_s32 Delayms(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data); - msleep(data); - return 0; -} - -static fm_s32 Delayus(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data); - udelay(data); - return 0; -} - -fm_s32 mt6627_get_read_result(struct fm_res_ctx *result) -{ - FMR_ASSERT(result); - mt6627_res = result; - - return 0; -} - -static fm_s32 mt6627_read(fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6627_get_read_result); - - if (!ret && mt6627_res) { - *val = mt6627_res->fspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6627_write(fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6627_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_set_bits_reg(cmd_buf, TX_BUF_SIZE, addr, bits, mask); - ret = fm_cmd_tx(cmd_buf, pkt_size, (1 << 0x11), SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */ - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6627_top_read(fm_u16 addr, fm_u32 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_top_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_CSPI_READ, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6627_get_read_result); - - if (!ret && mt6627_res) { - *val = mt6627_res->cspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6627_top_write(fm_u16 addr, fm_u32 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_top_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_CSPI_WRITE, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -/*static fm_s32 mt6627_top_set_bits(fm_u16 addr, fm_u32 bits, fm_u32 mask) -{ - fm_s32 ret = 0; - fm_u32 val; - - ret = mt6627_top_read(addr, &val); - - if (ret) - return ret; - - val = ((val & (mask)) | bits); - ret = mt6627_top_write(addr, val); - - return ret; -}*/ - -static fm_s32 mt6627_host_read(fm_u32 addr, fm_u32 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_host_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_READ, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6627_get_read_result); - - if (!ret && mt6627_res) { - *val = mt6627_res->cspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6627_host_write(fm_u32 addr, fm_u32 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_host_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_WRITE, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -/*static fm_s32 mt6627_DSP_write(fm_u16 addr, fm_u16 val) -{ - mt6627_write(0xE2, addr); - mt6627_write(0xE3, val); - mt6627_write(0xE1, 0x0002); - return 0; -} -static fm_s32 mt6627_DSP_read(fm_u16 addr, fm_u16 *val) -{ - fm_s32 ret=-1; - mt6627_write(0xE2, addr); - mt6627_write(0xE1, 0x0001); - ret = mt6627_read(0xE4, val); - return ret; -}*/ -static fm_u16 mt6627_get_chipid(void) -{ - return 0x6627; -} - -/* MT6627_SetAntennaType - set Antenna type - * @type - 1,Short Antenna; 0, Long Antenna - */ -static fm_s32 mt6627_SetAntennaType(fm_s32 type) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long"); - mt6627_read(FM_MAIN_CG2_CTRL, &dataRead); - - if (type) { - dataRead |= ANTENNA_TYPE; - } else { - dataRead &= (~ANTENNA_TYPE); - } - - mt6627_write(FM_MAIN_CG2_CTRL, dataRead); - - return 0; -} - -static fm_s32 mt6627_GetAntennaType(void) -{ - fm_u16 dataRead; - - mt6627_read(FM_MAIN_CG2_CTRL, &dataRead); - WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long"); - - if (dataRead & ANTENNA_TYPE) - return FM_ANA_SHORT; /* short antenna */ - else - return FM_ANA_LONG; /* long antenna */ -} - - -static fm_s32 mt6627_Mute(fm_bool mute) -{ - fm_s32 ret = 0; - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute"); - /* mt6627_read(FM_MAIN_CTRL, &dataRead); */ - mt6627_read(0x9C, &dataRead); - - /* mt6627_top_write(0x0050,0x00000007); */ - if (mute == 1) { - ret = mt6627_write(0x9C, (dataRead & 0xFFFC) | 0x0003); - } else { - ret = mt6627_write(0x9C, (dataRead & 0xFFFC)); - } - /* mt6627_top_write(0x0050,0x0000000F); */ - - return ret; -} - - -/*static fm_s32 mt6627_set_RSSITh(fm_u16 TH_long, fm_u16 TH_short) -{ - mt6627_write(0xE2, 0x3072); - mt6627_write(0xE3, TH_long); - mt6627_write(0xE1, 0x0002); - Delayms(1); - mt6627_write(0xE2, 0x307A); - mt6627_write(0xE3, TH_short); - mt6627_write(0xE1, 0x0002); - - WCN_DBG(FM_DBG | CHIP, "RSSI TH, long:0x%04x, short:0x%04x", TH_long, TH_short); - return 0; -} -*/ -/* -static fm_s32 mt6627_set_SMGTh(fm_s32 ver, fm_u16 TH_smg) -{ - if (mt6627_E1 == ver) { - mt6627_write(0xE2, 0x321E); - mt6627_write(0xE3, TH_smg); - mt6627_write(0xE1, 0x0002); - } else { - mt6627_write(0xE2, 0x3218); - mt6627_write(0xE3, TH_smg); - mt6627_write(0xE1, 0x0002); - } - - WCN_DBG(FM_DBG | CHIP, "Soft-mute gain TH %d\n", (int)TH_smg); - return 0; -} -*/ -static fm_s32 mt6627_RampDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - /* fm_u16 tmp; */ - - WCN_DBG(FM_DBG | CHIP, "ramp down\n"); - /* pwer up sequence 0425 */ - ret = mt6627_top_write(0x0050, 0x00000007); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr top 0x50 failed\n"); - return ret; - } - - ret = mt6627_set_bits(0x0F, 0x0000, 0xF800); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr 0x0f failed\n"); - return ret; - } - - ret = mt6627_top_write(0x0050, 0x0000000F); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr top 0x50 failed\n"); - return ret; - } - - /* mt6627_read(FM_MAIN_INTRMASK, &tmp); */ - ret = mt6627_write(FM_MAIN_INTRMASK, 0x0000); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_INTRMASK failed\n"); - return ret; - } - - ret = mt6627_write(FM_MAIN_EXTINTRMASK, 0x0000); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_EXTINTRMASK failed\n"); - return ret; - } - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_rampdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down failed\n"); - return ret; - } - - ret = mt6627_write(FM_MAIN_EXTINTRMASK, 0x0021); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_EXTINTRMASK failed\n"); - return ret; - } - - ret = mt6627_write(FM_MAIN_INTRMASK, 0x0021); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_INTRMASK failed\n"); - } - - return ret; -} - -static fm_s32 mt6627_get_rom_version(void) -{ - fm_u16 tmp; - fm_s32 ret; - - /* DSP rom code version request enable --- set 0x61 b15=1 */ - mt6627_set_bits(0x61, 0x8000, 0x7FFF); - - /* Release ASIP reset --- set 0x61 b1=1 */ - mt6627_set_bits(0x61, 0x0002, 0xFFFD); - - /* Enable ASIP power --- set 0x61 b0=0 */ - mt6627_set_bits(0x61, 0x0000, 0xFFFE); - - /* Wait DSP code version ready --- wait 1ms */ - do { - Delayus(1000); - ret = mt6627_read(0x84, &tmp); - /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */ - /* now cancel FM power up sequence is recommended. */ - if (ret) { - return ret; - } - WCN_DBG(FM_NTC | CHIP, "0x84=%x\n", tmp); - } while (tmp != 0x0001); - - /* Get FM DSP code version --- rd 0x83[15:8] */ - mt6627_read(0x83, &tmp); - tmp = (tmp >> 8); - - /* DSP rom code version request disable --- set 0x61 b15=0 */ - mt6627_set_bits(0x61, 0x0000, 0x7FFF); - - /* Reset ASIP --- set 0x61[1:0] = 1 */ - mt6627_set_bits(0x61, 0x0001, 0xFFFC); - - /* WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", (fm_s32)tmp); */ - return (fm_s32) tmp; -} - -static fm_s32 mt6627_get_patch_path(fm_s32 ver, const fm_s8 **ppath) -{ - fm_s32 i; - fm_s32 max = sizeof(mt6627_patch_tbl) / sizeof(mt6627_patch_tbl[0]); - - /* check if the ROM version is defined or not */ - for (i = 0; i < max; i++) { - if ((mt6627_patch_tbl[i].idx == ver) - && (fm_file_exist(mt6627_patch_tbl[i].patch) == 0)) { - *ppath = mt6627_patch_tbl[i].patch; - WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n"); - return 0; - } - } - - /* the ROM version isn't defined, find a latest patch instead */ - for (i = max; i > 0; i--) { - if (fm_file_exist(mt6627_patch_tbl[i - 1].patch) == 0) { - *ppath = mt6627_patch_tbl[i - 1].patch; - WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n"); - return 1; - } - } - - /* get path failed */ - WCN_DBG(FM_ERR | CHIP, "No valid patch file\n"); - return -FM_EPATCH; -} - - -static fm_s32 mt6627_get_coeff_path(fm_s32 ver, const fm_s8 **ppath) -{ - fm_s32 i; - fm_s32 max = sizeof(mt6627_patch_tbl) / sizeof(mt6627_patch_tbl[0]); - - /* check if the ROM version is defined or not */ - for (i = 0; i < max; i++) { - if ((mt6627_patch_tbl[i].idx == ver) - && (fm_file_exist(mt6627_patch_tbl[i].coeff) == 0)) { - *ppath = mt6627_patch_tbl[i].coeff; - WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n"); - return 0; - } - } - - - /* the ROM version isn't defined, find a latest patch instead */ - for (i = max; i > 0; i--) { - if (fm_file_exist(mt6627_patch_tbl[i - 1].coeff) == 0) { - *ppath = mt6627_patch_tbl[i - 1].coeff; - WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n"); - return 1; - } - } - - /* get path failed */ - WCN_DBG(FM_ERR | CHIP, "No valid coeff file\n"); - return -FM_EPATCH; -} - - -/* -* mt6627_DspPatch - DSP download procedure -* @img - source dsp bin code -* @len - patch length in byte -* @type - rom/patch/coefficient/hw_coefficient -*/ -static fm_s32 mt6627_DspPatch(const fm_u8 *img, fm_s32 len, enum IMG_TYPE type) -{ - fm_u8 seg_num; - fm_u8 seg_id = 0; - fm_s32 seg_len; - fm_s32 ret = 0; - fm_u16 pkt_size; - - FMR_ASSERT(img); - - if (len <= 0) { - return -1; - } - - seg_num = len / PATCH_SEG_LEN + 1; - WCN_DBG(FM_NTC | CHIP, "binary len:%d, seg num:%d\n", len, seg_num); - - switch (type) { -#if 0 - case IMG_ROM: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "rom,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6627_rom_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_ROM, SW_RETRY_CNT, ROM_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_rom_download failed\n"); - return ret; - } - } - - break; -#endif - case IMG_PATCH: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "patch,[seg_id:%d], [seg_len:%d]\n", seg_id, - seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6627_patch_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_PATCH, SW_RETRY_CNT, PATCH_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_patch_download failed\n"); - return ret; - } - } - - break; -#if 0 - case IMG_HW_COEFFICIENT: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "hwcoeff,[seg_id:%d], [seg_len:%d]\n", seg_id, - seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6627_hwcoeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_HWCOEFF, SW_RETRY_CNT, - HWCOEFF_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_hwcoeff_download failed\n"); - return ret; - } - } - - break; -#endif - case IMG_COEFFICIENT: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "coeff,[seg_id:%d], [seg_len:%d]\n", seg_id, - seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6627_coeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_COEFF, SW_RETRY_CNT, COEFF_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_coeff_download failed\n"); - return ret; - } - } - - break; - default: - break; - } - - return 0; -} - - -static fm_s32 mt6627_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) -{ -#define PATCH_BUF_SIZE 4096*6 - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 tmp_reg = 0; -#if defined(MT6625_FM) - fm_u32 host_reg = 0; -#endif - - const fm_s8 *path_patch = NULL; - const fm_s8 *path_coeff = NULL; - /* const fm_s8 *path_hwcoeff = NULL; */ - /* fm_s32 coeff_len = 0; */ - fm_s32 patch_len = 0; - fm_u8 *dsp_buf = NULL; - - FMR_ASSERT(chip_id); - FMR_ASSERT(device_id); - - WCN_DBG(FM_DBG | CHIP, "pwr on seq......\n"); - - /* Wholechip FM Power Up: step 1, set common SPI parameter */ - ret = mt6627_host_write(0x8013000C, 0x0000801F); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " pwrup set CSPI failed\n"); - return ret; - } -#if defined(MT6625_FM) - ret = mt6627_host_read(0x80101030,&host_reg); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " pwrup read 0x80100030 failed\n"); - return ret; - } - ret = mt6627_host_write(0x80101030, host_reg|(1<<1)); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " pwrup enable top_ck_en_adie failed\n"); - return ret; - } - - /* enable bgldo */ - ret = mt6627_top_read(0x00c0, &tmp_reg); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "power up read top 0xc0 failed\n"); - return ret; - } - ret = mt6627_top_write(0x00c0, tmp_reg|(0x3<<27)); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "power up write top 0xc0 failed\n"); - return ret; - } -#endif - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_pwrup_clock_on(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_pwrup_clock_on failed\n"); - return ret; - } -/* #ifdef FM_DIGITAL_INPUT */ - /* mt6627_I2s_Setting(MT6627_I2S_ON, MT6627_I2S_MASTER, MT6627_I2S_44K); */ - /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */ - /* mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X)CMB_STUB_AIF_2); */ -/* #endif */ - - /* Wholechip FM Power Up: step 2, read HW version */ - mt6627_read(0x62, &tmp_reg); - /* *chip_id = tmp_reg; */ - if ((tmp_reg == 0x6625) || (tmp_reg == 0x6627)) - *chip_id = 0x6627; - *device_id = tmp_reg; - mt6627_hw_info.chip_id = (fm_s32) tmp_reg; - WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg); - - if ((mt6627_hw_info.chip_id != 0x6627) && (mt6627_hw_info.chip_id != 0x6625)) { - WCN_DBG(FM_NTC | CHIP, "fm sys error, reset hw\n"); - return (-FM_EFW); - } - - mt6627_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get(); - WCN_DBG(FM_NTC | CHIP, "ECO version:0x%08x\n", mt6627_hw_info.eco_ver); - mt6627_hw_info.eco_ver += 1; - - /* get mt6627 DSP rom version */ - if ((ret = mt6627_get_rom_version()) >= 0) { - mt6627_hw_info.rom_ver = ret; - WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", mt6627_hw_info.rom_ver); - } else { - WCN_DBG(FM_ERR | CHIP, "get ROM version failed\n"); - /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */ - /* now cancel FM power up sequence is recommended. */ - return ret; - } - - /* Wholechip FM Power Up: step 3, download patch */ - if (!(dsp_buf = fm_vmalloc(PATCH_BUF_SIZE))) { - WCN_DBG(FM_ALT | CHIP, "-ENOMEM\n"); - return -ENOMEM; - } - - ret = mt6627_get_patch_path(mt6627_hw_info.rom_ver, &path_patch); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " mt6627_get_patch_path failed\n"); - return ret; - } - patch_len = fm_file_read(path_patch, dsp_buf, PATCH_BUF_SIZE, 0); - ret = mt6627_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_PATCH); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " DL DSPpatch failed\n"); - return ret; - } - - ret = mt6627_get_coeff_path(mt6627_hw_info.rom_ver, &path_coeff); - patch_len = fm_file_read(path_coeff, dsp_buf, PATCH_BUF_SIZE, 0); - - mt6627_hw_info.rom_ver += 1; - - tmp_reg = dsp_buf[38] | (dsp_buf[39] << 8); /* to be confirmed */ - mt6627_hw_info.patch_ver = (fm_s32) tmp_reg; - WCN_DBG(FM_NTC | CHIP, "Patch version: 0x%08x\n", mt6627_hw_info.patch_ver); - - if (ret == 1) { - dsp_buf[4] = 0x00; /* if we found rom version undefined, we should disable patch */ - dsp_buf[5] = 0x00; - } - - ret = mt6627_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_COEFFICIENT); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " DL DSPcoeff failed\n"); - return ret; - } - mt6627_write(0x92, 0x0000); /* ? */ - mt6627_write(0x90, 0x0040); - mt6627_write(0x90, 0x0000); - - if (dsp_buf) { - fm_vfree(dsp_buf); - dsp_buf = NULL; - } - /* Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_pwrup_digital_init(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_pwrup_digital_init failed\n"); - return ret; - } - /* Wholechip FM Power Up: step 5, FM RF fine tune setting */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_pwrup_fine_tune(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_pwrup_fine_tune failed\n"); - return ret; - } - /* enable connsys FM 2 wire RX */ - mt6627_write(0x9B, 0xF9AB); - mt6627_host_write(0x80101054, 0x00003f35); - - WCN_DBG(FM_NTC | CHIP, "pwr on seq ok\n"); - - return ret; -} - -static fm_s32 mt6627_PowerDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 dataRead; - fm_u32 tem; - fm_u32 host_reg = 0; - - WCN_DBG(FM_DBG | CHIP, "pwr down seq\n"); - /*SW work around for MCUFA issue. - *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well. - * In case read interrupt, and clean if interrupt found before rampdown. - */ - mt6627_read(FM_MAIN_INTR, &dataRead); - - if (dataRead & 0x1) { - mt6627_write(FM_MAIN_INTR, dataRead); /* clear status flag */ - } - - //mt6627_RampDown(); - -/* #ifdef FM_DIGITAL_INPUT */ -/* mt6627_I2s_Setting(MT6627_I2S_OFF, MT6627_I2S_SLAVE, MT6627_I2S_44K); */ -/* #endif */ - /* pwer up sequence 0425 */ - /* A0:set audio output I2X Rx mode: */ - mt6627_host_read(0x80101054, &tem); - tem = tem & 0xFFFF9FFF; - mt6627_host_write(0x80101054, tem); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_pwrdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_pwrdown failed\n"); - return ret; - } - /* FIX_ME, disable ext interrupt */ - mt6627_write(FM_MAIN_EXTINTRMASK, 0x00); - -#if defined(MT6625_FM) - ret = mt6627_host_read(0x80101030,&host_reg); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " pwroff read 0x80100030 failed\n"); - return ret; - } - ret = mt6627_host_write(0x80101030, host_reg&(~(0x1<<1))); - if (ret) { - WCN_DBG(FM_ALT | CHIP, " pwroff diable top_ck_en_adie failed\n"); - return ret; - } -#endif - -/* rssi_th_set = fm_false; */ - return ret; -} - -/* just for dgb */ -#if 0 -static void mt6627_bt_write(fm_u32 addr, fm_u32 val) -{ - fm_u32 tem, i = 0; - mt6627_host_write(0x80103020, addr); - mt6627_host_write(0x80103024, val); - mt6627_host_read(0x80103000, &tem); - while ((tem == 4) && (i < 1000)) { - i++; - mt6627_host_read(0x80103000, &tem); - } - return; -} -#endif -static fm_bool mt6627_SetFreq(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 chan_para = 0; - fm_u32 reg_val = 0; - fm_u16 freq_reg = 0; - - fm_cb_op->cur_freq_set(freq); - -#if 0 - /* MCU clock adjust if need */ - if ((ret = mt6627_mcu_dese(freq, NULL)) < 0) { - WCN_DBG(FM_ERR | MAIN, "mt6627_mcu_dese FAIL:%d\n", ret); - } - - WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret); - - /* GPS clock adjust if need */ - if ((ret = mt6627_gps_dese(freq, NULL)) < 0) { - WCN_DBG(FM_ERR | MAIN, "mt6627_gps_dese FAIL:%d\n", ret); - } - - WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret); -#endif - /* pwer up sequence 0425 */ - ret = mt6627_top_write(0x0050, 0x00000007); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr top 0x50 failed\n"); - } - - ret = mt6627_set_bits(0x0F, 0x0455, 0xF800); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x0f failed\n"); - } - - if (mt6627_TDD_chan_check(freq)) { - ret = mt6627_set_bits(0x30, 0x0008, 0xFFF3); /* use TDD solution */ - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x30 failed\n"); - } - else { - ret = mt6627_set_bits(0x30, 0x0000, 0xFFF3); /* default use FDD solution */ - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x30 failed\n"); - } - ret = mt6627_top_write(0x0050, 0x0000000F); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr top 0x50 failed\n"); - } - -/* if (fm_cb_op->chan_para_get) { */ - chan_para = mt6627_chan_para_get(freq); - WCN_DBG(FM_DBG | CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para); -/* } */ - - freq_reg = freq; - if (0 == fm_get_channel_space(freq_reg)) { - freq_reg *= 10; - } - freq_reg = (freq_reg - 6400) * 2 / 10; - ret = mt6627_set_bits(0x65, freq_reg, 0xFC00); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x65 failed\n"); - return fm_false; - } - - ret = mt6627_set_bits(0x65, (chan_para << 12), 0x0FFF); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x65 failed\n"); - return fm_false; - } - - /* enable connsys FM 2 wire RX */ - mt6627_write(0x9B, 0xF9AB); - mt6627_host_write(0x80101054, 0x00003f35); - - if ((mt6627_hw_info.chip_id == 0x6625) && ((mtk_wcn_wmt_chipid_query() == 0x6592) || (mtk_wcn_wmt_chipid_query() == 0x6752))) { - if (mt6627_I2S_hopping_check(freq)) { - /* set i2s TX desense mode */ - ret = mt6627_set_bits(0x9C, 0x80, 0xFFFF); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x9C failed\n"); - } - - /* set i2s RX desense mode */ - ret = mt6627_host_read(0x80101054, ®_val); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq rd 0x80101054 failed\n"); - } - - reg_val |= 0x8000; - ret = mt6627_host_write(0x80101054, reg_val); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x80101054 failed\n"); - } - } else { - ret = mt6627_set_bits(0x9C, 0x0, 0xFF7F); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x9C failed\n"); - } - - ret = mt6627_host_read(0x80101054, ®_val); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq rd 0x80101054 failed\n"); - } - - reg_val &= 0x7FFF; - ret = mt6627_host_write(0x80101054, reg_val); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "set freq wr 0x80101054 failed\n"); - } - } - } - - if (FM_LOCK(cmd_buf_lock)) - return fm_false; - pkt_size = mt6627_tune(cmd_buf, TX_BUF_SIZE, freq, chan_para); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6627_tune failed\n"); - return fm_false; - } - - WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq); -#if 0 - /* ADPLL setting for dbg */ - mt6627_top_write(0x0050, 0x00000007); - mt6627_top_write(0x0A08, 0xFFFFFFFF); - mt6627_bt_write(0x82, 0x11); - mt6627_bt_write(0x83, 0x11); - mt6627_bt_write(0x84, 0x11); - mt6627_top_write(0x0040, 0x1C1C1C1C); - mt6627_top_write(0x0044, 0x1C1C1C1C); - mt6627_write(0x70, 0x0010); - /*0x0806 DCO clk - 0x0802 ref clk - 0x0804 feedback clk - */ - mt6627_write(0xE0, 0x0806); -#endif - return fm_true; -} - -#if 0 -/* -* mt6627_Seek -* @pFreq - IN/OUT parm, IN start freq/OUT seek valid freq -* @seekdir - 0:up, 1:down -* @space - 1:50KHz, 2:100KHz, 4:200KHz -* return fm_true:seek success; fm_false:seek failed -*/ -static fm_bool mt6627_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir, - fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 pkt_size, temp; - - mt6627_RampDown(); - mt6627_read(FM_MAIN_CTRL, &temp); - mt6627_Mute(fm_true); - - if (FM_LOCK(cmd_buf_lock)) - return fm_false; - pkt_size = mt6627_seek(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT, - mt6627_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6627_res) { - *pFreq = mt6627_res->seek_result; - /* fm_cb_op->cur_freq_set(*pFreq); */ - } else { - WCN_DBG(FM_ALT | CHIP, "mt6627_seek failed\n"); - return ret; - } - - /* get the result freq */ - WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq); - mt6627_RampDown(); - if ((temp & 0x0020) == 0) { - mt6627_Mute(fm_false); - } - - return fm_true; -} -#endif -#define FM_CQI_LOG_PATH "/mnt/sdcard/fmcqilog" - -static fm_s32 mt6627_full_cqi_get(fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 freq, orig_freq; - fm_s32 i, j, k; - fm_s32 space_val, max, min, num; - struct mt6627_full_cqi *p_cqi; - fm_u8 *cqi_log_title = - "Freq, RSSI, PAMD, PR, FPAMD, MR, ATDC, PRX, ATDEV, SMGain, DltaRSSI\n"; - fm_u8 cqi_log_buf[100] = { 0 }; - fm_s32 pos; - fm_u8 cqi_log_path[100] = { 0 }; - - WCN_DBG(FM_NTC | CHIP, "6627 cqi log start\n"); - /* for soft-mute tune, and get cqi */ - freq = fm_cb_op->cur_freq_get(); - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - /* get cqi */ - orig_freq = freq; - if (0 == fm_get_channel_space(min_freq)) { - min = min_freq * 10; - } else { - min = min_freq; - } - if (0 == fm_get_channel_space(max_freq)) { - max = max_freq * 10; - } else { - max = max_freq; - } - if (space == 0x0001) { - space_val = 5; /* 50Khz */ - } else if (space == 0x0002) { - space_val = 10; /* 100Khz */ - } else if (space == 0x0004) { - space_val = 20; /* 200Khz */ - } else { - space_val = 10; - } - num = (max - min) / space_val + 1; /* Eg, (8760 - 8750) / 10 + 1 = 2 */ - for (k = 0; (10000 == orig_freq) && (0xffffffff == g_dbg_level) && (k < cnt); k++) { - WCN_DBG(FM_NTC | CHIP, "cqi file:%d\n", k + 1); - freq = min; - pos = 0; - fm_memcpy(cqi_log_path, FM_CQI_LOG_PATH, strlen(FM_CQI_LOG_PATH)); - sprintf(&cqi_log_path[strlen(FM_CQI_LOG_PATH)], "%d.txt", k + 1); - fm_file_write(cqi_log_path, cqi_log_title, strlen(cqi_log_title), &pos); - for (j = 0; j < num; j++) { - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, - SM_TUNE_TIMEOUT, mt6627_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6627_res) { - WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", mt6627_res->cqi[0]); - p_cqi = (struct mt6627_full_cqi *)&mt6627_res->cqi[2]; - for (i = 0; i < mt6627_res->cqi[1]; i++) { - /* just for debug */ - WCN_DBG(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd, - p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr, - p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev, - p_cqi[i].smg, p_cqi[i].drssi); - /* format to buffer */ - sprintf(cqi_log_buf, - "%04d,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,\n", - p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd, - p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr, - p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev, - p_cqi[i].smg, p_cqi[i].drssi); - /* write back to log file */ - fm_file_write(cqi_log_path, cqi_log_buf, - strlen(cqi_log_buf), &pos); - } - } else { - WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n"); - ret = -1; - } - freq += space_val; - } - fm_cb_op->cur_freq_set(0); /* avoid run too much times */ - } - WCN_DBG(FM_NTC | CHIP, "6627 cqi log done\n"); - - return ret; -} - -#if 0 -static fm_bool mt6627_Scan(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL, - fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 pkt_size, temp; - fm_u16 offset = 0; - fm_u16 tmp_scanTBLsize = *ScanTBLsize; - - if ((!pScanTBL) || (tmp_scanTBLsize == 0)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n"); - return fm_false; - } - - WCN_DBG(FM_NTC | CHIP, - "start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - mt6627_RampDown(); - mt6627_read(FM_MAIN_CTRL, &temp); - mt6627_Mute(fm_true); - - mt6627_full_cqi_get(min_freq, max_freq, space, 5); - - /* normal scan */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_scan(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_SCAN_DONE, SW_RETRY_CNT, SCAN_TIMEOUT, - mt6627_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6627_res) { - fm_memcpy(pScanTBL, mt6627_res->scan_result, sizeof(fm_u16) * FM_SCANTBL_SIZE); - WCN_DBG(FM_NTC | CHIP, "Rx scan result:\n"); - - for (offset = 0; offset < tmp_scanTBLsize; offset++) { - WCN_DBG(FM_NTC | CHIP, "%d: %04x\n", (fm_s32) offset, *(pScanTBL + offset)); - } - - *ScanTBLsize = tmp_scanTBLsize; - } else { - WCN_DBG(FM_ALT | CHIP, "mt6627_scan failed\n"); - return ret; - } - - mt6627_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */ - if ((temp & 0x0020) == 0) { - mt6627_Mute(fm_false); - } - - return fm_true; -} - -/* add for scan cancel case */ -static fm_bool cqi_abort = fm_false; - -static fm_s32 mt6627_CQI_Get(fm_s8 *buf, fm_s32 buf_len) -{ - fm_s32 ret = 0; - fm_s32 i; - fm_u16 pkt_size; - struct mt6627_fm_cqi *pmt6627_cqi; - struct adapt_fm_cqi *pcqi; - - if (!buf || buf_len < FM_CQI_BUF_SIZE) { - return -FM_EBUF; - } - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_cqi_get(cmd_buf, TX_BUF_SIZE); - if (cqi_abort == fm_true) { - cqi_abort = fm_false; - ret = -1; - } else { - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_CQI_DONE, SW_RETRY_CNT, - SCAN_TIMEOUT, mt6627_get_read_result); - } - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6627_res) { - /* FIXEDME */ - pmt6627_cqi = (struct mt6627_fm_cqi *)mt6627_res->cqi; - pcqi = (struct adapt_fm_cqi *)buf; - - for (i = 0; i < (sizeof(mt6627_res->cqi) / sizeof(struct mt6627_fm_cqi)); i++) { - pcqi[i].ch = (pmt6627_cqi[i].ch * 10 / 2) + 6400; - pcqi[i].rssi = (fm_s32) pmt6627_cqi[i].rssi; - - if (pcqi[i].rssi >= 32768) { - pcqi[i].rssi = pcqi[i].rssi - 65536; - } - - pcqi[i].rssi = ((pcqi[i].rssi * 6) >> 4); - WCN_DBG(FM_NTC | CHIP, "%d --> %d(dbm)\n", pcqi[i].ch, pcqi[i].rssi); - } - } else { - WCN_DBG(FM_ALT | CHIP, "mt6627 get CQI failed:%d\n", ret); - } - - mt6627_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */ - - return ret; -} - -static fm_bool scan_abort = fm_false; - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define SCAN_SEG_LEN 250 -static fm_s8 raw_buf[16 * sizeof(struct adapt_fm_cqi)] = { 0 }; - -static fm_bool mt6627_Scan_50KHz(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, - fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, - fm_u16 space) -{ - fm_s32 ret = 0; - fm_s32 num; - fm_s32 seg; - fm_s32 i, j; - fm_u16 scan_tbl[FM_SCANTBL_SIZE]; /* need no less than the chip */ - fm_s32 start_freq, end_freq; - fm_s32 ch_offset, step, tmp_val; - fm_s32 chl_cnt = 0; - fm_s32 word_offset, bit_offset; - fm_s32 space_val = 5; - struct adapt_fm_cqi *pCQI = (struct adapt_fm_cqi *)raw_buf; - - if (space == 0x0001) { - space_val = 5; /* 50Khz */ - } else if (space == 0x0002) { - space_val = 10; /* 100Khz */ - } else if (space == 0x0004) { - space_val = 20; /* 200Khz */ - } - /* calculate segment number */ - num = (max_freq - min_freq) / space_val; /* Eg, (10800 - 8750) / 5 = 410 */ - seg = (num / SCAN_SEG_LEN) + ((num % SCAN_SEG_LEN) ? 1 : 0); /* Eg, (410 / 200) + ((410 % 200) ? 1 : 0) = 2 + 1 = 3 */ - - FM_FIFO_RESET(cqi_fifo); - fm_memset(pScanTBL, 0, sizeof(fm_u16) * (*ScanTBLsize)); - - /* do scan */ - scan_abort = fm_false; /* reset scan cancel flag */ - for (i = 0; i < seg; i++) { - start_freq = min_freq + SCAN_SEG_LEN * space_val * i; - end_freq = min_freq + SCAN_SEG_LEN * space_val * (i + 1) - space_val; - end_freq = (end_freq > max_freq) ? max_freq : end_freq; - chl_cnt = 0; - - if (fm_true == scan_abort) { - scan_abort = fm_false; - return fm_false; - } - - if (fm_false == - mt6627_Scan(start_freq, end_freq, pFreq, scan_tbl, ScanTBLsize, scandir, - space)) { - return fm_false; - } - /* get channel count */ - for (ch_offset = 0; ch_offset < FM_SCANTBL_SIZE; ch_offset++) { - if (scan_tbl[ch_offset] == 0) - continue; - for (step = 0; step < 16; step++) { - if (scan_tbl[ch_offset] & (1 << step)) { - tmp_val = start_freq + (ch_offset * 16 + step) * space_val; - WCN_DBG(FM_NTC | CHIP, "freq %d, end freq %d\n", tmp_val, - end_freq); - if (tmp_val <= end_freq) { - chl_cnt++; - /* set reult bitmap */ - word_offset = (tmp_val - min_freq) / space_val / 16; - bit_offset = (tmp_val - min_freq) / space_val % 16; - if ((word_offset < 26) && (word_offset >= 0)) { - pScanTBL[word_offset] |= (1 << bit_offset); - } - WCN_DBG(FM_NTC | CHIP, "cnt %d, word %d, bit %d\n", - chl_cnt, word_offset, bit_offset); - } - } - } - } - - /* get cqi info */ - while (chl_cnt > 0) { - ret = mt6627_CQI_Get(raw_buf, 16 * sizeof(struct adapt_fm_cqi)); - if (ret) { - return ret; - } - /* add valid channel to cqi_fifo */ - for (j = 0; j < sizeof(raw_buf) / sizeof(struct adapt_fm_cqi); j++) { - if ((pCQI[j].ch >= start_freq) && (pCQI[j].ch <= end_freq)) { - FM_FIFO_INPUT(cqi_fifo, pCQI + j); - WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) add to fifo\n", - pCQI[j].ch, pCQI[j].rssi); - } - } - - chl_cnt -= 16; - } - } - - return fm_true; -} - - -static fm_s32 mt6627_CQI_Get_50KHz(fm_s8 *buf, fm_s32 buf_len) -{ - fm_s32 ret = 0; - fm_s32 i; - struct adapt_fm_cqi tmp = { - .ch = 0, - .rssi = 0, - }; - struct adapt_fm_cqi *pcqi = (struct adapt_fm_cqi *)buf; - - - if (!buf || buf_len < FM_CQI_BUF_SIZE) { - return -FM_EBUF; - } - - for (i = 0; ((i < (buf_len / sizeof(struct adapt_fm_cqi))) && - (fm_false == FM_FIFO_IS_EMPTY(cqi_fifo))); i++) { - FM_FIFO_OUTPUT(cqi_fifo, &tmp); - pcqi[i].ch = tmp.ch; - pcqi[i].rssi = tmp.rssi; - WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) get from fifo\n", pcqi[i].ch, pcqi[i].rssi); - } - - return ret; -} - -#endif /* CONFIG_MTK_FM_50KHZ_SUPPORT */ -static fm_s32 mt6627_SeekStop(void) -{ - return fm_force_active_event(FLAG_SEEK_DONE); -} - -static fm_s32 mt6627_ScanStop(void) -{ - cqi_abort = fm_true; - scan_abort = fm_true; - fm_force_active_event(FLAG_SCAN_DONE | FLAG_CQI_DONE); - - return 0; -} - -#endif - -/* - * mt6627_GetCurRSSI - get current freq's RSSI value - * RS=RSSI - * If RS>511, then RSSI(dBm)= (RS-1024)/16*6 - * else RSSI(dBm)= RS/16*6 - */ -static fm_s32 mt6627_GetCurRSSI(fm_s32 *pRSSI) -{ - fm_u16 tmp_reg; - - mt6627_read(FM_RSSI_IND, &tmp_reg); - tmp_reg = tmp_reg & 0x03ff; - - if (pRSSI) { - *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4); - WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI); - } else { - WCN_DBG(FM_ERR | CHIP, "get rssi para error\n"); - return -FM_EPARA; - } - - return 0; -} - -static fm_u16 mt6627_vol_tbl[16] = { 0x0000, 0x0519, 0x066A, 0x0814, - 0x0A2B, 0x0CCD, 0x101D, 0x1449, - 0x198A, 0x2027, 0x287A, 0x32F5, - 0x4027, 0x50C3, 0x65AD, 0x7FFF -}; - -static fm_s32 mt6627_SetVol(fm_u8 vol) -{ - fm_s32 ret = 0; - - vol = (vol > 15) ? 15 : vol; - ret = mt6627_write(0x7D, mt6627_vol_tbl[vol]); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", vol); - return ret; - } else { - WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", vol); - } - - if (vol == 10) { - fm_print_cmd_fifo(); /* just for debug */ - fm_print_evt_fifo(); - } - return 0; -} - -static fm_s32 mt6627_GetVol(fm_u8 *pVol) -{ - int ret = 0; - fm_u16 tmp; - fm_s32 i; - - FMR_ASSERT(pVol); - - ret = mt6627_read(0x7D, &tmp); - if (ret) { - *pVol = 0; - WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n"); - return ret; - } - - for (i = 0; i < 16; i++) { - if (mt6627_vol_tbl[i] == tmp) { - *pVol = i; - break; - } - } - - WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol); - return 0; -} - -static fm_s32 mt6627_dump_reg(void) -{ - fm_s32 i; - fm_u16 TmpReg; - for (i = 0; i < 0xff; i++) { - mt6627_read(i, &TmpReg); - WCN_DBG(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg); - } - return 0; -} - -/*0:mono, 1:stereo*/ -static fm_bool mt6627_GetMonoStereo(fm_u16 *pMonoStereo) -{ -#define FM_BF_STEREO 0x1000 - fm_u16 TmpReg; - - if (pMonoStereo) { - mt6627_read(FM_RSSI_IND, &TmpReg); - *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12; - } else { - WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n"); - return fm_false; - } - - FM_LOG_NTC(CHIP, "Get MonoStero:0x%04x\n", *pMonoStereo); - return fm_true; -} - -static fm_s32 mt6627_SetMonoStereo(fm_s32 MonoStereo) -{ - fm_s32 ret = 0; - - FM_LOG_NTC(CHIP, "set to %s\n", MonoStereo ? "mono" : "auto"); - mt6627_top_write(0x50, 0x0007); - - if (MonoStereo) { /*mono */ - ret = mt6627_set_bits(0x75, 0x0008, ~0x0008); - } else { /*auto switch */ - - ret = mt6627_set_bits(0x75, 0x0000, ~0x0008); - } - - mt6627_top_write(0x50, 0x000F); - return ret; -} - -static fm_s32 mt6627_GetCapArray(fm_s32 *ca) -{ - fm_u16 dataRead; - fm_u16 tmp = 0; - - FMR_ASSERT(ca); - mt6627_read(0x60, &tmp); - mt6627_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */ - - mt6627_read(0x26, &dataRead); - *ca = dataRead; - - mt6627_write(0x60, tmp); /* 0x60 D3=1 */ - return 0; -} - -/* - * mt6627_GetCurPamd - get current freq's PAMD value - * PA=PAMD - * If PA>511 then PAMD(dB)= (PA-1024)/16*6, - * else PAMD(dB)=PA/16*6 - */ -static fm_bool mt6627_GetCurPamd(fm_u16 *pPamdLevl) -{ - fm_u16 tmp_reg; - fm_u16 dBvalue, valid_cnt = 0; - int i, total = 0; - for (i = 0; i < 8; i++) { - if (mt6627_read(FM_ADDR_PAMD, &tmp_reg)) { - *pPamdLevl = 0; - return fm_false; - } - - tmp_reg &= 0x03FF; - dBvalue = (tmp_reg > 256) ? ((512 - tmp_reg) * 6 / 16) : 0; - if (dBvalue != 0) { - total += dBvalue; - valid_cnt++; - WCN_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue); - } - Delayms(3); - } - if (valid_cnt != 0) { - *pPamdLevl = total / valid_cnt; - } else { - *pPamdLevl = 0; - } - WCN_DBG(FM_NTC | CHIP, "PAMD=%d\n", *pPamdLevl); - return fm_true; -} - -static fm_s32 mt6627_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample) -{ - FMR_ASSERT(ponoff); - FMR_ASSERT(pmode); - FMR_ASSERT(psample); - - *ponoff = mt6627_fm_config.aud_cfg.i2s_info.status; - *pmode = mt6627_fm_config.aud_cfg.i2s_info.mode; - *psample = mt6627_fm_config.aud_cfg.i2s_info.rate; - - return 0; -} - -static fm_s32 mt6627fm_get_audio_info(fm_audio_info_t *data) -{ - memcpy(data, &mt6627_fm_config.aud_cfg, sizeof(fm_audio_info_t)); - return 0; -} - -static fm_s32 mt6627_hw_info_get(struct fm_hw_info *req) -{ - FMR_ASSERT(req); - - req->chip_id = mt6627_hw_info.chip_id; - req->eco_ver = mt6627_hw_info.eco_ver; - req->patch_ver = mt6627_hw_info.patch_ver; - req->rom_ver = mt6627_hw_info.rom_ver; - - return 0; -} - -static fm_s32 mt6627_pre_search(void) -{ - mt6627_RampDown(); - /* disable audio output I2S Rx mode */ - mt6627_host_write(0x80101054, 0x00000000); - /* disable audio output I2S Tx mode */ - mt6627_write(0x9B, 0x0000); - /*FM_LOG_NTC(FM_NTC | CHIP, "search threshold: RSSI=%d,de-RSSI=%d,smg=%d %d\n", - mt6627_fm_config.rx_cfg.long_ana_rssi_th, mt6627_fm_config.rx_cfg.desene_rssi_th, - mt6627_fm_config.rx_cfg.smg_th);*/ - return 0; -} - -static fm_s32 mt6627_restore_search(void) -{ - mt6627_RampDown(); - /* set audio output I2S Tx mode */ - mt6627_write(0x9B, 0xF9AB); - /* set audio output I2S Rx mode */ - mt6627_host_write(0x80101054, 0x00003f35); - return 0; -} - -static fm_s32 mt6627_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - /* fm_u16 freq;//, orig_freq; */ - struct mt6627_full_cqi *p_cqi; - fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0; - fm_u32 PRX = 0, ATDEV = 0; - fm_u16 softmuteGainLvl = 0; - - ret = mt6627_chan_para_get(freq); - if (ret == 2) { - ret = mt6627_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */ - } else { - ret = mt6627_set_bits(FM_CHANNEL_SET, 0x0000, 0x0FFF); /* clear FA/HL/ATJ */ - } - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6627_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT, - mt6627_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6627_res) { - WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", mt6627_res->cqi[0]); - p_cqi = (struct mt6627_full_cqi *)&mt6627_res->cqi[2]; - /* just for debug */ - WCN_DBG(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr, - p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi); - RSSI = - ((p_cqi->rssi & 0x03FF) >= - 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF); - PAMD = - ((p_cqi->pamd & 0x1FF) >= - 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF); - MR = ((p_cqi->mr & 0x01FF) >= - 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF); - ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc); - if (ATDC < 0) { - ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */ - } - PRX = (p_cqi->prx & 0x00FF); - ATDEV = p_cqi->atdev; - softmuteGainLvl = p_cqi->smg; - /* check if the channel is valid according to each CQIs */ - if ((RSSI >= mt6627_fm_config.rx_cfg.long_ana_rssi_th) - && (PAMD <= mt6627_fm_config.rx_cfg.pamd_th) - && (ATDC <= mt6627_fm_config.rx_cfg.atdc_th) - && (MR >= mt6627_fm_config.rx_cfg.mr_th) - && (PRX >= mt6627_fm_config.rx_cfg.prx_th) - && (ATDEV >= ATDC) /* sync scan algorithm */ - &&(softmuteGainLvl >= mt6627_fm_config.rx_cfg.smg_th)) { - *valid = fm_true; - } else { - *valid = fm_false; - } - *rssi = RSSI; -/* if(RSSI < -296) - WCN_DBG(FM_NTC | CHIP, "rssi\n"); - else if(PAMD > -12) - WCN_DBG(FM_NTC | CHIP, "PAMD\n"); - else if(ATDC > 3496) - WCN_DBG(FM_NTC | CHIP, "ATDC\n"); - else if(MR < -67) - WCN_DBG(FM_NTC | CHIP, "MR\n"); - else if(PRX < 80) - WCN_DBG(FM_NTC | CHIP, "PRX\n"); - else if(ATDEV < ATDC) - WCN_DBG(FM_NTC | CHIP, "ATDEV\n"); - else if(softmuteGainLvl < 16421) - WCN_DBG(FM_NTC | CHIP, "softmuteGainLvl\n"); - */ - } else { - WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n"); - return fm_false; - } - WCN_DBG(FM_NTC | CHIP, "valid=%d\n", *valid); - return fm_true; -} - -static fm_bool mt6627_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value) -{ - return fm_true; -} - -/* -parm: - parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG. - parm.th_val: threshold value -*/ -static fm_s32 mt6627_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve) -{ - switch (idx) { - case 0: - { - mt6627_fm_config.rx_cfg.long_ana_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val); - break; - } - case 1: - { - mt6627_fm_config.rx_cfg.desene_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val); - break; - } - case 2: - { - mt6627_fm_config.rx_cfg.smg_th = val; - WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val); - break; - } - default: - break; - } - return 0; -} - -static fm_s32 MT6627fm_low_power_wa_default(fm_s32 fmon) -{ - return 0; -} - -fm_s32 MT6627fm_low_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb_op = &ops->cb; - - ops->bi.pwron = mt6627_pwron; - ops->bi.pwroff = mt6627_pwroff; - ops->bi.msdelay = Delayms; - ops->bi.usdelay = Delayus; - ops->bi.read = mt6627_read; - ops->bi.write = mt6627_write; - ops->bi.top_read = mt6627_top_read; - ops->bi.top_write = mt6627_top_write; - ops->bi.host_read = mt6627_host_read; - ops->bi.host_write = mt6627_host_write; - ops->bi.setbits = mt6627_set_bits; - ops->bi.chipid_get = mt6627_get_chipid; - ops->bi.mute = mt6627_Mute; - ops->bi.rampdown = mt6627_RampDown; - ops->bi.pwrupseq = mt6627_PowerUp; - ops->bi.pwrdownseq = mt6627_PowerDown; - ops->bi.setfreq = mt6627_SetFreq; - ops->bi.low_pwr_wa = MT6627fm_low_power_wa_default; - ops->bi.get_aud_info = mt6627fm_get_audio_info; -#if 0 - ops->bi.seek = mt6627_Seek; - ops->bi.seekstop = mt6627_SeekStop; - ops->bi.scan = mt6627_Scan; - ops->bi.cqi_get = mt6627_CQI_Get; -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT - ops->bi.scan = mt6627_Scan_50KHz; - ops->bi.cqi_get = mt6627_CQI_Get_50KHz; -#endif - ops->bi.scanstop = mt6627_ScanStop; - ops->bi.i2s_set = mt6627_I2s_Setting; -#endif - ops->bi.rssiget = mt6627_GetCurRSSI; - ops->bi.volset = mt6627_SetVol; - ops->bi.volget = mt6627_GetVol; - ops->bi.dumpreg = mt6627_dump_reg; - ops->bi.msget = mt6627_GetMonoStereo; - ops->bi.msset = mt6627_SetMonoStereo; - ops->bi.pamdget = mt6627_GetCurPamd; - ops->bi.em = mt6627_em_test; - ops->bi.anaswitch = mt6627_SetAntennaType; - ops->bi.anaget = mt6627_GetAntennaType; - ops->bi.caparray_get = mt6627_GetCapArray; - ops->bi.hwinfo_get = mt6627_hw_info_get; - ops->bi.i2s_get = mt6627_i2s_info_get; - ops->bi.is_dese_chan = mt6627_is_dese_chan; - ops->bi.softmute_tune = mt6627_soft_mute_tune; - ops->bi.desense_check = mt6627_desense_check; - ops->bi.cqi_log = mt6627_full_cqi_get; - ops->bi.pre_search = mt6627_pre_search; - ops->bi.restore_search = mt6627_restore_search; - ops->bi.set_search_th = mt6627_set_search_th; - - cmd_buf_lock = fm_lock_create("27_cmd"); - ret = fm_lock_get(cmd_buf_lock); - - cmd_buf = fm_zalloc(TX_BUF_SIZE + 1); - - if (!cmd_buf) { - WCN_DBG(FM_ALT | CHIP, "6627 fm lib alloc tx buf failed\n"); - ret = -1; - } -#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */ - cqi_fifo = fm_fifo_create("6628_cqi_fifo", sizeof(struct adapt_fm_cqi), 640); - if (!cqi_fifo) { - WCN_DBG(FM_ALT | CHIP, "6627 fm lib create cqi fifo failed\n"); - ret = -1; - } -#endif - - return ret; -} - -fm_s32 MT6627fm_low_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - FMR_ASSERT(ops); - -#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */ - fm_fifo_release(cqi_fifo); -#endif - - if (cmd_buf) { - fm_free(cmd_buf); - cmd_buf = NULL; - } - - ret = fm_lock_put(cmd_buf_lock); - fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface)); - return ret; -} - -/* static struct fm_pub pub; */ -/* static struct fm_pub_cb *pub_cb = &pub.pub_tbl; */ - -static const fm_u16 mt6627_mcu_dese_list[] = { - 7630, 7800, 7940, 8320, 9260, 9600, 9710, 9920, 10400, 10410 -}; - -static const fm_u16 mt6627_gps_dese_list[] = { - 7850, 7860 -}; - -static const fm_s8 mt6627_chan_para_map[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 6500~6595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6600~6695 */ - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, /* 6700~6795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6800~6895 */ - 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6900~6995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7000~7095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 7100~7195 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, /* 7200~7295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7300~7395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7400~7495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7500~7595 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 7600~7695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7700~7795 */ - 8, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7800~7895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 7900~7995 */ - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, /* 8000~8095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8100~8195 */ - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8200~8295 */ - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8300~8395 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8400~8495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8500~8595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8600~8695 */ - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8700~8795 */ - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8800~8895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8900~8995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9000~9095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9100~9195 */ - 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9200~9295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, /* 9300~9395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9400~9495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9500~9595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9600~9695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9700~9795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9800~9895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 9900~9995 */ - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10000~10095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10100~10195 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 10200~10295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10300~10395 */ - 8, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10400~10495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10500~10595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10600~10695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 10700~10795 */ - 0 /* 10800 */ -}; - - -static const fm_u16 mt6627_scan_dese_list[] = { - 6910, 7680, 7800, 9210, 9220, 9230, 9600, 9980, 9990, 10400, 10750, 10760 -}; - -static const fm_u16 mt6627_I2S_hopping_list[] = { - 6550, 6760, 6960, 6970, 7170, 7370, 7580, 7780, 7990, 8810, 9210, 9220, 10240 -}; - -static const fm_u16 mt6627_TDD_list[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6500~6595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6600~6695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6700~6795 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6800~6895 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6900~6995 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7000~7095 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7100~7195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7200~7295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7300~7395 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7400~7495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7500~7595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7600~7695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7700~7795 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7800~7895 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7900~7995 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8000~8095 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8100~8195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8200~8295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8300~8395 */ - 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 8400~8495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8500~8595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8600~8695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8700~8795 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8800~8895 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8900~8995 */ - 0x0000, 0x0000, 0x0101, 0x0101, 0x0101, /* 9000~9095 */ - 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 9100~9195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9200~9295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9300~9395 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9400~9495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9500~9595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9600~9695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 9700~9795 */ - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 9800~9895 */ - 0x0101, 0x0101, 0x0001, 0x0000, 0x0000, /* 9900~9995 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10000~10095 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10100~10195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10200~10295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10300~10395 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10400~10495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10500~10595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 10600~10695 */ - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 10700~10795 */ - 0x0001 /* 10800 */ -}; - -static const fm_u16 mt6627_TDD_Mask[] = { - 0x0001, 0x0010, 0x0100, 0x1000 -}; - -/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */ -static fm_s32 mt6627_is_dese_chan(fm_u16 freq) -{ - fm_s32 size; - - /* return 0;//HQA only :skip desense channel check. */ - size = sizeof(mt6627_scan_dese_list) / sizeof(mt6627_scan_dese_list[0]); - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - while (size) { - if (mt6627_scan_dese_list[size - 1] == freq) - return 1; - - size--; - } - - return 0; -} - -/* return value: -1, is desense channel and rssi is less than threshold; -0, not desense channel or it is but rssi is more than threshold.*/ -static fm_s32 mt6627_desense_check(fm_u16 freq, fm_s32 rssi) -{ - if (mt6627_is_dese_chan(freq)) { - if (rssi < mt6627_fm_config.rx_cfg.desene_rssi_th) { - return 1; - } - WCN_DBG(FM_DBG | CHIP, "desen_rssi %d th:%d\n", rssi, - mt6627_fm_config.rx_cfg.desene_rssi_th); - } - return 0; -} - -static fm_bool mt6627_TDD_chan_check(fm_u16 freq) -{ - fm_u32 i = 0; - fm_u16 freq_tmp = freq; - fm_s32 ret = 0; - - ret = fm_get_channel_space(freq_tmp); - if (0 == ret) { - freq_tmp *= 10; - } else if (-1 == ret) - return fm_false; - - i = (freq_tmp - 6500) / 5; - - WCN_DBG(FM_NTC | CHIP, "Freq %d is 0x%4x, mask is 0x%4x\n", freq, (mt6627_TDD_list[i / 4]), - mt6627_TDD_Mask[i % 4]); - if (mt6627_TDD_list[i / 4] & mt6627_TDD_Mask[i % 4]) { - WCN_DBG(FM_NTC | CHIP, "Freq %d use TDD solution\n", freq); - return fm_true; - } else - return fm_false; -} - - -/* get channel parameter, HL side/ FA / ATJ */ -static fm_u16 mt6627_chan_para_get(fm_u16 freq) -{ - fm_s32 pos, size; - - /* return 0;//for HQA only: skip FA/HL/ATJ */ - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - if (freq < 6500) { - return 0; - } - pos = (freq - 6500) / 5; - - size = sizeof(mt6627_chan_para_map) / sizeof(mt6627_chan_para_map[0]); - - pos = (pos < 0) ? 0 : pos; - pos = (pos > (size - 1)) ? (size - 1) : pos; - - return mt6627_chan_para_map[pos]; -} - -static fm_bool mt6627_I2S_hopping_check(fm_u16 freq) -{ - fm_s32 size; - - size = sizeof(mt6627_I2S_hopping_list) / sizeof(mt6627_I2S_hopping_list[0]); - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - while (size) { - if (mt6627_I2S_hopping_list[size - 1] == freq) - return 1; - size--; - } - - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c deleted file mode 100644 index e3d31d648..000000000 --- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c +++ /dev/null @@ -1,351 +0,0 @@ -/* mt6627_rds.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6627 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_rds.h" -#include "mt6627_fm_reg.h" - - -static fm_bool bRDS_FirstIn = fm_false; -static fm_u32 gBLER_CHK_INTERVAL = 5000; -static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT; -static fm_u8 BAD_BLK_RATIO; - -static struct fm_callback *fm_cb; -static struct fm_basic_interface *fm_bi; - - -static fm_bool mt6627_RDS_support(void); -static fm_s32 mt6627_RDS_enable(void); -static fm_s32 mt6627_RDS_disable(void); -static fm_u16 mt6627_RDS_Get_GoodBlock_Counter(void); -static fm_u16 mt6627_RDS_Get_BadBlock_Counter(void); -static fm_u8 mt6627_RDS_Get_BadBlock_Ratio(void); -static fm_u32 mt6627_RDS_Get_BlerCheck_Interval(void); -/* static void mt6627_RDS_GetData(fm_u16 *data, fm_u16 datalen); */ -static void mt6627_RDS_Init_Data(rds_t *pstRDSData); - - - -static fm_bool mt6627_RDS_support(void) -{ - return fm_true; -} - -static fm_s32 mt6627_RDS_enable(void) -{ - fm_s32 ret = 0; - fm_u16 dataRead = 0; - - WCN_DBG(FM_DBG | RDSC, "rds enable\n"); - ret = fm_bi->read(FM_RDS_CFG0, &dataRead); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable read 0x80 fail\n"); - return ret; - } - ret = fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */ - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable write 0x80 fail\n"); - return ret; - } - ret = fm_bi->read(FM_MAIN_CTRL, &dataRead); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable read 0x63 fail\n"); - return ret; - } - ret = fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK)); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable write 0x63 fail\n"); - return ret; - } - - return ret; -} - -static fm_s32 mt6627_RDS_disable(void) -{ - fm_s32 ret = 0; - fm_u16 dataRead = 0; - - WCN_DBG(FM_DBG | RDSC, "rds disable\n"); - ret = fm_bi->read(FM_MAIN_CTRL, &dataRead); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds disable read 0x63 fail\n"); - return ret; - } - ret = fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK)); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds disable write 0x63 fail\n"); - return ret; - } - - return ret; -} - -static fm_u16 mt6627_RDS_Get_GoodBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg); - GOOD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u16 mt6627_RDS_Get_BadBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg); - BAD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u8 mt6627_RDS_Get_BadBlock_Ratio(void) -{ - fm_u16 tmp_reg; - fm_u16 gbc; - fm_u16 bbc; - - gbc = mt6627_RDS_Get_GoodBlock_Counter(); - bbc = mt6627_RDS_Get_BadBlock_Counter(); - - if ((gbc + bbc) > 0) { - tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc)); - } else { - tmp_reg = 0; - } - - BAD_BLK_RATIO = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_s32 mt6627_RDS_BlockCounter_Reset(void) -{ - mt6627_RDS_disable(); - mt6627_RDS_enable(); - - return 0; -} - -static fm_u32 mt6627_RDS_Get_BlerCheck_Interval(void) -{ - return gBLER_CHK_INTERVAL; -} - -static fm_s32 mt6627_RDS_BlerCheck(rds_t *dst) -{ - return 0; -} - -#if 0 -static void RDS_Recovery_Handler(void) -{ - fm_u16 tempData = 0; - - do { - fm_bi->read(FM_RDS_DATA_REG, &tempData); - fm_bi->read(FM_RDS_POINTER, &tempData); - } while (tempData & 0x3); -} -#endif - -#if 0 -static void mt6627_RDS_GetData(fm_u16 *data, fm_u16 datalen) -{ -#define RDS_GROUP_DIFF_OFS 0x007C -#define RDS_FIFO_DIFF 0x007F -#define RDS_CRC_BLK_ADJ 0x0020 -#define RDS_CRC_CORR_CNT 0x001E -#define RDS_CRC_INFO 0x0001 - - fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0; - fm_u16 temp = 0, OutputPofm_s32 = 0; - - WCN_DBG(FM_DBG | RDSC, "get data\n"); - fm_bi->read(FM_RDS_FIFO_STATUS0, &temp); - RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2); - - if ((temp & RDS_FIFO_DIFF) >= 4) { - /* block A data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10; - CRC |= (temp & RDS_CRC_INFO) << 3; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11); - fm_bi->read(FM_RDS_DATA_REG, &data[0]); - - /* block B data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9; - CRC |= (temp & RDS_CRC_INFO) << 2; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7); - fm_bi->read(FM_RDS_DATA_REG, &data[1]); - - /* block C data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8; - CRC |= (temp & RDS_CRC_INFO) << 1; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3); - fm_bi->read(FM_RDS_DATA_REG, &data[2]); - - /* block D data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7; - CRC |= (temp & RDS_CRC_INFO); - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1); - fm_bi->read(FM_RDS_DATA_REG, &data[3]); - - data[4] = (CRC | RDS_adj | RDSDataCount); - data[5] = FM_WARorrCnt; - - fm_bi->read(FM_RDS_PWDI, &data[6]); - fm_bi->read(FM_RDS_PWDQ, &data[7]); - - fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32); - - /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */ - if (OutputPofm_s32 & 0x3) { - RDS_Recovery_Handler(); - } - - } else { - for (; i < 8; i++) - data[i] = 0; - } -} -#endif - -static void mt6627_RDS_Init_Data(rds_t *pstRDSData) -{ - fm_memset(pstRDSData, 0, sizeof(rds_t)); - bRDS_FirstIn = fm_true; - - pstRDSData->event_status = 0x0000; - fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData)); - fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS)); - fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON)); -} - -fm_bool mt6627_RDS_OnOff(rds_t *dst, fm_bool bFlag) -{ - fm_s32 ret = 0; - - if (mt6627_RDS_support() == fm_false) { - WCN_DBG(FM_ALT | RDSC, "mt6627_RDS_OnOff failed, RDS not support\n"); - return fm_false; - } - - if (bFlag) { - mt6627_RDS_Init_Data(dst); - ret = mt6627_RDS_enable(); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff enable failed\n"); - return fm_false; - } - } else { - mt6627_RDS_Init_Data(dst); - ret = mt6627_RDS_disable(); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff disable failed\n"); - return fm_false; - } - } - - return fm_true; -} - -DEFINE_RDSLOG(mt6627_rds_log); - -/* mt6627_RDS_Efm_s32_Handler - response FM RDS interrupt - * @fm - main data structure of FM driver - * This function first get RDS raw data, then call RDS spec parser - */ -static fm_s32 mt6627_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - mt6627_rds_log.log_in(&mt6627_rds_log, rds_raw, rds_size); - return rds_parser(rds_dst, rds_raw, rds_size, getfreq); -} - -static fm_s32 mt6627_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len) -{ - return mt6627_rds_log.log_out(&mt6627_rds_log, dst, dst_len); -} - -static fm_s32 mt6627_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp) -{ - return rds_grp_counter_get(dst, &rdsp->gc); -} - -static fm_s32 mt6627_rds_gc_reset(rds_t *rdsp) -{ - return rds_grp_counter_reset(&rdsp->gc); -} - -fm_s32 MT6627fm_rds_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - FMR_ASSERT(ops->bi.write); - FMR_ASSERT(ops->bi.read); - FMR_ASSERT(ops->bi.setbits); - FMR_ASSERT(ops->bi.usdelay); - fm_bi = &ops->bi; - - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb = &ops->cb; - - ops->ri.rds_blercheck = mt6627_RDS_BlerCheck; - ops->ri.rds_onoff = mt6627_RDS_OnOff; - ops->ri.rds_parser = mt6627_rds_parser; - ops->ri.rds_gbc_get = mt6627_RDS_Get_GoodBlock_Counter; - ops->ri.rds_bbc_get = mt6627_RDS_Get_BadBlock_Counter; - ops->ri.rds_bbr_get = mt6627_RDS_Get_BadBlock_Ratio; - ops->ri.rds_bc_reset = mt6627_RDS_BlockCounter_Reset; - ops->ri.rds_bci_get = mt6627_RDS_Get_BlerCheck_Interval; - ops->ri.rds_log_get = mt6627_rds_log_get; - ops->ri.rds_gc_get = mt6627_rds_gc_get; - ops->ri.rds_gc_reset = mt6627_rds_gc_reset; - return ret; -} - -fm_s32 MT6627fm_rds_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - - fm_bi = NULL; - fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h deleted file mode 100644 index 749a38a32..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h +++ /dev/null @@ -1,972 +0,0 @@ - -const unsigned char channel_parameter[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 -}; - -#if defined(MT6626_FPGA) -const unsigned short bin_rom[] = { - 0x0000, 0x1FFF, 0xBC00, 0x0010, 0xBC00, 0x0271, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, - 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0xBC02, 0x0906, 0xBC20, 0x2019, - 0x4021, 0xFB11, 0xBC02, 0x0807, 0xBC20, 0x2019, 0x4041, 0xFB11, 0xBC22, 0x0480, 0xBC20, - 0x0080, 0x4001, 0x8B02, 0xE401, 0xBC21, 0x0367, 0xA301, 0x0080, 0xBC20, 0x201A, 0x41E1, - 0xFA12, 0xA302, 0x0082, 0x0891, 0x2620, 0x8FF9, 0x3D02, 0xBC21, 0x2018, 0x481E, 0xBC22, - 0x2019, 0x8C69, 0x40C0, 0xA203, 0x0082, 0x2631, 0x8F4B, 0x2634, 0x8F3E, 0x2632, 0x8F1D, - 0xB306, 0x0008, 0x8F0A, 0x40E0, 0xFB50, 0xBC02, 0x1E58, 0xBC22, 0x2019, 0xBC21, 0x2018, - 0x481E, 0x8C53, 0x40C0, 0xFB50, 0xFA33, 0x26B0, 0x8F08, 0xBC02, 0x072A, 0xBC21, 0x2018, - 0x4020, 0x7207, 0xBB30, 0x40C0, 0xBC22, 0x2019, 0xA31E, 0x0082, 0x8D41, 0x40A0, 0x70E0, - 0x3B50, 0xBC21, 0x201D, 0xBC22, 0x201B, 0xFA31, 0xFA52, 0x0810, 0xBC3E, 0x00E4, 0xBC3A, - 0x0692, 0xB400, 0x0002, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0408, 0xBC02, 0x0131, 0x40C0, - 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D23, 0x4080, 0xFB50, 0xBC02, 0x016B, 0x40C0, - 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D18, 0x4060, 0xBC21, 0x201F, 0xFB50, 0xFA30, - 0xBC3E, 0x00C8, 0xBC3A, 0x0652, 0xBC21, 0x03FF, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0801, - 0xBC02, 0x0131, 0x40C0, 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0xA203, 0x0082, 0xB316, - 0x0040, 0x8F91, 0xBC00, 0x001C, 0x6915, 0xA902, 0x8E00, 0xA30E, 0x0085, 0xDFD5, 0xBC02, - 0x0607, 0xBC02, 0x077A, 0xBC20, 0x2019, 0x7040, 0x4FD5, 0xBC22, 0x2008, 0xFB11, 0xFA51, - 0xBC23, 0x4000, 0x0ACB, 0xBC21, 0x2100, 0xFB53, 0xFA32, 0xB314, 0x0020, 0x8FFB, 0x4121, - 0xE9FE, 0xFB11, 0xBC00, 0x1D52, 0xE902, 0xBC20, 0x2019, 0x7060, 0x5FD5, 0x8C02, 0xFB11, - 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, 0x3E02, 0xA200, 0x008C, 0x6980, 0x4FD5, 0x8F02, - 0xA200, 0x0086, 0x2681, 0x8F02, 0x4080, 0xA300, 0x0082, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, - 0xBC20, 0x2019, 0x7068, 0x5FD5, 0x8C02, 0xFB11, 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, - 0x3E02, 0xA200, 0x008C, 0xA201, 0x0088, 0x2681, 0x8F06, 0x4020, 0xA202, 0x008A, 0x1401, - 0x0A10, 0xA300, 0x008A, 0x3409, 0xA300, 0x0088, 0xA201, 0x0086, 0xB300, 0x0010, 0x8F01, - 0x2691, 0x8F09, 0x401C, 0xBC20, 0x2041, 0xA202, 0x008A, 0xA31C, 0x0088, 0xA31C, 0x008A, - 0xFB12, 0x2691, 0x8F16, 0xBC20, 0x2019, 0x41C1, 0x7008, 0x7B11, 0xBC22, 0x2018, 0xBC20, - 0x201A, 0x8C05, 0xFB51, 0x8E00, 0xBC20, 0x201A, 0x8E00, 0xFA10, 0xB310, 0x0008, 0x8FF6, - 0x7040, 0x0FD5, 0x8C03, 0xA300, 0x0082, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, - 0x8E00, 0xDFC0, 0xDFF5, 0xBC02, 0x05A2, 0xA200, 0x0087, 0x2680, 0x8F0C, 0xBC20, 0x2040, - 0x7000, 0x4FC3, 0x700F, 0xBB11, 0x4042, 0xA303, 0x0089, 0xA31E, 0x0087, 0xA301, 0x0086, - 0xFB12, 0xA200, 0x0084, 0x8EA0, 0xBC20, 0x02C7, 0xA300, 0x009B, 0xBC02, 0x00A7, 0x3E01, - 0xBC20, 0x2008, 0xBC21, 0x033D, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7000, - 0x4FF5, 0xBC22, 0x201A, 0x7040, 0x3B11, 0xFA51, 0x2248, 0x8F00, 0xA300, 0x0082, 0x8EC0, - 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0480, 0xBC20, 0x02B3, 0xA300, 0x009B, - 0xBC02, 0x00A7, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0x03F7, 0xBC22, 0x2018, 0x7008, 0x3B11, - 0x7050, 0x3B50, 0xBC21, 0x2019, 0x8C2E, 0xFB30, 0xA200, 0x0081, 0x2601, 0x8F04, 0xBC21, - 0x8000, 0xBC20, 0x2023, 0x8C24, 0xFB11, 0xBC02, 0x01BE, 0xA200, 0x0085, 0x4001, 0xA301, - 0x0081, 0x2682, 0x8F02, 0x4100, 0xA300, 0x0082, 0xBC02, 0x1E58, 0xBC20, 0x201A, 0x8E00, - 0xFA10, 0xB310, 0x0008, 0x8F05, 0xBC20, 0x2019, 0x4161, 0x7008, 0x3B11, 0xA300, 0x0085, - 0xBC02, 0x077A, 0xBC20, 0x2023, 0xBC21, 0x8000, 0xFB11, 0xA200, 0x0082, 0x2604, 0x8FCE, - 0x3E02, 0x7000, 0x4FD5, 0xBC20, 0x2008, 0x8EC0, 0xE9FE, 0xFB11, 0xE902, 0xA200, 0x0098, - 0x6CE0, 0x1FD5, 0x8F57, 0xBC02, 0x0918, 0xBC20, 0x01AE, 0xBC02, 0x09F0, 0xA200, 0x02A7, - 0x2682, 0x8F02, 0xBC20, 0x01AE, 0xBC02, 0x0D50, 0xA200, 0x008E, 0x2606, 0x8F1E, 0x2604, - 0x8F17, 0x2602, 0x8F0B, 0x2600, 0x8F05, 0xA200, 0x008D, 0x2680, 0x8F20, 0xBC02, 0x0BDE, - 0x8D1F, 0xBC02, 0x0E6E, 0x8D1C, 0xBC20, 0x2032, 0x4101, 0xFA10, 0x0801, 0xA300, 0x01E3, - 0xBC02, 0x0A17, 0x8D12, 0xBC02, 0x0AA2, 0xBC02, 0x0CA4, 0x8D0D, 0xA200, 0x0085, 0x2601, - 0x8F05, 0xA200, 0x02C7, 0x2601, 0x8F01, 0xBC02, 0x0B48, 0x8D02, 0xBC02, 0x0B2B, 0xA201, - 0x01BE, 0xBC20, 0x01AE, 0xBC02, 0x0A72, 0xBC20, 0x01E7, 0xBC02, 0x0B04, 0xA200, 0x0266, - 0x2680, 0xBC20, 0x01E7, 0x8F03, 0xBC21, 0x7FFF, 0xBC02, 0x0B8C, 0x8D04, 0xA201, 0x01FF, - 0xBC02, 0x0B8C, 0xBC02, 0x0C54, 0xA200, 0x0099, 0x2600, 0x8F02, 0xBC02, 0x195E, 0xBC02, - 0x1926, 0xA200, 0x009A, 0x2600, 0x8F02, 0xB000, 0xFFFF, 0xA300, 0x009A, 0xBC20, 0x2040, - 0x4021, 0xFA10, 0x0801, 0x2600, 0x8F0A, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, - 0x2680, 0x8F02, 0xA200, 0x009A, 0x2600, 0x8F15, 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, - 0xBC20, 0x2008, 0xBC21, 0x0080, 0xFA12, 0x0851, 0x2610, 0x8F0B, 0xFA11, 0xBC22, 0xFF7F, - 0x084A, 0x7000, 0x3B11, 0xBC02, 0x05B3, 0x8D03, 0x4020, 0xA300, 0x0099, 0x7038, 0x4FD5, - 0xA200, 0x008E, 0xE9FE, 0x3401, 0x8EC0, 0x0801, 0xA300, 0x008E, 0x4020, 0xBC21, 0x00C0, - 0xA300, 0x0091, 0xA300, 0x0092, 0xA301, 0x0098, 0x8EC0, 0xA300, 0x0090, 0xA300, 0x008F, - 0xE918, 0x8E00, 0xDD05, 0xBC25, 0x2096, 0xDD5B, 0xFAB5, 0xA205, 0x009B, 0xDD7A, 0xDD9F, - 0xDDBE, 0xDDDD, 0xDDFC, 0xDE0B, 0xDE2C, 0xDE49, 0xDE68, 0xDE8F, 0xDEAE, 0xDED5, 0xDEE6, - 0xDF04, 0xDF23, 0xDF42, 0xDF61, 0xDF80, 0xDD27, 0xF9FC, 0x8EA5, 0xBC20, 0x2096, 0xBC21, - 0x00FF, 0xFA10, 0x6220, 0x4D05, 0xA203, 0x0096, 0x6854, 0xCD27, 0x6624, 0xCF80, 0xA302, - 0x0096, 0xCF61, 0xCF42, 0xCF23, 0xCF04, 0xCEE6, 0xCDFC, 0xCDDD, 0xCDBE, 0xCD9F, 0xCD7A, - 0xCD5B, 0xF8FC, 0xCED5, 0xCEAE, 0xCE8F, 0xCE68, 0xCE49, 0xCE2C, 0xCE0B, 0xE9E8, 0x8EC8, - 0xBC20, 0x2102, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, - 0x02DB, 0xBC20, 0x02DB, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2104, - 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, 0x0423, 0xBC20, - 0x0423, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xE906, 0xA202, 0x0090, 0x69A8, - 0x1F95, 0x8F19, 0xBC24, 0x2081, 0xBC23, 0x2082, 0xFA95, 0xBC24, 0x2015, 0xFA73, 0xA21A, - 0x0461, 0xA21E, 0x046B, 0xA210, 0x0361, 0xFA94, 0xA305, 0x02CA, 0xA303, 0x02CB, 0xA310, - 0x02C8, 0xA31A, 0x02C9, 0xA304, 0x02CC, 0xA31E, 0x02CD, 0x26A6, 0x8F32, 0xBC23, 0x027F, - 0xBC24, 0x026F, 0x4022, 0xBD10, 0x0306, 0xE205, 0xE585, 0xA21C, 0x02C8, 0xA21A, 0x02CA, - 0xA21E, 0x02CB, 0xA210, 0x02C9, 0xA205, 0x02CC, 0xA203, 0x02CD, 0xA204, 0x0081, 0xA31C, - 0x02C2, 0xA310, 0x02C3, 0xA31A, 0x02C4, 0xA31E, 0x02C5, 0xA305, 0x02C6, 0xA303, 0x02C7, - 0x2640, 0x8F03, 0xA203, 0x0095, 0x34D9, 0xA303, 0x0095, 0xA203, 0x0098, 0xA302, 0x0081, - 0x3230, 0x8F02, 0xB026, 0xFFFF, 0xA302, 0x0098, 0xA200, 0x028F, 0x421E, 0x403A, 0xBC3C, - 0x027F, 0xBC22, 0x2033, 0xE064, 0xBC23, 0x2034, 0xE065, 0xFB54, 0xFB75, 0xA300, 0x028F, - 0xBC02, 0x1BC3, 0xBC22, 0x3105, 0xA200, 0x0313, 0x700E, 0xBA52, 0x3BC2, 0xBC22, 0x2139, - 0xBC3C, 0x02E0, 0xBD05, 0x0352, 0xFA53, 0xE463, 0xA202, 0x0099, 0x2620, 0xA300, 0x0313, - 0x385A, 0x8F10, 0xBC23, 0x2008, 0xBC24, 0x0080, 0xFA75, 0x0B2C, 0xBC25, 0x2103, 0xFB74, - 0xFAB3, 0xBC24, 0x4000, 0x08DC, 0x2630, 0x8F01, 0xBC02, 0x15BE, 0x4022, 0xA203, 0x0091, - 0x26B0, 0x8F05, 0xBC20, 0x2012, 0xBC21, 0x2014, 0xBC02, 0x106C, 0x4022, 0xA203, 0x0093, - 0xB306, 0x0011, 0x4003, 0x1893, 0xA204, 0x0091, 0x6D28, 0x5FA2, 0x4244, 0x2214, 0x18DA, - 0xA202, 0x008F, 0x2620, 0xA303, 0x0091, 0x8F67, 0x2621, 0x8F53, 0x2622, 0x8F2B, 0x26A3, - 0x8F26, 0xBC02, 0x118C, 0xCFA2, 0x2620, 0xBC20, 0x2015, 0x8F0E, 0xA201, 0x0097, 0xBC02, - 0x101D, 0xBC02, 0x1391, 0xBC02, 0x1DAA, 0xA202, 0x0097, 0x2622, 0x4043, 0x8F00, 0x34D1, - 0xA303, 0x0097, 0xA202, 0x0093, 0x3511, 0x4242, 0x21E2, 0xA203, 0x0094, 0x4005, 0x34D9, - 0x192C, 0x4062, 0x08DA, 0xA304, 0x0093, 0x8C51, 0xA303, 0x0094, 0x8C4E, 0x4062, 0x3854, - 0xB004, 0xFFFB, 0xDFC0, 0xBC02, 0x121B, 0x6E15, 0x0FC0, 0xB014, 0xFFFA, 0xDFC1, 0xBC02, - 0x1277, 0xBC02, 0x12BC, 0xCFC0, 0xBC21, 0x0464, 0xBC02, 0x1326, 0x7018, 0x8FA3, 0x2630, - 0x8F33, 0xA201, 0x0097, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, - 0xBC02, 0x1092, 0x4062, 0x8D27, 0xBC02, 0x118C, 0xBC02, 0x11E4, 0xBC02, 0x1B03, 0x7018, - 0x8FA3, 0x2630, 0x8F1B, 0xA201, 0x0097, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x4062, 0x8D15, - 0xBC02, 0x12BC, 0xCFA2, 0x2620, 0x8F00, 0xBC02, 0x1E00, 0xBC02, 0x10FF, 0xA202, 0x0094, - 0x26A0, 0x4062, 0x8F05, 0xA203, 0x047B, 0x2630, 0x8F01, 0xBC02, 0x115E, 0x4062, 0xA204, - 0x008F, 0xA203, 0x0090, 0x6D48, 0x4F95, 0x34D9, 0x40E6, 0xA205, 0x008D, 0x08DE, 0x08A2, - 0x26D0, 0xA303, 0x0090, 0xA302, 0x008F, 0x8F04, 0xBC22, 0x31F8, 0xDF95, 0xFA52, 0x8EA2, - 0xCF95, 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xA200, 0x0092, 0xDFC0, 0xDFF5, 0xBC02, - 0x10DC, 0xCFC0, 0xB300, 0x0044, 0x8F2B, 0xA201, 0x0097, 0xB300, 0x0045, 0x8F21, 0xB300, - 0x0046, 0x8F14, 0xCFC0, 0xB310, 0x0047, 0x8F21, 0xA200, 0x0470, 0x2680, 0x8F00, 0xBC02, - 0x0F91, 0xBC02, 0x1DAA, 0xA200, 0x0097, 0x2602, 0x4041, 0x8F00, 0x3441, 0xA301, 0x0097, - 0x8D12, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, 0xBC02, 0x1092, - 0x8D07, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x8D02, 0xBC02, 0x1E00, 0x7240, 0x4FC0, 0x6D00, - 0x4FF5, 0x21C1, 0x4001, 0x1808, 0xA201, 0x008D, 0x2690, 0xA300, 0x0092, 0x8F04, 0xBC20, - 0x31F8, 0xDFD5, 0xFA10, 0x8EA0, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x009C, - 0xBC21, 0x047C, 0x0448, 0x3489, 0x32A0, 0x4001, 0x8F01, 0x8B02, 0xE401, 0x8EB8, 0xE902, - 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0xBC20, 0x3173, 0xBC21, 0x3010, 0xBC24, 0x02A8, 0xBC22, - 0x2032, 0x7014, 0x3A10, 0x4085, 0x700F, 0x3A31, 0xA300, 0x01E5, 0xFA53, 0xBC40, 0x1605, - 0xA301, 0x0467, 0x4100, 0xBC40, 0x1E10, 0xBC40, 0x2610, 0x6206, 0x2610, 0xFA51, 0x6213, - 0x6650, 0xBC3A, 0x0184, 0xBC3E, 0x01C0, 0x4503, 0x4444, 0xBC2E, 0x0160, 0xBC2F, 0x0170, - 0xB048, 0x009C, 0xB056, 0x009C, 0xA300, 0x01E3, 0xA301, 0x01F7, 0xA31C, 0x0468, 0xA31C, - 0x0461, 0xA31C, 0x045C, 0xA30E, 0x016E, 0xA30F, 0x017E, 0xA31A, 0x01AC, 0xA31A, 0x01AD, - 0xA31E, 0x01E0, 0xA31E, 0x01E1, 0xA304, 0x015E, 0xA305, 0x015F, 0xBC20, 0x3136, 0xBC21, - 0x3163, 0xBD04, 0x04D2, 0xFA04, 0xFB24, 0xFA0C, 0xFB24, 0xBD04, 0x04D8, 0xFA0C, 0xFB24, - 0xBC20, 0x31B2, 0x7717, 0xBA51, 0x7006, 0xBA14, 0x38BC, 0x084D, 0xB048, 0x319C, 0xA301, - 0x0266, 0xBC20, 0x0200, 0xFA91, 0xB040, 0x0050, 0xB060, 0x0010, 0xA304, 0x0261, 0xA300, - 0x0260, 0xA306, 0x0262, 0xFA52, 0x4044, 0x1609, 0x41E6, 0x0894, 0x1406, 0xB4F2, 0x0001, - 0x0B07, 0xBC20, 0x01F9, 0xA302, 0x02A7, 0xBC40, 0x1C01, 0xBC40, 0x3401, 0x144E, 0x24A1, - 0xBC24, 0x029A, 0xBC40, 0x140C, 0xBC21, 0x0267, 0xBC22, 0x0294, 0xBC3C, 0x4000, 0x6D79, - 0x640E, 0xBC3F, 0x0285, 0xBC3B, 0x0290, 0xBC30, 0x2000, 0x7000, 0x244F, 0xBC40, 0x6607, - 0xA31F, 0x028F, 0xA31B, 0x0293, 0xBC40, 0x0C9C, 0xBC40, 0x149C, 0xBC40, 0x151E, 0xBC40, - 0x2C80, 0xBC40, 0x3490, 0xBC40, 0x3C9A, 0xBC40, 0x2D10, 0xBC40, 0x1D03, 0x40A7, 0xBC02, - 0x05B3, 0xB04A, 0x0318, 0xBC23, 0x30FD, 0xBC22, 0x30FF, 0xA304, 0x0325, 0xFA74, 0xFA52, - 0x04F2, 0xBC21, 0x02E0, 0x3589, 0xB00E, 0x0318, 0xA306, 0x0312, 0xA300, 0x0326, 0xBC26, - 0x30FC, 0xBC20, 0x3102, 0xFAD6, 0xFA10, 0xA306, 0x0360, 0x14AA, 0x1428, 0x14EB, 0xA304, - 0x035F, 0xBC26, 0x2021, 0x35CD, 0xBC25, 0x0327, 0xBC24, 0x07C0, 0xBC3E, 0x7FFF, 0xBC3A, - 0x0320, 0xB012, 0x0019, 0xB024, 0xFFFF, 0xB000, 0xFFFF, 0x6D4B, 0x3BD4, 0xA305, 0x0354, - 0xA31E, 0x047A, 0xA31A, 0x02DC, 0xA301, 0x0314, 0xA307, 0x0313, 0xA304, 0x0353, 0xA302, - 0x0363, 0xA303, 0x0364, 0xA300, 0x0365, 0xBC02, 0x0263, 0xBC02, 0x07A4, 0xBC20, 0x2023, - 0xBC21, 0x4000, 0x700F, 0xBA10, 0x0801, 0x2680, 0x8F09, 0xBC20, 0x2040, 0x7008, 0x4FD5, - 0xFA10, 0x0801, 0x2600, 0x8F10, 0xA301, 0x0099, 0x8D0F, 0xBC20, 0x2008, 0xBC21, 0xFF7F, - 0x7007, 0x3A12, 0x6214, 0x4FD5, 0xA31C, 0x0099, 0xA31C, 0x02A7, 0xA31E, 0x008D, 0xFB11, - 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0x6914, 0x4FD5, 0x4020, - 0xE9FE, 0xA309, 0x008B, 0xA309, 0x008C, 0xA300, 0x00A0, 0xBC00, 0x0263, 0xBC22, 0x036A, - 0xBC21, 0x044C, 0x044A, 0x3509, 0x32C0, 0x4001, 0x4023, 0x8F01, 0x8B04, 0xE501, 0x2680, - 0x8F02, 0xBC22, 0x2040, 0x8E00, 0xFB51, 0xBC22, 0x305A, 0x40BC, 0x703F, 0xBA52, 0xBC3A, - 0x0376, 0xBC2E, 0x0399, 0x4FEF, 0xBC28, 0x03A8, 0x2680, 0x149A, 0x4270, 0xA31E, 0x0372, - 0xA31A, 0x0375, 0xA310, 0x0395, 0xA31C, 0x0396, 0xA31C, 0x0397, 0xA30E, 0x0398, 0xA30F, - 0x03B8, 0xA308, 0x03A6, 0xA302, 0x03A5, 0xBC20, 0x2040, 0x8F01, 0x4042, 0xFB12, 0xBC20, - 0x3079, 0xBC3E, 0x03DC, 0xBC3A, 0x041A, 0xBC24, 0x2044, 0xFA03, 0xBC30, 0x03F1, 0xA31E, - 0x03DB, 0xA31A, 0x0442, 0xA310, 0x03F0, 0xFB91, 0xA301, 0x03E2, 0xA303, 0x03E0, 0xBC22, - 0x2043, 0x8EC0, 0xA300, 0x03E1, 0xFB51, 0xE902, 0xA200, 0x008C, 0xA201, 0x0082, 0x6980, - 0x5FD5, 0x8F16, 0x2611, 0x8F14, 0x2612, 0x8F11, 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, - 0x2680, 0x8F00, 0xBC02, 0x06A8, 0xBC20, 0x201F, 0xBC21, 0x03FF, 0xFA10, 0x0801, 0xBC22, - 0x2002, 0x8C06, 0xFB50, 0xBC20, 0x2002, 0xA201, 0x0089, 0xFB11, 0xBC20, 0x2000, 0x4021, - 0xFB11, 0xFA11, 0x2693, 0x8FFC, 0x8E00, 0xBC20, 0x2000, 0x4001, 0xBC22, 0x2020, 0x7010, - 0x3B11, 0xFA51, 0x0808, 0x2600, 0x4021, 0x8F0C, 0xBC20, 0x2001, 0x8E00, 0xFB11, 0xFA11, - 0x2693, 0x8FFC, 0x8E00, 0x7000, 0x4FD5, 0xBC20, 0x2001, 0x8C02, 0xFB11, 0xCFD5, 0x8E00, - 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x201B, 0x4022, 0xFA10, 0x4381, 0x0902, 0x0841, 0x4043, - 0x2640, 0x0803, 0x124B, 0xA204, 0x0089, 0xBC23, 0x201D, 0x8F10, 0x0461, 0xFA73, 0xA301, - 0x0089, 0x218B, 0x8F1A, 0x2600, 0xBC20, 0x201C, 0x8F03, 0xFA10, 0x8C15, 0xA300, 0x0089, - 0xA302, 0x0086, 0x8D10, 0xBC25, 0x201C, 0x0061, 0xFAB4, 0xA301, 0x0089, 0x208C, 0x8F07, - 0x2600, 0x8F03, 0xFA70, 0x8C04, 0xA300, 0x0089, 0xA302, 0x0086, 0xBC20, 0x201F, 0xBC21, - 0x03FF, 0xFA10, 0xA203, 0x0089, 0x0801, 0x2258, 0x8F03, 0x8EC0, 0xA302, 0x0086, 0x8E00, - 0x8EB8, 0xBC20, 0x201B, 0x4381, 0xFA10, 0x0801, 0xA201, 0x0089, 0xB480, 0x0002, 0xBC22, - 0x201C, 0x0008, 0xFA51, 0x2001, 0xA300, 0x0089, 0x8F03, 0x8EC0, 0x4020, 0xA300, 0x0086, - 0x8EB8, 0xE902, 0xBC22, 0x2000, 0xDFD5, 0x41A3, 0xBC02, 0x0723, 0x4344, 0xBC25, 0x0400, - 0x2620, 0x8F05, 0xBC02, 0x07F0, 0x5404, 0x4025, 0xBC02, 0x07F0, 0x8D06, 0xBC02, 0x07FB, - 0x5404, 0x4025, 0xBC02, 0x07FB, 0xBC02, 0x072A, 0x4E20, 0xBC02, 0x07B8, 0xBC20, 0x0001, - 0x0848, 0xB412, 0x0000, 0xBC22, 0x1000, 0x4183, 0xBC02, 0x0723, 0x220A, 0x8F3F, 0xDFE2, - 0xBC21, 0x2098, 0x41C2, 0xFA33, 0x0ADA, 0xFB33, 0x4060, 0x4841, 0xBC02, 0x07D8, 0xBC21, - 0x2098, 0x4202, 0xBC20, 0xFFFE, 0x0ADA, 0xFB33, 0x08D8, 0xFB33, 0x4E20, 0xBC02, 0x07B8, - 0xBC22, 0xFFFE, 0x084A, 0xCFE2, 0x0A4A, 0xBC02, 0x07CA, 0x4224, 0xBC25, 0x4000, 0xBC02, - 0x07FB, 0x4044, 0x4045, 0xBC02, 0x07FB, 0x4284, 0x4105, 0xBC02, 0x07FB, 0x4284, 0x4105, - 0xBC02, 0x07F0, 0xCFE0, 0xBC02, 0x0733, 0x4E24, 0x4045, 0xBC02, 0x07FB, 0x4E24, 0x4045, - 0xBC02, 0x07F0, 0xBC20, 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0xBC22, 0x4000, 0x41C3, - 0xBC02, 0x0723, 0x38A2, 0x4E20, 0xBC02, 0x07B8, 0xB55A, 0x0002, 0x0A4D, 0xBC02, 0x07CA, - 0xCFD5, 0xE9FE, 0x8EB8, 0xBC20, 0x201F, 0x8E00, 0xFA10, 0x0890, 0x1093, 0x8EB8, 0xE902, - 0x4E24, 0xDFD5, 0x4085, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, 0xBC21, 0x202D, - 0xDFD5, 0xDFE0, 0x4280, 0xBC02, 0x07CA, 0xBC22, 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, - 0x1853, 0x42C0, 0xBC02, 0x07CA, 0x4240, 0xBC21, 0xE419, 0xBC02, 0x07CA, 0x4260, 0xBC21, - 0x9010, 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FFB, 0xBC02, 0x07CA, 0x4220, 0xBC21, 0x2020, - 0xBC02, 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x1020, 0xBC02, - 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07CA, - 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07D8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07CA, 0xCFD5, - 0xE9FE, 0x8EB8, 0xE902, 0xBC20, 0x2023, 0xDFD5, 0xFA16, 0xBC20, 0x2000, 0x09B0, 0xDFE6, - 0x4060, 0xBC02, 0x07B8, 0xBC22, 0x39AE, 0xBC23, 0x19AE, 0xCFE6, 0x2660, 0x195A, 0x220D, - 0x8F02, 0x3825, 0xBC02, 0x07CA, 0x4480, 0xBC02, 0x07B8, 0xBC22, 0x0000, 0xBC23, 0x0001, - 0xCFE6, 0x2660, 0x195A, 0x220D, 0x8F02, 0x3825, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, - 0xE902, 0x4E04, 0x4805, 0xDFD5, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, 0x2600, - 0x8F01, 0xBC02, 0x07FB, 0x8D02, 0xBC02, 0x07F0, 0xCFD5, 0xE9FE, 0x8EB8, 0xBC22, 0x209A, - 0xBC23, 0x0100, 0x0AD8, 0xBC21, 0x209D, 0xFB53, 0x4043, 0xFA32, 0x0893, 0x26A0, 0x8FFA, - 0xBC22, 0x209C, 0x8E00, 0xFA51, 0x8EB8, 0xBC22, 0x209A, 0xBC23, 0x209B, 0xFB50, 0xBC22, - 0x209D, 0xFB71, 0x4023, 0xFA51, 0x084B, 0x2690, 0x8FFB, 0x8EB8, 0xBC08, 0x07E6, 0x8E00, - 0xBDC8, 0x07E5, 0x8E00, 0xBC09, 0x07E4, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, - 0x8E00, 0x8EB8, 0xBC08, 0x07EE, 0x8E00, 0xBC09, 0x07ED, 0x8E00, 0x8E00, 0x8EB8, 0xE902, - 0x3804, 0xDFD5, 0xBC02, 0x07B8, 0x0A4D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, - 0x1745, 0xDFD5, 0x3804, 0xBC02, 0x07B8, 0x084D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, - 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, 0x2600, 0x8F00, 0x8EB8, 0xE902, 0x4020, 0xDFD5, - 0xBC21, 0x1F2A, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, - 0x402D, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, 0x5FED, 0xBC02, - 0x07CA, 0x4020, 0xBC21, 0x1F6A, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, - 0xBC21, 0x7FED, 0xBC02, 0x07CA, 0x4500, 0x4461, 0xBC02, 0x07E8, 0xBC20, 0x2023, 0xBC22, - 0x39AE, 0xBC23, 0x19AE, 0xFA10, 0xBC21, 0x2000, 0x0841, 0x38C1, 0x2610, 0x185A, 0x4060, - 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FF9, 0xBC02, 0x07CA, 0xBC20, 0x000A, 0x4461, 0xBC02, - 0x07E8, 0x4022, 0x4003, 0x2660, 0x1853, 0x4480, 0xBC02, 0x07CA, 0x4540, 0xBC02, 0x07B8, - 0xDFE1, 0x40C0, 0x4202, 0x41E3, 0x4104, 0xBC25, 0x31EC, 0x41E6, 0xBC02, 0x08EC, 0x41C0, - 0xBC24, 0x87FF, 0x4166, 0xBC02, 0x08F9, 0xCFE1, 0x4000, 0x4402, 0x43E3, 0x4164, 0xBC25, - 0x31ED, 0x43E6, 0xBC02, 0x08EC, 0xDFE5, 0x4180, 0xBC24, 0xFF07, 0x4066, 0xBC02, 0x08F9, - 0xCFE5, 0x40E0, 0xBC24, 0xFFE0, 0x4006, 0xBC02, 0x08F9, 0x4000, 0xBC02, 0x0733, 0xBC20, - 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0x4500, 0x4401, 0xBC02, 0x07CA, 0x4140, 0xBC21, - 0x0841, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4841, 0xBC02, 0x07E8, 0x4140, 0xBC21, 0x0840, - 0xBC02, 0x07CA, 0x4500, 0x4001, 0xBC02, 0x07CA, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, - 0x084A, 0x2610, 0x8F0A, 0x5364, 0x4065, 0xBC02, 0x07F0, 0x4AC0, 0x4021, 0xBC02, 0x07CA, - 0xBC21, 0x1FFA, 0x8D02, 0xBC21, 0x1FFB, 0x4040, 0xBC02, 0x07CA, 0x4C80, 0x4841, 0xBC02, - 0x07E8, 0x41E0, 0xBC21, 0x4042, 0xBC02, 0x07CA, 0xBC02, 0x07A4, 0x4E80, 0x4021, 0xBC02, - 0x07CA, 0x4E60, 0xBC21, 0x0480, 0xBC02, 0x07CA, 0x5380, 0xBC21, 0xAB40, 0xBC02, 0x07CA, - 0x4102, 0x4503, 0xBC24, 0x2023, 0xBC25, 0x0400, 0xFA94, 0x0925, 0x2640, 0x1853, 0x53C0, - 0xBC02, 0x07CA, 0x4E04, 0x4025, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0x1048, 0x0891, - 0x08D9, 0x2620, 0x1863, 0xFAB2, 0x004A, 0x4002, 0x3210, 0x1851, 0x210E, 0x1971, 0x8EB8, - 0xE901, 0x8E00, 0xDFF5, 0xBC02, 0x07B8, 0x0861, 0x316E, 0x0A4D, 0xBC02, 0x07CA, 0xCFF5, - 0xE9FF, 0x8EB8, 0xBC20, 0x209F, 0xBC21, 0x31DB, 0xA300, 0x047E, 0xA301, 0x047D, 0xBD11, - 0x0911, 0xFA22, 0xFB02, 0x8EC0, 0xA300, 0x047E, 0xA301, 0x047D, 0x0000, 0x6915, 0xA908, - 0xA21B, 0x0180, 0xA21E, 0x017E, 0xA21D, 0x016E, 0xBC3C, 0x3116, 0xBC30, 0x311D, 0x7016, - 0xDF1B, 0xA204, 0x017F, 0xA202, 0x0181, 0xA203, 0x0182, 0xA201, 0x01AD, 0x6915, 0x1F3D, - 0x77F6, 0x9F5E, 0xBC26, 0x3106, 0xDF70, 0xDF9C, 0xBD08, 0x09DB, 0xA200, 0x015E, 0xBC3C, - 0x009C, 0xBC3E, 0x00C2, 0xA304, 0x017F, 0x6E7B, 0x9FA1, 0x6E43, 0xBAC5, 0x6E4B, 0xBE18, - 0x396C, 0x8A0E, 0xBF95, 0x8A18, 0x77E6, 0x9FC6, 0x6A91, 0x7AD5, 0x7077, 0xFE18, 0x6A91, - 0x4F86, 0x88D0, 0x6E62, 0xFAC7, 0x6E7A, 0x5FE0, 0x39C8, 0x8890, 0xBC3D, 0x0170, 0x6FCA, - 0x4F41, 0x6910, 0xBAC5, 0x6910, 0xFF38, 0x7016, 0xBE38, 0x2A47, 0x6A91, 0xFE38, 0xBF95, - 0x8A38, 0x6A91, 0x7AC7, 0xBF95, 0x8A38, 0xBF9D, 0x8E38, 0xBF95, 0xAA38, 0x2A47, 0x6A91, - 0xFE38, 0x2A45, 0x88D0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xB06C, 0xFFFA, 0x613E, 0xDF86, - 0xBC26, 0x7ADD, 0xBCB7, 0x8000, 0x04AA, 0xBC26, 0x7ADD, 0xBCA5, 0x8000, 0xA300, 0x015E, - 0x6025, 0x0F00, 0x6FCB, 0xCFC4, 0x6036, 0x0FE0, 0xB048, 0xFFF1, 0x6910, 0xBF38, 0x6910, - 0xDF41, 0xFA86, 0x6960, 0x3E18, 0x8A0E, 0xBF99, 0x0C18, 0x7076, 0x9F07, 0x6A91, 0xBA96, - 0x7016, 0xBE18, 0x2A46, 0x88E0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xA300, 0x015E, 0x7077, - 0x8F20, 0xBC3C, 0x0160, 0x6FCD, 0xCF66, 0x6910, 0xBF18, 0x6910, 0xFAC7, 0x7147, 0xFE18, - 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0xBF9D, - 0x8E18, 0x2A47, 0xBF9D, 0xAE18, 0x2A47, 0x88F0, 0xB06C, 0xFFFA, 0x6E62, 0xDF66, 0x39E9, - 0x39C8, 0x88E0, 0x0E7A, 0x3F3E, 0x63EC, 0xFF18, 0x6FC3, 0x8FA1, 0xBC3D, 0x0184, 0xB068, - 0xFFF1, 0x6915, 0xBF38, 0x6915, 0x1F20, 0x5FDA, 0x3885, 0xCF1E, 0xCF50, 0xA310, 0x017E, - 0xA301, 0x01AD, 0xA304, 0x017F, 0xA302, 0x0181, 0xA31E, 0x0180, 0xA303, 0x0182, 0xCF3B, - 0x8EC0, 0xE9F8, 0xA31B, 0x016E, 0x0000, 0x2451, 0xA201, 0x01AC, 0x3909, 0xBC22, 0x3124, - 0x2453, 0xBC3D, 0x0184, 0x451F, 0xBD08, 0x0A11, 0x77F6, 0xFA43, 0x2442, 0x6960, 0x3E38, - 0x8A0C, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x439B, 0x6E18, - 0x2403, 0xB024, 0xFFF3, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01AC, 0x8E00, - 0xBC20, 0x3131, 0xA201, 0x02C2, 0xFA10, 0x2600, 0x8F3E, 0xA200, 0x01E2, 0x2680, 0x8F39, - 0x2610, 0xA200, 0x01BE, 0xB010, 0xFFFF, 0x8F2C, 0xA202, 0x01E3, 0x26A0, 0x8F28, 0xBC22, - 0x02A8, 0xBC23, 0x3133, 0xBC24, 0x3132, 0xBC40, 0x3906, 0xFA73, 0xBC25, 0x3134, 0xBC27, - 0x3135, 0xBC40, 0x3102, 0xFA94, 0x04F3, 0xFAB5, 0xFAF6, 0x04A2, 0x1095, 0x10DE, 0x1D1A, - 0x4003, 0x3240, 0x3843, 0x8F02, 0xB228, 0x0040, 0x4803, 0x18DC, 0x2103, 0x8F05, 0x2183, - 0x8F18, 0x3401, 0xA300, 0x01BE, 0x8D15, 0x8C14, 0xA301, 0x01BE, 0x3280, 0x4002, 0x8F0D, - 0xA301, 0x01BE, 0x8D0C, 0x8C0B, 0x4002, 0x2690, 0x4800, 0x4002, 0x8F03, 0x8E00, 0x8C04, - 0xA302, 0x01BE, 0xA300, 0x01BE, 0xA200, 0x01BE, 0x2600, 0xBC21, 0x2035, 0x4020, 0x8EC0, - 0x1810, 0xFB30, 0x0000, 0x38E0, 0xA200, 0x01E1, 0xB202, 0x0040, 0x405A, 0xBC3C, 0x01C0, - 0x441E, 0x8F0F, 0x6E11, 0xE800, 0xBD08, 0x0A88, 0x6D74, 0xA103, 0xE142, 0x1B1A, 0x0E9A, - 0x3F14, 0x6E11, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xB522, 0x0009, 0x3867, - 0xBD08, 0x0A9D, 0x6D76, 0xA184, 0xE1C3, 0xBCB6, 0x8000, 0x8E00, 0x1B63, 0x0EE3, 0x3F1D, - 0x6E19, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xA200, 0x01F7, 0x2600, 0xA200, - 0x01E4, 0x8F44, 0xA201, 0x01F8, 0x2690, 0x8F41, 0xBC21, 0x3173, 0xA202, 0x01E5, 0xFA31, - 0x2191, 0x8F02, 0x3491, 0xA302, 0x01E5, 0xA202, 0x01E5, 0x2251, 0x8F33, 0xBC21, 0x02A8, - 0xBC23, 0x316F, 0xBC25, 0x316C, 0xBC40, 0x4086, 0xFA73, 0xBC22, 0x316D, 0xBC24, 0x316E, - 0x680C, 0xFAB3, 0xFA52, 0xFA94, 0x38A3, 0x8F04, 0xBC23, 0x3170, 0x8E00, 0xFA73, 0x2033, - 0x18D4, 0xBC26, 0x3171, 0xBC40, 0x4881, 0xFAD6, 0x210E, 0x8F04, 0xBC25, 0x3172, 0x8E00, - 0xFAB5, 0x210D, 0x1954, 0x1E5D, 0x2208, 0x401E, 0x8F0A, 0x2108, 0xA31E, 0x01E5, 0x8F03, - 0x8E00, 0x8C05, 0xB000, 0xFFFF, 0x3401, 0x8D01, 0x4000, 0x40A1, 0x2801, 0xA300, 0x01E4, - 0x382E, 0xB012, 0x3136, 0xBC20, 0x3163, 0xBD04, 0x0AFB, 0xFA22, 0xFB02, 0xFA2A, 0xFB02, - 0xBD04, 0x0B01, 0xFA2A, 0xFB02, 0x8EB8, 0x0000, 0x2451, 0xA201, 0x01E0, 0x3909, 0xBC22, - 0x3163, 0x2453, 0xBC3D, 0x01C0, 0x441F, 0xBD08, 0x0B25, 0x77F6, 0xFA43, 0x2442, 0x6960, - 0x3E38, 0x8A08, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x429B, - 0x6E18, 0x2403, 0xB024, 0xFFF7, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01E0, - 0x8E00, 0xBC20, 0x31B2, 0x5FE1, 0xFA10, 0xB020, 0x319C, 0xB012, 0x319C, 0x0008, 0xBC23, - 0x01F9, 0xFA10, 0xBC40, 0x1981, 0x6862, 0x3A52, 0xBC40, 0x3582, 0x8F06, 0xA200, 0x0085, - 0x2681, 0x8F03, 0x8EC0, 0x4040, 0xA300, 0x0085, 0x8EB8, 0x0000, 0xBC21, 0x02A8, 0xBC23, - 0x0263, 0xBC40, 0x4880, 0xBC40, 0x5084, 0x6E10, 0xE580, 0x7000, 0x25C4, 0xA203, 0x0266, - 0xBC40, 0x5881, 0x2630, 0xBC40, 0x1501, 0x401C, 0x8F28, 0x3820, 0xB532, 0x0002, 0xB036, - 0x3174, 0x3882, 0x6910, 0xBA65, 0x6960, 0x2206, 0x8A02, 0xBBD4, 0xCA86, 0x6A3D, 0x7A73, - 0x88C0, 0x3215, 0x00E3, 0x8F05, 0xB416, 0x0002, 0x0441, 0x3214, 0x1801, 0x8C0A, 0x3B80, - 0x3330, 0x8F04, 0x2614, 0x8F04, 0x8E00, 0x8CE1, 0x3449, 0x344D, 0x8DDE, 0xBC20, 0x31B2, - 0x383C, 0xFA10, 0x2108, 0x1801, 0xB000, 0x319C, 0x8EC0, 0xFA10, 0xA300, 0x01FF, 0xBC25, - 0x01F9, 0x34AB, 0xE904, 0xE143, 0x6122, 0xDF82, 0x3320, 0x8F02, 0xBC23, 0x31B4, 0x8C05, - 0xFA73, 0xBC23, 0x31B3, 0x8E00, 0xFA73, 0x2813, 0xA201, 0x0260, 0xBC40, 0x268E, 0xBC40, - 0x2E8F, 0x6D4A, 0xA29E, 0x700E, 0xE2DC, 0x7307, 0xDFDE, 0x6E7F, 0x224C, 0xCFCE, 0x6A34, - 0xDFA5, 0x6E28, 0x2800, 0xBC3D, 0x0200, 0x6EE3, 0xE287, 0x88E0, 0xBD07, 0x0BC7, 0x6D00, - 0x9FCE, 0xBCFF, 0x8000, 0x8E00, 0xE4E7, 0xE2C5, 0xBCDB, 0x8000, 0x6E7F, 0x0FCE, 0x6A34, - 0xE4E5, 0x38A0, 0x88E0, 0x6EE3, 0xE287, 0xDFCE, 0xBCFF, 0x8000, 0xCF82, 0xE4E7, 0xE2C5, - 0xBCDB, 0x8000, 0xE64C, 0xE4E5, 0xCFDF, 0xE546, 0xA301, 0x0260, 0xA31F, 0x01F9, 0xCFA3, - 0x8EC0, 0xE9FC, 0xE5DC, 0x0000, 0xBC22, 0x31B7, 0x8E00, 0xFA52, 0x26A0, 0x8F04, 0x8EC0, - 0xBC22, 0x6568, 0xA302, 0x0268, 0xA200, 0x0261, 0x403A, 0xBC3C, 0x0200, 0x4C1E, 0x8E00, - 0xE062, 0xA300, 0x0261, 0x6904, 0xBC1B, 0x241B, 0xBD1E, 0x0BFA, 0x67A6, 0xBC1B, 0x241B, - 0x1E9A, 0xBC3D, 0x0290, 0xA201, 0x0293, 0x3B7A, 0x407F, 0xBC23, 0x31B6, 0x6EE7, 0x64E2, - 0xFA73, 0xA204, 0x02B0, 0xA300, 0x0261, 0xA301, 0x0293, 0x21A3, 0x8F2C, 0xA200, 0x0293, - 0x407E, 0xBC23, 0x31B5, 0x7016, 0xBC1C, 0x1EA2, 0xB800, 0xE61C, 0x1EA2, 0x1E93, 0xB124, - 0x0001, 0xBC23, 0x2000, 0xBCA4, 0xC000, 0xBC24, 0x3FFF, 0x24DA, 0xB056, 0xFFFF, 0x3095, - 0x0562, 0xA300, 0x0293, 0x4004, 0xBD0B, 0x0C39, 0x33D0, 0xB56A, 0x0001, 0x8F02, 0xB548, - 0x0001, 0x8C05, 0x0172, 0x3521, 0x0572, 0xB548, 0x0001, 0x8E00, 0x30A3, 0xA302, 0x0269, - 0xA202, 0x0269, 0xA203, 0x0268, 0x0493, 0x3220, 0xBC23, 0x0400, 0x8F02, 0xBC23, 0x31B8, - 0x8E00, 0xFA73, 0xBC24, 0x0267, 0x281A, 0xE643, 0x8EC0, 0xBC40, 0x260F, 0xBC40, 0x1E0E, - 0x0000, 0xBC23, 0x0267, 0x349D, 0xE904, 0x6D57, 0xA15F, 0x6D27, 0xDF82, 0x700E, 0xA2DD, - 0xBC40, 0x2184, 0x6E7F, 0x5FDF, 0xBC40, 0x1983, 0x7307, 0xA14C, 0xCFCE, 0x6AA7, 0x1FA5, - 0xA200, 0x0262, 0xBC3C, 0x0200, 0x88E0, 0x6EEB, 0xFC1F, 0x6960, 0x1FCE, 0xBC25, 0x026F, - 0xBCFD, 0xC000, 0xBD07, 0x0C8C, 0xB51E, 0x0002, 0x6D7A, 0xA681, 0xE061, 0xBC9C, 0x4000, - 0x6E7F, 0x4FCE, 0xB512, 0x0002, 0x6AA7, 0x26C1, 0x88E0, 0x6E29, 0xDFCE, 0x6EEB, 0xFC1F, - 0xBCFD, 0xC000, 0x8E00, 0xB51E, 0x0002, 0xE681, 0xE061, 0xBC9C, 0x4000, 0xCFA3, 0xB512, - 0x0002, 0xBC24, 0x0267, 0xE6C1, 0xE5DD, 0xE54C, 0xA300, 0x0262, 0xBC40, 0x0E06, 0xCF85, - 0xCFDE, 0x8EC0, 0xE9FC, 0xE6DE, 0xA200, 0x02A7, 0x2600, 0xBC01, 0x0D4B, 0xA203, 0x0294, - 0x2630, 0xA202, 0x02C5, 0xBC25, 0x1000, 0xA200, 0x02C6, 0xA204, 0x02C3, 0xA201, 0x01BE, - 0xBCA5, 0x4000, 0xBC23, 0x0294, 0x8F33, 0xBC26, 0x31CE, 0xBC40, 0x1185, 0x6990, 0x7AD4, - 0x0495, 0xBCA5, 0x0000, 0xBC26, 0x31CF, 0x00AA, 0xBC25, 0x31D0, 0xBC40, 0x1984, 0xBC40, - 0x2187, 0x0404, 0xFAD6, 0x044F, 0xFAB5, 0xBC81, 0x8000, 0xBC93, 0x4000, 0x0020, 0x0079, - 0xA204, 0x0299, 0xBC40, 0x1582, 0xBC40, 0x1D80, 0xBC40, 0x2581, 0x8F07, 0x32C0, 0x4000, - 0x8F00, 0xB008, 0xFFFF, 0x8C13, 0xA300, 0x0299, 0xBC20, 0x4000, 0x21A0, 0x8F00, 0x3421, - 0x8C0B, 0xA300, 0x0299, 0x403E, 0xBC40, 0x1D80, 0xA31E, 0x0294, 0xBC40, 0x2581, 0xBC40, - 0x1582, 0xBC20, 0x31D1, 0xBC40, 0x1185, 0xFA10, 0x20A8, 0x4020, 0xBC40, 0x1981, 0x3840, - 0x8F06, 0xBC20, 0x31D2, 0x8E00, 0xFA10, 0x2088, 0x3802, 0x8F00, 0x4000, 0xBC24, 0x31D3, - 0xBC40, 0x2183, 0xFA94, 0xBC27, 0x31EE, 0x4006, 0x6867, 0x3AF3, 0x1932, 0x202B, 0x8F04, - 0xBC23, 0x31EF, 0x8E00, 0xFA73, 0x218B, 0x8F00, 0x3886, 0x2640, 0xBC21, 0x029A, 0x8F0B, - 0xBC23, 0x31D4, 0xA204, 0x0299, 0xFA73, 0x2023, 0x8F01, 0x2600, 0x8F03, 0x8E00, 0x8C13, - 0xA306, 0x0295, 0xBC20, 0x31F7, 0xBC40, 0x2083, 0xFA10, 0x2118, 0x1803, 0xA302, 0x0295, - 0xBC40, 0x1C86, 0xBC40, 0x1486, 0xBC40, 0x5C86, 0xBC40, 0x2480, 0xBC40, 0x2080, 0xB230, - 0x7530, 0x4C02, 0x8EC0, 0x1810, 0xBC40, 0x2480, 0x8EC0, 0x4000, 0xA300, 0x0294, 0x0000, - 0xBC22, 0x31F0, 0xE91C, 0xBC24, 0x029A, 0x7007, 0x3A52, 0x6E11, 0x1C82, 0x6E7F, 0x3C85, - 0xBC26, 0x31F4, 0xBC23, 0x31F3, 0x77FE, 0xDCA4, 0xBC27, 0x31F2, 0xB801, 0xA891, 0x7027, - 0xFA73, 0xFAF6, 0xDCC3, 0xBC27, 0x31D5, 0xBC23, 0x31DA, 0xDD26, 0xDD04, 0xFAF6, 0xBC24, - 0x31F5, 0xFA73, 0xDD66, 0xDD43, 0xFA96, 0xB074, 0x000B, 0xBC23, 0x31D8, 0xDDA6, 0xDD87, - 0xBC26, 0x31D7, 0xB800, 0xE6F7, 0xDCE1, 0xBC24, 0x31D6, 0x6D34, 0x9DC3, 0xDDE7, 0xBC21, - 0x8000, 0xFAD6, 0xBC27, 0x31D9, 0xFA94, 0x6163, 0x9E46, 0xE1DE, 0x6D34, 0xDE03, 0x6143, - 0x1E24, 0xDE86, 0xDE63, 0xB801, 0xEE73, 0xB064, 0x000C, 0xBC21, 0x31F6, 0xDEA7, 0xDEE3, - 0xDF06, 0xBC27, 0x31F1, 0xB034, 0x0009, 0x6D45, 0x1EC4, 0xB800, 0x6CD1, 0x6E81, 0xBAF6, - 0xB024, 0x000A, 0xDFA6, 0xDF42, 0xDF23, 0xE1C3, 0xE142, 0xE246, 0xDF64, 0xDF8F, 0xBC3D, - 0x029F, 0xBD08, 0x0E56, 0x6CD8, 0x1FC1, 0x7003, 0x0E27, 0x6915, 0xA044, 0x8F01, 0x2640, - 0x8F6F, 0x6A3B, 0xCCE5, 0x6D6C, 0x4EC7, 0x6A3B, 0xDFE6, 0x88D0, 0xB20C, 0x0060, 0xDCE5, - 0xCDC5, 0x8F65, 0x6A09, 0x4D65, 0x88FC, 0x6910, 0x8C86, 0x28DD, 0x28FD, 0x8890, 0xBCFF, - 0xC000, 0xBC92, 0x4000, 0x2442, 0x28D5, 0x6A3F, 0x4CE5, 0x88F0, 0x686B, 0x8D26, 0x611E, - 0x4DE7, 0x2409, 0x8F05, 0xCFA6, 0x686B, 0x8CC5, 0xCD06, 0x666B, 0x8CE5, 0x6113, 0x5DFC, - 0x2409, 0x32F0, 0xBCEC, 0x4000, 0x8F05, 0xCD41, 0x686E, 0x5DFC, 0x8F01, 0x35F9, 0xDDE7, - 0x686D, 0x4EE6, 0x401F, 0x8F12, 0x6CB8, 0x0DC5, 0x3BBC, 0x8F09, 0x38FE, 0xBC21, 0x2666, - 0xBCFE, 0x4000, 0xB06C, 0xFFFF, 0x3BA6, 0x3BE7, 0x0F27, 0x6EF7, 0xDEFD, 0xBC3D, 0x029F, - 0x8C26, 0x409F, 0xCDE5, 0x69B4, 0x0EA6, 0x8F01, 0x3569, 0xDDE5, 0x684B, 0x9EFC, 0x7027, - 0xCDC5, 0xBC3D, 0x029F, 0x8F16, 0x6910, 0x8FC1, 0x5BE5, 0x28E5, 0xBC25, 0x31CA, 0x403B, - 0xFAA6, 0xE0E7, 0x8A03, 0xBBF9, 0x4C3F, 0x6A3F, 0x9EF0, 0x88D0, 0x77FE, 0xDFC1, 0x66EB, - 0x0DC5, 0x0F26, 0x3BC6, 0x8D02, 0xDFE6, 0xCDC5, 0x6A09, 0x4E47, 0x88EC, 0x6915, 0x0F8F, - 0x6915, 0x8E85, 0x28F7, 0x28DD, 0x88B0, 0xBC9D, 0x8000, 0xBCE6, 0xC000, 0x6915, 0x0F8F, - 0x2456, 0x6A33, 0xCFC1, 0x28D5, 0x88A0, 0x8E00, 0x0556, 0x242D, 0x26D0, 0x8F04, 0xCFE6, - 0xCDA7, 0x2137, 0x19BE, 0xDFE6, 0x6D00, 0xA444, 0x6915, 0xEA38, 0xE4C4, 0xCFE6, 0xCF44, - 0xCF27, 0xCF00, 0xE7C3, 0xE642, 0xA305, 0x029A, 0xCE02, 0xCD83, 0xCF65, 0xE441, 0xCDE7, - 0xCE64, 0xCEFB, 0xCCF0, 0xCCA1, 0xE9E4, 0xE6C6, 0xE5C7, 0xE55E, 0x8EC0, 0xE65B, 0xE4D0, - 0xBC21, 0x02A8, 0xE90E, 0x6E18, 0x7C22, 0xA204, 0x02C4, 0x6C28, 0xA0C5, 0xA200, 0x02C2, - 0x6C49, 0x5F04, 0xB050, 0x31BD, 0x6E0D, 0x1F55, 0x6980, 0x3AB6, 0xB012, 0xFFF2, 0xA21E, - 0x02C6, 0xB000, 0x31BF, 0x616C, 0xA4DE, 0x7000, 0x5F21, 0xFA12, 0x4025, 0x180D, 0x0554, - 0xB020, 0x31BB, 0xA204, 0x02C5, 0xBC40, 0x2187, 0x31E7, 0xFA52, 0x0497, 0xB000, 0x31B9, - 0xBC40, 0x1987, 0x3127, 0x6C88, 0x3A10, 0x0504, 0x38F4, 0xB00E, 0xFFF7, 0x6622, 0x9F60, - 0x6D37, 0x6446, 0xB06E, 0xFFF6, 0x6C90, 0x1F86, 0x6643, 0x2745, 0xB05E, 0xFFF5, 0xB07E, - 0xFFF4, 0xE1C6, 0x6998, 0x66C4, 0xE7C2, 0xDFC7, 0xDFA5, 0x8F54, 0xBC20, 0x02A8, 0x700F, - 0x8E44, 0x65E3, 0x0EC5, 0xB5A8, 0x000F, 0x65B3, 0x65DE, 0xBC40, 0xBC02, 0xBC40, 0x5404, - 0xB4AA, 0x0001, 0xB5B6, 0x000F, 0xB4C8, 0x0001, 0xB5EC, 0x000F, 0x62B6, 0x8EA2, 0x0BB4, - 0x170A, 0xBC40, 0xC406, 0xB4E4, 0x0001, 0xB5C8, 0x000F, 0xBC40, 0x9403, 0x62C9, 0x8E83, - 0x178B, 0xB4F6, 0x0001, 0xB5EC, 0x000F, 0x0BB7, 0xBC40, 0x8404, 0xCEE4, 0xB5FA, 0x000F, - 0xBC40, 0x4405, 0x174C, 0xBC40, 0x8C07, 0xB4F8, 0x0001, 0xB5DA, 0x000F, 0xBC40, 0x3C02, - 0xBC40, 0x4C03, 0xB5A4, 0x000F, 0xB5B6, 0x000F, 0xBC40, 0x3404, 0x0B6F, 0xB5C8, 0x000F, - 0xBC40, 0x7C02, 0xBC40, 0x9C03, 0xBC40, 0x5C01, 0xBC40, 0xAC01, 0xBC40, 0xB401, 0xBC40, - 0x7405, 0xBC40, 0xA406, 0x8C69, 0xA304, 0x02B5, 0xBC23, 0x02B5, 0xBC22, 0x31C4, 0xB046, - 0xFFF9, 0xFA52, 0xDFE4, 0xBC02, 0x1E36, 0x7000, 0x4FE0, 0xB030, 0x000B, 0xBC20, 0x31C3, - 0xB046, 0xFFF7, 0xFA12, 0xCF80, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0x6D31, 0xCFA0, - 0xBC22, 0x31C6, 0xB046, 0xFFF8, 0xFA52, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0xB030, - 0x000C, 0xBC20, 0x31C5, 0xB046, 0xFFF6, 0xFA12, 0xCFC0, 0xDF84, 0xBC02, 0x1E36, 0x6E05, - 0x0F81, 0xB032, 0x000E, 0xBC40, 0x788F, 0x7000, 0x61CE, 0xB040, 0xFFF3, 0x88D8, 0xBC22, - 0x31C7, 0xB066, 0xFFF3, 0xCF20, 0xFA52, 0xDE65, 0xDF26, 0xDF83, 0xBC02, 0x1E36, 0xCF80, - 0xCF01, 0xBC47, 0xA803, 0xBC47, 0x5804, 0x6112, 0xCE7E, 0x6C33, 0x0F21, 0x241B, 0xBC47, - 0xA004, 0x6847, 0x24DE, 0xDEE3, 0x8F03, 0xBC23, 0x31C9, 0x4001, 0x8C05, 0xFA72, 0xBC23, - 0x31C8, 0x4001, 0xFA72, 0xB030, 0xFFFE, 0xB046, 0xFFF6, 0xCF60, 0xBC02, 0x1E36, 0xBC21, - 0x02A8, 0xBC20, 0x31C1, 0xCF1E, 0xBC40, 0x4083, 0xFA10, 0xBC40, 0x649E, 0x2098, 0x8F09, - 0xBC20, 0x31C2, 0xBC40, 0x5083, 0xFA10, 0x6406, 0x0F55, 0x0018, 0x8C03, 0xBC40, 0x5480, - 0xCF55, 0x8E00, 0x8EC0, 0xE9F2, 0x8E00, 0xBC23, 0x00A5, 0xBC20, 0x3054, 0x6E10, 0xE181, - 0xB800, 0x2074, 0x24A1, 0xA201, 0x045F, 0x28C8, 0x6911, 0x2902, 0xBC21, 0x00A3, 0x6E10, - 0x654E, 0xBC24, 0x2081, 0xE085, 0xBC26, 0x2083, 0xB801, 0x2837, 0x692F, 0x65CF, 0xDFC3, - 0xFAD3, 0x28D8, 0x2444, 0xBC23, 0x00A1, 0x6E10, 0xE54E, 0xE185, 0xE1C6, 0x692D, 0x64CF, - 0x28E0, 0x2444, 0xA200, 0x00A0, 0x7008, 0xA54E, 0x6220, 0xA5CF, 0xBC24, 0x2080, 0x26A0, - 0xFA94, 0xBC22, 0x00A7, 0x8F0E, 0x38A2, 0x8E00, 0xE286, 0xE2C7, 0x24BE, 0xBC26, 0x3055, - 0x8E00, 0xFAD6, 0x28E6, 0x2444, 0x8E00, 0xA30E, 0x00A7, 0xE6CF, 0xBC24, 0x3053, 0x8E00, - 0xFA94, 0x2244, 0x8F3A, 0x7007, 0x8FC4, 0xA20E, 0x00A5, 0xE24F, 0x88C8, 0xA20E, 0x00A1, - 0x690B, 0x21CF, 0x88B8, 0xA20E, 0x00A3, 0xE0CF, 0x8898, 0xBC26, 0x3056, 0xE10E, 0xFAD6, - 0x6807, 0xA14F, 0x88A8, 0x8F10, 0xBC26, 0x3057, 0x8E00, 0xFAD6, 0x200E, 0x8F0A, 0xBC26, - 0x3059, 0x8E00, 0xFAD6, 0x212E, 0x8F04, 0xBC25, 0x3058, 0x8E00, 0xFAB5, 0x2095, 0x8F03, - 0x8E00, 0x8C06, 0xA31E, 0x008C, 0x403E, 0x8E00, 0xA31E, 0x008C, 0x403C, 0xA303, 0x009C, - 0xA301, 0x009D, 0xA304, 0x009E, 0xA302, 0x009F, 0xA31C, 0x008B, 0xE9FE, 0x8EC0, 0x3401, - 0xA300, 0x00A0, 0x6C84, 0xA904, 0xFA13, 0x6E0D, 0x1FD5, 0xBC22, 0x3104, 0xB002, 0xFFFD, - 0xFA52, 0xBC21, 0x7FFF, 0x6622, 0xA443, 0x40A1, 0xBC23, 0x02CE, 0xBC24, 0x045A, 0xBC02, - 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xE906, 0xA202, 0x02D3, 0x6E0D, 0x1F81, - 0xB012, 0xFFFB, 0x6988, 0x5FA1, 0xDFD5, 0x8F04, 0xBC20, 0x2080, 0x4021, 0x8C0F, 0xA301, - 0x02D3, 0xFA11, 0xBC02, 0x1E46, 0xA201, 0x0474, 0x1A41, 0x7007, 0x9F61, 0xBC20, 0x2080, - 0xA31E, 0x02D3, 0xFB11, 0x7040, 0x4F83, 0xBC22, 0x3104, 0x6C8C, 0xBA10, 0xFA52, 0xBC23, - 0x7FFF, 0x6626, 0x9F60, 0xCFA0, 0xBC23, 0x02D1, 0xBC24, 0x045B, 0xBC02, 0x1E36, 0xCFD5, - 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xFA31, 0xDFC0, 0xDFF5, 0xBC02, 0x1E46, 0xCFC1, - 0xDFC0, 0xFA31, 0xBC02, 0x1E46, 0xCFC1, 0x1A48, 0xA200, 0x02D5, 0xA202, 0x045C, 0x0E41, - 0x26A0, 0xA301, 0x02D5, 0x8F06, 0xBC21, 0x2082, 0x401E, 0xA200, 0x02D5, 0xA31E, 0x02D5, - 0xFB30, 0x6D14, 0x4FF5, 0xE9FE, 0x40E0, 0x8EC0, 0x0848, 0xA301, 0x045C, 0x6C84, 0xBA10, - 0xE904, 0xB580, 0x0002, 0xA201, 0x0474, 0xB100, 0x00BE, 0xBC23, 0x2081, 0x66C2, 0x1FD5, - 0xBC22, 0x3104, 0x6E2D, 0x3B74, 0xB00A, 0xFFFD, 0xFA52, 0xBC23, 0x7FFF, 0x6626, 0xA444, - 0x40C1, 0xBC23, 0x02D6, 0xBC24, 0x045D, 0xBC02, 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, - 0x8E00, 0xE904, 0xFA10, 0x6E08, 0x1FC1, 0xDFF5, 0xBC02, 0x1E46, 0xA201, 0x0474, 0xBC22, - 0x3104, 0x6692, 0x0FC0, 0xBC23, 0x2083, 0x6C80, 0xBA52, 0xBC24, 0x7FFF, 0x6E05, 0x3B71, - 0x6628, 0x9FA1, 0xB000, 0xFFFD, 0x40E1, 0xBC23, 0x02D9, 0xBC24, 0x045E, 0xBC02, 0x1E36, - 0xCFF5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0x0000, 0xBC21, 0x00A9, 0x4402, 0xE083, 0xE0C4, - 0x24A3, 0xBC23, 0x213F, 0x8E00, 0x6960, 0x3A74, 0x8A0E, 0x6A38, 0xBA74, 0xB300, 0x0044, - 0x28E2, 0x8F0B, 0x2600, 0x8F04, 0x2444, 0x8EC0, 0xA30E, 0x00A9, 0xE4CF, 0x4000, 0x8EC0, - 0xA300, 0x00A9, 0xE4C0, 0x8880, 0x8EC0, 0x8E00, 0xA300, 0x045F, 0xE904, 0xBC21, 0x2022, - 0x6E05, 0x1FD5, 0xA21C, 0x047A, 0xB000, 0xFFFD, 0xFA35, 0x7000, 0x6445, 0xDFFC, 0xBC22, - 0x0780, 0xBC23, 0x02DD, 0xBC24, 0x02DF, 0xBC02, 0x1E36, 0xA201, 0x02DF, 0xA200, 0x02DC, - 0xCFE2, 0xA092, 0x8000, 0xB000, 0xFFFF, 0xA301, 0x047A, 0x2680, 0xA300, 0x02DC, 0x8F34, - 0xBC20, 0x304D, 0xBC3E, 0x0320, 0xBC3A, 0x7FFF, 0xFA10, 0xA202, 0x047C, 0xA31E, 0x02DC, - 0xA31A, 0x047A, 0x21C8, 0x8F14, 0xBC20, 0x304E, 0xBC23, 0x304F, 0xFA10, 0x6872, 0x3A70, - 0x8F03, 0x2048, 0x8F01, 0x26A0, 0x8F05, 0x21C8, 0x8F0A, 0x4000, 0xA300, 0x047C, 0x8D07, - 0x4040, 0x8C05, 0xA300, 0x047C, 0x4020, 0xA300, 0x047C, 0xA200, 0x047C, 0x2242, 0x4000, - 0x8F02, 0xA300, 0x047B, 0x8C07, 0xCFD5, 0x7008, 0x0FD5, 0x8C03, 0xA300, 0x047B, 0xCFD5, - 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xBC20, 0x2021, 0xA201, 0x047C, 0x6984, 0x3A12, 0x8F1B, - 0x2611, 0xB034, 0xFFE0, 0x8F10, 0x2692, 0x8F1B, 0xBC21, 0x3051, 0x8E00, 0xFA31, 0x20D1, - 0x8F00, 0xA026, 0x4000, 0x21D1, 0x8F11, 0xB024, 0x0020, 0xA0A4, 0x4000, 0x8D0E, 0xBC21, - 0x3052, 0x8E00, 0xFA31, 0x8C09, 0xA026, 0x4000, 0xBC21, 0x3050, 0xB024, 0x0020, 0xFA31, - 0xA0A4, 0x4000, 0x8EC0, 0xFB12, 0x8E00, 0x0000, 0xBC22, 0x3105, 0xE902, 0xA21C, 0x0326, - 0x77FE, 0xBA52, 0x6EF0, 0x9FDC, 0xA200, 0x0312, 0xBC3C, 0x02E0, 0xBC22, 0x30C2, 0xBC23, - 0x8EE4, 0xBC24, 0x771E, 0xBC25, 0x88E2, 0x403B, 0x706F, 0xE800, 0xBD05, 0x11DA, 0x6E30, - 0xBC19, 0x2442, 0x6960, 0x3AC7, 0x8A08, 0xBB3D, 0x8E19, 0x28CF, 0xA207, 0x0315, 0xBC21, - 0x12EB, 0xA206, 0x0316, 0x28F9, 0x28F3, 0xA307, 0x0316, 0x88F0, 0x2442, 0x28FC, 0x28F5, - 0xA307, 0x0315, 0x417A, 0x88E0, 0xA207, 0x0317, 0x699C, 0xEA18, 0x2442, 0x4001, 0x8F00, - 0xB01E, 0xFFFF, 0x6A3C, 0x4FC1, 0x88E4, 0xBC3D, 0x0318, 0x5FFA, 0x7007, 0x64E6, 0xA206, - 0x0317, 0x6998, 0xDFC1, 0x8F02, 0x35B1, 0x3BA6, 0x8E00, 0xA31D, 0x0317, 0xA300, 0x0312, - 0xCFC2, 0x8EC0, 0xE9FE, 0xA302, 0x0326, 0x0000, 0xA200, 0x0325, 0xA201, 0x0354, 0xBC3D, - 0x0327, 0x459F, 0x403B, 0xBC3C, 0x0318, 0x41BE, 0xBC22, 0x30CB, 0xBD05, 0x1200, 0x5FFA, - 0x3862, 0x6910, 0xBC1D, 0x6960, 0x3A64, 0x8A03, 0xBBB0, 0xC81D, 0x28EC, 0x88B0, 0x40DA, - 0xE4E3, 0xEA18, 0xA300, 0x0325, 0xA200, 0x0353, 0x3B9D, 0x459E, 0xBC22, 0x30CF, 0x5FFA, - 0xA301, 0x0354, 0x6910, 0xBA43, 0xE064, 0x8A27, 0xBB8C, 0x861C, 0x403A, 0x28E3, 0x88A0, - 0xEA18, 0x8EC0, 0xA300, 0x0353, 0xA302, 0x0355, 0xBC25, 0x0357, 0xBC22, 0x30F8, 0x6E09, - 0x7CA4, 0xB800, 0xA6B6, 0x24B4, 0xA206, 0x0356, 0x33B0, 0x4FE4, 0xBC27, 0x01FF, 0x35B1, - 0x1927, 0x09F4, 0xBC24, 0x0100, 0x4806, 0x1926, 0xA206, 0x0355, 0x2670, 0xA307, 0x0356, - 0x243E, 0x28FC, 0x2444, 0x4004, 0x7008, 0x64CE, 0x6673, 0x26CF, 0x2670, 0x8F2C, 0xBC27, - 0x30F7, 0xE2CF, 0xFAF7, 0x6CDC, 0x26C4, 0xA20E, 0x0357, 0xA304, 0x0357, 0x88D8, 0x8F1C, - 0x3230, 0x8F01, 0xB036, 0xFFFF, 0xFB53, 0xA202, 0x0359, 0x2620, 0x8F0D, 0x2622, 0x4043, - 0x8F05, 0xB20A, 0x099A, 0x189A, 0xB22A, 0x21EC, 0x8C08, 0x18A2, 0xB22A, 0x13D7, 0x8C04, - 0x188A, 0xB20A, 0x17AE, 0x188A, 0x8C07, 0xA302, 0x0359, 0xBC22, 0x30F7, 0xB03E, 0xFFFF, - 0xFB53, 0xA202, 0x0359, 0x144A, 0x2442, 0x28F1, 0x8894, 0x8EC0, 0x8E00, 0xE441, 0xBC22, - 0x2131, 0xBC23, 0x00B0, 0xBC24, 0x2135, 0x6915, 0x3B53, 0xFA93, 0xBC22, 0x2136, 0xE4C3, - 0xB800, 0xA210, 0xBC80, 0x4000, 0x6915, 0xE902, 0xBC21, 0x30F9, 0xA203, 0x035B, 0xBC22, - 0x035C, 0x6E73, 0xFA31, 0xBC24, 0x30FA, 0x28C1, 0xA300, 0x035B, 0xFA94, 0x6E08, 0xBC40, - 0x6A37, 0x2143, 0x2A83, 0x88C0, 0xDFCE, 0xDFEF, 0xBC20, 0x0A30, 0xBC88, 0x0000, 0xCFCE, - 0xA300, 0x035A, 0xCFEF, 0x2444, 0xA203, 0x035E, 0xB580, 0x0001, 0x6000, 0xE4CE, 0xB000, - 0x2000, 0xE54F, 0xA300, 0x035E, 0xBC21, 0x3244, 0xBC80, 0x4000, 0xBC21, 0x2111, 0x8EC0, - 0xE9FE, 0xFB30, 0xBC22, 0x3105, 0xBC24, 0x30FB, 0xE906, 0xA203, 0x035A, 0xBC25, 0xF000, - 0xFA52, 0xFA94, 0xA21E, 0x0314, 0xA21C, 0x015F, 0x66BA, 0xDF84, 0xDFA2, 0x7050, 0xDF63, - 0xDFDC, 0xDF5E, 0xBC22, 0x0CCD, 0xBC24, 0x2131, 0xBC25, 0x199A, 0xBC3B, 0x009C, 0xBC3D, - 0x02E0, 0xBD0A, 0x131D, 0xA206, 0x035F, 0x700E, 0x8F67, 0x63ED, 0xCFBE, 0xB47C, 0x000E, - 0xB11E, 0x0005, 0xA200, 0x0360, 0x0E08, 0x2810, 0xB5FE, 0x000E, 0x380E, 0x1BB7, 0xB000, - 0x0400, 0xBCF0, 0xC000, 0xA306, 0x035F, 0xBCED, 0x4000, 0x283A, 0xA307, 0x0360, 0x888C, - 0xBC27, 0x00B1, 0x6EE7, 0x7B97, 0x606C, 0x0F40, 0xBC27, 0x3244, 0xBCED, 0xC000, 0x7016, - 0xBC1F, 0x6EE6, 0xDF40, 0xBC20, 0x2135, 0xBC21, 0x2111, 0xFA10, 0xBC8E, 0x0000, 0xFB36, - 0xB560, 0x0001, 0xCF80, 0xBC8C, 0x0000, 0xBC3E, 0x00C2, 0x63E1, 0x8FC0, 0x3F3E, 0xFF18, - 0xDFC0, 0xCFC2, 0xA302, 0x015F, 0xCF43, 0x8EC0, 0xE9FA, 0xA303, 0x0314, 0xA203, 0x0366, - 0x6D06, 0x6044, 0xBC22, 0x0367, 0xA203, 0x0363, 0x08C3, 0xA206, 0x0355, 0x6E00, 0xBC45, - 0xBCC9, 0x8000, 0x698C, 0x2146, 0x24B5, 0xA205, 0x0364, 0x28E5, 0x2444, 0xA303, 0x0366, - 0x7000, 0x244E, 0x7008, 0xE54F, 0x1918, 0x2640, 0x8F4A, 0xE14F, 0xA20E, 0x0367, 0xE540, - 0xA300, 0x0367, 0xBC22, 0x3101, 0xE0C1, 0x2409, 0xFA52, 0x88C8, 0x218A, 0x240C, 0x3840, - 0x8F0B, 0xBC20, 0x2004, 0x8E00, 0xFA10, 0x2680, 0x3802, 0x8F04, 0xBC20, 0x3100, 0x5FE4, - 0xFA10, 0x2108, 0x181C, 0xA201, 0x0369, 0xA204, 0x0365, 0x3449, 0x084C, 0xBC24, 0x30FE, - 0x2610, 0xA301, 0x0369, 0xA201, 0x0362, 0xFA94, 0x195A, 0x0048, 0x3340, 0x8F12, 0x2650, - 0x8F14, 0xBC20, 0x3103, 0xA204, 0x0361, 0x69B0, 0x3A10, 0x8F02, 0x2188, 0x8C04, 0x185A, - 0x0410, 0x2088, 0x1853, 0xA301, 0x0361, 0x3822, 0x8D05, 0xBC20, 0x30FE, 0xB028, 0xFFFF, - 0xFB12, 0x8EC0, 0xA301, 0x0362, 0x8E00, 0x8EB8, 0xBC20, 0x303D, 0x4021, 0xFA10, 0xA202, - 0x0462, 0x1408, 0x3491, 0xB000, 0xFFFF, 0x0810, 0x2680, 0xA300, 0x0462, 0xA200, 0x0460, - 0x8F36, 0xBC23, 0x3041, 0xBC22, 0x3040, 0x6980, 0x3A73, 0xA204, 0x045B, 0xA21C, 0x045A, - 0xFA52, 0x8F06, 0x21A3, 0x8F02, 0x387C, 0x201A, 0x8F07, 0x4000, 0x8D06, 0x21A3, 0x8F03, - 0x387C, 0x219A, 0x8F00, 0x3801, 0xBC22, 0x3043, 0x8E00, 0xFA52, 0x2620, 0x8F17, 0xA202, - 0x0465, 0x26A0, 0x8F12, 0xBC22, 0x2004, 0x8E00, 0xFA52, 0x26A0, 0x8F0C, 0xBC22, 0x303F, - 0xA203, 0x045E, 0xFA52, 0x209A, 0x8F05, 0xBC22, 0x303E, 0xA203, 0x045D, 0xFA52, 0x211A, - 0x8F00, 0x4000, 0xBC22, 0x3044, 0xA300, 0x0460, 0xFA50, 0xA202, 0x0463, 0x2680, 0x8F03, - 0x4000, 0x8C42, 0xA300, 0x0461, 0xBC20, 0x2015, 0xBC23, 0x3048, 0xFA10, 0xFA73, 0x2003, - 0x4000, 0x3860, 0x8F1A, 0xBC20, 0x2080, 0xBC24, 0x3046, 0xFA10, 0xFA94, 0x2184, 0x3803, - 0x8F07, 0xBC20, 0x3047, 0xBC24, 0x2015, 0xFA10, 0xFA94, 0x2020, 0x3803, 0x8F08, 0xBC20, - 0x2083, 0xBC24, 0x3045, 0xFA10, 0xFA94, 0x2004, 0x3803, 0x8F00, 0x3801, 0x2680, 0x8F02, - 0xBC20, 0x304A, 0x8C05, 0xFA10, 0xBC20, 0x3049, 0x8E00, 0xFA10, 0xBC24, 0x304B, 0x0E10, - 0xFA92, 0x2102, 0x8F04, 0xBC22, 0x304C, 0x8E00, 0xFA52, 0x2002, 0x1890, 0x33A0, 0x180B, - 0xA300, 0x0461, 0xBC20, 0x3042, 0xA201, 0x0461, 0xA203, 0x0460, 0xB512, 0x0001, 0xFA10, - 0xA302, 0x0463, 0x0059, 0x2600, 0x8F0A, 0x2601, 0x8F07, 0x2602, 0x4042, 0x8F02, 0x2603, - 0x8C04, 0x1851, 0x8C02, 0x4001, 0x4021, 0xBC20, 0x200D, 0x8EC0, 0x8E00, 0xFB11, 0xBC20, - 0x0375, 0xBC21, 0x0372, 0xBC22, 0x036A, 0xBC3C, 0x0376, 0x700E, 0xA0C1, 0x70CF, 0xA040, - 0xBC23, 0x038F, 0xBC09, 0x1482, 0x2442, 0xE104, 0xBC26, 0x1180, 0x6A39, 0xA185, 0xBC21, - 0xF2C0, 0x6A3A, 0x61C7, 0x6A3F, 0xA5A5, 0xE584, 0xE184, 0xE185, 0xBC21, 0x1CF0, 0x6A3A, - 0x61C7, 0xBC21, 0x8620, 0x6A3E, 0x65A5, 0x88C0, 0x2442, 0x6A39, 0xA584, 0xBC21, 0x0840, - 0x6A3A, 0x6184, 0x6A3F, 0xA185, 0xBC21, 0x0A40, 0x6A3A, 0x61C7, 0xBC21, 0x8620, 0x6A3E, - 0x65A5, 0x88C0, 0x8E00, 0xE584, 0xE464, 0xBC23, 0x038F, 0xBC21, 0x0375, 0x8E00, 0xE4C0, - 0x8EB8, 0x0000, 0xA202, 0x0372, 0xA203, 0x0395, 0x009A, 0xB214, 0x0014, 0x8F16, 0xB024, - 0xFFEC, 0x5FC3, 0x04DA, 0x3B43, 0xA200, 0x0375, 0xBC3C, 0x0376, 0x433E, 0xBC23, 0x305B, - 0x77F6, 0xAA18, 0x6910, 0xBA64, 0xE065, 0x8A05, 0xBBB0, 0xC81D, 0x4023, 0x8880, 0xA303, - 0x0373, 0x8EC0, 0xA302, 0x0395, 0x8E00, 0xBC20, 0x03BA, 0xA203, 0x03B9, 0x6D20, 0xA00E, - 0xB206, 0x0080, 0xE04F, 0xE14C, 0x8F36, 0x88B0, 0x40A4, 0xB226, 0x01B0, 0x40C5, 0x1925, - 0x401C, 0xB226, 0x06C0, 0x7007, 0xA45C, 0x4083, 0x6607, 0x255E, 0xA205, 0x0396, 0xA202, - 0x03BE, 0xA31C, 0x03B9, 0xA31C, 0x03BA, 0x2268, 0x8F03, 0x8E00, 0x8C03, 0xB034, 0xFFFF, - 0x34D1, 0xA300, 0x0396, 0xA202, 0x03BD, 0xB236, 0x000A, 0x8F05, 0xB226, 0xFFF6, 0x3B83, - 0x8F04, 0x4002, 0x401C, 0x8D02, 0x4022, 0x401C, 0x26A1, 0x8F00, 0x40A0, 0xA31C, 0x03BE, - 0xA302, 0x03BD, 0x8C0D, 0xA300, 0x0397, 0x2421, 0xBC25, 0x1000, 0x28E5, 0x34D9, 0xA303, - 0x03B9, 0xA30E, 0x03BA, 0xE44F, 0xE54C, 0xA200, 0x0397, 0x3048, 0xBC20, 0x7E7E, 0x8EC0, - 0xBC82, 0x0000, 0x8E00, 0xBC22, 0x2131, 0xBC24, 0x00B2, 0x77F6, 0xBB54, 0xBC23, 0x2135, - 0xBC22, 0x2136, 0x7087, 0xBA73, 0x6910, 0xFA52, 0xBCB2, 0xC000, 0xBCA2, 0x8000, 0xA200, - 0x03A6, 0x3F1A, 0xBC22, 0x3060, 0xBC3C, 0x03A8, 0x6910, 0xBF10, 0xE902, 0xFA43, 0x6960, - 0x3E18, 0x8A06, 0xBF8C, 0x8618, 0xBF8C, 0xA410, 0x2A42, 0xBC23, 0x03C4, 0x88D0, 0x6D26, - 0xA19E, 0xBC27, 0x03C7, 0x6E62, 0xE15A, 0x6E7A, 0x5FC2, 0x6E72, 0x21DC, 0x88A0, 0x6D4E, - 0xA38E, 0xA206, 0x03A5, 0xA300, 0x03A6, 0x6998, 0x23CF, 0xE24C, 0xDFE5, 0x8F03, 0x8E00, - 0x8C16, 0xB06C, 0xFFFF, 0x88E0, 0x39FC, 0x39DE, 0x399A, 0x8880, 0xBC21, 0x2045, 0x2442, - 0x7007, 0xBB30, 0xBC20, 0x2046, 0xBC21, 0x305A, 0x7009, 0xBB16, 0x7007, 0x3A30, 0x3B4C, - 0x15B0, 0x240A, 0x4020, 0x28C8, 0xBC21, 0x03BF, 0xE7CF, 0xA30E, 0x03C7, 0xBCAA, 0x8000, - 0xA306, 0x03A5, 0x690B, 0x60C6, 0x6E20, 0x664C, 0x6E7F, 0x2482, 0x6E77, 0xA0C7, 0x6E66, - 0xA4C6, 0x6A3A, 0x0FC1, 0xBC20, 0x3068, 0x6915, 0x24CC, 0xA30E, 0x03C4, 0x6915, 0xE5CF, - 0x6915, 0xBA01, 0x6A34, 0x7A02, 0x6A3C, 0xBA02, 0xBC40, 0x1205, 0x6A3E, 0xBA02, 0x6A3A, - 0xBA16, 0xBC40, 0x1A03, 0x6A3A, 0x8FE0, 0x28DE, 0x88A0, 0xBC40, 0x1E05, 0xBC40, 0x1602, - 0xBC23, 0x28BE, 0xA204, 0x03C3, 0xBCA4, 0xC000, 0xB038, 0x4000, 0x009A, 0xA302, 0x03C3, - 0xBC23, 0x3244, 0xBCA4, 0xC000, 0xBC23, 0x2111, 0x8EC0, 0xE9FE, 0xFB72, 0xA200, 0x0398, - 0x2457, 0xBC22, 0x306D, 0x77FE, 0xA441, 0xBC3C, 0x0399, 0x7067, 0xBA43, 0x6E73, 0xE800, - 0x6915, 0x3C1C, 0x8A0A, 0xBB8C, 0x861C, 0xBB8C, 0xA413, 0x28DA, 0xA300, 0x0398, 0x8EC0, - 0x8880, 0x8E00, 0xE902, 0xA203, 0x0372, 0x6CAC, 0x1FD5, 0x8F06, 0xBC20, 0x036A, 0xBC21, - 0x213E, 0xBC0B, 0x15CB, 0xFA32, 0xE402, 0xBC02, 0x1445, 0xBC02, 0x148A, 0xA201, 0x0372, - 0x41E3, 0xA202, 0x0373, 0x0459, 0x2621, 0xA301, 0x0372, 0x8F07, 0x26A2, 0x8F1A, 0xA200, - 0x0374, 0xBC02, 0x1AEC, 0x4002, 0x8D16, 0x3820, 0xBC02, 0x14AE, 0x3820, 0xBC02, 0x1504, - 0xA201, 0x03B8, 0x2610, 0x8F04, 0xB002, 0xFFFF, 0x4002, 0x8C08, 0xA300, 0x03B8, 0x3820, - 0xBC02, 0x15A4, 0xA300, 0x0374, 0x4042, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0xA302, 0x0373, - 0x3E02, 0xBC20, 0x03E5, 0x3820, 0xE002, 0xE003, 0xE044, 0xE402, 0xE484, 0xE042, 0xE482, - 0x7008, 0xA443, 0xA200, 0x03E4, 0x0C10, 0xA300, 0x03E4, 0x3E01, 0x8EB8, 0xBC20, 0x30BF, - 0xA201, 0x0447, 0xFA10, 0x6852, 0x2902, 0xBC22, 0x30BB, 0xBC23, 0x30BD, 0x18D3, 0xA202, - 0x0449, 0xFA64, 0x3491, 0x6835, 0x3A73, 0x8F65, 0xA202, 0x0448, 0x2153, 0x8F07, 0x3449, - 0x3401, 0xA080, 0x4000, 0x4002, 0x8C5B, 0xA300, 0x0447, 0xBC20, 0x30C1, 0xA201, 0x03CF, - 0xBC22, 0x30BA, 0x6114, 0x5FF5, 0x701F, 0x3A10, 0x4023, 0x6220, 0xDFDC, 0xB412, 0x0001, - 0x2620, 0x8F04, 0x7000, 0x5FC1, 0xA301, 0x03CB, 0xA301, 0x03CC, 0xBC22, 0x30C0, 0xA201, - 0x03D6, 0x3449, 0xFA52, 0x20CA, 0xA301, 0x03D6, 0x8F19, 0x4041, 0x0801, 0x2600, 0x8F13, - 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0xFF7F, 0xFA12, 0x0851, - 0x7008, 0x3B11, 0xBC02, 0x05B3, 0x7010, 0x4FC0, 0x8C05, 0xA301, 0x009A, 0x8C02, 0x4060, - 0xCFC0, 0x3302, 0x8F18, 0x3541, 0xBC21, 0x1111, 0x2829, 0x3200, 0x380E, 0x8F0D, 0x70F0, - 0x4FF5, 0xBC22, 0x2042, 0xBC23, 0x2041, 0xBC24, 0xEEEF, 0xBC0D, 0x1681, 0xFB51, 0x6008, - 0x3B70, 0x8C06, 0x4002, 0x8C04, 0x7000, 0x8FF5, 0x7000, 0x8FF5, 0xA302, 0x0448, 0x8EC0, - 0xE9FE, 0xA302, 0x0449, 0xA200, 0x03CE, 0xB300, 0x6600, 0x4020, 0x3820, 0x8F00, 0xA200, - 0x044A, 0x2681, 0xA300, 0x044A, 0x8F27, 0xA200, 0x03D2, 0x2600, 0xBC22, 0x2044, 0x4000, - 0x1801, 0xFA53, 0x0118, 0xBC23, 0x2043, 0xFB54, 0xFA72, 0x0448, 0x0091, 0xA204, 0x03D5, - 0xFB72, 0xB5C8, 0x0001, 0x0061, 0xA202, 0x044C, 0x004A, 0xBC23, 0x2042, 0xA204, 0x0448, - 0xA300, 0x03D2, 0xBC22, 0x2041, 0xA205, 0x03CA, 0x0020, 0xFB71, 0xA300, 0x0448, 0xFB55, - 0xBC00, 0x1612, 0x8EB8, 0xA201, 0x03D5, 0x3312, 0xA201, 0x03CE, 0x8F0A, 0xB312, 0x3F00, - 0x8F07, 0xA202, 0x03D4, 0x224A, 0x8F04, 0x4001, 0x7008, 0x2441, 0xA300, 0x03D0, 0x8EB8, - 0x2680, 0xA200, 0x03CF, 0x8F0A, 0xFA11, 0xB312, 0x0198, 0x8F05, 0xA201, 0x03D3, 0x1641, - 0x40A2, 0x2E4A, 0x8F00, 0x3401, 0x3402, 0xBC21, 0x30BB, 0x2041, 0x8F04, 0x4000, 0xA300, - 0x03D0, 0xBC20, 0x30B3, 0xA201, 0x03D0, 0x2611, 0x4001, 0x8F00, 0xFA11, 0xA300, 0x03CF, - 0x8EC0, 0xB592, 0x0006, 0xA301, 0x03CE, 0x6EF5, 0x6080, 0xE906, 0x7007, 0x20C1, 0xA204, - 0x03CE, 0x6313, 0x1F83, 0x65B0, 0x5FA2, 0x65C0, 0x1FE3, 0x7000, 0x9FC0, 0x4020, 0x4207, - 0x5FE6, 0xBC23, 0xC6C0, 0xBC21, 0x6E40, 0x38A2, 0xBC0F, 0x1720, 0x2F68, 0x2F20, 0x8F00, - 0x0D6B, 0x2FB0, 0x8F00, 0x0D69, 0x1785, 0x3491, 0x4044, 0x6815, 0x0FE4, 0x4147, 0x8FEE, - 0x6E1D, 0x0FA2, 0xB036, 0xFFFB, 0x69A8, 0x5FE3, 0x8F08, 0xB42A, 0x0006, 0xBC23, 0x03FF, - 0x0893, 0xA31C, 0x03D5, 0xDF62, 0xA302, 0x03D2, 0x7000, 0x8F83, 0xBC21, 0x7F80, 0x3882, - 0xBD10, 0x174F, 0x2E90, 0x2F68, 0x2FB0, 0x8F0B, 0x26B1, 0x8F02, 0x09E9, 0x2670, 0x8F03, - 0xBC26, 0x6E40, 0x0D6E, 0x8C03, 0x1785, 0x3521, 0x3491, 0x8E00, 0xCFA0, 0x2601, 0xBC20, - 0x03FF, 0x8F27, 0xB41A, 0x0006, 0x0808, 0x2680, 0x8F01, 0x32C2, 0x8F00, 0x403C, 0x26B0, - 0xDF7C, 0x8F12, 0xBC22, 0x30B3, 0x6E20, 0x8FC3, 0xBC21, 0x30BB, 0xBD04, 0x1772, 0xFA86, - 0x6881, 0xBA86, 0x8F01, 0x2246, 0x8F03, 0x21E1, 0x1914, 0xA304, 0x03CF, 0x8E00, 0x8D0B, - 0xCFC0, 0x6330, 0x8FE0, 0xA305, 0x03D4, 0xA304, 0x03D5, 0xBC02, 0x16C7, 0x8D01, 0xCFC3, - 0x6EAF, 0x8F60, 0xA303, 0x03D3, 0x8EC0, 0xE9FA, 0xA305, 0x03D4, 0xB022, 0x3098, 0xA200, - 0x03D2, 0x6980, 0x3A45, 0x8F26, 0x4343, 0x0519, 0x4003, 0xBC0C, 0x1799, 0xFA46, 0x0DAE, - 0x2246, 0x8F01, 0x3882, 0x3803, 0x8E00, 0x2680, 0x8F18, 0x2610, 0x4046, 0x4022, 0x1996, - 0x4205, 0x3290, 0x0569, 0xA306, 0x03D5, 0x8F02, 0x3250, 0x8F00, 0x14D5, 0xBC21, 0x30A9, - 0x044C, 0x3210, 0x8F01, 0x1451, 0x00D9, 0xA201, 0x03D3, 0x0C4B, 0xA301, 0x03D3, 0x8EC0, - 0xA300, 0x03D2, 0x8E00, 0xE904, 0xA201, 0x03CC, 0xA200, 0x03CD, 0x7000, 0x9F81, 0xB000, - 0xFFFF, 0xA302, 0x03CE, 0x6984, 0x1FB5, 0x8F4C, 0x2680, 0x8F47, 0xA201, 0x03CF, 0x344A, - 0xBC20, 0x30BB, 0x21C8, 0xBC20, 0x30B3, 0x1841, 0x6E18, 0x9FC1, 0xBC21, 0x03D7, 0xBC02, - 0x1700, 0xA201, 0x03CF, 0x7000, 0x8FC0, 0xA204, 0x0444, 0x6882, 0x1FC1, 0x4023, 0x8F06, - 0xB018, 0xFFFF, 0x6CC7, 0x9FC0, 0x6626, 0x9FE1, 0x8C20, 0xDF82, 0x3422, 0x6CE1, 0x1FE0, - 0x181A, 0x2681, 0xA300, 0x03CB, 0x8F15, 0xBC20, 0x0444, 0x8A09, 0xE402, 0xFA31, 0xA21E, - 0x03D3, 0xB592, 0x0006, 0xA302, 0x03D0, 0xA303, 0x03D1, 0xA302, 0x03D5, 0xA302, 0x03D2, - 0xA301, 0x03CE, 0xA31E, 0x03CA, 0xBC02, 0x1690, 0xCFE2, 0xCFC1, 0xA302, 0x0444, 0xA301, - 0x03CF, 0x8C26, 0x71A0, 0x0F85, 0x8C23, 0xCF85, 0x2600, 0x4681, 0x1848, 0x7008, 0x1FC1, - 0x2C48, 0x401E, 0xBC21, 0x03D9, 0xBC20, 0x03D7, 0xA31E, 0x03CF, 0x1848, 0x3862, 0xBC02, - 0x1700, 0xA202, 0x03CF, 0x6988, 0x0FC0, 0x4025, 0x8F09, 0x0885, 0x2620, 0x4006, 0x8F00, - 0xBC02, 0x15FE, 0xA306, 0x0444, 0x8C02, 0x4680, 0xCF85, 0xCFB5, 0xA305, 0x03CC, 0x8EC0, - 0xE9FC, 0xA300, 0x03CD, 0xE902, 0xA203, 0x03CD, 0xB036, 0xFFFF, 0x698C, 0x1FC3, 0xDFF5, - 0xBC01, 0x190F, 0xA201, 0x03D1, 0x2690, 0xBC01, 0x1920, 0xB016, 0xFFE6, 0x4340, 0x2048, - 0xBC01, 0x190A, 0xB306, 0x0019, 0xBC01, 0x18F4, 0xA201, 0x03D2, 0xB306, 0x0018, 0x8F7E, - 0xB306, 0x0017, 0x8F4E, 0xCFC3, 0xB316, 0x0016, 0xBC01, 0x1920, 0xA203, 0x044B, 0x26B0, - 0xBC01, 0x1920, 0x4023, 0x2610, 0xA303, 0x044B, 0x4002, 0x8F0F, 0xBC21, 0x03D7, 0xBC02, - 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F07, 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, - 0x03CA, 0xA303, 0x0444, 0xA203, 0x0444, 0xB236, 0x0080, 0x8F19, 0xA203, 0x0446, 0xB236, - 0x0080, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8F09, 0xA200, 0x0445, 0xB200, 0x0080, 0x8F12, - 0x8A03, 0xE483, 0x3569, 0xBC02, 0x15FE, 0x8D0D, 0x8A03, 0xE483, 0xB05A, 0xFFFF, 0xBC02, - 0x15FE, 0x8D06, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8A03, 0xE483, 0xA200, 0x03D2, 0xDFC5, - 0xBC02, 0x16DA, 0xBC02, 0x1690, 0x8D73, 0x2610, 0xBC21, 0x03D7, 0x8F24, 0xBC40, 0x1880, - 0x4023, 0x2E03, 0xBC40, 0x1C80, 0x4002, 0x185A, 0xA200, 0x03D9, 0x2E03, 0x0001, 0xA300, - 0x03D9, 0xBC21, 0x03D9, 0x441A, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F0B, 0xA203, - 0x0445, 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31A, 0x044C, 0xA303, 0x0445, 0x8C04, - 0x4003, 0x8C02, 0x4003, 0x4003, 0x8C47, 0xA303, 0x044B, 0x2610, 0xBC21, 0x03D9, 0x4002, - 0x4023, 0x8F3D, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F37, 0xA203, 0x0446, 0x441E, - 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31E, 0x044C, 0xA303, 0x0446, 0x8D2C, 0xA203, - 0x03D4, 0x2630, 0xBC20, 0x03D2, 0x8F00, 0xBC02, 0x16C7, 0xA203, 0x03D2, 0x26B0, 0x8F1E, - 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, 0x03CA, 0xA303, 0x0444, 0x8D16, 0x4661, - 0x044B, 0xBC02, 0x1787, 0x8D11, 0xA200, 0x03D7, 0x4010, 0x4023, 0xA300, 0x03CA, 0xA310, - 0x03D1, 0xBC21, 0x03D7, 0x3843, 0xBC02, 0x1700, 0x4683, 0xA310, 0x044C, 0xDFC3, 0xCFF5, - 0xCFC3, 0x8EC0, 0xE9FE, 0xA303, 0x03CD, 0xE902, 0x8E00, 0xDFD5, 0x3E02, 0xA200, 0x03E3, - 0x7000, 0x5FE0, 0xA301, 0x03E3, 0x2600, 0x8F12, 0xA200, 0x03CB, 0x2680, 0x8F02, 0xA200, - 0x03CC, 0x2600, 0x8F02, 0xA200, 0x03CD, 0x2681, 0x8F06, 0xBC20, 0x03E5, 0xBC21, 0x03D7, - 0xBD04, 0x1945, 0xE002, 0xE482, 0x3E01, 0x8C0E, 0xCFE0, 0xA200, 0x03CB, 0x2601, 0x8F02, - 0xBC02, 0x17B9, 0x8C04, 0xCFE0, 0xBC02, 0x183D, 0xCFE0, 0xB000, 0xFFFF, 0x69A0, 0x1FE0, - 0x8FEF, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2048, 0x8E00, 0xFA10, 0x2600, - 0x8F06, 0xBC20, 0x2043, 0xBC22, 0x2044, 0x4001, 0x8EC0, 0xFB11, 0xFB51, 0x8EB8, 0xA201, - 0x03E1, 0xBC22, 0x3079, 0xFA20, 0xB030, 0xFFD8, 0xB302, 0x308C, 0xA303, 0x03EE, 0x8EC0, - 0x1851, 0xA301, 0x03E1, 0xA203, 0x03E3, 0x34D9, 0xA200, 0x03FD, 0x5FFA, 0xBC3C, 0x03FA, - 0x407E, 0xA303, 0x03E3, 0x7009, 0x2461, 0x6CE4, 0x3C1E, 0x4003, 0xA205, 0x03E4, 0x19E3, - 0x0C95, 0x2131, 0x6555, 0x2042, 0x1863, 0xA300, 0x03FD, 0x33A0, 0xB05A, 0x03E6, 0x1823, - 0x637E, 0x22C0, 0x2E04, 0xB5FE, 0x0005, 0x01C7, 0x6678, 0xE6A7, 0x684C, 0xA2C2, 0x18E3, - 0x0C0B, 0x2E94, 0x8EC0, 0x0097, 0xE6C2, 0xA200, 0x03DB, 0xBC3C, 0x03DC, 0x409E, 0x405A, - 0xBC22, 0x03EA, 0x77FE, 0xAA18, 0xE05F, 0xBC23, 0x308C, 0xE51F, 0xBD03, 0x19C3, 0x6910, - 0xBC1C, 0xFA65, 0x8A03, 0xBBB0, 0xCA1C, 0x28EC, 0x88C0, 0x8E00, 0xE504, 0x8EC0, 0xEA18, - 0xA300, 0x03DB, 0xBC26, 0x03E2, 0xA202, 0x03E9, 0xE343, 0x698C, 0x2902, 0xA203, 0x03E0, - 0xBC01, 0x1A6F, 0xA204, 0x03F6, 0x69B0, 0x5FD5, 0x3883, 0x8F02, 0x4004, 0xA304, 0x03F6, - 0x3342, 0x8F68, 0xBC26, 0x03F7, 0x602D, 0x215F, 0x26C0, 0xE55F, 0x8F61, 0x6E11, 0xBCC5, - 0x6CF4, 0x2341, 0x4004, 0x4026, 0x19B4, 0x3210, 0x8F00, 0x35B1, 0xBC40, 0x1102, 0x3220, - 0x8F00, 0x35B1, 0x2663, 0xA207, 0x03F1, 0x8F01, 0x26E0, 0x8F09, 0x2435, 0x2429, 0x2412, - 0x20B5, 0x8F00, 0x35F9, 0x2095, 0x8F00, 0xB07E, 0xFFFF, 0xA202, 0x03F2, 0x3551, 0xB20A, - 0x004C, 0x3844, 0x8F0B, 0xB23E, 0x0008, 0x38A7, 0x4024, 0x38E2, 0x8F05, 0x38E5, 0x3378, - 0x3882, 0x8F01, 0x5FE4, 0x38E2, 0x38A2, 0x00E3, 0xA305, 0x03F2, 0xA307, 0x03F1, 0xDFE3, - 0xBC02, 0x197C, 0xA203, 0x03F5, 0xA202, 0x03F3, 0x6056, 0x0FE4, 0x3491, 0xB438, 0x0001, - 0xA305, 0x03F5, 0xB204, 0x0208, 0x8F14, 0xA202, 0x03F5, 0xA205, 0x03F4, 0xB524, 0x0001, - 0x20AA, 0x401D, 0x8F06, 0xA202, 0x03E4, 0x4024, 0x0C94, 0x3883, 0xA302, 0x03E4, 0x4643, - 0xA31D, 0x03F5, 0xA31D, 0x03F4, 0x4002, 0xA303, 0x03EF, 0xA302, 0x03F3, 0xA202, 0x03EF, - 0x2222, 0x8F09, 0x3491, 0x2262, 0x8F11, 0xA202, 0x03E9, 0x8E00, 0xE142, 0xA302, 0x03F0, - 0x8D0C, 0xA201, 0x03F0, 0x7008, 0x9FE4, 0xBC02, 0x197C, 0xA202, 0x03F4, 0x6024, 0x0FE4, - 0xA302, 0x03F4, 0xB008, 0xFFFF, 0x69A0, 0x0FD5, 0x8F79, 0x700F, 0xDFD5, 0xBC02, 0x196D, - 0xA31F, 0x03F6, 0xCFD5, 0x8D73, 0x7766, 0xE145, 0xA202, 0x03F0, 0x3822, 0xBC3D, 0x03F1, - 0x453F, 0xA204, 0x0442, 0x69AC, 0x64E5, 0x6E28, 0x6A38, 0x8F02, 0xA207, 0x03EE, 0x26F0, - 0x8F15, 0xE142, 0xE2C5, 0x6175, 0x60C2, 0x615A, 0xA242, 0x243F, 0x242D, 0x017D, 0xB05A, - 0x0008, 0xB4DA, 0x0004, 0x356A, 0xB4DA, 0x0002, 0x016A, 0x206A, 0x5FE2, 0x1955, 0x8C02, - 0xE605, 0x5FE2, 0xB006, 0xFFFF, 0x2680, 0x8F3F, 0xA203, 0x0443, 0x34D9, 0xA303, 0x0443, - 0xB236, 0x00F0, 0x8F08, 0xDFC1, 0xDFF5, 0xBC24, 0x041A, 0xBC02, 0x196D, 0xCFF5, 0x8C31, - 0xCFC1, 0xBC24, 0x041A, 0x4003, 0x6E38, 0xE200, 0x4005, 0xA071, 0xC000, 0xBD27, 0x1ABA, - 0x6659, 0x6200, 0xA071, 0xC000, 0x1965, 0xA207, 0x03EE, 0xB0DA, 0x041A, 0x003D, 0xB450, - 0x0001, 0xA305, 0x03EF, 0x26D0, 0x4685, 0x4667, 0x405F, 0x19EF, 0xE71F, 0xA307, 0x03CD, - 0xBC25, 0x03F0, 0x8A06, 0xE703, 0x8A0A, 0xE683, 0x8A03, 0xE682, 0xBC3F, 0x03FA, 0xA303, - 0x03CC, 0xA31F, 0x03FD, 0xA303, 0x03CB, 0xA304, 0x0442, 0xA301, 0x03F0, 0xE9FE, 0xA300, - 0x03E0, 0xA202, 0x03E9, 0x8EC0, 0x3491, 0xA302, 0x03E9, 0x0000, 0xE902, 0xA201, 0x03DB, - 0xDFD5, 0x6960, 0x24C0, 0xBC02, 0x19AA, 0xBC20, 0x03EA, 0xA300, 0x03E9, 0xBD04, 0x1AFD, - 0xBC02, 0x19C8, 0x8E00, 0x8E00, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0xA200, - 0x0466, 0x6980, 0x1FC0, 0xBC01, 0x1BB4, 0xB310, 0x00FF, 0xBC01, 0x1BBA, 0xA201, 0x0468, - 0xA202, 0x0467, 0xB034, 0xFFFF, 0x3310, 0xBC20, 0x0450, 0xBC01, 0x1BAA, 0x3880, 0x4021, - 0xE20E, 0xE24F, 0xBC24, 0x3002, 0x88D8, 0xFA94, 0xBCDB, 0x0000, 0xBC24, 0x3009, 0x2435, - 0xFA94, 0x2134, 0x4004, 0x19CC, 0xA307, 0x0465, 0xBC27, 0x3013, 0xA305, 0x0464, 0xFAF7, - 0x21B7, 0x198C, 0x26E0, 0x8F04, 0xBC26, 0x2004, 0x8E00, 0xFAD6, 0x2660, 0x8F03, 0xA206, - 0x046A, 0x35B1, 0xA306, 0x046A, 0xBC27, 0x3011, 0xA206, 0x0469, 0x35B1, 0xFAF7, 0x2037, - 0xA306, 0x0469, 0x8F0F, 0xBC26, 0x3012, 0xA207, 0x046A, 0xFAD6, 0x21BE, 0x8F03, 0x8E00, - 0x8C04, 0xA304, 0x046B, 0xA301, 0x046B, 0xA304, 0x046A, 0xA304, 0x0469, 0xBC26, 0x300A, - 0x8E00, 0xFAD6, 0x212E, 0x0526, 0x19B5, 0x202C, 0xBC25, 0x2017, 0x1926, 0x6CA8, 0x3AB2, - 0xBC25, 0x3006, 0x8F02, 0xA303, 0x0467, 0xBC25, 0x3003, 0xBC23, 0x300C, 0x8E00, 0xFA73, - 0x2013, 0x8F13, 0xBC26, 0x300D, 0x34E9, 0xFAD6, 0x2016, 0x8F0C, 0xBC26, 0x300E, 0x8E00, - 0xFAD6, 0x2016, 0x8F05, 0xBC26, 0x300F, 0x8E00, 0xFAD6, 0x2016, 0x8C02, 0x18DD, 0x34EA, - 0x38A3, 0x2442, 0xFAB2, 0x28E2, 0x88A0, 0xBC23, 0x300B, 0xB524, 0x0006, 0xFA73, 0xB424, - 0x0006, 0x32B0, 0x8F01, 0x4003, 0x049A, 0xBC23, 0x2020, 0xB524, 0x0001, 0xFA73, 0x0859, - 0x2690, 0xBC23, 0x2003, 0x8F02, 0x4001, 0x8C0C, 0xFB71, 0x3451, 0x8C09, 0x7000, 0x7B71, - 0xB012, 0xFFFF, 0xA301, 0x0468, 0xA303, 0x0467, 0x4001, 0xE401, 0xE441, 0x8D06, 0xBC20, - 0x2003, 0x5FC1, 0xFA12, 0x0851, 0xFB11, 0xCFC0, 0x3401, 0xE9FE, 0xBC21, 0x00FF, 0x8EC0, - 0x0801, 0xA300, 0x0466, 0xE904, 0xBC21, 0x2016, 0x6E05, 0x1FD5, 0xB000, 0xFFFD, 0xBC22, - 0x3000, 0xFA31, 0x7000, 0x6441, 0xFA52, 0xBC23, 0x044D, 0xBC24, 0x044F, 0xBC02, 0x1E36, - 0xA200, 0x044F, 0x7003, 0x0FD5, 0xBC22, 0x4444, 0x6915, 0xE9FC, 0x2456, 0x28C2, 0xBC20, - 0x3001, 0x8890, 0xBC22, 0x0450, 0x6910, 0xBA10, 0x28C8, 0x6E00, 0xBC41, 0x88B4, 0x7101, - 0x2145, 0x24A9, 0x28DC, 0x2444, 0x8EC0, 0xE54F, 0xE44E, 0xBC21, 0x3033, 0xBC22, 0x201E, - 0xB580, 0x0001, 0xFA31, 0x4043, 0xFA54, 0x0923, 0xB012, 0xFFFF, 0x2220, 0x8F01, 0x3310, - 0x8FF7, 0x8EB8, 0xA200, 0x0470, 0x3280, 0xBC21, 0x0477, 0xBC22, 0x0474, 0x184A, 0xA202, - 0x046D, 0xBC40, 0x1083, 0x6CE8, 0xE084, 0x66B7, 0x20C1, 0x8F04, 0xB044, 0x3014, 0x8E00, - 0xFA94, 0x211C, 0x8F0B, 0x32A0, 0xB044, 0xFFFF, 0x8F07, 0xB058, 0x3017, 0x8E00, 0xFAB5, - 0x219D, 0x8F02, 0x3844, 0x8D01, 0x3491, 0xB034, 0x301A, 0xA302, 0x046D, 0xFA73, 0xBC22, - 0x3023, 0x1A59, 0x2419, 0xFA52, 0x211A, 0x8F05, 0x3300, 0x8F02, 0xBC20, 0x301F, 0x8C05, - 0xFA10, 0xBC20, 0x301E, 0x8E00, 0xFA10, 0x4202, 0x0490, 0xA203, 0x0473, 0x2442, 0x28DA, - 0x28C8, 0x8884, 0xBC21, 0x0200, 0xBC90, 0x4000, 0xBC22, 0x0800, 0xBC80, 0x8000, 0xBC22, - 0x3024, 0x2690, 0x4004, 0xA203, 0x0454, 0x1820, 0xFA52, 0x0E4B, 0x210A, 0xA300, 0x0473, - 0x8F04, 0xBC20, 0x3025, 0x8E00, 0xFA10, 0x2008, 0x1881, 0x8EC0, 0xA302, 0x0454, 0x8E00, - 0xBC20, 0x200F, 0xA201, 0x046E, 0xFA10, 0x2680, 0x8F00, 0x3449, 0x2682, 0x4000, 0x8F00, - 0xB012, 0xFFFF, 0x3210, 0x8F02, 0x3317, 0x40E0, 0x1801, 0x8EC0, 0xA300, 0x046E, 0x8E00, - 0xBC20, 0x3031, 0xBC21, 0x2000, 0xFA12, 0x0811, 0x2241, 0xA200, 0x046E, 0x8F03, 0x4E00, - 0x0810, 0xB400, 0x0004, 0xB010, 0x3026, 0xA203, 0x0454, 0xFA31, 0xBC24, 0x1000, 0x0994, - 0x1AD9, 0x2274, 0x34D9, 0x4025, 0x111D, 0x8F01, 0x41E3, 0x0913, 0x4002, 0x3240, 0x3862, - 0x8F02, 0x4103, 0x2123, 0x18DC, 0xB5C6, 0x0001, 0xBC26, 0x302E, 0x0E4C, 0x6980, 0x3AD6, - 0xBC24, 0x200B, 0xB5F0, 0x0004, 0xA303, 0x046F, 0x1895, 0x0E4E, 0xA300, 0x046E, 0x00FB, - 0x6988, 0x3B91, 0x8F01, 0x2681, 0x8F00, 0x4002, 0x2620, 0x8F01, 0x2682, 0x8F00, 0x4002, - 0x2620, 0x8F01, 0x2683, 0x8F00, 0x4002, 0x2620, 0x8F40, 0x2604, 0x8F3E, 0x2620, 0x8F01, - 0x2685, 0x8F00, 0x4002, 0x2620, 0x8F33, 0x2606, 0x8F31, 0x2620, 0x8F01, 0x2687, 0x8F33, - 0xBC20, 0x2005, 0xBC21, 0x0200, 0xFA10, 0x0801, 0x2680, 0x8F20, 0xA200, 0x0452, 0x2602, - 0x8F11, 0x2603, 0x8F03, 0x4060, 0x8C25, 0xA300, 0x0452, 0xBC20, 0x3036, 0xBC21, 0x2081, - 0xFA10, 0xFA31, 0x2088, 0x4040, 0x8F18, 0xA300, 0x0452, 0x8D17, 0xBC20, 0x3037, 0xBC21, - 0x2081, 0xFA10, 0xFA31, 0x2188, 0x4060, 0x8F0C, 0xA300, 0x0452, 0x8D0B, 0x4060, 0xA300, - 0x0452, 0x8D07, 0x4020, 0x8C05, 0xA300, 0x0452, 0x4000, 0xA300, 0x0452, 0xA200, 0x0452, - 0xB000, 0x3039, 0xBC21, 0x2006, 0xFA10, 0x8EC0, 0x0003, 0xFB30, 0xA200, 0x0474, 0xA201, - 0x0453, 0xB500, 0x0007, 0xBC22, 0x302F, 0x1AC8, 0x241B, 0xFA52, 0x211A, 0x8F02, 0xBC22, - 0x3021, 0x8C05, 0xFA52, 0xBC22, 0x3020, 0x8E00, 0xFA52, 0xA204, 0x046C, 0xBC23, 0x8000, - 0x04DA, 0x3340, 0x2457, 0x2456, 0x8F04, 0x2454, 0x28CB, 0x28C2, 0x8C03, 0x8880, 0xA30E, - 0x046C, 0xBC21, 0x3030, 0xBC22, 0x3032, 0xA300, 0x0453, 0xFA31, 0xFA52, 0xBC23, 0x1000, - 0x0913, 0x1A08, 0xBC25, 0x0400, 0x2263, 0xBC81, 0x4000, 0x8F01, 0xBC20, 0x0FFF, 0x0810, - 0xBC21, 0x200C, 0x8EC0, 0x8E00, 0xFB30, 0x0000, 0xBC20, 0x3022, 0xBC21, 0x3038, 0x7017, - 0xBA10, 0x700C, 0x3A31, 0xA310, 0x046C, 0xA31E, 0x0470, 0xA300, 0x0454, 0xA301, 0x0452, - 0x6EE5, 0x6800, 0xBD0F, 0x1D81, 0xBC20, 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, - 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3034, 0xBC21, - 0x2005, 0xFA10, 0xB000, 0x0201, 0x7000, 0x3B30, 0xBC02, 0x1BF3, 0x8E00, 0x8E00, 0xBC20, - 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, - 0x1C65, 0xBC02, 0x1C7B, 0xA201, 0x046E, 0xBC20, 0x3034, 0xB012, 0x3026, 0x6EAF, 0x3A10, - 0xBC22, 0x3035, 0xBC23, 0x2005, 0xFA31, 0xB000, 0x0201, 0xFA52, 0xA301, 0x0454, 0xFB70, - 0xBC24, 0x2009, 0x8EC0, 0x7008, 0x3B72, 0xFB90, 0xE902, 0xA200, 0x0470, 0x6CC0, 0x1FD5, - 0x8F34, 0xA200, 0x0472, 0xA201, 0x0471, 0x2680, 0x8F0F, 0xB312, 0x007F, 0xBC20, 0x3035, - 0x8F07, 0xFA10, 0xB000, 0x0101, 0xBC21, 0x2005, 0x8C03, 0x7008, 0x3B30, 0x4020, 0x8C1E, - 0xA300, 0x0472, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0x3300, 0xA300, 0x0471, 0x8F0A, - 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3035, 0xBC21, 0x2005, 0xFA10, 0x8C07, 0x7000, - 0x3B30, 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0x4000, 0xA300, 0x0472, 0xBC02, 0x1D12, 0x8D13, - 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0xA200, 0x0470, 0xB000, 0xFFFF, 0xA201, 0x0471, 0xA300, - 0x0470, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0xA300, 0x0471, 0x7008, 0x4FD5, 0xBC20, - 0x2009, 0x8EC0, 0xE9FE, 0xFB11, 0xBC21, 0x2010, 0xE908, 0xBC20, 0x200E, 0xFA31, 0xFA12, - 0xBC24, 0x7F00, 0x6E1D, 0x1F95, 0xB036, 0xFFF9, 0x0894, 0xB444, 0x0008, 0x6E10, 0xE581, - 0xFA10, 0x73F8, 0x65C4, 0x0801, 0xBC21, 0x0474, 0xBC40, 0x1500, 0xDFA1, 0xBD03, 0x1E2E, - 0xE0DC, 0xE101, 0xDFC2, 0xDFFC, 0xBC02, 0x1E46, 0xCFE1, 0x63A0, 0x4FA1, 0x6D34, 0x4FC2, - 0x6E20, 0x6480, 0xB406, 0x0001, 0xBC40, 0x1E00, 0xDFA1, 0x7000, 0x0F95, 0xBC21, 0x2009, - 0x8EC0, 0xE9F8, 0xFB30, 0xE040, 0x6C00, 0x6246, 0x6E08, 0xE185, 0x6681, 0xA1C6, 0x24B5, - 0x28C2, 0x2444, 0x8E00, 0xE5CF, 0x88B8, 0x8EC0, 0xE4CE, 0xE643, 0x3291, 0x8F0C, 0x24C1, - 0x1448, 0x41A2, 0x2442, 0x4403, 0x0410, 0x28CB, 0xB580, 0x0004, 0x8890, 0x8EC0, 0x0001, - 0x8E00, 0x8EC0, 0x4000, 0x8E00, 0xBC20, 0x2092, 0x4041, 0xFA10, 0xBC22, 0x2093, 0x0841, - 0x6984, 0xBA51, 0x8F0F, 0x4022, 0x0802, 0x2681, 0x8F17, 0xBC20, 0x2000, 0x21C8, 0xBC20, - 0x2095, 0x8F02, 0x8EC0, 0xE0C1, 0xFB11, 0xFA31, 0xFB11, 0x8EB8, 0xBC20, 0x2094, 0xBC22, - 0x2000, 0x6872, 0xBA10, 0x8F02, 0x8EC0, 0xE4C0, 0x8E00, 0x8EC0, 0xFB30, 0x8E00, 0x8EB8, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; -#endif - -const unsigned short bin_patch_E1[] = { - 0x2000, 0x21FF, 0xBC24, 0x20A0, 0x8E00, 0xFA95, 0xB30A, 0x06AF, 0x8F2E, 0xB30A, 0x08E5, - 0x8F07, 0xBC25, 0x08E5, 0xFB95, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x0841, 0xBC25, - 0x06AF, 0xFB95, 0x5400, 0xBC21, 0xD0B1, 0xBC02, 0x07CA, 0x5500, 0xBC21, 0x07C2, 0xBC02, - 0x07CA, 0x40A0, 0xBC21, 0x0359, 0xBC02, 0x07CA, 0x41A0, 0xBC21, 0x00A0, 0xBC02, 0x07CA, - 0x41C0, 0xBC21, 0x4208, 0xBC02, 0x07CA, 0x4380, 0xBC21, 0x2800, 0xBC02, 0x07CA, 0x4E04, - 0xBC00, 0x08E6, 0x4344, 0xBC25, 0x0400, 0x2620, 0x8F06, 0xBC02, 0x07F0, 0x5404, 0x4025, - 0xBC02, 0x07FB, 0xBC00, 0x06C1, 0xBC02, 0x07FB, 0x5404, 0x4025, 0xBC02, 0x07F0, 0xBC00, - 0x06C1, 0xBDC8, 0x404E, 0x8E00, 0xFA11, 0xBC00, 0x0630, 0x8E00, 0x8E00, 0x8E00, 0xBC21, - 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01BB, 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, - 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, 0x201A, 0xBC00, 0x0161, 0x4044, 0xBC25, 0x1000, - 0xBC02, 0x07F0, 0x4E24, 0xBC00, 0x0705, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x078A, - 0xBC24, 0x2080, 0x6C88, 0x3A10, 0xFA94, 0xB548, 0x0005, 0xBC00, 0x0E9F, 0xE902, 0xBC26, - 0x2023, 0xDFE4, 0xBC24, 0x2000, 0xFAD6, 0x0934, 0x26C0, 0x8F01, 0xBC26, 0x3056, 0x8D02, - 0xBC26, 0x31F9, 0xCFE4, 0xE9FE, 0xBC00, 0x0FED, 0xBC20, 0x2090, 0xBC21, 0x0100, 0xFA12, - 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, 0x8E00, 0xBC20, 0x2090, 0xBC21, - 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, 0xBC21, 0x2091, 0x714F, 0xBA10, - 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, 0x0457, 0x0802, 0xA204, 0x0458, - 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x0459, 0xFB32, 0x8F0C, 0x2601, 0x4FE1, - 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, 0x8F05, 0xBC02, 0x40E7, 0x8D04, - 0xBC21, 0x03FF, 0xA301, 0x0456, 0xA301, 0x0455, 0xA200, 0x0458, 0xA201, 0x0457, 0x260F, - 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, 0xA300, 0x0458, 0x8EC0, 0xE9FE, - 0xA301, 0x0457, 0xBC22, 0x3105, 0xA200, 0x0313, 0x77DE, 0xBA52, 0x3BC2, 0xBC22, 0x2091, - 0xBC3C, 0x02E0, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, 0xAA18, 0xBC24, 0x0B12, 0xFB54, - 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0355, 0xFB53, 0xA203, 0x035A, 0xFB53, - 0xA203, 0x0464, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, 0x047F, 0xFB54, 0xFB53, 0xA204, - 0x0480, 0xFB54, 0xA203, 0x0481, 0xFB53, 0xA204, 0x0361, 0xA203, 0x0362, 0xFB54, 0xFB53, - 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_patch_E2[] = { - 0x2000, 0x21FF, 0x8E00, 0x8E00, 0x8E00, 0xBC21, 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01A9, - 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, - 0x201A, 0xBC00, 0x014F, 0x240C, 0xA301, 0x047F, 0xA30F, 0x0480, 0xA30E, 0x0481, 0xBC00, - 0x1353, 0x5380, 0xBC21, 0xAC40, 0xBC02, 0x07EA, 0x4380, 0xBC21, 0x2C00, 0xBC02, 0x07EA, - 0x43A0, 0xBC21, 0xFB40, 0xBC02, 0x07EA, 0x43C0, 0xBC21, 0x0546, 0xBC02, 0x07EA, 0x43E0, - 0xBC21, 0xFB3C, 0xBC02, 0x07EA, 0x4400, 0xBC21, 0x0537, 0xBC02, 0x07EA, 0x4E04, 0xBC00, - 0x092A, 0x4025, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, 0x084A, 0x2610, 0x8F01, 0xBC02, - 0x081B, 0x8D02, 0xBC02, 0x0810, 0x4E24, 0xBC00, 0x0722, 0x4280, 0xBC02, 0x07EA, 0xBC22, - 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, 0x1853, 0x42C0, 0xBC02, 0x07EA, 0x4240, 0xBC21, - 0xE400, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x0010, 0xBC02, 0x07EA, 0x4040, 0xBC21, 0x0FFB, - 0xBC02, 0x07EA, 0x4220, 0xBC21, 0x2020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, - 0x07F8, 0x4220, 0xBC21, 0x1020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07F8, - 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07EA, 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07F8, 0x4240, - 0xBC21, 0xE407, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x7010, 0xBC02, 0x07EA, 0xBC20, 0x0064, - 0x4461, 0xBC02, 0x07F8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07EA, 0xBC00, 0x0794, 0xBC20, - 0x2090, 0xBC21, 0x0100, 0xFA12, 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, - 0x8E00, 0xBC20, 0x2090, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, - 0xBC21, 0x2091, 0x714F, 0xBA10, 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, - 0x045B, 0x0802, 0xA204, 0x045C, 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x045D, - 0xFB32, 0x8F0C, 0x2601, 0x4FE1, 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, - 0x8F05, 0xBC02, 0x40F6, 0x8D04, 0xBC21, 0x03FF, 0xA301, 0x045A, 0xA301, 0x0459, 0xA200, - 0x045C, 0xA201, 0x045B, 0x260F, 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, - 0xA300, 0x045C, 0x8EC0, 0xE9FE, 0xA301, 0x045B, 0xBC22, 0x3105, 0xA200, 0x0314, 0x77DE, - 0xBA52, 0x3BC2, 0xBC22, 0x2091, 0xBC3C, 0x02E1, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, - 0xAA18, 0xBC24, 0x0B12, 0xFB54, 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0356, - 0xFB53, 0xA203, 0x035D, 0xFB53, 0xA203, 0x0468, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, - 0x0483, 0xFB54, 0xFB53, 0xA204, 0x0484, 0xFB54, 0xA203, 0x0485, 0xFB53, 0xA204, 0x0364, - 0xA203, 0x0365, 0xFB54, 0xFB53, 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_coeff_E1[] = { - 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C, - 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0008, 0x0001, 0x0001, 0x0CCD, - 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E, - 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008, - 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008, - 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000, - 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF, - 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000, - 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47, - 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA, - 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92, - 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, - 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C, - 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C, - 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, - 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC, - 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350, - 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0, - 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715, - 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139, - 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC, - 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43, - 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5, - 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C, - 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B, - 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6, - 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2, - 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001, - 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100, - 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00, - 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200, - 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900, - 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680, - 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0, - 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026, - 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214, - 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848, - 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F, - 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A, - 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800, - 0x0400, 0x000C, 0x0005, 0x000C, 0x00FF, 0x083D, 0x4000, 0x062F, 0x404C, 0x01B9, 0x4052, - 0x0155, 0x405B, 0x0704, 0x4069, 0x0786, 0x4071, 0x0E9A, 0x4077, 0x0FEB, 0x4080, 0x0000, - 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E, - 0x4093, 0xFEE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -const unsigned short bin_coeff_E2[] = { - 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C, - 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0020, 0x0001, 0x0001, 0x0CCD, - 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E, - 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008, - 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008, - 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000, - 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF, - 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000, - 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47, - 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA, - 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92, - 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, - 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C, - 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C, - 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, - 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC, - 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350, - 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0, - 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715, - 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139, - 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC, - 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43, - 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5, - 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C, - 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B, - 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6, - 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2, - 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001, - 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100, - 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00, - 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200, - 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900, - 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680, - 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0, - 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026, - 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214, - 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848, - 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F, - 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A, - 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800, - 0x0400, 0x000C, 0x0005, 0x000C, 0x0038, 0x01A7, 0x4000, 0x0143, 0x4009, 0x0000, 0x0000, - 0x0929, 0x4020, 0x0721, 0x4041, 0x0755, 0x4052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E, - 0x0001, 0xFEE0, 0xFED8, 0xFED8, 0x0000, 0x0040, 0x40A2, 0x0000 -}; - -const unsigned short bin_hw_coeff[] = { - 0x0000, 0x0027, 0xfffd, 0xfffc, 0x0002, 0x000a, 0x0005, 0xfff4, 0xffed, 0x0004, 0x0024, - 0x0018, 0xffd8, 0xffb1, 0x0006, 0x00cd, 0x0179, 0x0001, 0xfffd, 0x0004, 0x0000, 0x000b, - 0xffe0, 0x0047, 0xff75, 0x0134, 0x04c4, 0xff9c, 0x000f, 0x0007, 0xfff7, 0x0006, 0x0001, - 0x0008, 0xffdf, 0x005d, 0xff18, 0x034a, 0xff81, 0x03d9, 0x00a6, 0xfffe, 0x0012, 0xffa6, - 0x0000 -}; diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h deleted file mode 100644 index 1792104ec..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h +++ /dev/null @@ -1,58 +0,0 @@ -/* mt6628_fm.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6628 FM Radio Driver -- head file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __MT6628_FM_H__ -#define __MT6628_FM_H__ - -#include "fm_typedef.h" - -/* #define FM_PowerOn_with_ShortAntenna */ -#define MT6628_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define MT6628_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define MT6628_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define MT6628_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define MT6628_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define MT6628_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define MT6628_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define MT6628_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define MT6628_DEEMPHASIS_50us TRUE - -#define MT6628_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */ -#define MT6628_MAX_COUNT 100 - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define MT6628_SCANTBL_SIZE 26 /* 16*uinit16_t */ -#else -#define MT6628_SCANTBL_SIZE 16 /* 16*uinit16_t */ -#endif - -#define AFC_ON 0x01 -#if AFC_ON -#define FM_MAIN_CTRL_INIT 0x480 -#else -#define FM_MAIN_CTRL_INIT 0x080 -#endif - -#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */ -#define MT6628_DEV "MT6628" - -#endif /* end of #ifndef __MT6628_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h deleted file mode 100644 index 93bbe4c8a..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __MT6628_FM_CMD_H__ -#define __MT6628_FM_CMD_H__ - -#include <linux/types.h> -#include "fm_typedef.h" - -/* FM basic-operation's opcode */ -#define FM_BOP_BASE (0x80) -enum { - FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00), - FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01), - FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02), - FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03), - FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04), - FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05) -}; - -/* FM BOP's size */ -#define FM_WRITE_BASIC_OP_SIZE (3) -#define FM_UDELAY_BASIC_OP_SIZE (4) -#define FM_RD_UNTIL_BASIC_OP_SIZE (5) -#define FM_MODIFY_BASIC_OP_SIZE (5) -#define FM_MSLEEP_BASIC_OP_SIZE (4) - -fm_s32 mt6628_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6628_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6628_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6628_pwrdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6628_rampdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6628_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para); -fm_s32 mt6628_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6628_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6628_cqi_get(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6628_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr); -fm_s32 mt6628_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value); -fm_s32 mt6628_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6628_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6628_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6628_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6628_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type); - -/* - * fm_get_channel_space - get the spcace of gived channel - * @freq - value in 760~1080 or 7600~10800 - * - * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0 - */ -extern fm_s32 fm_get_channel_space(int freq); - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h deleted file mode 100644 index d216bca7a..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * (C) Copyright 20011 - * MediaTek <www.MediaTek.com> - * Hongcheng Xia<Hongcheng.Xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __FM_CUST_CFG_H__ -#define __FM_CUST_CFG_H__ - -/* scan sort algorithm */ -enum { - FM_SCAN_SORT_NON = 0, - FM_SCAN_SORT_UP, - FM_SCAN_SORT_DOWN, - FM_SCAN_SORT_MAX -}; -/*typedef struct { - fm_s32 short_ana_rssi_th; - fm_s32 long_ana_rssi_th; - fm_s32 desene_rssi_th; - fm_s32 pamd_th; - fm_s32 mr_th; - fm_s32 atdc_th; - fm_u32 prx_th; - fm_u32 atdev_th; - fm_u16 smg_th; - fm_u16 deemphasis; - fm_u16 osc_freq; -}mt6628_fm_rx_cust_cfg; - -typedef struct{ - mt6628_fm_rx_cust_cfg rx_cfg; -}mt6628_fm_cust_cfg; -*/ -/* ***************************************************************************************** */ -/* ***********************************FM config for customer: start****************************** */ -/* ***************************************************************************************** */ -/* RX */ -#define FM_RX_RSSI_TH_LONG_MT6628 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */ -#define FM_RX_RSSI_TH_SHORT_MT6628 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */ -#define FM_RX_DESENSE_RSSI_MT6628 -258 -#define FM_RX_PAMD_TH_MT6628 -12 -#define FM_RX_MR_TH_MT6628 -67 -#define FM_RX_ATDC_TH_MT6628 3496 -#define FM_RX_PRX_TH_MT6628 64 -#define FM_RX_SMG_TH_MT6628 16421 /* FM soft-mute gain threshold */ -#define FM_RX_DEEMPHASIS_MT6628 0 /* 0-50us, China Mainland; 1-75us China Taiwan */ -#define FM_RX_OSC_FREQ_MT6628 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */ -/* #define FM_RX_SEEK_SPACE_MT6628 1 //FM radio seek space,1:100KHZ; 2:200KHZ */ -/* #define FM_RX_SCAN_CH_SIZE_MT6628 40 //FM radio scan max channel size */ -/* #define FM_RX_BAND_MT6628 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -/* #define FM_RX_SCAN_SORT_SELECT_MT6628 FM_SCAN_SORT_NON */ -/* #define FM_RX_FAKE_CH_NUM_MT6628 1 */ -/* #define FM_RX_FAKE_CH_RSSI_MT6628 40 */ -/* #define FM_RX_FAKE_CH_1_MT6628 1075 */ -/* #define FM_RX_FAKE_CH_2_MT6628 0 */ -/* #define FM_RX_FAKE_CH_3_MT6628 0 */ -/* #define FM_RX_FAKE_CH_4_MT6628 0 */ -/* #define FM_RX_FAKE_CH_5_MT6628 0 */ - -/* TX */ -/* #define FM_TX_PWR_LEVEL_MAX_MT6628 120 */ -/* #define FM_TX_SCAN_HOLE_LOW_MT6628 923 //92.3MHz~95.4MHz should not show to user */ -/* #define FM_TX_SCAN_HOLE_HIGH_MT6628 954 //92.3MHz~95.4MHz should not show to user */ - - -/* ***************************************************************************************** */ -/* ***********************************FM config for customer:end ******************************* */ -/* ***************************************************************************************** */ - -/* #define FM_SEEK_SPACE_MT6628 FM_RX_SEEK_SPACE_MT6628 */ -/* max scan chl num */ -/* #define FM_MAX_CHL_SIZ_MT6628E FM_RX_SCAN_CH_SIZE_MT6628 */ -/* auto HiLo */ -#define FM_AUTO_HILO_OFF_MT6628 0 -#define FM_AUTO_HILO_ON_MT6628 1 - - -/* seek threshold */ -#define FM_SEEKTH_LEVEL_DEFAULT_MT6628 4 - -#endif /* __FM_CUST_CFG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h deleted file mode 100644 index f5dee4d10..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __MT6628_FM_LIB_H__ -#define __MT6628_FM_LIB_H__ - -#include "fm_typedef.h" - -enum { - DSPPATCH = 0xFFF9, - USDELAY = 0xFFFA, - MSDELAY = 0xFFFB, - HW_VER = 0xFFFD, - POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */ - POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */ -}; - -enum { - FM_PUS_DSPPATCH = DSPPATCH, - FM_PUS_USDELAY = USDELAY, - FM_PUS_MSDELAY = MSDELAY, - FM_PUS_HW_VER = HW_VER, - FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */ - FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */ - FM_PUS_MAX -}; - -enum { - DSP_PATH = 0x02, - DSP_COEFF = 0x03, - DSP_HW_COEFF = 0x04 -}; - -enum IMG_TYPE { - IMG_WRONG = 0, - IMG_ROM, - IMG_PATCH, - IMG_COEFFICIENT, - IMG_HW_COEFFICIENT -}; - -enum { - mt6628_E1 = 0, - mt6628_E2 -}; - -struct mt6628_fm_cqi { - fm_u16 ch; - fm_u16 rssi; - fm_u16 reserve; -}; - -struct adapt_fm_cqi { - fm_s32 ch; - fm_s32 rssi; - fm_s32 reserve; -}; - -struct mt6628_full_cqi { - fm_u16 ch; - fm_u16 rssi; - fm_u16 pamd; - fm_u16 pr; - fm_u16 fpamd; - fm_u16 mr; - fm_u16 atdc; - fm_u16 prx; - fm_u16 atdev; - fm_u16 smg; /* soft-mute gain */ - fm_u16 drssi; /* delta rssi */ -}; - - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h deleted file mode 100644 index 51f47adc2..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h +++ /dev/null @@ -1,68 +0,0 @@ -/* mt6626_fm_ctrl_link.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6626 FM Radio Driver -- setup data link - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#if 0 -#ifndef __MT6628_FM_LINK_H__ -#define __MT6628_FM_LINK_H__ - -#include <linux/wait.h> -#include "fm_link.h" -#include "fm_utils.h" - -#define RX_BUF_SIZE 128 -#define TX_BUF_SIZE 1024 - -#define SW_RETRY_CNT (1) -#define SW_RETRY_CNT_MAX (5) -#define SW_WAIT_TIMEOUT_MAX (100) - -/* FM operation timeout define for error handle */ -#define TEST_TIMEOUT (3) -#define FSPI_EN_TIMEOUT (3) -#define FSPI_MUXSEL_TIMEOUT (3) -#define FSPI_RD_TIMEOUT (3) -#define FSPI_WR_TIMEOUT (3) -#define I2C_RD_TIMEOUT (3) -#define I2C_WR_TIMEOUT (3) -#define EN_TIMEOUT (3) -#define RST_TIMEOUT (3) -#define TUNE_TIMEOUT (3) -#define SM_TUNE_TIMEOUT (6) -#define SEEK_TIMEOUT (15) -#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */ -#define RDS_RX_EN_TIMEOUT (3) -#define RDS_DATA_TIMEOUT (100) -#define RAMPDOWN_TIMEOUT (3) -#define MCUCLK_TIMEOUT (3) -#define MODEMCLK_TIMEOUT (3) -#define RDS_TX_TIMEOUT (3) -#define PATCH_TIMEOUT (3) -#define COEFF_TIMEOUT (3) -#define HWCOEFF_TIMEOUT (3) -#define ROM_TIMEOUT (3) - -struct fm_link_event { - struct fm_flag_event *ln_event; - struct fm_res_ctx result; /* seek/scan/read/RDS */ -}; -#endif -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h deleted file mode 100644 index 2b16c67e8..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef __MT6628_FM_REG_H__ -#define __MT6628_FM_REG_H__ - -enum MT6628_REG { - FM_MAIN_CG1_CTRL = 0x60, - FM_MAIN_CG2_CTRL = 0x61, - FM_MAIN_HWVER = 0x62, - FM_MAIN_CTRL = 0x63, - FM_CHANNEL_SET = 0x65, - FM_MAIN_CFG1 = 0x66, - FM_MAIN_CFG2 = 0x67, - FM_MAIN_MCLKDESENSE = 0x38, - FM_MAIN_INTR = 0x69, - FM_MAIN_INTRMASK = 0x6A, - FM_MAIN_EXTINTRMASK = 0x6B, - FM_RSSI_IND = 0x6C, - FM_RSSI_TH = 0x6D, - FM_MAIN_RESET = 0x6E, - FM_MAIN_CHANDETSTAT = 0x6F, - FM_RDS_CFG0 = 0x80, - FM_RDS_INFO = 0x81, - FM_RDS_DATA_REG = 0x82, - FM_RDS_GOODBK_CNT = 0x83, - FM_RDS_BADBK_CNT = 0x84, - FM_RDS_PWDI = 0x85, - FM_RDS_PWDQ = 0x86, - FM_RDS_FIFO_STATUS0 = 0x87, - FM_FT_CON9 = 0x8F, - FM_DSP_PATCH_CTRL = 0x90, - FM_DSP_PATCH_OFFSET = 0x91, - FM_DSP_PATCH_DATA = 0x92, - FM_DSP_MEM_CTRL4 = 0x93, - FM_ADDR_PAMD = 0xB4, - FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6, - FM_RDS_POINTER = 0xF0, -}; - -/* RDS_BDGRP_ABD_CTRL_REG */ -enum { - BDGRP_ABD_EN = 0x0001, - BER_RUN = 0x2000 -}; -#define FM_DAC_CON1 0x83 -#define FM_DAC_CON2 0x84 -#define FM_FT_CON0 0x86 -enum { - FT_EN = 0x0001 -}; - -#define FM_I2S_CON0 0x90 -enum { - I2S_EN = 0x0001, - FORMAT = 0x0002, - WLEN = 0x0004, - I2S_SRC = 0x0008 -}; - -/* FM_MAIN_CTRL */ -enum { - TUNE = 0x0001, - SEEK = 0x0002, - SCAN = 0x0004, - CQI_READ = 0x0008, - RDS_MASK = 0x0010, - MUTE = 0x0020, - RDS_BRST = 0x0040, - RAMP_DOWN = 0x0100, -}; - -/* FM_MAIN_INTR */ -enum { - FM_INTR_STC_DONE = 0x0001, - FM_INTR_IQCAL_DONE = 0x0002, - FM_INTR_DESENSE_HIT = 0x0004, - FM_INTR_CHNL_CHG = 0x0008, - FM_INTR_SW_INTR = 0x0010, - FM_INTR_RDS = 0x0020 -}; - -enum { - ANTENNA_TYPE = 0x0010, /* 0x61 D4, 0:long, 1:short */ - ANALOG_I2S = 0x0080, /* 0x61 D7, 0:lineout, 1:I2S */ - DE_EMPHASIS = 0x1000, /* 0x61 D12,0:50us, 1:75 us */ -}; - -#define OSC_FREQ_BITS 0x0070 /* 0x60 bit4~6 */ -#define OSC_FREQ_MASK (~OSC_FREQ_BITS) - -#endif /* __MT6628_FM_REG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c deleted file mode 100644 index 38ffbcccc..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c +++ /dev/null @@ -1,939 +0,0 @@ -#include <linux/kernel.h> -#include <linux/types.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" -#include "fm_config.h" -#include "fm_link.h" - -#include "mt6628_fm_reg.h" -/* #include "mt6628_fm_link.h" */ -#include "mt6628_fm.h" -#include "mt6628_fm_cmd.h" -#include "mt6628_fm_cust_cfg.h" - -extern fm_cust_cfg mt6628_fm_config; - -static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_WRITE_BASIC_OP; - buf[1] = FM_WRITE_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((value) & 0x00FF); - buf[4] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - - return (FM_WRITE_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_UDELAY_BASIC_OP; - buf[1] = FM_UDELAY_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_UDELAY_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_RD_UNTIL_BASIC_OP; - buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask) & 0x00FF); - buf[4] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_RD_UNTIL_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MODIFY_BASIC_OP; - buf[1] = FM_MODIFY_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask_and) & 0x00FF); - buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask_or) & 0x00FF); - buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_MODIFY_BASIC_OP_SIZE + 2); -} - -#if 0 -static fm_s32 fm_bop_msleep(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MSLEEP_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MSLEEP_BASIC_OP; - buf[1] = FM_MSLEEP_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_MSLEEP_BASIC_OP_SIZE + 2); -} -#endif - -/* -inline fm_s32 fm_get_channel_space(fm_s32 freq) -{ - if ((freq >= 760) && (freq <= 1080)) { - return 0; - } else if ((freq >= 7600) && (freq <= 10800)) { - return 1; - } else { - return -1; - } -} -*/ - -fm_s32 mt6628_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Turn on Central Bias + FC */ - pkt_size += fm_bop_write(0x01, 0x4A00, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(30000, &buf[pkt_size], buf_size - pkt_size); /* delay 30ms */ - pkt_size += fm_bop_write(0x01, 0x6A00, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(50000, &buf[pkt_size], buf_size - pkt_size); /* delay 50ms */ - pkt_size += fm_bop_write(0x02, 0x099C, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x01, 0x6B82, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x04, 0x0142, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x05, 0x00E7, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x0A, 0x0060, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x0C, 0xAF8F, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x0D, 0x0888, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x10, 0x0E8D, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x27, 0x0104, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x0e, 0x0040, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x03, 0x9860, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x3F, 0xAD16, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x3E, 0x3280, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x06, 0x0125, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x08, 0x15B8, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x28, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x00, 0x0167, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x3A, 0x0004, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x25, 0x0403, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x20, 0x2720, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x22, 0x9980, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x25, 0x0803, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x1E, 0x0863, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(50000, &buf[pkt_size], buf_size - pkt_size); /* delay 50ms */ - pkt_size += fm_bop_write(0x1E, 0x0865, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(50000, &buf[pkt_size], buf_size - pkt_size); /* delay 50ms */ - pkt_size += fm_bop_write(0x1E, 0x0871, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x2A, 0x1020, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */ - pkt_size += fm_bop_write(0x00, 0x01E7, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1ms */ - pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x1B, 0x0095, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(200000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */ - pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x00, 0x0167, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x01, 0x6B8A, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1ms */ - pkt_size += fm_bop_write(0x00, 0xC167, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x0C, 0xAF8F, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(30000, &buf[pkt_size], buf_size - pkt_size); /* delay 1ms */ - pkt_size += fm_bop_write(0x00, 0xF167, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x37, 0x2590, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x09, 0x2964, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x2E, 0x0008, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x11, 0x37D4, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x2B, 0x0032, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x2C, 0x0019, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x71, 0x607F, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x72, 0x878F, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x73, 0x07C3, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x28, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x64, 0x0001, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x6D, 0x1AB2, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x9C, 0x0040, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xB4, 0x8810, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xB8, 0x006A, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xBB, 0x006B, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xCB, 0x00B3, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xE0, 0xA301, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xE4, 0x008F, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x9E, 0x2B24, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xCC, 0x0886, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xDC, 0x036A, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xDD, 0x836A, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x0F, 0x1AA8, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */ - pkt_size += fm_bop_write(0x63, 0x0480, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */ - pkt_size += fm_bop_write(0x63, 0x0481, &buf[pkt_size], buf_size - pkt_size); - - pkt_size += fm_bop_write(0x6C, 0x0020, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x45, 0x1FFF, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x25, 0x040F, &buf[pkt_size], buf_size - pkt_size); - - pkt_size += fm_bop_write(0x28, 0x7E57, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x11, 0x37DC, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x07, 0x1140, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x27, 0x005C, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x42, 0x0016, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x44, 0x006F, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x46, 0x1DEF, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x47, 0x0210, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x55, 0x0001, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x54, 0x8001, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0xA0, 0xD0B2, &buf[pkt_size], buf_size - pkt_size); - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6628_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - fm_u16 de_emphasis; - fm_u16 osc_freq; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - de_emphasis = mt6628_fm_config.rx_cfg.deemphasis; /* MT6628fm_cust_config_fetch(FM_CFG_RX_DEEMPHASIS); */ - de_emphasis &= 0x0001; /* rang 0~1 */ - osc_freq = mt6628_fm_config.rx_cfg.osc_freq; /* MT6628fm_cust_config_fetch(FM_CFG_RX_OSC_FREQ); */ - osc_freq &= 0x0007; /* rang 0~5 */ - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* FM Digital Clock enable */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - pkt_size += fm_bop_write(0x60, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0001 */ - pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */ - pkt_size += fm_bop_write(0x60, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0003 */ - pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0007 */ - pkt_size += fm_bop_modify(0x70, 0xFFBF, 0x0040, &buf[pkt_size], buf_size - pkt_size); /* wr 70 D6 = 1 */ - /* no low power mode, analog line in, long antenna */ - pkt_size += fm_bop_modify(0x61, 0xFF63, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += - fm_bop_modify(0x61, ~DE_EMPHASIS, (de_emphasis << 12), &buf[pkt_size], - buf_size - pkt_size); - pkt_size += - fm_bop_modify(0x60, OSC_FREQ_MASK, (osc_freq << 4), &buf[pkt_size], - buf_size - pkt_size); - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_patch_download - Wholechip FM Power Up: step 3, download patch to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6628_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_PATCH_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6628_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6628_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_COEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6628_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6628_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6628_rom_download - Wholechip FM Power Up: step 3,download rom to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6628_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ROM_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6628_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6628_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */ - pkt_size += fm_bop_write(0x6A, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 2100 */ - pkt_size += fm_bop_write(0x6B, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 2100 */ - pkt_size += fm_bop_modify(0x60, 0xFFF7, 0x0008, &buf[pkt_size], buf_size - pkt_size); /* wr 60 D3=1 */ - pkt_size += fm_bop_modify(0x61, 0xFFFD, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D1=1 */ - pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D0=0 */ - pkt_size += fm_bop_udelay(200000, &buf[pkt_size], buf_size - pkt_size); /* delay 200ms */ - pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_pwrdown - Wholechip FM Power down: Digital Modem Power Down - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6628_pwrdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Disable HW clock control */ - pkt_size += fm_bop_write(0x60, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 330F */ - /* Reset ASIP */ - pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */ - /* digital core + digital rgf reset */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - /* Disable all clock */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - /* Reset rgfrf */ - pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_rampdown - f/w will wait for STC_DONE interrupt - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6628_rampdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - /* Clear DSP state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */ - /* Set DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */ - /* @Wait for STC_DONE interrupt@ */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Clear DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_tune - execute tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6628_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para) -{ - /* #define FM_TUNE_USE_POLL */ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* Set desired channel & channel parameter */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_write(0x6A, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size); -#endif - pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* channel para setting, D15~D12, D15: ATJ, D13: HL, D12: FA */ - pkt_size += - fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size], - buf_size - pkt_size); - /* Enable hardware controlled tuning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - /* Wait for STC_DONE interrupt */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ -#endif - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_full_cqi_req - execute request cqi info action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 7600 ~ 10800, freq array - * @cnt - channel count - * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step - * - * return package size - */ -fm_s32 mt6628_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SOFT_MUTE_TUNE_OPCODE; - pkt_size = 4; - - switch (type) { - case 1: - buf[pkt_size] = 0x0001; - pkt_size++; - buf[pkt_size] = (fm_u8) ((*freq) & 0x00FF); - pkt_size++; - buf[pkt_size] = (fm_u8) ((*freq >> 8) & 0x00FF); - pkt_size++; - break; - case 2: - buf[pkt_size] = 0x0002; - pkt_size++; - break; - case 3: - buf[pkt_size] = 0x0003; - pkt_size++; - break; - case 4: - buf[pkt_size] = 0x0004; - pkt_size++; - break; - default: - buf[pkt_size] = (fm_u16) type; - pkt_size++; - break; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_seek - execute seek action, - * @buf - target buf - * @buf_size - buffer size - * @seekdir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6628_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (seekdir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* 0x66[9:0] freq upper bound */ - - max_freq = (max_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - - min_freq = (min_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6628_scan - execute scan action, - * @buf - target buf - * @buf_size - buffer size - * @scandir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6628_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (scandir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */ - /* 0x66[9:0] freq upper bound */ - - max_freq = (max_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - - min_freq = (min_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled scanning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -fm_s32 mt6628_cqi_get(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit0~2 0 */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, ~CQI_READ, CQI_READ, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit3 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -fm_s32 mt6628_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_READ_OPCODE; - buf[2] = 0x01; - buf[3] = 0x00; - buf[4] = addr; - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - return 5; -} - - -fm_s32 mt6628_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_WRITE_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = addr; - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c deleted file mode 100644 index 4aba259f9..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c +++ /dev/null @@ -1,298 +0,0 @@ -/* fm_config.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/string.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_config.h" -/* #include "fm_cust_cfg.h" */ -#include "mt6628_fm_cust_cfg.h" -fm_cust_cfg mt6628_fm_config; -/* static fm_s32 fm_index = 0; */ - -static fm_s32 MT6628fm_cust_config_print(fm_cust_cfg *cfg) -{ - WCN_DBG(FM_NTC | MAIN, "MT6628 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 mr_th:\t%d\n", cfg->rx_cfg.mr_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 prx_th:\t%d\n", cfg->rx_cfg.prx_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th); - WCN_DBG(FM_NTC | MAIN, "MT6628 smg_th:\t%d\n", cfg->rx_cfg.smg_th); - WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis); - WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq); - - WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path, - cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode, - cfg->aud_cfg.i2s_info.rate); - return 0; -} - -static fm_s32 MT6628cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg; - - if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6628", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */ - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6628", - &rx_cfg->short_ana_rssi_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6628", - &rx_cfg->desene_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6628", &rx_cfg->pamd_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6628", &rx_cfg->mr_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6628", &rx_cfg->atdc_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6628", &rx_cfg->prx_th))) { - return ret; - } - /*else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDEV_TH_MT6628", &rx_cfg->atdev_th))) - { - return ret; - } */ - else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6628", &rx_cfg->smg_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6628", &rx_cfg->deemphasis))) { - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6628", &rx_cfg->osc_freq))) { - return ret; - } else { - WCN_DBG(FM_WAR | MAIN, "MT6628 invalid key\n"); - return -1; - } -} - -static fm_s32 MT6628fm_cust_config_default(fm_cust_cfg *cfg) -{ - FMR_ASSERT(cfg); - - cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6628; - cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6628; - cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6628; - cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6628; - cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6628; - cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6628; - cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6628; - cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6628; - cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6628; - cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6628; - -#ifdef CONFIG_MTK_MERGE_INTERFACE_SUPPORT - cfg->aud_cfg.aud_path = FM_AUD_MRGIF; - cfg->aud_cfg.i2s_info.status = FM_I2S_OFF; - cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - cfg->aud_cfg.i2s_info.rate = FM_I2S_44K; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO; -#elif defined FM_DIGITAL_INPUT - cfg->aud_cfg.aud_path = FM_AUD_I2S; - cfg->aud_cfg.i2s_info.status = FM_I2S_OFF; - cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - cfg->aud_cfg.i2s_info.rate = FM_I2S_44K; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO; -#elif defined FM_ANALOG_INPUT - cfg->aud_cfg.aud_path = FM_AUD_ANALOG; - cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR; - cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR; -#else - cfg->aud_cfg.aud_path = FM_AUD_ERR; - cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR; - cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR; -#endif - return 0; -} - -static fm_s32 MT6628fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - fm_s8 *buf = NULL; - fm_s32 file_len = 0; - - if (!(buf = fm_zalloc(4096))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n"); - return -ENOMEM; - } -/* fm_index = 0; */ - - file_len = fm_file_read(filename, buf, 4096, 0); - - if (file_len <= 0) { - ret = -1; - goto out; - } - - ret = cfg_parser(buf, MT6628cfg_item_handler, cfg); - - out: - - if (buf) { - fm_free(buf); - } - - return ret; -} - -#define MT6628_FM_CUST_CFG_PATH "etc/fmr/fm_cust.cfg" -fm_s32 MT6628fm_cust_config_setup(const fm_s8 *filepath) -{ - fm_s32 ret = 0; - fm_s8 *filep = NULL; - fm_s8 file_path[51] = { 0 }; - - MT6628fm_cust_config_default(&mt6628_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6628 FM default config\n"); - MT6628fm_cust_config_print(&mt6628_fm_config); - - if (!filepath) { - filep = MT6628_FM_CUST_CFG_PATH; - } else { - memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath)); - filep = file_path; - trim_path(&filep); - } - - ret = MT6628fm_cust_config_file(filep, &mt6628_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6628 FM cust config\n"); - MT6628fm_cust_config_print(&mt6628_fm_config); - - return ret; -} - -fm_u16 MT6628fm_cust_config_fetch(enum fm_cust_cfg_op op_code) -{ -#if 0 - fm_u16 tmp = 0; - fm_s32 i; - static fm_s32 fake_ch_idx; - - switch (op_code) { - /* For FM RX */ - case FM_CFG_RX_RSSI_TH_LONG:{ - tmp = mt6628_fm_config.rx_cfg.long_ana_rssi_th; - break; - } - case FM_CFG_RX_RSSI_TH_SHORT:{ - tmp = mt6628_fm_config.rx_cfg.short_ana_rssi_th; - break; - } - case FM_CFG_RX_CQI_TH:{ - tmp = mt6628_fm_config.rx_cfg.cqi_th; - break; - } - case FM_CFG_RX_MR_TH:{ - tmp = mt6628_fm_config.rx_cfg.mr_th; - break; - } - case FM_CFG_RX_SMG_TH:{ - tmp = mt6628_fm_config.rx_cfg.smg_th; - break; - } - case FM_CFG_RX_SCAN_CH_SIZE:{ - tmp = mt6628_fm_config.rx_cfg.scan_ch_size; - break; - } - case FM_CFG_RX_SEEK_SPACE:{ - tmp = mt6628_fm_config.rx_cfg.seek_space; - break; - } - case FM_CFG_RX_BAND:{ - tmp = mt6628_fm_config.rx_cfg.band; - break; - } - case FM_CFG_RX_BAND_FREQ_L:{ - tmp = mt6628_fm_config.rx_cfg.band_freq_l; - break; - } - case FM_CFG_RX_BAND_FREQ_H:{ - tmp = mt6628_fm_config.rx_cfg.band_freq_h; - break; - } - case FM_CFG_RX_SCAN_SORT:{ - tmp = mt6628_fm_config.rx_cfg.scan_sort; - break; - } - case FM_CFG_RX_FAKE_CH_NUM:{ - tmp = mt6628_fm_config.rx_cfg.fake_ch_num; - break; - } - case FM_CFG_RX_FAKE_CH:{ - tmp = mt6628_fm_config.rx_cfg.fake_ch[fake_ch_idx]; - i = (mt6628_fm_config.rx_cfg.fake_ch_num > - 0) ? mt6628_fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX; - fake_ch_idx++; - fake_ch_idx = fake_ch_idx % i; - break; - } - case FM_CFG_RX_FAKE_CH_RSSI:{ - tmp = mt6628_fm_config.rx_cfg.fake_ch_rssi_th; - break; - } - case FM_CFG_RX_DEEMPHASIS:{ - tmp = mt6628_fm_config.rx_cfg.deemphasis; - break; - } - case FM_CFG_RX_OSC_FREQ:{ - tmp = mt6628_fm_config.rx_cfg.osc_freq; - break; - } - /* For FM TX */ - case FM_CFG_TX_SCAN_HOLE_LOW:{ - tmp = mt6628_fm_config.tx_cfg.scan_hole_low; - break; - } - case FM_CFG_TX_SCAN_HOLE_HIGH:{ - tmp = mt6628_fm_config.tx_cfg.scan_hole_high; - break; - } - case FM_CFG_TX_PWR_LEVEL:{ - tmp = mt6628_fm_config.tx_cfg.power_level; - break; - } - default: - break; - } - - WCN_DBG(FM_DBG | MAIN, "mt6628_cust cfg %d: 0x%04x\n", op_code, tmp); -#endif - return 0; -} diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c deleted file mode 100644 index 8c83d111b..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c +++ /dev/null @@ -1,1814 +0,0 @@ -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/vmalloc.h> - -#include "stp_exp.h" -#include "wmt_exp.h" - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_utils.h" -#include "fm_link.h" -#include "fm_config.h" -#include "fm_private.h" - -#include "mt6628_fm_reg.h" -#include "mt6628_fm.h" -/* #include "mt6628_drv_dsp.h" */ -/* #include "mt6628_fm_link.h" */ -#include "mt6628_fm_lib.h" -#include "mt6628_fm_cmd.h" -#include "mt6628_fm_cust_cfg.h" -extern fm_cust_cfg mt6628_fm_config; - -#define MT6628_FM_PATCH_PATH "/etc/firmware/mt6628/mt6628_fm_patch.bin" -#define MT6628_FM_COEFF_PATH "/etc/firmware/mt6628/mt6628_fm_coeff.bin" -#define MT6628_FM_HWCOEFF_PATH "/etc/firmware/mt6628/mt6628_fm_hwcoeff.bin" -#define MT6628_FM_ROM_PATH "/etc/firmware/mt6628/mt6628_fm_rom.bin" - -static struct fm_patch_tbl mt6628_patch_tbl[5] = { - {FM_ROM_V1, "/etc/firmware/mt6628/mt6628_fm_v1_patch.bin", - "/etc/firmware/mt6628/mt6628_fm_v1_coeff.bin", NULL, NULL}, - {FM_ROM_V2, "/etc/firmware/mt6628/mt6628_fm_v2_patch.bin", - "/etc/firmware/mt6628/mt6628_fm_v2_coeff.bin", NULL, NULL}, - {FM_ROM_V3, "/etc/firmware/mt6628/mt6628_fm_v3_patch.bin", - "/etc/firmware/mt6628/mt6628_fm_v3_coeff.bin", NULL, NULL}, - {FM_ROM_V4, "/etc/firmware/mt6628/mt6628_fm_v4_patch.bin", - "/etc/firmware/mt6628/mt6628_fm_v4_coeff.bin", NULL, NULL}, - {FM_ROM_V5, "/etc/firmware/mt6628/mt6628_fm_v5_patch.bin", - "/etc/firmware/mt6628/mt6628_fm_v5_coeff.bin", NULL, NULL}, -}; - -static struct fm_hw_info mt6628_hw_info = { - .chip_id = 0x00006628, - .eco_ver = 0x00000000, - .rom_ver = 0x00000000, - .patch_ver = 0x00000000, - .reserve = 0x00000000, -}; - -#define PATCH_SEG_LEN 512 - -static fm_u8 *cmd_buf; -static struct fm_lock *cmd_buf_lock; -static struct fm_callback *fm_cb_op; -static struct fm_res_ctx *res; -/* static fm_s32 Chip_Version = mt6628_E1; */ - -/* static fm_bool rssi_th_set = fm_false; */ - -#ifdef MT6628_FM_FPGA -#undef MT6628_FM_USE_6626EVB -#endif - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -static struct fm_fifo *cqi_fifo; -#endif -static fm_s32 mt6628_is_dese_chan(fm_u16 freq); -static fm_s32 mt6628_mcu_dese(fm_u16 freq, void *arg); -static fm_s32 mt6628_gps_dese(fm_u16 freq, void *arg); -static fm_u16 mt6628_chan_para_get(fm_u16 freq); -static fm_s32 mt6628_desense_check(fm_u16 freq, fm_s32 rssi); -static fm_s32 mt6628_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample); -static fm_s32 mt6628_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid); -static fm_s32 mt6628_pwron(fm_s32 data) -{ - /*//Turn on FM on 6628 chip by WMT driver - if(MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_LPBK)){ - WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK Fail!\n"); - return -FM_ELINK; - }else{ - WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK OK!\n"); - //return 0; - } */ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) { - WCN_DBG(FM_ALT | CHIP, "WMT turn on FM Fail!\n"); - return -FM_ELINK; - } else { - WCN_DBG(FM_ALT | CHIP, "WMT turn on FM OK!\n"); - return 0; - } -} - - -static fm_s32 mt6628_pwroff(fm_s32 data) -{ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) { - WCN_DBG(FM_ALT | CHIP, "WMT turn off FM Fail!\n"); - return -FM_ELINK; - } else { - WCN_DBG(FM_NTC | CHIP, "WMT turn off FM OK!\n"); - return 0; - } -} - -static fm_s32 Delayms(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data); - msleep(data); - return 0; -} - -static fm_s32 Delayus(fm_u32 data) -{ - WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data); - udelay(data); - return 0; -} - -fm_s32 mt6628_get_read_result(struct fm_res_ctx *result) -{ - FMR_ASSERT(result); - res = result; - - return 0; -} - -static fm_s32 mt6628_read(fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6628_get_read_result); - - if (!ret && res) { - *val = res->fspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6628_write(fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6628_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 ret = 0; - fm_u16 val; - - ret = mt6628_read(addr, &val); - - if (ret) - return ret; - - val = ((val & (mask)) | bits); - ret = mt6628_write(addr, val); - - return ret; -} - -static fm_u16 mt6628_get_chipid(void) -{ - return 0x6628; -} - -/* MT6628_SetAntennaType - set Antenna type - * @type - 1,Short Antenna; 0, Long Antenna - */ -static fm_s32 mt6628_SetAntennaType(fm_s32 type) -{ - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long"); - mt6628_read(FM_MAIN_CG2_CTRL, &dataRead); - - if (type) { - dataRead |= ANTENNA_TYPE; - } else { - dataRead &= (~ANTENNA_TYPE); - } - - mt6628_write(FM_MAIN_CG2_CTRL, dataRead); - - return 0; -} - -static fm_s32 mt6628_GetAntennaType(void) -{ - fm_u16 dataRead; - - mt6628_read(FM_MAIN_CG2_CTRL, &dataRead); - WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long"); - - if (dataRead & ANTENNA_TYPE) - return FM_ANA_SHORT; /* short antenna */ - else - return FM_ANA_LONG; /* long antenna */ -} - - -static fm_s32 mt6628_Mute(fm_bool mute) -{ - fm_s32 ret = 0; - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute"); - mt6628_read(FM_MAIN_CTRL, &dataRead); - - if (mute == 1) { - ret = mt6628_write(FM_MAIN_CTRL, (dataRead & 0xFFDF) | 0x0020); - } else { - ret = mt6628_write(FM_MAIN_CTRL, (dataRead & 0xFFDF)); - } - - return ret; -} - - -/*static fm_s32 mt6628_set_RSSITh(fm_u16 TH_long, fm_u16 TH_short) -{ - mt6628_write(0xE2, 0x3072); - mt6628_write(0xE3, TH_long); - mt6628_write(0xE1, 0x0002); - Delayms(1); - mt6628_write(0xE2, 0x307A); - mt6628_write(0xE3, TH_short); - mt6628_write(0xE1, 0x0002); - - WCN_DBG(FM_DBG | CHIP, "RSSI TH, long:0x%04x, short:0x%04x", TH_long, TH_short); - return 0; -} -*/ -/* -static fm_s32 mt6628_set_SMGTh(fm_s32 ver, fm_u16 TH_smg) -{ - if (mt6628_E1 == ver) { - mt6628_write(0xE2, 0x321E); - mt6628_write(0xE3, TH_smg); - mt6628_write(0xE1, 0x0002); - } else { - mt6628_write(0xE2, 0x3218); - mt6628_write(0xE3, TH_smg); - mt6628_write(0xE1, 0x0002); - } - - WCN_DBG(FM_DBG | CHIP, "Soft-mute gain TH %d\n", (int)TH_smg); - return 0; -} -*/ -static fm_s32 mt6628_RampDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 tmp; - - WCN_DBG(FM_DBG | CHIP, "ramp down\n"); - - mt6628_read(FM_MAIN_INTRMASK, &tmp); - mt6628_write(FM_MAIN_INTRMASK, 0x0000); - mt6628_write(0x6B, 0x0000); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_rampdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ERR | CHIP, "ramp down failed\n"); - } -#ifdef MT6628_FM_FPGA - Delayms(10); - mt6628_write(0x54, 0x0001); - mt6628_write(0x11, 0x37D4); - mt6628_write(0x54, 0x8000); -#endif - mt6628_write(0x6B, 0x2100); - mt6628_write(FM_MAIN_INTRMASK, tmp); - return ret; -} - -static fm_s32 mt6628_get_rom_version(void) -{ - fm_u16 tmp; - - /* DSP rom code version request enable --- set 0x61 b15=1 */ - mt6628_set_bits(0x61, 0x8000, 0x7FFF); - - /* Release ASIP reset --- set 0x61 b1=1 */ - mt6628_set_bits(0x61, 0x0002, 0xFFFD); - - /* Enable ASIP power --- set 0x61 b0=0 */ - mt6628_set_bits(0x61, 0x0000, 0xFFFE); - - /* Wait DSP code version ready --- wait 1ms */ - Delayus(1000); - - /* Get FM DSP code version --- rd 0x83[15:8] */ - mt6628_read(0x83, &tmp); - tmp = (tmp >> 8); - - /* DSP rom code version request disable --- set 0x61 b15=0 */ - mt6628_set_bits(0x61, 0x0000, 0x7FFF); - - /* Reset ASIP --- set 0x61[1:0] = 1 */ - mt6628_set_bits(0x61, 0x0001, 0xFFFC); - - WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", (fm_s32) tmp); - return (fm_s32) tmp; -} - -static fm_s32 mt6628_get_patch_path(fm_s32 ver, const fm_s8 **ppath) -{ - fm_s32 i; - fm_s32 max = sizeof(mt6628_patch_tbl) / sizeof(mt6628_patch_tbl[0]); - - /* check if the ROM version is defined or not */ - for (i = 0; i < max; i++) { - if ((mt6628_patch_tbl[i].idx == ver) - && (fm_file_exist(mt6628_patch_tbl[i].patch) == 0)) { - *ppath = mt6628_patch_tbl[i].patch; - WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n"); - return 0; - } - } - - - /* the ROM version isn't defined, find a latest patch instead */ - for (i = max; i > 0; i--) { - if (fm_file_exist(mt6628_patch_tbl[i - 1].patch) == 0) { - *ppath = mt6628_patch_tbl[i - 1].patch; - WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n"); - return 1; - } - } - - /* get path failed */ - WCN_DBG(FM_ERR | CHIP, "No valid patch file\n"); - return -FM_EPATCH; -} - - -static fm_s32 mt6628_get_coeff_path(fm_s32 ver, const fm_s8 **ppath) -{ - fm_s32 i; - fm_s32 max = sizeof(mt6628_patch_tbl) / sizeof(mt6628_patch_tbl[0]); - - /* check if the ROM version is defined or not */ - for (i = 0; i < max; i++) { - if ((mt6628_patch_tbl[i].idx == ver) - && (fm_file_exist(mt6628_patch_tbl[i].coeff) == 0)) { - *ppath = mt6628_patch_tbl[i].coeff; - WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n"); - return 0; - } - } - - - /* the ROM version isn't defined, find a latest patch instead */ - for (i = max; i > 0; i--) { - if (fm_file_exist(mt6628_patch_tbl[i - 1].coeff) == 0) { - *ppath = mt6628_patch_tbl[i - 1].coeff; - WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n"); - return 1; - } - } - - /* get path failed */ - WCN_DBG(FM_ERR | CHIP, "No valid coeff file\n"); - return -FM_EPATCH; -} - - -/* -* mt6628_DspPatch - DSP download procedure -* @img - source dsp bin code -* @len - patch length in byte -* @type - rom/patch/coefficient/hw_coefficient -*/ -static fm_s32 mt6628_DspPatch(const fm_u8 *img, fm_s32 len, enum IMG_TYPE type) -{ - fm_u8 seg_num; - fm_u8 seg_id = 0; - fm_s32 seg_len; - fm_s32 ret = 0; - fm_u16 pkt_size; - - FMR_ASSERT(img); - - if (len <= 0) { - return -1; - } - - seg_num = len / PATCH_SEG_LEN + 1; - WCN_DBG(FM_NTC | CHIP, "binary len:%d, seg num:%d\n", len, seg_num); - - switch (type) { - case IMG_ROM: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "rom,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6628_rom_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_ROM, SW_RETRY_CNT, ROM_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_rom_download failed\n"); - return ret; - } - } - - break; - case IMG_PATCH: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "patch,[seg_id:%d], [seg_len:%d]\n", seg_id, - seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6628_patch_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_PATCH, SW_RETRY_CNT, PATCH_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_patch_download failed\n"); - return ret; - } - } - - break; - case IMG_HW_COEFFICIENT: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "hwcoeff,[seg_id:%d], [seg_len:%d]\n", seg_id, - seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6628_hwcoeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_HWCOEFF, SW_RETRY_CNT, - HWCOEFF_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_hwcoeff_download failed\n"); - return ret; - } - } - - break; - case IMG_COEFFICIENT: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - WCN_DBG(FM_NTC | CHIP, "coeff,[seg_id:%d], [seg_len:%d]\n", seg_id, - seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6628_coeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_COEFF, SW_RETRY_CNT, COEFF_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_coeff_download failed\n"); - return ret; - } - } - - break; - default: - break; - } - - return 0; -} - - -static fm_s32 mt6628_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) -{ -#define PATCH_BUF_SIZE 4096*6 - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 tmp_reg = 0; - - const fm_s8 *path_patch = NULL; - const fm_s8 *path_coeff = NULL; - /* const fm_s8 *path_hwcoeff = NULL; */ - /* fm_s32 coeff_len = 0; */ - fm_s32 patch_len = 0; - fm_u8 *dsp_buf = NULL; - - FMR_ASSERT(chip_id); - FMR_ASSERT(device_id); - - WCN_DBG(FM_DBG | CHIP, "pwr on seq......\n"); - - /* Wholechip FM Power Up: step 1, FM Digital Clock enable */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_pwrup_clock_on(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_pwrup_clock_on failed\n"); - return ret; - } - - if ((mt6628_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF) - || (mt6628_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) { - mt6628_I2s_Setting(FM_I2S_ON, mt6628_fm_config.aud_cfg.i2s_info.mode, - mt6628_fm_config.aud_cfg.i2s_info.rate); - /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */ - mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) CMB_STUB_AIF_2); - } - /* Wholechip FM Power Up: step 2, read HW version */ - mt6628_read(0x62, &tmp_reg); - mt6628_read(0x62, &tmp_reg); - *chip_id = tmp_reg; - *device_id = tmp_reg; - mt6628_hw_info.chip_id = (fm_s32) tmp_reg; - WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg); - - if (mt6628_hw_info.chip_id != 0x6628) { - WCN_DBG(FM_NTC | CHIP, "fm sys error, reset hw\n"); - return (-FM_EFW); - } - - mt6628_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get(); - WCN_DBG(FM_NTC | CHIP, "ECO version:0x%08x\n", mt6628_hw_info.eco_ver); - mt6628_hw_info.eco_ver += 1; - - /* get mt6628 DSP rom version */ - if ((ret = mt6628_get_rom_version()) >= 0) { - mt6628_hw_info.rom_ver = ret; - WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", mt6628_hw_info.rom_ver); - } else { - WCN_DBG(FM_ERR | CHIP, "get ROM version failed\n"); - } - - - /* Wholechip FM Power Up: step 3, download patch */ - if (!(dsp_buf = fm_vmalloc(PATCH_BUF_SIZE))) { - WCN_DBG(FM_ALT | CHIP, "-ENOMEM\n"); - return -ENOMEM; - } - - ret = mt6628_get_patch_path(mt6628_hw_info.rom_ver, &path_patch); - patch_len = fm_file_read(path_patch, dsp_buf, PATCH_BUF_SIZE, 0); - mt6628_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_PATCH); - - ret = mt6628_get_coeff_path(mt6628_hw_info.rom_ver, &path_coeff); - patch_len = fm_file_read(path_coeff, dsp_buf, PATCH_BUF_SIZE, 0); - - mt6628_hw_info.rom_ver += 1; - - tmp_reg = dsp_buf[38] | (dsp_buf[39] << 8); - mt6628_hw_info.patch_ver = (fm_s32) tmp_reg; - WCN_DBG(FM_NTC | CHIP, "Patch version: 0x%08x\n", mt6628_hw_info.patch_ver); - - if (ret == 1) { - dsp_buf[4] = 0x00; /* if we found rom version undefined, we should disable patch */ - dsp_buf[5] = 0x00; - } - - mt6628_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_COEFFICIENT); - mt6628_write(0x90, 0x0040); - mt6628_write(0x90, 0x0000); - - if (dsp_buf) { - fm_vfree(dsp_buf); - dsp_buf = NULL; - } - /* mt6628_check_dsp(); */ - - /* Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_pwrup_digital_init(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_pwrup_digital_init failed\n"); - return ret; - } - - WCN_DBG(FM_NTC | CHIP, "pwr on seq ok\n"); - - /* mt6628_check_dsp(); */ - -/* rssi_th_set = fm_false; */ - return ret; -} - -static fm_s32 mt6628_PowerDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 dataRead; - - WCN_DBG(FM_DBG | CHIP, "pwr down seq\n"); - /*SW work around for MCUFA issue. - *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well. - * In case read interrupt, and clean if interrupt found before rampdown. - */ - mt6628_read(FM_MAIN_INTR, &dataRead); - - if (dataRead & 0x1) { - mt6628_write(FM_MAIN_INTR, dataRead); /* clear status flag */ - } - /* mt6628_RampDown(); //remove because of wholechip reset fail issue */ - -#ifdef FM_DIGITAL_INPUT - mt6628_I2s_Setting(FM_I2S_OFF, FM_I2S_SLAVE, FM_I2S_44K); -#endif - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_pwrdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_pwrdown failed\n"); - return ret; - } - /* FIX_ME, disable ext interrupt */ - mt6628_write(FM_MAIN_EXTINTRMASK, 0x00); - /* ALPS0080963MCU won't sleep if MCU desense was enabled */ - mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_DISABLE); - return ret; -} - -static fm_bool mt6628_SetFreq(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 chan_para = 0; - - fm_cb_op->cur_freq_set(freq); - - - /* MCU clock adjust if need */ - if ((ret = mt6628_mcu_dese(freq, NULL)) < 0) { - WCN_DBG(FM_ERR | MAIN, "mt6628_mcu_dese FAIL:%d\n", ret); - } - - WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret); - - /* GPS clock adjust if need */ - if ((ret = mt6628_gps_dese(freq, NULL)) < 0) { - WCN_DBG(FM_ERR | MAIN, "mt6628_gps_dese FAIL:%d\n", ret); - } - - WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret); - /* start tune */ - if (FM_LOCK(cmd_buf_lock)) - return fm_false; - -/* if (fm_cb_op->chan_para_get) { */ - chan_para = mt6628_chan_para_get(freq); - WCN_DBG(FM_DBG | CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para); -/* } */ - - pkt_size = mt6628_tune(cmd_buf, TX_BUF_SIZE, freq, chan_para); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6628_tune failed\n"); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq); - - /* if (rssi_th_set == fm_false) { - mt6628_set_RSSITh(MT6628fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_LONG), MT6628fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_SHORT)); - mt6628_set_SMGTh(Chip_Version, MT6628fm_cust_config_fetch(FM_CFG_RX_SMG_TH)); - rssi_th_set = fm_true; - } */ - - return fm_true; -} - - -/* -* mt6628_Seek -* @pFreq - IN/OUT parm, IN start freq/OUT seek valid freq -* @seekdir - 0:up, 1:down -* @space - 1:50KHz, 2:100KHz, 4:200KHz -* return fm_true:seek success; fm_false:seek failed -*/ -static fm_bool mt6628_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir, - fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 pkt_size, temp; - - mt6628_RampDown(); - mt6628_read(FM_MAIN_CTRL, &temp); - mt6628_Mute(fm_true); - - if (FM_LOCK(cmd_buf_lock)) - return fm_false; - pkt_size = mt6628_seek(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT, - mt6628_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - *pFreq = res->seek_result; - /* fm_cb_op->cur_freq_set(*pFreq); */ - } else { - WCN_DBG(FM_ALT | CHIP, "mt6628_seek failed\n"); - return ret; - } - - /* get the result freq */ - WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq); - mt6628_RampDown(); - if ((temp & 0x0020) == 0) { - mt6628_Mute(fm_false); - } - - return fm_true; -} - -#define FM_CQI_LOG_PATH "/mnt/sdcard/fmcqilog" - -static fm_s32 mt6628_full_cqi_get(fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 freq, orig_freq; - fm_s32 i, j, k; - fm_s32 space_val, max, min, num; - struct mt6628_full_cqi *p_cqi; - fm_u8 *cqi_log_title = - "Freq, RSSI, PAMD, PR, FPAMD, MR, ATDC, PRX, ATDEV, SMGain, DltaRSSI\n"; - fm_u8 cqi_log_buf[100] = { 0 }; - fm_s32 pos; - fm_u8 cqi_log_path[100] = { 0 }; - - WCN_DBG(FM_NTC | CHIP, "6628 cqi log start\n"); - /* for soft-mute tune, and get cqi */ - freq = fm_cb_op->cur_freq_get(); - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - /* get cqi */ - orig_freq = freq; - if (0 == fm_get_channel_space(min_freq)) { - min = min_freq * 10; - } else { - min = min_freq; - } - if (0 == fm_get_channel_space(max_freq)) { - max = max_freq * 10; - } else { - max = max_freq; - } - if (space == 0x0001) { - space_val = 5; /* 50Khz */ - } else if (space == 0x0002) { - space_val = 10; /* 100Khz */ - } else if (space == 0x0004) { - space_val = 20; /* 200Khz */ - } else { - space_val = 10; - } - num = (max - min) / space_val + 1; /* Eg, (8760 - 8750) / 10 + 1 = 2 */ - for (k = 0; (10000 == orig_freq) && (0xffffffff == g_dbg_level) && (k < cnt); k++) { - WCN_DBG(FM_NTC | CHIP, "cqi file:%d\n", k + 1); - freq = min; - pos = 0; - fm_memcpy(cqi_log_path, FM_CQI_LOG_PATH, strlen(FM_CQI_LOG_PATH)); - sprintf(&cqi_log_path[strlen(FM_CQI_LOG_PATH)], "%d.txt", k + 1); - fm_file_write(cqi_log_path, cqi_log_title, strlen(cqi_log_title), &pos); - for (j = 0; j < num; j++) { - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, - SM_TUNE_TIMEOUT, mt6628_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", res->cqi[0]); - p_cqi = (struct mt6628_full_cqi *)&res->cqi[2]; - for (i = 0; i < res->cqi[1]; i++) { - /* just for debug */ - WCN_DBG(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd, - p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr, - p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev, - p_cqi[i].smg, p_cqi[i].drssi); - /* format to buffer */ - sprintf(cqi_log_buf, - "%04d,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,\n", - p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd, - p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr, - p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev, - p_cqi[i].smg, p_cqi[i].drssi); - /* write back to log file */ - fm_file_write(cqi_log_path, cqi_log_buf, - strlen(cqi_log_buf), &pos); - } - } else { - WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n"); - ret = -1; - } - freq += space_val; - } - fm_cb_op->cur_freq_set(0); /* avoid run too much times */ - } - WCN_DBG(FM_NTC | CHIP, "6628 cqi log done\n"); - - return ret; -} - - -static fm_bool mt6628_Scan(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL, - fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_s32 ret = 0; - fm_u16 pkt_size, temp; - fm_u16 offset = 0; - fm_u16 tmp_scanTBLsize = *ScanTBLsize; - - if ((!pScanTBL) || (tmp_scanTBLsize == 0)) { - WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n"); - return fm_false; - } - - WCN_DBG(FM_NTC | CHIP, - "start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - mt6628_RampDown(); - mt6628_read(FM_MAIN_CTRL, &temp); - mt6628_Mute(fm_true); - - mt6628_full_cqi_get(min_freq, max_freq, space, 5); - - /* normal scan */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_scan(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_SCAN_DONE, SW_RETRY_CNT, SCAN_TIMEOUT, - mt6628_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - fm_memcpy(pScanTBL, res->scan_result, sizeof(fm_u16) * FM_SCANTBL_SIZE); - WCN_DBG(FM_NTC | CHIP, "Rx scan result:\n"); - - for (offset = 0; offset < tmp_scanTBLsize; offset++) { - WCN_DBG(FM_NTC | CHIP, "%d: %04x\n", (fm_s32) offset, *(pScanTBL + offset)); - } - - *ScanTBLsize = tmp_scanTBLsize; - } else { - WCN_DBG(FM_ALT | CHIP, "mt6628_scan failed\n"); - return ret; - } - - mt6628_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */ - if ((temp & 0x0020) == 0) { - mt6628_Mute(fm_false); - } - - return fm_true; -} - -/* add for scan cancel case */ -static fm_bool cqi_abort = fm_false; - -static fm_s32 mt6628_CQI_Get(fm_s8 *buf, fm_s32 buf_len) -{ - fm_s32 ret = 0; - fm_s32 i; - fm_u16 pkt_size; - struct mt6628_fm_cqi *pmt6628_cqi; - struct adapt_fm_cqi *pcqi; - - if (!buf || buf_len < FM_CQI_BUF_SIZE) { - return -FM_EBUF; - } - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_cqi_get(cmd_buf, TX_BUF_SIZE); - if (cqi_abort == fm_true) { - cqi_abort = fm_false; - ret = -1; - } else { - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_CQI_DONE, SW_RETRY_CNT, - SCAN_TIMEOUT, mt6628_get_read_result); - } - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - /* FIXEDME */ - pmt6628_cqi = (struct mt6628_fm_cqi *)res->cqi; - pcqi = (struct adapt_fm_cqi *)buf; - - for (i = 0; i < (sizeof(res->cqi) / sizeof(struct mt6628_fm_cqi)); i++) { - pcqi[i].ch = (pmt6628_cqi[i].ch * 10 / 2) + 6400; - pcqi[i].rssi = (fm_s32) pmt6628_cqi[i].rssi; - - if (pcqi[i].rssi >= 32768) { - pcqi[i].rssi = pcqi[i].rssi - 65536; - } - - pcqi[i].rssi = ((pcqi[i].rssi * 6) >> 4); - WCN_DBG(FM_NTC | CHIP, "%d --> %d(dbm)\n", pcqi[i].ch, pcqi[i].rssi); - } - } else { - WCN_DBG(FM_ALT | CHIP, "mt6628 get CQI failed:%d\n", ret); - } - - mt6628_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */ - - return ret; -} - -static fm_bool scan_abort = fm_false; - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define SCAN_SEG_LEN 250 -static fm_s8 raw_buf[16 * sizeof(struct adapt_fm_cqi)] = { 0 }; - -static fm_bool mt6628_Scan_50KHz(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, - fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, - fm_u16 space) -{ - fm_s32 ret = 0; - fm_s32 num; - fm_s32 seg; - fm_s32 i, j; - fm_u16 scan_tbl[FM_SCANTBL_SIZE]; /* need no less than the chip */ - fm_s32 start_freq, end_freq; - fm_s32 ch_offset, step, tmp_val; - fm_s32 chl_cnt = 0; - fm_s32 word_offset, bit_offset; - fm_s32 space_val = 5; - struct adapt_fm_cqi *pCQI = (struct adapt_fm_cqi *)raw_buf; - - if (space == 0x0001) { - space_val = 5; /* 50Khz */ - } else if (space == 0x0002) { - space_val = 10; /* 100Khz */ - } else if (space == 0x0004) { - space_val = 20; /* 200Khz */ - } - /* calculate segment number */ - num = (max_freq - min_freq) / space_val; /* Eg, (10800 - 8750) / 5 = 410 */ - seg = (num / SCAN_SEG_LEN) + ((num % SCAN_SEG_LEN) ? 1 : 0); /* Eg, (410 / 200) + ((410 % 200) ? 1 : 0) = 2 + 1 = 3 */ - - FM_FIFO_RESET(cqi_fifo); - fm_memset(pScanTBL, 0, sizeof(fm_u16) * (*ScanTBLsize)); - - /* do scan */ - scan_abort = fm_false; /* reset scan cancel flag */ - for (i = 0; i < seg; i++) { - start_freq = min_freq + SCAN_SEG_LEN * space_val * i; - end_freq = min_freq + SCAN_SEG_LEN * space_val * (i + 1) - space_val; - end_freq = (end_freq > max_freq) ? max_freq : end_freq; - chl_cnt = 0; - - if (fm_true == scan_abort) { - scan_abort = fm_false; - return fm_false; - } - - if (fm_false == - mt6628_Scan(start_freq, end_freq, pFreq, scan_tbl, ScanTBLsize, scandir, - space)) { - return fm_false; - } - /* get channel count */ - for (ch_offset = 0; ch_offset < FM_SCANTBL_SIZE; ch_offset++) { - if (scan_tbl[ch_offset] == 0) - continue; - for (step = 0; step < 16; step++) { - if (scan_tbl[ch_offset] & (1 << step)) { - tmp_val = start_freq + (ch_offset * 16 + step) * space_val; - WCN_DBG(FM_NTC | CHIP, "freq %d, end freq %d\n", tmp_val, - end_freq); - if (tmp_val <= end_freq) { - chl_cnt++; - /* set reult bitmap */ - word_offset = (tmp_val - min_freq) / space_val / 16; - bit_offset = (tmp_val - min_freq) / space_val % 16; - if ((word_offset < 26) && (word_offset >= 0)) { - pScanTBL[word_offset] |= (1 << bit_offset); - } - WCN_DBG(FM_NTC | CHIP, "cnt %d, word %d, bit %d\n", - chl_cnt, word_offset, bit_offset); - } - } - } - } - - /* get cqi info */ - while (chl_cnt > 0) { - ret = mt6628_CQI_Get(raw_buf, 16 * sizeof(struct adapt_fm_cqi)); - if (ret) { - return ret; - } - /* add valid channel to cqi_fifo */ - for (j = 0; j < sizeof(raw_buf) / sizeof(struct adapt_fm_cqi); j++) { - if ((pCQI[j].ch >= start_freq) && (pCQI[j].ch <= end_freq)) { - FM_FIFO_INPUT(cqi_fifo, pCQI + j); - WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) add to fifo\n", - pCQI[j].ch, pCQI[j].rssi); - } - } - - chl_cnt -= 16; - } - } - - return fm_true; -} - - -static fm_s32 mt6628_CQI_Get_50KHz(fm_s8 *buf, fm_s32 buf_len) -{ - fm_s32 ret = 0; - fm_s32 i; - struct adapt_fm_cqi tmp = { - .ch = 0, - .rssi = 0, - }; - struct adapt_fm_cqi *pcqi = (struct adapt_fm_cqi *)buf; - - - if (!buf || buf_len < FM_CQI_BUF_SIZE) { - return -FM_EBUF; - } - - for (i = 0; ((i < (buf_len / sizeof(struct adapt_fm_cqi))) && - (fm_false == FM_FIFO_IS_EMPTY(cqi_fifo))); i++) { - FM_FIFO_OUTPUT(cqi_fifo, &tmp); - pcqi[i].ch = tmp.ch; - pcqi[i].rssi = tmp.rssi; - WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) get from fifo\n", pcqi[i].ch, pcqi[i].rssi); - } - - return ret; -} - -#endif /* CONFIG_MTK_FM_50KHZ_SUPPORT */ - - -/* - * mt6628_GetCurRSSI - get current freq's RSSI value - * RS=RSSI - * If RS>511, then RSSI(dBm)= (RS-1024)/16*6 - * else RSSI(dBm)= RS/16*6 - */ -static fm_s32 mt6628_GetCurRSSI(fm_s32 *pRSSI) -{ - fm_u16 tmp_reg; - - mt6628_read(FM_RSSI_IND, &tmp_reg); - tmp_reg = tmp_reg & 0x03ff; - - if (pRSSI) { - *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4); - WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI); - } else { - WCN_DBG(FM_ERR | CHIP, "get rssi para error\n"); - return -FM_EPARA; - } - - return 0; -} - -static fm_u16 mt6628_vol_tbl[16] = { 0x0000, 0x0519, 0x066A, 0x0814, - 0x0A2B, 0x0CCD, 0x101D, 0x1449, - 0x198A, 0x2027, 0x287A, 0x32F5, - 0x4027, 0x50C3, 0x65AD, 0x7FFF -}; - -static fm_s32 mt6628_SetVol(fm_u8 vol) -{ - fm_s32 ret = 0; - - vol = (vol > 15) ? 15 : vol; - ret = mt6628_write(0x7D, mt6628_vol_tbl[vol]); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", vol); - return ret; - } else { - WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", vol); - } - - if (vol == 10) { - fm_print_cmd_fifo(); /* just for debug */ - fm_print_evt_fifo(); - } - return 0; -} - -static fm_s32 mt6628_GetVol(fm_u8 *pVol) -{ - int ret = 0; - fm_u16 tmp; - fm_s32 i; - - FMR_ASSERT(pVol); - - ret = mt6628_read(0x7D, &tmp); - if (ret) { - *pVol = 0; - WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n"); - return ret; - } - - for (i = 0; i < 16; i++) { - if (mt6628_vol_tbl[i] == tmp) { - *pVol = i; - break; - } - } - - WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol); - return 0; -} - -static fm_s32 mt6628_dump_reg(void) -{ - fm_s32 i; - fm_u16 TmpReg; - for (i = 0; i < 0xff; i++) { - mt6628_read(i, &TmpReg); - WCN_DBG(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg); - } - return 0; -} - -static fm_bool mt6628_GetMonoStereo(fm_u16 *pMonoStereo) -{ -#define FM_BF_STEREO 0x1000 - fm_u16 TmpReg; - - if (pMonoStereo) { - mt6628_read(FM_RSSI_IND, &TmpReg); - *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12; - } else { - WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n"); - return fm_false; - } - - WCN_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo); - return fm_true; -} - -static fm_s32 mt6628_SetMonoStereo(fm_s32 MonoStereo) -{ - fm_s32 ret = 0; -#define FM_FORCE_MS 0x0008 - - WCN_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "mono" : "auto"); - - mt6628_write(0x60, 0x3007); - - if (MonoStereo) { - ret = mt6628_set_bits(0x75, FM_FORCE_MS, ~FM_FORCE_MS); - } else { - ret = mt6628_set_bits(0x75, 0x0000, ~FM_FORCE_MS); - } - - return ret; -} - -static fm_s32 mt6628_GetCapArray(fm_s32 *ca) -{ - fm_u16 dataRead; - fm_u16 tmp = 0; - - FMR_ASSERT(ca); - mt6628_read(0x60, &tmp); - mt6628_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */ - - mt6628_read(0x26, &dataRead); - *ca = dataRead; - - mt6628_write(0x60, tmp); /* 0x60 D3=1 */ - return 0; -} - -/* - * mt6628_GetCurPamd - get current freq's PAMD value - * PA=PAMD - * If PA>511 then PAMD(dB)= (PA-1024)/16*6, - * else PAMD(dB)=PA/16*6 - */ -static fm_bool mt6628_GetCurPamd(fm_u16 *pPamdLevl) -{ - fm_u16 tmp_reg; - fm_u16 dBvalue, valid_cnt = 0; - int i, total = 0; - for (i = 0; i < 8; i++) { - if (mt6628_read(FM_ADDR_PAMD, &tmp_reg)) { - *pPamdLevl = 0; - return fm_false; - } - - tmp_reg &= 0x03FF; - dBvalue = (tmp_reg > 256) ? ((512 - tmp_reg) * 6 / 16) : 0; - if (dBvalue != 0) { - total += dBvalue; - valid_cnt++; - WCN_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue); - } - Delayms(3); - } - if (valid_cnt != 0) { - *pPamdLevl = total / valid_cnt; - } else { - *pPamdLevl = 0; - } - WCN_DBG(FM_NTC | CHIP, "PAMD=%d\n", *pPamdLevl); - return fm_true; -} - -static fm_s32 mt6628_ScanStop(void) -{ - cqi_abort = fm_true; - scan_abort = fm_true; - fm_force_active_event(FLAG_SCAN_DONE | FLAG_CQI_DONE); - - return 0; -} - -static fm_s32 mt6628_SeekStop(void) -{ - return fm_force_active_event(FLAG_SEEK_DONE); -} - - -/* - * mt6628_I2s_Setting - set the I2S state on MT6628 - * @onoff - I2S on/off - * @mode - I2S mode: Master or Slave - * - * Return:0, if success; error code, if failed - */ -static fm_s32 mt6628_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample) -{ - fm_u16 tmp_state = 0; - fm_u16 tmp_mode = 0; - fm_u16 tmp_sample = 0; - fm_s32 ret = 0; - - if (onoff == FM_I2S_ON) { - tmp_state = 0x0080; /* I2S Frequency tracking on, 0x61 D7=1 */ - mt6628_fm_config.aud_cfg.i2s_info.status = FM_I2S_ON; - } else if (onoff == FM_I2S_OFF) { - tmp_state = 0x0000; /* I2S Frequency tracking off, 0x61 D7=0 */ - mt6628_fm_config.aud_cfg.i2s_info.status = FM_I2S_OFF; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff); - ret = -FM_EPARA; - goto out; - } - - if (mode == FM_I2S_MASTER) { - tmp_mode = 0x0000; /* 6620 as I2S master, set 0x9B D3=0 */ - mt6628_fm_config.aud_cfg.i2s_info.mode = FM_I2S_MASTER; - } else if (mode == FM_I2S_SLAVE) { - tmp_mode = 0x0008; /* 6620 as I2S slave, set 0x9B D3=1 */ - mt6628_fm_config.aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode); - ret = -FM_EPARA; - goto out; - } - - if (sample == FM_I2S_32K) { - tmp_sample = 0x0000; /* 6620 I2S 32KHz sample rate, 0x5F D11~12 */ - mt6628_fm_config.aud_cfg.i2s_info.rate = FM_I2S_32K; - } else if (sample == FM_I2S_44K) { - tmp_sample = 0x0800; /* 6620 I2S 44.1KHz sample rate */ - mt6628_fm_config.aud_cfg.i2s_info.rate = FM_I2S_44K; - } else if (sample == FM_I2S_48K) { - tmp_sample = 0x1000; /* 6620 I2S 48KHz sample rate */ - mt6628_fm_config.aud_cfg.i2s_info.rate = FM_I2S_48K; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample); - ret = -FM_EPARA; - goto out; - } - - if ((ret = mt6628_set_bits(0x5F, tmp_sample, 0xE7FF))) - goto out; - - if ((ret = mt6628_set_bits(0x9B, tmp_mode, 0xFFF7))) - goto out; - - if ((ret = mt6628_set_bits(0x61, tmp_state, 0xFF7F))) - goto out; - - WCN_DBG(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n", - (onoff == FM_I2S_ON) ? "On" : "Off", - (mode == FM_I2S_MASTER) ? "Master" : "Slave", sample); - out: - return ret; -} - -static fm_s32 mt6628fm_get_audio_info(fm_audio_info_t *data) -{ - memcpy(data, &mt6628_fm_config.aud_cfg, sizeof(fm_audio_info_t)); - return 0; -} - -static fm_s32 mt6628_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample) -{ - FMR_ASSERT(ponoff); - FMR_ASSERT(pmode); - FMR_ASSERT(psample); - - *ponoff = mt6628_fm_config.aud_cfg.i2s_info.status; - *pmode = mt6628_fm_config.aud_cfg.i2s_info.mode; - *psample = mt6628_fm_config.aud_cfg.i2s_info.rate; - - return 0; -} - - -static fm_s32 mt6628_hw_info_get(struct fm_hw_info *req) -{ - FMR_ASSERT(req); - - req->chip_id = mt6628_hw_info.chip_id; - req->eco_ver = mt6628_hw_info.eco_ver; - req->patch_ver = mt6628_hw_info.patch_ver; - req->rom_ver = mt6628_hw_info.rom_ver; - - return 0; -} - -static fm_s32 mt6628_pre_search(void) -{ - mt6628_RampDown(); - /* mt6628_Mute(fm_true); //remove because app will do mute/unmute when start/stop scan */ - - FM_LOG_NTC(FM_NTC | CHIP, "search threshold: RSSI=%d,de-RSSI=%d,smg=%d %d\n", - mt6628_fm_config.rx_cfg.long_ana_rssi_th, mt6628_fm_config.rx_cfg.desene_rssi_th, - mt6628_fm_config.rx_cfg.smg_th); - return 0; -} - -static fm_s32 mt6628_restore_search(void) -{ - mt6628_RampDown(); - /* mt6628_Mute(fm_false); */ - return 0; -} - -static fm_s32 mt6628_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - /* fm_u16 freq;//, orig_freq; */ - struct mt6628_full_cqi *p_cqi; - fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0; - fm_u32 PRX = 0, ATDEV = 0; - fm_u16 softmuteGainLvl = 0; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6628_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT, - mt6628_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && res) { - WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", res->cqi[0]); - p_cqi = (struct mt6628_full_cqi *)&res->cqi[2]; - /* just for debug */ - WCN_DBG(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr, - p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi); - RSSI = - ((p_cqi->rssi & 0x03FF) >= - 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF); - PAMD = - ((p_cqi->pamd & 0x1FF) >= - 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF); - MR = ((p_cqi->mr & 0x01FF) >= - 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF); - ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc); - if (ATDC < 0) { - ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */ - } - PRX = (p_cqi->prx & 0x00FF); - ATDEV = p_cqi->atdev; - softmuteGainLvl = p_cqi->smg; - /* check if the channel is valid according to each CQIs */ - if ((RSSI >= mt6628_fm_config.rx_cfg.long_ana_rssi_th) - && (PAMD <= mt6628_fm_config.rx_cfg.pamd_th) - && (ATDC <= mt6628_fm_config.rx_cfg.atdc_th) - && (MR >= mt6628_fm_config.rx_cfg.mr_th) - && (PRX >= mt6628_fm_config.rx_cfg.prx_th) - && (ATDEV >= ATDC) - && (softmuteGainLvl >= mt6628_fm_config.rx_cfg.smg_th)) { - *valid = fm_true; - } else { - *valid = fm_false; - } - *rssi = RSSI; -/* if(RSSI < -296) - WCN_DBG(FM_NTC | CHIP, "rssi\n"); - else if(PAMD > -12) - WCN_DBG(FM_NTC | CHIP, "PAMD\n"); - else if(ATDC > 3496) - WCN_DBG(FM_NTC | CHIP, "ATDC\n"); - else if(MR < -67) - WCN_DBG(FM_NTC | CHIP, "MR\n"); - else if(PRX < 80) - WCN_DBG(FM_NTC | CHIP, "PRX\n"); - else if(ATDEV < ATDC) - WCN_DBG(FM_NTC | CHIP, "ATDEV\n"); - else if(softmuteGainLvl < 16421) - WCN_DBG(FM_NTC | CHIP, "softmuteGainLvl\n"); - */ - } else { - WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n"); - return fm_false; - } - WCN_DBG(FM_NTC | CHIP, "valid=%d\n", *valid); - return fm_true; -} - -static fm_bool mt6628_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value) -{ - return fm_true; -} - -static fm_s32 MT6628fm_low_power_wa_default(fm_s32 fmon) -{ - return 0; -} - -/* -parm: - parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG. - parm.th_val: threshold value -*/ -static fm_s32 mt6628_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve) -{ - switch (idx) { - case 0: - { - mt6628_fm_config.rx_cfg.long_ana_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val); - break; - } - case 1: - { - mt6628_fm_config.rx_cfg.desene_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val); - break; - } - case 2: - { - mt6628_fm_config.rx_cfg.smg_th = val; - WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val); - break; - } - default: - break; - } - return 0; -} - -fm_s32 MT6628fm_low_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb_op = &ops->cb; - - ops->bi.low_pwr_wa = MT6628fm_low_power_wa_default; - ops->bi.pwron = mt6628_pwron; - ops->bi.pwroff = mt6628_pwroff; - ops->bi.msdelay = Delayms; - ops->bi.usdelay = Delayus; - ops->bi.read = mt6628_read; - ops->bi.write = mt6628_write; - ops->bi.setbits = mt6628_set_bits; - ops->bi.chipid_get = mt6628_get_chipid; - ops->bi.mute = mt6628_Mute; - ops->bi.rampdown = mt6628_RampDown; - ops->bi.pwrupseq = mt6628_PowerUp; - ops->bi.pwrdownseq = mt6628_PowerDown; - ops->bi.setfreq = mt6628_SetFreq; - ops->bi.seek = mt6628_Seek; - ops->bi.seekstop = mt6628_SeekStop; - ops->bi.scan = mt6628_Scan; - ops->bi.cqi_get = mt6628_CQI_Get; -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT - ops->bi.scan = mt6628_Scan_50KHz; - ops->bi.cqi_get = mt6628_CQI_Get_50KHz; -#endif - ops->bi.scanstop = mt6628_ScanStop; - ops->bi.rssiget = mt6628_GetCurRSSI; - ops->bi.volset = mt6628_SetVol; - ops->bi.volget = mt6628_GetVol; - ops->bi.dumpreg = mt6628_dump_reg; - ops->bi.msget = mt6628_GetMonoStereo; - ops->bi.msset = mt6628_SetMonoStereo; - ops->bi.pamdget = mt6628_GetCurPamd; - ops->bi.em = mt6628_em_test; - ops->bi.anaswitch = mt6628_SetAntennaType; - ops->bi.anaget = mt6628_GetAntennaType; - ops->bi.caparray_get = mt6628_GetCapArray; - ops->bi.i2s_set = mt6628_I2s_Setting; - ops->bi.hwinfo_get = mt6628_hw_info_get; - ops->bi.i2s_get = mt6628_i2s_info_get; - ops->bi.is_dese_chan = mt6628_is_dese_chan; - ops->bi.softmute_tune = mt6628_soft_mute_tune; - ops->bi.desense_check = mt6628_desense_check; - ops->bi.cqi_log = mt6628_full_cqi_get; - ops->bi.set_search_th = mt6628_set_search_th; - ops->bi.pre_search = mt6628_pre_search; - ops->bi.restore_search = mt6628_restore_search; - ops->bi.get_aud_info = mt6628fm_get_audio_info; - - cmd_buf_lock = fm_lock_create("28_cmd"); - ret = fm_lock_get(cmd_buf_lock); - - cmd_buf = fm_zalloc(TX_BUF_SIZE + 1); - - if (!cmd_buf) { - WCN_DBG(FM_ALT | CHIP, "6628 fm lib alloc tx buf failed\n"); - ret = -1; - } -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT - cqi_fifo = fm_fifo_create("6628_cqi_fifo", sizeof(struct adapt_fm_cqi), 640); - if (!cqi_fifo) { - WCN_DBG(FM_ALT | CHIP, "6628 fm lib create cqi fifo failed\n"); - ret = -1; - } -#endif - - return ret; -} - -fm_s32 MT6628fm_low_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - FMR_ASSERT(ops); - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT - fm_fifo_release(cqi_fifo); -#endif - - if (cmd_buf) { - fm_free(cmd_buf); - cmd_buf = NULL; - } - - ret = fm_lock_put(cmd_buf_lock); - fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface)); - return ret; -} - -/* static struct fm_pub pub; */ -/* static struct fm_pub_cb *pub_cb = &pub.pub_tbl; */ - -static const fm_u16 mt6628_mcu_dese_list[] = { - 7630, 7800, 7940, 8320, 9260, 9600, 9710, 9920, 10400, 10410 -}; - -static const fm_u16 mt6628_gps_dese_list[] = { - 7850, 7860 -}; - -static const fm_s8 mt6628_chan_para_map[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 7600~7695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7700~7795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7800~7895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7900~7995 */ - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8000~8095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8100~8195 */ - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8200~8295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8300~8395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 8400~8495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8500~8595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8600~8695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8700~8795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8800~8895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8900~8995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9000~9095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9100~9195 */ - 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9200~9295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9300~9395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, /* 9400~9495 */ - 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 9500~9595 */ - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9600~9695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9700~9795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9800~9895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 9900~9995 */ - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10000~10095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10100~10195 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 10200~10295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10300~10395 */ - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10400~10495 */ - 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10500~10595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10600~10695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 10700~10795 */ - 0 /* 10800 */ -}; - - -static const fm_u16 mt6628_scan_dese_list[] = { - 7680, 8210, 8450, 9210, 9220, 9600, 9840, 10400, 10750, 10760 -}; - -/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */ -static fm_s32 mt6628_is_dese_chan(fm_u16 freq) -{ - fm_s32 size; - - size = sizeof(mt6628_scan_dese_list) / sizeof(mt6628_scan_dese_list[0]); - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - while (size) { - if (mt6628_scan_dese_list[size - 1] == freq) - return 1; - - size--; - } - - return 0; -} - -/* return value: -1, is desense channel and rssi is less than threshold; -0, not desense channel or it is but rssi is more than threshold.*/ -static fm_s32 mt6628_desense_check(fm_u16 freq, fm_s32 rssi) -{ - if (mt6628_is_dese_chan(freq)) { - if (rssi < mt6628_fm_config.rx_cfg.desene_rssi_th) { - return 1; - } - WCN_DBG(FM_DBG | CHIP, "desen_rssi %d th:%d\n", rssi, - mt6628_fm_config.rx_cfg.desene_rssi_th); - } - return 0; -} - - -/* return value: 0, mcu dese disable; 1, enable; else error no */ -static fm_s32 mt6628_mcu_dese(fm_u16 freq, void *arg) -{ - fm_mcu_desense_t state = FM_MCU_DESE_DISABLE; - fm_s32 len = 0; - fm_s32 indx = 0; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - WCN_DBG(FM_DBG | CHIP, "%s, [freq=%d]\n", __func__, (int)freq); - - len = sizeof(mt6628_mcu_dese_list) / sizeof(mt6628_mcu_dese_list[0]); - indx = 0; - - while ((indx < len) && (state != FM_MCU_DESE_ENABLE)) { - if (mt6628_mcu_dese_list[indx] == freq) { - state = FM_MCU_DESE_ENABLE; - } - - indx++; - } - - /* request 6628 MCU change clk */ - if (state == FM_MCU_DESE_DISABLE) { - if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_DISABLE)) { - return -1; - } - return 0; - } else { - if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_ENABLE)) { - return -1; - } - return 1; - } -} - - - -/* return value: 0,mcu dese disable; 1, enable; else error no */ -static fm_s32 mt6628_gps_dese(fm_u16 freq, void *arg) -{ - fm_gps_desense_t state = FM_GPS_DESE_DISABLE; - fm_s32 len = 0; - fm_s32 indx = 0; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - WCN_DBG(FM_DBG | CHIP, "%s, [freq=%d]\n", __func__, (int)freq); - - len = sizeof(mt6628_gps_dese_list) / sizeof(mt6628_gps_dese_list[0]); - indx = 0; - - while ((indx < len) && (state != FM_GPS_DESE_ENABLE)) { - if (mt6628_gps_dese_list[indx] == freq) { - state = FM_GPS_DESE_ENABLE; - } - - indx++; - } - - /* request 6628 GPS change clk */ - if (state == FM_GPS_DESE_DISABLE) { - if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_DISABLE)) { - return -1; - } - return 0; - } else { - if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_ENABLE)) { - return -1; - } - return 1; - } -} - - -/* get channel parameter, HL side/ FA / ATJ */ -static fm_u16 mt6628_chan_para_get(fm_u16 freq) -{ - fm_s32 pos, size; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - pos = (freq - 7600) / 5; - - size = sizeof(mt6628_chan_para_map) / sizeof(mt6628_chan_para_map[0]); - - pos = (pos < 0) ? 0 : pos; - pos = (pos > (size - 1)) ? (size - 1) : pos; - - return mt6628_chan_para_map[pos]; -} diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c deleted file mode 100644 index ff326ffdf..000000000 --- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c +++ /dev/null @@ -1,317 +0,0 @@ -/* mt6628_rds.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6628 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_rds.h" -#include "mt6628_fm_reg.h" - - -static fm_bool bRDS_FirstIn = fm_false; -static fm_u32 gBLER_CHK_INTERVAL = 5000; -static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT; -static fm_u8 BAD_BLK_RATIO; - -static struct fm_callback *fm_cb; -static struct fm_basic_interface *fm_bi; - - -static fm_bool mt6628_RDS_support(void); -static fm_s32 mt6628_RDS_enable(void); -static fm_s32 mt6628_RDS_disable(void); -static fm_u16 mt6628_RDS_Get_GoodBlock_Counter(void); -static fm_u16 mt6628_RDS_Get_BadBlock_Counter(void); -static fm_u8 mt6628_RDS_Get_BadBlock_Ratio(void); -static fm_u32 mt6628_RDS_Get_BlerCheck_Interval(void); -/* static void mt6628_RDS_GetData(fm_u16 *data, fm_u16 datalen); */ -static void mt6628_RDS_Init_Data(rds_t *pstRDSData); - - - -static fm_bool mt6628_RDS_support(void) -{ - return fm_true; -} - -static fm_s32 mt6628_RDS_enable(void) -{ - fm_s32 ret = 0; - fm_u16 dataRead; - - WCN_DBG(FM_DBG | RDSC, "rds enable\n"); - ret = fm_bi->read(FM_RDS_CFG0, &dataRead); - ret = fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */ - ret = fm_bi->read(FM_MAIN_CTRL, &dataRead); - ret = fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK)); - - return ret; -} - -static fm_s32 mt6628_RDS_disable(void) -{ - fm_s32 ret = 0; - fm_u16 dataRead; - - WCN_DBG(FM_DBG | RDSC, "rds disable\n"); - ret = fm_bi->read(FM_MAIN_CTRL, &dataRead); - ret = fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK)); - - return ret; -} - -static fm_u16 mt6628_RDS_Get_GoodBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg); - GOOD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u16 mt6628_RDS_Get_BadBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg); - BAD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u8 mt6628_RDS_Get_BadBlock_Ratio(void) -{ - fm_u16 tmp_reg; - fm_u16 gbc; - fm_u16 bbc; - - gbc = mt6628_RDS_Get_GoodBlock_Counter(); - bbc = mt6628_RDS_Get_BadBlock_Counter(); - - if ((gbc + bbc) > 0) { - tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc)); - } else { - tmp_reg = 0; - } - - BAD_BLK_RATIO = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_s32 mt6628_RDS_BlockCounter_Reset(void) -{ - mt6628_RDS_disable(); - mt6628_RDS_enable(); - - return 0; -} - -static fm_u32 mt6628_RDS_Get_BlerCheck_Interval(void) -{ - return gBLER_CHK_INTERVAL; -} - -static fm_s32 mt6628_RDS_BlerCheck(rds_t *dst) -{ - return 0; -} - -#if 0 -static void RDS_Recovery_Handler(void) -{ - fm_u16 tempData = 0; - - do { - fm_bi->read(FM_RDS_DATA_REG, &tempData); - fm_bi->read(FM_RDS_POINTER, &tempData); - } while (tempData & 0x3); -} -#endif - -#if 0 -static void mt6628_RDS_GetData(fm_u16 *data, fm_u16 datalen) -{ -#define RDS_GROUP_DIFF_OFS 0x007C -#define RDS_FIFO_DIFF 0x007F -#define RDS_CRC_BLK_ADJ 0x0020 -#define RDS_CRC_CORR_CNT 0x001E -#define RDS_CRC_INFO 0x0001 - - fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0; - fm_u16 temp = 0, OutputPofm_s32 = 0; - - WCN_DBG(FM_DBG | RDSC, "get data\n"); - fm_bi->read(FM_RDS_FIFO_STATUS0, &temp); - RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2); - - if ((temp & RDS_FIFO_DIFF) >= 4) { - /* block A data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10; - CRC |= (temp & RDS_CRC_INFO) << 3; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11); - fm_bi->read(FM_RDS_DATA_REG, &data[0]); - - /* block B data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9; - CRC |= (temp & RDS_CRC_INFO) << 2; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7); - fm_bi->read(FM_RDS_DATA_REG, &data[1]); - - /* block C data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8; - CRC |= (temp & RDS_CRC_INFO) << 1; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3); - fm_bi->read(FM_RDS_DATA_REG, &data[2]); - - /* block D data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7; - CRC |= (temp & RDS_CRC_INFO); - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1); - fm_bi->read(FM_RDS_DATA_REG, &data[3]); - - data[4] = (CRC | RDS_adj | RDSDataCount); - data[5] = FM_WARorrCnt; - - fm_bi->read(FM_RDS_PWDI, &data[6]); - fm_bi->read(FM_RDS_PWDQ, &data[7]); - - fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32); - - /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */ - if (OutputPofm_s32 & 0x3) { - RDS_Recovery_Handler(); - } - - } else { - for (; i < 8; i++) - data[i] = 0; - } -} -#endif - -static void mt6628_RDS_Init_Data(rds_t *pstRDSData) -{ - fm_memset(pstRDSData, 0, sizeof(rds_t)); - bRDS_FirstIn = fm_true; - - pstRDSData->event_status = 0x0000; - fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData)); - fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS)); - fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON)); -} - -fm_bool mt6628_RDS_OnOff(rds_t *dst, fm_bool bFlag) -{ - if (mt6628_RDS_support() == fm_false) { - WCN_DBG(FM_ALT | RDSC, "mt6628_RDS_OnOff failed, RDS not support\n"); - return fm_false; - } - - if (bFlag) { - mt6628_RDS_Init_Data(dst); - mt6628_RDS_enable(); - } else { - mt6628_RDS_Init_Data(dst); - mt6628_RDS_disable(); - } - - return fm_true; -} - -DEFINE_RDSLOG(mt6628_rds_log); - -/* mt6628_RDS_Efm_s32_Handler - response FM RDS interrupt - * @fm - main data structure of FM driver - * This function first get RDS raw data, then call RDS spec parser - */ -static fm_s32 mt6628_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - mt6628_rds_log.log_in(&mt6628_rds_log, rds_raw, rds_size); - return rds_parser(rds_dst, rds_raw, rds_size, getfreq); -} - -static fm_s32 mt6628_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len) -{ - return mt6628_rds_log.log_out(&mt6628_rds_log, dst, dst_len); -} - -static fm_s32 mt6628_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp) -{ - return rds_grp_counter_get(dst, &rdsp->gc); -} - -static fm_s32 mt6628_rds_gc_reset(rds_t *rdsp) -{ - return rds_grp_counter_reset(&rdsp->gc); -} - -fm_s32 MT6628fm_rds_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - FMR_ASSERT(ops->bi.write); - FMR_ASSERT(ops->bi.read); - FMR_ASSERT(ops->bi.setbits); - FMR_ASSERT(ops->bi.usdelay); - fm_bi = &ops->bi; - - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb = &ops->cb; - - ops->ri.rds_blercheck = mt6628_RDS_BlerCheck; - ops->ri.rds_onoff = mt6628_RDS_OnOff; - ops->ri.rds_parser = mt6628_rds_parser; - ops->ri.rds_gbc_get = mt6628_RDS_Get_GoodBlock_Counter; - ops->ri.rds_bbc_get = mt6628_RDS_Get_BadBlock_Counter; - ops->ri.rds_bbr_get = mt6628_RDS_Get_BadBlock_Ratio; - ops->ri.rds_bc_reset = mt6628_RDS_BlockCounter_Reset; - ops->ri.rds_bci_get = mt6628_RDS_Get_BlerCheck_Interval; - ops->ri.rds_log_get = mt6628_rds_log_get; - ops->ri.rds_gc_get = mt6628_rds_gc_get; - ops->ri.rds_gc_reset = mt6628_rds_gc_reset; - return ret; -} - -fm_s32 MT6628fm_rds_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - - fm_bi = NULL; - fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h deleted file mode 100644 index 52502ad31..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h +++ /dev/null @@ -1,58 +0,0 @@ -/* mt6630_fm.h - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6630 FM Radio Driver -- head file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __MT6630_FM_H__ -#define __MT6630_FM_H__ - -#include "fm_typedef.h" - -/* #define FM_PowerOn_with_ShortAntenna */ -#define MT6630_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */ -#define MT6630_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */ -#define MT6630_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */ -#define MT6630_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */ -#define MT6630_SCAN_CH_SIZE 40 /* FM radio scan max channel size */ -#define MT6630_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -#define MT6630_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */ -#define MT6630_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */ -#define MT6630_DEEMPHASIS_50us TRUE - -#define MT6630_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */ -#define MT6630_MAX_COUNT 100 - -#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT -#define MT6630_SCANTBL_SIZE 26 /* 16*uinit16_t */ -#else -#define MT6630_SCANTBL_SIZE 16 /* 16*uinit16_t */ -#endif - -#define AFC_ON 0x01 -#if AFC_ON -#define FM_MAIN_CTRL_INIT 0x480 -#else -#define FM_MAIN_CTRL_INIT 0x080 -#endif - -#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */ -#define MT6630_DEV "MT6630" - -#endif /* end of #ifndef __MT6630_FM_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h deleted file mode 100644 index ac303114f..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __MT6630_FM_CMD_H__ -#define __MT6630_FM_CMD_H__ - -#include <linux/types.h> -#include "fm_typedef.h" - -/* FM basic-operation's opcode */ -#define FM_BOP_BASE (0x80) -enum { - FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00), - FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01), - FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02), - FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03), - FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04), - FM_TOP_WRITE_BASIC_OP = (FM_BOP_BASE + 0x05), - FM_TOP_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x06), - FM_TOP_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x07), - FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x08) -}; - -/* FM BOP's size */ -#define FM_TOP_WRITE_BOP_SIZE (7) -#define FM_TOP_RD_UNTIL_BOP_SIZE (11) -#define FM_TOP_MODIFY_BOP_SIZE (11) - -#define FM_WRITE_BASIC_OP_SIZE (3) -#define FM_UDELAY_BASIC_OP_SIZE (4) -#define FM_RD_UNTIL_BASIC_OP_SIZE (5) -#define FM_MODIFY_BASIC_OP_SIZE (5) -#define FM_MSLEEP_BASIC_OP_SIZE (4) - -fm_s32 mt6630_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_pwrdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_rampdown(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para); -fm_s32 mt6630_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6630_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq); -fm_s32 mt6630_cqi_get(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr); -fm_s32 mt6630_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value); -fm_s32 mt6630_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6630_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -#if 0 -fm_s32 mt6630_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -fm_s32 mt6630_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len); -#endif -fm_s32 mt6630_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type); -fm_s32 mt6630_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr); -fm_s32 mt6630_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value); -fm_s32 mt6630_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr); -fm_s32 mt6630_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value); -fm_s32 mt6630_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask); -/*****************Tx***********************/ -fm_s32 mt6630_tune_tx(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para); -fm_s32 mt6630_pwrup_clock_on_tx(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_pwrup_tx_deviation(fm_u8 *buf, fm_s32 buf_size); -fm_s32 mt6630_rds_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, - fm_u8 other_rds_cnt); -fm_s32 mt6630_tx_rdson_deviation(fm_u8 *buf, fm_s32 buf_size); - -/* - * fm_get_channel_space - get the spcace of gived channel - * @freq - value in 760~1080 or 7600~10800 - * - * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0 - */ -extern fm_s32 fm_get_channel_space(int freq); - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h deleted file mode 100644 index 8107cfe35..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * (C) Copyright 20011 - * MediaTek <www.MediaTek.com> - * Hongcheng Xia<Hongcheng.Xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MT6630_CUST_CFG_H__ -#define __MT6630_CUST_CFG_H__ - -/* scan sort algorithm */ -enum { - FM_SCAN_SORT_NON = 0, - FM_SCAN_SORT_UP, - FM_SCAN_SORT_DOWN, - FM_SCAN_SORT_MAX -}; -/*typedef struct { - fm_s32 short_ana_rssi_th; - fm_s32 long_ana_rssi_th; - fm_s32 desene_rssi_th; - fm_s32 pamd_th; - fm_s32 mr_th; - fm_s32 atdc_th; - fm_u32 prx_th; - fm_u32 atdev_th; - fm_u16 smg_th; - fm_u16 deemphasis; - fm_u16 osc_freq; -}mt6628_fm_rx_cust_cfg; - -typedef struct{ - mt6628_fm_rx_cust_cfg rx_cfg; -}mt6628_fm_cust_cfg; -*/ -/* ***************************************************************************************** */ -/* ***********************************FM config for customer: start****************************** */ -/* ***************************************************************************************** */ -/* RX */ -#define FM_RX_RSSI_TH_LONG_MT6630 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */ -#define FM_RX_RSSI_TH_SHORT_MT6630 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */ -#define FM_RX_DESENSE_RSSI_MT6630 -258 -#define FM_RX_PAMD_TH_MT6630 -12 -#define FM_RX_MR_TH_MT6630 -67 -#define FM_RX_ATDC_TH_MT6630 3496 -#define FM_RX_PRX_TH_MT6630 64 -#define FM_RX_SMG_TH_MT6630 16421 /* FM soft-mute gain threshold */ -#define FM_RX_DEEMPHASIS_MT6630 0 /* 0-50us, China Mainland; 1-75us China Taiwan */ -#define FM_RX_OSC_FREQ_MT6630 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */ -/* #define FM_RX_SEEK_SPACE_MT6630 1 //FM radio seek space,1:100KHZ; 2:200KHZ */ -/* #define FM_RX_SCAN_CH_SIZE_MT6630 40 //FM radio scan max channel size */ -/* #define FM_RX_BAND_MT6630 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */ -/* #define FM_RX_SCAN_SORT_SELECT_MT6630 FM_SCAN_SORT_NON */ -/* #define FM_RX_FAKE_CH_NUM_MT6630 1 */ -/* #define FM_RX_FAKE_CH_RSSI_MT6630 40 */ -/* #define FM_RX_FAKE_CH_1_MT6630 1075 */ -/* #define FM_RX_FAKE_CH_2_MT6630 0 */ -/* #define FM_RX_FAKE_CH_3_MT6630 0 */ -/* #define FM_RX_FAKE_CH_4_MT6630 0 */ -/* #define FM_RX_FAKE_CH_5_MT6630 0 */ - -/* TX */ -/* #define FM_TX_PWR_LEVEL_MAX_MT6630 120 */ -/* #define FM_TX_SCAN_HOLE_LOW_MT6630 923 //92.3MHz~95.4MHz should not show to user */ -/* #define FM_TX_SCAN_HOLE_HIGH_MT6630 954 //92.3MHz~95.4MHz should not show to user */ -#define FM_TX_PAMD_TH_MT6630 -23 -#define FM_TX_MR_TH_MT6630 60 -#define FM_TX_SMG_TH_MT6630 8231 - - -/* ***************************************************************************************** */ -/* ***********************************FM config for customer:end ******************************* */ -/* ***************************************************************************************** */ - -/* #define FM_SEEK_SPACE_MT6630 FM_RX_SEEK_SPACE_MT6630 */ -/* max scan chl num */ -/* #define FM_MAX_CHL_SIZ_MT6630E FM_RX_SCAN_CH_SIZE_MT6630 */ -/* auto HiLo */ -#define FM_AUTO_HILO_OFF_MT6630 0 -#define FM_AUTO_HILO_ON_MT6630 1 - - -/* seek threshold */ -#define FM_SEEKTH_LEVEL_DEFAULT_MT6630 4 - -#endif /* __MT6630_CUST_CFG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h deleted file mode 100644 index 868c1a89f..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __MT6630_FM_LIB_H__ -#define __MT6630_FM_LIB_H__ - -#include "fm_typedef.h" - -enum { - DSPPATCH = 0xFFF9, - USDELAY = 0xFFFA, - MSDELAY = 0xFFFB, - HW_VER = 0xFFFD, - POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */ - POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */ -}; - -enum { - FM_PUS_DSPPATCH = DSPPATCH, - FM_PUS_USDELAY = USDELAY, - FM_PUS_MSDELAY = MSDELAY, - FM_PUS_HW_VER = HW_VER, - FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */ - FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */ - FM_PUS_MAX -}; - -enum { - DSP_PATH = 0x02, - DSP_COEFF = 0x03, - DSP_HW_COEFF = 0x04 -}; - -enum IMG_TYPE { - IMG_WRONG = 0, - IMG_ROM, - IMG_PATCH, - IMG_COEFFICIENT, - IMG_HW_COEFFICIENT -}; - -enum { - mt6630_E1 = 0, - mt6630_E2 -}; - -struct mt6630_fm_cqi { - fm_u16 ch; - fm_u16 rssi; - fm_u16 reserve; -}; - -struct adapt_fm_cqi { - fm_s32 ch; - fm_s32 rssi; - fm_s32 reserve; -}; - -struct mt6630_full_cqi { - fm_u16 ch; - fm_u16 rssi; - fm_u16 pamd; - fm_u16 pr; - fm_u16 fpamd; - fm_u16 mr; - fm_u16 atdc; - fm_u16 prx; - fm_u16 atdev; - fm_u16 smg; /* soft-mute gain */ - fm_u16 drssi; /* delta rssi */ -}; - - -#endif diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h deleted file mode 100644 index c8e36184a..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef __MT6630_FM_REG_H__ -#define __MT6630_FM_REG_H__ - -enum MT6630_REG { - FM_MAIN_CG1_CTRL = 0x60, - FM_MAIN_CG2_CTRL = 0x61, - FM_MAIN_HWVER = 0x62, - FM_MAIN_CTRL = 0x63, - FM_CHANNEL_SET = 0x65, - FM_MAIN_CFG1 = 0x66, - FM_MAIN_CFG2 = 0x67, - FM_MAIN_MCLKDESENSE = 0x38, - FM_MAIN_INTR = 0x69, - FM_MAIN_INTRMASK = 0x6A, - FM_MAIN_EXTINTRMASK = 0x6B, - FM_RSSI_IND = 0x6C, - FM_RSSI_TH = 0x6D, - FM_MAIN_RESET = 0x6E, - FM_MAIN_CHANDETSTAT = 0x6F, - FM_RDS_CFG0 = 0x80, - FM_RDS_INFO = 0x81, - FM_RDS_DATA_REG = 0x82, - FM_RDS_GOODBK_CNT = 0x83, - FM_RDS_BADBK_CNT = 0x84, - FM_RDS_PWDI = 0x85, - FM_RDS_PWDQ = 0x86, - FM_RDS_FIFO_STATUS0 = 0x87, - FM_FT_CON9 = 0x8F, - FM_DSP_PATCH_CTRL = 0x90, - FM_DSP_PATCH_OFFSET = 0x91, - FM_DSP_PATCH_DATA = 0x92, - FM_DSP_MEM_CTRL4 = 0x93, - FM_ADDR_PAMD = 0xB4, - FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6, - FM_RDS_POINTER = 0xF0, -}; - -/* RDS_BDGRP_ABD_CTRL_REG */ -enum { - BDGRP_ABD_EN = 0x0001, - BER_RUN = 0x2000 -}; -#define FM_DAC_CON1 0x83 -#define FM_DAC_CON2 0x84 -#define FM_FT_CON0 0x86 -enum { - FT_EN = 0x0001 -}; - -#define FM_I2S_CON0 0x90 -enum { - I2S_EN = 0x0001, - FORMAT = 0x0002, - WLEN = 0x0004, - I2S_SRC = 0x0008 -}; - -/* FM_MAIN_CTRL */ -enum { - TUNE = 0x0001, - SEEK = 0x0002, - SCAN = 0x0004, - CQI_READ = 0x0008, - RDS_MASK = 0x0010, - MUTE = 0x0020, - RDS_BRST = 0x0040, - RAMP_DOWN = 0x0100, -}; - -/* FM_MAIN_INTR */ -enum { - FM_INTR_STC_DONE = 0x0001, - FM_INTR_IQCAL_DONE = 0x0002, - FM_INTR_DESENSE_HIT = 0x0004, - FM_INTR_CHNL_CHG = 0x0008, - FM_INTR_SW_INTR = 0x0010, - FM_INTR_RDS = 0x0020 -}; - -enum { - ANTENNA_TYPE = 0x0010, /* 0x61 D4, 0:long, 1:short */ - ANALOG_I2S = 0x0080, /* 0x61 D7, 0:lineout, 1:I2S */ - DE_EMPHASIS = 0x1000, /* 0x61 D12,0:50us, 1:75 us */ -}; - -#define OSC_FREQ_BITS 0x0070 /* 0x60 bit4~6 */ -#define OSC_FREQ_MASK (~OSC_FREQ_BITS) - -#endif /* __MT6630_FM_REG_H__ */ diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c deleted file mode 100644 index eedc201f7..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c +++ /dev/null @@ -1,1053 +0,0 @@ -/* mt6630_fm_cmd.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * Hongcheng <hongcheng.xia@MediaTek.com> - * - * MT6630 FM Radio Driver -- source file - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/kernel.h> -#include <linux/types.h> - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_rds.h" -#include "fm_config.h" -#include "fm_link.h" - -#include "mt6630_fm_reg.h" -/* #include "mt6630_fm_link.h" */ -#include "mt6630_fm.h" -#include "mt6630_fm_cmd.h" -#include "mt6630_fm_cust_cfg.h" - -extern fm_cust_cfg mt6630_fm_config; - -static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_WRITE_BASIC_OP; - buf[1] = FM_WRITE_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((value) & 0x00FF); - buf[4] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - - return (FM_WRITE_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_UDELAY_BASIC_OP; - buf[1] = FM_UDELAY_BASIC_OP_SIZE; - buf[2] = (fm_u8) ((value) & 0x000000FF); - buf[3] = (fm_u8) ((value >> 8) & 0x000000FF); - buf[4] = (fm_u8) ((value >> 16) & 0x000000FF); - buf[5] = (fm_u8) ((value >> 24) & 0x000000FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5]); - - return (FM_UDELAY_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_RD_UNTIL_BASIC_OP; - buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask) & 0x00FF); - buf[4] = (fm_u8) ((mask >> 8) & 0x00FF); - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_RD_UNTIL_BASIC_OP_SIZE + 2); -} - - -static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size) -{ - if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) { - return (-1); - } - - if (buf == NULL) { - return (-2); - } - - buf[0] = FM_MODIFY_BASIC_OP; - buf[1] = FM_MODIFY_BASIC_OP_SIZE; - buf[2] = addr; - buf[3] = (fm_u8) ((mask_and) & 0x00FF); - buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF); - buf[5] = (fm_u8) ((mask_or) & 0x00FF); - buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return (FM_MODIFY_BASIC_OP_SIZE + 2); -} - -/* - * mt6630_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - fm_u16 de_emphasis; - /* fm_u16 osc_freq; */ - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - de_emphasis = mt6630_fm_config.rx_cfg.deemphasis; /* MT6630fm_cust_config_fetch(FM_CFG_RX_DEEMPHASIS); */ - de_emphasis &= 0x0001; /* rang 0~1 */ - /* osc_freq = mt6630_fm_config.rx_cfg.osc_freq;//MT6628fm_cust_config_fetch(FM_CFG_RX_OSC_FREQ); */ - /* osc_freq &= 0x0007; //rang 0~5 */ - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* B1.1 Enable digital OSC */ - pkt_size += fm_bop_write(0x60, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3 */ - pkt_size += fm_bop_udelay(100, &buf[pkt_size], buf_size - pkt_size); /* delay 100us */ - /* B1.3 Release HW clock gating */ - pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 7 */ - /* B1.4 Set FM long/short antenna:1: short_antenna 0: long antenna(default) */ - pkt_size += fm_bop_modify(0x61, 0xFFEF, 0x0000, &buf[pkt_size], buf_size - pkt_size); - /* B1.5 Set audio output mode (lineout/I2S) 0:lineout, 1:I2S */ - if (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_ANALOG) { - pkt_size += - fm_bop_modify(0x61, 0xFF7F, 0x0000, &buf[pkt_size], buf_size - pkt_size); - } else { - pkt_size += - fm_bop_modify(0x61, 0xFF7F, 0x0080, &buf[pkt_size], buf_size - pkt_size); - } - /* B1.6 Set deemphasis setting */ - pkt_size += - fm_bop_modify(0x61, ~DE_EMPHASIS, (de_emphasis << 12), &buf[pkt_size], - buf_size - pkt_size); - - /* pkt_size += fm_bop_modify(0x60, OSC_FREQ_MASK, (osc_freq << 4), &buf[pkt_size], buf_size - pkt_size); */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6630_patch_download - Wholechip FM Power Up: step 3, download patch to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6630_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_PATCH_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - - -/* - * mt6630_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w, - * @buf - target buf - * @buf_size - buffer size - * @seg_num - total segments that this patch divided into - * @seg_id - No. of Segments: segment that will now be sent - * @src - patch source buffer - * @seg_len - segment size: segment that will now be sent - * return package size - */ -fm_s32 mt6630_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id, - const fm_u8 *src, fm_s32 seg_len) -{ - fm_s32 pkt_size = 0; - fm_u8 *dst = NULL; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_COEFF_DOWNLOAD_OPCODE; - pkt_size = 4; - - buf[pkt_size++] = seg_num; - buf[pkt_size++] = seg_id; - - if (seg_len > (buf_size - pkt_size)) { - return -1; - } - - dst = &buf[pkt_size]; - pkt_size += seg_len; - - /* copy patch to tx buffer */ - while (seg_len--) { - *dst = *src; - /* pr_debug("%02x ", *dst); */ - src++; - dst++; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - - return pkt_size; -} - -/* - * mt6630_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - //update FM ADPLL fast tracking mode gain - pkt_size += fm_bop_modify(0xF, 0xF800, 0x0455, &buf[pkt_size], buf_size - pkt_size); - /* F1.4 Set appropriate interrupt mask behavior as desired(RX) */ - /* pkt_size += fm_bop_write(0x6A, 0x0021, &buf[pkt_size], buf_size - pkt_size);//wr 6A 0021 */ - pkt_size += fm_bop_write(0x6B, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0021 */ - /* F1.9 Enable HW auto control */ - pkt_size += fm_bop_write(0x60, 0x000F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 f */ - /* F1.10 Release ASIP reset */ - pkt_size += fm_bop_modify(0x61, 0xFFFD, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D1=1 */ - /* F1.11 Enable ASIP power */ - pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D0=0 */ - pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */ - /* F1.13 Check HW intitial complete */ - pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6630_pwrdown - Wholechip FM Power down: Digital Modem Power Down - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_pwrdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* Disable HW clock control */ - pkt_size += fm_bop_write(0x60, 0x0107, &buf[pkt_size], buf_size - pkt_size); /* wr 60 107 */ - /* Reset ASIP */ - pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */ - /* digital core + digital rgf reset */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */ - /* Disable all clock */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - /* Reset rgfrf */ - pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */ - pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6630_rampdown - f/w will wait for STC_DONE interrupt - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_rampdown(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_RAMPDOWN_OPCODE; - pkt_size = 4; - - /* Clear DSP state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */ - /* Set DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */ - /* @Wait for STC_DONE interrupt@ */ - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Clear DSP ramp down state */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6630_tune - execute tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6630_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para) -{ - /* #define FM_TUNE_USE_POLL */ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* Set desired channel & channel parameter */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_write(0x6A, 0x0000, &buf[pkt_size], buf_size - pkt_size); - pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size); -#endif - pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* channel para setting, D15~D12, D15: ATJ, D13: HL, D12: FA */ - pkt_size += - fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size], - buf_size - pkt_size); - /* Enable hardware controlled tuning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - /* Wait for STC_DONE interrupt */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ -#endif - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6630_full_cqi_req - execute request cqi info action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 7600 ~ 10800, freq array - * @cnt - channel count - * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step - * - * return package size - */ -fm_s32 mt6630_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SOFT_MUTE_TUNE_OPCODE; - pkt_size = 4; - - switch (type) { - case 1: - buf[pkt_size] = 0x0001; - pkt_size++; - buf[pkt_size] = (fm_u8) ((*freq) & 0x00FF); - pkt_size++; - buf[pkt_size] = (fm_u8) ((*freq >> 8) & 0x00FF); - pkt_size++; - break; - case 2: - buf[pkt_size] = 0x0002; - pkt_size++; - break; - case 3: - buf[pkt_size] = 0x0003; - pkt_size++; - break; - case 4: - buf[pkt_size] = 0x0004; - pkt_size++; - break; - default: - buf[pkt_size] = (fm_u16) type; - pkt_size++; - break; - } - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6630_seek - execute seek action, - * @buf - target buf - * @buf_size - buffer size - * @seekdir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6630_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SEEK_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (seekdir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */ - /* 0x66[9:0] freq upper bound */ - - max_freq = (max_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - - min_freq = (min_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled seeking sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -/* - * mt6630_scan - execute scan action, - * @buf - target buf - * @buf_size - buffer size - * @scandir - 0=seek up, 1=seek down - * @space - step, 50KHz:001, 100KHz:010, 200KHz:100 - * @max_freq - upper bound - * @min_freq - lower bound - * return package size - */ -fm_s32 mt6630_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, - fm_u16 min_freq) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - /* Program seek direction */ - if (scandir == 0) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */ - } else { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */ - } - - /* Program scan channel spacing */ - if (space == 1) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */ - } else if (space == 2) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */ - } else if (space == 4) { - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */ - } - /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */ - pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */ - /* 0x66[9:0] freq upper bound */ - - max_freq = (max_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size); - /* 0x67[9:0] freq lower bound */ - - min_freq = (min_freq - 6400) * 2 / 10; - - pkt_size += - fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size); - /* Enable hardware controlled scanning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */ - /* Wait for STC_DONE interrupt */ - /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -fm_s32 mt6630_cqi_get(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_SCAN_OPCODE; - pkt_size = 4; - - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit0~2 0 */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, ~CQI_READ, CQI_READ, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit3 1 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - - -fm_s32 mt6630_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_READ_OPCODE; - buf[2] = 0x01; - buf[3] = 0x00; - buf[4] = addr; - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], - buf[4]); - return 5; -} - - -fm_s32 mt6630_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FSPI_WRITE_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = addr; - buf[5] = (fm_u8) ((value) & 0x00FF); - buf[6] = (fm_u8) ((value >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} - - -fm_s32 mt6630_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 pkt_size = 0; - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = 0x11; /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */ - pkt_size = 4; - pkt_size += fm_bop_modify(addr, mask, bits, &buf[pkt_size], buf_size - pkt_size); - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/*top register read*/ -fm_s32 mt6630_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = CSPI_READ_OPCODE; - buf[2] = 0x03; - buf[3] = 0x00; - buf[4] = 0x04; /* top 04,fm 02 */ - buf[5] = (fm_u8) ((addr) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 8) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6]); - return 7; -} - - -fm_s32 mt6630_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = CSPI_WRITE_OPCODE; - buf[2] = 0x07; - buf[3] = 0x00; - buf[4] = 0x04; /* top 04,fm 02 */ - buf[5] = (fm_u8) ((addr) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[7] = (fm_u8) ((value) & 0x00FF); - buf[8] = (fm_u8) ((value >> 8) & 0x00FF); - buf[9] = (fm_u8) ((value >> 16) & 0x00FF); - buf[10] = (fm_u8) ((value >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], - buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]); - return 11; -} - -/*host register read*/ -fm_s32 mt6630_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HOST_READ_OPCODE; - buf[2] = 0x04; - buf[3] = 0x00; - buf[4] = (fm_u8) ((addr) & 0x00FF); - buf[5] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 16) & 0x00FF); - buf[7] = (fm_u8) ((addr >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], buf[6], buf[7]); - return 8; -} - - -fm_s32 mt6630_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value) -{ - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_HOST_WRITE_OPCODE; - buf[2] = 0x08; - buf[3] = 0x00; - buf[4] = (fm_u8) ((addr) & 0x00FF); - buf[5] = (fm_u8) ((addr >> 8) & 0x00FF); - buf[6] = (fm_u8) ((addr >> 16) & 0x00FF); - buf[7] = (fm_u8) ((addr >> 24) & 0x00FF); - buf[8] = (fm_u8) ((value) & 0x00FF); - buf[9] = (fm_u8) ((value >> 8) & 0x00FF); - buf[10] = (fm_u8) ((value >> 16) & 0x00FF); - buf[11] = (fm_u8) ((value >> 24) & 0x00FF); - - WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], - buf[10], buf[11]); - return 12; -} - -/********************************Tx function***********************************************/ -/* - * mt6630_pwrup_clock_on_tx - FM tx Digital Clock enable - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_pwrup_clock_on_tx(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* B1.0 Enable digital OSC */ - pkt_size += fm_bop_write(0x60, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3 */ - pkt_size += fm_bop_udelay(100, &buf[pkt_size], buf_size - pkt_size); /* delay 100us */ - /* B1.2 Release HW clock gating */ - pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 7 */ - if (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_ANALOG) { - pkt_size += - fm_bop_modify(0x61, 0xFF7F, 0x0000, &buf[pkt_size], buf_size - pkt_size); - } else { - pkt_size += - fm_bop_modify(0x61, 0xFF7F, 0x0080, &buf[pkt_size], buf_size - pkt_size); - } - /* B1.4 set TX mode: 0909 sequence */ - pkt_size += fm_bop_write(0xC7, 0x8286, &buf[pkt_size], buf_size - pkt_size); /* wr C7 8286 */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6630_pwrup_tx_deviation - default deviation (RDS off) - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_pwrup_tx_deviation(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_ENABLE_OPCODE; - pkt_size = 4; - - /* A1 switch to host control */ - pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0007 */ - /* set rgf_tx_beta_sum */ - pkt_size += fm_bop_write(0xCD, 0x72D2, &buf[pkt_size], buf_size - pkt_size); /* wr CD 72D2 */ - /* set rgf_tx_beta_diff */ - pkt_size += fm_bop_write(0xCF, 0x787B, &buf[pkt_size], buf_size - pkt_size); /* wr CF 787B */ - /* set rgf_tx_beta_rds */ - pkt_size += fm_bop_write(0xCE, 0x0785, &buf[pkt_size], buf_size - pkt_size); /* wr CE 785 */ - /* set rgf_tx_beta_pilot */ - pkt_size += fm_bop_write(0xCC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr CC 0 */ - /* set rgf_phase_gen_rsh */ - pkt_size += fm_bop_modify(0xAD, 0xFFE8, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr AD D4 D2:D0=1 */ - /* set rgf_phase_gen_wb */ - pkt_size += fm_bop_modify(0xA8, 0xF000, 0x0F16, &buf[pkt_size], buf_size - pkt_size); /* wr A8 D11:D0=F16 */ - /* set agc */ - pkt_size += fm_bop_modify(0xAE, 0xFC00, 0x020B, &buf[pkt_size], buf_size - pkt_size); /* wr AE D9:D0=20B */ - /* set rgf_beta_fm */ - pkt_size += fm_bop_write(0xEE, 0x623D, &buf[pkt_size], buf_size - pkt_size); /* wr EE 623D */ - /* switch to DSP control */ - pkt_size += fm_bop_write(0x60, 0x000F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 000F */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6630_tx_rdsoff_deviation - deviation (RDS on) - * @buf - target buf - * @buf_size - buffer size - * return package size - */ -fm_s32 mt6630_tx_rdson_deviation(fm_u8 *buf, fm_s32 buf_size) -{ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = RDS_TX_OPCODE; - pkt_size = 4; - - /* A1 switch to host control */ - pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0007 */ - /* set rgf_tx_beta_sum */ - pkt_size += fm_bop_write(0xCD, 0x70E3, &buf[pkt_size], buf_size - pkt_size); /* wr CD 70E3 */ - /* set rgf_tx_beta_diff */ - pkt_size += fm_bop_write(0xCF, 0x7675, &buf[pkt_size], buf_size - pkt_size); /* wr CF 7675 */ - /* set rgf_tx_beta_rds:0909 sequence */ - pkt_size += fm_bop_write(0xCC, 0x0227, &buf[pkt_size], buf_size - pkt_size); /* wr CC 227 */ - /* set rgf_tx_beta_pilot :0909 sequence */ - pkt_size += fm_bop_write(0xCE, 0x0764, &buf[pkt_size], buf_size - pkt_size); /* wr CE 764 */ - /* set rgf_phase_gen_rsh */ - pkt_size += fm_bop_modify(0xAD, 0xFFEF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr AD D4 =0 */ - pkt_size += fm_bop_modify(0xAD, 0xFFF8, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr AD D2:D0=1 */ - /* set rgf_phase_gen_wb */ - pkt_size += fm_bop_modify(0xA8, 0xF000, 0x0222, &buf[pkt_size], buf_size - pkt_size); /* wr A8 D11:D0=222 */ - /* set agc */ - pkt_size += fm_bop_modify(0xAE, 0xFC00, 0x0203, &buf[pkt_size], buf_size - pkt_size); /* wr AE D9:D0=203 */ - /* set rgf_beta_fm */ - pkt_size += fm_bop_write(0xEE, 0x63EB, &buf[pkt_size], buf_size - pkt_size); /* wr EE 63EB */ - /* switch to DSP control */ - pkt_size += fm_bop_write(0x60, 0x000F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 000F */ - - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* - * mt6630_tune_tx - execute tx tune action, - * @buf - target buf - * @buf_size - buffer size - * @freq - 760 ~ 1080, 100KHz unit - * return package size - */ -fm_s32 mt6630_tune_tx(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para) -{ - /* #define FM_TUNE_USE_POLL */ - fm_s32 pkt_size = 0; - - if (buf_size < TX_BUF_SIZE) { - return (-1); - } - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - freq = (freq - 6400) * 2 / 10; - - buf[0] = FM_TASK_COMMAND_PKT_TYPE; - buf[1] = FM_TUNE_OPCODE; - pkt_size = 4; - - /* Set desired channel & channel parameter */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size); -#endif - /* sequence 09/16:0x65 D12=1 for iq switch */ - pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xEC00, freq | 0x1000, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */ - /* set iq switch, D12 */ - /* pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size], buf_size - pkt_size); */ - /* Enable hardware controlled tuning sequence */ - pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */ - /* Wait for STC_DONE interrupt */ -#ifdef FM_TUNE_USE_POLL - pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */ - /* Write 1 clear the STC_DONE interrupt status flag */ - pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */ -#endif - buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} - -/* -pi: pi code -ps: block B,C,D -other_rds: unused -other_rds_cnt: unused -*/ -fm_s32 mt6630_rds_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, - fm_u8 other_rds_cnt) -{ - fm_s32 pkt_size = 0; - fm_s32 i; - - if (tx_buf_size < TX_BUF_SIZE) { - return (-1); - } - - tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE; - tx_buf[1] = RDS_TX_OPCODE; - pkt_size = 4; - - /* set repeat mode */ - pkt_size += fm_bop_modify(0x88, 0xFFFE, 0x0001, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[0] = b'1, repeat mode */ - pkt_size += fm_bop_modify(0x88, 0xFFFB, 0x0004, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[2] = b'1, PI_reg mode */ - pkt_size += fm_bop_write(0x8A, pi, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* write PI to PI_reg */ - - pkt_size += fm_bop_modify(0x88, 0xFFFD, 0x0002, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[1] = b'1, addr from host */ - for (i = 0; i < 12; i++) { - pkt_size += fm_bop_write(0x8B, (0x0063 + i), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* 8B = mem_addr */ - pkt_size += fm_bop_write(0x8C, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* 8C = RDS Tx data */ - } - pkt_size += fm_bop_modify(0x88, 0xFFFD, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[1] = b'0, clear mem_addr */ - pkt_size += fm_bop_modify(0x88, 0xFFEF, 0x0010, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[4] = b'1, switch to ps buf */ - /* work around: write at leat one group to normal buffer, otherwise ps buffer can be sent out. */ - pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size); - pkt_size += fm_bop_modify(0x88, 0xFFDF, 0x0020, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[5] = b'1,clear in_ptr */ - pkt_size += fm_bop_modify(0x88, 0xFFDF, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[5] = b'0,clear in_ptr */ - - tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF); - tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF); - - return pkt_size; -} diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c deleted file mode 100644 index ed000697a..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c +++ /dev/null @@ -1,204 +0,0 @@ -/* mt6630_fm_config.c - * - * (C) Copyright 2011 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/string.h> -#include <linux/slab.h> - -#include "fm_typedef.h" -#include "fm_rds.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_config.h" -/* #include "fm_cust_cfg.h" */ -#include "mt6630_fm_cust_cfg.h" -fm_cust_cfg mt6630_fm_config; -/* static fm_s32 fm_index = 0; */ - -static fm_s32 MT6630fm_cust_config_print(fm_cust_cfg *cfg) -{ - WCN_DBG(FM_NTC | MAIN, "MT6630 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 mr_th:\t%d\n", cfg->rx_cfg.mr_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 prx_th:\t%d\n", cfg->rx_cfg.prx_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th); - WCN_DBG(FM_NTC | MAIN, "MT6630 smg_th:\t%d\n", cfg->rx_cfg.smg_th); - WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis); - WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq); - - WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path, - cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode, - cfg->aud_cfg.i2s_info.rate); - return 0; -} - -static fm_s32 MT6630cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg; - - if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6630", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */ - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6630", - &rx_cfg->short_ana_rssi_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6630", - &rx_cfg->desene_rssi_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6630", &rx_cfg->pamd_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6630", &rx_cfg->mr_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6630", &rx_cfg->atdc_th))) { - return ret; - } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6630", &rx_cfg->prx_th))) { - return ret; - } - /*else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDEV_TH_MT6630", &rx_cfg->atdev_th))) - { - return ret; - } */ - else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6630", &rx_cfg->smg_th))) { - return ret; - } else if (0 <= - (ret = - cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6630", &rx_cfg->deemphasis))) { - return ret; - } else if (0 <= - (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6630", &rx_cfg->osc_freq))) { - return ret; - } else { - WCN_DBG(FM_WAR | MAIN, "MT6630 invalid key\n"); - return -1; - } -} - -static fm_s32 MT6630fm_cust_config_default(fm_cust_cfg *cfg) -{ - FMR_ASSERT(cfg); - - cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6630; - cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6630; - cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6630; - cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6630; - cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6630; - cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6630; - cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6630; - cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6630; - cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6630; - cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6630; - - cfg->tx_cfg.pamd_th = FM_TX_PAMD_TH_MT6630; - cfg->tx_cfg.mr_th = FM_TX_MR_TH_MT6630; - cfg->tx_cfg.smg_th = FM_TX_SMG_TH_MT6630; - -#ifdef CONFIG_MTK_MERGE_INTERFACE_SUPPORT - cfg->aud_cfg.aud_path = FM_AUD_MRGIF; - cfg->aud_cfg.i2s_info.status = FM_I2S_OFF; - cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - cfg->aud_cfg.i2s_info.rate = FM_I2S_44K; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO; -#elif defined FM_DIGITAL_INPUT - cfg->aud_cfg.aud_path = FM_AUD_I2S; - cfg->aud_cfg.i2s_info.status = FM_I2S_OFF; - cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - cfg->aud_cfg.i2s_info.rate = FM_I2S_44K; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO; -#elif defined FM_ANALOG_INPUT - cfg->aud_cfg.aud_path = FM_AUD_ANALOG; - cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR; - cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR; -#else - cfg->aud_cfg.aud_path = FM_AUD_ERR; - cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR; - cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR; - cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR; - cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR; -#endif - - return 0; -} - -static fm_s32 MT6630fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg) -{ - fm_s32 ret = 0; - fm_s8 *buf = NULL; - fm_s32 file_len = 0; - - if (!(buf = fm_zalloc(4096))) { - WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n"); - return -ENOMEM; - } -/* fm_index = 0; */ - - file_len = fm_file_read(filename, buf, 4096, 0); - - if (file_len <= 0) { - ret = -1; - goto out; - } - - ret = cfg_parser(buf, MT6630cfg_item_handler, cfg); - - out: - - if (buf) { - fm_free(buf); - } - - return ret; -} - -#define MT6630_FM_CUST_CFG_PATH "etc/fmr/mt6630_fm_cust.cfg" -fm_s32 MT6630fm_cust_config_setup(const fm_s8 *filepath) -{ - fm_s32 ret = 0; - fm_s8 *filep = NULL; - fm_s8 file_path[51] = { 0 }; - - MT6630fm_cust_config_default(&mt6630_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6630 FM default config\n"); - MT6630fm_cust_config_print(&mt6630_fm_config); - - if (!filepath) { - filep = MT6630_FM_CUST_CFG_PATH; - } else { - memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath)); - filep = file_path; - trim_path(&filep); - } - - ret = MT6630fm_cust_config_file(filep, &mt6630_fm_config); - WCN_DBG(FM_NTC | MAIN, "MT6630 FM cust config\n"); - MT6630fm_cust_config_print(&mt6630_fm_config); - - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c deleted file mode 100644 index 031e805c4..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c +++ /dev/null @@ -1,2343 +0,0 @@ -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/vmalloc.h> - -#include "stp_exp.h" -#include "wmt_exp.h" - -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_patch.h" -#include "fm_utils.h" -#include "fm_link.h" -#include "fm_config.h" -#include "fm_private.h" - -#include "mt6630_fm_reg.h" -#include "mt6630_fm.h" -#include "mt6630_fm_lib.h" -#include "mt6630_fm_cmd.h" -#include "mt6630_fm_cust_cfg.h" -extern fm_cust_cfg mt6630_fm_config; - -static struct fm_patch_tbl mt6630_patch_tbl[5] = { - {FM_ROM_V1, "/etc/firmware/mt6630/mt6630_fm_v1_patch.bin", - "/etc/firmware/mt6630/mt6630_fm_v1_coeff.bin", NULL, NULL}, - {FM_ROM_V2, "/etc/firmware/mt6630/mt6630_fm_v2_patch.bin", - "/etc/firmware/mt6630/mt6630_fm_v2_coeff.bin", NULL, NULL}, - {FM_ROM_V3, "/etc/firmware/mt6630/mt6630_fm_v3_patch.bin", - "/etc/firmware/mt6630/mt6630_fm_v3_coeff.bin", NULL, NULL}, - {FM_ROM_V4, "/etc/firmware/mt6630/mt6630_fm_v4_patch.bin", - "/etc/firmware/mt6630/mt6630_fm_v4_coeff.bin", NULL, NULL}, - {FM_ROM_V5, "/etc/firmware/mt6630/mt6630_fm_v5_patch.bin", - "/etc/firmware/mt6630/mt6630_fm_v5_coeff.bin", NULL, NULL}, -}; - -static struct fm_patch_tbl mt6630_patch_tbl_tx[5] = { - {FM_ROM_V1, "/etc/firmware/mt6630/mt6630_fm_v1_patch_tx.bin", - "/etc/firmware/mt6630/mt6630_fm_v1_coeff_tx.bin", NULL, NULL}, - {FM_ROM_V2, "/etc/firmware/mt6630/mt6630_fm_v2_patch_tx.bin", - "/etc/firmware/mt6630/mt6630_fm_v2_coeff_tx.bin", NULL, NULL}, - {FM_ROM_V3, "/etc/firmware/mt6630/mt6630_fm_v3_patch_tx.bin", - "/etc/firmware/mt6630/mt6630_fm_v3_coeff_tx.bin", NULL, NULL}, - {FM_ROM_V4, "/etc/firmware/mt6630/mt6630_fm_v4_patch_tx.bin", - "/etc/firmware/mt6630/mt6630_fm_v4_coeff_tx.bin", NULL, NULL}, - {FM_ROM_V5, "/etc/firmware/mt6630/mt6630_fm_v5_patch_tx.bin", - "/etc/firmware/mt6630/mt6630_fm_v5_coeff_tx.bin", NULL, NULL}, -}; - -static struct fm_hw_info mt6630_hw_info = { - .chip_id = 0x00006630, - .eco_ver = 0x00000000, - .rom_ver = 0x00000000, - .patch_ver = 0x00000000, - .reserve = 0x00000000, -}; - -#define PATCH_SEG_LEN 512 - -static fm_u8 *cmd_buf; -static struct fm_lock *cmd_buf_lock; -static struct fm_callback *fm_cb_op; -static struct fm_res_ctx *mt6630_res; -static fm_u8 fm_packaging = 1; /*0:QFN,1:WLCSP */ -static fm_u32 fm_sant_flag; /* 1,Short Antenna; 0, Long Antenna */ -static fm_s32 mt6630_is_dese_chan(fm_u16 freq); -#if 0 -static fm_s32 mt6630_mcu_dese(fm_u16 freq, void *arg); -#endif -static fm_s32 mt6630_gps_dese(fm_u16 freq, void *arg); - -static fm_s32 mt6630_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample); -static fm_u16 mt6630_chan_para_get(fm_u16 freq); -static fm_s32 mt6630_desense_check(fm_u16 freq, fm_s32 rssi); -static fm_bool mt6630_TDD_chan_check(fm_u16 freq); -static fm_s32 mt6630_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid); -static fm_s32 mt6630_pwron(fm_s32 data) -{ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) { - FM_LOG_ERR(FM_ERR | CHIP, "WMT turn on FM Fail!\n"); - return -FM_ELINK; - } else { - FM_LOG_NTC(FM_NTC | CHIP, "WMT turn on FM OK!\n"); - return 0; - } -} - -static fm_s32 mt6630_pwroff(fm_s32 data) -{ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) { - FM_LOG_ERR(FM_ERR | CHIP, "WMT turn off FM Fail!\n"); - return -FM_ELINK; - } else { - FM_LOG_NTC(FM_NTC | CHIP, "WMT turn off FM OK!\n"); - return 0; - } -} - -static fm_s32 Delayms(fm_u32 data) -{ - FM_LOG_DBG(FM_DBG | CHIP, "delay %dms\n", data); - msleep(data); - return 0; -} - -static fm_s32 Delayus(fm_u32 data) -{ - FM_LOG_DBG(FM_DBG | CHIP, "delay %dus\n", data); - udelay(data); - return 0; -} - -fm_s32 mt6630_get_read_result(struct fm_res_ctx *result) -{ - FMR_ASSERT(result); - mt6630_res = result; - - return 0; -} - -static fm_s32 mt6630_read(fm_u8 addr, fm_u16 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6630_get_read_result); - - if (!ret && mt6630_res) { - *val = mt6630_res->fspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6630_write(fm_u8 addr, fm_u16 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6630_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_set_bits_reg(cmd_buf, TX_BUF_SIZE, addr, bits, mask); - ret = fm_cmd_tx(cmd_buf, pkt_size, (1 << 0x11), SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */ - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6630_host_read(fm_u32 addr, fm_u32 *val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_host_get_reg(cmd_buf, TX_BUF_SIZE, addr); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_READ, SW_RETRY_CNT, FSPI_RD_TIMEOUT, - mt6630_get_read_result); - - if (!ret && mt6630_res) { - *val = mt6630_res->cspi_rd; - } - - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_s32 mt6630_host_write(fm_u32 addr, fm_u32 val) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_host_set_reg(cmd_buf, TX_BUF_SIZE, addr, val); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_WRITE, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -static fm_u16 mt6630_get_chipid(void) -{ - return 0x6630; -} - -/* MT6630_SetAntennaType - set Antenna type - * @type - 1,Short Antenna; 0, Long Antenna - */ -static fm_s32 mt6630_SetAntennaType(fm_s32 type) -{ - fm_u16 dataRead; - - FM_LOG_NTC(FM_NTC | CHIP, "set ana to %s\n", type ? "short" : "long"); - if (fm_packaging == 0) { - fm_sant_flag = type; - } else { - mt6630_read(FM_MAIN_CG2_CTRL, &dataRead); - - if (type) { - dataRead |= ANTENNA_TYPE; - } else { - dataRead &= (~ANTENNA_TYPE); - } - - mt6630_write(FM_MAIN_CG2_CTRL, dataRead); - } - return 0; -} - -static fm_s32 mt6630_GetAntennaType(void) -{ - fm_u16 dataRead; - - if (fm_packaging == 0) { - return fm_sant_flag; - } else { - mt6630_read(FM_MAIN_CG2_CTRL, &dataRead); - FM_LOG_NTC(FM_NTC | CHIP, "get ana type: %s\n", - (dataRead & ANTENNA_TYPE) ? "short" : "long"); - - if (dataRead & ANTENNA_TYPE) - return FM_ANA_SHORT; /* short antenna */ - else - return FM_ANA_LONG; /* long antenna */ - } -} - - -static fm_s32 mt6630_Mute(fm_bool mute) -{ - fm_s32 ret = 0; - fm_u16 dataRead; - - FM_LOG_NTC(FM_NTC | CHIP, "set %s\n", mute ? "mute" : "unmute"); - mt6630_read(FM_MAIN_CTRL, &dataRead); - - if (mute == 1) - { - ret = mt6630_write(FM_MAIN_CTRL, (dataRead&0xFFDF) | 0x0020); - } - else - { - ret = mt6630_write(FM_MAIN_CTRL, (dataRead&0xFFDF)); - } - return ret; -} - -static fm_s32 mt6630_RampDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - /* fm_u16 tmp; */ - - FM_LOG_NTC(FM_NTC | CHIP, "ramp down\n"); - - ret = mt6630_write(FM_MAIN_EXTINTRMASK, 0x0000); - if (ret) { - FM_LOG_ERR(FM_ERR |CHIP, "ramp down write FM_MAIN_EXTINTRMASK failed\n"); - return ret; - } - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_rampdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(FM_ERR |CHIP, "ramp down failed\n"); - return ret; - } - - ret = mt6630_write(FM_MAIN_EXTINTRMASK, 0x0021); - if (ret) { - FM_LOG_ERR(FM_ERR |CHIP, "ramp down write FM_MAIN_EXTINTRMASK failed\n"); - } - - return ret; -} - -static fm_s32 mt6630_get_rom_version(void) -{ - fm_u16 tmp; - fm_s32 ret; - - /* DSP rom code version request enable --- set 0x61 b15=1 */ - mt6630_set_bits(0x61, 0x8000, 0x7FFF); - - /* Release ASIP reset --- set 0x61 b1=1 */ - mt6630_set_bits(0x61, 0x0002, 0xFFFD); - - /* Enable ASIP power --- set 0x61 b0=0 */ - mt6630_set_bits(0x61, 0x0000, 0xFFFE); - - /* Wait DSP code version ready --- wait 1ms */ - do { - Delayus(1000); - ret = mt6630_read(0x84, &tmp); - /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */ - /* now cancel FM power up sequence is recommended. */ - if (ret) { - return ret; - } - FM_LOG_DBG(FM_DBG |CHIP, "0x84=%x\n", tmp); - } while (tmp != 0x0001); - - /* Get FM DSP code version --- rd 0x83[15:8] */ - mt6630_read(0x83, &tmp); - FM_LOG_NTC(FM_NTC | CHIP, "DSP ver=0x%x\n", tmp); - tmp = (tmp >> 8); - - /* DSP rom code version request disable --- set 0x61 b15=0 */ - mt6630_set_bits(0x61, 0x0000, 0x7FFF); - - /* Reset ASIP --- set 0x61[1:0] = 1 */ - mt6630_set_bits(0x61, 0x0001, 0xFFFC); - - /* FM_LOG_NTC(CHIP, "ROM version: v%d\n", (fm_s32)tmp); */ - return (fm_s32) tmp; -} - -static fm_s32 mt6630_get_patch_path(fm_s32 ver, const fm_s8 **ppath, - struct fm_patch_tbl *patch_tbl) -{ - fm_s32 i; - fm_s32 max = FM_ROM_MAX; - - /* check if the ROM version is defined or not */ - for (i = 0; i < max; i++) { - if ((patch_tbl[i].idx == ver) && (fm_file_exist(patch_tbl[i].patch) == 0)) { - *ppath = patch_tbl[i].patch; - FM_LOG_NTC(FM_NTC | CHIP, "Get ROM version OK\n"); - return 0; - } - } - - /* the ROM version isn't defined, find a latest patch instead */ - for (i = max; i > 0; i--) { - if (fm_file_exist(patch_tbl[i - 1].patch) == 0) { - *ppath = patch_tbl[i - 1].patch; - FM_LOG_ERR(FM_ERR | CHIP, "undefined ROM version\n"); - return 0; - } - } - - /* get path failed */ - FM_LOG_ERR(FM_ERR | CHIP, "No valid patch file\n"); - return -FM_EPATCH; -} - - -static fm_s32 mt6630_get_coeff_path(fm_s32 ver, const fm_s8 **ppath, - struct fm_patch_tbl *patch_tbl) -{ - fm_s32 i; - fm_s32 max = FM_ROM_MAX; - - /* check if the ROM version is defined or not */ - for (i = 0; i < max; i++) { - if ((patch_tbl[i].idx == ver) && (fm_file_exist(patch_tbl[i].coeff) == 0)) { - *ppath = patch_tbl[i].coeff; - FM_LOG_NTC(FM_NTC | CHIP, "Get ROM version OK\n"); - return 0; - } - } - - - /* the ROM version isn't defined, find a latest patch instead */ - for (i = max; i > 0; i--) { - if (fm_file_exist(patch_tbl[i - 1].coeff) == 0) { - *ppath = patch_tbl[i - 1].coeff; - FM_LOG_ERR(FM_ERR | CHIP, "undefined ROM version\n"); - return 1; - } - } - - /* get path failed */ - FM_LOG_ERR(FM_ERR | CHIP, "No valid coeff file\n"); - return -FM_EPATCH; -} - -/* -* mt6630_DspPatch - DSP download procedure -* @img - source dsp bin code -* @len - patch length in byte -* @type - rom/patch/coefficient/hw_coefficient -*/ -static fm_s32 mt6630_DspPatch(const fm_u8 *img, fm_s32 len, enum IMG_TYPE type) -{ - fm_u8 seg_num; - fm_u8 seg_id = 0; - fm_s32 seg_len; - fm_s32 ret = 0; - fm_u16 pkt_size; - - FMR_ASSERT(img); - - if (len <= 0) { - return -1; - } - - seg_num = len / PATCH_SEG_LEN + 1; - FM_LOG_NTC(FM_NTC | CHIP, "binary len:%d, seg num:%d\n", len, seg_num); - - switch (type) { -#if 0 - case IMG_ROM: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - FM_LOG_NTC(CHIP, "rom,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6630_rom_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - FM_LOG_NTC(CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_ROM, SW_RETRY_CNT, ROM_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(CHIP, "mt6630_rom_download failed\n"); - return ret; - } - } - - break; -#endif - case IMG_PATCH: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - FM_LOG_NTC(FM_NTC | CHIP, "patch,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6630_patch_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - FM_LOG_NTC(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_PATCH, SW_RETRY_CNT, PATCH_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_patch_download failed\n"); - return ret; - } - } - - break; -#if 0 - case IMG_HW_COEFFICIENT: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - FM_LOG_NTC(CHIP, "hwcoeff,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6630_hwcoeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - FM_LOG_NTC(CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_HWCOEFF, SW_RETRY_CNT, - HWCOEFF_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(CHIP, "mt6630_hwcoeff_download failed\n"); - return ret; - } - } - - break; -#endif - case IMG_COEFFICIENT: - - for (seg_id = 0; seg_id < seg_num; seg_id++) { - seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN); - FM_LOG_NTC(FM_NTC | CHIP, "coeff,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = - mt6630_coeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id, - &img[seg_id * PATCH_SEG_LEN], seg_len); - FM_LOG_NTC(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_COEFF, SW_RETRY_CNT, COEFF_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_coeff_download failed\n"); - return ret; - } - } - - break; - default: - break; - } - - return 0; -} - -static fm_s32 mt6630_pwrup_top_setting(void) -{ - fm_s32 ret = 0, value = 0; - /* A0.1 Turn on FM buffer */ - ret = mt6630_host_read(0x8102123c, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x8102123c, value & 0xFFFFFFBF); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c wr failed\n"); - return ret; - } - /* A0.2 Set xtal no off when FM on */ - ret = mt6630_host_read(0x81021134, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81021134, value | 0x80); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 wr failed\n"); - return ret; - } - /* A0.3 Set top off always on when FM on */ - ret = mt6630_host_read(0x81020010, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81020010, value & 0xFFFDFFFF); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 wr failed\n"); - return ret; - } - /* A0.4 Always enable PALDO when FM on */ - ret = mt6630_host_read(0x81021430, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81021430, value | 0x80000000); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 wr failed\n"); - return ret; - } - /* A0.5 */ - Delayus(240); - - /* A0.6 MTCMOS Control */ - ret = mt6630_host_read(0x81020008, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81020008, value | 0x00000030); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n"); - return ret; - } - /* A0.7 */ - Delayus(20); - - /* A0.8 release power on reset */ - ret = mt6630_host_read(0x81020008, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81020008, value | 0x00000001); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n"); - return ret; - } - /* A0.9 enable fspi_mas_bclk_ck */ - ret = mt6630_host_read(0x80000108, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x80000108 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x80000108, value | 0x00000100); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x80000108 wr failed\n"); - return ret; - } - return ret; -} - -static fm_s32 mt6630_pwrdown_top_setting(void) -{ - fm_s32 ret = 0, value = 0; - /* B0.1 disable fspi_mas_bclk_ck */ - ret = mt6630_host_read(0x80000104, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x80000104 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x80000104, value | 0x00000100); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x80000104 wr failed\n"); - return ret; - } - /* B0.2 set power off reset */ - ret = mt6630_host_read(0x81020008, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81020008, value & 0xFFFFFFFE); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n"); - return ret; - } - /* B0.3 */ - Delayus(20); - - /* B0.4 disable MTCMOS & set Iso_en */ - ret = mt6630_host_read(0x81020008, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81020008, value & 0xFFFFFFEF); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n"); - return ret; - } - /* B0.5 Turn off FM buffer */ - ret = mt6630_host_read(0x8102123c, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x8102123c, value | 0x40); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c wr failed\n"); - return ret; - } - /* B0.6 Clear xtal no off when FM off */ - ret = mt6630_host_read(0x81021134, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81021134, value & 0xFFFFFF7F); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 wr failed\n"); - return ret; - } - /* B0.7 Clear top off always on when FM off */ - ret = mt6630_host_read(0x81020010, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81020010, value | 0x20000); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 wr failed\n"); - return ret; - } - /* B0.9 Disable PALDO when FM off */ - ret = mt6630_host_read(0x81021430, &value); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 rd failed\n"); - return ret; - } - ret = mt6630_host_write(0x81021430, value & 0x7FFFFFFF); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 wr failed\n"); - return ret; - } - - return ret; -} - -static fm_s32 mt6630_pwrup_DSP_download(struct fm_patch_tbl *patch_tbl) -{ -#define PATCH_BUF_SIZE 4096*6 - fm_s32 ret = 0; - const fm_s8 *path_patch = NULL; - const fm_s8 *path_coeff = NULL; - fm_s32 patch_len = 0; - fm_u8 *dsp_buf = NULL; - fm_u16 tmp_reg = 0; - - mt6630_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get(); - FM_LOG_NTC(CHIP, "ECO version:0x%08x\n", mt6630_hw_info.eco_ver); - mt6630_hw_info.eco_ver += 1; - - /* FM ROM code version request */ - if ((ret = mt6630_get_rom_version()) >= 0) { - mt6630_hw_info.rom_ver = ret; - FM_LOG_NTC(FM_NTC | CHIP, "ROM version: v%d\n", mt6630_hw_info.rom_ver); - } else { - FM_LOG_ERR(FM_ERR | CHIP, "get ROM version failed\n"); - /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */ - /* now cancel FM power up sequence is recommended. */ - return ret; - } - - /* Wholechip FM Power Up: step 3, download patch */ - if (!(dsp_buf = fm_vmalloc(PATCH_BUF_SIZE))) { - FM_LOG_ERR(FM_ERR | CHIP, "-ENOMEM\n"); - return -ENOMEM; - } - - ret = mt6630_get_patch_path(mt6630_hw_info.rom_ver, &path_patch, patch_tbl); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " mt6630_get_patch_path failed\n"); - goto out; - } - patch_len = fm_file_read(path_patch, dsp_buf, PATCH_BUF_SIZE, 0); - ret = mt6630_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_PATCH); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " DL DSPpatch failed\n"); - goto out; - } - - ret = mt6630_get_coeff_path(mt6630_hw_info.rom_ver, &path_coeff, patch_tbl); - if (ret == -FM_EPATCH) { - FM_LOG_ERR(FM_ERR | CHIP, " mt6630_get_coeff_path failed\n"); - goto out; - } - patch_len = fm_file_read(path_coeff, dsp_buf, PATCH_BUF_SIZE, 0); - - mt6630_hw_info.rom_ver += 1; - - tmp_reg = dsp_buf[38] | (dsp_buf[39] << 8); /* to be confirmed */ - mt6630_hw_info.patch_ver = (fm_s32) tmp_reg; - FM_LOG_NTC(FM_NTC | CHIP, "Patch version: 0x%08x\n", mt6630_hw_info.patch_ver); - - if (ret == 1) { - dsp_buf[4] = 0x00; /* if we found rom version undefined, we should disable patch */ - dsp_buf[5] = 0x00; - } - - ret = mt6630_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_COEFFICIENT); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, " DL DSPcoeff failed\n"); - goto out; - } - mt6630_write(0x90, 0x0040); - mt6630_write(0x90, 0x0000); - out: - if (dsp_buf) { - fm_vfree(dsp_buf); - dsp_buf = NULL; - } - return ret; -} - -static fm_s32 mt6630_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) -{ - fm_s32 ret = 0, reg = 0; - fm_u16 pkt_size; - fm_u16 tmp_reg = 0; - - FMR_ASSERT(chip_id); - FMR_ASSERT(device_id); - - FM_LOG_DBG(FM_DBG | CHIP, "pwr on seq......\n"); - - ret = mt6630_host_read(0x80021010, ®); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "packaging rd failed\n"); - } else { - fm_packaging = (reg & 0x00008000) >> 15; - FM_LOG_NTC(FM_NTC | CHIP, "fm_packaging: %d\n", fm_packaging); - } - ret = mt6630_pwrup_top_setting(); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_top_setting failed\n"); - return ret; - } - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_pwrup_clock_on(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_clock_on failed\n"); - return ret; - } - /* read HW version */ - mt6630_read(0x62, &tmp_reg); - *chip_id = tmp_reg; - *device_id = tmp_reg; - mt6630_hw_info.chip_id = (fm_s32) tmp_reg; - FM_LOG_NTC(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg); - - if (mt6630_hw_info.chip_id != 0x6630) { - FM_LOG_NTC(FM_NTC | CHIP, "fm sys error!\n"); - return (-FM_EPARA); - } - ret = mt6630_pwrup_DSP_download(mt6630_patch_tbl); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_DSP_download failed\n"); - return ret; - } - - if ((mt6630_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF) - || (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) { - mt6630_I2s_Setting(FM_I2S_ON, mt6630_fm_config.aud_cfg.i2s_info.mode, - mt6630_fm_config.aud_cfg.i2s_info.rate); - /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */ - mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) CMB_STUB_AIF_2); - } - /* Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_pwrup_digital_init(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_digital_init failed\n"); - return ret; - } - - FM_LOG_NTC(FM_NTC | CHIP, "pwr on seq ok\n"); - - return ret; -} - -static fm_s32 mt6630_PowerDown(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 dataRead; - - FM_LOG_DBG(FM_DBG | CHIP, "pwr down seq\n"); - /*SW work around for MCUFA issue. - *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well. - * In case read interrupt, and clean if interrupt found before rampdown. - */ - mt6630_read(FM_MAIN_INTR, &dataRead); - - if (dataRead & 0x1) { - mt6630_write(FM_MAIN_INTR, dataRead); /* clear status flag */ - } - - //mt6630_RampDown(); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_pwrdown(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrdown failed\n"); - return ret; - } - - ret = mt6630_pwrdown_top_setting(); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrdown_top_setting failed\n"); - return ret; - } - - return ret; -} - -/* just for dgb */ -static fm_bool mt6630_SetFreq(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 chan_para = 0; - - fm_cb_op->cur_freq_set(freq); - -#if 0 - /* MCU clock adjust if need */ - if ((ret = mt6630_mcu_dese(freq, NULL)) < 0) { - WCN_DBG(FM_ERR | MAIN, "mt6630_mcu_dese FAIL:%d\n", ret); - } - - WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret); -#endif - - /* GPS clock adjust if need */ - if ((ret = mt6630_gps_dese(freq, NULL)) < 0) { - WCN_DBG(FM_ERR | MAIN, "mt6630_gps_dese FAIL:%d\n", ret); - } - - WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret); - - ret = mt6630_write(0x60, 0x0007); - if (ret) { - WCN_DBG(FM_ALT | MAIN, "set freq write 0x60 fail\n"); - } - if (mt6630_TDD_chan_check(freq)) { - ret = mt6630_set_bits(0x30, 0x0004, 0xFFF9); /* use TDD solution */ - if (ret) { - WCN_DBG(FM_ALT | MAIN, "set freq write 0x30 fail\n"); - } - } - else { - ret = mt6630_set_bits(0x30, 0x0000, 0xFFF9); /* default use FDD solution */ - if (ret) { - WCN_DBG(FM_ALT | MAIN, "set freq write 0x30 fail\n"); - } - } - ret = mt6630_write(0x60, 0x000F); - if (ret) { - WCN_DBG(FM_ALT | MAIN, "set freq write 0x60 fail\n"); - } - - chan_para = mt6630_chan_para_get(freq); - FM_LOG_DBG(FM_DBG |CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para); - - if (FM_LOCK(cmd_buf_lock)) - return fm_false; - pkt_size = mt6630_tune(cmd_buf, TX_BUF_SIZE, freq, chan_para); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - FM_LOG_ERR(FM_ERR |CHIP, "mt6630_tune failed\n"); - return fm_false; - } - - FM_LOG_DBG(FM_DBG |CHIP, "set freq to %d ok\n", freq); - return fm_true; -} - -#define FM_CQI_LOG_PATH "/mnt/sdcard/fmcqilog" - -static fm_s32 mt6630_full_cqi_get(fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 freq, orig_freq; - fm_s32 i, j, k; - fm_s32 space_val, max, min, num; - struct mt6630_full_cqi *p_cqi; - fm_u8 *cqi_log_title = - "Freq, RSSI, PAMD, PR, FPAMD, MR, ATDC, PRX, ATDEV, SMGain, DltaRSSI\n"; - fm_u8 cqi_log_buf[100] = { 0 }; - fm_s32 pos; - fm_u8 cqi_log_path[100] = { 0 }; - - FM_LOG_NTC(FM_NTC | CHIP, "6630 cqi log start\n"); - /* for soft-mute tune, and get cqi */ - freq = fm_cb_op->cur_freq_get(); - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - /* get cqi */ - orig_freq = freq; - if (0 == fm_get_channel_space(min_freq)) { - min = min_freq * 10; - } else { - min = min_freq; - } - if (0 == fm_get_channel_space(max_freq)) { - max = max_freq * 10; - } else { - max = max_freq; - } - if (space == 0x0001) { - space_val = 5; /* 50Khz */ - } else if (space == 0x0002) { - space_val = 10; /* 100Khz */ - } else if (space == 0x0004) { - space_val = 20; /* 200Khz */ - } else { - space_val = 10; - } - num = (max - min) / space_val + 1; /* Eg, (8760 - 8750) / 10 + 1 = 2 */ - for (k = 0; (10000 == orig_freq) && (0xffffffff == g_dbg_level) && (k < cnt); k++) { - FM_LOG_NTC(FM_NTC | CHIP, "cqi file:%d\n", k + 1); - freq = min; - pos = 0; - fm_memcpy(cqi_log_path, FM_CQI_LOG_PATH, strlen(FM_CQI_LOG_PATH)); - sprintf(&cqi_log_path[strlen(FM_CQI_LOG_PATH)], "%d.txt", k + 1); - fm_file_write(cqi_log_path, cqi_log_title, strlen(cqi_log_title), &pos); - for (j = 0; j < num; j++) { - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, - SM_TUNE_TIMEOUT, mt6630_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6630_res) { - FM_LOG_NTC(FM_NTC | CHIP, "smt cqi size %d\n", mt6630_res->cqi[0]); - p_cqi = (struct mt6630_full_cqi *)&mt6630_res->cqi[2]; - for (i = 0; i < mt6630_res->cqi[1]; i++) { - /* just for debug */ - FM_LOG_NTC(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd, - p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr, - p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev, - p_cqi[i].smg, p_cqi[i].drssi); - /* format to buffer */ - sprintf(cqi_log_buf, - "%04d,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,\n", - p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd, - p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr, - p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev, - p_cqi[i].smg, p_cqi[i].drssi); - /* write back to log file */ - fm_file_write(cqi_log_path, cqi_log_buf, - strlen(cqi_log_buf), &pos); - } - } else { - FM_LOG_ERR(FM_ERR | CHIP, "smt get CQI failed\n"); - ret = -1; - } - freq += space_val; - } - fm_cb_op->cur_freq_set(0); /* avoid run too much times */ - } - FM_LOG_NTC(FM_NTC | CHIP, "6630 cqi log done\n"); - - return ret; -} - -/* - * mt6630_GetCurRSSI - get current freq's RSSI value - * RS=RSSI - * If RS>511, then RSSI(dBm)= (RS-1024)/16*6 - * else RSSI(dBm)= RS/16*6 - */ -static fm_s32 mt6630_GetCurRSSI(fm_s32 *pRSSI) -{ - fm_u16 tmp_reg; - - /* TODO: check reg */ - mt6630_read(FM_RSSI_IND, &tmp_reg); - tmp_reg = tmp_reg & 0x03ff; - - if (pRSSI) { - *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4); - FM_LOG_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI); - } else { - WCN_DBG(FM_ERR | CHIP, "get rssi para error\n"); - return -FM_EPARA; - } - - return 0; -} - -static fm_u16 mt6630_vol_tbl[16] = { - 0x0000, 0x0519, 0x066A, 0x0814, - 0x0A2B, 0x0CCD, 0x101D, 0x1449, - 0x198A, 0x2027, 0x287A, 0x32F5, - 0x4027, 0x50C3, 0x65AD, 0x7FFF -}; - -static fm_s32 mt6630_SetVol(fm_u8 vol) -{ - fm_s32 ret = 0; - - /* TODO: check reg */ - vol = (vol > 15) ? 15 : vol; - ret = mt6630_write(0x7D, mt6630_vol_tbl[vol]); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", vol); - return ret; - } else { - FM_LOG_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", vol); - } - - if (vol == 10) { - fm_print_cmd_fifo(); /* just for debug */ - fm_print_evt_fifo(); - } - return 0; -} - -static fm_s32 mt6630_GetVol(fm_u8 *pVol) -{ - int ret = 0; - fm_u16 tmp; - fm_s32 i; - - FMR_ASSERT(pVol); - - /* TODO: check reg */ - ret = mt6630_read(0x7D, &tmp); - if (ret) { - *pVol = 0; - WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n"); - return ret; - } - - for (i = 0; i < 16; i++) { - if (mt6630_vol_tbl[i] == tmp) { - *pVol = i; - break; - } - } - - FM_LOG_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol); - return 0; -} - -static fm_s32 mt6630_dump_reg(void) -{ - fm_s32 i; - fm_u16 TmpReg; - for (i = 0; i < 0xff; i++) { - mt6630_read(i, &TmpReg); - FM_LOG_NTC(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg); - } - return 0; -} - -static fm_bool mt6630_GetMonoStereo(fm_u16 *pMonoStereo) -{ -#define FM_BF_STEREO 0x1000 - fm_u16 TmpReg; - - /* TODO: check reg */ - if (pMonoStereo) { - mt6630_read(FM_RSSI_IND, &TmpReg); - *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12; - } else { - WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n"); - return fm_false; - } - - FM_LOG_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo); - return fm_true; -} - -static fm_s32 mt6630_SetMonoStereo(fm_s32 MonoStereo) -{ - fm_s32 ret = 0; -#define FM_FORCE_MS 0x0008 - - FM_LOG_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "mono" : "auto"); - /* TODO: check reg */ - - mt6630_write(0x60, 0x3007); - - if (MonoStereo) { - ret = mt6630_set_bits(0x75, FM_FORCE_MS, ~FM_FORCE_MS); - } else { - ret = mt6630_set_bits(0x75, 0x0000, ~FM_FORCE_MS); - } - - return ret; -} - -static fm_s32 mt6630_GetCapArray(fm_s32 *ca) -{ - fm_u16 dataRead; - fm_u16 tmp = 0; - - /* TODO: check reg */ - FMR_ASSERT(ca); - mt6630_read(0x60, &tmp); - mt6630_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */ - - mt6630_read(0x26, &dataRead); - *ca = dataRead; - - mt6630_write(0x60, tmp); /* 0x60 D3=1 */ - return 0; -} - -/* - * mt6630_GetCurPamd - get current freq's PAMD value - * PA=PAMD - * If PA>511 then PAMD(dB)= (PA-1024)/16*6, - * else PAMD(dB)=PA/16*6 - */ -static fm_bool mt6630_GetCurPamd(fm_u16 *pPamdLevl) -{ - fm_u16 tmp_reg; - fm_u16 dBvalue, valid_cnt = 0; - int i, total = 0; - for (i = 0; i < 8; i++) { - /* TODO: check reg */ - if (mt6630_read(FM_ADDR_PAMD, &tmp_reg)) { - *pPamdLevl = 0; - return fm_false; - } - - tmp_reg &= 0x03FF; - dBvalue = (tmp_reg > 256) ? ((512 - tmp_reg) * 6 / 16) : 0; - if (dBvalue != 0) { - total += dBvalue; - valid_cnt++; - FM_LOG_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue); - } - Delayms(3); - } - if (valid_cnt != 0) { - *pPamdLevl = total / valid_cnt; - } else { - *pPamdLevl = 0; - } - FM_LOG_NTC(FM_NTC | CHIP, "PAMD=%d\n", *pPamdLevl); - return fm_true; -} - -static fm_s32 MT6630_FMOverBT(fm_bool enable) -{ - fm_s32 ret = 0; - - WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__); - - if (enable == fm_true) { - /* change I2S to slave mode and 48K sample rate */ - if (mt6630_I2s_Setting(FM_I2S_ON, FM_I2S_SLAVE, FM_I2S_48K)) - goto out; - WCN_DBG(FM_NTC | CHIP, "set FM via BT controller\n"); - } else if (enable == fm_false) { - /* change I2S to master mode and 44.1K sample rate */ - if (mt6630_I2s_Setting(FM_I2S_ON, FM_I2S_MASTER, FM_I2S_44K)) - goto out; - WCN_DBG(FM_NTC | CHIP, "set FM via Host\n"); - } else { - WCN_DBG(FM_ERR | CHIP, "%s()\n", __func__); - ret = -FM_EPARA; - goto out; - } - out: - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return ret; -} - - -/* - * mt6630_I2s_Setting - set the I2S state on MT6630 - * @onoff - I2S on/off - * @mode - I2S mode: Master or Slave - * - * Return:0, if success; error code, if failed - */ -static fm_s32 mt6630_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample) -{ - fm_u16 tmp_state = 0; - fm_u16 tmp_mode = 0; - fm_u16 tmp_sample = 0; - fm_s32 ret = 0; - - if (onoff == FM_I2S_ON) { - tmp_state = 0x0003; /* I2S enable and standard I2S mode, 0x9B D0,D1=1 */ - mt6630_fm_config.aud_cfg.i2s_info.status = FM_I2S_ON; - } else if (onoff == FM_I2S_OFF) { - tmp_state = 0x0000; /* I2S off, 0x9B D0,D1=0 */ - mt6630_fm_config.aud_cfg.i2s_info.status = FM_I2S_OFF; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff); - ret = -FM_EPARA; - goto out; - } - - if (mode == FM_I2S_MASTER) { - tmp_mode = 0x0000; /* 6630 as I2S master, set 0x9B D3=0 */ - mt6630_fm_config.aud_cfg.i2s_info.mode = FM_I2S_MASTER; - } else if (mode == FM_I2S_SLAVE) { - tmp_mode = 0x0008; /* 6630 as I2S slave, set 0x9B D3=1 */ - mt6630_fm_config.aud_cfg.i2s_info.mode = FM_I2S_SLAVE; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode); - ret = -FM_EPARA; - goto out; - } - - if (sample == FM_I2S_32K) { - tmp_sample = 0x0000; /* 6630 I2S 32KHz sample rate, 0x5F D11~12 */ - mt6630_fm_config.aud_cfg.i2s_info.rate = FM_I2S_32K; - } else if (sample == FM_I2S_44K) { - tmp_sample = 0x0800; /* 6630 I2S 44.1KHz sample rate */ - mt6630_fm_config.aud_cfg.i2s_info.rate = FM_I2S_44K; - } else if (sample == FM_I2S_48K) { - tmp_sample = 0x1000; /* 6630 I2S 48KHz sample rate */ - mt6630_fm_config.aud_cfg.i2s_info.rate = FM_I2S_48K; - } else { - WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample); - ret = -FM_EPARA; - goto out; - } - - ret = mt6630_write(0x60, 0x7); - if (ret) - { - goto out; - } - - ret = mt6630_set_bits(0x5F, tmp_sample, 0xE7FF); - if (ret) { - goto out; - } - ret = mt6630_set_bits(0x9B, tmp_mode, 0xFFF7); - if (ret) { - goto out; - } - ret = mt6630_set_bits(0x9B, tmp_state, 0xFFFC); - if (ret) { - goto out; - } - /* F0.4 enable ft */ - ret = mt6630_set_bits(0x56, 0x1, 0xFFFE); - if (ret) { - goto out; - } - - ret = mt6630_write(0x60, 0xf); - if (ret) - { - goto out; - } - - FM_LOG_NTC(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n", - (onoff == FM_I2S_ON) ? "On" : "Off", - (mode == FM_I2S_MASTER) ? "Master" : "Slave", sample); - out: - return ret; -} - -static fm_s32 mt6630fm_get_audio_info(fm_audio_info_t *data) -{ - memcpy(data, &mt6630_fm_config.aud_cfg, sizeof(fm_audio_info_t)); - return 0; -} - -static fm_s32 mt6630_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample) -{ - *ponoff = mt6630_fm_config.aud_cfg.i2s_info.status; - *pmode = mt6630_fm_config.aud_cfg.i2s_info.mode; - *psample = mt6630_fm_config.aud_cfg.i2s_info.rate; - - return 0; -} - -static fm_s32 mt6630_hw_info_get(struct fm_hw_info *req) -{ - FMR_ASSERT(req); - - req->chip_id = mt6630_hw_info.chip_id; - req->eco_ver = mt6630_hw_info.eco_ver; - req->patch_ver = mt6630_hw_info.patch_ver; - req->rom_ver = mt6630_hw_info.rom_ver; - - return 0; -} - -static fm_s32 mt6630_pre_search(void) -{ - mt6630_RampDown(); - return 0; -} - -static fm_s32 mt6630_restore_search(void) -{ - mt6630_RampDown(); - return 0; -} - -/* -freq: 8750~10800 -valid: fm_true-valid channel,fm_false-invalid channel -return: fm_true- smt success, fm_false-smt fail -*/ -static fm_s32 mt6630_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - /* fm_u16 freq;//, orig_freq; */ - struct mt6630_full_cqi *p_cqi; - fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0; - fm_u32 PRX = 0, ATDEV = 0; - fm_u16 softmuteGainLvl = 0; - - ret = mt6630_chan_para_get(freq); - if (ret == 2) { - ret = mt6630_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */ - } else { - ret = mt6630_set_bits(FM_CHANNEL_SET, 0x0000, 0x0FFF); /* clear FA/HL/ATJ */ - } -#if 0 - mt6630_write(0x60, 0x0007); - if (mt6630_TDD_chan_check(freq)) - mt6630_set_bits(0x30, 0x0004, 0xFFF9); /* use TDD solution */ - else - mt6630_set_bits(0x30, 0x0000, 0xFFF9); /* default use FDD solution */ - mt6630_write(0x60, 0x000F); -#endif - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT, - mt6630_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6630_res) { - FM_LOG_NTC(FM_NTC | CHIP, "smt cqi size %d\n", mt6630_res->cqi[0]); - p_cqi = (struct mt6630_full_cqi *)&mt6630_res->cqi[2]; - /* just for debug */ - FM_LOG_NTC(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr, - p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi); - RSSI = - ((p_cqi->rssi & 0x03FF) >= - 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF); - PAMD = - ((p_cqi->pamd & 0x1FF) >= - 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF); - MR = ((p_cqi->mr & 0x01FF) >= - 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF); - ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc); - if (ATDC < 0) { - ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */ - } - PRX = (p_cqi->prx & 0x00FF); - ATDEV = p_cqi->atdev; - softmuteGainLvl = p_cqi->smg; - /* check if the channel is valid according to each CQIs */ - if ((RSSI >= mt6630_fm_config.rx_cfg.long_ana_rssi_th) - && (PAMD <= mt6630_fm_config.rx_cfg.pamd_th) - && (ATDC <= mt6630_fm_config.rx_cfg.atdc_th) - && (MR >= mt6630_fm_config.rx_cfg.mr_th) - && (PRX >= mt6630_fm_config.rx_cfg.prx_th) - && (ATDEV >= ATDC) /* sync scan algorithm */ - &&(softmuteGainLvl >= mt6630_fm_config.rx_cfg.smg_th)) { - *valid = fm_true; - } else { - *valid = fm_false; - } - *rssi = RSSI; -/* if(RSSI < -296) - FM_LOG_NTC(FM_NTC | CHIP, "rssi\n"); - else if(PAMD > -12) - FM_LOG_NTC(FM_NTC | CHIP, "PAMD\n"); - else if(ATDC > 3496) - FM_LOG_NTC(FM_NTC | CHIP, "ATDC\n"); - else if(MR < -67) - FM_LOG_NTC(FM_NTC | CHIP, "MR\n"); - else if(PRX < 80) - FM_LOG_NTC(FM_NTC | CHIP, "PRX\n"); - else if(ATDEV < ATDC) - FM_LOG_NTC(FM_NTC | CHIP, "ATDEV\n"); - else if(softmuteGainLvl < 16421) - FM_LOG_NTC(FM_NTC | CHIP, "softmuteGainLvl\n"); - */ - } else { - FM_LOG_ERR(FM_ERR | CHIP, "smt get CQI failed\n"); - return fm_false; - } - FM_LOG_NTC(FM_NTC | CHIP, "valid=%d\n", *valid); - return fm_true; -} - -/* -parm: - parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG. - parm.th_val: threshold value -*/ -static fm_s32 mt6630_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve) -{ - switch (idx) { - case 0: - { - mt6630_fm_config.rx_cfg.long_ana_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val); - break; - } - case 1: - { - mt6630_fm_config.rx_cfg.desene_rssi_th = val; - WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val); - break; - } - case 2: - { - mt6630_fm_config.rx_cfg.smg_th = val; - WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val); - break; - } - default: - break; - } - return 0; -} - -#if 0 -static const fm_u16 mt6630_mcu_dese_list[] = { - 0 /* 7630, 7800, 7940, 8320, 9260, 9600, 9710, 9920, 10400, 10410 */ -}; - -static const fm_u16 mt6630_gps_dese_list[] = { - 0 /* 7850, 7860 */ -}; -#endif - -static const fm_s8 mt6630_chan_para_map[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6500~6595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6600~6695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, /* 6700~6795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6800~6895 */ - 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6900~6995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7000~7095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7100~7195 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7200~7295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7300~7395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7400~7495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7500~7595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 7600~7695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7700~7795 */ - 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7800~7895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7900~7995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8000~8095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8100~8195 */ - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8200~8295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, /* 8300~8395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8400~8495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8500~8595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8600~8695 */ - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8700~8795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8800~8895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8900~8995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9000~9095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9100~9195 */ - 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9200~9295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9300~9395 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9400~9495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9500~9595 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9600~9695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9700~9795 */ - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9800~9895 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 9900~9995 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10000~10095 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10100~10195 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 10200~10295 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 10300~10395 */ - 8, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10400~10495 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, /* 10500~10595 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10600~10695 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 10700~10795 */ - 0 /* 10800 */ -}; - -static const fm_u16 mt6630_TDD_list[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6500~6595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6600~6695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6700~6795 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6800~6895 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6900~6995 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7000~7095 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7100~7195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7200~7295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7300~7395 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7400~7495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7500~7595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7600~7695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7700~7795 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7800~7895 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7900~7995 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8000~8095 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8100~8195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8200~8295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8300~8395 */ - 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 8400~8495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8500~8595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8600~8695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8700~8795 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8800~8895 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8900~8995 */ - 0x0000, 0x0000, 0x0101, 0x0101, 0x0101, /* 9000~9095 */ - 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 9100~9195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9200~9295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9300~9395 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9400~9495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9500~9595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9600~9695 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 9700~9795 */ - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 9800~9895 */ - 0x0101, 0x0101, 0x0001, 0x0000, 0x0000, /* 9900~9995 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10000~10095 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10100~10195 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10200~10295 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10300~10395 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10400~10495 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10500~10595 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 10600~10695 */ - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 10700~10795 */ - 0x0001 /* 10800 */ -}; - -static const fm_u16 mt6630_TDD_Mask[] = { - 0x0001, 0x0010, 0x0100, 0x1000 -}; - -static const fm_u16 mt6630_scan_dese_list[] = { - 7800, 9210, 9220, 9600, 9980, 10400, 10750, 10760 -}; - -/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */ -static fm_s32 mt6630_is_dese_chan(fm_u16 freq) -{ - fm_s32 size; - - /* return 0;//HQA only :skip desense channel check. */ - size = sizeof(mt6630_scan_dese_list) / sizeof(mt6630_scan_dese_list[0]); - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - while (size) { - if (mt6630_scan_dese_list[size - 1] == freq) - return 1; - - size--; - } - - return 0; -} - -static fm_bool mt6630_TDD_chan_check(fm_u16 freq) -{ - fm_u32 i = 0; - fm_u16 freq_tmp = freq; - fm_s32 ret = 0; - - ret = fm_get_channel_space(freq_tmp); - if (0 == ret) { - freq_tmp *= 10; - } else if (-1 == ret) - return fm_false; - - i = (freq_tmp - 6500) / 5; - - /* WCN_DBG(FM_NTC | CHIP, "Freq %d is 0x%4x, mask is 0x%4x\n", freq,(mt6630_TDD_list[i/4]),mt6630_TDD_Mask[i%4]); */ - if (mt6630_TDD_list[i / 4] & mt6630_TDD_Mask[i % 4]) { - WCN_DBG(FM_DBG | CHIP, "Freq %d use TDD solution\n", freq); - return fm_true; - } else - return fm_false; -} - - -/* return value: -1, is desense channel and rssi is less than threshold; -0, not desense channel or it is but rssi is more than threshold.*/ -static fm_s32 mt6630_desense_check(fm_u16 freq, fm_s32 rssi) -{ - if (mt6630_is_dese_chan(freq)) { - if (rssi < mt6630_fm_config.rx_cfg.desene_rssi_th) { - return 1; - } - FM_LOG_DBG(FM_DBG | CHIP, "desen_rssi %d th:%d\n", rssi, - mt6630_fm_config.rx_cfg.desene_rssi_th); - } - return 0; -} - -/* get channel parameter, HL side/ FA / ATJ */ -static fm_u16 mt6630_chan_para_get(fm_u16 freq) -{ - fm_s32 pos, size; - - /* return 0;//for HQA only: skip FA/HL/ATJ */ - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - if (freq < 6500) { - return 0; - } - pos = (freq - 6500) / 5; - - size = sizeof(mt6630_chan_para_map) / sizeof(mt6630_chan_para_map[0]); - - pos = (pos < 0) ? 0 : pos; - pos = (pos > (size - 1)) ? (size - 1) : pos; - - return mt6630_chan_para_map[pos]; -} - -static fm_s32 mt6630_gps_dese(fm_u16 freq, void *arg) -{ - fm_gps_desense_t state = FM_GPS_DESE_DISABLE; - - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - - WCN_DBG(FM_DBG | CHIP, "%s, [freq=%d]\n", __func__, (int)freq); - - if (state != FM_GPS_DESE_ENABLE) { - if ((freq >= 7800) && (freq <= 8000)) { - state = FM_GPS_DESE_ENABLE; - } - } - /* request 6630 GPS change clk */ - if (state == FM_GPS_DESE_DISABLE) { - if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_DISABLE)) { - return -1; - } - return 0; - } else { - if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_ENABLE)) { - return -1; - } - return 1; - } -} - -/******************************Tx function********************************************/ -static fm_s32 mt6630_Tx_Support(fm_s32 *sup) -{ - *sup = 1; - return 0; -} - -static fm_s32 mt6630_rdsTx_Support(fm_s32 *sup) -{ - *sup = 1; - return 0; -} - -static fm_s32 MT6630_Rds_Tx_Enable(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) { - return (-FM_ELOCK); - } - pkt_size = mt6630_tx_rdson_deviation(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RDS_TX, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_tx_rdson_deviation failed\n"); - return ret; - } - mt6630_set_bits(0xC7, 0x0800, 0xF7FF); - return 0; -} - -static fm_s32 MT6630_Rds_Tx_Disable(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - - if (FM_LOCK(cmd_buf_lock)) { - return (-FM_ELOCK); - } - pkt_size = mt6630_pwrup_tx_deviation(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_pwrup_tx_deviation failed\n"); - return ret; - } - - mt6630_set_bits(0xC7, 0x0000, 0xF7FF); - - return 0; -} - -/* -pi: pi code, -ps: block B,C,D -other_rds: NULL now -other_rds_cnt:0 now -*/ -static fm_s32 MT6630_Rds_Tx(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt) -{ - fm_s32 ret = 0; - fm_u16 pkt_size = 0; - - WCN_DBG(FM_NTC | RDSC, - "+%s():PI=0x%04x, PS=0x%04x/0x%04x/0x%04x/0x%04x, other_rds_cnt=%d\n", __func__, - pi, ps[0], ps[1], ps[2], ps[3], other_rds_cnt); - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_rds_tx(cmd_buf, TX_BUF_SIZE, pi, ps, other_rds, other_rds_cnt); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RDS_TX, SW_RETRY_CNT, RDS_TX_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - return ret; -} - -/* -freq: 8750~10800 -valid: fm_true-valid channel,fm_false-invalid channel -return: fm_true- smt success, fm_false-smt fail -*/ -static fm_s32 mt6630_soft_mute_tune_Tx(fm_u16 freq, fm_s32 *rssi, fm_bool *valid) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - struct mt6630_full_cqi *p_cqi; - fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0; - fm_u32 PRX = 0, ATDEV = 0; - fm_u16 softmuteGainLvl = 0; - - ret = mt6630_chan_para_get(freq); - if (ret == 2) { - ret = mt6630_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */ - } else { - ret = mt6630_set_bits(FM_CHANNEL_SET, 0x0000, 0x0FFF); /* clear FA/HL/ATJ */ - } - - mt6630_write(0x60, 0x0007); - if (mt6630_TDD_chan_check(freq)) - mt6630_set_bits(0x30, 0x0004, 0xFFF9); /* use TDD solution */ - else - mt6630_set_bits(0x30, 0x0000, 0xFFF9); /* default use FDD solution */ - mt6630_write(0x60, 0x000F); - - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT, - mt6630_get_read_result); - FM_UNLOCK(cmd_buf_lock); - - if (!ret && mt6630_res) { - FM_LOG_NTC(FM_NTC | CHIP, "smt cqi size %d\n", mt6630_res->cqi[0]); - p_cqi = (struct mt6630_full_cqi *)&mt6630_res->cqi[2]; - /* just for debug */ - FM_LOG_NTC(FM_NTC | CHIP, - "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", - p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr, - p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi); - RSSI = - ((p_cqi->rssi & 0x03FF) >= - 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF); - PAMD = - ((p_cqi->pamd & 0x1FF) >= - 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF); - MR = ((p_cqi->mr & 0x01FF) >= - 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF); - ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc); - if (ATDC < 0) { - ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */ - } - PRX = (p_cqi->prx & 0x00FF); - ATDEV = p_cqi->atdev; - softmuteGainLvl = p_cqi->smg; - /* check if the channel is valid according to each CQIs */ - if ((PAMD > mt6630_fm_config.tx_cfg.pamd_th) - && (MR <= mt6630_fm_config.tx_cfg.mr_th) - && (softmuteGainLvl < mt6630_fm_config.tx_cfg.smg_th)) { - *valid = fm_true; - } else { - *valid = fm_false; - } - *rssi = RSSI; - } else { - FM_LOG_ERR(FM_ERR | CHIP, "smt get CQI failed\n"); - return fm_false; - } - FM_LOG_NTC(FM_NTC | CHIP, "valid=%d\n", *valid); - return fm_true; -} - -#define TX_ABANDON_BAND_LOW1 7320 -#define TX_ABANDON_BAND_HIGH1 7450 -#define TX_ABANDON_BAND_LOW2 9760 -#define TX_ABANDON_BAND_HIGH2 9940 -static fm_s32 mt6630_TxScan(fm_u16 min_freq, - fm_u16 max_freq, - fm_u16 *pFreq, - fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space) -{ - fm_s32 i = 0, ret = 0; - fm_u16 freq = *pFreq; - fm_u16 scan_cnt = *ScanTBLsize; - fm_u16 cnt = 0; - fm_s32 rssi = 0; - fm_s32 step; - fm_bool valid = fm_false; - fm_s32 total_no = 0; - - WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__); - - if ((!pScanTBL) || (*ScanTBLsize < FM_TX_SCAN_MIN) || (*ScanTBLsize > FM_TX_SCAN_MAX)) { - WCN_DBG(FM_ERR | CHIP, "invalid scan table\n"); - ret = -FM_EPARA; - return 1; - } - if (0 == fm_get_channel_space(freq)) { - *pFreq *= 10; - } - if (0 == fm_get_channel_space(max_freq)) { - max_freq *= 10; - } - if (0 == fm_get_channel_space(min_freq)) { - min_freq *= 10; - } - - WCN_DBG(FM_NTC | CHIP, - "[freq=%d], [max_freq=%d],[min_freq=%d],[scan BTL size=%d],[scandir=%d],[space=%d]\n", - *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space); - - cnt = 0; - if (space == FM_SPACE_200K) { - step = 20; - } else if (space == FM_SPACE_50K) { - step = 5; - } else { - step = 10; - } - total_no = (max_freq - min_freq) / step + 1; - if (scandir == FM_TX_SCAN_UP) { - for (i = ((*pFreq - min_freq) / step); i < total_no; i++) { - freq = min_freq + step * i; - - //FM desense GPS - if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1)) - { - freq = TX_ABANDON_BAND_HIGH1 + 10; - i = (freq-min_freq)/step; - } - - if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2)) - { - freq = TX_ABANDON_BAND_HIGH2 + 10; - i = (freq-min_freq)/step; - } - - ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid); - if (ret == fm_false) { - WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n"); - return 1; - } - - if (valid == fm_true) { - *(pScanTBL + cnt) = freq; /* strore the valid empty channel */ - cnt++; - WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", freq, - cnt); - } - if (cnt >= scan_cnt) { - break; - } - } - - if (cnt < scan_cnt) { - for (i = 0; i < ((*pFreq - min_freq) / step); i++) { - freq = min_freq + step * i; - - //FM desense GPS - if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1)) - { - freq = TX_ABANDON_BAND_HIGH1 + 10; - i = (freq-min_freq)/step; - } - - if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2)) - { - freq = TX_ABANDON_BAND_HIGH2 + 10; - i = (freq-min_freq)/step; - } - - if(i >= ((*pFreq-min_freq)/step)) - break; - - ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid); - if (ret == fm_false) { - WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n"); - return 1; - } - - if (valid == fm_true) { - *(pScanTBL + cnt) = freq; /* strore the valid empty channel */ - cnt++; - WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", - freq, cnt); - } - if (cnt >= scan_cnt) { - break; - } - } - } - } else { - for (i = ((*pFreq - min_freq) / step - 1); i >= 0; i--) { - freq = min_freq + step * i; - - //FM desense GPS - if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1)) - { - freq = TX_ABANDON_BAND_LOW1 - 10; - i = (freq-min_freq)/step; - } - - if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2)) - { - freq = TX_ABANDON_BAND_LOW2 - 10; - i = (freq-min_freq)/step; - } - - ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid); - if (ret == fm_false) { - WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n"); - return 1; - } - - if (valid == fm_true) { - *(pScanTBL + cnt) = freq; /* strore the valid empty channel */ - cnt++; - WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", freq, - cnt); - } - if (cnt >= scan_cnt) { - break; - } - } - if (cnt < scan_cnt) { - for (i = (total_no - 1); i > ((*pFreq - min_freq) / step); i--) { - freq = min_freq + step * i; - - //FM desense GPS - if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1)) - { - freq = TX_ABANDON_BAND_LOW1 - 10; - i = (freq-min_freq)/step; - } - - if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2)) - { - freq = TX_ABANDON_BAND_LOW2 - 10; - i = (freq-min_freq)/step; - } - - if(i <= ((*pFreq-min_freq)/step)) - break; - - ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid); - if (ret == fm_false) { - WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n"); - return 1; - } - - if (valid == fm_true) { - *(pScanTBL + cnt) = freq; /* strore the valid empty channel */ - cnt++; - WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", - freq, cnt); - } - if (cnt >= scan_cnt) { - break; - } - } - } - } - - *ScanTBLsize = cnt; - WCN_DBG(FM_NTC | CHIP, "completed, [cnt=%d],[freq=%d]\n", cnt, freq); - /* return 875~1080 */ - for (i = 0; i < cnt; i++) { - if (1 == fm_get_channel_space(*(pScanTBL + i))) { - *(pScanTBL + i) = *(pScanTBL + i) / 10; - } - } - WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret); - return 0; -} - -static fm_s32 mt6630_PowerUpTx(void) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 dataRead; - - FM_LOG_NTC(FM_NTC | CHIP, "pwr on Tx seq......\n"); - - ret = mt6630_pwrup_top_setting(); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_top_setting failed\n"); - return ret; - } - if (FM_LOCK(cmd_buf_lock)) { - return (-FM_ELOCK); - } - pkt_size = mt6630_pwrup_clock_on_tx(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_pwrup_clock_on_tx failed\n"); - return ret; - } - - mt6630_read(0x62, &dataRead); - WCN_DBG(FM_NTC | CHIP, "Tx on chipid=%x\n", dataRead); - - ret = mt6630_pwrup_DSP_download(mt6630_patch_tbl_tx); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_DSP_download failed\n"); - return ret; - } - - if ((mt6630_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF) - || (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) { - mt6630_I2s_Setting(FM_I2S_ON, mt6630_fm_config.aud_cfg.i2s_info.mode, - mt6630_fm_config.aud_cfg.i2s_info.rate); - /* mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X)CMB_STUB_AIF_2);//no need to do? */ - WCN_DBG(FM_NTC | CHIP, "pwron set I2S on ok\n"); - } - - if (FM_LOCK(cmd_buf_lock)) { - return (-FM_ELOCK); - } - pkt_size = mt6630_pwrup_digital_init(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_dig_init failed\n"); - return ret; - } - - if (FM_LOCK(cmd_buf_lock)) { - return (-FM_ELOCK); - } - pkt_size = mt6630_pwrup_tx_deviation(cmd_buf, TX_BUF_SIZE); - ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL); - FM_UNLOCK(cmd_buf_lock); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_pwrup__tx_deviation failed\n"); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "pwr on tx seq ok\n"); - return ret; -} - -static fm_s32 mt6630_PowerDownTx(void) -{ - fm_s32 ret = 0; - - ret = mt6630_PowerDown(); - if (ret) { - FM_LOG_ERR(FM_ERR | CHIP, "mt6630_PowerDownTx failed\n"); - return ret; - } - - return ret; -} - -static fm_u16 mt6630_Hside_list_Tx[] = { 7720, 8045 }; - -static fm_bool mt6630_HiSide_chan_check_Tx(fm_u16 freq) -{ - //fm_s32 pos, size; - fm_u32 i = 0, count = 0; - - /* return 0;//for HQA only: skip FA/HL/ATJ */ - if (0 == fm_get_channel_space(freq)) { - freq *= 10; - } - if (freq < 6500) { - return fm_false; - } - - count = sizeof(mt6630_Hside_list_Tx) / sizeof(mt6630_Hside_list_Tx[0]); - for (i = 0; i < count; i++) { - if (freq == mt6630_Hside_list_Tx[i]) - return fm_true; - } - - return fm_false; -} - -static fm_bool MT6630_SetFreq_Tx(fm_u16 freq) -{ - fm_s32 ret = 0; - fm_u16 pkt_size; - fm_u16 chan_para = 0; - - ret = mt6630_RampDown(); - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_RampDown failed\n"); - return ret; - } - - if (fm_true == mt6630_HiSide_chan_check_Tx(freq)) { - FM_LOG_DBG(FM_DBG | CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para); - ret = mt6630_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */ - } else - ret = mt6630_set_bits(FM_CHANNEL_SET, 0x0000, 0xEFFF); /* clear HiLo */ - - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_set_bits failed\n"); - return ret; - } - /* fm_cb_op->cur_freq_set(freq); */ - /* start tune */ - if (FM_LOCK(cmd_buf_lock)) - return (-FM_ELOCK); - pkt_size = mt6630_tune_tx(cmd_buf, TX_BUF_SIZE, freq, 0); - ret = - fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT, - NULL); - FM_UNLOCK(cmd_buf_lock); - - if (ret) { - WCN_DBG(FM_ALT | CHIP, "mt6630_tune_tx failed\n"); - return ret; - } - - WCN_DBG(FM_DBG | CHIP, "mt6630_tune_tx to %d ok\n", freq); - - return fm_true; -} - - -fm_s32 MT6630fm_low_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - - FMR_ASSERT(ops); - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb_op = &ops->cb; - - ops->bi.pwron = mt6630_pwron; - ops->bi.pwroff = mt6630_pwroff; - ops->bi.msdelay = Delayms; - ops->bi.usdelay = Delayus; - ops->bi.read = mt6630_read; - ops->bi.write = mt6630_write; - /* ops->bi.top_read = mt6630_top_read; */ - /* ops->bi.top_write = mt6630_top_write; */ - ops->bi.host_read = mt6630_host_read; - ops->bi.host_write = mt6630_host_write; - ops->bi.setbits = mt6630_set_bits; - ops->bi.chipid_get = mt6630_get_chipid; - ops->bi.mute = mt6630_Mute; - ops->bi.rampdown = mt6630_RampDown; - ops->bi.pwrupseq = mt6630_PowerUp; - ops->bi.pwrdownseq = mt6630_PowerDown; - ops->bi.setfreq = mt6630_SetFreq; - /* ops->bi.low_pwr_wa = MT6630fm_low_power_wa_default; */ - ops->bi.i2s_set = mt6630_I2s_Setting; - ops->bi.rssiget = mt6630_GetCurRSSI; - ops->bi.volset = mt6630_SetVol; - ops->bi.volget = mt6630_GetVol; - ops->bi.dumpreg = mt6630_dump_reg; - ops->bi.msget = mt6630_GetMonoStereo; - ops->bi.msset = mt6630_SetMonoStereo; - ops->bi.pamdget = mt6630_GetCurPamd; - /* ops->bi.em = mt6630_em_test; */ - ops->bi.anaswitch = mt6630_SetAntennaType; - ops->bi.anaget = mt6630_GetAntennaType; - ops->bi.caparray_get = mt6630_GetCapArray; - ops->bi.hwinfo_get = mt6630_hw_info_get; - ops->bi.fm_via_bt = MT6630_FMOverBT; - ops->bi.i2s_get = mt6630_i2s_info_get; - ops->bi.is_dese_chan = mt6630_is_dese_chan; - ops->bi.softmute_tune = mt6630_soft_mute_tune; - ops->bi.desense_check = mt6630_desense_check; - ops->bi.cqi_log = mt6630_full_cqi_get; - ops->bi.pre_search = mt6630_pre_search; - ops->bi.restore_search = mt6630_restore_search; - ops->bi.set_search_th = mt6630_set_search_th; - ops->bi.get_aud_info = mt6630fm_get_audio_info; - /*****tx function****/ - ops->ri.rdstx_support = mt6630_rdsTx_Support; - ops->bi.tx_support = mt6630_Tx_Support; - ops->bi.pwrupseq_tx = mt6630_PowerUpTx; - ops->bi.tune_tx = MT6630_SetFreq_Tx; - ops->bi.pwrdownseq_tx = mt6630_PowerDownTx; - ops->bi.tx_scan = mt6630_TxScan; - ops->ri.rds_tx = MT6630_Rds_Tx; - ops->ri.rds_tx_enable = MT6630_Rds_Tx_Enable; - ops->ri.rds_tx_disable = MT6630_Rds_Tx_Disable; - /* ops->bi.tx_pwr_ctrl = MT6630_TX_PWR_CTRL; */ - /* ops->bi.rtc_drift_ctrl = MT6630_RTC_Drift_CTRL; */ - /* ops->bi.tx_desense_wifi = MT6630_TX_DESENSE; */ - - cmd_buf_lock = fm_lock_create("30_cmd"); - ret = fm_lock_get(cmd_buf_lock); - - cmd_buf = fm_zalloc(TX_BUF_SIZE + 1); - - if (!cmd_buf) { - FM_LOG_ERR(FM_ERR | CHIP, "6630 fm lib alloc tx buf failed\n"); - ret = -1; - } - - return ret; -} - -fm_s32 MT6630fm_low_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - /* Basic functions. */ - FMR_ASSERT(ops); - - if (cmd_buf) { - fm_free(cmd_buf); - cmd_buf = NULL; - } - - ret = fm_lock_put(cmd_buf_lock); - fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface)); - return ret; -} diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c deleted file mode 100644 index 09a31c476..000000000 --- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c +++ /dev/null @@ -1,345 +0,0 @@ -/* mt6630_rds.c - * - * (C) Copyright 2009 - * MediaTek <www.MediaTek.com> - * hongcheng <hongcheng.xia@MediaTek.com> - * - * mt6630 FM Radio Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "fm_typedef.h" -#include "fm_dbg.h" -#include "fm_err.h" -#include "fm_interface.h" -#include "fm_stdlib.h" -#include "fm_rds.h" -#include "mt6630_fm_reg.h" - - -static fm_bool bRDS_FirstIn = fm_false; -static fm_u32 gBLER_CHK_INTERVAL = 5000; -static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT; -static fm_u8 BAD_BLK_RATIO; - -static struct fm_callback *fm_cb; -static struct fm_basic_interface *fm_bi; - - -static fm_bool mt6630_RDS_support(void); -static fm_s32 mt6630_RDS_enable(void); -static fm_s32 mt6630_RDS_disable(void); -static fm_u16 mt6630_RDS_Get_GoodBlock_Counter(void); -static fm_u16 mt6630_RDS_Get_BadBlock_Counter(void); -static fm_u8 mt6630_RDS_Get_BadBlock_Ratio(void); -static fm_u32 mt6630_RDS_Get_BlerCheck_Interval(void); -/* static void mt6630_RDS_GetData(fm_u16 *data, fm_u16 datalen); */ -static void mt6630_RDS_Init_Data(rds_t *pstRDSData); - - - -static fm_bool mt6630_RDS_support(void) -{ - return fm_true; -} - -static fm_s32 mt6630_RDS_enable(void) -{ - fm_s32 ret = 0; - fm_u16 dataRead = 0; - - WCN_DBG(FM_DBG | RDSC, "rds enable\n"); - /* ret = fm_bi->read(FM_RDS_CFG0, &dataRead); */ - ret = fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */ - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable write 0x80 fail\n"); - return ret; - } - ret = fm_bi->read(FM_MAIN_CTRL, &dataRead); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable read 0x63 fail\n"); - return ret; - } - ret = fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK)); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds enable write 0x63 fail\n"); - return ret; - } - - return ret; -} - -static fm_s32 mt6630_RDS_disable(void) -{ - fm_s32 ret = 0; - fm_u16 dataRead = 0; - - WCN_DBG(FM_DBG | RDSC, "rds disable\n"); - ret = fm_bi->read(FM_MAIN_CTRL, &dataRead); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds disable read 0x63 fail\n"); - return ret; - } - ret = fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK)); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "rds disable write 0x63 fail\n"); - return ret; - } - - return ret; -} - -static fm_u16 mt6630_RDS_Get_GoodBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg); - GOOD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u16 mt6630_RDS_Get_BadBlock_Counter(void) -{ - fm_u16 tmp_reg; - - fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg); - BAD_BLK_CNT = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_u8 mt6630_RDS_Get_BadBlock_Ratio(void) -{ - fm_u16 tmp_reg; - fm_u16 gbc; - fm_u16 bbc; - - gbc = mt6630_RDS_Get_GoodBlock_Counter(); - bbc = mt6630_RDS_Get_BadBlock_Counter(); - - if ((gbc + bbc) > 0) { - tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc)); - } else { - tmp_reg = 0; - } - - BAD_BLK_RATIO = tmp_reg; - WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg); - - return tmp_reg; -} - -static fm_s32 mt6630_RDS_BlockCounter_Reset(void) -{ - mt6630_RDS_disable(); - mt6630_RDS_enable(); - - return 0; -} - -static fm_u32 mt6630_RDS_Get_BlerCheck_Interval(void) -{ - return gBLER_CHK_INTERVAL; -} - -static fm_s32 mt6630_RDS_BlerCheck(rds_t *dst) -{ - return 0; -} - -#if 0 -static void RDS_Recovery_Handler(void) -{ - fm_u16 tempData = 0; - - do { - fm_bi->read(FM_RDS_DATA_REG, &tempData); - fm_bi->read(FM_RDS_POINTER, &tempData); - } while (tempData & 0x3); -} -#endif - -#if 0 -static void mt6630_RDS_GetData(fm_u16 *data, fm_u16 datalen) -{ -#define RDS_GROUP_DIFF_OFS 0x007C -#define RDS_FIFO_DIFF 0x007F -#define RDS_CRC_BLK_ADJ 0x0020 -#define RDS_CRC_CORR_CNT 0x001E -#define RDS_CRC_INFO 0x0001 - - fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0; - fm_u16 temp = 0, OutputPofm_s32 = 0; - - WCN_DBG(FM_DBG | RDSC, "get data\n"); - fm_bi->read(FM_RDS_FIFO_STATUS0, &temp); - RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2); - - if ((temp & RDS_FIFO_DIFF) >= 4) { - /* block A data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10; - CRC |= (temp & RDS_CRC_INFO) << 3; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11); - fm_bi->read(FM_RDS_DATA_REG, &data[0]); - - /* block B data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9; - CRC |= (temp & RDS_CRC_INFO) << 2; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7); - fm_bi->read(FM_RDS_DATA_REG, &data[1]); - - /* block C data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8; - CRC |= (temp & RDS_CRC_INFO) << 1; - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3); - fm_bi->read(FM_RDS_DATA_REG, &data[2]); - - /* block D data and info handling */ - fm_bi->read(FM_RDS_INFO, &temp); - RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7; - CRC |= (temp & RDS_CRC_INFO); - FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1); - fm_bi->read(FM_RDS_DATA_REG, &data[3]); - - data[4] = (CRC | RDS_adj | RDSDataCount); - data[5] = FM_WARorrCnt; - - fm_bi->read(FM_RDS_PWDI, &data[6]); - fm_bi->read(FM_RDS_PWDQ, &data[7]); - - fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32); - - /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */ - if (OutputPofm_s32 & 0x3) { - RDS_Recovery_Handler(); - } - - } else { - for (; i < 8; i++) - data[i] = 0; - } -} -#endif - -static void mt6630_RDS_Init_Data(rds_t *pstRDSData) -{ - fm_memset(pstRDSData, 0, sizeof(rds_t)); - bRDS_FirstIn = fm_true; - - fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData)); - fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS)); - fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON)); -} - -fm_bool mt6630_RDS_OnOff(rds_t *dst, fm_bool bFlag) -{ - fm_s32 ret = 0; - - if (mt6630_RDS_support() == fm_false) { - WCN_DBG(FM_ALT | RDSC, "mt6630_RDS_OnOff failed, RDS not support\n"); - return fm_false; - } - - if (bFlag) { - mt6630_RDS_Init_Data(dst); - ret = mt6630_RDS_enable(); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff enable failed\n"); - return fm_false; - } - } else { - ret = mt6630_RDS_disable(); - if(ret) { - WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff disable failed\n"); - return fm_false; - } - } - - return fm_true; -} - -DEFINE_RDSLOG(mt6630_rds_log); - -/* mt6630_RDS_Efm_s32_Handler - response FM RDS interrupt - * @fm - main data structure of FM driver - * This function first get RDS raw data, then call RDS spec parser - */ -static fm_s32 mt6630_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, - fm_u16(*getfreq) (void)) -{ - mt6630_rds_log.log_in(&mt6630_rds_log, rds_raw, rds_size); - return rds_parser(rds_dst, rds_raw, rds_size, getfreq); -} - -static fm_s32 mt6630_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len) -{ - return mt6630_rds_log.log_out(&mt6630_rds_log, dst, dst_len); -} - -static fm_s32 mt6630_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp) -{ - return rds_grp_counter_get(dst, &rdsp->gc); -} - -static fm_s32 mt6630_rds_gc_reset(rds_t *rdsp) -{ - return rds_grp_counter_reset(&rdsp->gc); -} - -fm_s32 MT6630fm_rds_ops_register(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - FMR_ASSERT(ops->bi.write); - FMR_ASSERT(ops->bi.read); - FMR_ASSERT(ops->bi.setbits); - FMR_ASSERT(ops->bi.usdelay); - fm_bi = &ops->bi; - - FMR_ASSERT(ops->cb.cur_freq_get); - FMR_ASSERT(ops->cb.cur_freq_set); - fm_cb = &ops->cb; - - ops->ri.rds_blercheck = mt6630_RDS_BlerCheck; - ops->ri.rds_onoff = mt6630_RDS_OnOff; - ops->ri.rds_parser = mt6630_rds_parser; - ops->ri.rds_gbc_get = mt6630_RDS_Get_GoodBlock_Counter; - ops->ri.rds_bbc_get = mt6630_RDS_Get_BadBlock_Counter; - ops->ri.rds_bbr_get = mt6630_RDS_Get_BadBlock_Ratio; - ops->ri.rds_bc_reset = mt6630_RDS_BlockCounter_Reset; - ops->ri.rds_bci_get = mt6630_RDS_Get_BlerCheck_Interval; - ops->ri.rds_log_get = mt6630_rds_log_get; - ops->ri.rds_gc_get = mt6630_rds_gc_get; - ops->ri.rds_gc_reset = mt6630_rds_gc_reset; - return ret; -} - -fm_s32 MT6630fm_rds_ops_unregister(struct fm_lowlevel_ops *ops) -{ - fm_s32 ret = 0; - - FMR_ASSERT(ops); - - fm_bi = NULL; - fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface)); - return ret; -} |
