pic.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. * 2021-07-16 JasonHu first version
  9. */
  10. #include "pic.h"
  11. #include <interrupt.h>
  12. void rt_hw_pic_init(void)
  13. {
  14. /* mask all interrupts */
  15. outb(PIC_MASTER_CTLMASK, 0xff);
  16. outb(PIC_SLAVE_CTLMASK, 0xff);
  17. outb(PIC_MASTER_CTL, 0x11);
  18. outb(PIC_MASTER_CTLMASK, 0x20);
  19. outb(PIC_MASTER_CTLMASK, 1 << 2);
  20. outb(PIC_MASTER_CTLMASK, 0x01);
  21. outb(PIC_SLAVE_CTL, 0x11);
  22. outb(PIC_SLAVE_CTLMASK, 0x28);
  23. outb(PIC_SLAVE_CTLMASK, 2);
  24. outb(PIC_SLAVE_CTLMASK, 0x01);
  25. /* mask all interrupts */
  26. outb(PIC_MASTER_CTLMASK, 0xff);
  27. outb(PIC_SLAVE_CTLMASK, 0xff);
  28. }
  29. void rt_hw_pic_enable(int irq)
  30. {
  31. if (irq < 8) /* clear master */
  32. {
  33. outb(PIC_MASTER_CTLMASK, inb(PIC_MASTER_CTLMASK) & ~(1 << irq));
  34. }
  35. else /* clear irq 2 first, then clear slave */
  36. {
  37. outb(PIC_MASTER_CTLMASK, inb(PIC_MASTER_CTLMASK) & ~(1 << PIC_SLAVE_CONNECT_IRQ));
  38. outb(PIC_SLAVE_CTLMASK, inb(PIC_SLAVE_CTLMASK) & ~ (1 << (irq - 8)));
  39. }
  40. }
  41. void rt_hw_pic_disable(int irq)
  42. {
  43. if(irq < 8) /* set master */
  44. {
  45. outb(PIC_MASTER_CTLMASK, inb(PIC_MASTER_CTLMASK) | (1 << irq));
  46. }
  47. else /* set slave */
  48. {
  49. outb(PIC_SLAVE_CTLMASK, inb(PIC_SLAVE_CTLMASK) | (1 << (irq - 8)));
  50. }
  51. }
  52. void rt_hw_pic_ack(int irq)
  53. {
  54. if (irq >= 8) /* slaver */
  55. {
  56. outb(PIC_SLAVE_CTL, PIC_EIO);
  57. }
  58. outb(PIC_MASTER_CTL, PIC_EIO);
  59. }