![]() |
Energy Micro IEC60355 Library Project 1.037 GCC-Version
IEC60355 Library documentation and API
|
00001 ;/***************************************************************************/ 00030 SECTION .text:CODE 00031 THUMB 00032 ;/* functions exported */ 00033 PUBLIC ASMCPUregTestPOST 00034 00035 ;/* external struct */ 00036 EXTERN 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