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

📄 nand.s

📁 6410BSP3
💻 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 Flash Related Routines
;

    INCLUDE kxarm.h

    TEXTAREA

;----------------------------------------------
NFDATA        EQU        (0xb0200010)
;----------------------------------------------

;----------------------------------------------
; Read one sector.  Buffer (r0) must be aligned.
;
    LEAF_ENTRY RdPage512

        stmfd    sp!,{r1 - r11}

        ldr        r1, =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

;----------------------------------------------
; Read one sector.  Handles case where buffer (r0) is unaligned.
;
    LEAF_ENTRY RdPage512Unalign

        stmfd    sp!,{r1 - r12}

        ldr        r1, =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, =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, =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, =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

;----------------------------------------------
; 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, =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 + -