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

📄 nfc.s

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 S
📖 第 1 页 / 共 2 页
字号:
;
; 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.
;
;------------------------------------------------------------------------------
;
; Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved.
; THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS 
; AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
;------------------------------------------------------------------------------
;
;   File: nfc.s
;
;   This file implements low-level NAND Flash Controller access routines.
;
;------------------------------------------------------------------------------
    INCLUDE kxarm.h
        
    TEXTAREA

    IMPORT g_pNFC
    
    MACRO 
    LDR4STR1 $src, $tmp1, $tmp2    
        ldrb    $tmp1, [$src], #+1
        ldrb    $tmp2, [$src], #+1
        orr     $tmp1, $tmp1, $tmp2, lsl #8
        ldrb    $tmp2, [$src], #+1
        orr     $tmp1, $tmp1, $tmp2, lsl #16
        ldrb    $tmp2, [$src], #+1
        orr     $tmp1, $tmp1, $tmp2, lsl #24
    MEND

    MACRO 
    STR4LDR1 $tgt, $src
        strb    $src, [$tgt], #+1
        mov     $src, $src, lsr #8
        strb    $src, [$tgt], #+1
        mov     $src, $src, lsr #8
        strb    $src, [$tgt], #+1
        mov     $src, $src, lsr #8
        strb    $src, [$tgt], #+1
    MEND

    TEXTAREA

;------------------------------------------------------------------------------
;
;   Function: RdPage512Align4
;
;   This function reads from the NFC main buffer and stores to the word-aligned
;   user buffer.
;
;   Parameters:
;       r0 - Sector buffer to be filled (must be 32-bit word aligned). 
;
;   Returns:
;------------------------------------------------------------------------------
    LEAF_ENTRY  RdPage512Align4
        stmfd   sp!, {r1 - r11}

        ldr     r1, =g_pNFC
        ldr     r1, [r1]
        mov     r2, #512

rd_align4
        ldmia   r1!, {r4 - r11}
        stmia   r0!, {r4 - r11}
        subs    r2, r2, #32
        bne     rd_align4

        ldmfd   sp!, {r1 - r11}

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

;------------------------------------------------------------------------------
;
;   Function: RdPage512Align1
;
;   This function reads from the NFC main buffer and stores to the byte-aligned
;   user buffer (aligned on BYTE[1] of 32-bit word).
;
;   Parameters:
;       r0 - Sector buffer to be filled (aligned on BYTE[1] of 32-bit word). 
;
;   Returns:
;------------------------------------------------------------------------------
    LEAF_ENTRY  RdPage512Align1
        stmfd   sp!, {r1 - r11}

        ldr     r1, =g_pNFC
        ldr     r1, [r1]
        mov     r2, #512

rd_align1
        ; Read BYTE[0]-BYTE[31]
        ldmia   r1!, {r4 - r11}         ; r4  = B03  B02  B01  B00
                                        ; r5  = B07  B06  B05  B04
                                        ; r6  = B11  B10  B09  B08
                                        ; r7  = B15  B14  B13  B12
                                        ; r8  = B19  B18  B17  B16
                                        ; r9  = B23  B22  B21  B20
                                        ; r10 = B27  B26  B25  B24
                                        ; r11 = B31  B30  B29  B28

        ; Write BYTE[0] (byte alignment)
        strb    r4, [r0], #+1     

        ; Write BYTE[1]-BYTE[2] (half-word alignment)
        mov     r4, r4, lsr #8          ; r4  =  00  B03  B02  B01
        strh    r4, [r0], #+2

        ; Shift data for multi-word write
        mov     r4, r4, lsr #16     
        orr     r4, r4, r5, lsl #8      ; r4  = B06  B05  B04  B03
        mov     r5, r5, lsr #24     
        orr     r5, r5, r6, lsl #8      ; r5  = B10  B09  B08  B07
        mov     r6, r6, lsr #24     
        orr     r6, r6, r7, lsl #8      ; r6  = B14  B13  B12  B11
        mov     r7, r7, lsr #24     
        orr     r7, r7, r8, lsl #8      ; r7  = B18  B17  B16  B15
        mov     r8, r8, lsr #24     
        orr     r8, r8, r9, lsl #8      ; r8  = B22  B21  B20  B19
        mov     r9, r9, lsr #24     
        orr     r9, r9, r10, lsl #8     ; r9  = B26  B25  B24  B23
        mov     r10, r10, lsr #24     
        orr     r10, r10, r11, lsl #8   ; r10 = B30  B29  B28  B27
        
        ; Write BYTE[3]-BYTE[30] (double word alignment)        
        stmia   r0!, {r4 - r10}

        ; Write BYTE[31] (byte alignment)
        mov     r11, r11, lsr #24       ; r11 =  00   00   00  B31
        strb    r11, [r0], #+1

        subs    r2, r2, #32
        bne     rd_align1

        ldmfd   sp!, {r1 - r11}

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


