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

📄 nand.s

📁 wince5.0 bsp 下K9F2G08Flash的驱动源代码
💻 S
字号:
;
; Copyright (c) Microsoft Corporation.  All rights reserved.
;
;
; Use of this source code is subject to the terms of the Microsoft end-user
; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
; If you did not accept the terms of the EULA, you are not authorized to use
; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
; install media.
;
    ; 
    ; NAND(SmartCard) Related Routines
    ;      

    INCLUDE kxarm.h
        
    

    MACRO 
    LDR4STR1 $src, $tmp1, $tmp2    
	[ {FALSE}
	ldrb	$tmp1,[$src]
	ldrb	$tmp2,[$src]
	orr	$tmp1,$tmp1,$tmp2,LSL #8
	ldrb	$tmp2,[$src]
	orr	$tmp1,$tmp1,$tmp2,LSL #16
	ldrb	$tmp2,[$src]
	orr	$tmp1,$tmp1,$tmp2,LSL #24
	]
	[ {TRUE}
	ldr		$tmp1,[$src]
	]
    MEND

    MACRO 
    LDR1STR4 $dest, $tmp1, $tmp2
	[ {FALSE}
    strb    $tmp1, [$dest]
    and     $tmp2, r12, $tmp1, LSR #8
    strb    $tmp2, [$dest]
    and     $tmp2, r12, $tmp1, LSR #16
    strb    $tmp2, [$dest]
    and     $tmp2, r12, $tmp1, LSR #24
    strb    $tmp2,  [$dest]
	]
	[ {TRUE}
	str		$tmp1, [$dest]
	]
    MEND
    
    
    TEXTAREA
    
	    ; Read one sector.  Buffer (r0) must be aligned.
    ;
	
    LEAF_ENTRY RdPage2048
        stmfd    sp!,{r2 - r11}

        mov    r2, #0x800
1    
        LDR4STR1 r1,  r4, r3
        LDR4STR1 r1,  r5, r3
        LDR4STR1 r1,  r6, r3
        LDR4STR1 r1,  r7, r3
        LDR4STR1 r1,  r8, r3
        LDR4STR1 r1,  r9, r3
        LDR4STR1 r1, r10, r3
        LDR4STR1 r1, r11, r3

        stmia    r0!, {r4 - r11}
        subs    r2, r2, #32
        bne    %B1

        ldmfd    sp!, {r2 - r11}

        mov  pc, lr          ; return
        
        ENDP



    ; Read one sector.  Handles case where buffer (r0) is unaligned.
    ;
    LEAF_ENTRY RdPage2048Unalign
        stmfd    sp!,{r2 - r12}

        mov    r2, #2016

        ; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
        and    r12, r0, #3
        rsb    r12, r12, #4
        mov    r3, r12
        
rd_unalign1
        ; Read unaligned bytes
        ldrb    r4, [r1]
        strb    r4, [r0]
        add    r0, r0, #1
        subs    r3, r3, #1
        bne    rd_unalign1
        
rd_main    
        ; Read 2016 bytes (32 x 63)
        LDR4STR1 r1,  r4, r3
        LDR4STR1 r1,  r5, r3
        LDR4STR1 r1,  r6, r3
        LDR4STR1 r1,  r7, r3
        LDR4STR1 r1,  r8, r3
        LDR4STR1 r1,  r9, r3
        LDR4STR1 r1, r10, r3
        LDR4STR1 r1, r11, r3

        stmia    r0!, {r4 - r11}
        subs    r2, r2, #32
        bne    rd_main

        ; Read 28 bytes
        LDR4STR1 r1,  r4, r3
        LDR4STR1 r1,  r5, r3
        LDR4STR1 r1,  r6, r3
        LDR4STR1 r1,  r7, r3
        LDR4STR1 r1,  r8, r3
        LDR4STR1 r1,  r9, r3
        LDR4STR1 r1, r10, r3
        stmia    r0!, {r4 - r10}

        ; Read trailing unaligned bytes
        rsbs    r12, r12, #4
        beq    rd_exit
        
rd_unalign2
        ldrb    r4, [r1]
        strb    r4, [r0]
        add    r0, r0, #1
        subs    r12, r12, #1
        bne    rd_unalign2       
