⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 copy_nand_to_dram.txt

📁 用汇编写的2440复制nand到DRAM的代码
💻 TXT
字号:

;=================
; NAND flash for 2440
;=================
NFCONF      EQU  0x4e000000     ;NAND Flash configuration
NFCONT      EQU  0x4e000004     ;NADD Flash command
NFCMD       EQU  0x4e000008     ;NADD Flash command
NFADDR      EQU  0x4e00000c     ;NAND Flash address
NFDATA      EQU  0x4e000010     ;NAND Flash data
NFSTAT      EQU  0x4e000020     ;NAND Flash operation status
NFECC       EQU  0x4e00002c     ;NAND Flash ECC

;********************************************************************************************************/ 
; 复制nand到DRAM
;********************************************************************************************************/ 
  
nand_boot_beg                    ;复制nand到DRAM
	mov	r5, #NFCONF	 ;用2440配置nand
	ldr	r0,	=( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
	str	r0,	[r5]
;****************************************	
    ldr    r1, =NFCONT
    ldr    r2, =( (1<<4)|(0<<1)|(1<<0) ) ; Active low CE Control 
    str    r2, [r1]
  ;  ldr    r2, [r1]

	ldr    r1, =NFSTAT
    ldr    r2, =(0x6)        ; RnB Clear
    str    r2, [r1]
  ;  ldr    r2, [r1]
    
    ldr    r1, =NFCMD
    mov    r2, #0xff        ; RESET command
    strb    r2, [r1]

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

nand2
  ldr	 r2,=NFSTAT 
  ldr 	 r3,[r2]    ; wait ready
  tst    r3, #0x4
  beq  nand2
	    
  ldr	 r1,=NFCONT
  ldr	 r2,[r1]
  orr    r2, r2, #0x2        ; Flash Memory Chip Disable
  str    r2, [r1]

;**************************************** 
	bl	ReadNandID      ; 读Nand芯片ID,将结果放在r5中

	mov	r6, #0
	ldr	r0, =0xec73
	cmp	r5, r0	 	; 如果ID等于0xec73则跳到1处
	beq	%F1
	ldr	r0, =0xec75
	cmp	r5, r0
	beq	%F1		; 如果ID等于0xec75则跳到1处
	mov	r6, #1
1	


	bl	ReadNandStatus  ; 读取Nand芯片状态将结果放在r1中
	

	
	mov	r8, #0          ; nand的第1页(r8是页数变量)
	ldr	r9, =0x30000000 ; 要复制nand起始地址,r9指向在RAM中的起始地址。
  

2	
	ands	r0, r8, #0x1f	; r0 = r8 & #0x1f =0 & #0x1f=0 ;若结果为0,则标志位Z=1
	bne	%F3		; 如果是在nand的前一块因为Z置零
	mov	r0, r8
	bl	CheckBadBlk     ; 检查坏块,返回值非0表明当前块不是坏块。
	cmp	r0, #0		; 相等则是坏块	
	addne	r8, r8, #32		; 不相等则r8=r8+#32,如果当前块坏了,跳过读取操作。 1 block=32 pages
	bne	%F4		; 不相等跳到4处检查下一块
3	

	mov	r0, r8
	mov	r1, r9
	bl	ReadNandPage     ; 读 Nand 1页(512B)
	

	add	r9, r9, #512	 ; 缓冲区地址加512即1页
	add	r8, r8, #1       ; 页数加1
	
4	

	cmp	r8, #256	 ; 一共读取128页=256*512=64KB
	bcc	%B2

	mov	r5, #NFCONF	 ;DsNandFlash;关闭Nand芯片
	ldr	r0, [r5]
	and	r0, r0, #~0x8000
	str	r0, [r5]
	
    b ok_nand_read
	;mov	 pc,lr		 ;返回
	
	

ReadNandID			; 读Nand芯片ID将结果放在r5中
	mov		 r7,#NFCONF	
	ldr      r0,[r7,#4]	;NFChipEn();启动Nand芯片
	bic      r0,r0,#0x2
	str      r0,[r7,#4]	;启动Nand
	mov      r0,#0x90	;WrNFCmd(RdIDCMD) ;0x90为读ID指令
	strb     r0,[r7,#8]     ;NFCmd	
	mov      r4,#0		;WrNFAddr(0);
	strb     r4,[r7,#0xc]	;NFADDR 

	
1				;while(NFIsBusy());
	ldr      r0,[r7,#0x20]	;NFSTAT 等待写完毕
	tst      r0,#0x4
	beq      %B1
	

	ldrb     r0,[r7,#0x10]	; id  = RdNFDat()<<8 ; NFDATA,读出Nand芯片id前8位 
	mov      r0,r0,lsl #8	; r0 << #8再存进r0
	ldrb     r1,[r7,#0x10]	; id |= RdNFDat() ; NFDATA,读出Nand芯片id后8位 
	orr      r5,r1,r0	; r5 = r1|r0
	ldr      r0,[r7,#4]	;NFChipDs();关闭Nand芯片
	orr      r0,r0,#0x2
	str      r0,[r7,#4]	
	mov	 pc,lr		;返回
	
ReadNandStatus			;读取Nand芯片状态将结果放在r1中,此处没有用到返回值。
	mov	 r7,#NFCONF
	ldr      r0,[r7,#4]	;NFChipEn();启动Nand芯片
	bic      r0,r0,#0x2
	str      r0,[r7,#4]	;;;;;;;;;启动Nand芯片
	mov      r0,#0x70	;WrNFCmd(QUERYCMD);读取Nand芯片状态
	strb     r0,[r7,#8]	;写命令
	ldrb     r1,[r7,#0x10]	;r1 = RdNFDat();Busy : "0" Ready :  "1"
	ldr      r0,[r7,#4]	;NFChipDs();关闭Nand芯片
	orr      r0,r0,#0x2
	str      r0,[r7,#4]
	mov	 pc,lr		;返回

WaitNandBusy     		;等待Nand内部操作完毕
	mov      r0,#0x70	;WrNFCmd(QUERYCMD);
	mov      r1,#NFCONF
	strb     r0,[r1,#8]	;读取Nand芯片状态
1				;while(!(RdNFDat()&0x40));	
	ldrb     r0,[r1,#0x10]
	tst      r0,#0x40
	beq		 %B1
	mov      r0,#0		;WrNFCmd(READCMD0);
	strb     r0,[r1,#8]	;发送读指令0x00,是整页读取
	mov      pc,lr		;返回

CheckBadBlk			;检查坏块返回值非0表明当前块不是坏块。
	mov	 r7, lr
	mov	 r5, #NFCONF
	bic	 r0, r0, #0x1f	;addr &= ~0x1f;
	ldr      r1,[r5,#4]	;NFChipEn();启动Nand芯片
	bic      r1,r1,#0x2
	str      r1,[r5,#4]	

	mov      r1,#0x50	;WrNFCmd(READCMD2)
	strb     r1,[r5,#8]	;读校验码
	mov		 r1, #6
	strb     r1,[r5,#0xc]	;WrNFAddr(6)
	strb     r0,[r5,#0xc]	;WrNFAddr(addr)
	mov      r1,r0,lsr #8	;WrNFAddr(addr>>8)
	strb     r1,[r5,#0xc]	
	cmp      r6,#0		;if(NandAddr)		
	movne    r0,r0,lsr #16	;WrNFAddr(addr>>16)
	strneb   r0,[r5,#0xc]
	
	bl	 WaitNandBusy	;WaitNFBusy()

	ldrb	r0, [r5,#0x10]	;RdNFDat()读
	sub	r0, r0, #0xff
	
	mov      r1,#0		;WrNFCmd(READCMD0)
	strb     r1,[r5,#8]	
	
	ldr      r1,[r5,#4]	;NFChipDs(),关闭Nand芯片
	orr      r1,r1,#0x2
	str      r1,[r5,#4]
	mov	pc, r7		;返回
	
ReadNandPage                    ;读Nand页
	mov	 r7,lr
	mov      r4,r1		;读进缓冲区的首地址
	mov      r5,#NFCONF

	ldr      r1,[r5,#4]	;NFChipEn();启动Nand芯片
	bic      r1,r1,#0x2
	str      r1,[r5,#4]	

	mov      r1,#0		;WrNFCmd(READCMD0)
	strb     r1,[r5,#8]	
	strb     r1,[r5,#0xc]	;WrNFAddr(0)
	strb     r0,[r5,#0xc]	;WrNFAddr(addr)
	mov      r1,r0,lsr #8	;WrNFAddr(addr>>8)
	strb     r1,[r5,#0xc]	
	cmp      r6,#0		;if(NandAddr)		
	movne    r0,r0,lsr #16	;WrNFAddr(addr>>16)
	strneb   r0,[r5,#0xc]
	
	ldr      r0,[r5,#4]	;InitEcc()
	orr      r0,r0,#0x1000
	str      r0,[r5,#4]	
	
	bl       WaitNandBusy	;WaitNFBusy()
	
	mov      r0,#0		;for(i=0; i<512; i++)
1
	ldrb     r1,[r5,#0x10]	;buf[i] = RdNFDat()
	strb     r1,[r4,r0]	;;读进缓冲区地址加1
	add      r0,r0,#1	;每循环一次r0= r0 + #1
	bic      r0,r0,#0x10000 ;
	cmp      r0,#0x200	; 判断R0是否等于512
	bcc      %B1		;
	
	ldr      r0,[r5,#4]	;NFChipDs(),关闭Nand芯片
	orr      r0,r0,#0x2
	str      r0,[r5,#4]
		
		
	mov	 pc,r7		 ;返回

;********************************************************************************************************/ 
;********************************************************************************************************/ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -