我们在项目中更换了DRAM,所以需要重新配置S3C6410的DRAM控制器,结果发现S3C6410中的DRAM控制器还是挺复杂的。 S3C6410支持两个DRAM片选,可以分别接最大256MB的内存,该处理器用的DRAM控制器是来自ARM的PrimeCell Dynamic Memory Controller(PL340)。只看S3C6410的Datasheet中的DRAM部分介绍是不够的,你还需要看PL340的技术参考文档,这个文档网上搜索一下就有了。想完全了解6410的DRAM控制器,必须两篇文档都看。我都看了,虽然没完全了解,但是比看6410的datasheet要强多了。 我用的是mobile DDR-SDRAM,所以在这里大概介绍一下寄存器及配置流程。先介绍一下寄存器: 1. DRAM Controller Status Register (Address: 0x7E001000) DRAM状态寄存器,这是一个RO寄存器,用于读取DRAM的状态。 Name Bit Description Memory chips [8:7] 01=2 chips Memory type [6:4] 100=MSDR, SDR, MDDR and DDR Memory width [3:2] 00=16-bit 01=32-bit Controller Status [1:0] 00=config 01=ready 10=paused 11=low-power 实际上,读到的有用信息就是Controller Status和Memory width。 2. DRAM Controller Command Register (Address: 0x7E001004) DRAM命令寄存器,设置DRAM的工作状态。 Name Bit Description Memc_cmd [2:0] 000=Go 001=Sleep 010=Wakeup 011=Pause 100=Configure 最开始应该配置为0x4,是处于Configure状态。在配置完所有的DRAM之后,将该寄存器设置为0x0,处于运行状态。 3. Direct Command Register (Address: 0x7E001008) DRAM命令寄存器,用于发送命令到DRAM和访问DRAM中的MRS和EMRS寄存器。 Name Bit Description Extended memory command [22] 扩展命令,该bit用于连接下面的Memory command[19:18],从而组成DRAM命令 Chip number [21:20] 00=chip_0 01=chip_1 10=chip_2 11=chip_3 Memory command [19:18] 和Extended Memory command组成DRAM命令字 000=PrechargeAll 001=Autorefresh 010=MRS/EMRS访问 011=NOP 100=Deep Power Down Bank address [17:16] 访问MRS和EMRS的时候,映射为Bank地址位 Address_13_to_0 [13:0] 访问MRS和EMRS的时候,映射为memory address[13:0] 通过该寄存器初始化DRAM,先设置为NOP模式,然后设置为PrechargeAll进行充电,然后设置EMRS和MRS寄存器,一般是这么一个流程。具体的要参见你所使用的DRAM的datasheet。 4. Memory Configuration Register (Address: 0x7E00100C) DRAM的配置寄存器,这个与需要参照你所使用的DRAM的datasheet。 Name Bit Description Memory burst [17:15] 设置Burst大小 000=Burst 1 001=Burst 2 010=Burst4 011=Burst 8 100=Burst 16 Stop_mem_clock 没有访问时,Memory Clock自动停止 Power_down_prd [21:20] 自动掉电所需的时钟周期 AP bit [19:18] 0=Address bit 10 1=Address bit 8 Row bits [17:16] 行地址 000=11 bits 001=12 bits 010=13bits 011=14 bits 100=15bits 101=16bits Column bits [13:0] 列地址 000=8 bits 001=9 bits 010=10 bits 011=11 bits 100=12 bits 该寄存器肯定是要配的,看看DRAM的datasheet就知道了。 5. Refresh Period Register (Address: 0x7E001010) DRAM的刷新频率寄存器,用于配置刷新频率的。 Name Bit Description Refresh period [14:0] 多少个Memory的时钟周期 6. CAS Latency Register (Address: 0x7E001014) DRAM的CAS延时寄存器,一定要配,参考DRAM的datasheet。 Name Bit Description CAS Latency [3:1] CAS延时多少个时钟周期 CAS half cycle [0] 0=0周期偏移 1=半周期偏移 对于MDDR和SDR只能设置为0 7. t_dqss/t_mrd/t-ras/t_rc/t_rcd/t_rfc/t_rp/t_rrd/t_wr/t_wtr/t_xp/t_xsr/t_esr Registers (Address: 0x7E001018---0x7E001048) DRAM操作中所需时间和延时寄存器,这里不作过多介绍,具体可以参考PL340文档。 8. Memory Configuration 2 Register (Address: 0x7E00104C) DRAM的配置寄存器2。 Name Bit Description Read delay [12:11] 读延时 00=0 cycle 01=1 cycle 10,11=2 cycle Memory type [10:8] DRAM类型 000=SDR 001=DDR 011=Mobile DDR Memory width [7:6] 00=16 bits 01=32 bits cke_init [3] 复位后,设置CKE输出的值 dqm_init [2] 复位后,设置DQM输出的值 a_gt_m_sync [1] ACLK频率高于MCLK时,设置为1 Sync [0] ACLK和MCLK同步时,设置为1 9. CHIP_N_CFG Register (Address: 0x7E001200/0x7E001204) DRAM的Chip配置寄存器,用于片选decoding设置 Name Bit Description BRC_RBC [16] DRAM结构 0=Row-Bank-Column 1=Bank-Row-Column Address match [15:8] 片选地址比较值 Address mask [7:0] 片选地址掩码 上面介绍了一些寄存器,还有一些寄存器由于没有用到,所以没有去了解。下面给一个DRAM初始化的例子: WriteReg: 0x7e001004 0x4 //设置DRAM控制器状态为Configure WriteReg: 0x7e001010 0x40d //设置DRAM的刷新周期 WriteReg: 0x7e001014 0x6 //设置CAS延时 WriteReg: 0x7e001018 0x3 //设置t_DQSS WriteReg: 0x7e00101c 0xf //设置t_MRD WriteReg: 0x7e001020 0xf //设置t_RAS WriteReg: 0x7e001024 0xf //设置t_RC WriteReg: 0x7e001028 0x1f //设置t_RCD WriteReg: 0x7e00102c 0x21f //设置t_RFC WriteReg: 0x7e001030 0xf //设置t_RP WriteReg: 0x7e001034 0xf //设置t_RRD WriteReg: 0x7e001038 0x7 //设置t_WR WriteReg: 0x7e00103c 0x7 //设置t_WTR WriteReg: 0x7e001040 0xf //设置t_XP WriteReg: 0x7e001044 0x1f //设置t_XSR WriteReg: 0x7e001048 0x1f //设置t_ESR WriteReg: 0x7e00100c 0x10012 //设置DRAM的Column, Row等属性 WriteReg: 0x7e00104c 0x0b45 //设置DRAM的buswidth,type等属性 WriteReg: 0x7e001200 0x150f8 //设置RBC以及片选属性 WriteReg: 0x7e001304 0x0 //设置DQS延时 WriteReg: 0x7e001008 0xc0000 //发送NOP命令到DRAM WriteReg: 0x7e001008 0x0 //发送Precharge命令到DRAM WriteReg: 0x7e001008 0x40000 //发送Autorefresh命令到DRAM WriteReg: 0x7e001008 0x40000 //发送Autorefresh命令到DRAM WriteReg: 0x7e001008 0xa0000 //设置DRAM的EMRS寄存器 WriteReg: 0x7e001008 0x80032 //设置DRAM的MRS寄存器 WriteReg: 0x7e001004 0x0 //设置DRAM控制器开始运行 关于DRAM控制器的配置要参见所使用的DRAM的Datasheet,了解DRAM的结构和初始化过程,才能正确配置。S3C6410的DRAM控制器比较复杂,有些寄存器也不是很理解,在ARM的PL340的文档中也没做太多解释。 我的建议就是能不换DRAM最好,换了也要尽量和S3C6410板上的DRAM相近。
S3C6410 DRAM Controller
最新推荐文章于 2023-03-06 09:43:51 发布