;****************************************************************************** THUMB REQUIRE8 PRESERVE8 AREA |.text|, CODE, READONLY, ALIGN=2 ; Reference to the FailSafe routine to be executed in case of non-recoverable ; failure IMPORT FailSafePOR ;******************************************************************************* ; Function Name : STL_TranspRamMarchCXStep ; Description : Transparent RAM walkpat test for run time ; Input : R0 .. RAM begin (first address to test), ; R1 .. Buffer begin (First address of backup buffer) ; R2 .. Background pattern ; R4 .. test cell data ; R5 .. cout for words test loop address offset ; R6 .. read data ; R7 .. befor/next cell address ; R8 .. Background data 0 OR 0xFFFFFFFF ; R9 .. cout for word test loop ; Return : TEST_SUCCESSFULL (=1) ;*******************************************************************************/ STU_RamWalkpatStep PROC ;195.6us EXPORT STU_RamWalkpatStep PUSH {R4-R9} MOVS R4, #0 MOVS R5, #0 __BACKUP_LOOP ;save content of the RAM slice into the backup buffer and reset test uint LDR R6,[R0, R5] STR R6,[R1, R5] STR R4,[R0, R5] ;reset test word ADD R5,R5,#4 CMP R5, #24 BLT __BACKUP_LOOP ;********************* Walkpat 1 ************************** MOVS R5, #4 MOVS R8, #0 __STEP_TEST_WORDS_LOOP MOVS R4,#0x01 MOVS R9, #1 __STEP_TEST_WORD_LOOP STR R4,[R0, R5] ;set one bit ,and Verify LDR R6,[R0, R5] CMP R4,R6 BNE __STEP_ERR ADD R7,R5,#4 ;Verify next word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR STR R8,[R0, R5] ;reset ont bit ,and Verify LDR R6,[R0, R5] CMP R8,R6 BNE __STEP_ERR ADD R7,R5,#4 ;Verify next word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR LSL R4,#1 ;Test data moved one place to the left ADD R9,R9,#1 CMP R9,#32 BLE __STEP_TEST_WORD_LOOP ADD R5,R5,#4 ;Test next word CMP R5, #20 BLT __STEP_TEST_WORDS_LOOP ;********************* Walkpat 0 ************************** MOVS R4, #0xFFFFFFFF MOVS R5, #0 __BACKGROUND_LOOP STR R4,[R0, R5] ;set test word ADD R5,R5,#4 CMP R5, #24 BLT __BACKGROUND_LOOP MOVS R5, #4 MOVS R8, #0xFFFFFFFF __STEP_TEST_WORDS_LOOP_2 MOVS R4,#0x7FFFFFFF MOVS R9, #1 __STEP_TEST_WORD_LOOP_2 STR R4,[R0, R5] ;set one bit ,and Verify LDR R6,[R0, R5] CMP R4,R6 BNE __STEP_ERR ADD R7,R5,#4 ;Verify next word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR STR R8,[R0, R5] ;reset ont bit ,and Verify LDR R6,[R0, R5] CMP R8,R6 BNE __STEP_ERR ADD R7,R5,#4 ;Verify next word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __STEP_ERR ROR R4,#1 ;Test data moved one place to the left ADD R9,R9,#1 CMP R9,#32 BLE __STEP_TEST_WORD_LOOP_2 ADD R5,R5,#4 ;Test next word CMP R5, #20 BLT __STEP_TEST_WORDS_LOOP_2 MOVS R5, #0 __RESTORE_LOOP ;restore content of the RAM slice back from the backup buffer LDR R6,[R1, R5] STR R6,[R0, R5] ADD R5,R5,#4 CMP R5, #24 BLT __RESTORE_LOOP MOVS R0, #1 ; Correct return B __STEP_RET __STEP_ERR MOVS R0, #0 ; error result __STEP_RET POP {R4-R9} BX LR ; return to the caller ENDP ;******************************************************************************* ; Function Name : STL_TranspRamMarchCXStep ; Description : Transparent walkpat test for startup ; Input : R0 .. RAM begin (first address to test), ; R1 .. RAM size (byte) ; R2 .. Background pattern ; R4 .. test cell data ; R5 .. cout for words test loop address offset ; R6 .. read data ; R7 .. befor/next cell address ; R8 .. Background data 0 OR 0xFFFFFFFF ; R9 .. cout for word test loop ; Return : TEST_SUCCESSFULL (=1) ;*******************************************************************************/ STU_FullRamWalkpat PROC EXPORT STU_FullRamWalkpat PUSH {R4-R9} ;********************* Walkpat 1 ************************** MOVS R4, #0 MOVS R5, #0 __FULL_LOOP_1 ;reset test uint STR R4,[R0, R5] ;reset test word ADD R5,R5,#4 CMP R5, R1 BLT __FULL_LOOP_1 ;带符号数小于 MOVS R5, #0 MOVS R8, #0 __FULL_TEST_WORDS_LOOP MOVS R4,#0x01 MOVS R9, #1 __FULL_TEST_WORD_LOOP STR R4,[R0, R5] ;set one bit ,and Verify LDR R6,[R0, R5] CMP R4,R6 BNE __FULL_ERR CMP R5, #0 BEQ __VERIFY_NEXT_1 SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __VERIFY_NEXT_1 ADD R7,R5,#4 ;Verify next word CMP R7, R1 BGE __FULL_STEP_3 LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __FULL_STEP_3 STR R8,[R0, R5] ;reset one bit ,and Verify LDR R6,[R0, R5] CMP R8,R6 BNE __FULL_ERR CMP R5, #0 BEQ __VERIFY_NEXT_2 SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __VERIFY_NEXT_2 ADD R7,R5,#4 ;Verify next word CMP R7, R1 BGE __FULL_STEP_4 LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __FULL_STEP_4 LSL R4,#1 ;Test data moved one place to the left ADD R9,R9,#1 CMP R9,#32 BLE __FULL_TEST_WORD_LOOP ;小于等于 ADD R5,R5,#4 ;Test next word CMP R5, R1 BLT __FULL_TEST_WORDS_LOOP ;********************* Walkpat 0 ************************** MOVS R4, #0xFFFFFFFF ;background data MOVS R5, #0 __FULL_LOOP_2 STR R4,[R0, R5] ;set test word ADD R5,R5,#4 CMP R5, R1 BLT __FULL_LOOP_2 ;带符号数小于 MOVS R5, #0 MOVS R8, #0xFFFFFFFF __FULL_TEST_WORDS_LOOP_2 MOVS R4,#0x7FFFFFFF ;first test data MOVS R9, #1 __FULL_TEST_WORD_LOOP_2 STR R4,[R0, R5] ;set one bit ,and Verify LDR R6,[R0, R5] CMP R4,R6 BNE __FULL_ERR CMP R5, #0 BEQ __VERIFY_NEXT_3 SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __VERIFY_NEXT_3 ADD R7,R5,#4 ;Verify next word CMP R7, R1 BGE __FULL_STEP_5 LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __FULL_STEP_5 STR R8,[R0, R5] ;set one bit ,and Verify LDR R6,[R0, R5] CMP R8,R6 BNE __FULL_ERR CMP R5, #0 BEQ __VERIFY_NEXT_4 SUBS R7,R5,#4 ;Verify before word LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __VERIFY_NEXT_4 ADD R7,R5,#4 ;Verify next word CMP R7, R1 BGE __FULL_STEP_6 LDR R6,[R0, R7] CMP R8,R6 BNE __FULL_ERR __FULL_STEP_6 ROR R4,#1 ;Test data moved one place to the right ADD R9,R9,#1 CMP R9,#32 BLE __FULL_TEST_WORD_LOOP_2 ;小于等于 ADD R5,R5,#4 ;Test next word CMP R5, R1 BLT __FULL_TEST_WORDS_LOOP_2 MOVS R0, #1 ; Correct return B __FULL_RET __FULL_ERR MOVS R0, #0 ; error result __FULL_RET POP {R4-R9} BX LR ; return to the caller ENDP END