S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动
时间:11-20
来源:互联网
点击:
- SREQU0x44
- INDEX_DMC_T_ESREQU0x48
- INDEX_DMC_MEMORY_CFG2EQU0x4C
- INDEX_DMC_CHIP_0_CFGEQU0x200
- INDEX_DMC_CHIP_1_CFGEQU0x204
- INDEX_DMC_CHIP_2_CFGEQU0x208
- INDEX_DMC_CHIP_3_CFGEQU0x20C
- INDEX_DMC_USER_STATUSEQU0x300
- INDEX_DMC_USER_CONFIGEQU0x304
- AREALOW_INIT,CODE,READONLY
- ENTRY
- EXPORTmem_init
- mem_init
- ldrr0,=MEM_SYS_CFG;Memorysussystemaddress0x7e00f120
- movr1,#0xd;Xm0CSn2=NFCONCS0设置NANDFlash为存储器
- strr1,[r0]
- ldrr0,=DMC1_BASE;DMC1baseaddress0x7e001000
- ;memc_cmd:010wakeup
- ;唤醒内存
- ldrr1,=0x04
- strr1,[r0,#INDEX_DMC_MEMC_CMD]
- ;Refreshperiod=((Startup_HCLK/1000*DDR_tREFRESH)-1)/1000000->DDR_tREFRESH7800ns
- ;HCLK=133MHz
- ;DDR内存规格规定,电容的电荷存储上限时间为64ms,而刷新操作每次是针对
- ;一行进行的,即每一行的刷新时间为64ms,而内存芯片中一定数量的行
- ;以L-Bank表示(见内存工作原理与物理特性),每个L-Bank有8192行(见内存硬件手册)
- ;因此对L-Bank的刷新操作应该在64ms/8192=7813us时间内进行一次
- ;而MDDR工作在133MHz时,其一个时钟周期为1/133M,那么一次L-Bank刷新
- ;时间需要7.8us/1/133M个时钟周期,即有下面的公式:
- ;Refresh_Count=tREFRESH*HCLK(MHz)/1000
- ;tREFRESH=7813HCLK=133Refresh_Count=1039
- ldrr1,=1039;DMC_DDR_REFRESH_PRD
- strr1,[r0,#INDEX_DMC_REFRESH_PRD]
- ;CAS_Latency=DDR_CASL<1->DDR_CASL3
- ldrr1,=6;DMC_DDR_CAS_LATENCY
- strr1,[r0,#INDEX_DMC_CAS_LATENCY]
- ;t_DQSS(clockcycles)
- ldrr1,=1;DMC_DDR_t_DQSS
- strr1,[r0,#INDEX_DMC_T_DQSS]
- ;T_MRD(clockcycles)
- ldrr1,=2;DMC_DDR_t_MRD
- strr1,[r0,#INDEX_DMC_T_MRD]
- ;T_RAS(clockcycles)
- ldrr1,=7;DMC_DDR_t_RAS
- strr1,[r0,#INDEX_DMC_T_RAS]
- ;T_RCActiveBankxtoActiveBankxdelay(clockcycles)
- ldrr1,=10;DMC_DDR_t_RC
- strr1,[r0,#INDEX_DMC_T_RC]
- ;T_RCDRAStoCADdelay(clockcycles)
- ldrr1,=4;DMC_DDR_t_RCD
- ldrr2,=8;DMC_DDR_schedule_RCD
- orrr1,r1,r2
- strr1,[r0,#INDEX_DMC_T_RCD]
- ;T_RFCAutoRefresh(clockcycles)
- ldrr1,=11;DMC_DDR_t_RFC
- ldrr2,=256;DMC_DDR_schedule_RFC
- orrr1,r1,r2
- strr1,[r0,#INDEX_DMC_T_RFC]
- ;T_RPPrechargetoRASdelay(clockcycles)
- ldrr1,=4;DMC_DDR_t_RP
- ldrr2,=8;DMC_DDR_schedule_RP
- orrr1,r1,r2
- strr1,[r0,#INDEX_DMC_T_RP]
- ;T_RRDActiveBankxtoActiveBankydelay(clockcycles)
- ldrr1,=3;DMC_DDR_t_RRD
- strr1,[r0,#INDEX_DMC_T_RRD]
- ;T_WRWritetoprechargedelay(clockcycles)
- ldrr1,=3;DMC_DDR_t_WR
- strr1,[r0,#INDEX_DMC_T_WR]
- ;T_WTRWritetoReaddelay(clockcycles)
- ldrr1,=2;DMC_DDR_t_WTR
- strr1,[r0,#INDEX_DMC_T_WTR]
- ;T_XPExitPowerdown(clockcycles)
- ldrr1,=2;DMC_DDR_t_XP
- strr1,[r0,#INDEX_DMC_T_XP]
- ;T_XSRExitselfrefresh(clockcycles)
- ldrr1,=17;DMC_DDR_t_XSR
- strr1,[r0,#INDEX_DMC_T_XSR]
- ;T_ESRSelfRefresh(clockcycles)
- ldrr1,=17;DMC_DDR_t_ESR
- strr1,[r0,#INDEX_DMC_T_ESR]
- ;MemoryConfigurationRegister
- ldrr1,=0x40010012;DMC1_MEM_CFG
- strr1,[r0,#INDEX_DMC_MEMORY_CFG]
- ldrr1,=0xb41;DMC1_MEM_CFG2
- strr1,[r0,#INDEX_DMC_MEMORY_CFG2]
- ldrr1,=0x150f8;DMC1_CHIP0_CFG
- strr1,[r0,#INDEX_DMC_CHIP_0_CFG]
- ldrr1,=0;DMC_DDR_32_CFG
- strr1,[r0,#INDEX_DMC_USER_CONFIG]
- ;ThefollowsisaccordingtotheDatasheetinitializationsequence
- ;DMC0DDRChip0configurationdirectcommandreg
- ldrr1,=0x0c0000;DMC_NOP0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;PrechargeAll
- ldrr1,=0;DMC_PA0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;AutoRefresh2time
- ldrr1,=0x40000;DMC_AR0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;MRS
- ldrr1,=0xa0000;DMC_mDDR_EMR0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;ModeReg
- ldrr1,=0x80032;DMC_mDDR_MR0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;EnableDMC1
- movr1,#0x0
- strr1,[r0,#INDEX_DMC_MEMC_CMD]
- check_dmc1_ready
- ldrr1,[r0,#INDEX_DMC_MEMC_STATUS]
- movr2,#0x3
- andr1,r1,r2
- cmpr1,#0x1
- bnecheck_dmc1_ready
- nop
- movpc,lr
- END
S3C6410Tiny6410Mini6410MoblieDDR内存驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)