Chinaunix首页 | 论坛 | 博客
  • 博客访问: 482153
  • 博文数量: 98
  • 博客积分: 3265
  • 博客等级: 中校
  • 技术积分: 1227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 00:29
文章分类

全部博文(98)

文章存档

2012年(6)

2011年(83)

2010年(9)

分类: 嵌入式

2011-02-23 22:42:28

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相应引脚上,控制信号线的状态由cpuNAND寄存器设置

 

操作方式:Nand内自己编址,

以字节为单位:256M=268435456b

以页为单位256M=131072

以块为单位256M=2048

 

硬件上对Nand访问,

一,发命令,CLEDATA BUS

二,给地址,ALEDATABUS

三,传输数据,R/WDATABUS


2440NAND的访问:即对这四个寄存器的操作

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) |
给主人留下些什么吧!~~