如何自动识别是NOR flash 启动还是NAND flash启动
2017-08-07 17:11
309 查看
Norflash启动时:
4K的内部SRAM都被映射到了0x40000000-0x40001000
Nandflash启动时:
4K的内部SRAM都被映射到了0x40000000,同时还被映射到了0x00000000-0x00001000
所有,我们可以通过判断0x0000003c处的数据是否和0x4000003c处的数据相等来判断是哪种启动方式。选择这个地址是因为这个地址处的值固定是0xdeadbeef
3c = 60 = 4*15
.globl _start _start: b start_code ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq .balignl 16,0xdeadbeef
在start.S里的代码如下
/***************** CHECK_BOOT_FLASH ******************************************/ ldr r1, =( (4<<28)|(3<<4)|(3<<2) ) /* address of Internal SRAM 0x4000003C*/ mov r0, #0 /* r0 = 0 */ str r0, [r1] mov r1, #0x3c /* address of men 0x0000003C*/ ldr r0, [r1] cmp r0, #0 bne relocate /* recovery */ ldr r0, =(0xdeadbeef) ldr r1, =( (4<<28)|(3<<4)|(3<<2) ) str r0, [r1] /***************** CHECK_BOOT_FLASH ******************************************/
Uboot里的流程:启动时先将0x4000003C处的数据清零,再读出0x0000003C处地址的数据,如果为0就意味着,这个地址是同时映射在0x4000003C处和0x0000003C处即为nandflash启动,不相等则为norflash启动。
但是最后有一点很重要:如果是Nand flash启动,必须要复
4000
原清零的数据。原因是:在nand boot过后,会核对内部SRAM中的4K程序,和从Nand中拷贝到SDRAM的前4K程序是否一致,如果不一致会进入死循环。
相关文章推荐
- 如何自动识别判断url中的中文参数是GB2312还是Utf-8编码?
- WCF中WcfSvcHost.exe如何禁止自动启动
- android如何实现开机自动启动Service或app
- Android中如何做到Service被关闭后又自动启动
- 如何在tomcat启动时自动加载一个类
- 如何让open***在windows启动时自动加载
- Linux/Unix 中如何配置 Oracle Database 随服务器自动启动
- Oracle12c多租户如何启动关闭CDB或PDB (PDB自动启动)
- Linux如何在系统启动时自动加载内核模块
- android如何实现开机自动启动Service或app
- Ubuntu12.10如何在开机自动启动iBus 输入法
- 如何识别是三层交换机还是二层交换机
- C#开发的软件如何不让360禁止开机自动启动
- 在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)
- 如何让linux启动后自动进入图形界面或不让它进入图形界面?
- 如何识别由远程分布式事务启动的会话(Doc ID 332326.1)
- 如何自动根据文件扩展名来启动相应的应用程序加载文件?
- 2440 nand flash和nor flash上启动
- php中文乱码怎么办如何让浏览器自动识别utf-8
- 黄聪:如何配置Emeditor实现代码智能识别自动完成功能