.macro CPWAIT mrc p15, 0, r0, c2, c0, 0 mov r0, r0 sub pc, pc, #4 .endm disable_interrupts: mrs r0, cpsr orr r0, r0, #0xc0 msr cpsr_c, r0 b flush_cache .space 32 junkdata: .space 0x10000 @ Spare space for data cache flush flush_cache: mov r0, #0x92000000 @ VIRT_START orr r0, #junkdata add r1, r0, #0x10000 1: ldr r2, [r0], #32 teq r0, r1 bne 1b mov r0, #0 mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer mcr p15, 0, r0, c8, c7, 0 @ Invalidate I+D TLB mcr p15, 0, r0, c7, c7, 0 @ Invalidate I+D caches & BTB CPWAIT turn_off_mapping: ldr r2, =0x90092880 @ arm 1M page table entry for 0xa2000000 mov r3, #0xa2000000 @ point to phys page 0xa2000000 orr r3, r3, #0x400 orr r3, r3, #0xa str r3, [r2] @ write 0xa200040a to 0x90092880 @ Force MMU update and invalidate I cache mov r0, #0 mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer mcr p15, 0, r0, c8, c7, 0 @ Invalidate I+D TLB mcr p15, 0, r0, c7, c5, 0 @ Invalidate I cache & BTB CPWAIT jump_to_shared: @ Jump to code with shared virtual/physical mapping mov r0, #0xa2000000 @ PHYS_START orr r0, r0, #0x10000 add r0, r0, #disable_mmu - 0x10000 mov pc, r0 @ jump to PHYS_START + disable_mmu disable_mmu: @ Code is running at a vm address that is the same as its @ physical address. Now disable the MMU. mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #5 @ MMU & Dcache off bic r0, r0, #0x1000 @ Icache off mcr p15, 0, r0, c1, c0, 0 @ disable the MMU & caches CPWAIT mov r0, #0 mcr p15, 0, r0, c13, c0, 0 @ clear PID mcr p15, 0, r0, c8, c7, 0 @ invalidate I+D TLB mcr p15, 0, r0, c7, c5, 0 @ Invalidate I cache & BTB CPWAIT turn_on_backlight: ldr r0, =0x40B00000 @ PWM_CTRL0 mov r1, #1 str r1, [r0] @ PWM_CTRL0 = 1 str r1, [r0, #4] @ PWM_PWDUTY0 = 0xc7 str r1, [r0, #8] @ PWM_PERVAL0 = 0xc8 mov r0, #0x0c000000 @ CPLD ldr r1, [r0, #4] orr r2, r1, #0x80 @ CPLD+4[7] = BL_POWER str r2, [r0, #4] ldr r0, =0x41300004 @ CKEN ldr r1, [r0] orr r2, r1, #1 @ CKEN0_PWM0 bic r2, r2, #0x400 @ USBHOST bic r2, r2, #0x800 @ USB bic r2, r2, #0x1000 @ MMC bic r2, r2, #0x2000 @ FICP bic r2, r2, #0x80000 @ KEYPAD bic r2, r2, #0x800000 @ SSP1 bic r2, r2, #0x1000000 @ CAMERA str r2, [r0] kernel_params: mov r0, #0 ldr r1, =875 @ MTYPE = MAGICIAN ldr r2, =0xa0000100 @ PHYS+0x100 (TAGS) @ MMU is now disabled. Call kernel. ldr r0, =0xa3008000 mov pc, r0 @ PHYS+0x8000