rd_exit
        ldmfd    sp!, {r2 - r12}
        mov  pc, lr          ; return
        
        ENDP
        

    ; Write one sector.  Buffer (r0) must be aligned.
    ;
    LEAF_ENTRY    WrPage2048
        stmfd    sp!,{r2 - r11}

        mov    r2, #0x800
1
        ldmia   r0!, {r4 - r11}

        LDR1STR4 r1,  r4,r3
        LDR1STR4 r1,  r5,r3
        LDR1STR4 r1,  r6,r3
        LDR1STR4 r1,  r7,r3
        LDR1STR4 r1,  r8,r3
        LDR1STR4 r1,  r9,r3
        LDR1STR4 r1, r10,r3
        LDR1STR4 r1, r11,r3

        subs    r2, r2, #32
        bne    %B1

        ldmfd    sp!, {r2 - r11}

        mov  pc, lr          ; return
        
        ENDP

    ; Writes one sector.  Handles case where buffer (r0) is unaligned.
    ;
    LEAF_ENTRY    WrPage2048Unalign
        stmfd    sp!,{r2 - r12}

        mov    r2, #2016

        ; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
        and    r12, r0, #3
        rsb    r12, r12, #4
        mov    r3, r12
        
wr_unalign1
        ; Write unaligned bytes
        ldrb    r4, [r0]
        strb    r4, [r1]
        add    r0, r0, #1
        subs    r3, r3, #1
        bne    wr_unalign1

wr_main    
        ; Write 2016 bytes (32 x 63)
        ldmia   r0!, {r4 - r11}

        LDR1STR4 r1,  r4,r3
        LDR1STR4 r1,  r5,r3
        LDR1STR4 r1,  r6,r3
        LDR1STR4 r1,  r7,r3
        LDR1STR4 r1,  r8,r3
        LDR1STR4 r1,  r9,r3
        LDR1STR4 r1, r10,r3
        LDR1STR4 r1, r11,r3

        subs    r2, r2, #32
        bne    wr_main

        ; Write 28 bytes
        ldmia   r0!, {r4 - r10}
        LDR1STR4 r1,  r4,r3
        LDR1STR4 r1,  r5,r3
        LDR1STR4 r1,  r6,r3
        LDR1STR4 r1,  r7,r3
        LDR1STR4 r1,  r8,r3
        LDR1STR4 r1,  r9,r3
        LDR1STR4 r1, r10,r3

        ; Write trailing unaligned bytes
        rsbs    r12, r12, #4
        beq    wr_exit
        
wr_unalign2
        ldrb    r4, [r0]
        strb    r4, [r1]
        add    r0, r0, #1
        subs    r12, r12, #1
        bne    wr_unalign2       

wr_exit
        ldmfd    sp!, {r2 - r12}

        mov  pc, lr          ; return
        
        ENDP


    ; Read one sector.  Buffer (r0) must be aligned.
    ;
    LEAF_ENTRY RdPage512
        stmfd    sp!,{r2 - r11}

        mov    r2, #0x200
1    
        LDR4STR1 r1,  r4, r3
        LDR4STR1 r1,  r5, r3
        LDR4STR1 r1,  r6, r3
        LDR4STR1 r1,  r7, r3
        LDR4STR1 r1,  r8, r3
        LDR4STR1 r1,  r9, r3
        LDR4STR1 r1, r10, r3
        LDR4STR1 r1, r11, r3

        stmia    r0!, {r4 - r11}
        subs    r2, r2, #32
        bne    %B1

	ldmfd	sp!,{r2-r11}
	mov	pc,lr
    
    ENDP    ; |ReadPage512|
; ---------------------------------------------------------------------
;   void RdPage512Unlign(BYTE *pBuf, PUSHORT pNFData)
;
;   pBuf (r0):       a buffer big enough to hold 512 bytes
;   pNFData (r1):    the DATA register on the NAND controller
;
; ---------------------------------------------------------------------        
       ; Read one sector.  Handles case where buffer (r0) is unaligned.
    ;
    LEAF_ENTRY RdPage512Unalign
        stmfd    sp!,{r2 - r12}

        mov    r2, #480

        ; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
        and    r12, r0, #3
        rsb    r12, r12, #4
        mov    r3, r12
        
rd_unalign10
        ; Read unaligned bytes
        ldrb    r4, [r1]
        strb    r4, [r0]
        add    r0, r0, #1
        subs    r3, r3, #1
        bne    rd_unalign10
        
