关于OEMAddressTable(CE 5.0以前的提法)路径一般为:%WINCEROOT%\PLATFORM\<BSP>\KERNEL\HAL\ARM中的map.a文件中;
g_oalAddressTable(CE 5.0以后的提法)路径一般为:%WINCEROOT5.0%\PLATFORM\<BSP>\Src\Inc中的oemaddrtab_cfg.inc文件中;
config.bib的路径一般在平台的FILES文件夹中。
下面引用一下友善的:
OEMAddressTable
;;;-------------------------------------------------------------
;;; Virt Addr Phys Addr MB
;;;-------------------------------------------------------------
DCD 0x80000000, 0x02000000, 30 ; 30 MB SRAM(SRAM/ROM) BANK 0
DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1
DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4
DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1
DCD 0x90800000, 0x48000000, 1 ; Memory control register
DCD 0x90900000, 0x49000000, 1 ; USB Host register
DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register
DCD 0x90B00000, 0x4B000000, 1 ; DMA control register
DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register
DCD 0x90D00000, 0x4D000000, 1 ; LCD control register
DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
DCD 0x90F00000, 0x4F000000, 1 ; Camera control register
DCD 0x91000000, 0x50000000, 1 ; UART control register
DCD 0x91100000, 0x51000000, 1 ; PWM timer register
DCD 0x91200000, 0x52000000, 1 ; USB device register
DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register
DCD 0x91400000, 0x54000000, 1 ; IIC control register
DCD 0x91500000, 0x55000000, 1 ; IIS control register
DCD 0x91600000, 0x56000000, 1 ; I/O Port register
DCD 0x91700000, 0x57000000, 1 ; RTC control register
DCD 0x91800000, 0x58000000, 1 ; A/D convert register
DCD 0x91900000, 0x59000000, 1 ; SPI register
DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
;DCD 0x92000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0,change by Rn 20081205
;note by Rn 20081205
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0,change by Rn 20081205
DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!)
END
问题1:其中的每一个SRAM(SRAM/ROM) BANK为啥都是32M?是不是有板子的地址线决定的,如果这样,那推算过来地址线应该是25根。但是查看友善提供的原理图,只有13根地址线链接SDRAM啊?
问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?)
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则?
问题5:"DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么?
问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改?
24 个解决方案
#1
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
#2
以下是摘自三星S3C2440的CE5.0BSP中的内存静态映射表:
这里应该是从Nand Flash启动系统的吧?而且吧64M的SDRAM映射的了0x80000000起始的虚拟内存空间。而且在Bank2区域有个“nGCS2: PCMCIA/PCCARD”,是不是预留给PCMCIA/PCCARD设备的DMA区,还是别的用途?请高手为俺们这些半桶水的人指点一下。
g_oalAddressTable
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4
DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5
DCD 0x8C000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1
DCD 0x90800000, 0x48000000, 1 ; Memory control register
DCD 0x90900000, 0x49000000, 1 ; USB Host register
DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register
DCD 0x90B00000, 0x4B000000, 1 ; DMA control register
DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register
DCD 0x90D00000, 0x4D000000, 1 ; LCD control register
DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
DCD 0x90F00000, 0x4F000000, 1 ; Camera control register
DCD 0x91000000, 0x50000000, 1 ; UART control register
DCD 0x91100000, 0x51000000, 1 ; PWM timer register
DCD 0x91200000, 0x52000000, 1 ; USB device register
DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register
DCD 0x91400000, 0x54000000, 1 ; IIC control register
DCD 0x91500000, 0x55000000, 1 ; IIS control register
DCD 0x91600000, 0x56000000, 1 ; I/O Port register
DCD 0x91700000, 0x57000000, 1 ; RTC control register
DCD 0x91800000, 0x58000000, 1 ; A/D convert register
DCD 0x91900000, 0x59000000, 1 ; SPI register
DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register
DCD 0x92000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0
DCD 0x00000000, 0x00000000, 0 ; end of table
;------------------------------------------------------------------------------
END
这里应该是从Nand Flash启动系统的吧?而且吧64M的SDRAM映射的了0x80000000起始的虚拟内存空间。而且在Bank2区域有个“nGCS2: PCMCIA/PCCARD”,是不是预留给PCMCIA/PCCARD设备的DMA区,还是别的用途?请高手为俺们这些半桶水的人指点一下。
#3
修整:
以上的:
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
应为
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
以上的:
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
应为
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
#4
好基础的出问题啊,问题一:SDRAM地址线行列线复用的
#5
问题2:两片都接到bank6——楼主在论坛搜索一下。这些东西很多人都问过了。没有必要发帖的。。
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。
#6
第二部分:关于config.bib文件对OEMAddressTable/g_oalAddressTable所作内存静态映射的具体功能区域划分的理解
“在虚实地址映射文件[例如ARM下的map.a的OEMAddressTable]中建立虚实地址的静态映射关系,包括RAM,FLASH各部分存储空间,OS启动后所能够识别的物理内存。接着在config.bib的MEMORY段把RAM映射后的虚拟地址进行分段,比如NK的大小,各种外设缓冲区的保留等.(注意这里是虚拟地址的划分,必须建立在映射基础上) ”
不知道以上这个理解完全对不?
如果是这样,那么对于上边楼主列出的内存映射表,那么在config.bib的MEMORY段只能从0x8C00 0000这一虚拟地址开始,根据功能分段;而对于2楼的内存映射表,那么在config.bib的MEMORY段只能从0x8000 0000这一虚拟地址开始,根据功能分段咯。
而且在实际的设计和移植系统时,只要按照BSP指定的具体内存静态映射的思路去做,不用强求config.bib的MEMORY段非要从某个虚拟地址开始[比如0x8000 0000],只要保证分段的内存在4G的CE地址空间的0x8000 0000-0x9fff ffff这一带缓存的地址就行了。
这样分析,对么?
还有就是,在做内存静态映射时,物理地址可以是不连续的;而虚拟地址上的安排上,一定要保证是连续的,这样说是正确的吧?
以上讨论的都是SDRAM内存的静态映射和分配问题,有人可能就会问了:那2440和Nand Flash的硬件连线,是不是也是由nGCSX(X=0~7)控制的,挂靠在哪个BANK?
其实Nand Flash不在地址空间里,只是类似硬盘的外设。2440和Nand Flash的硬件连线是有专门的引脚的nFCE ,不是nGCSX(X=0~7)。这两段取自gooogleman的帖子"对OEMAddressTable以及2440一些硬件连接的疑惑",特此表示感谢!
“在虚实地址映射文件[例如ARM下的map.a的OEMAddressTable]中建立虚实地址的静态映射关系,包括RAM,FLASH各部分存储空间,OS启动后所能够识别的物理内存。接着在config.bib的MEMORY段把RAM映射后的虚拟地址进行分段,比如NK的大小,各种外设缓冲区的保留等.(注意这里是虚拟地址的划分,必须建立在映射基础上) ”
不知道以上这个理解完全对不?
如果是这样,那么对于上边楼主列出的内存映射表,那么在config.bib的MEMORY段只能从0x8C00 0000这一虚拟地址开始,根据功能分段;而对于2楼的内存映射表,那么在config.bib的MEMORY段只能从0x8000 0000这一虚拟地址开始,根据功能分段咯。
而且在实际的设计和移植系统时,只要按照BSP指定的具体内存静态映射的思路去做,不用强求config.bib的MEMORY段非要从某个虚拟地址开始[比如0x8000 0000],只要保证分段的内存在4G的CE地址空间的0x8000 0000-0x9fff ffff这一带缓存的地址就行了。
这样分析,对么?
还有就是,在做内存静态映射时,物理地址可以是不连续的;而虚拟地址上的安排上,一定要保证是连续的,这样说是正确的吧?
以上讨论的都是SDRAM内存的静态映射和分配问题,有人可能就会问了:那2440和Nand Flash的硬件连线,是不是也是由nGCSX(X=0~7)控制的,挂靠在哪个BANK?
其实Nand Flash不在地址空间里,只是类似硬盘的外设。2440和Nand Flash的硬件连线是有专门的引脚的nFCE ,不是nGCSX(X=0~7)。这两段取自gooogleman的帖子"对OEMAddressTable以及2440一些硬件连接的疑惑",特此表示感谢!
#7
这样回答,像没有点到实质啊?
#8
好,贴出了
问个内存电路接口以及访问问题
http://topic.csdn.net/u/20081113/09/7d480bb0-5485-4884-a620-495265f06d61.html?seed=581578907
S3C2410 SDRAM 和处理器相连接的注意点
http://blog.ednchina.com/thinkker/157652/message.aspx#
BIOS之内存控制器设置以及内存电路接口分析
http://blog.csdn.net/gooogleman/archive/2008/11/12/3283075.aspx
看来 gooogleman 果然是桂电的精英啊,看这种趋势,我看不出半年,可以做版主;不出1年可以去申请微软MVP咯!
顶!
#9
本想直接等着你送分,但想想一个问题也不回答直接拿分也不太好意思,回答一个吧:
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间
相关的DMA空间必须在RAM中分配或者是在Config.bib中Reserve使用
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间
相关的DMA空间必须在RAM中分配或者是在Config.bib中Reserve使用
#10
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如:
在map.a中:
DCD 0x90800000, 0x48000000, 1 ; Memory control register
在S2440.H中:
#define MEMCTRL_BASE 0xB0800000
所有S2440.h的虚拟地址在MAP.a的虚拟地址基础上加了0X20000000。
同时,如果操作内存SDRAM物理地址空间而不是寄存器空间。如S2440的0x2800 0000地址应该怎么操作?
在一般的应用程序中访问I/O是访问它的缓存段虚拟地址,而驱动程序中必须访问无缓存段虚拟地址。
在楼主给的内存映射表上,SDRAM物理地址映射如下:
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0
那么,想操作SDRAM的地址空间,就从0x8C000000开始的64MB可以操作
这样来说,如果在内存映射表中表明的寄存器空间,那么在S2440.h应该都可以找的到对应值。
那么,各个寄存器空间的物理地址是如何得到的?答案是:在S3C2440的芯片手册上Table 1-4. S3C2440A Special Registers能查到相关定义!按照S3C2410/S3C2440芯片的内存控制器的设计,从0x4800 0000-0x5fff fff范围内的系统物理地址空间被命名为SFR(特殊功能寄存器)的片内外设寄存器(包括控制寄存器、状态寄存器以及数据缓冲区等)占用,这部分物理地址空间不可再用来其它用途。顺便提一下,SFR本来占用了共384MB的物理地址空间,但是其对应的虚拟内存则只占有0x9080 000 - 0x91bf ffff范围的19MB的虚拟地址空间,这里也看出虚拟存储的一个好处。
S2440.h和map.a是怎样的关系呢?答案是:用S2440.h来作为参照点,在map.a中来确定具体每个寄存器对应的非缓存虚拟地址?
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如:
在map.a中:
DCD 0x90800000, 0x48000000, 1 ; Memory control register
在S2440.H中:
#define MEMCTRL_BASE 0xB0800000
所有S2440.h的虚拟地址在MAP.a的虚拟地址基础上加了0X20000000。
同时,如果操作内存SDRAM物理地址空间而不是寄存器空间。如S2440的0x2800 0000地址应该怎么操作?
在一般的应用程序中访问I/O是访问它的缓存段虚拟地址,而驱动程序中必须访问无缓存段虚拟地址。
在楼主给的内存映射表上,SDRAM物理地址映射如下:
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0
那么,想操作SDRAM的地址空间,就从0x8C000000开始的64MB可以操作
这样来说,如果在内存映射表中表明的寄存器空间,那么在S2440.h应该都可以找的到对应值。
那么,各个寄存器空间的物理地址是如何得到的?答案是:在S3C2440的芯片手册上Table 1-4. S3C2440A Special Registers能查到相关定义!按照S3C2410/S3C2440芯片的内存控制器的设计,从0x4800 0000-0x5fff fff范围内的系统物理地址空间被命名为SFR(特殊功能寄存器)的片内外设寄存器(包括控制寄存器、状态寄存器以及数据缓冲区等)占用,这部分物理地址空间不可再用来其它用途。顺便提一下,SFR本来占用了共384MB的物理地址空间,但是其对应的虚拟内存则只占有0x9080 000 - 0x91bf ffff范围的19MB的虚拟地址空间,这里也看出虚拟存储的一个好处。
S2440.h和map.a是怎样的关系呢?答案是:用S2440.h来作为参照点,在map.a中来确定具体每个寄存器对应的非缓存虚拟地址?
#11
太抬举我了,你过一段时间你就知道这些东西有多么基础了!MVP?你去博客园的wince组的博客看看,你就知道什么叫做MVP了。——我感觉我就是一个混混。
我建议你看看hzdysymbol,gsymichael等回答的问题,
非常深入,他们回答的都是比较高级的。
剩下那个半吊子的问题就是我来瞎弄一下。
很想快点进步,但是越着急呢,问题越多。现在碰上了一些内存管理的问题,一窍不通呢。
估计离走入wince驱动大门还要一段时间
#12
按照你的意思,如果我是要对LCD分配1M的显示缓存区(应该也可成为DMA区吧),那我在Config.bib文件中的Memory节就可以这样写:
MEMORYRA
DISPLAY 8c100000 00100000 RESERVED ;320*240~1Mb的显示缓存
对不?
那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,比如下面的例子:
MEMORY
; Tarzan Debug mode
NK 8C200000 02000000 RAMIMAGE ;32MB
RAM 8E000000 01F00000 RAM ;31MB
; Common RAM areas
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
DBGSER_DMA 8c022000 00002000 RESERVED
SER_DMA 8c024000 00002000 RESERVED
DISPLAY 8c100000 00100000 RESERVED ;320*240~1Mb的显示缓
#13
你在自问自答呢?
#14
那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,
没有规定说NK一定要在最前面,我看到的只有一点要求就是RAM区中间不断被Reserve,这两点是可以确定的,
别的可能还要仔细查阅相关文档
没有规定说NK一定要在最前面,我看到的只有一点要求就是RAM区中间不断被Reserve,这两点是可以确定的,
别的可能还要仔细查阅相关文档
#15
没有人看到或是不想说,恰好自己又找到些资料,放上来一起探讨一下了!
#16
问题1:其中的每一个SRAM(SRAM/ROM) BANK为啥都是32M?是不是有板子的地址线决定的,如果这样,那推算过来地址线应该是25根。但是查看友善提供的原理图,只有13根地址线链接SDRAM啊?
-->每个BANK是32MB,是由CPU规定的该BANK可寻址的地址空间决定的,而不是由地址线决定的。这个可以看CPU的spec中给出的Memory Controller的物理地址列表。
你的问题有个概念混淆SRAM和DRAM是不一样的。SRAM必须是连续可寻址,而DRAM是行列地址交叉复用的。这是两者架构决定的差异,有兴趣可以google一下。
正是由于DRAM的行列地址复用,由RAS和CAS来区分行列(Row,Column),所以DRAM需要的地址线比以其容量计算出来的连续地址线要少的多。
问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?)
-->64MB是指Bank6或者Bank7都可以达到(事实上,都可以达到128MB)。你对原理图的理解很正确,的确是2片32MBx16bit的SDRAM组成了32MBx32bit的SDRAM。但根据CPU接口设计,也可以2片32MBx16bit的SDRAM分别接在bank6和bank7上的。
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
--> 是的,专门预先划分出“连续的”空间,而不是在程序里用Alloc之类的去申请,方便了驱动的设计,也提供了驱动和应用共同访问一个区域的手段。
问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则?
-->依据一:该物理地址对应的地址空间(CPU中规定多少就分配多少,多了没用)
依据二:实际需要的虚拟地址空间(即使CPU规定了可以达到1GB空间,但实际只需要使用1MB,那就只定义1MB足矣,多了浪费)
问题5:"DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么?
-->从操作系统开发原理上讲:不是。你看linux,看Vxworks,这个0x300000000映射的都不是0x8c000000。
从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。你可以改,但后果自负。
问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改?
-->一般不建议全部修改,适当修改即可。
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
-->这个2MB是划分给BANK0的,而不仅仅是划分给NOR的。所以,还是留着吧,即使实际可能不用这个bank0。
-->每个BANK是32MB,是由CPU规定的该BANK可寻址的地址空间决定的,而不是由地址线决定的。这个可以看CPU的spec中给出的Memory Controller的物理地址列表。
你的问题有个概念混淆SRAM和DRAM是不一样的。SRAM必须是连续可寻址,而DRAM是行列地址交叉复用的。这是两者架构决定的差异,有兴趣可以google一下。
正是由于DRAM的行列地址复用,由RAS和CAS来区分行列(Row,Column),所以DRAM需要的地址线比以其容量计算出来的连续地址线要少的多。
问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?)
-->64MB是指Bank6或者Bank7都可以达到(事实上,都可以达到128MB)。你对原理图的理解很正确,的确是2片32MBx16bit的SDRAM组成了32MBx32bit的SDRAM。但根据CPU接口设计,也可以2片32MBx16bit的SDRAM分别接在bank6和bank7上的。
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
--> 是的,专门预先划分出“连续的”空间,而不是在程序里用Alloc之类的去申请,方便了驱动的设计,也提供了驱动和应用共同访问一个区域的手段。
问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则?
-->依据一:该物理地址对应的地址空间(CPU中规定多少就分配多少,多了没用)
依据二:实际需要的虚拟地址空间(即使CPU规定了可以达到1GB空间,但实际只需要使用1MB,那就只定义1MB足矣,多了浪费)
问题5:"DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么?
-->从操作系统开发原理上讲:不是。你看linux,看Vxworks,这个0x300000000映射的都不是0x8c000000。
从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。你可以改,但后果自负。
问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改?
-->一般不建议全部修改,适当修改即可。
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
-->这个2MB是划分给BANK0的,而不仅仅是划分给NOR的。所以,还是留着吧,即使实际可能不用这个bank0。
#17
这贴子有精华的潜力,MARK一下:)照这势头发展,明天给加下精:)
#18
16楼shuiyan正解。受益了。
建议楼主看一下2440的datasheet的memory controller一章,会比较清楚点。
建议楼主看一下2440的datasheet的memory controller一章,会比较清楚点。
#19
我觉得给shuiyan加分才对
这些问题不是我们不懂,而是我们觉得繁琐不想回答。
这个帖子可以推荐,因为很多初学者都会都这个东西迷迷糊糊的
#20
谢谢大家的帮助!
这里有个问题:
关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。”
那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中定义Eboot等地址的)。这样的话,如果按照BSP提供商的预定义的去定制系统,这样应该可行吧?
这里有个问题:
关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。”
那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中定义Eboot等地址的)。这样的话,如果按照BSP提供商的预定义的去定制系统,这样应该可行吧?
#21
这个可以改的。这个是内存起始的物理地址映射的虚拟地址
我改过。但是后面的地址也跟着偏移一些。
没有关系,这个只是个表,当然可以修改了
我把物理内存映射分成两段都可以。
只要修改合理没有问题。
楼主你只要知道是这么回事就可以了。
#22
谢谢大家的指点!
由于使用了“三星的官方的S3C2440CE5.0的BSP”,这么BSP是很干净的BSP,本身都没有被编译过。而且日子有点久远了,所以以上在静态内存的映射上有点不同,不过结果实践表明,是可以编译出系统的。
关于在使用"干净"的BSP开发时,首先遇到的问题,请参见以下这篇帖子:
PB编译中,在sysgen过程中无法复制文件的问题
http://topic.csdn.net/u/20081208/16/c3dbbae9-e977-4a3b-a776-3f4e45422296.html?558260523
由于使用了“三星的官方的S3C2440CE5.0的BSP”,这么BSP是很干净的BSP,本身都没有被编译过。而且日子有点久远了,所以以上在静态内存的映射上有点不同,不过结果实践表明,是可以编译出系统的。
关于在使用"干净"的BSP开发时,首先遇到的问题,请参见以下这篇帖子:
PB编译中,在sysgen过程中无法复制文件的问题
http://topic.csdn.net/u/20081208/16/c3dbbae9-e977-4a3b-a776-3f4e45422296.html?558260523
#23
make
#24
顶起!
#1
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
#2
以下是摘自三星S3C2440的CE5.0BSP中的内存静态映射表:
这里应该是从Nand Flash启动系统的吧?而且吧64M的SDRAM映射的了0x80000000起始的虚拟内存空间。而且在Bank2区域有个“nGCS2: PCMCIA/PCCARD”,是不是预留给PCMCIA/PCCARD设备的DMA区,还是别的用途?请高手为俺们这些半桶水的人指点一下。
g_oalAddressTable
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4
DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5
DCD 0x8C000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1
DCD 0x90800000, 0x48000000, 1 ; Memory control register
DCD 0x90900000, 0x49000000, 1 ; USB Host register
DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register
DCD 0x90B00000, 0x4B000000, 1 ; DMA control register
DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register
DCD 0x90D00000, 0x4D000000, 1 ; LCD control register
DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
DCD 0x90F00000, 0x4F000000, 1 ; Camera control register
DCD 0x91000000, 0x50000000, 1 ; UART control register
DCD 0x91100000, 0x51000000, 1 ; PWM timer register
DCD 0x91200000, 0x52000000, 1 ; USB device register
DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register
DCD 0x91400000, 0x54000000, 1 ; IIC control register
DCD 0x91500000, 0x55000000, 1 ; IIS control register
DCD 0x91600000, 0x56000000, 1 ; I/O Port register
DCD 0x91700000, 0x57000000, 1 ; RTC control register
DCD 0x91800000, 0x58000000, 1 ; A/D convert register
DCD 0x91900000, 0x59000000, 1 ; SPI register
DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register
DCD 0x92000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0
DCD 0x00000000, 0x00000000, 0 ; end of table
;------------------------------------------------------------------------------
END
这里应该是从Nand Flash启动系统的吧?而且吧64M的SDRAM映射的了0x80000000起始的虚拟内存空间。而且在Bank2区域有个“nGCS2: PCMCIA/PCCARD”,是不是预留给PCMCIA/PCCARD设备的DMA区,还是别的用途?请高手为俺们这些半桶水的人指点一下。
#3
修整:
以上的:
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
应为
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
以上的:
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
应为
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6
DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
#4
好基础的出问题啊,问题一:SDRAM地址线行列线复用的
#5
问题2:两片都接到bank6——楼主在论坛搜索一下。这些东西很多人都问过了。没有必要发帖的。。
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。
#6
第二部分:关于config.bib文件对OEMAddressTable/g_oalAddressTable所作内存静态映射的具体功能区域划分的理解
“在虚实地址映射文件[例如ARM下的map.a的OEMAddressTable]中建立虚实地址的静态映射关系,包括RAM,FLASH各部分存储空间,OS启动后所能够识别的物理内存。接着在config.bib的MEMORY段把RAM映射后的虚拟地址进行分段,比如NK的大小,各种外设缓冲区的保留等.(注意这里是虚拟地址的划分,必须建立在映射基础上) ”
不知道以上这个理解完全对不?
如果是这样,那么对于上边楼主列出的内存映射表,那么在config.bib的MEMORY段只能从0x8C00 0000这一虚拟地址开始,根据功能分段;而对于2楼的内存映射表,那么在config.bib的MEMORY段只能从0x8000 0000这一虚拟地址开始,根据功能分段咯。
而且在实际的设计和移植系统时,只要按照BSP指定的具体内存静态映射的思路去做,不用强求config.bib的MEMORY段非要从某个虚拟地址开始[比如0x8000 0000],只要保证分段的内存在4G的CE地址空间的0x8000 0000-0x9fff ffff这一带缓存的地址就行了。
这样分析,对么?
还有就是,在做内存静态映射时,物理地址可以是不连续的;而虚拟地址上的安排上,一定要保证是连续的,这样说是正确的吧?
以上讨论的都是SDRAM内存的静态映射和分配问题,有人可能就会问了:那2440和Nand Flash的硬件连线,是不是也是由nGCSX(X=0~7)控制的,挂靠在哪个BANK?
其实Nand Flash不在地址空间里,只是类似硬盘的外设。2440和Nand Flash的硬件连线是有专门的引脚的nFCE ,不是nGCSX(X=0~7)。这两段取自gooogleman的帖子"对OEMAddressTable以及2440一些硬件连接的疑惑",特此表示感谢!
“在虚实地址映射文件[例如ARM下的map.a的OEMAddressTable]中建立虚实地址的静态映射关系,包括RAM,FLASH各部分存储空间,OS启动后所能够识别的物理内存。接着在config.bib的MEMORY段把RAM映射后的虚拟地址进行分段,比如NK的大小,各种外设缓冲区的保留等.(注意这里是虚拟地址的划分,必须建立在映射基础上) ”
不知道以上这个理解完全对不?
如果是这样,那么对于上边楼主列出的内存映射表,那么在config.bib的MEMORY段只能从0x8C00 0000这一虚拟地址开始,根据功能分段;而对于2楼的内存映射表,那么在config.bib的MEMORY段只能从0x8000 0000这一虚拟地址开始,根据功能分段咯。
而且在实际的设计和移植系统时,只要按照BSP指定的具体内存静态映射的思路去做,不用强求config.bib的MEMORY段非要从某个虚拟地址开始[比如0x8000 0000],只要保证分段的内存在4G的CE地址空间的0x8000 0000-0x9fff ffff这一带缓存的地址就行了。
这样分析,对么?
还有就是,在做内存静态映射时,物理地址可以是不连续的;而虚拟地址上的安排上,一定要保证是连续的,这样说是正确的吧?
以上讨论的都是SDRAM内存的静态映射和分配问题,有人可能就会问了:那2440和Nand Flash的硬件连线,是不是也是由nGCSX(X=0~7)控制的,挂靠在哪个BANK?
其实Nand Flash不在地址空间里,只是类似硬盘的外设。2440和Nand Flash的硬件连线是有专门的引脚的nFCE ,不是nGCSX(X=0~7)。这两段取自gooogleman的帖子"对OEMAddressTable以及2440一些硬件连接的疑惑",特此表示感谢!
#7
这样回答,像没有点到实质啊?
#8
好,贴出了
问个内存电路接口以及访问问题
http://topic.csdn.net/u/20081113/09/7d480bb0-5485-4884-a620-495265f06d61.html?seed=581578907
S3C2410 SDRAM 和处理器相连接的注意点
http://blog.ednchina.com/thinkker/157652/message.aspx#
BIOS之内存控制器设置以及内存电路接口分析
http://blog.csdn.net/gooogleman/archive/2008/11/12/3283075.aspx
看来 gooogleman 果然是桂电的精英啊,看这种趋势,我看不出半年,可以做版主;不出1年可以去申请微软MVP咯!
顶!
#9
本想直接等着你送分,但想想一个问题也不回答直接拿分也不太好意思,回答一个吧:
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间
相关的DMA空间必须在RAM中分配或者是在Config.bib中Reserve使用
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间
相关的DMA空间必须在RAM中分配或者是在Config.bib中Reserve使用
#10
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如:
在map.a中:
DCD 0x90800000, 0x48000000, 1 ; Memory control register
在S2440.H中:
#define MEMCTRL_BASE 0xB0800000
所有S2440.h的虚拟地址在MAP.a的虚拟地址基础上加了0X20000000。
同时,如果操作内存SDRAM物理地址空间而不是寄存器空间。如S2440的0x2800 0000地址应该怎么操作?
在一般的应用程序中访问I/O是访问它的缓存段虚拟地址,而驱动程序中必须访问无缓存段虚拟地址。
在楼主给的内存映射表上,SDRAM物理地址映射如下:
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0
那么,想操作SDRAM的地址空间,就从0x8C000000开始的64MB可以操作
这样来说,如果在内存映射表中表明的寄存器空间,那么在S2440.h应该都可以找的到对应值。
那么,各个寄存器空间的物理地址是如何得到的?答案是:在S3C2440的芯片手册上Table 1-4. S3C2440A Special Registers能查到相关定义!按照S3C2410/S3C2440芯片的内存控制器的设计,从0x4800 0000-0x5fff fff范围内的系统物理地址空间被命名为SFR(特殊功能寄存器)的片内外设寄存器(包括控制寄存器、状态寄存器以及数据缓冲区等)占用,这部分物理地址空间不可再用来其它用途。顺便提一下,SFR本来占用了共384MB的物理地址空间,但是其对应的虚拟内存则只占有0x9080 000 - 0x91bf ffff范围的19MB的虚拟地址空间,这里也看出虚拟存储的一个好处。
S2440.h和map.a是怎样的关系呢?答案是:用S2440.h来作为参照点,在map.a中来确定具体每个寄存器对应的非缓存虚拟地址?
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如:
在map.a中:
DCD 0x90800000, 0x48000000, 1 ; Memory control register
在S2440.H中:
#define MEMCTRL_BASE 0xB0800000
所有S2440.h的虚拟地址在MAP.a的虚拟地址基础上加了0X20000000。
同时,如果操作内存SDRAM物理地址空间而不是寄存器空间。如S2440的0x2800 0000地址应该怎么操作?
在一般的应用程序中访问I/O是访问它的缓存段虚拟地址,而驱动程序中必须访问无缓存段虚拟地址。
在楼主给的内存映射表上,SDRAM物理地址映射如下:
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0
那么,想操作SDRAM的地址空间,就从0x8C000000开始的64MB可以操作
这样来说,如果在内存映射表中表明的寄存器空间,那么在S2440.h应该都可以找的到对应值。
那么,各个寄存器空间的物理地址是如何得到的?答案是:在S3C2440的芯片手册上Table 1-4. S3C2440A Special Registers能查到相关定义!按照S3C2410/S3C2440芯片的内存控制器的设计,从0x4800 0000-0x5fff fff范围内的系统物理地址空间被命名为SFR(特殊功能寄存器)的片内外设寄存器(包括控制寄存器、状态寄存器以及数据缓冲区等)占用,这部分物理地址空间不可再用来其它用途。顺便提一下,SFR本来占用了共384MB的物理地址空间,但是其对应的虚拟内存则只占有0x9080 000 - 0x91bf ffff范围的19MB的虚拟地址空间,这里也看出虚拟存储的一个好处。
S2440.h和map.a是怎样的关系呢?答案是:用S2440.h来作为参照点,在map.a中来确定具体每个寄存器对应的非缓存虚拟地址?
#11
太抬举我了,你过一段时间你就知道这些东西有多么基础了!MVP?你去博客园的wince组的博客看看,你就知道什么叫做MVP了。——我感觉我就是一个混混。
我建议你看看hzdysymbol,gsymichael等回答的问题,
非常深入,他们回答的都是比较高级的。
剩下那个半吊子的问题就是我来瞎弄一下。
很想快点进步,但是越着急呢,问题越多。现在碰上了一些内存管理的问题,一窍不通呢。
估计离走入wince驱动大门还要一段时间
#12
按照你的意思,如果我是要对LCD分配1M的显示缓存区(应该也可成为DMA区吧),那我在Config.bib文件中的Memory节就可以这样写:
MEMORYRA
DISPLAY 8c100000 00100000 RESERVED ;320*240~1Mb的显示缓存
对不?
那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,比如下面的例子:
MEMORY
; Tarzan Debug mode
NK 8C200000 02000000 RAMIMAGE ;32MB
RAM 8E000000 01F00000 RAM ;31MB
; Common RAM areas
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
DBGSER_DMA 8c022000 00002000 RESERVED
SER_DMA 8c024000 00002000 RESERVED
DISPLAY 8c100000 00100000 RESERVED ;320*240~1Mb的显示缓
#13
你在自问自答呢?
#14
那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,
没有规定说NK一定要在最前面,我看到的只有一点要求就是RAM区中间不断被Reserve,这两点是可以确定的,
别的可能还要仔细查阅相关文档
没有规定说NK一定要在最前面,我看到的只有一点要求就是RAM区中间不断被Reserve,这两点是可以确定的,
别的可能还要仔细查阅相关文档
#15
没有人看到或是不想说,恰好自己又找到些资料,放上来一起探讨一下了!
#16
问题1:其中的每一个SRAM(SRAM/ROM) BANK为啥都是32M?是不是有板子的地址线决定的,如果这样,那推算过来地址线应该是25根。但是查看友善提供的原理图,只有13根地址线链接SDRAM啊?
-->每个BANK是32MB,是由CPU规定的该BANK可寻址的地址空间决定的,而不是由地址线决定的。这个可以看CPU的spec中给出的Memory Controller的物理地址列表。
你的问题有个概念混淆SRAM和DRAM是不一样的。SRAM必须是连续可寻址,而DRAM是行列地址交叉复用的。这是两者架构决定的差异,有兴趣可以google一下。
正是由于DRAM的行列地址复用,由RAS和CAS来区分行列(Row,Column),所以DRAM需要的地址线比以其容量计算出来的连续地址线要少的多。
问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?)
-->64MB是指Bank6或者Bank7都可以达到(事实上,都可以达到128MB)。你对原理图的理解很正确,的确是2片32MBx16bit的SDRAM组成了32MBx32bit的SDRAM。但根据CPU接口设计,也可以2片32MBx16bit的SDRAM分别接在bank6和bank7上的。
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
--> 是的,专门预先划分出“连续的”空间,而不是在程序里用Alloc之类的去申请,方便了驱动的设计,也提供了驱动和应用共同访问一个区域的手段。
问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则?
-->依据一:该物理地址对应的地址空间(CPU中规定多少就分配多少,多了没用)
依据二:实际需要的虚拟地址空间(即使CPU规定了可以达到1GB空间,但实际只需要使用1MB,那就只定义1MB足矣,多了浪费)
问题5:"DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么?
-->从操作系统开发原理上讲:不是。你看linux,看Vxworks,这个0x300000000映射的都不是0x8c000000。
从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。你可以改,但后果自负。
问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改?
-->一般不建议全部修改,适当修改即可。
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
-->这个2MB是划分给BANK0的,而不仅仅是划分给NOR的。所以,还是留着吧,即使实际可能不用这个bank0。
-->每个BANK是32MB,是由CPU规定的该BANK可寻址的地址空间决定的,而不是由地址线决定的。这个可以看CPU的spec中给出的Memory Controller的物理地址列表。
你的问题有个概念混淆SRAM和DRAM是不一样的。SRAM必须是连续可寻址,而DRAM是行列地址交叉复用的。这是两者架构决定的差异,有兴趣可以google一下。
正是由于DRAM的行列地址复用,由RAS和CAS来区分行列(Row,Column),所以DRAM需要的地址线比以其容量计算出来的连续地址线要少的多。
问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?)
-->64MB是指Bank6或者Bank7都可以达到(事实上,都可以达到128MB)。你对原理图的理解很正确,的确是2片32MBx16bit的SDRAM组成了32MBx32bit的SDRAM。但根据CPU接口设计,也可以2片32MBx16bit的SDRAM分别接在bank6和bank7上的。
问题3:对于
DCD 0x90800000, 0x48000000, 1 ; Memory control register
.....
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?
--> 是的,专门预先划分出“连续的”空间,而不是在程序里用Alloc之类的去申请,方便了驱动的设计,也提供了驱动和应用共同访问一个区域的手段。
问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则?
-->依据一:该物理地址对应的地址空间(CPU中规定多少就分配多少,多了没用)
依据二:实际需要的虚拟地址空间(即使CPU规定了可以达到1GB空间,但实际只需要使用1MB,那就只定义1MB足矣,多了浪费)
问题5:"DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么?
-->从操作系统开发原理上讲:不是。你看linux,看Vxworks,这个0x300000000映射的都不是0x8c000000。
从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。你可以改,但后果自负。
问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改?
-->一般不建议全部修改,适当修改即可。
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问 NorFlash的虚拟地址为0x92000000。
DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?
-->这个2MB是划分给BANK0的,而不仅仅是划分给NOR的。所以,还是留着吧,即使实际可能不用这个bank0。
#17
这贴子有精华的潜力,MARK一下:)照这势头发展,明天给加下精:)
#18
16楼shuiyan正解。受益了。
建议楼主看一下2440的datasheet的memory controller一章,会比较清楚点。
建议楼主看一下2440的datasheet的memory controller一章,会比较清楚点。
#19
我觉得给shuiyan加分才对
这些问题不是我们不懂,而是我们觉得繁琐不想回答。
这个帖子可以推荐,因为很多初学者都会都这个东西迷迷糊糊的
#20
谢谢大家的帮助!
这里有个问题:
关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。”
那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中定义Eboot等地址的)。这样的话,如果按照BSP提供商的预定义的去定制系统,这样应该可行吧?
这里有个问题:
关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。”
那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中定义Eboot等地址的)。这样的话,如果按照BSP提供商的预定义的去定制系统,这样应该可行吧?
#21
这个可以改的。这个是内存起始的物理地址映射的虚拟地址
我改过。但是后面的地址也跟着偏移一些。
没有关系,这个只是个表,当然可以修改了
我把物理内存映射分成两段都可以。
只要修改合理没有问题。
楼主你只要知道是这么回事就可以了。
#22
谢谢大家的指点!
由于使用了“三星的官方的S3C2440CE5.0的BSP”,这么BSP是很干净的BSP,本身都没有被编译过。而且日子有点久远了,所以以上在静态内存的映射上有点不同,不过结果实践表明,是可以编译出系统的。
关于在使用"干净"的BSP开发时,首先遇到的问题,请参见以下这篇帖子:
PB编译中,在sysgen过程中无法复制文件的问题
http://topic.csdn.net/u/20081208/16/c3dbbae9-e977-4a3b-a776-3f4e45422296.html?558260523
由于使用了“三星的官方的S3C2440CE5.0的BSP”,这么BSP是很干净的BSP,本身都没有被编译过。而且日子有点久远了,所以以上在静态内存的映射上有点不同,不过结果实践表明,是可以编译出系统的。
关于在使用"干净"的BSP开发时,首先遇到的问题,请参见以下这篇帖子:
PB编译中,在sysgen过程中无法复制文件的问题
http://topic.csdn.net/u/20081208/16/c3dbbae9-e977-4a3b-a776-3f4e45422296.html?558260523
#23
make
#24
顶起!