Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halrf_txgapcal.c
1308 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/24#include "mp_precomp.h"25#include "phydm_precomp.h"2627void odm_bub_sort(u32 *data, u32 n)28{29int i, j, temp, sp;3031for (i = n - 1; i >= 0; i--) {32sp = 1;33for (j = 0; j < i; j++) {34if (data[j] < data[j + 1]) {35temp = data[j];36data[j] = data[j + 1];37data[j + 1] = temp;38sp = 0;39}40}41if (sp == 1)42break;43}44}4546#if (RTL8197F_SUPPORT == 1)4748u4Byte49odm_tx_gain_gap_psd_8197f(50void *dm_void,51u1Byte rf_path,52u4Byte rf56)53{54PDM_ODM_T dm = (PDM_ODM_T)dm_void;5556u1Byte i, j;57u4Byte psd_vaule[5], psd_avg_time = 5, psd_vaule_temp;5859u4Byte iqk_ctl_addr[2][6] = {{0xe30, 0xe34, 0xe50, 0xe54, 0xe38, 0xe3c},60{0xe50, 0xe54, 0xe30, 0xe34, 0xe58, 0xe5c}};6162u4Byte psd_finish_bit[2] = {0x04000000, 0x20000000};63u4Byte psd_fail_bit[2] = {0x08000000, 0x40000000};6465u4Byte psd_cntl_value[2][2] = {{0x38008c1c, 0x10008c1c},66{0x38008c2c, 0x10008c2c}};6768u4Byte psd_report_addr[2] = {0xea0, 0xec0};6970odm_set_rf_reg(dm, rf_path, RF_0xdf, bRFRegOffsetMask, 0x00e02);7172ODM_delay_us(100);7374odm_set_bb_reg(dm, R_0xe28, 0xffffffff, 0x0);7576odm_set_rf_reg(dm, rf_path, RF_0x56, 0xfff, rf56);77while (rf56 != (odm_get_rf_reg(dm, rf_path, RF_0x56, 0xfff)))78odm_set_rf_reg(dm, rf_path, RF_0x56, 0xfff, rf56);7980odm_set_bb_reg(dm, R_0xd94, 0xffffffff, 0x44FFBB44);81odm_set_bb_reg(dm, R_0xe70, 0xffffffff, 0x00400040);82odm_set_bb_reg(dm, R_0xc04, 0xffffffff, 0x6f005403);83odm_set_bb_reg(dm, R_0xc08, 0xffffffff, 0x000804e4);84odm_set_bb_reg(dm, R_0x874, 0xffffffff, 0x04203400);85odm_set_bb_reg(dm, R_0xe28, 0xffffffff, 0x80800000);8687odm_set_bb_reg(dm, iqk_ctl_addr[rf_path][0], 0xffffffff, psd_cntl_value[rf_path][0]);88odm_set_bb_reg(dm, iqk_ctl_addr[rf_path][1], 0xffffffff, psd_cntl_value[rf_path][1]);89odm_set_bb_reg(dm, iqk_ctl_addr[rf_path][2], 0xffffffff, psd_cntl_value[rf_path][0]);90odm_set_bb_reg(dm, iqk_ctl_addr[rf_path][3], 0xffffffff, psd_cntl_value[rf_path][0]);91odm_set_bb_reg(dm, iqk_ctl_addr[rf_path][4], 0xffffffff, 0x8215001F);92odm_set_bb_reg(dm, iqk_ctl_addr[rf_path][5], 0xffffffff, 0x2805001F);9394odm_set_bb_reg(dm, R_0xe40, 0xffffffff, 0x81007C00);95odm_set_bb_reg(dm, R_0xe44, 0xffffffff, 0x81004800);96odm_set_bb_reg(dm, R_0xe4c, 0xffffffff, 0x0046a8d0);9798for (i = 0; i < psd_avg_time; i++) {99for (j = 0; j < 1000; j++) {100odm_set_bb_reg(dm, R_0xe48, 0xffffffff, 0xfa005800);101odm_set_bb_reg(dm, R_0xe48, 0xffffffff, 0xf8005800);102103while (!odm_get_bb_reg(dm, R_0xeac, psd_finish_bit[rf_path]))104; /*wait finish bit*/105106if (!odm_get_bb_reg(dm, R_0xeac, psd_fail_bit[rf_path])) { /*check fail bit*/107108psd_vaule[i] = odm_get_bb_reg(dm, psd_report_addr[rf_path], 0xffffffff);109110if (psd_vaule[i] > 0xffff)111break;112}113}114115RF_DBG(dm, DBG_RF_IQK,116"[TGGC] rf0=0x%x rf56=0x%x rf56_reg=0x%x time=%d psd_vaule=0x%x\n",117odm_get_rf_reg(dm, rf_path, RF_0x0, 0xff), rf56,118odm_get_rf_reg(dm, rf_path, RF_0x56, 0xfff), j,119psd_vaule[i]);120}121122odm_bub_sort(psd_vaule, psd_avg_time);123124psd_vaule_temp = psd_vaule[(UINT)(psd_avg_time / 2)];125126odm_set_bb_reg(dm, R_0xd94, 0xffffffff, 0x44BBBB44);127odm_set_bb_reg(dm, R_0xe70, 0xffffffff, 0x80408040);128odm_set_bb_reg(dm, R_0xc04, 0xffffffff, 0x6f005433);129odm_set_bb_reg(dm, R_0xc08, 0xffffffff, 0x000004e4);130odm_set_bb_reg(dm, R_0x874, 0xffffffff, 0x04003400);131odm_set_bb_reg(dm, R_0xe28, 0xffffffff, 0x00000000);132133RF_DBG(dm, DBG_RF_IQK,134"[TGGC] rf0=0x%x rf56=0x%x rf56_reg=0x%x psd_vaule_temp=0x%x\n",135odm_get_rf_reg(dm, rf_path, RF_0x0, 0xff), rf56,136odm_get_rf_reg(dm, rf_path, RF_0x56, 0xfff), psd_vaule_temp);137138odm_set_rf_reg(dm, rf_path, RF_0xdf, bRFRegOffsetMask, 0x00602);139140return psd_vaule_temp;141}142143void odm_tx_gain_gap_calibration_8197f(144void *dm_void)145{146PDM_ODM_T dm = (PDM_ODM_T)dm_void;147148u1Byte rf_path, rf0_idx, rf0_idx_current, rf0_idx_next, i, delta_gain_retry = 3;149150s1Byte delta_gain_gap_pre, delta_gain_gap[2][11];151u4Byte rf56_current, rf56_next, psd_value_current, psd_value_next;152u4Byte psd_gap, rf56_current_temp[2][11];153s4Byte rf33[2][11];154155memset(rf33, 0x0, sizeof(rf33));156157for (rf_path = RF_PATH_A; rf_path <= RF_PATH_B; rf_path++) {158if (rf_path == RF_PATH_A)159odm_set_bb_reg(dm, R_0x88c, (BIT(21) | BIT(20)), 0x3); /*disable 3-wire*/160else if (rf_path == RF_PATH_B)161odm_set_bb_reg(dm, R_0x88c, (BIT(23) | BIT(22)), 0x3); /*disable 3-wire*/162163ODM_delay_us(100);164165for (rf0_idx = 1; rf0_idx <= 10; rf0_idx++) {166rf0_idx_current = 3 * (rf0_idx - 1) + 1;167odm_set_rf_reg(dm, rf_path, RF_0x0, 0xff, rf0_idx_current);168ODM_delay_us(100);169rf56_current_temp[rf_path][rf0_idx] = odm_get_rf_reg(dm, rf_path, RF_0x56, 0xfff);170rf56_current = rf56_current_temp[rf_path][rf0_idx];171172rf0_idx_next = 3 * rf0_idx + 1;173odm_set_rf_reg(dm, rf_path, RF_0x0, 0xff, rf0_idx_next);174ODM_delay_us(100);175rf56_next = odm_get_rf_reg(dm, rf_path, RF_0x56, 0xfff);176177RF_DBG(dm, DBG_RF_IQK,178"[TGGC] rf56_current[%d][%d]=0x%x rf56_next[%d][%d]=0x%x\n",179rf_path, rf0_idx, rf56_current, rf_path, rf0_idx,180rf56_next);181182if ((rf56_current >> 5) == (rf56_next >> 5)) {183delta_gain_gap[rf_path][rf0_idx] = 0;184185RF_DBG(dm, DBG_RF_IQK,186"[TGGC] rf56_current[11:5] == rf56_next[%d][%d][11:5]=0x%x delta_gain_gap[%d][%d]=%d\n",187rf_path, rf0_idx, (rf56_next >> 5),188rf_path, rf0_idx,189delta_gain_gap[rf_path][rf0_idx]);190191continue;192}193194RF_DBG(dm, DBG_RF_IQK,195"[TGGC] rf56_current[%d][%d][11:5]=0x%x != rf56_next[%d][%d][11:5]=0x%x\n",196rf_path, rf0_idx, (rf56_current >> 5), rf_path,197rf0_idx, (rf56_next >> 5));198199for (i = 0; i < delta_gain_retry; i++) {200psd_value_current = odm_tx_gain_gap_psd_8197f(dm, rf_path, rf56_current);201202psd_value_next = odm_tx_gain_gap_psd_8197f(dm, rf_path, rf56_next - 2);203204psd_gap = psd_value_next / (psd_value_current / 1000);205206#if 0207if (psd_gap > 1413)208delta_gain_gap[rf_path][rf0_idx] = 1;209else if (psd_gap > 1122)210delta_gain_gap[rf_path][rf0_idx] = 0;211else212delta_gain_gap[rf_path][rf0_idx] = -1;213#endif214215if (psd_gap > 1445)216delta_gain_gap[rf_path][rf0_idx] = 1;217else if (psd_gap > 1096)218delta_gain_gap[rf_path][rf0_idx] = 0;219else220delta_gain_gap[rf_path][rf0_idx] = -1;221222if (i == 0)223delta_gain_gap_pre = delta_gain_gap[rf_path][rf0_idx];224225RF_DBG(dm, DBG_RF_IQK,226"[TGGC] psd_value_current=0x%x psd_value_next=0x%x psd_value_next/psd_value_current=%d delta_gain_gap[%d][%d]=%d\n",227psd_value_current, psd_value_next,228psd_gap, rf_path, rf0_idx,229delta_gain_gap[rf_path][rf0_idx]);230231if (i == 0 && delta_gain_gap[rf_path][rf0_idx] == 0)232break;233234if (delta_gain_gap_pre != delta_gain_gap[rf_path][rf0_idx]) {235delta_gain_gap[rf_path][rf0_idx] = 0;236237RF_DBG(dm, DBG_RF_IQK, "[TGGC] delta_gain_gap_pre(%d) != delta_gain_gap[%d][%d](%d) time=%d\n",238delta_gain_gap_pre, rf_path, rf0_idx, delta_gain_gap[rf_path][rf0_idx], i);239240break;241}242243RF_DBG(dm, DBG_RF_IQK,244"[TGGC] delta_gain_gap_pre(%d) == delta_gain_gap[%d][%d](%d) time=%d\n",245delta_gain_gap_pre, rf_path, rf0_idx,246delta_gain_gap[rf_path][rf0_idx], i);247}248}249250if (rf_path == RF_PATH_A)251odm_set_bb_reg(dm, R_0x88c, (BIT(21) | BIT(20)), 0x0); /*enable 3-wire*/252else if (rf_path == RF_PATH_B)253odm_set_bb_reg(dm, R_0x88c, (BIT(23) | BIT(22)), 0x0); /*enable 3-wire*/254255ODM_delay_us(100);256}257258#if 0259/*odm_set_bb_reg(dm, R_0x88c, (BIT(23) | BIT(22) | BIT(21) | BIT(20)), 0x0);*/ /*enable 3-wire*/260#endif261262for (rf_path = RF_PATH_A; rf_path <= RF_PATH_B; rf_path++) {263odm_set_rf_reg(dm, rf_path, RF_0xef, bRFRegOffsetMask, 0x00100);264265for (rf0_idx = 1; rf0_idx <= 10; rf0_idx++) {266rf33[rf_path][rf0_idx] = rf33[rf_path][rf0_idx] + (rf56_current_temp[rf_path][rf0_idx] & 0x1f);267268for (i = rf0_idx; i <= 10; i++)269rf33[rf_path][rf0_idx] = rf33[rf_path][rf0_idx] + delta_gain_gap[rf_path][i];270271if (rf33[rf_path][rf0_idx] >= 0x1d)272rf33[rf_path][rf0_idx] = 0x1d;273else if (rf33[rf_path][rf0_idx] <= 0x2)274rf33[rf_path][rf0_idx] = 0x2;275276rf33[rf_path][rf0_idx] = rf33[rf_path][rf0_idx] + ((rf0_idx - 1) * 0x4000) + (rf56_current_temp[rf_path][rf0_idx] & 0xfffe0);277278RF_DBG(dm, DBG_RF_IQK,279"[TGGC] rf56[%d][%d]=0x%05x rf33[%d][%d]=0x%05x\n",280rf_path, rf0_idx,281rf56_current_temp[rf_path][rf0_idx], rf_path,282rf0_idx, rf33[rf_path][rf0_idx]);283284odm_set_rf_reg(dm, rf_path, RF_0x33, bRFRegOffsetMask, rf33[rf_path][rf0_idx]);285}286287odm_set_rf_reg(dm, rf_path, RF_0xef, bRFRegOffsetMask, 0x00000);288}289}290#endif291292void odm_tx_gain_gap_calibration(void *dm_void)293{294PDM_ODM_T dm = (PDM_ODM_T)dm_void;295#if (RTL8197F_SUPPORT == 1)296if (dm->SupportICType & ODM_RTL8197F)297odm_tx_gain_gap_calibration_8197f(dm_void);298#endif299}300301302