rd_main0    
        ; Read 480 bytes (32 x 15)
        LDR4STR1 r1,  r4, r3
        LDR4STR1 r1,  r5, r3
        LDR4STR1 r1,  r6, r3
        LDR4STR1 r1,  r7, r3
        LDR4STR1 r1,  r8, r3
        LDR4STR1 r1,  r9, r3
        LDR4STR1 r1, r10, r3
        LDR4STR1 r1, r11, r3

        stmia    r0!, {r4 - r11}
        subs    r2, r2, #32
        bne    rd_main0

        ; Read 28 bytes
        LDR4STR1 r1,  r4, r3
        LDR4STR1 r1,  r5, r3
        LDR4STR1 r1,  r6, r3
        LDR4STR1 r1,  r7, r3
        LDR4STR1 r1,  r8, r3
        LDR4STR1 r1,  r9, r3
        LDR4STR1 r1, r10, r3
        stmia    r0!, {r4 - r10}

        ; Read trailing unaligned bytes
        rsbs    r12, r12, #4
        beq    rd_exit0
        
rd_unalign20
        ldrb    r4, [r1]
        strb    r4, [r0]
        add    r0, r0, #1
        subs    r12, r12, #1
        bne    rd_unalign20       
rd_exit0
        ldmfd    sp!, {r2 - r12}
	mov	pc,lr
    
    ENDP    ; |ReadPage512|
     
; ---------------------------------------------------------------------
;   void WritePage512(BYTE *pBuf, PUSHORT pNFData)
;
;   pBuf (r0):       the data buffer
;   pNFData (r1):    the DATA register on the NAND controller
;
; ---------------------------------------------------------------------        
    ;
    LEAF_ENTRY    WrPage512
    stmfd   sp!, {r2-r12}

;;; -- We use r12 as the mask     
    mov r12, #0xFF                        
    mov r2, #0x200
10
    ldmia   r0!, {r4-r11}
    LDR1STR4 r1, r4, r3    
    LDR1STR4 r1, r5, r3    
    LDR1STR4 r1, r6, r3    
    LDR1STR4 r1, r7, r3    
    LDR1STR4 r1, r8, r3    
    LDR1STR4 r1, r9, r3    
    LDR1STR4 r1, r10, r3    
    LDR1STR4 r1, r11, r3
    subs    r2, r2, #32
    bne %B10
    
    ldmfd   sp!, {r2-r12}
    mov     pc, lr
    
    ENDP    ; |WritePage512|    
        ; Writes one sector.  Handles case where buffer (r0) is unaligned.
    ;
    LEAF_ENTRY    WrPage512Unalign
        stmfd    sp!,{r2 - r12}

        mov    r2, #480

        ; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
        and    r12, r0, #3
        rsb    r12, r12, #4
        mov    r3, r12
        
wr_unalign10
        ; Write unaligned bytes
        ldrb    r4, [r0]
        strb    r4, [r1]
        add    r0, r0, #1
        subs    r3, r3, #1
        bne    wr_unalign10

wr_main0   
        ; Write 480 bytes (32 x 15)
        ldmia   r0!, {r4 - r11}

        LDR1STR4 r1,  r4,r3
        LDR1STR4 r1,  r5,r3
        LDR1STR4 r1,  r6,r3
        LDR1STR4 r1,  r7,r3
        LDR1STR4 r1,  r8,r3
        LDR1STR4 r1,  r9,r3
        LDR1STR4 r1, r10,r3
        LDR1STR4 r1, r11,r3

        subs    r2, r2, #32
        bne    wr_main0

        ; Write 28 bytes
        ldmia   r0!, {r4 - r10}
        LDR1STR4 r1,  r4,r3
        LDR1STR4 r1,  r5,r3
        LDR1STR4 r1,  r6,r3
        LDR1STR4 r1,  r7,r3
        LDR1STR4 r1,  r8,r3
        LDR1STR4 r1,  r9,r3
        LDR1STR4 r1, r10,r3

        ; Write trailing unaligned bytes
        rsbs    r12, r12, #4
        beq    wr_exit0
        
wr_unalign20
        ldrb    r4, [r0]
        strb    r4, [r1]
        add    r0, r0, #1
        subs    r12, r12, #1
        bne    wr_unalign20       

wr_exit0
        ldmfd    sp!, {r2 - r12}

        mov  pc, lr          ; return
        
        ENDP

    END

⌨️ 快捷键说明

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