从Nandflash启动的Bootload已经可以运行了,现在我想在做一个Norflash上的Bootload。从s3c2440的datasheet里面看,boot internal sram(4kb)的地址是0x40000000,所以我在用ADS调试Bootload的时候,ro地址只能设置为这个才能运行。我的疑问是,为什么在调试的时候把ro的地址设置为除0x40000000以外的地址就不能运行了呢?我的理解是调试的时候ro地址只要是内存中的可用地址就Ok了,难道不是这么一回事吗?
还有就是从Norflash启动的时候,刚开始是直接运行的0x00000000出的代码还是0x40000000处的代码?不会是也CPU自动把前4k给搬到ram里头去了吧?
感谢大家的参与,希望能把余下的问题都给解决了啊!
自己先再顶一下!!!
首先,不管你已什么样的方配置2440,在重启cpu之后,都会自动从0地址开始运行。
你看datasheet中的memory controller那章,内存地址的布局有两种方式,
首先你可以看电路图上,s3c2440有两根引脚,一个叫OM0, 一个叫OM1,
这两个引脚就是来确定用哪种内存地址布局;
第一种,在OM0 = 0 , OM1 = 0的时候,用右边那样的方式,也就是:
第一个bank的128M只有4K的空间可用,不可以外接其它任何存储,因为第一个bank就只能给
sram用,这个时候如果启动的话,sram中是没有程序的,在启动之前,2440自动
把nand flash中的前4K拷到sram中,无须人工干涉,自动完成的。
第二种情况,当OM0 = 1, OM1 = 0, 或者 OM0 = 0, OM1 = 1的时候,
这个时候SRAM实际上跟启动没有关系了。因为SRAM的地址变到了0x40000000,
CPU启动还是从0地址开始执行,但是这个时候0地址所在的第一个BANK就可以
接ROM了呀。 nor flash是rom的一种,当然还有E2PROM等,nand flash不是
ROM,nand flash跟硬盘一样,是通过nand flash controller来访问的。在这种情况下,
启动跟nand flash也没有关系。 所以你得把第一个BANK接成nor flash, 也就是
0地址处就是nor flash, 这个时候的启动就不会有第一种情况里的自动拷的过程。就是
直接运行nor flash中的程序,所以你得先将程序(bootloader)烧到nor flash中。
不知你明白了没有。
结合楼上2人:
你的Bootload从Norflash跑的话,是从0x00000000开始的,因此首先硬件启动必须是支持Norflash的(OM0 = 1, OM1 = 0, 或者 OM0 = 0, OM1 = 1)。
程序运行到mmu初始化以后,影射关系可能发生改变,所以mmu影射必须按Norflash启动方式重新初始化。
引用: 引用楼主 yhm24 的帖子:
从Nandflash启动的Bootload已经可以运行了,现在我想在做一个Norflash上的Bootload。从s3c2440的datasheet里面看,boot internal sram(4kb)的地址是0x40000000,所以我在用ADS调试Bootload的时候,ro地址只能设置为这个才能运行。我的疑问是,为什么在调试的时候把ro的地址设置为除0x40000000以外的地址就不能运行了呢?我的理解是调试的时候ro地址只要是内存中的可用地址就Ok了,难道不是这么一回事吗?
还有就是从Norflash…
1. 用NOR进行boot,是从0x0开始的。只要设好OM0/1。
2. ADS调试时,内存(SDRAM)还没有初始化,所以必须在内部sram开始。而用NAND boot时,sram是被映射到0x0的。
引用: 引用 4 楼 CBEMA 的回复:
结合楼上2人:
你的Bootload从Norflash跑的话,是从0x00000000开始的,因此首先硬件启动必须是支持Norflash的(OM0 = 1, OM1 = 0, 或者 OM0 = 0, OM1 = 1)。
程序运行到mmu初始化以后,影射关系可能发生改变,所以mmu影射必须按Norflash启动方式重新初始化。
可以讲讲“mmu影射必须按Norflash启动方式”是怎么回事吗,关键是Bootload代码中是怎么体现的呢?与Nandflash相比,应该修改代码中的什么位置呢?
引用: 引用 5 楼 shuiyan 的回复:
1. 用NOR进行boot,是从0x0开始的。只要设好OM0/1。
2. ADS调试时,内存(SDRAM)还没有初始化,所以必须在内部sram开始。而用NAND boot时,sram是被映射到0x0的。
那设置ro为0x40000000后,然后是一个什么引导过程呢,是不是重新remap地址0x40000000到0x00000000了吗?还有就是,片内的srom只有4k,我调试的代码有几十k的,这段代码是如何运行的呢。
引用: 引用 3 楼 libaizhang 的回复:
第二种情况,当OM0 = 1, OM1 = 0, 或者 OM0 = 0, OM1 = 1的时候,
这个时候SRAM实际上跟启动没有关系了。因为SRAM的地址变到了0x40000000,
CPU启动还是从0地址开始执行,
那为什么我调试的时候只能把ro设置为0x40000000才能启动成功呢?
引用: 引用 7 楼 yhm24 的回复:
引用 5 楼 shuiyan 的回复:
1. 用NOR进行boot,是从0x0开始的。只要设好OM0/1。
2. ADS调试时,内存(SDRAM)还没有初始化,所以必须在内部sram开始。而用NAND boot时,sram是被映射到0x0的。
那设置ro为0x40000000后,然后是一个什么引导过程呢,是不是重新remap地址0x40000000到0x00000000了吗?还有就是,片内的srom只有4k,我调试的代码有几十k的,这段代码是如何运行的呢。
设定了NAND BOOT,启动时的0x0其实就是0x400...,这是cpu内部直接架构好的,没有Re映射。
片内ram是256K,4K只是StepStone,用来加载nand的boot代码的。