请问下2440的启动问题,网上资料很多,暂时没找到想要的,麻烦过来帮帮忙,呵呵
网上有一堆2440init.s这样的启动代码分析。
我的疑惑是:
这个代码是单独编译,然后烧写到flash中的么?这样的话2440启动的时候就可以去拷贝它了(前4k),但我看好像非如此。
既然这段代码可以与别的程序一起放到一个工程进行编译,那么2440是怎么分清拷贝的4k代码就是init.s呢?
或者我没说清,有点晕。。。。
一直对2440上电以后怎么从nandflash中启动不是很清楚,闲来无事看了下s3c2440的用户手册,看到下面这样一段话:
S3C2440A boot code can be executed on an external NAND flash memory. In order to support NAND flash bootloader, the S3C2440A is equipped with an internal SRAM buffer called "Steppingstone". When booting, the first 4KBytes of the NAND flash memory will be loaded into Steppingstone and the boot code loaded into Steppingstone will be executed.
Generally, the boot code will copy NAND flash content to SDRAM. Using hardware ECC generating, the NAND flash data validity will be checked. Upon the completion of the copy, the main program will be executed on the SDRAM.
虽然大家都看得懂上面的eng,但是为了自己以后看得方便一些,在此稍微解释一下:
2440的启动代码可以从外部的nandflash上执行。为了能支持nboot,2440需要带有一个叫做steppingstone的内部sram缓冲区。在启动加载的时候,nandflash的前4k的内容(nboot部分)要被先load到steppingstone中去(此时 steppingstone被映射为物理地址的0x0,复位后执行的第一条指令就是从这里取的),并且接着就是在steppingstone中去执行该启动代码。这部分代码(nboot)的作用是会将nandflash中的bootloader step2部分拷贝到sdram中去,并跳到sdram中去执行以加载内核(nk)。
nboot从nandflash被load到 steppingstone中的过程为:在上点的时候,nandflash控制器通过几个引脚的状态(NCON-Adv flash;GPG13-Page size;GPG14-Address cycle;GPG15-Bus width)来得到nandflash的相关信息,之后nandflash控制器就会自动load nandflash中前4k的启动代码到steppingstone中去,并在其中执行了。
上面说的我还是不明白呀,2440怎么知道拷贝的前4k代码就是init。s呢?
按我理解应该有2个bootloader,第一个拷贝4k代码(自动),这4k代码(init.s)负责把剩下的第二个bootloader(比如uboot)拷贝到sdram。
init.s只是nboot的一个源代码文件;
你说的4K,指的是nboot,而不是这个文件。
2440上电时把前4K就是Flash里的0~1000内的数据拷贝到内部的SRAM中去,前4K的数据可以是任意东西,反正2440拷贝完后,自动从0地址开始运行!
所以说启动程序- NBOOT最大不能超过4K~, 超过4K就应该分成2个BOOT来加载0S了!
init.s只是BOOT的一部分代码!
编译完之后,nboot放到nand的前4k,boot的时候soc会将前4k的内容拷到iram从iram执行。
按照楼上所说应该还是有2个boot吧?
那现在有的开发板为何可以直接烧写400多k的vivi到flash直接上电运行呢?2440是如何区分其前面4k数据的?
这个4K代码拷贝已经集成在硬件上,所以上电就会自动执行这个动作了。
这样啊,那这4k代码怎么知道要拷贝多大的数据(比如uboot的大小)到sdram?
我大概知道楼主要问什么,这个init.s为什么会自动的放在前面,
我们知道GCC编译的话初步只会生成.o文件,各种.o文件是怎么组成.bin文件.因为我们编译一般会有一个ld文件
这个文件就是负责各.o文件的放置的,填充各个section的值,然后我们就必须确保前4K使我们想要的,这个前4K就可以实现一些基本的bootloader
的功能,如MMU使能、基本的硬件初始化,从flash拷贝程序到对应的SDRAM等,这个拷贝和你的前面的ld也是相关的。
引用: 引用 9 楼 lanmanck 的回复:
这样啊,那这4k代码怎么知道要拷贝多大的数据(比如uboot的大小)到sdram?
在前4K代码实现。自己写代码控制。
jinlking大侠已经回答的很明白了,googleman大虾还是认真看看吧。呵呵
我在研究8G08中,GPG14,gGPG13要上拉,但是不知道是那些角
我感觉是在编译的时候要设置好-entry 和ro-base的值,使这两个值正好对应init.s就对了。