source: rtems/c/src/lib/libbsp/powerpc/shared/irq/i8259.c @ d8999b7

4.104.114.84.95
Last change on this file since d8999b7 was d8999b7, checked in by Jennifer Averett <Jennifer.Averett@…>, on 05/17/05 at 15:06:22

2005-05-17 Jennifer Averett <jennifer.averett@…>

  • clock/p_clock.c, irq/i8259.c, irq/irq.c, irq/irq.h: Modified to use rtems/irq.h.
  • Property mode set to 100644
File size: 4.5 KB
RevLine 
[acc25ee]1
2/*
3 *  This file contains the implementation of the function described in irq.h
4 *  related to Intel 8259 Programmable Interrupt controller.
5 *
6 *  Copyright (C) 1998, 1999 valette@crf.canon.fr
7 *
8 *  The license and distribution terms for this file may be
9 *  found in found in the file LICENSE in this distribution or at
[e831de8]10 *  http://www.rtems.com/license/LICENSE.
[acc25ee]11 *
12 *  $Id$
13 */
[6128a4a]14
[acc25ee]15#include <bsp.h>
16#include <bsp/irq.h>
17
18/*-------------------------------------------------------------------------+
19| Cache for 1st and 2nd PIC IRQ line's status (enabled or disabled) register.
20+--------------------------------------------------------------------------*/
21/*
22 * lower byte is interrupt mask on the master PIC.
23 * while upper bits are interrupt on the slave PIC.
24 */
25volatile rtems_i8259_masks i8259s_cache = 0xfffb;
26
27/*-------------------------------------------------------------------------+
28|         Function:  BSP_irq_disable_at_i8259s
29|      Description: Mask IRQ line in appropriate PIC chip.
30| Global Variables: i8259s_cache
31|        Arguments: vector_offset - number of IRQ line to mask.
[6128a4a]32|          Returns: Nothing.
[acc25ee]33+--------------------------------------------------------------------------*/
[d8999b7]34int BSP_irq_disable_at_i8259s    (const rtems_irq_number irqLine)
[acc25ee]35{
36  unsigned short mask;
37  unsigned int  level;
38
39  if ( ((int)irqLine < BSP_ISA_IRQ_LOWEST_OFFSET) ||
40       ((int)irqLine > BSP_ISA_IRQ_MAX_OFFSET)
41       )
42    return 1;
[6128a4a]43
[acc25ee]44  _CPU_ISR_Disable(level);
[6128a4a]45
[acc25ee]46  mask = 1 << irqLine;
47  i8259s_cache |= mask;
[6128a4a]48
[acc25ee]49  if (irqLine < 8)
50  {
51    outport_byte(PIC_MASTER_IMR_IO_PORT, i8259s_cache & 0xff);
52  }
53  else
54  {
55    outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8));
56  }
57  _CPU_ISR_Enable (level);
58
59  return 0;
[6128a4a]60}
[acc25ee]61
62/*-------------------------------------------------------------------------+
63|         Function:  BSP_irq_enable_at_i8259s
64|      Description: Unmask IRQ line in appropriate PIC chip.
65| Global Variables: i8259s_cache
66|        Arguments: irqLine - number of IRQ line to mask.
[6128a4a]67|          Returns: Nothing.
[acc25ee]68+--------------------------------------------------------------------------*/
[d8999b7]69int BSP_irq_enable_at_i8259s    (const rtems_irq_number irqLine)
[acc25ee]70{
71  unsigned short mask;
72  unsigned int  level;
73
74  if ( ((int)irqLine < BSP_ISA_IRQ_LOWEST_OFFSET) ||
75       ((int)irqLine > BSP_ISA_IRQ_MAX_OFFSET )
76       )
77    return 1;
78
79  _CPU_ISR_Disable(level);
[6128a4a]80
[acc25ee]81  mask = ~(1 << irqLine);
82  i8259s_cache &= mask;
[6128a4a]83
[acc25ee]84  if (irqLine < 8)
85  {
86    outport_byte(PIC_MASTER_IMR_IO_PORT, i8259s_cache & 0xff);
87  }
88  else
89  {
90    outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8));
91  }
92  _CPU_ISR_Enable (level);
93
94  return 0;
95} /* mask_irq */
96
[d8999b7]97int BSP_irq_enabled_at_i8259s           (const rtems_irq_number irqLine)
[acc25ee]98{
99  unsigned short mask;
100
101  if ( ((int)irqLine < BSP_ISA_IRQ_LOWEST_OFFSET) ||
102       ((int)irqLine > BSP_ISA_IRQ_MAX_OFFSET)
103     )
104    return 1;
105
106  mask = (1 << irqLine);
107  return  (~(i8259s_cache & mask));
108}
[6128a4a]109
[acc25ee]110/*-------------------------------------------------------------------------+
111|         Function: BSP_irq_ack_at_i8259s
112|      Description: Signal generic End Of Interrupt (EOI) to appropriate PIC.
113| Global Variables: None.
114|        Arguments: irqLine - number of IRQ line to acknowledge.
[6128a4a]115|          Returns: Nothing.
[acc25ee]116+--------------------------------------------------------------------------*/
[d8999b7]117int BSP_irq_ack_at_i8259s       (const rtems_irq_number irqLine)
[acc25ee]118{
119  if (irqLine >= 8) {
120    outport_byte(PIC_MASTER_COMMAND_IO_PORT, SLAVE_PIC_EOSI);
121    outport_byte(PIC_SLAVE_COMMAND_IO_PORT, (PIC_EOSI | (irqLine - 8)));
122  }
123  else {
124    outport_byte(PIC_MASTER_COMMAND_IO_PORT, (PIC_EOSI | irqLine));
125  }
126
127  return 0;
128
129} /* ackIRQ */
130
131void BSP_i8259s_init(void)
132{
133  /*
134   * init master 8259 interrupt controller
135   */
136  outport_byte(PIC_MASTER_COMMAND_IO_PORT, 0x11); /* Start init sequence */
137  outport_byte(PIC_MASTER_IMR_IO_PORT, 0x00);/* Vector base  = 0 */
138  outport_byte(PIC_MASTER_IMR_IO_PORT, 0x04);/* edge tiggered, Cascade (slave) on IRQ2 */
139  outport_byte(PIC_MASTER_IMR_IO_PORT, 0x01);/* Select 8086 mode */
140  outport_byte(PIC_MASTER_IMR_IO_PORT, 0xFB); /* Mask all except cascade */
141  /*
142   * init slave  interrupt controller
143   */
144  outport_byte(PIC_SLAVE_COMMAND_IO_PORT, 0x11); /* Start init sequence */
145  outport_byte(PIC_SLAVE_IMR_IO_PORT, 0x08);/* Vector base  = 8 */
146  outport_byte(PIC_SLAVE_IMR_IO_PORT, 0x02);/* edge triggered, Cascade (slave) on IRQ2 */
147  outport_byte(PIC_SLAVE_IMR_IO_PORT, 0x01); /* Select 8086 mode */
148  outport_byte(PIC_SLAVE_IMR_IO_PORT, 0xFF); /* Mask all */
[6128a4a]149
[acc25ee]150}
Note: See TracBrowser for help on using the repository browser.