您的位置 首页 编程

自动识别发动形式Nand Or Nor

UBOOT-2010-03在S3C2440上的移植二>————硬件初始化http:wwwlinuxidccomLinux2011-1146993p2htmNotes:2)下面代码

UBOOT-2010-03在S3C2440上的移植<二>————硬件初始化

http://www.linuxidc.com/Linux/2011-11/46993p2.htm

Notes:2)下面代码段赤色部分为删去部分

Notes:3)下面代码段绿色部分为增加部分

4.1)Notes:以下资源来自大神Tekkaman Ninja博客点击检查原文

移植之前仍是请咱们先看S3C2440数据手册<第五章存储器控制器>中的(也便是那个映射图),从理论上来讲,关于0x40000000今后的内存,只需在Nor boot的时分才存在;而在nand

boot 的时分他被映射到了0x00000000,在0x40000000今后不存在内存。假如咱们在发动的时分,将一些特定的数据写入0x40000000~0x40001000之间,那么依照数据手册上的说法,假如回读的成果和写入的共同阐明是nor boot,不然便是nand boot!<写这个文章的时分我又看了一次。。。。。。。。。>

从上图咱们能够看出,无论是Nor boot仍是nandboot ,这4K的内部SRAM都被映射到了0x40000000,而在nandboot的时分,这块内存一起还被映射到了0x00000000。那么一开端提出的办法就不可行了,并且在nandboot 的时分,写入0x40000000~0x40001000还会损坏本身的程序。

可是通过上面的图,我想到了处理的办法:
在发动的时分,用程序将0x40000000~0x40001000中的某些方位清零,假如回读0x00000000~0x00001000中的相应方位后为零,阐明是Nand boot,假如是本来的数据(一定要选非零的方位)便是Nor boot。判别完后假如是nand boot,还要康复被改动的数据,再进入自复制阶段。
只需检测的方位合理,这办法是可行的。现在的关键是选什么方位的数据最好呢?通过检查源码,我挑选了在start.S文件最初,大局中断向量之后的:

.balignl 16,0xdeadbeef

选这个数据作为检测方位的理由如下:
(1)他对错零数,并且数据是确认的:0xdeadbeef;
(2)他的方位是固定的:0x0000003c(0x4000003c);
(3)他在检测程序之前,不会影响程序的向下运转;
(4)他不属于程序,他是一个程序中的魔数(Magic Number),用魔数来检测也比较合理。

所以我最终的检测过程是:
在发动的时分,将0x4000003c方位开端的四个字节清零,然后读取0x0000003c方位开端的四个字节。假如回读的成果为零,阐明是nand boot,不然便是Nor boot(为了稳妥还能够判别是否为0xdeadbeef,不是的话就阐明有不知道过错,死循环!)。可是最终有一点很重要:假如是Nand boot,必需要恢复清零的数据。原因是:在nand boot往后,会核对内部SRAM中的4K程序,和从Nand中复制到SDRAM的前4K程序是否共同,假如不共同会进入死循环。

.globl bBootFrmNORFlash
bBootFrmNORFlash:
.word 0
4.1.2)判别当时代码方位,假如在内存,直接跳到stack_setup


#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif

adr r0, _start
ldr r1, _TEXT_BASE
cmp r0, r1
beq stack_setup

4.1.3)假如代码当时方位不在内存中,就判别发动方法为Nand Flash或许Nor Flash

Notes:没有阐明就默许在以上代码的后边增加

ldr r1, =( (4<<28)|(3<<4)|(3<<2) )
mov r0, #0
str r0, [r1]

mov r1, #0x3c
ldr r0, [r1]
cmp r0, #0
bne relocate


ldr r0, =(0xdeadbeef)
ldr r1, =( (4<<28)|(3<<4)|(3<<2) )
str r0, [r1]

4.1.4)在Nand Flash中发动的话,那么Nand Flash搬移代码如下:

Notes:界说u-boot在Nand flash中寄存的长度为#define LENGTH_UBOOT 0x100000<1M>,能够便利修正u-boot由于裁剪和增加巨细的改动而占的长度。

#define LENGTH_UBOOT 0x100000
#define NAND_CTL_BASE 0x4E000000

#ifdef CONFIG_S3C2440

#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20

@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]

ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
str r2, [r1, #oNFCONT]
ldr r2, [r1, #oNFCONT]

ldr r2, =(0x6) @ RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]

mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]

mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1

nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x4
beq nand2


ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 @ Flash Memory Chip Disable
str r2, [r1, #oNFCONT]

@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0

@ copy U-Boot to RAM
ldr r0, =TEXT_BASE
mov r1, #0x0
mov r2, #LENGTH_UBOOT
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read

bad_nand_read:
loop2:
b loop2 @ infinite loop
ok_nand_read:
@ verify
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next

notmatch:
loop3:
b loop3 @ infinite loop
#endif

4.1.5)在Nor Flash中发动的话,那么Nor Flash搬移代码如下:

relocate:

ldr r1, =(0xdeadbeef)
cmp r0, r1
bne loop3

adr r0, _start
ldr r1, _TEXT_BASE
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2
add r2, r0, r2

copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop

SetBootFlag:
ldr r0, =bBootFrmNORFlash
mov r1, #1
str r1, [r0]

4.1.6)删去下面这段代码

//#ifndef CONFIG_SKIP_RELOCATE_UBOOT
//relocate:
// adr r0, _start
// ldr r1, _TEXT_BASE
// cmp r0, r1
// beq stack_setup

// ldr r2, _armboot_start
// ldr r3, _bss_start
// sub r2, r3, r2
// add r2, r0, r2

//copy_loop:
// ldmia r0!, {r3-r10}
// stmia r1!, {r3-r10}
// cmp r0, r2
// ble copy_loop
//#endif

4.2.1)在_start_armboot: .word start_armboot 后边增加:

#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x10000
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4

Notes1):假如你不是第一次移植UBOOT那么主张好好的了解一下上面这些代码<当然参加你仍是第一次的话那么好了直接COPY吧很管用的>

Notes2):上面用到了一个nand_read_ll函数,该函数用来读NANDFLASH的<下一篇便是完成这个UBOOT对NAND的支撑了先歇息一下吧>

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/262357.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部