📄 g3_startup.s
字号:
; 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 + -