/* SPDX-License-Identifier: GPL-2.0 */ #include "mp_precomp.h" #include "phydm_precomp.h" #if (DM_ODM_SUPPORT_TYPE & ODM_AP) #if ((RTL8197F_SUPPORT == 1)||(RTL8822B_SUPPORT == 1)) #include "rtl8197f/Hal8197FPhyReg.h" #include "WlanHAL/HalMac88XX/halmac_reg2.h" #else #include "WlanHAL/HalHeader/HalComReg.h" #endif #endif #if (PHYDM_LA_MODE_SUPPORT == 1) #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) #if WPP_SOFTWARE_TRACE #include "phydm_adc_sampling.tmh" #endif BOOLEAN phydm_la_buffer_allocate( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); PADAPTER Adapter = pDM_Odm->Adapter; PRT_ADCSMP_STRING ADCSmpBuf = &(AdcSmp->ADCSmpBuf); DbgPrint("[LA mode BufferAllocate]\n"); if (ADCSmpBuf->Length == 0) { if (PlatformAllocateMemoryWithZero(Adapter, (void **)&(ADCSmpBuf->Octet), ADCSmpBuf->buffer_size) == RT_STATUS_SUCCESS) ADCSmpBuf->Length = ADCSmpBuf->buffer_size; else return FALSE; } return TRUE; } #endif VOID phydm_la_get_tx_pkt_buf( 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); 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; u4Byte smp_cnt = 0, smp_number = 0, Addr_8byte = 0; ODM_Memory_Set(pDM_Odm, ADCSmpBuf->Octet, 0, ADCSmpBuf->Length); ODM_Write1Byte(pDM_Odm, 0x0106, 0x69); DbgPrint("GetTxPktBuf\n"); value32 = ODM_Read4Byte(pDM_Odm, 0x7c0); bRoundUp = (BOOLEAN)((value32 & BIT31) >> 31); Finish_Addr = (value32 & 0x7FFF0000) >> 16; /*Reg7C0[30:16]: finish addr (unit: 8byte)*/ if(bRoundUp) { Addr = (Finish_Addr+1)<<3; DbgPrint("bRoundUp = ((%d)), Finish_Addr=((0x%x)), 0x7c0=((0x%x)) \n", bRoundUp, Finish_Addr, value32); smp_number = ((ADCSmpBuf->buffer_size)>>3); /*Byte to 64Byte*/ } else { Addr = ADCSmpBuf->start_pos; Addr_8byte = Addr>>3; if(Addr_8byte > Finish_Addr) smp_number = Addr_8byte - Finish_Addr; else smp_number = Finish_Addr - Addr_8byte; DbgPrint("bRoundUp = ((%d)), Finish_Addr=((0x%x * 8Byte)), Start_Addr = ((0x%x * 8Byte)), smp_number = ((%d))\n", bRoundUp, Finish_Addr, Addr_8byte, smp_number); } /* 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_SetBBReg(pDM_Odm, 0x0140, bMaskLWord, 0x780+(Addr >> 12)); DataL = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff), bMaskDWord); DataH = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff)+4, bMaskDWord); 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_SetBBReg(pDM_Odm, 0x0140, bMaskLWord, 0x780+page); /*pDataL = 0x8000+(Addr&0xfff);*/ DataL = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff), bMaskDWord); DataH = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff)+4, bMaskDWord); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) ADCSmpBuf->Octet[i] = DataH; ADCSmpBuf->Octet[i+1] = DataL; #endif #if DBG DbgPrint("%08x%08x\n", DataH, DataL); #else #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("%08x%08x\n", ADCSmpBuf->Octet[i], ADCSmpBuf->Octet[i+1])); #endif #endif i = i + 2; if ((Addr+8) >= End_Addr) Addr = ADCSmpBuf->start_pos; else Addr = Addr + 8; smp_cnt ++; if (smp_cnt >= (smp_number-1)) break; } DbgPrint("smp_cnt = ((%d))\n", smp_cnt); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("smp_cnt = ((%d))\n", smp_cnt)); #endif } #if (DM_ODM_SUPPORT_TYPE & ODM_AP) watchdog_resume(pDM_Odm->priv); #endif } VOID phydm_la_mode_set_mac_iq_dump( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); u4Byte reg_value; ODM_Write1Byte(pDM_Odm, 0x7c0, 0); /*clear all 0x7c0*/ ODM_SetMACReg(pDM_Odm, 0x7c0, BIT0, 1); /*Enable LA mode HW block*/ if (AdcSmp->la_trig_mode == PHYDM_MAC_TRIG) { AdcSmp->is_bb_trigger = 0; ODM_SetMACReg(pDM_Odm, 0x7c0, BIT2, 1); /*polling bit for MAC mode*/ ODM_SetMACReg(pDM_Odm, 0x7c0, BIT4|BIT3, AdcSmp->la_trigger_edge); /*trigger mode for MAC*/ DbgPrint("[MAC_trig] ref_mask = ((0x%x)), ref_value = ((0x%x)), dbg_port = ((0x%x))\n", AdcSmp->la_mac_ref_mask, AdcSmp->la_TrigSigSel, AdcSmp->la_dbg_port); /*[Set MAC Debug Port]*/ ODM_SetMACReg(pDM_Odm, 0xF4, BIT16, 1); ODM_SetMACReg(pDM_Odm, 0x38, 0xff0000, AdcSmp->la_dbg_port); ODM_SetMACReg(pDM_Odm, 0x7c4, bMaskDWord, AdcSmp->la_mac_ref_mask); ODM_SetMACReg(pDM_Odm, 0x7c8, bMaskDWord, AdcSmp->la_TrigSigSel); } else { AdcSmp->is_bb_trigger = 1; ODM_SetMACReg(pDM_Odm, 0x7c0, BIT1, 1); /*polling bit for BB ADC mode*/ if (AdcSmp->la_trig_mode == PHYDM_ADC_MAC_TRIG) { ODM_SetMACReg(pDM_Odm, 0x7c0, BIT3, 1); /*polling bit for MAC trigger event*/ ODM_SetMACReg(pDM_Odm, 0x7c0, BIT7|BIT6, AdcSmp->la_TrigSigSel); if (AdcSmp->la_TrigSigSel == ADCSMP_TRIG_REG) ODM_SetMACReg(pDM_Odm, 0x7c0, BIT5, 1); /* manual trigger 0x7C0[5] = 0 -> 1*/ } } reg_value = ODM_GetBBReg(pDM_Odm, 0x7c0, 0xff); DbgPrint("4. [Set MAC IQ dump] 0x7c0[7:0] = ((0x%x))\n", reg_value); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("4. [Set MAC IQ dump] 0x7c0[7:0] = ((0x%x))\n", reg_value)); #endif } void phydm_la_mode_set_dma_type( IN PVOID pDM_VOID, IN u1Byte la_dma_type ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; DbgPrint("2. [LA mode DMA setting] Dma_type = ((%d))\n", la_dma_type); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("2. [LA mode DMA setting] Dma_type = ((%d))\n", la_dma_type)); #endif if (pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) ODM_SetBBReg(pDM_Odm, 0x9a0, 0xf00, la_dma_type); /*0x9A0[11:8]*/ else ODM_SetBBReg(pDM_Odm , ODM_ADC_TRIGGER_Jaguar2, 0xf00, la_dma_type); /*0x95C[11:8]*/ } VOID phydm_adc_smp_start( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); u1Byte tmpU1b; u1Byte backup_DMA, while_cnt = 0; u1Byte polling_ok = FALSE, target_polling_bit; phydm_la_mode_bb_setting(pDM_Odm); phydm_la_mode_set_dma_type(pDM_Odm, AdcSmp->la_dma_type); phydm_la_mode_set_trigger_time(pDM_Odm, AdcSmp->la_TriggerTime); if (pDM_Odm->SupportICType & ODM_RTL8197F) ODM_SetBBReg(pDM_Odm, 0xd00, BIT26, 0x1); else { /*for 8814A and 8822B?*/ ODM_Write1Byte(pDM_Odm, 0x198c, 0x7); ODM_Write1Byte(pDM_Odm, 0x8b4, 0x80); //ODM_SetBBReg(pDM_Odm, 0x8b4, BIT7, 1); } phydm_la_mode_set_mac_iq_dump(pDM_Odm); //return; #if (DM_ODM_SUPPORT_TYPE & ODM_AP) watchdog_stop(pDM_Odm->priv); #endif target_polling_bit = (AdcSmp->is_bb_trigger) ? BIT1 : BIT2; do { /*Polling time always use 100ms, when it exceed 2s, break while loop*/ tmpU1b = ODM_Read1Byte(pDM_Odm, 0x7c0); if (AdcSmp->ADCSmpState != ADCSMP_STATE_SET) { DbgPrint("[State Error] ADCSmpState != ADCSMP_STATE_SET\n"); break; } else if (tmpU1b & target_polling_bit) { ODM_delay_ms(100); while_cnt = while_cnt + 1; continue; } else { DbgPrint("[LA Query OK] polling_bit=((0x%x))\n", target_polling_bit); polling_ok = TRUE; if (pDM_Odm->SupportICType & ODM_RTL8197F) ODM_SetBBReg(pDM_Odm, 0x7c0, BIT0, 0x0); break; } } while (while_cnt < 20); #if (DM_ODM_SUPPORT_TYPE & ODM_AP) watchdog_resume(pDM_Odm->priv); #if (RTL8197F_SUPPORT) 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) { if (polling_ok) phydm_la_get_tx_pkt_buf(pDM_Odm); else { DbgPrint("[Polling timeout]\n"); } } #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("[LA mode] LA_pattern_count = ((%d))\n", AdcSmp->la_count); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("[LA mode] la_count = ((%d))\n", AdcSmp->la_count)); #endif ADCSmp_Stop(pDM_Odm); if (AdcSmp->la_count == 0) { DbgPrint("LA Dump finished ---------->\n\n\n"); /**/ } else { AdcSmp->la_count --; DbgPrint("LA Dump more ---------->\n\n\n"); ADCSmp_Set(pDM_Odm, AdcSmp->la_trig_mode, AdcSmp->la_TrigSigSel, AdcSmp->la_dma_type, AdcSmp->la_TriggerTime, 0); } } #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) VOID ADCSmpWorkItemCallback( IN PVOID pContext ) { PADAPTER Adapter = (PADAPTER)pContext; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); DbgPrint("[WorkItem Call back] LA_State=((%d))\n", AdcSmp->ADCSmpState); phydm_adc_smp_start(pDM_Odm); } #endif VOID ADCSmp_Set( IN PVOID pDM_VOID, IN u1Byte trig_mode, IN u4Byte TrigSigSel, IN u1Byte DmaDataSigSel, IN u4Byte TriggerTime, IN u2Byte PollingTime ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; BOOLEAN is_set_success = TRUE; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); AdcSmp->la_trig_mode = trig_mode; AdcSmp->la_TrigSigSel = TrigSigSel; AdcSmp->la_dma_type = DmaDataSigSel; AdcSmp->la_TriggerTime = TriggerTime; #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) if (AdcSmp->ADCSmpState != ADCSMP_STATE_IDLE) is_set_success = FALSE; else if (AdcSmp->ADCSmpBuf.Length == 0) is_set_success = phydm_la_buffer_allocate(pDM_Odm); #endif if (is_set_success) { AdcSmp->ADCSmpState = ADCSMP_STATE_SET; DbgPrint("[LA Set Success] LA_State=((%d))\n", AdcSmp->ADCSmpState); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) DbgPrint("ADCSmp_work_item_index = ((%d))\n", AdcSmp->la_work_item_index); if (AdcSmp->la_work_item_index != 0) { ODM_ScheduleWorkItem(&(AdcSmp->ADCSmpWorkItem_1)); AdcSmp->la_work_item_index = 0; } else { ODM_ScheduleWorkItem(&(AdcSmp->ADCSmpWorkItem)); AdcSmp->la_work_item_index = 1; } #else phydm_adc_smp_start(pDM_Odm); #endif } else { DbgPrint("[LA Set Fail] LA_State=((%d))\n", AdcSmp->ADCSmpState); } } #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_STATUS ADCSmp_Query( IN PVOID pDM_VOID, IN ULONG InformationBufferLength, OUT PVOID InformationBuffer, OUT PULONG BytesWritten ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); RT_STATUS retStatus = RT_STATUS_SUCCESS; PRT_ADCSMP_STRING ADCSmpBuf = &(AdcSmp->ADCSmpBuf); DbgPrint("[%s] LA_State=((%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 { ODM_MoveMemory(pDM_Odm, 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("[LA_Stop] LA_state = ((%d))\n", AdcSmp->ADCSmpState); } 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; } else if (pDM_Odm->SupportICType & ODM_RTL8821C) { ADCSmpBuf->start_pos = 0x8000; ADCSmpBuf->buffer_size = 0x8000; } } #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) VOID ADCSmp_DeInit( 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_Stop(pDM_Odm); if (ADCSmpBuf->Length != 0x0) { ODM_FreeMemory(pDM_Odm, ADCSmpBuf->Octet, ADCSmpBuf->Length); ADCSmpBuf->Length = 0x0; } } #endif VOID phydm_la_mode_bb_setting( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); u1Byte trig_mode = AdcSmp->la_trig_mode; u4Byte TrigSigSel = AdcSmp->la_TrigSigSel; u4Byte DbgPort = AdcSmp->la_dbg_port; u1Byte bTriggerEdge = AdcSmp->la_trigger_edge; u1Byte sampling_rate = AdcSmp->la_smp_rate; DbgPrint("1. [LA mode bb_setting] trig_mode = ((%d)), DbgPort = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x))\n", trig_mode, DbgPort, bTriggerEdge, sampling_rate, TrigSigSel); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("1. [LA mode bb_setting]trig_mode = ((%d)), DbgPort = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x))\n", trig_mode, DbgPort, bTriggerEdge, sampling_rate, TrigSigSel)); #endif if (trig_mode == PHYDM_MAC_TRIG) TrigSigSel = 0; /*ignore this setting*/ if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { if (trig_mode == PHYDM_ADC_RF0_TRIG) { ODM_SetBBReg(pDM_Odm, 0x8f8, BIT25|BIT24|BIT23|BIT22, 9); /*DBGOUT_RFC_a[31:0]*/ } else if (trig_mode == PHYDM_ADC_RF1_TRIG) { ODM_SetBBReg(pDM_Odm, 0x8f8, BIT25|BIT24|BIT23|BIT22, 8); /*DBGOUT_RFC_b[31:0]*/ } else { ODM_SetBBReg(pDM_Odm, 0x8f8, BIT25|BIT24|BIT23|BIT22, 0); } /* (0:) '{ofdm_dbg[31:0]}' (1:) '{cca,crc32_fail,dbg_ofdm[29:0]}' (2:) '{vbon,crc32_fail,dbg_ofdm[29:0]}' (3:) '{cca,crc32_ok,dbg_ofdm[29:0]}' (4:) '{vbon,crc32_ok,dbg_ofdm[29:0]}' (5:) '{dbg_iqk_anta}' (6:) '{cca,ofdm_crc_ok,dbg_dp_anta[29:0]}' (7:) '{dbg_iqk_antb}' (8:) '{DBGOUT_RFC_b[31:0]}' (9:) '{DBGOUT_RFC_a[31:0]}' (a:) '{dbg_ofdm}' (b:) '{dbg_cck}' */ ODM_SetBBReg(pDM_Odm, 0x198C , BIT2|BIT1|BIT0, 7); /*disable dbg clk gating*/ /*dword= ODM_GetBBReg(pDM_Odm, 0x8FC, bMaskDWord);*/ /*DbgPrint("dbg_port = ((0x%x))\n", dword);*/ ODM_SetBBReg(pDM_Odm , 0x95C, 0x1f, TrigSigSel); /*0x95C[4:0], BB debug port bit*/ ODM_SetBBReg(pDM_Odm, 0x8FC, bMaskDWord, DbgPort); ODM_SetBBReg(pDM_Odm, 0x95C , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/ ODM_SetBBReg(pDM_Odm, 0x95c, 0xe0, sampling_rate); /* (0:) '80MHz' (1:) '40MHz' (2:) '20MHz' (3:) '10MHz' (4:) '5MHz' (5:) '2.5MHz' (6:) '1.25MHz' (7:) '160MHz (for BW160 ic)' */ } else { ODM_SetBBReg(pDM_Odm, 0x9a0, 0x1f, TrigSigSel); /*0x9A0[4:0], BB debug port bit*/ ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, DbgPort); ODM_SetBBReg(pDM_Odm, 0x9A0 , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/ ODM_SetBBReg(pDM_Odm, 0x9A0, 0xe0, sampling_rate); /* (0:) '80MHz' (1:) '40MHz' (2:) '20MHz' (3:) '10MHz' (4:) '5MHz' (5:) '2.5MHz' (6:) '1.25MHz' (7:) '160MHz (for BW160 ic)' */ } } void phydm_la_mode_set_trigger_time( IN PVOID pDM_VOID, IN u4Byte TriggerTime_mu_sec ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u1Byte TriggerTime_unit_num; u4Byte time_unit = 0; if (TriggerTime_mu_sec < 128) { time_unit = 0; /*unit: 1mu sec*/ } else if (TriggerTime_mu_sec < 256) { time_unit = 1; /*unit: 2mu sec*/ } else if (TriggerTime_mu_sec < 512) { time_unit = 2; /*unit: 4mu sec*/ } else if (TriggerTime_mu_sec < 1024) { time_unit = 3; /*unit: 8mu sec*/ } else if (TriggerTime_mu_sec < 2048) { time_unit = 4; /*unit: 16mu sec*/ } else if (TriggerTime_mu_sec < 4096) { time_unit = 5; /*unit: 32mu sec*/ } else if (TriggerTime_mu_sec < 8192) { time_unit = 6; /*unit: 64mu sec*/ } TriggerTime_unit_num = (u1Byte)(TriggerTime_mu_sec>>time_unit); DbgPrint("3. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n", TriggerTime_unit_num, time_unit); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("3. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n", TriggerTime_unit_num, time_unit)); #endif ODM_SetMACReg(pDM_Odm, 0x7cc , BIT20|BIT19|BIT18, time_unit); ODM_SetMACReg(pDM_Odm, 0x7c0, 0x7f00, (TriggerTime_unit_num& 0x7f)); } VOID phydm_lamode_trigger_setting( IN PVOID pDM_VOID, IN char input[][16], IN u4Byte *_used, OUT char *output, IN u4Byte *_out_len, IN u4Byte input_num ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp); u1Byte trig_mode, DmaDataSigSel; u4Byte TrigSigSel; BOOLEAN bEnableLaMode, bTriggerEdge; u4Byte DbgPort, TriggerTime_mu_sec; u4Byte mac_ref_signal_mask; u1Byte sampling_rate = 0, i; char help[] = "-h"; u4Byte var1[10] = {0}; u4Byte used = *_used; u4Byte out_len = *_out_len; if (pDM_Odm->SupportICType & PHYDM_IC_SUPPORT_LA_MODE) { PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]); bEnableLaMode = (BOOLEAN)var1[0]; /*DbgPrint("echo cmd input_num = %d\n", input_num);*/ if ((strcmp(input[1], help) == 0)) { PHYDM_SNPRINTF((output+used, out_len-used, "{En} {0:BB,1:BB_MAC,2:RF0,3:RF1,4:MAC} \n {BB:DbgPort[bit],BB_MAC:0-ok/1-fail/2-cca,MAC:ref} {DMA type} {TrigTime} \n {PollingTime/ref_mask} {DbgPort} {0:P_Edge, 1:N_Edge} {SpRate:0-80M,1-40M,2-20M} {Capture num}\n")); /**/ } else if ((bEnableLaMode == 1)) { PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]); trig_mode = (u1Byte)var1[1]; if (trig_mode == PHYDM_MAC_TRIG) { PHYDM_SSCANF(input[3], DCMD_HEX, &var1[2]); } else { PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]); } TrigSigSel = var1[2]; PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var1[3]); PHYDM_SSCANF(input[5], DCMD_DECIMAL, &var1[4]); PHYDM_SSCANF(input[6], DCMD_HEX, &var1[5]); PHYDM_SSCANF(input[7], DCMD_HEX, &var1[6]); PHYDM_SSCANF(input[8], DCMD_DECIMAL, &var1[7]); PHYDM_SSCANF(input[9], DCMD_DECIMAL, &var1[8]); PHYDM_SSCANF(input[10], DCMD_DECIMAL, &var1[9]); DmaDataSigSel = (u1Byte)var1[3]; TriggerTime_mu_sec = var1[4]; /*unit: us*/ AdcSmp->la_mac_ref_mask = var1[5]; AdcSmp->la_dbg_port = var1[6]; AdcSmp->la_trigger_edge = (u1Byte) var1[7]; AdcSmp->la_smp_rate = (u1Byte)(var1[8] & 0x7); AdcSmp->la_count = var1[9]; DbgPrint("echo lamode %d %d %d %d %d %d %x %d %d %d\n", var1[0], var1[1], var1[2], var1[3], var1[4], var1[5], var1[6], var1[7], var1[8], var1[9]); #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("echo lamode %d %d %d %d %d %d %x %d %d %d\n", var1[0], var1[1], var1[2], var1[3], var1[4], var1[5], var1[6], var1[7], var1[8], var1[9])); #endif PHYDM_SNPRINTF((output+used, out_len-used, "a.En= ((1)), b.mode = ((%d)), c.Trig_Sel = ((0x%x)), d.Dma_type = ((%d))\n", trig_mode, TrigSigSel, DmaDataSigSel)); PHYDM_SNPRINTF((output+used, out_len-used, "e.Trig_Time = ((%dus)), f.mac_ref_mask = ((0x%x)), g.dbg_port = ((0x%x))\n", TriggerTime_mu_sec, AdcSmp->la_mac_ref_mask, AdcSmp->la_dbg_port)); PHYDM_SNPRINTF((output+used, out_len-used, "h.Trig_edge = ((%d)), i.smp rate = ((%d MHz)), j.Cap_num = ((%d))\n", AdcSmp->la_trigger_edge, (80>>AdcSmp->la_smp_rate), AdcSmp->la_count )); ADCSmp_Set(pDM_Odm, trig_mode, TrigSigSel, DmaDataSigSel, TriggerTime_mu_sec, 0); } else { ADCSmp_Stop(pDM_Odm); PHYDM_SNPRINTF((output+used, out_len-used, "Disable LA mode\n")); } } } #endif /*endif PHYDM_LA_MODE_SUPPORT == 1*/