;------------------------------------------------------------------------------
;
;   Function: RdPage512Align2
;
;   This function reads from the NFC main buffer and stores to the 
;   half-word aligned user buffer (aligned on BYTE[2] of 32-bit word).
;
;   Parameters:
;       r0 - Sector buffer to be filled (aligned on BYTE[2] of 32-bit word). 
;
;   Returns:
;------------------------------------------------------------------------------
    LEAF_ENTRY  RdPage512Align2
        stmfd   sp!, {r1 - r11}

        ldr     r1, =g_pNFC
        ldr     r1, [r1]
        mov     r2, #512

rd_align2
        ; Read BYTE[0]-BYTE[31]
        ldmia   r1!, {r4 - r11}         ; r4  = B03  B02  B01  B00
                                        ; r5  = B07  B06  B05  B04
                                        ; r6  = B11  B10  B09  B08
                                        ; r7  = B15  B14  B13  B12
                                        ; r8  = B19  B18  B17  B16
                                        ; r9  = B23  B22  B21  B20
                                        ; r10 = B27  B26  B25  B24
                                        ; r11 = B31  B30  B29  B28

        ; Write BYTE[0]-BYTE[1] (half-word alignment)
        strh    r4, [r0], #+2

        ; Shift data for multi-word write
        mov     r4, r4, lsr #16
        orr     r4, r4, r5, lsl #16     ; r4  = B05  B04  B03  B02
        mov     r5, r5, lsr #16     
        orr     r5, r5, r6, lsl #16     ; r5  = B09  B08  B07  B06
        mov     r6, r6, lsr #16     
        orr     r6, r6, r7, lsl #16     ; r6  = B13  B12  B11  B10
        mov     r7, r7, lsr #16     
        orr     r7, r7, r8, lsl #16     ; r7  = B17  B16  B15  B14
        mov     r8, r8, lsr #16     
        orr     r8, r8, r9, lsl #16     ; r8  = B21  B20  B19  B18
        mov     r9, r9, lsr #16    
        orr     r9, r9, r10, lsl #16    ; r9  = B25  B24  B23  B22
        mov     r10, r10, lsr #16    
        orr     r10, r10, r11, lsl #16  ; r10 = B29  B28  B27  B25
        
        ; Write BYTE[2]-BYTE[29] (double word alignment)        
        stmia   r0!, {r4 - r10}

        ; Write BYTE[30]-BYTE[31] (half-word alignment)
        mov     r11, r11, lsr #16       ; r11  =  00  00  B31  B30
        strh    r11, [r0], #+2

        subs    r2, r2, #32
        bne     rd_align2

        ldmfd   sp!, {r1 - r11}

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

        
;------------------------------------------------------------------------------
;
;   Function: RdPage512Align3
;
;   This function reads from the NFC main buffer and stores to the byte-aligned
;   user buffer (aligned on BYTE[3] of 32-bit word).
;
;   Parameters:
;       r0 - Sector buffer to be filled (aligned on BYTE[3] of 32-bit word). 
;
;   Returns:
;------------------------------------------------------------------------------
    LEAF_ENTRY  RdPage512Align3
        stmfd   sp!, {r1 - r11}

        ldr     r1, =g_pNFC
        ldr     r1, [r1]
        mov     r2, #512

rd_align3
        ; Read BYTE[0]-BYTE[31]
        ldmia   r1!, {r4 - r11}         ; r4  = B03  B02  B01  B00
                                        ; r5  = B07  B06  B05  B04
                                        ; r6  = B11  B10  B09  B08
                                        ; r7  = B15  B14  B13  B12
                                        ; r8  = B19  B18  B17  B16
                                        ; r9  = B23  B22  B21  B20
                                        ; r10 = B27  B26  B25  B24
                                        ; r11 = B31  B30  B29  B28

        ; Write BYTE[0] (byte alignment)
        strb    r4, [r0], #+1     

        ; Shift data for multi-word write
        mov     r4, r4, lsr #8     
        orr     r4, r4, r5, lsl #24     ; r4  = B04  B03  B02  B01
        mov     r5, r5, lsr #8     
        orr     r5, r5, r6, lsl #24     ; r5  = B08  B07  B06  B05
        mov     r6, r6, lsr #8     
        orr     r6, r6, r7, lsl #24     ; r6  = B12  B11  B10  B09
        mov     r7, r7, lsr #8     
        orr     r7, r7, r8, lsl #24     ; r7  = B16  B15  B14  B13
        mov     r8, r8, lsr #8     
        orr     r8, r8, r9, lsl #24     ; r8  = B20  B19  B18  B17
        mov     r9, r9, lsr #8     
        orr     r9, r9, r10, lsl #24    ; r9  = B24  B23  B22  B21

⌨️ 快捷键说明

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