1
0
mirror of https://github.com/aircrack-ng/rtl8812au.git synced 2024-11-30 00:47:38 +00:00
rtl8812au/hal/phydm/phydm_adc_sampling.c
2017-04-15 11:46:31 +03:00

427 lines
12 KiB
C

#include "mp_precomp.h"
#include "phydm_precomp.h"
#include "rtl8197f/Hal8197FPhyReg.h"
#if ((RTL8197F_SUPPORT == 1)||(RTL8822B_SUPPORT == 1))
#include "WlanHAL/HalMac88XX/halmac_reg2.h"
#else
#include "WlanHAL/HalHeader/HalComReg.h"
#endif
#if (PHYDM_LA_MODE_SUPPORT == 1)
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
BOOLEAN
ADCSmp_BufferAllocate(
IN PADAPTER Adapter,
IN PRT_ADCSMP AdcSmp
)
{
PRT_ADCSMP_STRING ADCSmpBuf = &(AdcSmp->ADCSmpBuf);
if (ADCSmpBuf->Length == 0) {
if (PlatformAllocateMemoryWithZero(Adapter, (void **)&(ADCSmpBuf->Octet), 0x10000) == RT_STATUS_SUCCESS)
ADCSmpBuf->Length = 0x10000;
else
return FALSE;
}
return TRUE;
}
#endif
VOID
ADCSmp_GetTxPktBuf(
IN PVOID pDM_VOID,
IN PRT_ADCSMP_STRING ADCSmpBuf
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
u4Byte i = 0, value32, DataL = 0, DataH = 0;
u4Byte Addr, Finish_Addr;
u4Byte End_Addr = (ADCSmpBuf->start_pos + ADCSmpBuf->buffer_size)-1; /*End_Addr = 0x3ffff;*/
BOOLEAN bRoundUp;
static u4Byte page = 0xFF;
PlatformZeroMemory(ADCSmpBuf->Octet, ADCSmpBuf->Length);
ODM_Write1Byte(pDM_Odm, REG_PKT_BUFF_ACCESS_CTRL, 0x69);
/*PlatformEFIOWrite1Byte(Adapter, REG_PKT_BUFF_ACCESS_CTRL_8814A, 0x69);*/
/*0x106[7:0]=0x69: access TXPKT Buffer*/
/* 0xA5: access RXPKT Buffer*/
/* 0x7F: access TXREPORT buffer*/
DbgPrint("%s\n", __func__);
value32 = ODM_Read4Byte(pDM_Odm, REG_IQ_DUMP);
bRoundUp = (BOOLEAN)((value32 & BIT31) >> 31);
Finish_Addr = (value32 & 0x7FFF0000) >> 16; /*Reg7C0[30:16]: finish addr (unit: 8byte)*/
if (bRoundUp)
Addr = (Finish_Addr+1)<<3;
else
Addr = ADCSmpBuf->start_pos;
DbgPrint("bRoundUp = %d, Finish_Addr=0x%x, value32=0x%x\n", bRoundUp, Finish_Addr, value32);
DbgPrint("End_Addr = %x, ADCSmpBuf->start_pos = 0x%x, ADCSmpBuf->buffer_size = 0x%x\n", End_Addr, ADCSmpBuf->start_pos, ADCSmpBuf->buffer_size);
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
watchdog_stop(pDM_Odm->priv);
#endif
if (pDM_Odm->SupportICType & ODM_RTL8197F) {
for (Addr = 0x0, i = 0; Addr < End_Addr; Addr += 8, i += 2) { /*64K byte*/
if ((Addr&0xfff) == 0)
ODM_Write2Byte(pDM_Odm, REG_PKTBUF_DBG_CTRL, 0x780+(Addr >> 12));
DataL = ODM_Read4Byte(pDM_Odm, 0x8000+(Addr&0xfff));
DataH = ODM_Read4Byte(pDM_Odm, 0x8000+(Addr&0xfff)+4);
DbgPrint("%08x%08x\n", DataH, DataL);
}
} else {
while (Addr != (Finish_Addr<<3)) {
if (page != (Addr >> 12)) {
/*Reg140=0x780+(Addr>>12), Addr=0x30~0x3F, total 16 pages*/
page = (Addr >> 12);
ODM_Write2Byte(pDM_Odm, REG_PKTBUF_DBG_CTRL, 0x780+page);
}
/*pDataL = 0x8000+(Addr&0xfff);*/
DataL = ODM_Read4Byte(pDM_Odm, 0x8000+(Addr&0xfff));
DataH = ODM_Read4Byte(pDM_Odm, 0x8000+(Addr&0xfff)+4);
/*ADCSmpBuf->Octet[i] = DataH;*/
/*ADCSmpBuf->Octet[i+1] = DataL;*/
/*DbgPrint("%08x%08x\n", ADCSmpBuf->Octet[i], ADCSmpBuf->Octet[i+1]);*/
DbgPrint("%08x%08x\n", DataH, DataL);
i = i + 2;
if ((Addr+8) >= End_Addr)
Addr = ADCSmpBuf->start_pos;
else
Addr = Addr + 8;
}
}
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
watchdog_resume(pDM_Odm->priv);
#endif
}
VOID
ADCSmp_Start(
IN PVOID pDM_VOID,
IN PRT_ADCSMP AdcSmp
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
u1Byte tmpU1b;
PRT_ADCSMP_STRING Buffer = &(AdcSmp->ADCSmpBuf);
RT_ADCSMP_TRIG_SIG_SEL TrigSigSel = AdcSmp->ADCSmpTrigSigSel;
u1Byte backup_DMA;
DbgPrint("%s\n", __func__);
if (pDM_Odm->SupportICType & ODM_RTL8197F)
ODM_SetBBReg(pDM_Odm, r_dma_trigger_8197F, 0xf00, AdcSmp->ADCSmpDmaDataSigSel); /*0x9A0[11:8]*/
else
ODM_SetBBReg(pDM_Odm , ODM_ADC_TRIGGER_Jaguar2, 0xf00, AdcSmp->ADCSmpDmaDataSigSel); /*0x95C[11:8]*/
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP+1, AdcSmp->ADCSmpTriggerTime);
if (pDM_Odm->SupportICType & ODM_RTL8197F)
ODM_SetBBReg(pDM_Odm, r_reset_cfo_rpt_ctrl_8197F, BIT26, 0x1);
else { /*for 8814A and 8822B?*/
ODM_Write1Byte(pDM_Odm, 0x198c, 0x7);
ODM_Write1Byte(pDM_Odm, 0x8b4, 0x80);
}
if (AdcSmp->ADCSmpTrigSel == ADCSMP_MAC_TRIG) { /* trigger by MAC*/
if (TrigSigSel == ADCSMP_TRIG_REG) { /* manual trigger 0x7C0[5] = 0 -> 1*/
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP, 0xCB); /*0x7C0[7:0]=8'b1100_1011*/
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP, 0xEB); /*0x7C0[7:0]=8'b1110_1011*/
} else if (TrigSigSel == ADCSMP_TRIG_CCA)
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP, 0x8B); /*0x7C0[7:0]=8'b1000_1011*/
else if (TrigSigSel == ADCSMP_TRIG_CRCFAIL)
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP, 0x4B); /*0x7C0[7:0]=8'b0100_1011*/
else if (TrigSigSel == ADCSMP_TRIG_CRCOK)
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP, 0x0B); /*0x7C0[7:0]=8'b0000_1011*/
} else { /*trigger by BB*/
if (pDM_Odm->SupportICType & ODM_RTL8197F)
ODM_SetBBReg(pDM_Odm, r_dma_trigger_8197F, 0x1f, TrigSigSel); /*0x9A0[4:0]*/
else
ODM_SetBBReg(pDM_Odm , ODM_ADC_TRIGGER_Jaguar2, 0x1f, TrigSigSel); /*0x95C[4:0], 0x1F: trigger by CCA*/
ODM_Write1Byte(pDM_Odm, REG_IQ_DUMP, 0x03); /*0x7C0[7:0]=8'b0000_0011*/
}
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
watchdog_stop(pDM_Odm->priv);
#endif
/*Polling*/
do {
tmpU1b = ODM_Read1Byte(pDM_Odm, REG_IQ_DUMP);
if (AdcSmp->ADCSmpState != ADCSMP_STATE_SET) {
DbgPrint("ADCSmpState != ADCSMP_STATE_SET\n");
break;
} else if (tmpU1b & BIT1) {
ODM_delay_us(AdcSmp->ADCSmpPollingTime);
continue;
} else {
DbgPrint("%s Query OK\n", __func__);
if (pDM_Odm->SupportICType & ODM_RTL8197F)
ODM_SetBBReg(pDM_Odm, REG_IQ_DUMP, BIT0, 0x0);
break;
}
} while (1);
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
watchdog_resume(pDM_Odm->priv);
#if (RTL8197F_SUPPORT == 1)
if (pDM_Odm->SupportICType & ODM_RTL8197F) {
/*Stop DMA*/
backup_DMA = ODM_GetMACReg(pDM_Odm, 0x300, bMaskLWord);
ODM_SetMACReg(pDM_Odm, 0x300, 0x7fff, backup_DMA|0x7fff);
/*move LA mode content from IMEM to TxPktBuffer
Src : OCPBASE_IMEM 0x00000000
Dest : OCPBASE_TXBUF 0x18780000
Len : 64K*/
GET_HAL_INTERFACE(pDM_Odm->priv)->InitDDMAHandler(pDM_Odm->priv, OCPBASE_IMEM, OCPBASE_TXBUF, 0x10000);
}
#endif
#endif
if (AdcSmp->ADCSmpState == ADCSMP_STATE_SET)
ADCSmp_GetTxPktBuf(pDM_Odm, Buffer);
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
if (pDM_Odm->SupportICType & ODM_RTL8197F)
ODM_SetMACReg(pDM_Odm, 0x300, 0x7fff, backup_DMA); /*Resume DMA*/
#endif
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
if (AdcSmp->ADCSmpState == ADCSMP_STATE_SET)
AdcSmp->ADCSmpState = ADCSMP_STATE_QUERY;
#endif
DbgPrint("%s Status %d\n", __func__, AdcSmp->ADCSmpState);
}
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
VOID
ADCSmpWorkItemCallback(
IN PVOID pContext
)
{
PADAPTER Adapter = (PADAPTER)pContext;
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PRT_ADCSMP AdcSmp = &(pHalData->ADCSmp);
ADCSmp_Start(Adapter, AdcSmp);
}
#endif
VOID
ADCSmp_Set(
IN PVOID pDM_VOID,
IN RT_ADCSMP_TRIG_SEL TrigSel,
IN RT_ADCSMP_TRIG_SIG_SEL TrigSigSel,
IN u1Byte DmaDataSigSel,
IN u1Byte TriggerTime,
IN u2Byte PollingTime
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
BOOLEAN retValue = TRUE;
PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp);
/*
DbgPrint("%s\n ADCSmpState %d ADCSmpTrigSig %d ADCSmpTrigSigSel %d\n",
__FUNCTION__, AdcSmp->ADCSmpState, TrigSel, TrigSigSel);
DbgPrint("ADCSmpDmaDataSigSel %d, ADCSmpTriggerTime %d ADCSmpPollingTime %d\n",
DmaDataSigSel, TriggerTime, PollingTime);
*/
AdcSmp->ADCSmpTrigSel = TrigSel;
AdcSmp->ADCSmpTrigSigSel = TrigSigSel;
AdcSmp->ADCSmpDmaDataSigSel = DmaDataSigSel;
AdcSmp->ADCSmpTriggerTime = TriggerTime;
AdcSmp->ADCSmpPollingTime = PollingTime;
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
if (AdcSmp->ADCSmpState != ADCSMP_STATE_IDLE)
retValue = FALSE;
else if (AdcSmp->ADCSmpBuf.Length == 0)
retValue = ADCSmp_BufferAllocate(pDM_Odm, AdcSmp);
#endif
if (retValue) {
AdcSmp->ADCSmpState = ADCSMP_STATE_SET;
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
PlatformScheduleWorkItem(&(pHalData->ADCSmpWorkItem));
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
ADCSmp_Start(pDM_Odm, AdcSmp);
#endif
}
DbgPrint("ADCSmpState %d Return Status %d\n", AdcSmp->ADCSmpState, retValue);
}
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
RT_STATUS
ADCSmp_Query(
IN PADAPTER Adapter,
IN ULONG InformationBufferLength,
OUT PVOID InformationBuffer,
OUT PULONG BytesWritten
)
{
RT_STATUS retStatus = RT_STATUS_SUCCESS;
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PRT_ADCSMP AdcSmp = &(pHalData->ADCSmp);
PRT_ADCSMP_STRING ADCSmpBuf = &(AdcSmp->ADCSmpBuf);
DbgPrint("%s ADCSmpState %d", __func__, AdcSmp->ADCSmpState);
if (InformationBufferLength != ADCSmpBuf->buffer_size) {
*BytesWritten = 0;
retStatus = RT_STATUS_RESOURCE;
} else if (ADCSmpBuf->Length != ADCSmpBuf->buffer_size) {
*BytesWritten = 0;
retStatus = RT_STATUS_RESOURCE;
} else if (AdcSmp->ADCSmpState != ADCSMP_STATE_QUERY) {
*BytesWritten = 0;
retStatus = RT_STATUS_PENDING;
} else {
PlatformMoveMemory(InformationBuffer, ADCSmpBuf->Octet, ADCSmpBuf->buffer_size);
*BytesWritten = ADCSmpBuf->buffer_size;
AdcSmp->ADCSmpState = ADCSMP_STATE_IDLE;
}
DbgPrint("Return Status %d\n", retStatus);
return retStatus;
}
#endif
VOID
ADCSmp_Stop(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp);
AdcSmp->ADCSmpState = ADCSMP_STATE_IDLE;
DbgPrint("%s status %d\n", __func__, AdcSmp->ADCSmpState);
}
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
u1Byte ADC_buffer[0x20000];
#endif
VOID
ADCSmp_Init(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp);
PRT_ADCSMP_STRING ADCSmpBuf = &(AdcSmp->ADCSmpBuf);
AdcSmp->ADCSmpState = ADCSMP_STATE_IDLE;
if (pDM_Odm->SupportICType & ODM_RTL8814A) {
ADCSmpBuf->start_pos = 0x30000;
ADCSmpBuf->buffer_size = 0x10000;
} else if (pDM_Odm->SupportICType & ODM_RTL8822B) {
ADCSmpBuf->start_pos = 0x20000;
ADCSmpBuf->buffer_size = 0x20000;
} else if (pDM_Odm->SupportICType & ODM_RTL8197F) {
ADCSmpBuf->start_pos = 0x00000;
ADCSmpBuf->buffer_size = 0x10000;
}
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
PlatformInitializeWorkItem(
Adapter,
&(pHalData->ADCSmpWorkItem),
(RT_WORKITEM_CALL_BACK)ADCSmpWorkItemCallback,
(PVOID)Adapter,
"ADCSmpWorkItem");
#endif
}
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
VOID
ADCSmp_DeInit(
PADAPTER Adapter
)
{
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PRT_ADCSMP AdcSmp = &(pHalData->ADCSmp);
PRT_ADCSMP_STRING ADCSmpBuf = &(AdcSmp->ADCSmpBuf);
ADCSmp_Stop(Adapter);
PlatformFreeWorkItem(&(pHalData->ADCSmpWorkItem));
if (ADCSmpBuf->Length != 0x0) {
PlatformFreeMemory(ADCSmpBuf->Octet, ADCSmpBuf->Length);
ADCSmpBuf->Length = 0x0;
}
}
VOID
Dump_MAC(
PADAPTER Adapter
)
{
u4Byte Addr = 0;
for (Addr = 0; Addr < 0x1A3D; Addr++)
DbgPrint("%04x %04x\n", Addr, PlatformEFIORead4Byte(Adapter, Addr));
}
VOID
Dump_BB(
PADAPTER Adapter
)
{
u4Byte Addr = 0;
for (Addr = 0; Addr < 0x1AFD; Addr++)
DbgPrint("%04x %04x\n", Addr, PHY_QueryBBReg(Adapter, Addr, bMaskDWord));
}
VOID
Dump_RF(
PADAPTER Adapter
)
{
u1Byte Addr = 0, Path = 0;
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
for (Path = ODM_RF_PATH_A; Path < pHalData->NumTotalRFPath; Path++) {
for (Addr = 0; Addr < 0xF6; Addr++)
DbgPrint("%04x %04x\n", Addr, PHY_QueryRFReg(Adapter, Path, Addr, bRFRegOffsetMask));
}
}
#endif
#endif