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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/arch-shark/irq.h
  3.  *
  4.  * by Alexander Schulz
  5.  *
  6.  * derived from linux/arch/ppc/kernel/i8259.c and:
  7.  * include/asm-arm/arch-ebsa110/irq.h
  8.  * Copyright (C) 1996-1998 Russell King
  9.  */
  10. #include <asm/io.h>
  11. #define fixup_irq(x) (x)
  12. /*
  13.  * 8259A PIC functions to handle ISA devices:
  14.  */
  15. /*
  16.  * This contains the irq mask for both 8259A irq controllers,
  17.  * Let through the cascade-interrupt no. 2 (ff-(1<<2)==fb)
  18.  */
  19. static unsigned char cached_irq_mask[2] = { 0xfb, 0xff };
  20. /*
  21.  * These have to be protected by the irq controller spinlock
  22.  * before being called.
  23.  */
  24. static void shark_disable_8259A_irq(unsigned int irq)
  25. {
  26. unsigned int mask;
  27. if (irq<8) {
  28.   mask = 1 << irq;
  29.   cached_irq_mask[0] |= mask;
  30. } else {
  31.   mask = 1 << (irq-8);
  32.   cached_irq_mask[1] |= mask;
  33. }
  34. outb(cached_irq_mask[1],0xA1);
  35. outb(cached_irq_mask[0],0x21);
  36. }
  37. static void shark_enable_8259A_irq(unsigned int irq)
  38. {
  39. unsigned int mask;
  40. if (irq<8) {
  41.   mask = ~(1 << irq);
  42.   cached_irq_mask[0] &= mask;
  43. } else {
  44.   mask = ~(1 << (irq-8));
  45.   cached_irq_mask[1] &= mask;
  46. }
  47. outb(cached_irq_mask[1],0xA1);
  48. outb(cached_irq_mask[0],0x21);
  49. }
  50. /*
  51.  * Careful! The 8259A is a fragile beast, it pretty
  52.  * much _has_ to be done exactly like this (mask it
  53.  * first, _then_ send the EOI, and the order of EOI
  54.  * to the two 8259s is important!
  55.  */
  56. static void shark_mask_and_ack_8259A_irq(unsigned int irq)
  57. {
  58.         if (irq & 8) {
  59.                 cached_irq_mask[1] |= 1 << (irq-8);
  60. inb(0xA1);              /* DUMMY */
  61.                 outb(cached_irq_mask[1],0xA1);
  62.         } else {
  63.                 cached_irq_mask[0] |= 1 << irq;
  64.                 outb(cached_irq_mask[0],0x21);
  65. }
  66. }
  67. static void bogus_int(int irq, void *dev_id, struct pt_regs *regs)
  68. {
  69. printk("Got interrupt %i!n",irq);
  70. }
  71. static struct irqaction cascade;
  72. static __inline__ void irq_init_irq(void)
  73. {
  74. int irq;
  75. for (irq = 0; irq < NR_IRQS; irq++) {
  76. irq_desc[irq].valid = 1;
  77. irq_desc[irq].probe_ok = 1;
  78. irq_desc[irq].mask_ack = shark_mask_and_ack_8259A_irq;
  79. irq_desc[irq].mask = shark_disable_8259A_irq;
  80. irq_desc[irq].unmask = shark_enable_8259A_irq;
  81. }
  82. /* The PICs are initialized to level triggered and auto eoi!
  83.  * If they are set to edge triggered they lose some IRQs,
  84.  * if they are set to manual eoi they get locked up after
  85.  * a short time
  86.  */
  87. /* init master interrupt controller */
  88. outb(0x19, 0x20); /* Start init sequence, level triggered */
  89.         outb(0x00, 0x21); /* Vector base */
  90.         outb(0x04, 0x21); /* Cascade (slave) on IRQ2 */
  91.         outb(0x03, 0x21); /* Select 8086 mode , auto eoi*/
  92. outb(0x0A, 0x20);
  93. /* init slave interrupt controller */
  94.         outb(0x19, 0xA0); /* Start init sequence, level triggered */
  95.         outb(0x08, 0xA1); /* Vector base */
  96.         outb(0x02, 0xA1); /* Cascade (slave) on IRQ2 */
  97.         outb(0x03, 0xA1); /* Select 8086 mode, auto eoi */
  98. outb(0x0A, 0xA0);
  99. outb(cached_irq_mask[1],0xA1);
  100. outb(cached_irq_mask[0],0x21);
  101. //request_region(0x20,0x2,"pic1");
  102. //request_region(0xA0,0x2,"pic2");
  103. cascade.handler = bogus_int;
  104. cascade.flags = 0;
  105. cascade.mask = 0;
  106. cascade.name = "cascade";
  107. cascade.next = NULL;
  108. cascade.dev_id = NULL;
  109. setup_arm_irq(2,&cascade);
  110. }