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

📄 g3_startup.s

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 S
📖 第 1 页 / 共 2 页
字号:
        ; Reading from CDSN IO - 4 bytes of data (signature)
        ldrh    r0, [r7, #CDSN_IO_CORR]
        ldrh    r2, [r7, #CDSN_IO_CORR]
        strb    r1, [r1, #G3_NflashDataEnd] ; Finish Read Sequence
        strb    r0, [r1, #G3_NNOPreg]       ; NOP
        strb    r0, [r1, #G3_NNOPreg]
        orr     r0, r0, r2, LSL #16
        cmp     r6, r0
        bne     G3_continue_search

;---------------------------------------------------------------
; 7. Issue READ command
;---------------------------------------------------------------
G3_Read_A_Area_start
        ; Set Page Offset 0
        eor     r8,r8,r8
        b       G3_Read_start
        
G3_Read_B_Area_start

        ; Set Page Offset 0x84
        mov     r8, #G3_PAGE_OFFSET

G3_Read_start
        bl      G3_ReadCommandInit
        bl      G3_ReadCommandContinue

;---------------------------------------------------------------
; 8. Read first 512 bytes
;---------------------------------------------------------------
        ; Init amount of data to read
        mov     r0, #BLOCK_DATA
        add     r0, r0, #G3_EDC_DATA

        ; Read 512 bytes of data + 8 bytes Signature + 7 bytes of EDC + 1
G3_Read_first_512bytes
        ldrh    r5, [r7, #CDSN_IO_CORR]     ;   r5  <-- [r7+2]
        strh    r5, [r12], #2               ; [r12] <-- r5, r12+=2
        subs    r0, r0, #2
        bne     G3_Read_first_512bytes

        strb    r1, [r1, #G3_NflashDataEnd] ; Finish Read Sequence
        strb    r0, [r1, #G3_NNOPreg]
        strb    r0, [r1, #G3_NNOPreg]
        
        ; Check if even or odd page is read
        cmp     r8, #0

        ; EDC mode is applied only to even page
        bne     G3_NoEdcErrorA
        mov     r8, #1
        add     r0, r1, #G3_NECCcontrol_1
        strh    r0, [r1, #G3_NreadAddrReg]
        ldrb    r0, [r0]
        tst     r0, #G3_EDC_ERROR_MASK
        beq     G3_NoEdcErrorA
        sub     r12, r12, #BLOCK_DATA
        sub     r8, r8, #1
G3_NoEdcErrorA
        sub     r12, r12, #G3_EDC_DATA      ; Restore r12 to SPL Addr
        cmp     r8, #0
        beq     G3_Read_B_Area_start        ; EDC Error
        
;---------------------------------------------------------------
; 9. Check if SPL is already copied
;---------------------------------------------------------------
G3_read_Next
        cmp     r4, r11
        beq     JumpToSPL
        IF SPL_MODE
        add     r3, r3, #2
        ELSE
        add     r3, r3, #1                  ; page address
        ENDIF ; SPL_MODE

        ; Put into r0 exact number of pages that was read in current unit
        and     r0, r9, r4                  ; R0 <- R4 & #(PAGES_IN_UNIT - 1)
        add     r4, r4, #1                  ; page counter
        cmp     r0, #0
        bne     G3_Read_A_Area_start        ; read in current unit
        sub     r3, r3, #G3_PAGES_IN_UNIT   ; will be incremented later
        b       G3_FindNextUnit             ; goto next unit
        
;---------------------------------------------------------------
; 10. Branch to SPL located in system RAM for further initialization
;---------------------------------------------------------------
JumpToSPL
        
        ldr     pc, =SPL_RAM_ADDRESS
        nop
        nop
        nop


;-------------------------------------------------------------------------------
;
;   Function:   MDOC_NotFound
;   Params:     print "MDOC Not Found" to FFUART
;   Return:     --
;
MDOC_NotFound
        adr     r0, MDOC_NotFound_MESSAGE
        bl      WriteStringFFUART

        ;enter idle mode
        ldr     r0, =0x01                     ; 1 = Idle Mode
        mcr     p14, 0, r0, c7, c0, 0         ; Enter Idle mode

MDOC_NotFound_MESSAGE   DCB "G3 MDOC NOT FOUND. HALTING!\r\n", 0

;-------------------------------------------------------------------------------
;
;   Function:   G3_WaitForReady
;   Params:     --
;   Return:     r0, r7 destroyed
;
    ALIGN
G3_WaitForReady
    ; 4 NOPs
        strb    r0, [r1, #G3_NNOPreg]
        strb    r0, [r1, #G3_NNOPreg]
        strb    r0, [r1, #G3_NNOPreg]
        strb    r0, [r1, #G3_NNOPreg]
    ; Wait For Ready - wait untill (value & 0x01) equals to 0x01
        add     r7, r1, #G3_NflashControl
        strh    r7, [r1, #G3_NreadAddrReg]
G3_WaitForReadyLoop
        ldrb    r0, [r7]
        movs    r0, r0, LSL #G3_RB_SHIFT
        beq     G3_WaitForReadyLoop
        mov     pc, lr

;-------------------------------------------------------------------------------
;
;   Function:   G3_SendCommandAndSeq
;   Params:     r6 - type of command
;               r7 - type of sequence
;   Return:     r5 destroyed
;
G3_SendCommandAndSeq
        strb    r7, [r1, #G3_NflashSequence]; Send Sequence
G3_SendCommand
        strb    r6, [r1, #G3_NflashCommand] ; Send Command
        strb    r6, [r1, #G3_NNOPreg]
        strb    r6, [r1, #G3_NNOPreg]
        mov     pc, lr

;-------------------------------------------------------------------------------
;
;   Function:   G3_ReadCommandContinue
;   Params:     r8 - page offset
;   Return:     r7 - 0x800
;               r6, r10 - destroyed
;
G3_ReadCommandContinue
        mov     r10, lr
        mov     r6, #MULTI_READ_CMD
        bl      G3_SendCommand
        bl      G3_WaitForReady
        mov     r6, #ADDR_INPUT_FOR_REG_READ
        bl      G3_SendCommand

        strb    r8, [r1, #G3_NflashAddress] ; r8[0..7]   -->  0..7
        strb    r8, [r1, #G3_NNOPreg]

        mov     r6, #REGISTER_READ_CMD
        bl      G3_SendCommand

        bl      G3_SetEdcMode

        ldr     r7, =MDOCPBaseAddressIO     ; r7 <- 0x800
        strh    r7, [r1, #G3_NreadAddrReg]
        mov     pc, r10


;-------------------------------------------------------------------------------
;
;   Function:   G3_ReadCommandInit
;   Params:     --
;   Return:     r6, r7, r10 - destroyed
;
G3_ReadCommandInit
        mov     r10, lr
        mov     r7, #READ_A_Seq             ; Select Area A Command
        mov     r6, #READ_A_FLASH_CMD
        bl      G3_SendCommandAndSeq
        mov     r7, #READ_Seq               ; Read Command to Plane 0
        mov     r6, #READ_CMD
        bl      G3_SendCommandAndSeq

        mov     r6, #G3_PLANE_0             ; Address to Plane 0
        bl      G3_SendAddress
        mov     r6, #READ_CMD               ; Read Command to Plane 1
        bl      G3_SendCommand
        mov     r6, #G3_PLANE_1             ; Address to Plane 1
        bl      G3_SendAddress
        mov     pc, r10

;-------------------------------------------------------------------------------
;
;   Function:   G3_SendAddress
;   Params:     r6 = Plane: 0 or 1
;               r3 = Address on flash in pages
;   Return:     r0 destroyed
;
G3_SendAddress
        orr     r0, r3, r6                  ; Set Plane: 0 or 1
        strb    r0, [r1, #G3_NflashAddress] ; r3[0..7]   -->  9..16
        mov     r0, r0, LSR #8
        strb    r0, [r1, #G3_NflashAddress] ; r3[8..15]  -->  17..24
        mov     r0, r0, LSR #8
        strb    r0, [r1, #G3_NflashAddress] ; r3[16..23] -->  25..27
    ; Address Pipe Term
        strb    r0, [r1, #G3_NNOPreg]
        mov     pc, lr

;-------------------------------------------------------------------------------
;
;   Function:   G3_SetEdcMode
;   Params:     --
;   Return:     r6 destroyed
;
G3_SetEdcMode
        ldr     r6, =G3_EDC_VAL
        strh    r6, [r1, #G3_NECCcontrol_0]
        ; 5 NOPs
        strb    r6, [r1, #G3_NNOPreg]
        strb    r6, [r1, #G3_NNOPreg]
        strb    r6, [r1, #G3_NNOPreg]
        strb    r6, [r1, #G3_NNOPreg]
        strb    r6, [r1, #G3_NNOPreg]
        mov     pc, lr

        END

;-------------------------------------------------------------------------------

⌨️ 快捷键说明

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