interrupt.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2006-08-23 Bernard first version
  9. */
  10. #include <rtthread.h>
  11. #include "AT91SAM7S.h"
  12. #define MAX_HANDLERS 32
  13. rt_inline rt_bool_t _interrupt_vector_is_valid(int vector)
  14. {
  15. return (vector >= 0) && (vector < MAX_HANDLERS);
  16. }
  17. extern rt_atomic_t rt_interrupt_nest;
  18. rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
  19. rt_uint32_t rt_thread_switch_interrupt_flag;
  20. /**
  21. * @addtogroup AT91SAM7
  22. */
  23. /*@{*/
  24. void rt_hw_interrupt_handler(int vector)
  25. {
  26. rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector);
  27. }
  28. /**
  29. * This function will initialize hardware interrupt
  30. */
  31. void rt_hw_interrupt_init()
  32. {
  33. rt_base_t index;
  34. for (index = 0; index < MAX_HANDLERS; index ++)
  35. {
  36. AT91C_AIC_SVR(index) = (rt_uint32_t)rt_hw_interrupt_handler;
  37. }
  38. /* init interrupt nest, and context in thread sp */
  39. rt_interrupt_nest = 0;
  40. rt_interrupt_from_thread = 0;
  41. rt_interrupt_to_thread = 0;
  42. rt_thread_switch_interrupt_flag = 0;
  43. }
  44. /**
  45. * This function will mask a interrupt.
  46. * @param vector the interrupt number
  47. */
  48. void rt_hw_interrupt_mask(int vector)
  49. {
  50. if (!_interrupt_vector_is_valid(vector))
  51. {
  52. return;
  53. }
  54. /* disable interrupt */
  55. AT91C_AIC_IDCR = 1 << vector;
  56. /* clear interrupt */
  57. AT91C_AIC_ICCR = 1 << vector;
  58. }
  59. /**
  60. * This function will un-mask a interrupt.
  61. * @param vector the interrupt number
  62. */
  63. void rt_hw_interrupt_umask(int vector)
  64. {
  65. if (!_interrupt_vector_is_valid(vector))
  66. {
  67. return;
  68. }
  69. AT91C_AIC_IECR = 1 << vector;
  70. }
  71. /**
  72. * This function will install a interrupt service routine to a interrupt.
  73. * @param vector the interrupt number
  74. * @param new_handler the interrupt service routine to be installed
  75. * @param old_handler the old interrupt service routine
  76. */
  77. void rt_hw_interrupt_install(int vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler)
  78. {
  79. if(vector >= 0 && vector < MAX_HANDLERS)
  80. {
  81. if (*old_handler != RT_NULL) *old_handler = (rt_isr_handler_t)AT91C_AIC_SVR(vector);
  82. if (new_handler != RT_NULL) AT91C_AIC_SVR(vector) = (rt_uint32_t)new_handler;
  83. }
  84. }
  85. /*@}*/