原创 S3C2410外围存储系统的研究与设计

2008-9-4 19:12 3118 3 3 分类: 软件与OS
摘  要:针对Linux移植S3C2410微处理器系统开发的需要,设计了S3C2410外围存储系统。本文研究了S3C2410的寻址原理,并结合该芯片SDRAM时序图详细分析了其对SDRAM寻址的全过程。介绍了与存储系统设计相关的控制寄存器和引脚,给出了与Flash和SDRAM的硬件电路连接图。最后在启动代码U-Boot下实现了存储系统的初始化。嵌入式开发人员可以根据开发需要借鉴本文的设计思路扩展其它ARM核芯片的存储系统。
关键词:S3C2410;寻址原理;SDRAM寻址机制;U-Boot

0 引言


Samsung公司推出的基于ARM920T内核的16/32位RISC微处理器S3C2410,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。为了降低整个系统的成本,S3C2410提供了丰富的内部设备。其中加强的ARM体系结构MMU用于支持WinCE,EPOC32和Linux。随着技术的进步和发展,电子产品的功能日益强大,而嵌入式操作系统可以有效地管理各项功能,并且能够缩短产品开发周期,因此将微处理器与嵌入式操作系统进行联合开发成为一种趋势,然而微处理器的片内存储资源有限,若要进行嵌入式系统的移植,必须扩展其存储系统。对于嵌入式系统的开发人员来说,深入理解其存储系统原理和有效地管理存储系统对正确高效地设计嵌入式系统的硬件和底层软件编程具有重要的意义[1]


1 S3C2410的寻址原理


ARM920T内核提供了32位的地址总线,可以访问4G(232)的线性地址空间,而S3C2410的内部地址总线是30bit(HADDR[29:0]),能够访问的最大外部地址空间是230,即1G的地址空间0x00000000~0x3FFFFFFFF,可见S3C2410仅利用了ARM920T的32位地址总线的低30位,并且是一一对应相连的[1]。由表1可知S3C2410将1G的外部地址空间分成了8个存储器组,每个组的大小为128M,其中6个用于ROM、SRAM等存储器,2个用于ROM、SRAM、SDRAM等存储器。基于芯片体积及成本的考虑,当S3C2410对外寻址时,采用了部分译码的方式,即低位地址线用于外围存储器的片内寻址,而高位地址线用于外围存储器的片外寻址。如表1所示,由于每个存储器组的起始地址及空间大小固定,对于系统要访问的任意外部地址,S3C2410可以方便地利用内部地址总线的高3位HADDR[29:27]来选择该地址属于哪一个存储器组(Bank),从而激活相应的Bank选择信号,并且使用外部地址总线A[26:0]来实现相应Bank的内部寻址,寻址范围为128M(227),从而使得其外围地址访问空间为1GB(128MB×8)。S3C2410正是通过这种机制来完成外部地址空间的寻址全过程。


表 1 S3C2410存储器组片选激活及地址空间分配




HADDR29


HADDR28


HADDR27


片选信号


片选控制


寄存器


地址空间


0


0


0


nGCS0


BANKCON0


0x00000000~0x07FFFFFF


0


0


1


nGCS1


BANKCON1


0x08000000~0x0FFFFFFF


0


1


0


nGCS2


BANKCON2


0x10000000~0x17FFFFFF


0


1


1


nGCS3


BANKCON3


0x18000000~0x1FFFFFFF


1


0


0


nGCS4


BANKCON4


0x20000000~0x27FFFFFF


1


0


1


nGCS5


BANKCON5


0x28000000~0x2FFFFFFF


1


1


0


nGCS6


BANKCON6


0x30000000~0x37FFFFFF


1


1


1


nGCS7


BANKCON7


0x38000000~0x3FFFFFFF


 


S3C2410访问SDRAM地址空间的过程比较难理解,这主要和SDRAM的存储结构有关。为了更深入地理解其寻址机制,笔者以SDRAM芯片HY57V561620B(32MB)为例进行详细地说明。该芯片的内部存储结构是4Banks×4M×16Bit,即共有4个Bank,每个Bank中有4M个半字(16Bit)。Bank地址可以通过BA[1:0]与地址总线的高位相连来确定,具体BA[1:0]与哪个地址位相连,不同的SDRAM存储系统有不同的方案,详见参考文献[3]。而每个Bank中的存储单元由行地址和列地址来唯一标识[1],该芯片通过行地址锁存引脚nRAS和列地址锁存引脚nCAS分别与S3C2410的引脚nSRAS(SDRAM行地址选通信号)和nSCAS(SDRAM列地址选通信号)连接,从地址总线获得行地址和列地址。而且列地址的位数可以在BANKCONn(n=6,7)的中的SCAN——BANKCONn [1:0]来配置,00=8-bit,01=9-bit,10=10-bit,其复位值为00,即8bit。


在实际工作中,如图1所示,在第3个总线时钟,nSCS为低电平,表示SDRAM被选中,并且地址线的Bank地址与相应的行地址同时发出,这个命令称之为“行有效”或“行激活”(Row Active)。此时SDRAM将行地址锁存(nSRAS有效),但还没有执行写命令(nWE为高电平),因为没有列地址(nSCAS为高电平),存储单元无法确定。经过Trcd(RAS至CAS延迟)后,SDRAM再次被选中(nSCS为低电平),此时nSCAS为低电平,指示SDRAM此时地址线上的地址为列地址,同时nWE有效,写操作被执行。可见发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址,相关的列地址被选中之后,将会触发数据传输。至此,S3C2410对SDRAM的寻址就完成了。可见,S3C2410将地址总线上的地址分成行地址和列地址并分开传输给SDRAM。基于上述的寻址机制,由BA[1:0]和12根地址线就可以寻址32M或更大的地址空间了。



