您的位置:首页 > 其它

如何自动识别是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程序是否一致,如果不一致会进入死循环。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: