interrupt.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020/11/18 greedyhao Bluetrum RISC-V porting code.
  9. */
  10. #include <rtthread.h>
  11. #include <stdbool.h>
  12. #include <rthw.h>
  13. #include "ab32vgx.h"
  14. uint32_t irq_mask AT(.bss.irq_tbl);
  15. void *tbl_irq_vector[IRQ_TOTAL_NUM] AT(.bss.irq_tbl);
  16. void (*cpu_irq_comm_hook)(void);
  17. void set_cpu_irq_comm(void (*irq_hook)(void))
  18. {
  19. cpu_irq_comm_hook = irq_hook;
  20. }
  21. AT(.com_text.irq)
  22. void cpu_irq_comm_do(void)
  23. {
  24. void (*pfnct)(void);
  25. uint32_t irq_pend = PICPND & irq_mask;
  26. for (int i = 0; i < IRQ_TOTAL_NUM; i++) {
  27. if (irq_pend & BIT(i)) {
  28. pfnct = tbl_irq_vector[i];
  29. if (pfnct) {
  30. pfnct(); /* call ISR */
  31. }
  32. }
  33. }
  34. }
  35. void rt_hw_interrupt_init(void)
  36. {
  37. }
  38. /**
  39. * @brief This function will install a interrupt service routine to a interrupt.
  40. *
  41. * @param vector
  42. * @param handler
  43. * @param param
  44. * @param name
  45. * @return rt_isr_handler_t
  46. */
  47. rt_isr_handler_t rt_hw_interrupt_install(int vector,
  48. rt_isr_handler_t handler,
  49. void *param,
  50. const char *name)
  51. {
  52. rt_isr_handler_t old_handler = RT_NULL;
  53. if (vector < IRQ_TOTAL_NUM) {
  54. uint32_t cpu_ie = PICCON&BIT(0);
  55. PICCON &= ~BIT(0);
  56. old_handler = tbl_irq_vector[vector];
  57. tbl_irq_vector[vector] = handler;
  58. irq_mask |= BIT(vector);
  59. PICCON |= cpu_ie;
  60. PICPR &= ~BIT(vector);
  61. PICEN |= BIT(vector);
  62. }
  63. return old_handler;
  64. }