s3c2440存储控制器提供了访问外部设备的信号。比如像nandflash、sram、sdram、dm9000网卡之类的。那么s3c2440存储设备有哪些特性呢?
— Little/Big endian (selectable by a software)
支持小字节序、大字节序(通过软件选择)
— Address space: 128Mbytes per bank (total 1GB/8 banks)
每个bank地址空间为128,总共八个,即1GB
— Programmable access size (8/16/32-bit) for all banks except bank0 (16/32-bit)
编程控制访问总线位度:8/16/32bit,但bank0只有16/32bit两种选择
— Total 8 memory banks; Six memory banks for ROM, SRAM, etc. Remaining two memory banks for ROM, SRAM, SDRAM, etc .
总共八个bank,前6个bank支持ROM,SRAM等,剩下的两个支持ROM,SRAM,SDRAM等
— Seven fixed memory bank start address
前七个bank的起始地址是固定的。
— One flexible memory bank start address and programmable bank size
bank7有灵活的起始地址和可编程的大小
— Programmable access cycles for all memory banks
可编程控制所有bank的访问周期
— External wait to extend the bus cycles
外部的wait信号可以延长总线的访问周期
— Supporting self-refresh and power down mode in SDRAM
外接sdram,支持自刷新和省电模式
上面为s3c2440存储控制器的地址空间分布图,分别为不是boot from nandflash 和boot from nand flash两种。s3c2440对外引出了27地址线ADDR0~ADDR26的访问范围只有128MB,这是总共八个bank的每个bank的大小。其次cpu对外引出了八个片选信号nGCS0~nGCS7。这样总共有1GB的访问空间。
上面提到s3c2440的bank6、7的地址空间大小是可编程控制的,上面便是不同的空间大小分配情况。当时请注意,bank6和bank7的大小分配必须要是相同的。
bank0可配置为16bit或者32bit宽度。bank0是作为启动rom,所以其总线宽度应该在第一次访问之前被确定,由OM[1:0]的电平决定。
有关于内存地址引脚连接,如SROM/SDRAM,如数据位宽为8bit,A0对应存储芯片的ADDR0,16bit位宽,A1对应ADDR0,32bit位宽,A2对应ADDR0。为什么要这样做呢?这样可以确保唯一的地址访问唯一的内存区域,比如对应32bit数据位宽来说,如数据在[0:3]地址为100,对于发地址信号0、1、2、3都是相同的,因为他们访问了同一个内存区域。
对于各个bank上面连接的类存储设备,可以根据其位宽、存储容量和bank数目决定bank地址线的连接方式,如64MB、32 bit位宽和128MB内存的bank地址为来自于A[25:24]。
下面看下我的开发板jz2440开发板上的存储控制器的八个bank的使用情况:
bank0 接nor flash MX29LV800BBTC;
bank1、bank3与bank5 为接上外部扩展插座
bank2 未接设备
bank4 外接DM9000A网卡
bank6 外接sdram 两个32M的 K4S561632N
bank7 未接设备
现在看下具体的各个寄存器,存储控制器涉及到13个寄存器,这里bank6的sdram初始化做解释。
1. BUS WIDTH & WAIT CONTROL REGISTER (BWSCON) 总线宽度和等待信号控制寄存器
这个寄存器主要用来决定8个bank设置方法相同,比如我的板子上面bank6接了64MB的16bit的sdram,则[27:24]对应位为0010,STx::sdram设为0,sram设为1;至于等待信号通常设为0。
至于bank0的设置是只读的,开机时根据OM[1:0]确定,上面已有提到。
2. bank控制寄存器,主要分为两类,一类为bank0~5不可以支持sdram的,另一类为bank6~7可以支持sdram的。
这是用来设置bank0~bank5的访问时序,此不支持sdram,根据具体接入设备设置各个时间参数即可,这涉及到阅读外设的芯片的工作。
首先设置外接存储设备的类型,MT表示存储设备类型,这里是sdram,bit[16:15]为11,已经确定为sdram类型,只用考虑bit[3:0];
Trcd设置RAS to CAS delay,查看芯片手册,最小值为20ns,我们这里设置的时钟为100MHZ,1clock约为10ns,这里使用3clock即可,稍微大于临界值比较好,设置即01;
SCAN设置,我这里使用的sdram的column为9bit,所以设置为01。
3. 刷新控制寄存器
REFEN[23]:0 = 禁止sdram刷新,1=使能sdram刷新,此处设为1使能;
TREFMD[22]:sdram刷新模式,0=CBR/Auto刷新,1=自刷新模式,这里设为0模式;
Trp[21:20]:此sdram的trp值最小为20ns,此处我设为3clock,1clock10ns,稍微大于临界值,即01;
Tsrc[19:18]:此sdram的trc最小值为65,此处设为7clock,时间70ns,即11
Refresh Counter[10:0]:设置Refresh count,此处存储控制器的时钟频率为100MHZ,从sdram芯片上面找到64ms refresh period (8K Cycle),由上述公式count=2^11+1-100*64000/8192=0x008c04F2。
4. BANKSIZE寄存器REFRESH
BURST_EN[7]:0 ARM核禁止突发传输,1 ARM核允许突发传输;
SCKE_EN[5]:0 不使用SCKE信号令sdram进入省电模式,1=使用SCKE信号令sdram进入省电模式;
SCLK_EN[4]:0 时刻发出SCLK信号,1 仅在访问sdram期间发出SCLK信号(推荐,似乎可以省电);
BK76MAP[2:0]:bank67大小可变,但是必须连续并且相等,我的bank6接sdram为64MB,bank67应设为64MB/64MB,虽然bank7没有使用。
5. 最后的MRSRBx模式设置寄存器
CL[6:4]:可以修改的此值,也是和sdram的时序有关,看芯片手册,这里只支持2和3两种情况,这里设置为2clock,即0x30;
以上就是本人对于s3c2440存储控制器的理解,如发现错误!请帮助纠正,谢谢