2410nandflash启动机制通过设置开发板bootsel跳线选择开发板的启动模式,短接跳线(盖上跳帽),为nandflash启动方式,否则是norflash启动方式。但是代码可以在norflash上直接运行,不能在nandflash上运行,为了支持nandflash的bootloader,2410x配置了一片内部的srambuffer叫做steppingstone。当启动的时候,nandflash的前4K的数据将会载入到steppingstone中并且bootcode将会在steppingstone中执行。一般来讲,bootcode将会拷贝nandflash中的内容到SDRAM中,使用硬件ECC,检验NANDflash数据的正确性。在拷贝完成之后,主函数将在SDRAM中执行。-----------------------------------------------------------------------------------------------------被拷贝到steppingstone中的代码会拷贝nandflash中的代码到sdram中,这被拷贝的4K代码不是会被执行两遍吗?nandflash中的前4k代码会被复制到steppingstone中,到底是哪些代码?是uboot的前4k?steppingstone中代码地址被映射到nCGS0,而后的代码在sdram中执行,地址为0x30000000,地址如何映射的?-----------------------------------------------------------------------------------------------------s3c2410手册内容:NANDflash模式:支持读、擦出、编程NANDflash存储器自动boot模式:芯片复位后bootcode被传输到steppingstone中,传输后,bootcode将会在steppingstone中执行。硬件ECC检测模块(硬件检测,软件纠错)steppingstone4K的内部SRAMbuffer在NANDflashbooting后能被用做其它用途。自动boot模式序列1.完成复位2.当自动boot模式使能,nandflash的前4K的数据拷贝到steppingstone4K的buffer中去3.steppingstone被映射到nGCS04.CPU开始在steppingstone的4K内部buffer中执行bootcode注意:在自动boot模式下,ECC不会被检测。所以,先前的4K的NANDflash数据不应该有位错误nandflash模式配置1.通过设置nfconf寄存器设置nandflash配置2.向nfcmd寄存器写入nandflash命令3.向nfaddr寄存器写入nandflash地址4.通过查看nandflash状态寄存器nfstat,读写数据。R/nB信号应该在读操作前或编程操作后被检测autoboot和nandflash配置1.OM[1:0]=00:使能nandflash控制器自动boot模式2.nandflash存储器每页大小为512字节3.ncon:nandflash存储器地址步数选择0:3步寻址1:4步寻址2410在读写操作时生成512字节ECC同位码。每512字节的数据ECC同位码包含3个字节24位ECC同位码=18位行同位+6位列同位ECC控制模块执行以下步骤:1、当微控制器写数据到NAND时,ECC控制模块生成ECC码2、当微控制器从nand读数据时,ECC控制模块生成ECC码,并且拿他与先前写时生成的ECC码相比较注意:存在问题:nandflash控制器不能被DMA访问。解决方案:使用LDM/STM指令代替DMA。这几天在弄arm9的移植,芯片是ATMEL的,因为以前搞的arm7是三星的,就顺便参考了三星2410的文档,发现这个芯片在选择NANDflash启动时,CPU会拷贝flash的前2个page(4k)的代码,一般网友的理解是CPU自动拷贝这4K,然后再执行。我觉得这是有问题的,如果是这样的话,那么,由于NANDflash有不同的种类,也即每个页有不同的大小,可能为512BYTE,或者2048BYTE,它连接到三星CPU上时进行读写操作的驱动必定不一样,那CPU又怎么会自动拷贝到flash控制器的内存呢我的理解是:首先我们用的板一般是开发板,各种硬件都设计好了的,存储空间也都固定了,此时它里面的内置ROM会有一段BOOTLOADER的简单启动程序,那么这段程序的一个作用就是拷贝NANDflash的前4K到内存(也既是flash控制器的内存),拷贝完成,此时会产生一个信号(中断)通知CPU,那么CPU会跳转到此地址进行执行,接着就拷贝flash里余下的代码到SDRAM区,然户再跳转到main()函数(已经被拷贝到SDRAM里)里执行。。。。。所以,如果你的板子更换了不同的FLASH,那么BOOTLOADER可能失去作用,而无法再进行NANDflash启动操作!此时要么进行NORflash启动方式,要么只能用debug方式进行运行了,呵呵不知以上俺的理解对否?还望各路好手共同探讨更多0有很多同学在移植u-boot时,都会对s3c2440从Nandflash启动的过程非常迷惑。这里发这个帖子给大家介绍一下它的启动流程。大部分ARM9的CPU内部都集成有一个SRAM,SRAM是英文StaticRAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用的,这点大家务必要搞清楚。这点在我做过移植的处理器:s3c2410(arm920t),s3c2440(arm920t),at91rm9200(arm920t),at91sam9260(arm926t)上都是这样的。在s3c2440这颗CPU上这个SRAM大小为4KB,datasheet里把它叫做SteppingStone,江湖人称“起步石”。Nandflash和Norflash是不同的:Norflash像内存一样是直接挂在系统总线上的,这样有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问Norflash上存储的内容,同时他还支持XIP(即片上执行,不用将代码搬到内存中,直接在Norflash上就能运行)。而Nandflash它并不是直接挂载系统总线上,而是通过Nandflash控制器(这个一般集成在CPU内部)来完成读写操作的。如果我们把Norflash的那种寻址方式叫直接寻址的话(不是汇编里的那个直接寻址,这里指CPU能够直接通过地址线访问存储器的存储单元),那么这里的Nandflash就是间接寻址(这里需要Nandflash控制器来寻址)。所以我们在使用Nandflash之前,一定要初始化Nandflash控制器。理解上面的这点后,就不难理解,为什么系统能够从Norflash直接启动,而不能直接从Nandflash启动。这是因为,ARM在CPU复位时,CPU默认会到0x00000000地址处去取指令,而如果我们是从Norflash启动的话(一般Norflash会挂到Bank0,nGCS0上),s3c2440CPU就会把Norflash的空间挂接到0x00000000这段内存空间上。这时CPU就能够直接从Norflash上取指令运行,启动了。而如果是Nandflash,因为Nandflash他不能直接挂到系统总线上,并且他的读写,擦除操作必须依赖Nandflash控制器,这也就意味着Nandflash的存储空间永远不能映射到0x00000000这个地址上去。另外,Nandflash的读写操作也不是这样直接寻址的,有兴趣的同学可以自己看看Nandlfash的datasheet,写一个RAW的Nandflash擦除,读写操作程序就明白了。我就写过这么一个程序,对理解Nandflash究竟是怎么操作的非常有帮助。而如果这些CPU要从Nandflash上启动,那该怎么办呢?这就要用到我之前提到的CPU的内部SRAM了。在S3C2440的datasheet里有提到,如果我们配置从Nandflash启动的话,那么CPU会自动将内部SRAM的地址映射到0x00000000这个地址空间上了,而如果不是从Nandflash启动,那么挂载Bank0(nGCS0)上的设备就会被映射到0x00000000地址空间上,如我们之前提到的Norflash。如下图所示:简而言之就是:如果从Nandflash启动,那么CPU内部SRAM被映射到0x00000000地址空间上,这时Norflash就不可用了。而如果是从Norflash启动的话,那么Norflash被映射到0x00000000地址空间上。我们之前提到ARMCPU在复位时,会默认到0x00000000地址上取指令。这样也就是如果从Nandflash启动的话,那么CPU默认会从内部SRAM中取第一条指令;而如果从Norflash启动的话,那么CPU默认从Norflash中取第一条指令。那如果从SRAM启动的话,那么SRAM中的指令(也就是代码)从哪里来的呢?在s3c2440处理器(arm920t和arm926t的核应该都是这样的,另外我看S3C6410也是如此)上电时,CPU会自动将Nandflash的前4K代码(或叫指令)拷贝到内部SRAM中,这是由CPU自动完成的,不需要我们干预。这也就意味着,SRAM中的内容就是我们Nandflash上前4K的代码了。这样,如果是在我们的bootloader如u-boot中就要确保,我们编译出來的前4K代码完成以下功能:1,初始化CPU,外部SDRAM,Nandflash控制器等基本功能;2,将Nandflash上剩余的u-boot代码拷贝到外部的SDRAM中3,调到外部的SDRAM中来运行u-boot代码。这样,U-boot就启动了。基于Nandflash的Bootloader的设计与实现时间:2007-12-12来源:21IC中国电子网作者:桂林电子科技大学郝卫东刘溯奇关键字:BootloaderNandflash摘要:Bootloader是系统上电或复位后首先运行的一段代码,是连接操作系统和硬件的桥梁,负责初始化硬件和引导操作系统等。目前已有很多通用的Bootloader,但是如何根据特定的嵌入式平台,移植自己的引导程序是一个重点和难点。文章详细说明了从Nandflash引导操作系统要完成的主要任务和实现方法,并给出了在S3C2410上实现Nandflash启动的试验结果。关键词:Bootloader;移植;Nandflash;S3C24100引言Bootloader通常称为系统的引导加载程序,是系统加电或复位后执行的第一段代码[1]。一般它只在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的系统组成部分。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为调用操作系统内核准备好正确的环境,并同时提供基本输入、输出系统监控功能和程序调试功能。Bootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。除了依赖于处理器的体系结构以外,Bootloader实际上也依赖于具体的嵌入式板级设备的配置,也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种处理器而构建的,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,通常也都需要修改与目标硬件相关的代码。因此有必要分析Bootloader,并理解和找出其中的原理和规律,就其特定的嵌入式系统,移植或开发属于自己的Bootloader。1系统硬件平台简介本系统采用的是SamSung公司的S3C2410处理器[