/* Compile using; * arm-elf-gcc memtest.S -o memtest.elf -Tmemtest.ld -nostdlib arm-elf-objcopy -O binary memtest.elf memtest.bin */ /* Registers: r0 src r1 dst r2 src end r3-r10 scratch r11 loop counter r12 features */ mem_test: ldr r11, LOOPS mem_loop: /* load DDR */ ldr r0, SRAM_SRC ldr r1, DDR2_BASE add r2, r0, #0x2000 /* 8k */ tst r12, #0x01 beq write_burst write_single: ldr r3, [r0], #4 str r3, [r1], #4 cmp r0, r2 blo write_single b write_done write_burst: ldmia r0!, {r3-r10} stmia r1!, {r3-r10} cmp r0, r2 blo write_burst write_done: /* save DDR */ ldr r0, SRAM_DST ldr r1, DDR2_BASE add r2, r0, #0x2000 /* 8k */ tst r12, #0x02 beq read_burst read_single: ldr r3, [r1], #4 str r3, [r0], #4 cmp r0, r2 blo read_single b read_done read_burst: ldmia r1!, {r3-r10} stmia r0!, {r3-r10} cmp r0, r2 blo read_burst read_done: /* compare */ ldr r0, SRAM_SRC ldr r1, SRAM_DST add r2, r0, #0x2000 /* 8k */ 1: ldr r3, [r0], #4 ldr r4, [r1], #4 cmp r3, r4 bne mem_done cmp r0, r2 blo 1b subs r11, r11, #1 bgt mem_loop mem_done: /* r11 == 0 pass or fail */ nop b mem_done LOOPS: .word 0x000000FF SRAM_SRC: .word 0x78002000 SRAM_DST: .word 0x78004000 DDR2_BASE: .word 0x80000000 //DDR2_BASE: .word 0x10001000