20080720123019629.jpg


图 1 S3C2410 SDRAM时序图


2 存储器控制器和相关引脚介绍


2.1寄存器介绍


S3C2410存储器控制器主要有:总线带宽和等待控制寄存器(BWSCON);总线控制寄存器(BANKCONN:nGCS0-nGCS5);BANK控制寄存器(BANKCONn:nGCS6-nGCS7);刷新控制寄存器(REFRESH);BANKSIZE寄存器;SDRAM模式寄存器集寄存器(MRSR)等,详情请见参考文献[3]。


2.2相关引脚


S3C2410提供了相关的引脚来控制存储器访问:


组选择信号:nGCS0-nGCS5,nGCS6(nSCS0),nGCS7(nSCS1)引脚用来选择相应的存储器组。


访问控制信号:为了实现ARM存储器访问指令LDR/STR字节、半字和字访问的三种方式,在S3C2410的存储器组中,除了Bank0以外的所有地址空间都可以通过编程设置为8位、16位或32位对准访问,Bank0可以设置为16位或32位。引脚nWBE[3:0](写字节使能)实现8bit ROM芯片组的三种访问方式,或者SRAM不使用UB/LB(在BWSCON中设置)的情况下,与UB/LB连接。引脚nBE[3:0](在使用SRAM情况下的字节允许信号)在SRAM使用UB/LB(是否使用可在BWSCON中设置)的情况下与UB/LB连接。DQM[3:0](SDRAM数据屏蔽信号)引脚实现对SDRAM的三种访问。还有nWAIT、nXBREQ/nXBACK引脚。


3 硬件电路设计


在本嵌入式系统开发实验中,S3C2410扩展的存储系统采用了英国Intel公司的16M E28F128J3A-150 NOR Flash芯片,以及Hynix公司的32M HY57V561620B SDRAM芯片。地址空间分配如下:Flash为Bank0中的0x00000000~0x07FFFFFF地址段,而SDRAM为Bank6中的0x30000000~0x37FFFFFF地址段,具体的电路连接如图2。



20080720123020568.jpg


图 2 S3C2410 与Flash、SDRAM的电路连接图


4 存储系统初始化


U-Boot是德国DENX小组的开发用于多种嵌入式CPU的开放源代码bootloader程序,目前最新版本是1.1.6,本实验使用的是U-Boot-1.1.4。U-Boot是在ppcboot以及armboot的基础上发展而来,现已非常成熟和稳定,已经在许多嵌入式系统开发过程中被采用。其支持多种目标操作系统,其中对Linux的支持最完善,是嵌入式Linux Bootloader的最佳选择。


由于本实验Linux要移植的开发板是基于s3c2410的开发板,在U-Boot中已有移植成功的smdk2410开发板,故以smdk2410开发板上运行的U-Boot为模板设计适合本实验的U-Boot。有关存储系统的初始化修改如下:


(1)Flash驱动程序采用了board/Cmi/Flash.c,由于cmi中的flash.c在写入时要交换字节,因而删除了它的write_short()和write_buff()函数,利用board/ep7312/Flash.c中的write_word()和write_buff()函数,并且把flash.c中的FLASH_BASE0_PRELIM改为CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改为0x20000,(E28F128J3A flash中块的大小是128K)。


(2)Board/ smdk2410/smdk2410.c中函数dram_init()定义了SDRAM的真实地址和实际大小。由于本实验中,SDRAM的大小为32M,所以修改Include/configs/Smdk2410.h中的PHYS_SDRAM_1_SIZE,改为0x02000000。


(3)将如下代码替代原来在Include/configs/Smdk2410.h的/*FLASH and environment organization*/一栏中的内容。


#define PHYS_FLASH_1 0x00000000                /* Flash Bank #1 */
#define PHYS_FLASH_SIZE 0x01000000           /* 16 MB */
#define CFG_FLASH_PROTECTION
#define CFG_FLASH_BASE PHYS_FLASH_1
#define CFG_MONITOR_BASE PHYS_FLASH_1
#define CFG_MAX_FLASH_BANKS 1        /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 128              /* max number of sectors on one chip */
#define CFG_FLASH_ERASE_TOUT (2*CFG_HZ)    /* Timeout for Flash Erase */
#define CFG_FLASH_WRITE_TOUT (2*CFG_HZ)   /* Timeout for Flash Write */
#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x60000)
#define CFG_ENV_SIZE 0x20000                     /* Total Size of Environment Sector */


如上分析,SDRAM和Flash的初始化信息分别在smdk2410.c和flash.c文件中定义了,最后是通过lib_arm/board.c文件的display_dram_config()和display_flash_config()函数来显示的。


5 结束语


本文结合实际实验,分析了S3C2410的存储系统原理,完成了其外围存储系统的硬件电路设计和软件初始化,最后成功实现了对S3C2410存储系统的存取访问。开发人员可以根据笔者的研究和设计思路,同时结合所需的存储容量和类型进行高效的存储系统设计。


本文作者的创新点:从S3C2410芯片寻址原理的研究和存储芯片时序图的分析,实现了其外围存储系统的硬件设计和软件编程,展现了S3C2410与外围存储系统的相互访问机制,力求设计思路更加清晰,有利于嵌入式系统的调试,从而提高其稳定性。


参考文献:


[1]      袁夫全等.基于S3C4510B的存储系统原理与设计.微计算机信息.2005,21(2):99-101


[2]      ARM9TDMI datasheet.pdf


[3]      S3C2410X datasheet.pdf


[4]      田泽.ARM9嵌入式开发实验与实践.北京:北京航天航空大学出版社.2006.10

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条