/****************************************************************************** * * Copyright(c) 2007 - 2017 Realtek Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * 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. * * The full GNU General Public License is included in this distribution in the * file called LICENSE. * * Contact Information: * wlanfae * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, * Hsinchu 300, Taiwan. * * Larry Finger * *****************************************************************************/ #include "../halbb_precomp.h" #include "halbb_hwimg_raw_data_8852b.h" #include "halbb_hwimg_raw_data_8852b_gain.h" #ifdef BB_8852B_SUPPORT bool halbb_sel_headline_8852b(struct bb_info *bb, u32 *array, u32 array_len, u8 *headline_size, u8 *headline_idx) { bool case_match = false; u32 cut_drv = (u32)bb->hal_com->cv; u32 rfe_drv = (u32)bb->phl_com->dev_cap.rfe_type; u32 cut_para = 0, rfe_para = 0; u32 compare_target = 0; u32 cut_max = 0; u32 i = 0; *headline_idx = 0; *headline_size = 0; if (bb->bb_dbg_i.cr_dbg_mode_en) { rfe_drv = bb->bb_dbg_i.rfe_type_curr_dbg; cut_drv = bb->bb_dbg_i.cut_curr_dbg; } BB_DBG(bb, DBG_INIT, "{RFE, Cart}={%d, %d}, dbg_en=%d\n", rfe_drv, cut_drv, bb->bb_dbg_i.cr_dbg_mode_en); while ((i + 1) < array_len) { if ((array[i] >> 28) != 0xf) { *headline_size = (u8)i; break; } BB_DBG(bb, DBG_INIT, "array[%02d]=0x%08x, array[%02d]=0x%08x\n", i, array[i], i+1, array[i+1]); i += 2; } BB_DBG(bb, DBG_INIT, "headline_size=%d\n", i); if (i == 0) return true; /*case_idx:1 {RFE:Match, CV:Match}*/ compare_target = ((rfe_drv & 0xff) << 16) | (cut_drv & 0xff); BB_DBG(bb, DBG_INIT, "[1] CHK {RFE:Match, CV:Match}\n"); for (i = 0; i < *headline_size; i += 2) { if ((array[i] & 0x0fffffff) == compare_target) { *headline_idx = (u8)(i >> 1); return true; } } BB_DBG(bb, DBG_INIT, "\t fail\n"); /*case_idx:2 {RFE:Match, CV:Dont care}*/ compare_target = ((rfe_drv & 0xff) << 16) | (DONT_CARE_8852B & 0xff); BB_DBG(bb, DBG_INIT, "[2] CHK {RFE:Match, CV:Dont_Care}\n"); for (i = 0; i < *headline_size; i += 2) { if ((array[i] & 0x0fffffff) == compare_target) { *headline_idx = (u8)(i >> 1); return true; } } BB_DBG(bb, DBG_INIT, "\t fail\n"); /*case_idx:3 {RFE:Match, CV:Max_in_Table}*/ BB_DBG(bb, DBG_INIT, "[3] CHK {RFE:Match, CV:Max_in_Table}\n"); for (i = 0; i < *headline_size; i += 2) { rfe_para = (array[i] & 0x00ff0000) >> 16; cut_para = array[i] & 0x0ff; if (rfe_para == rfe_drv) { if (cut_para > cut_max) { cut_max = cut_para; *headline_idx = (u8)(i >> 1); BB_DBG(bb, DBG_INIT, "cut_max:%d\n", cut_max); case_match = true; } } } if (case_match) { return true; } BB_DBG(bb, DBG_INIT, "\t fail\n"); /*case_idx:4 {RFE:Dont Care, CV:Max_in_Table}*/ BB_DBG(bb, DBG_INIT, "[4] CHK {RFE:Dont_Care, CV:Max_in_Table}\n"); for (i = 0; i < *headline_size; i += 2) { rfe_para = (array[i] & 0x00ff0000) >> 16; cut_para = array[i] & 0x0ff; if (rfe_para == DONT_CARE_8852B) { if (cut_para >= cut_max) { cut_max = cut_para; *headline_idx = (u8)(i >> 1); BB_DBG(bb, DBG_INIT, "cut_max:%d\n", cut_max); case_match = true; } } } if (case_match) { return true; } BB_DBG(bb, DBG_INIT, "\t fail\n"); /*case_idx:5 {RFE:Not_Match, CV:Not_Match}*/ BB_DBG(bb, DBG_INIT, "[5] CHK {RFE:Not_Match, CV:Not_Match}\n"); BB_DBG(bb, DBG_INIT, "\t all fail\n"); return false; } void halbb_flag_2_default_8852b(bool *is_matched, bool *find_target) { *is_matched = true; *find_target = false; } bool halbb_cfg_bbcr_ax_8852b(struct bb_info *bb, bool is_form_folder, u32 folder_len, u32 *folder_array, enum phl_phy_idx phy_idx) { bool is_matched, find_target; u32 cfg_target = 0, cfg_para = 0; u32 i = 0; u32 array_len = 0; u32 *array = NULL; u32 v1 = 0, v2 = 0; u8 h_size = 0; u8 h_idx = 0; BB_DBG(bb, DBG_INIT, "===> %s\n", __func__); if (is_form_folder) { array_len = folder_len; array = folder_array; } else { array_len = sizeof(array_mp_8852b_phy_reg) / sizeof(u32); array = (u32 *)array_mp_8852b_phy_reg; } BB_DBG(bb, DBG_INIT, "BBCR_form_folder=%d, len=%d, phy_idx=%d\n", is_form_folder, array_len, phy_idx); if (!halbb_sel_headline_8852b(bb, array, array_len, &h_size, &h_idx)) { BB_WARNING("[%s]Invalid BB CR Pkg\n", __func__); return false; } BB_DBG(bb, DBG_INIT, "h_size = %d, h_idx = %d\n", h_size, h_idx); if (h_size != 0) { cfg_target = array[h_idx << 1] & 0x0fffffff; } i += h_size; BB_DBG(bb, DBG_INIT, "cfg_target = 0x%x\n", cfg_target); BB_DBG(bb, DBG_INIT, "array[i] = 0x%x, array[i+1] = 0x%x\n", array[i], array[i + 1]); halbb_flag_2_default_8852b(&is_matched, &find_target); while ((i + 1) < array_len) { v1 = array[i]; v2 = array[i + 1]; i += 2; switch (v1 >> 28) { case IF_8852B: case ELSE_IF_8852B: cfg_para = v1 & 0x0fffffff; BB_DBG(bb, DBG_INIT, "*if (rfe=%d, cart=%d)\n", (cfg_para & 0xff0000) >> 16, cfg_para & 0xff); break; case ELSE_8852B: BB_DBG(bb, DBG_INIT, "*else\n"); is_matched = false; if (!find_target) { BB_WARNING("Init BBCR Fail in Reg 0x%x\n", array[i]); return false; } break; case END_8852B: BB_DBG(bb, DBG_INIT, "*endif\n"); halbb_flag_2_default_8852b(&is_matched, &find_target); break; case CHK_8852B: /*Check this para meets driver's requirement or not*/ if (find_target) { BB_DBG(bb, DBG_INIT, "\t skip\n"); is_matched = false; break; } if (cfg_para == cfg_target) { is_matched = true; find_target = true; } else { is_matched = false; find_target = false; } BB_DBG(bb, DBG_INIT, "\t match=%d\n", is_matched); break; default: if (is_matched) halbb_cfg_bb_phy_8852b(bb, v1, v2, phy_idx); break; } } BB_DBG(bb, DBG_INIT, "BBCR Init Success\n\n"); return true; } bool halbb_cfg_bb_gain_ax_8852b(struct bb_info *bb, bool is_form_folder, u32 folder_len, u32 *folder_array) { bool is_matched, find_target; u32 cfg_target = 0, cfg_para = 0; u32 i = 0; u32 array_len = 0; u32 *array = NULL; u32 v1 = 0, v2 = 0; u8 h_size = 0; u8 h_idx = 0; BB_DBG(bb, DBG_INIT, "===> %s\n", __func__); if (is_form_folder) { array_len = folder_len; array = folder_array; } else { array_len = sizeof(array_mp_8852b_phy_reg_gain) / sizeof(u32); array = (u32 *)array_mp_8852b_phy_reg_gain; } BB_DBG(bb, DBG_INIT, "GAIN_TABLE_form_folder=%d, len=%d\n", is_form_folder, array_len); if (!halbb_sel_headline_8852b(bb, array, array_len, &h_size, &h_idx)) { BB_WARNING("[%s]Invalid BB CR Pkg\n", __func__); return false; } BB_DBG(bb, DBG_INIT, "h_size = %d, h_idx = %d\n", h_size, h_idx); if (h_size != 0) { cfg_target = array[h_idx << 1] & 0x0fffffff; } i += h_size; BB_DBG(bb, DBG_INIT, "cfg_target = 0x%x\n", cfg_target); BB_DBG(bb, DBG_INIT, "array[i] = 0x%x, array[i+1] = 0x%x\n", array[i], array[i + 1]); halbb_flag_2_default_8852b(&is_matched, &find_target); while ((i + 1) < array_len) { v1 = array[i]; v2 = array[i + 1]; i += 2; switch (v1 >> 28) { case IF_8852B: case ELSE_IF_8852B: cfg_para = v1 & 0x0fffffff; BB_DBG(bb, DBG_INIT, "*if (rfe=%d, cart=%d)\n", (cfg_para & 0xff0000) >> 16, cfg_para & 0xff); break; case ELSE_8852B: BB_DBG(bb, DBG_INIT, "*else\n"); is_matched = false; if (!find_target) { BB_WARNING("Init BBCR Fail in Reg 0x%x\n", array[i]); return false; } break; case END_8852B: BB_DBG(bb, DBG_INIT, "*endif\n"); halbb_flag_2_default_8852b(&is_matched, &find_target); break; case CHK_8852B: /*Check this para meets driver's requirement or not*/ if (find_target) { BB_DBG(bb, DBG_INIT, "\t skip\n"); is_matched = false; break; } if (cfg_para == cfg_target) { is_matched = true; find_target = true; } else { is_matched = false; find_target = false; } BB_DBG(bb, DBG_INIT, "\t match=%d\n", is_matched); break; default: if (is_matched) halbb_cfg_bb_gain_8852b(bb, v1, v2); break; } } BB_DBG(bb, DBG_INIT, "BBCR gain Init Success\n\n"); return true; } u32 halbb_get_8852b_phy_reg_ver(void) { return (u32)BB_REG_RELEASE_VERSION_8852B; } #endif /* end of HWIMG_SUPPORT*/