Energy Micro IEC60355 Library Example Project 1.0 (internal use only!) GCC-Version
Example project demonstrating POST and BIST library functions

iec60335_class_b_cpureg_test_post_arm.s

Go to the documentation of this file.
00001 ;/***************************************************************************/
00030     AREA    |.text|, CODE, READONLY
00031     THUMB
00032 ;/* functions exported */
00033     EXPORT    ASMCPUregTestPOST
00034 
00035 ;/* external struct */
00036     IMPORT    IEC60335_CPUregTestPOST
00037 
00038 ;/* Test structure offset definitions */
00039 testState            EQU     0x0
00040 testResult           EQU     0x4
00041 
00042 ;/* Test pattern definition */
00043 pattern1             EQU     0xAAAAAAAA
00044 pattern2             EQU     0xAAAAAAA8
00045 pattern3             EQU     0x55555555
00046 pattern4             EQU     0x55555554
00047 pattern5             EQU     0xA8000000
00048 pattern6             EQU     0x50000000
00049 pattern7             EQU     0x000000A0
00050 pattern8             EQU     0x00000060
00051 
00052 ;/* test case flags */
00053 TestClear            EQU     0x00000000
00054 TestState_r0         EQU     0x00000010
00055 TestState_r1r7       EQU     0x00000020
00056 TestState_r8r12      EQU     0x00000040
00057 TestStateMSP         EQU     0x00000100
00058 TestStatePSP         EQU     0x00000200
00059 TestStateLR          EQU     0x00000400
00060 TestStateAPSR        EQU     0x00000800
00061 TestStatePRIMASK     EQU     0x00001000
00062 TestStateFAULTMASK   EQU     0x00002000
00063 TestStateBASEPRI     EQU     0x00004000
00064 
00065 ;/* test results */
00066 TestResult_fail      EQU     0
00067 TestResult_pass      EQU     1
00068 
00069 ;/* CPU register test */
00070 ASMCPUregTestPOST
00071 ;/* push registers to stack (atomic instruction) */
00072     push     {r0-r12,r14}
00073     mov      r12, lr
00074     cmp      r12, lr
00075     bne.w    Test_CPU_SFR_fail
00076 
00077 ;/* clear IEC60335_CPUregTestPOST */
00078     ldr      r0,  =TestClear
00079     ldr      r8,  =TestState_r0
00080     ldr      r9,  =IEC60335_CPUregTestPOST
00081     str      r8,  [r9,#testState]
00082     str      r0,  [r9,#testResult]
00083 
00084 ;/* registers r0-r7 tests */
00085 Test_r0
00086 ;/* register r0 test:
00087 ; * r0 is tested first by immediate instructions
00088 ; * r0 is tested first to keep it free for the following tests */
00089 ;/* cmp instruction to compare with immediate values
00090 ; * byte test requires shift to the LSB */
00091 
00092 ;/* r0[31:24] */
00093     movw     r0,  #0x0000
00094     movt     r0,  #0xAA00
00095     lsr      r0,  r0, #24
00096     cmp      r0,  #0xAA
00097     bne.w    Test_r0_Exit
00098 ;/* r0[23:16] */
00099     movw     r0,  #0x0000
00100     movt     r0,  #0x00AA
00101     lsr      r0,  r0, #16
00102     cmp      r0,  #0xAA
00103     bne.w    Test_r0_Exit
00104 ;/* r0[15:8] */
00105     movw     r0,  #0xAA00
00106     lsr      r0,  r0, #8
00107     cmp      r0,  #0xAA
00108     bne.w    Test_r0_Exit
00109 ;/* r0[7:0] */
00110     movw     r0,  #0x00AA
00111     cmp      r0,  #0xAA
00112     bne.w    Test_r0_Exit
00113 
00114 ;/* use inverse pattern */
00115 ;/* r0[31:24] */
00116     movw     r0,  #0x0000
00117     movt     r0,  #0x5500
00118     lsr      r0,  r0, #24
00119     cmp      r0,  #0x55
00120     bne.w    Test_r0_Exit
00121 ;/* test r0[23:16] */
00122     movw     r0,  #0x0000
00123     movt     r0,  #0x0055
00124     lsr      r0,  r0, #16
00125     cmp      r0,  #0x55
00126     bne.w    Test_r0_Exit
00127 ;/* test r0[15:8] */
00128     movw     r0,  #0x5500
00129     lsr      r0,  r0, #8
00130     cmp      r0,  #0x55
00131     bne.w    Test_r0_Exit
00132 ;/* test r0[7:0] */
00133     movw     r0,  #0x0055
00134     cmp      r0,  #0x55
00135     bne.w    Test_r0_Exit
00136 
00137 ;/* mark r0 as passed by calling next test */
00138 Test_r0_pass
00139 ;/* continue with result */
00140     b        Test_r1_r7
00141 
00142 Test_r1_r7
00143 ;/* register r1-r7 test:
00144 ; * step 1:
00145 ; * each registers will be written with pattern1 = 0xAAAA.AAAA
00146 ; * each register will be compared to r0 for the test.
00147 ; * step 2:
00148 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00149 ; * register and compared to r0 */
00150 
00151 ;/* clear IEC60335_CPUregTestPOST */
00152     ldr      r8,  =TestState_r1r7
00153     ldr      r7,  [r9]
00154     orr      r8,  r8, r7
00155     str      r8,  [r9,#testState]
00156 
00157 ;/* load pattern1 to r0 */
00158     ldr      r0,  =pattern1
00159 ;/* load pattern1 to r1-r7 */
00160     mov      r1,  r0
00161     mov      r2,  r0
00162     mov      r3,  r0
00163     mov      r4,  r0
00164     mov      r5,  r0
00165     mov      r6,  r0
00166     mov      r7,  r0
00167 ;/* test pattern1 */
00168     cmp      r1,  r0
00169     bne.w    Test_r1_r7_Exit
00170     cmp      r2,  r0
00171     bne.w    Test_r1_r7_Exit
00172     cmp      r3,  r0
00173     bne.w    Test_r1_r7_Exit
00174     cmp      r4,  r0
00175     bne.w    Test_r1_r7_Exit
00176     cmp      r5,  r0
00177     bne.w    Test_r1_r7_Exit
00178     cmp      r6,  r0
00179     bne.w    Test_r1_r7_Exit
00180     cmp      r7,  r0
00181     bne.w    Test_r1_r7_Exit
00182 
00183 ;/* load pattern3 to r0 */
00184     ldr      r0,  =pattern3
00185 ;/* load pattern3 to r1-r7 */
00186     mov      r1,  r0
00187     mov      r2,  r0
00188     mov      r3,  r0
00189     mov      r4,  r0
00190     mov      r5,  r0
00191     mov      r6,  r0
00192     mov      r7,  r0
00193 ;/* test pattern3 */
00194     cmp      r1,  r0
00195     bne.w    Test_r1_r7_Exit
00196     cmp      r2,  r0
00197     bne.w    Test_r1_r7_Exit
00198     cmp      r3,  r0
00199     bne.w    Test_r1_r7_Exit
00200     cmp      r4,  r0
00201     bne.w    Test_r1_r7_Exit
00202     cmp      r5,  r0
00203     bne.w    Test_r1_r7_Exit
00204     cmp      r6,  r0
00205     bne.w    Test_r1_r7_Exit
00206     cmp      r7,  r0
00207     bne.w    Test_r1_r7_Exit
00208 
00209 Test_r1_r7_pass
00210 ;/* continue with result */
00211     b        Test_r8_r12
00212 
00213 ;/* registers r8-r12 tests */
00214 Test_r8_r12
00215 ;/* step 1:
00216 ; * each registers will be written with pattern1 = 0xAAAA.AAAA
00217 ; * each register will be compared to r0 for the test.
00218 ; * step 2:
00219 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00220 ; * register and compared to r0 */
00221 
00222 ;/* save LR to r3 */
00223     mov      r3,  r12
00224 ;/* load IEC60335_CPUregTestPOST with test state */
00225     ldr      r5,  =TestState_r8r12
00226     ldr      r6,  =IEC60335_CPUregTestPOST
00227     ldr      r7,  [r6]
00228     orr      r5,  r5, r7
00229     str      r5,  [r6,#testState]
00230 
00231 ;/* load pattern1 to r0 */
00232     ldr      r0,  =pattern1
00233 ;/* load pattern1 to r8-r12 */
00234     mov      r8,  r0
00235     mov      r9,  r0
00236     mov      r10, r0
00237     mov      r11, r0
00238     mov      r12, r0
00239 ;/* test patter1 */
00240     cmp      r8,  r0
00241     bne.w    Test_r8_r12_Exit
00242     cmp      r9,  r0
00243     bne.w    Test_r8_r12_Exit
00244     cmp      r10, r0
00245     bne.w    Test_r8_r12_Exit
00246     cmp      r11, r0
00247     bne.w    Test_r8_r12_Exit
00248     cmp      r12, r0
00249     bne.w    Test_r8_r12_Exit
00250 
00251 ;/* load pattern3 to r0 */
00252     ldr      r0,  =pattern3
00253 ;/* load pattern3 to r8-r12 */
00254     mov      r8,  r0
00255     mov      r9,  r0
00256     mov      r10, r0
00257     mov      r11, r0
00258     mov      r12, r0
00259 ;/* test pattenr3 */
00260     cmp      r8,  r0
00261     bne.w    Test_r8_r12_Exit
00262     cmp      r9,  r0
00263     bne.w    Test_r8_r12_Exit
00264     cmp      r10, r0
00265     bne.w    Test_r8_r12_Exit
00266     cmp      r11, r0
00267     bne.w    Test_r8_r12_Exit
00268     cmp      r12, r0
00269     bne.w    Test_r8_r12_Exit
00270 
00271 Test_r8_r12_pass
00272 ;/* restore LR */
00273     mov      r12, r3
00274 ;/* continue with result */
00275     b        Test_MSP
00276 
00277 Test_r8_r12_Exit
00278 ;/* restore LR */
00279     mov      r12, r3
00280     b        Test_CPU_SFR_fail
00281 
00282 ;/* MainSP test: */
00283 Test_MSP
00284 ;/* step 1:
00285 ; * select the MSP as stack pointer and
00286 ; * use mov command to read/write with different pattern
00287 ; * compare to r0 for the test.
00288 ; * step 2:
00289 ; * use mrs/msr command to read/write with different pattern
00290 ; * register and compared to r0
00291 ; * MSP[1:0] is always read as zero */
00292 
00293 ;/* save the CONTROL register value */
00294     mrs      r3,  CONTROL
00295 ;/* load IEC60335_CPUregTestPOST with test state */
00296     ldr      r8,  =TestStateMSP
00297     ldr      r9,  =IEC60335_CPUregTestPOST
00298     ldr      r10, [r9]
00299     orr      r8,  r8, r10
00300     str      r8,  [r9,#testState]
00301 
00302 ;/* set MSP as default stack */
00303     mov      r6,  #0x0
00304     msr      CONTROL, r6
00305 ;/* save current MSP content */
00306     mov      r4,  r13
00307 
00308 ;/* verify MSP as stack pointer */
00309     mrs      r5,  MSP
00310     cmp      r4,  r5
00311     bne      Test_MSP_Exit
00312 
00313 ;/* load pattern2 to MSP */
00314     ldr      r0,  =pattern2
00315     mov      r13, r0
00316 ;/* compare with r0 */
00317     cmp      r13, r0
00318     bne      Test_MSP_Exit
00319 
00320 ;/* load pattern4 to MSP */
00321     ldr      r0,  =pattern4
00322     mov      r13, r0
00323 ;/* compare with r0 */
00324     cmp      r13, r0
00325     bne      Test_MSP_Exit
00326 
00327 ;/* load pattern2 to MSP and read back r1 */
00328     ldr      r0,  =pattern2
00329     msr      MSP, r0
00330     mrs      r1,  MSP
00331 ;/* compare r1 with r0 (indirect) */
00332     cmp      r1,  r0
00333     bne      Test_MSP_Exit
00334 
00335 ;/* load pattern4 to MSP and read back r1 */
00336     ldr      r0,  =pattern4
00337     msr      MSP, r0
00338     mrs      r1,  MSP
00339 ;/* compare r1 with r0 (indirect) */
00340     cmp      r1,  r0
00341     bne      Test_MSP_Exit
00342 
00343 Test_MSP_pass
00344 ;/* restore MSP and CONTROL */
00345     mov      r13, r4
00346     msr      CONTROL, r3
00347 ;/* continue with result */
00348     b        Test_PSP
00349 
00350 Test_MSP_Exit
00351 ;/* restore MSP and CONTROL */
00352     mov      r13, r4
00353     msr      CONTROL, r3
00354     b        Test_CPU_SFR_fail
00355 
00356 ;/* PSP register test: */
00357 Test_PSP
00358 ;/* step 1:
00359 ; * select the PSP as stack pointer and
00360 ; * use mov command to read/write with different pattern
00361 ; * compare to r0 for the test.
00362 ; * step 2:
00363 ; * use mrs/msr command to read/write with different pattern
00364 ; * register and compared to r0
00365 ; * PSP[1:0] is always read as zero */
00366 
00367 ;/* save the CONTROL register value */
00368     mrs      r3,  CONTROL
00369 
00370 ;/* load IEC60335_CPUregTestPOST with test state */
00371     ldr      r8,  =TestStatePSP
00372     ldr      r10, [r9]
00373     orr      r8,  r8, r10
00374     str      r8,  [r9,#testState]
00375 
00376 ;/* set PSP as default stack */
00377     mov      r6,  #0x02
00378     msr      CONTROL, r6
00379 ;/* save current PSP content */
00380     mrs      r4,  PSP
00381 
00382 ;/* verify PSP as stack pointer */
00383     mrs      r5,  PSP
00384     cmp      r4,  r5
00385     bne      Test_PSP_Exit
00386 ;/* Step1 */
00387 ;/* load pattern2 to PSP */
00388     ldr      r0,  =pattern2
00389     mov      r13, r0
00390 ;/* compare with r0 */
00391     cmp      r13, r0
00392     bne      Test_PSP_Exit
00393 
00394 ;/* load pattern4 to PSP */
00395     ldr      r0,  =pattern4
00396     mov      r13, r0
00397 ;/* compare with r0 */
00398     cmp      r13, r0
00399     bne      Test_PSP_Exit
00400 
00401 ;/* Step2 */
00402 ;/* load pattern2 to PSP and read back r1 */
00403     ldr      r0,  =pattern2
00404     msr      PSP, r0
00405     mrs      r1,  PSP
00406 ;/* compare r1 with r0 (indirect) */
00407     cmp      r1,  r0
00408     bne      Test_PSP_Exit
00409 
00410 ;/* load pattern4 to PSP and read back r1 */
00411     ldr      r0,  =pattern4
00412     msr      PSP, r0
00413     mrs      r1,  PSP
00414 ;/* compare r1 with r0 (indirect) */
00415     cmp      r1,  r0
00416     bne      Test_PSP_Exit
00417 
00418 Test_PSP_pass
00419 ;/* restore CONTROL and PSP */
00420     msr      PSP, r4
00421     msr      CONTROL, r3
00422 ;/* continue with result */
00423     b        Test_LR
00424 
00425 Test_PSP_Exit
00426 ;/* restore CONTROL and PSP */
00427     msr      PSP, r4
00428     msr      CONTROL, r3
00429     b        Test_CPU_SFR_fail
00430 
00431 ;/* LR register test: */
00432 Test_LR
00433 ;/* step 1:
00434 ; * LR registers will be written with pattern1 = 0xAAAA.AAAA
00435 ; * and will be compared to r0 for the test.
00436 ; * step 2:
00437 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00438 ; * register and compared to r0 */
00439 
00440 ;/* save the LR register content */
00441     mov      r3,  r14
00442 
00443 ;/* load IEC60335_CPUregTestPOST with test state */
00444     ldr      r8,  =TestStateLR
00445     ldr      r10, [r9]
00446     orr      r8,  r8, r10
00447     str      r8,  [r9,#testState]
00448 
00449 ;/* load pattern1 to LR */
00450     ldr      r0,  =pattern1
00451     mov      r14, r0
00452 ;/* compare with r0 */
00453     cmp      r14, r0
00454     bne      Test_LR_Exit
00455 
00456 ;/* load pattern3 to LR */
00457     ldr      r0,  =pattern3
00458     mov      r14, r0
00459 ;/* compare with r0 */
00460     cmp      r14, r0
00461     bne      Test_LR_Exit
00462 
00463 Test_LR_pass
00464 ;/* restore LR register */
00465     mov      r14, r3
00466 ;/* continue with result */
00467     b        Test_APSR
00468 
00469 Test_LR_Exit
00470 ;/* restore LR register and branch to eror condition */
00471     mov      r14, r3
00472     b        Test_CPU_SFR_fail
00473 
00474 ;/* APSR register test: */
00475 Test_APSR
00476 ;/* step 1:
00477 ; * APSR registers will be written with pattern5 = 0xA800.0000
00478 ; * and will be compared to r0 for the test.
00479 ; * step 2:
00480 ; * the inverse pattern pattern6 = 0x5000.0000 is written to the
00481 ; * register and read back to r1 and compared to r0
00482 ; * IPSR and EPSR are read-only */
00483 
00484 ;/* save the APSR register content */
00485     mrs      r3,  APSR
00486 
00487 ;/* load IEC60335_CPUregTestPOST with test state */
00488     ldr      r8,  =TestStateAPSR
00489     ldr      r10, [r9]
00490     orr      r8,  r8, r10
00491     str      r8,  [r9,#testState]
00492 
00493 ;/* load pattern5 to APSR */
00494     ldr      r0,  =pattern5
00495     msr      APSR, r0
00496 ;/* read and compare with r0 */
00497     mrs      r1,  APSR
00498     cmp      r1,  r0
00499     bne      Test_APSR_Exit
00500 
00501 ;/* load pattern6 to APSR */
00502     ldr      r0,  =pattern6
00503     msr      APSR, r0
00504 ;/* read and compare with r0 */
00505     mrs      r1,  APSR
00506     cmp      r1,  r0
00507     bne      Test_APSR_Exit
00508 
00509 Test_APSR_pass
00510 ;/* restore APSR register */
00511     msr      APSR, r3
00512 ;/* continue with result */
00513     b        Test_PRIMASK
00514 
00515 Test_APSR_Exit
00516 ;/* restore APSR register and branch to eror condition */
00517     msr      APSR, r3
00518     b        Test_CPU_SFR_fail
00519 
00520 ;/* PRIMASK register test: */
00521 Test_PRIMASK
00522 ;/* step 1:
00523 ; * PRIMASK registers [:0] will be written with 0x0000.0000
00524 ; * and will be compared to r0 for the test.
00525 ; * step 2:
00526 ; * the inverse pattern 0x0000.0001 is written to the
00527 ; * register and read back to r1 and compared to r0 */
00528 
00529 ;/* save the PRIMASK register content */
00530     mrs      r3,  PRIMASK
00531 
00532 ;/* load IEC60335_CPUregTestPOST with test state */
00533     ldr      r8,  =TestStatePRIMASK
00534     ldr      r10, [r9]
00535     orr      r8,  r8, r10
00536     str      r8,  [r9,#testState]
00537 
00538 ;/* load pattern to PRIMASK */
00539     mov      r0,  #0
00540     msr      PRIMASK, r0
00541 ;/* read and compare with r0 */
00542     mrs      r1,  PRIMASK
00543     cmp      r1,  r0
00544     bne      Test_PRIMASK_Exit
00545 
00546 ;/* load pattern to PRIMASK */
00547     mov      r0,  #1
00548     msr      PRIMASK, r0
00549 ;/* read and compare with r0 */
00550     mrs      r1,  PRIMASK
00551     cmp      r1,  r0
00552     bne      Test_PRIMASK_Exit
00553 
00554 Test_PRIMASK_pass
00555 ;/* restore PRIMASK register */
00556     msr      PRIMASK, r3
00557 ;/* continue with result */
00558     b        Test_FAULTMASK
00559 
00560 Test_PRIMASK_Exit
00561 ;/* restore PRIMASK register */
00562     msr      PRIMASK, r3
00563     b        Test_CPU_SFR_fail
00564 
00565 ;/* FAULTMASK register test: */
00566 Test_FAULTMASK
00567 ;/* step 1:
00568 ; * FAULTMASK registers [:0] will be written with 0x0000.0000
00569 ; * and will be compared to r0 for the test.
00570 ; * step 2:
00571 ; * the inverse pattern 0x0000.0001 is written to the
00572 ; * register and read back to r1 and compared to r0 */
00573 
00574 ;/* save the FAULTMASK register content */
00575     mrs      r3,  FAULTMASK
00576 
00577 ;/* load IEC60335_CPUregTestPOST with test state */
00578     ldr      r8,  =TestStateFAULTMASK
00579     ldr      r10, [r9]
00580     orr      r8,  r8, r10
00581     str      r8,  [r9,#testState]
00582 
00583 ;/* load pattern to FAULTMASK */
00584     mov      r0,  #0
00585     msr      FAULTMASK, r0
00586 ;/* read and compare with r0 */
00587     mrs      r1,  FAULTMASK
00588     cmp      r1,  r0
00589     bne      Test_FAULTMASK_Exit
00590 
00591 ;/* load pattern to FAULTMASK */
00592     mov      r0,  #1
00593     msr      FAULTMASK, r0
00594 ;/* read and compare with r0 */
00595     mrs      r1,  FAULTMASK
00596     cmp      r1,  r0
00597     bne      Test_FAULTMASK_Exit
00598 
00599 Test_FAULTMASK_pass
00600 ;/* restore FAULTMASK register */
00601     msr      FAULTMASK, r3
00602 ;/* continue with result */
00603     b        Test_BASEPRI
00604 
00605 Test_FAULTMASK_Exit
00606 ;/* restore FAULTMASK register */
00607     msr      FAULTMASK, r3
00608     b        Test_CPU_SFR_fail
00609 
00610 ;/* BASEPRI register test: */
00611 Test_BASEPRI
00612 ;/* step 1:
00613 ; * BASEPRI registers [7:0] will be written with pattern7 = 0x0000.00A0
00614 ; * and will be compared to r0 for the test.
00615 ; * step 2:
00616 ; * the inverse pattern pattern8 = 0x0000.0055 is written to the
00617 ; * register and read back to r1 and compared to r0
00618 ; * BASEPRI[4:0] are read as 0 */
00619 
00620 ;/* save the BASEPRI register content */
00621     mrs      r3,  BASEPRI
00622 
00623 ;/* load IEC60335_CPUregTestPOST with test state */
00624     ldr      r8,  =TestStateBASEPRI
00625     ldr      r10, [r9]
00626     orr      r8,  r8, r10
00627     str      r8,  [r9,#testState]
00628 
00629 ;/* load pattern7 to BASEPRI */
00630     ldr      r0,  =pattern7
00631     msr      BASEPRI, r0
00632 ;/* read and compare with r0 */
00633     mrs      r1,  BASEPRI
00634     cmp      r1,  r0
00635     bne      Test_BASEPRI_Exit
00636 
00637 ;/* load pattern8 to BASEPRI */
00638     ldr      r0,  =pattern8
00639     msr      BASEPRI, r0
00640 ;/* read and compare with r0 */
00641     mrs      r1,  BASEPRI
00642     cmp      r1,  r0
00643     bne      Test_BASEPRI_Exit
00644 
00645 Test_BASEPRI_pass
00646 ;/* restore BASEPRI register */
00647     msr      BASEPRI, r3
00648 ;/* load IEC60335_CPUregTestPOST with pass result */
00649     ldr      r0,  =TestResult_pass
00650     str      r0,  [r9,#testResult]
00651 ;/* continue with result */
00652     b        Test_CPU_SFR_Exit
00653 
00654 Test_BASEPRI_Exit
00655 ;    /* Restore the BASEPRI */
00656     msr      BASEPRI, r3
00657     b        Test_CPU_SFR_fail
00658 
00659 Test_r0_Exit
00660 Test_r1_r7_Exit
00661 Test_CPU_SFR_fail
00662 ;/* returns a positiv test result */
00663     ldr      r0,  =TestResult_fail
00664     str      r0,  [r9,#testResult]
00665 
00666 Test_CPU_SFR_Exit
00667 ;/* pop the stack back to registers (atomic instruction) */
00668     pop      {r0-r12,r14}
00669 ;/* branch with exchange back */
00670     bx       lr
00671 ;/* end of CPU SFR registers tests */
00672     NOP
00673     END