Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .syntax unified
- irq_vector = 0x4030ce38
- int_timer0 = 66
- intc_base = 0x48200000
- intc_sysconfig = 0x10
- intc_sysstatus = 0x14
- intc_sir_irq = 0x40
- intc_control = 0x48
- intc_bank_base = 0x80
- intc_bank_size = 0x20
- intc_bank_mir_clear = 0x08
- intc_bank_mir_set = 0x0C
- intc_bank_isr_set = 0x10
- intc_bank_isr_clear = 0x14
- intc_bank_pending_irq = 0x18
- intc_bank_timer0_base = intc_base + intc_bank_base + int_timer0 / 32 * intc_bank_size
- intc_bank_timer0_mask = 1 << (int_timer0 % 32)
- gpio1_base = 0x4804c000
- gpio_oe = 0x0134
- gpio_cleardataout = 0x0190
- gpio_setdataout = 0x0194
- .text
- .global start
- start:
- /*
- * Interrupt controller setup
- */
- ldr r1, =intc_base
- /* Reset */
- mov r2, 2
- str r2, [r1, intc_sysconfig]
- /* Wait for reset */
- intc_wait:
- ldr r2, [r1, intc_sysstatus]
- ands r2, 1
- beq intc_wait
- /*
- * ISR setup
- */
- ldr r1, =irq_vector
- ldr r2, =isr
- str r2, [r1]
- /* Enable interrupts on the CPU */
- cpsie i
- /* Trigger timer interrupt */
- ldr r1, =intc_bank_timer0_base
- ldr r2, =intc_bank_timer0_mask
- str r2, [r1, intc_bank_isr_set]
- /* Wait for exceptions indefinitely */
- loop:
- wfe
- b loop
- /*
- * Interrupt service routine
- */
- isr:
- /* Save registers */
- push {r1, r2}
- /* Light the LEDs */
- ldr r1, =gpio1_base
- ldr r2, =0xfe1fffff
- str r2, [r1, gpio_oe]
- mvn r2, r2
- str r2, [r1, gpio_cleardataout]
- str r2, [r1, gpio_setdataout]
- isr_exit:
- /* Deassert software IRQ */
- ldr r1, =intc_bank_timer0_base
- ldr r2, =intc_bank_timer0_mask
- str r2, [r1, intc_bank_isr_clear]
- /* Enable new IRQs */
- ldr r1, =intc_base
- mov r2, 1 /* IRQ */
- str r2, [r1, intc_control]
- /* Data Synchronization Barrier mov r1, #0 */
- mcr p15, 0, r1, c7, c10, 4
- /* Restore registers */
- pop {r1, r2}
- /* Return from exception */
- subs pc, lr, 4
- pool:
- .pool
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement