int-handler.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/mips/philips/nino/int-handler.S
  3.  *
  4.  *  Copyright (C) 1999 Harald Koerfgen
  5.  *  Copyright (C) 2000 Jim Pick (jim@jimpick.com)
  6.  *  Copyright (C) 2001 Steven J. Hill (sjhill@realitydiluted.com)
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License version 2 as
  10.  * published by the Free Software Foundation.
  11.  *
  12.  *  Interrupt handler for Philips Nino.
  13.  */
  14. #include <asm/asm.h>
  15. #include <asm/regdef.h>
  16. #include <asm/mipsregs.h>
  17. #include <asm/stackframe.h>
  18. #include <asm/tx3912.h>
  19. .data
  20.         .globl  HighPriVect
  21. HighPriVect: .word   spurious        # Reserved
  22.         .word   io_posnegint0   # IOPOSINT(0) or IONEGINT(0)
  23.         .word   spurious        # CHIDMACNTINT
  24.         .word   spurious        # TELDMACNTINT
  25.         .word   spurious        # SNDDMACNTINT
  26.         .word   spurious        # Reserved
  27.         .word   io_negint56     # IONEGINT(6) or IONEGINT(5)
  28.         .word   spurious        # Reserved
  29.         .word   io_posint56     # IOPOSINT(6) or IOPOSINT(5)
  30.         .word   spurious        # Reserved
  31.         .word   spurious        # UARTBRXINT
  32.         .word   uarta_rx        # UARTARXINT
  33.         .word   spurious        # Reserved
  34.         .word   periodic_timer  # PERINT
  35.         .word   spurious        # ALARMINT
  36.         .word   spurious        # POSPWROKINT or NEGPWROKINT
  37. /*
  38.  *  Here is the entry point to handle all interrupts.
  39.  */
  40. .text
  41. .set noreorder
  42. .align 5
  43. NESTED(nino_handle_int, PT_SIZE, ra)
  44. .set noat
  45. SAVE_ALL
  46. CLI
  47. .set at
  48. /*
  49.  * Get pending Interrupts
  50.  */
  51. mfc0 t0, CP0_CAUSE # Get pending interrupts
  52. andi t2, t0, IE_IRQ4 # IRQ4 (high priority)
  53. bne t2, IE_IRQ4, low_priority
  54. nop
  55. /*
  56.  *  Ok, we've got a high priority interrupt (a.k.a. an external interrupt).
  57.  *  Read Interrupt Status Register 6 to get vector.
  58.  */
  59. high_priority:
  60. lui t0, %hi(IntStatus6)
  61. lw t1, %lo(IntStatus6)(t0)
  62. andi t1, INT6_INTVECT
  63. la t2, HighPriVect
  64. addu t1, t1, t2
  65. lw t2, 0(t1)
  66. jr t2
  67. nop
  68. /*
  69.  * Ok, we've got one of over a hundred other interupts.
  70.  */
  71. low_priority:
  72. lui t0, %hi(IntStatus1)
  73. lw t1, %lo(IntStatus1)(t0)
  74. j handle_it
  75. li a0, 20
  76. /*
  77.  * We don't currently handle spurious interrupts.
  78.  */
  79. spurious:
  80. j spurious_interrupt
  81. nop
  82. /*
  83.  * We have the IRQ number, dispatch to the real handler.
  84.  */
  85. handle_it: jal do_IRQ
  86. move a1,sp
  87. j ret_from_irq
  88. nop
  89. /************************************
  90.  * High priority interrupt mappings *
  91.  ************************************/
  92. /* 
  93.  *  Periodic timer - IRQ 0
  94.  */
  95. periodic_timer:
  96. j handle_it
  97. li a0, 0
  98. /* 
  99.  *  UARTA RX - IRQ 3
  100.  */
  101. uarta_rx:
  102. j handle_it
  103. li a0, 3
  104. /* 
  105.  *  GPIO Pin 0 transition - IRQ 10
  106.  */
  107. io_posnegint0:
  108. j handle_it
  109. li a0, 10
  110. /* 
  111.  *  GPIO Pin 5 or 6 transition (0-to-1) - IRQ 11
  112.  */
  113. io_posint56:
  114. j handle_it
  115. li a0, 11
  116. /*
  117.  *  GPIO Pin 5 or 6 transition (1-to-0) - IRQ 12
  118.  */
  119. io_negint56:
  120. j handle_it
  121. li a0, 12
  122. END(nino_handle_int)