📄 mpmc_pl175_ddr.s_lauto.svn-base
字号:
STR a2, [a1, #0] ; /* Program MPMCDynamictRAS register */ ; ((PL175_sRegisters *) eBase)->DynamictRAS = pInitial->sConfig.DynamictRAS; LDR a2, =PL175_DYNAMIC_TRAS_INIT LDR a1, =MPMCDynamictRAS STR a2, [a1, #0] ; /* Program MPMCDynamictSREX register */ ; ((PL175_sRegisters *) eBase)->DynamictSREX = pInitial->sConfig.DynamictSREX; LDR a2, =PL175_DYNAMIC_TSREX_INIT LDR a1, =MPMCDynamictSREX STR a2, [a1, #0] ; /* Program MPMCDynamictWR register */ ; ((PL175_sRegisters *) eBase)->DynamictWR = pInitial->sConfig.DynamictWR; LDR a2, =PL175_DYNAMIC_TWR_INIT LDR a1, =MPMCDynamictWR STR a2, [a1, #0] ; /* Program MPMCDynamictRC register */ ; ((PL175_sRegisters *) eBase)->DynamictRC = pInitial->sConfig.DynamictRC; LDR a2, =PL175_DYNAMIC_TRC_INIT LDR a1, =MPMCDynamictRC STR a2, [a1, #0] ; /* Program MPMCDynamictRFC register */ ; ((PL175_sRegisters *) eBase)->DynamictRFC = pInitial->sConfig.DynamictRFC; LDR a2, =PL175_DYNAMIC_TRFC_INIT LDR a1, =MPMCDynamictRFC STR a2, [a1, #0] ; /* Program MPMCDynamictXSR register */ ; ((PL175_sRegisters *) eBase)->DynamictXSR = pInitial->sConfig.DynamictXSR; LDR a2, =PL175_DYNAMIC_TXSR_INIT LDR a1, =MPMCDynamictXSR STR a2, [a1, #0] ; /* Program MPMCDynamictRRD register */ ; ((PL175_sRegisters *) eBase)->DynamictRRD = pInitial->sConfig.DynamictRRD; LDR a2, =PL175_DYNAMIC_TRRD_INIT LDR a1, =MPMCDynamictRRD STR a2, [a1, #0] ; /* Program MPMCDynamictMRD register */ ; ((PL175_sRegisters *) eBase)->DynamictMRD = pInitial->sConfig.DynamictMRD; LDR a2, =PL175_DYNAMIC_TMRD_INIT LDR a1, =MPMCDynamictMRD STR a2, [a1, #0] ; /* Program MPMCDynamictCDLR register */ ; ((PL175_sRegisters *) eBase)->DynamictCDLR = pInitial->sConfig.DynamictCDLR; LDR a2, =PL175_DYNAMIC_TCDLR_INIT LDR a1, =MPMCDynamictCDLR STR a2, [a1, #0] ; /* Program MPMCStaticExtendedWait register */ ; ((PL175_sRegisters *) eBase)->StaticExtendedWait = pInitial->sConfig.StaticExtendedWait; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Program Dynamic memory #0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; /* Program MPMCDynamicRasCas register[] */ ; ((PL175_sDynamicRegs *) pMemRegs)->DynamicRasCas = ; apBIT_BUILD( PL175_DYNAMIC_RASCAS_RAS, ((apPL175_sDynamicConfig *)pMemConfig)->eDynamicRASLatency ) | ; apBIT_BUILD( PL175_DYNAMIC_RASCAS_CAS, ((apPL175_sDynamicConfig *)pMemConfig)->eDynamicCASLatency ); LDR a2, =PL175_RAS_CAS_LATENCY LDR a1, =MPMCDynamicRasCas0 STR a2, [a1, #0] ; /* Program MPMCDynamicConfig[] register */ ; ((PL175_sDynamicRegs *) pMemRegs)->DynamicConfig = ; apBIT_BUILD( PL175_DYNAMIC_CONFIG_MD, ((apPL175_sDynamicConfig *)pMemConfig)->eDynamicMemoryDevice ) | ; apBIT_BUILD( PL175_DYNAMIC_CONFIG_AM, ((apPL175_sDynamicConfig *)pMemConfig)->eDynamicAddressMapping ) | ; apBIT_BUILD( PL175_DYNAMIC_CONFIG_P, ((apPL175_sDynamicConfig *)pMemConfig)->eDynamicWriteProtect ); LDR a2, =PL175_CONFIG LDR a1, =MPMCDynamicConfig0 STR a2, [a1, #0] ;/* Select command write mode */ ;((PL175_sRegisters *) eBase)->DynamicControl = ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CE, apPL175_CLK_DRIVEN_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CS, apPL175_CLKOUT_RUNS ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SR, apPL175_NORMAL_MODE ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SRMCC, apPL175_CLKOUT_SREF_RUN ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_IMCC, apPL175_NCLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_MCC, apPL175_CLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_I, apPL175_INIT_MODE ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DC, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DE, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DP, apPL175_NORMAL_OPERATION ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_NRP, apPL175_RP_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_RPV, apPL175_RPVHH_NORMAL ); LDR a2, =0x008b LDR a1, =MPMCDynamicControl STR a2, [a1, #0] ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Program Mode and ExtMode registers for dynamic #0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; /* If the Extended Mode Register has been set , perform additional read ; * to program the SDRAM extended mode register. ; * For DDR memories should disable DLL. ; */ ; if( pInitial->uSDRAMExtModeConfig[ 0 ] != 0 ) ; { ; (void) *((volatile UWORD32 *) pInitial->uSDRAMExtModeConfig[ I ]); ; } LDR a1, =uSDRAMExtModeConfig CMP a1, #0x0 LDRNE a2, [a1, #0] ; /* Perform read to each device. ; * The address of the read is used to configure the SDRAM memories mode register. ; * For DDR memories should reset DLL. ; */ ; if( pInitial->uSDRAMModeConfig[ 0 ] != 0 ) ; { ; (void) *((volatile UWORD32 *) pInitial->uSDRAMModeConfig[ I ]); ; } LDR a1, =uSDRAMModeConfig CMP a1, #0x0 LDRNE a2, [a1, #0] ; /* Wait */ ; apOS_TIMER_Wait( pInitial->PauseMemInit ); LDR a1, =PAUSE_MEM_INIT; BL TimerWait ;/* Issue PALL */ ;((PL175_sRegisters *) eBase)->DynamicControl = ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CE, apPL175_CLK_DRIVEN_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CS, apPL175_CLKOUT_RUNS ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SR, apPL175_NORMAL_MODE ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SRMCC, apPL175_CLKOUT_SREF_RUN ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_IMCC, apPL175_NCLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_MCC, apPL175_CLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_I, apPL175_INIT_PALL ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DC, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DE, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DP, apPL175_NORMAL_OPERATION ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_NRP, apPL175_RP_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_RPV, apPL175_RPVHH_NORMAL ); LDR a2, =0x010b LDR a1, =MPMCDynamicControl STR a2, [a1, #0] ; /* Wait */ ; apOS_TIMER_Wait( pInitial->PauseRefresh ); LDR a1, =PAUSE_REFRESH_INIT; BL TimerWait ;/* Select command write mode */ ;((PL175_sRegisters *) eBase)->DynamicControl = ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CE, apPL175_CLK_DRIVEN_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CS, apPL175_CLKOUT_RUNS ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SR, apPL175_NORMAL_MODE ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SRMCC, apPL175_CLKOUT_SREF_RUN ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_IMCC, apPL175_NCLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_MCC, apPL175_CLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_I, apPL175_INIT_MODE ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DC, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DE, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DP, apPL175_NORMAL_OPERATION ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_NRP, apPL175_RP_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_RPV, apPL175_RPVHH_NORMAL ); LDR a2, =0x008b LDR a1, =MPMCDynamicControl STR a2, [a1, #0] ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Reset Mode config for dynamic #0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; /* Perform read to each device. ; * required for DDR memories to remove reset DLL bit ; * The address of the read is used to configure the SDRAM memories mode register ; */ ; if( pInitial->uDDRResetModeConfig[ 0 ] != 0 ) ; { ; (void) *((volatile UWORD32 *) pInitial->uDDRResetModeConfig[ I ]); ; } ; LDR a1, =uDDRResetModeConfig CMP a1, #0x0 LDRNE a2, [a1, #0] ;/* Select Normal mode, clear Dynamic memory clock enable */ ;((PL175_sRegisters *) eBase)->DynamicControl = ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CE, apPL175_CLK_DRIVEN_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_CS, apPL175_CLKOUT_RUNS ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SR, apPL175_NORMAL_MODE ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_SRMCC, apPL175_CLKOUT_SREF_RUN ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_IMCC, apPL175_NCLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_MCC, apPL175_CLKOUT_ENABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_I, apPL175_INIT_NORMAL ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DC, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DE, apPL175_DLL_HANDSHAKING_DISABLED ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_DP, apPL175_NORMAL_OPERATION ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_NRP, apPL175_RP_HIGH ) | ; apBIT_BUILD( PL175_DYNAMIC_CONTROL_RPV, apPL175_RPVHH_NORMAL ); LDR a2, =0x000b LDR a1, =MPMCDynamicControl STR a2, [a1, #0] ;/* Initialise Static Memory registers for all banks */ ;for( I = 0; I < 4; I++) ;{ ; if(pInitial->StaticConfigEnable[ I ] == TRUE) ; { ; apPL175_StaticMemoryConfigSet( oId, I, &pInitial->sConfig.sStaticConfig[ I ] ); ; } ;} ;/* Program MPMCStaticExtendedWait register*/ ;((PL175_sRegisters *) eBase)->StaticExtendedWait = pInitial->sConfig.StaticExtendedWait; ; return(); ; MOV pc, v1 ; Restore lr ;};-------------------------------------------------------------------------------; USE TIMER2 for MPMC PL175 programming;-------------------------------------------------------------------------------TIMER EQU 0x12001000; timer2 registersTIMER_CONTROL2 EQU TIMER + 0x100TIMER_STATUS2 EQU TIMER + 0x104TIMER_INT_ACK2 EQU TIMER + 0x104TIMER_COMPARE2 EQU TIMER + 0x108TIMER_COUNT2 EQU TIMER + 0x10CTIMER_REDG_CAPT2 EQU TIMER + 0x110 ;not usedTIMER_FEDG_CAPT2 EQU TIMER + 0x114; Detailed Registers NamingTIMER_PRESCAL EQU 0x00F TIMER_MODE EQU 0x010 TIMER_ENAB EQU 0x020 TIMER_NO_CAPT EQU 0x000TIMER_RE_CAPT EQU 0x040TIMER_FE_CAPT EQU 0x080TIMER_RF_CAPT EQU 0x0C0TIMER_MATCH_INT EQU 0x100 TIMER_FEDG_INT EQU 0x200 TIMER_REDG_INT EQU 0x400 TIMER_MATCH EQU 0x001 TIMER_FEDG EQU 0x002 TIMER_REDG EQU 0x004 ;; This routine uses the TIMER2 to wait for 'val' microseconds.; Please note that at this stage the timer is clocked with 10MHz clock ; (cycle time is 100 nsec).;;VOID TimerWait(UINT32 val);{TimerWait ; a1 keeps the 'val' parameter LDR a2, =TIMER_CONTROL2 ; keep the timer_control2 register address in a2 ; turn the timer off (just in case ...) ; GPTCntl->TIMER_2_CONTROL_REG &= ~GPT_ENAB; MOV a4, #0x0 STR a4, [a2, #0] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Enable timer2, but do not use the prescaler (unit is 100 ns) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; GPTCntl->TIMER_2_CONTROL_REG |= GPT_ENAB | GPT_AUTO_RELOAD; MOV a4, #0x20 STR a4, [a2, #0] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Wait until timer2 reaches 'val' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOV a3, #10 MUL a4, a1, a3 ; Since 'val' isn usec unit but timer2 unit is in 100 nsec, we ; need to multiply it by ten. MOV a1, a4 LDR a3, =TIMER_COUNT2 ; keep the timer_count2 register address in a3loop LDR a4, [a3, #0] CMP a4, a1 BLT loop ; turn the timer off ; GPTCntl->TIMER_2_CONTROL_REG &= ~GPT_ENAB; MOV a4, #0x0 STR a4, [a2, #0] ; return(); ; MOV pc, lr ; Restore lr ;} END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -