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

📄 nand.s

📁 SMDK2450的BSP 有很多新的特性,记得升级PB啊.
💻 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
        
    TEXTAREA


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

        ldr    r1, =0xb1500010  ;NFDATA
        mov    r2, #0x200
1    
		ldr		r4, [r1]
		ldr		r5, [r1]
		ldr		r6, [r1]
		ldr		r7, [r1]
		ldr		r8, [r1]
		ldr		r9, [r1]
		ldr		r10,[r1]
		ldr		r11,[r1]

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

        ldmfd    sp!, {r1 - r11}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF

    LEAF_ENTRY RdPage2048
        stmfd    sp!,{r1 - r11}

        ldr    r1, =0xb1500010  ;NFDATA
        mov    r2, #0x800
1    
		ldr		r4, [r1]
		ldr		r5, [r1]
		ldr		r6, [r1]
		ldr		r7, [r1]
		ldr		r8, [r1]
		ldr		r9, [r1]
		ldr		r10,[r1]
		ldr		r11,[r1]

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

        ldmfd    sp!, {r1 - r11}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF

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

        ldr    r1, =0xb1500010  ;NFDATA
        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_unalign1
        ; Read unaligned bytes
        ldrb    r4, [r1]
        strb    r4, [r0]
        add    r0, r0, #1
        subs    r3, r3, #1
        bne    rd_unalign1
        
rd_main    
        ; Read 480 bytes (32 x 15)
		ldr		r4, [r1]
		ldr		r5, [r1]
		ldr		r6, [r1]
		ldr		r7, [r1]
		ldr		r8, [r1]
		ldr		r9, [r1]
		ldr		r10,[r1]
		ldr		r11,[r1]
		
        stmia    r0!, {r4 - r11}
        subs    r2, r2, #32
        bne    rd_main

        ; Read 28 bytes
		ldr		r4, [r1]
		ldr		r5, [r1]
		ldr		r6, [r1]
		ldr		r7, [r1]
		ldr		r8, [r1]
		ldr		r9, [r1]
		ldr		r10,[r1]
        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!, {r1 - r12}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF


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

        ldr    r1, =0xb1500010  ;NFDATA
        mov    r2, #0x200
1
        ldmia   r0!, {r4 - r11}

		str		r4, [r1]
		str		r5, [r1]
		str		r6, [r1]
		str		r7, [r1]
		str		r8, [r1]
		str		r9, [r1]
		str		r10,[r1]
		str		r11,[r1]

        subs    r2, r2, #32
        bne    %B1

        ldmfd    sp!, {r1 - r11}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF

    ; Writes one sector.  Handles case where buffer (r0) is unaligned.
    ;
    LEAF_ENTRY    WrPage512Unalign
        stmfd    sp!,{r1 - r11}

        ldr    r1, =0xb1500010  ;NFDATA
        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_unalign1
        ; Write unaligned bytes
        ldrb    r4, [r0]
        strb    r4, [r1]
        add    r0, r0, #1
        subs    r3, r3, #1
        bne    wr_unalign1

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

		str		r4, [r1]
		str		r5, [r1]
		str		r6, [r1]
		str		r7, [r1]
		str		r8, [r1]
		str		r9, [r1]
		str		r10,[r1]
		str		r11,[r1]
		
        subs    r2, r2, #32
        bne    wr_main

        ; Write 28 bytes
        ldmia   r0!, {r4 - r10}
		str		r4, [r1]
		str		r5, [r1]
		str		r6, [r1]
		str		r7, [r1]
		str		r8, [r1]
		str		r9, [r1]
		str		r10,[r1]

        ; 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!, {r1 - r11}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF


    ; Read page/sector information.  This includes logical sector number
    ; and block status flags (RO, OEM-defined, etc.).
    ;
    LEAF_ENTRY RdPageInfo
        stmfd sp!, {r1 - r4}
        ldr   r1, =0xb1500010   ; NFDATA.
		ldr		r3, [r1]
		ldr		r4, [r1]
        stmia r0!, {r3 - r4}
        ldmfd sp!, {r1 - r4}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF

    LEAF_ENTRY RdPageSpare
        stmfd    sp!,{r1 - r11}

        ldr    r1, =0xb1500010  ;NFDATA
        mov    r2, #0x40
1    
		ldr		r4, [r1]
		ldr		r5, [r1]
		ldr		r6, [r1]
		ldr		r7, [r1]
		ldr		r8, [r1]
		ldr		r9, [r1]
		ldr		r10,[r1]
		ldr		r11,[r1]

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

        ldmfd    sp!, {r1 - r11}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF
        

    ; Store page/sector information.  This includes logical sector number
    ; and block status flags (RO, OEM-defined, etc.).
    ;
    LEAF_ENTRY WrPageInfo
        stmfd sp!, {r1 - r3}
        ldr   r1,  =0xb1500010  ; NFDATA.
        ldmia r0!, {r2 - r3}
		str		r2, [r1]
		str		r3, [r1]
        ldmfd sp!, {r1 - r3}

        IF Interworking :LOR: Thumbing
          bx  lr
        ELSE
          mov  pc, lr          ; return
        ENDIF

    END

⌨️ 快捷键说明

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