diff --git a/public/common/driver/inc/mtimer_com.h b/public/common/driver/inc/mtimer_com.h index d580ee3..07bfd97 100644 --- a/public/common/driver/inc/mtimer_com.h +++ b/public/common/driver/inc/mtimer_com.h @@ -57,11 +57,12 @@ typedef enum _tagMTmrTID MTMR_RFM0_TXSLOT, // 21 MTMR_RFM0_RXSLOT, - MTMR_CSU_INSERT = 24, + MTMR_JESD_RXON = 23, + MTMR_CSU_INSERT = 24, // also as MTMR_JESD_RXOFF = 24, MTMR_TDD_OFFSET_10000 = 25, - MTMR_TDD_OFFSET_2500 = 26, // also as MTMR_JESD_RXON = 26, - MTMR_TDD_OFFSET_7500 = 27, // also as MTMR_JESD_RXOFF = 27, + MTMR_TDD_OFFSET_2500 = 26, + MTMR_TDD_OFFSET_7500 = 27, MTMR_JESD_TXOFF = 28, MTMR_JESD_TXON = 29, @@ -125,6 +126,7 @@ typedef struct _tagMtimerPara{ // scratch count uint32_t tmrScrCnt; // phy para + uint32_t frameType; uint32_t scsId; uint16_t runCoreId; uint16_t reCfgFlag; diff --git a/public/ecs_rfm_spu1/driver/src/ecpri_timer.s.c b/public/ecs_rfm_spu1/driver/src/ecpri_timer.s.c index bab0ec7..4b7707b 100644 --- a/public/ecs_rfm_spu1/driver/src/ecpri_timer.s.c +++ b/public/ecs_rfm_spu1/driver/src/ecpri_timer.s.c @@ -320,10 +320,8 @@ int32_t set_ecpri_ape_slot_offset(uint32_t apeCoreId) } // ape tmrpoints - uint8_t i = 0; h1Pos = __builtin_clz(runCore); // 从高bit开始,第一个1前面的0的个数 __ucps2_synch(0); - debug_write((DBG_DDR_IDX_DRV_BASE+48+i), h1Pos); // 0xb7e060c0 while (32 > h1Pos) { apeId = 31 - h1Pos; @@ -343,9 +341,6 @@ int32_t set_ecpri_ape_slot_offset(uint32_t apeCoreId) runCore &= (~(1 << apeId)); h1Pos = __builtin_clz(runCore); __ucps2_synch(0); - - i++; - debug_write((DBG_DDR_IDX_DRV_BASE+48+i), h1Pos); // 0xb7e060c0 } reCfgFlag = 4; @@ -454,10 +449,45 @@ void isr_ecpri_timer(void) uint32_t tmrBaseAddr = mtimer_get_baseaddr(MTIMER_ECPRI_ID); pMtimerInt->tmrIntCnt++; + tmrIntcFlag = do_read_volatile(tmrBaseAddr + MTMR_INTC_REG); #ifdef PALLADIUM_TEST debug_write((DBG_DDR_IDX_DRV_BASE+2048), pMtimerInt->tmrIntCnt); // 0xb7e08000 + debug_write((DBG_DDR_IDX_DRV_BASE+2048+3), tmrIntcFlag); // 0xb7e0800C #endif - tmrIntcFlag = do_read_volatile(tmrBaseAddr + MTMR_INTC_REG); + + uint32_t runApe = 0; + uint32_t intApeFlag = 0; + uint8_t intApeId = 0; + runApe = do_read_volatile((&(phyPara[pMtimerPara->scsId].runCoreId))); + if (0 == runApe) + { + intApeFlag = ((tmrIntcFlag>>MTMR_INT_APE0_SLOT) & 0xFF) & (~runApe); + debug_write((DBG_DDR_IDX_DRV_BASE+48), runApe); // 0xb7e08004 + debug_write((DBG_DDR_IDX_DRV_BASE+49), intApeFlag); // 0xb7e08004 + volatile uint32_t h1Pos = __builtin_clz(intApeFlag); // 从高bit开始,第一个1前面的0的个数 + while (32 > h1Pos) + { + intApeId = 31 - h1Pos; + if (8 <= intApeId) + { + return; + } + + tFlagAddr = tmrBaseAddr+MTMR_TINTF00_REG + 6*((MTMR_INT_APE0_SLOT+intApeId)<<2); + tEventAddr = tmrBaseAddr + MTMR_TEVENT0_REG; + + tEventFlag = do_read_volatile(tFlagAddr); + do_write(tEventAddr, tEventFlag); + do_write(tFlagAddr, tEventFlag); // clear int flag + + do_write((tmrBaseAddr+MTMR_INTC_REG), (tmrIntcFlag & 0xFF0)); // clear int + __ucps2_synch(0); + + tmrIntcFlag = do_read_volatile(tmrBaseAddr + MTMR_INTC_REG); + intApeFlag = ((tmrIntcFlag>>MTMR_INT_APE0_SLOT) & 0xFF) & (~runApe); + h1Pos = __builtin_clz(intApeFlag); + } + } if ((tmrIntcFlag & (1 << MTMR_INT_10ms))) /* tmr int */ { diff --git a/public/ecs_rfm_spu1/driver/src/jesd_timer.s.c b/public/ecs_rfm_spu1/driver/src/jesd_timer.s.c index 6491677..78291c5 100644 --- a/public/ecs_rfm_spu1/driver/src/jesd_timer.s.c +++ b/public/ecs_rfm_spu1/driver/src/jesd_timer.s.c @@ -177,15 +177,23 @@ int32_t jesd_timer_reconfig(int32_t nTmrId, phy_timer_config_ind_t *my_jesdtmr) #endif EcsRfmDmLocalMgt_t* pEcsDmLocalMgt = get_ecs_rfm_dm_local_mgt(); stMtimerPara* pMtimerPara = pEcsDmLocalMgt->pMtimerPara[nTmrId]; + stMtimerPara* pMtimerTxPara = pEcsDmLocalMgt->pMtimerPara[nTmrId+2]; stMtimerPhyPara* pMtimerSfn = &gMtimerSfnNum[nTmrId]; int32_t scsId = my_jesdtmr->scsId; + pMtimerPara->frameType = my_jesdtmr->frameType; pMtimerPara->scsId = scsId; pMtimerPara->runCoreId = (uint16_t)my_jesdtmr->runCoreId; pMtimerPara->tddPeriod = my_jesdtmr->t_period; // us pMtimerPara->tddSlotNum = my_jesdtmr->num_tti; pMtimerPara->slotPeriod = my_jesdtmr->t_us; pMtimerPara->slotMaxNum = my_jesdtmr->num_tti_per_sfn; + + pMtimerTxPara->tddPeriod = my_jesdtmr->t_period; // us + pMtimerTxPara->tddSlotNum = my_jesdtmr->num_tti; + pMtimerTxPara->slotPeriod = my_jesdtmr->t_us; + pMtimerTxPara->slotMaxNum = my_jesdtmr->num_tti_per_sfn; + pMtimerSfn->slotMaxNum = my_jesdtmr->num_tti_per_sfn; if (FDD_MODE == my_jesdtmr->frameType) { @@ -216,6 +224,13 @@ int32_t jesd_timer_reconfig(int32_t nTmrId, phy_timer_config_ind_t *my_jesdtmr) } #endif + pMtimerPara->tempL_max = pMtimerPara->tmrMsPeriod * pMtimerPara->slotPeriod / 1000 - 1; + pMtimerPara->tempM_max = pMtimerPara->tddSlotNum-1; + pMtimerPara->tempH_max = SFN_PERIOD / pMtimerPara->slotPeriod / pMtimerPara->tddSlotNum - 1; + pMtimerTxPara->tempL_max = pMtimerPara->tmrMsPeriod * pMtimerPara->slotPeriod / 1000 - 1; + pMtimerTxPara->tempM_max = pMtimerPara->tddSlotNum-1; + pMtimerTxPara->tempH_max = SFN_PERIOD / pMtimerPara->slotPeriod / pMtimerPara->tddSlotNum - 1; + enable_mtimer_cevent_int(nTmrId, MTMR_CEVENT_CNT14H, MTMR_INT_10ms); // 10ms int #ifdef PALLADIUM_TEST flag++; @@ -444,29 +459,9 @@ void clear_jesd_tdd_offset(int32_t nTmrId) void set_jesd_tx_slot_offset(int32_t nTmrId) { - //EcsRfmDmLocalMgt_t* pEcsDmLocalMgt = get_ecs_rfm_dm_local_mgt(); - uint32_t tmr3Point = SFN_PERIOD - gJesdDelay.txOffset; // us set_mtimer_tmrpoint(nTmrId, MTMR_TXSLOT_OFFSET, tmr3Point, MTIMER_MASK_32BIT); enable_mtimer_tmrpoint_int(nTmrId, MTMR_TXSLOT_OFFSET, MTMR_INT_SLOT_OFFSET); - - //uint32_t tempL = gCpriTimerPara.tmrMsPeriod * (tmr3Point % gCpriTimerPara.slotPeriod) / 1000; - //uint32_t addr = (uint32_t)&(phyPara[gCpriTimerPara.scsId].txSetVal); - //do_write(addr, tempL); - -#if 0 - // ape tmrpoints - for (int32_t i = 0; i < APE_NUM; i++) - { - int32_t tmrId = MTMR_APE0_TXSLOT + (i<<1); - set_mtimer_tmrpoint(nTmrId, tmrId, tmr3Point, MTIMER_MASK_32BIT); - enable_mtimer_tmrpoint_int(nTmrId, tmrId, (MTMR_INT_APE0_SLOT+i)); - } - // rfm0 tmrpoints - int32_t tmrId = MTMR_RFM0_TXSLOT; - set_mtimer_tmrpoint(nTmrId, tmrId, tmr3Point, MTIMER_MASK_32BIT); - enable_mtimer_tmrpoint_int(nTmrId, tmrId, MTMR_INT_RFM0_SLOT); -#endif } void clear_jesd_tx_slot_offset(int32_t nTmrId) @@ -476,29 +471,9 @@ void clear_jesd_tx_slot_offset(int32_t nTmrId) void set_jesd_rx_slot_offset(int32_t nTmrId) { - //EcsRfmDmLocalMgt_t* pEcsDmLocalMgt = get_ecs_rfm_dm_local_mgt(); - - uint32_t tmr4Point = SFN_PERIOD - gJesdDelay.txOffset; //gJesdDelay.rxOffset; // // us + int32_t tmr4Point = SFN_PERIOD - gJesdDelay.txOffset; //gJesdDelay.rxOffset; // // us set_mtimer_tmrpoint(nTmrId, MTMR_RXSLOT_OFFSET, tmr4Point, MTIMER_MASK_32BIT); enable_mtimer_tmrpoint_int(nTmrId, MTMR_RXSLOT_OFFSET, MTMR_INT_SLOT_OFFSET); - - //uint32_t tempL = gCpriTimerPara.tmrMsPeriod * (tmr3Point % gCpriTimerPara.slotPeriod) / 1000; - //uint32_t addr = (uint32_t)&(phyPara[gCpriTimerPara.scsId].txSetVal); - //do_write(addr, tempL); - -#if 0 - // ape tmrpoints - for (int32_t i = 0; i < APE_NUM; i++) - { - int32_t tmrId = MTMR_APE0_RXSLOT + (i<<1); - set_mtimer_tmrpoint(nTmrId, tmrId, tmr4Point, MTIMER_MASK_32BIT); - enable_mtimer_tmrpoint_int(nTmrId, tmrId, (MTMR_INT_APE0_SLOT+i)); - } - // rfm0 tmrpoints - int32_t tmrId = MTMR_RFM0_RXSLOT; - set_mtimer_tmrpoint(nTmrId, tmrId, tmr4Point, MTIMER_MASK_32BIT); - enable_mtimer_tmrpoint_int(nTmrId, tmrId, MTMR_INT_RFM0_SLOT); -#endif } void clear_jesd_rx_slot_offset(int32_t nTmrId) { @@ -612,7 +587,6 @@ void set_jesd_csu_point(int32_t nTmrId, phy_timer_config_ind_t *my_jesdtmr) shortcp = my_jesdtmr->num_t_dl_symb[0] + gapSymbolCnt - 1; // ul start point //ulStartSymbol = my_jesdtmr->num_t_dl_symb + gapSymbolCnt - 1; // ul start point, 6+4-1, symbol9 - if (MTIMER_JESD_RX0_ID == nTmrId) { /* rx */ @@ -750,8 +724,8 @@ void set_jesd_rxon_point(int32_t nTmrId, phy_timer_config_ind_t *my_jesdtmr) uint32_t gapSymbolStart = LONGCP_SAM_CNT + (my_jesdtmr->num_t_dl_symb[0]-1) * SHORTCP_SAM_CNT; uint32_t tmr26Point = (sSymbolStart + gapSymbolStart) * 1000 / pMtimerPara->tmrMsPeriod + JESD_TXRX_CHANGE_GAP; - set_mtimer_tmrpoint(nTmrId, MTMR_TDD_OFFSET_2500, tmr26Point, MTIMER_MASK_48BIT); - enable_mtimer_tmrpoint_int(nTmrId, MTMR_TDD_OFFSET_2500, MTMR_INT_TDD_OFFSET); + set_mtimer_tmrpoint(nTmrId, MTMR_JESD_RXON, tmr26Point, MTIMER_MASK_48BIT); + enable_mtimer_tmrpoint_int(nTmrId, MTMR_JESD_RXON, MTMR_INT_TDD_OFFSET); } void set_jesd_rxoff_point(int32_t nTmrId, phy_timer_config_ind_t *my_jesdtmr) @@ -769,8 +743,8 @@ void set_jesd_rxoff_point(int32_t nTmrId, phy_timer_config_ind_t *my_jesdtmr) uint32_t tmr27Point = pMtimerPara->tddPeriod - JESD_TXRX_CHANGE_GAP; - set_mtimer_tmrpoint(nTmrId, MTMR_TDD_OFFSET_7500, tmr27Point, MTIMER_MASK_48BIT); - enable_mtimer_tmrpoint_int(nTmrId, MTMR_TDD_OFFSET_7500, MTMR_INT_TDD_OFFSET); + set_mtimer_tmrpoint(nTmrId, MTMR_CSU_INSERT, tmr27Point, MTIMER_MASK_48BIT); + enable_mtimer_tmrpoint_int(nTmrId, MTMR_CSU_INSERT, MTMR_INT_TDD_OFFSET); } void start_jesd_timer(int32_t nTmrId) @@ -890,7 +864,7 @@ void jesd_10ms_callback(uint8_t nTmrId) pMtimerInt->pp1sIntCnt++; debug_write((DBG_DDR_IDX_DRV_BASE+64+1), pMtimerInt->pp1sIntCnt); // 0x104 -#ifdef PALLADIUM_TEST +#if 0 //def PALLADIUM_TEST uint32_t val = 0; for (int32_t core = 0; core < 12; core++) { @@ -926,6 +900,7 @@ void jesd_10ms_callback(uint8_t nTmrId) jesd_timer_rcfg_act(nTmrId); //debug_write((DBG_DDR_IDX_DRV_BASE+288), (GET_STC_CNT()-start)); // 0x480 pMtimerCal->sfnCalFinished = 1; + pMtimerInt->tddOffsetIntCnt = 0; debug_write((DBG_DDR_IDX_DRV_BASE+910), cEventFlag); // pMtimerInt->txSlotIntCnt); // 0xe38 debug_write((DBG_DDR_IDX_DRV_BASE+911), get_mtimer_rt_scr_value(MTIMER_CPRI_ID)); // pMtimerInt->tddOffsetIntCnt); // 0xe3C } @@ -983,7 +958,7 @@ void jesd_tdd_callback(uint8_t nTmrId) tEventFlag = do_read_volatile(tFlagAddr); __ucps2_synch(0); - if ((tEventFlag & ((1<tddOffsetIntCnt); // 0x110 #endif -#if 1 -// if (0 == do_read_volatile(CSU_STOP_CMD_ADDR)) - { -// uint32_t startTick = GET_STC_CNT(); jesd_csu_start(); if ((FDD_MODE == gJesdTFMode) || (JESD_IO_CTRL == gJesdIOMode)) { jesd_csu_rx_start(); } -// uint32_t cost = GET_STC_CNT() - startTick; -// do_write(DDR_ADDR_90, cost); - } -#endif } - if (tEventFlag & (1<