Advertisement
spbnick

light_leds_softirq.s

Nov 12th, 2013
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 2.17 KB | None | 0 0
  1. .syntax unified
  2.  
  3. irq_vector              = 0x4030ce38
  4.  
  5. int_timer0              = 66
  6.  
  7. intc_base               = 0x48200000
  8. intc_sysconfig          = 0x10
  9. intc_sysstatus          = 0x14
  10. intc_sir_irq            = 0x40
  11. intc_control            = 0x48
  12. intc_bank_base          = 0x80
  13. intc_bank_size          = 0x20
  14. intc_bank_mir_clear     = 0x08
  15. intc_bank_mir_set       = 0x0C
  16. intc_bank_isr_set       = 0x10
  17. intc_bank_isr_clear     = 0x14
  18. intc_bank_pending_irq   = 0x18
  19. intc_bank_timer0_base   = intc_base + intc_bank_base + int_timer0 / 32 * intc_bank_size
  20. intc_bank_timer0_mask   = 1 << (int_timer0 % 32)
  21.  
  22. gpio1_base              = 0x4804c000
  23. gpio_oe                 = 0x0134
  24. gpio_cleardataout       = 0x0190
  25. gpio_setdataout         = 0x0194
  26.  
  27. .text
  28. .global start
  29. start:
  30.  
  31.     /*
  32.      * Interrupt controller setup
  33.      */
  34.     ldr r1, =intc_base
  35.  
  36.     /* Reset */
  37.     mov r2, 2
  38.     str r2, [r1, intc_sysconfig]
  39.  
  40.     /* Wait for reset */
  41. intc_wait:
  42.     ldr r2, [r1, intc_sysstatus]
  43.     ands r2, 1
  44.     beq intc_wait
  45.  
  46.     /*
  47.      * ISR setup
  48.      */
  49.     ldr r1, =irq_vector
  50.     ldr r2, =isr
  51.     str r2, [r1]
  52.  
  53.     /* Enable interrupts on the CPU */
  54.     cpsie i
  55.  
  56.     /* Trigger timer interrupt */
  57.     ldr r1, =intc_bank_timer0_base
  58.     ldr r2, =intc_bank_timer0_mask
  59.     str r2, [r1, intc_bank_isr_set]
  60.  
  61.     /* Wait for exceptions indefinitely */
  62. loop:
  63.     wfe
  64.     b loop
  65.  
  66.     /*
  67.      * Interrupt service routine
  68.      */
  69. isr:
  70.     /* Save registers */
  71.     push {r1, r2}
  72.  
  73.     /* Light the LEDs */
  74.     ldr r1, =gpio1_base
  75.     ldr r2, =0xfe1fffff
  76.     str r2, [r1, gpio_oe]
  77.     mvn r2, r2
  78.     str r2, [r1, gpio_cleardataout]
  79.     str r2, [r1, gpio_setdataout]
  80.  
  81. isr_exit:
  82.     /* Deassert software IRQ */
  83.     ldr r1, =intc_bank_timer0_base
  84.     ldr r2, =intc_bank_timer0_mask
  85.     str r2, [r1, intc_bank_isr_clear]
  86.  
  87.     /* Enable new IRQs */
  88.     ldr r1, =intc_base
  89.     mov r2, 1                           /* IRQ */
  90.     str r2, [r1, intc_control]
  91.  
  92.     /* Data Synchronization Barrier mov r1, #0 */
  93.     mcr p15, 0, r1, c7, c10, 4
  94.  
  95.     /* Restore registers */
  96.     pop {r1, r2}
  97.  
  98.     /* Return from exception */
  99.     subs pc, lr, 4
  100.  
  101. pool:
  102. .pool
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement