0x00000000 中断向量表
start_code
ram启动 bl cpu_init_crit
不在SDRAM,就在FLASH,那么直接跳到stack_setup
we load ourself to 33F8'0000
# download area is 3300'0000
TEXT_BASE = 0x33F80000
/***************** CHECK_CODE_POSITION ******************************************/
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
/***************** CHECK_CODE_POSITION ******************************************/
不是NANDFLASH,就意味着是NORFLASH,那么就把所有代码拷贝到SDRAM,即跳到relocate
如果是NANDFLASH的话,那么就是NANDFLASH的初始化,然后也把所有代码拷贝到SDRAM
/***************** 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 ******************************************/
32 `31 30 29 28 27 26 25 24 `23 22 21 20 19 18 17 16 `15 14 13 12 11 10 9 8 `7 6 5 4 3 2 1 0
28 `27 26 25 24 23 22 21 20 `19 18 17 16 15 14 13 12 ` - - - - 11 10 9 8 `7 6 5 4 3 2 1 0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@@@@@@@@@@@@@@@@@ ############################
28~18 哪一块 17~12 哪一页 11~0 页内
1device=2048块=131072页
1block =64页
1页 =2K+64B=2K(main)+64B(spare)
每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等
1000页=64×15+40页=960+40页
1989页=64×31+ 5页=1984+5页
以page(页)为单位进行读写,
NF_ADDR(0x00); //列地址A0~A7
NF_ADDR(0x00); //列地址A8~A11
NF_ADDR((page_number) & 0xff); //行地址A12~A19
NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27
NF_ADDR((page_number >> 16) & 0xff); //行地址A28
以block(块)为单位进行擦除
//写入3个地址周期,从A18开始写起
NF_ADDR((block_number << 6) & 0xff); //行地址A18~A19
NF_ADDR((block_number >> 2) & 0xff); //行地址A20~A27
NF_ADDR((block_number >> 10) & 0xff); //行地址A28
Nand
没有地址线,只有8根数据线和控制信号线
在控制信号的作用下,地址线借用数据线
控制信号线直接接到CPU相应引脚上,控制信号线的状态由cpu的NAND寄存器设置
操作方式:Nand内自己编址,
以字节为单位:256M=268435456b
以页为单位256M=131072页
以块为单位256M=2048块
硬件上对Nand访问,
一,发命令,CLE,DATA BUS
二,给地址,ALE,DATABUS
三,传输数据,R/W,DATABUS
2440对NAND的访问:即对这四个寄存器的操作
1, NFCMND
2, NFADDR
3, NFDADA
4, NFSTAT
读状态命令可以实现读取设备内的状态寄存器,通过该命令可以获知写操作或擦除操作是否完成
(判断第6位),以及是否成功完成(判断第0位)
由2440datasheet图知:
TACLS:表示CLT/ALE的建立时间,CLE/ALE有效到nWE有效的时间
TWRPH0:表示WE为低电平的时间
TWRPH1:表示CLE/ALE的维持时间,nWE有效到CLE/ALE无效的时间
再看K9F2G08B的datasheet可知:
TACLS就相当于tCLS参数-tWP,=0ns
TWRPH0就相当于tWP,=21ns
而TWRPH1就相当于tCLH,=5ns
取最小值:tCLS=21ns tCLH=5ns tWP=21ns 假设HCLK=100MHZ=10ns,则
TACLS=HCLK*TACLS >0ns ->TACLS=1
TWRPH0=HCLK*(TWRPH0+1) >21ns ->TWRPH0=3
TWRPH1=HCLK*(TWRPH1+1) >5ns ->TWRPH1=0
阅读(1878) | 评论(0) | 转发(0) |