📄 nfc.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.
;
;------------------------------------------------------------------------------
;
; 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 + -