simulavr  1.1.0
externalirq.h
Go to the documentation of this file.
1 /*
2  ****************************************************************************
3  *
4  * simulavr - A simulator for the Atmel AVR family of microcontrollers.
5  * Copyright (C) 2001, 2002, 2003 Klaus Rudolph
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  ****************************************************************************
22  *
23  * $Id$
24  */
25 
26 #ifndef EXTERNALIRQ_INCLUDED
27 #define EXTERNALIRQ_INCLUDED
28 
29 #include <vector>
30 
31 #include "hardware.h"
32 #include "irqsystem.h"
33 #include "rwmem.h"
34 #include "avrdevice.h"
35 #include "pinnotify.h"
36 #include "hwport.h"
37 
38 class ExternalIRQ;
39 
42 
43  protected:
47  std::vector<ExternalIRQ*> extirqs;
48  unsigned char irq_mask;
49  unsigned char irq_flag;
50  unsigned char reg_mask;
51  std::vector<int> vectors;
52  std::vector<int> irqbits;
53  std::map<int, int> vector2idx;
54 
55  void fireInterrupt(int idx);
56 
57  friend class ExternalIRQ;
58 
59  public:
62  void registerIrq(int vector, int irqBit, ExternalIRQ* extirq);
63 
64  // from Hardware
65  virtual void ClearIrqFlag(unsigned int vector);
66  virtual void Reset(void);
67  virtual bool IsLevelInterrupt(unsigned int vector);
68  virtual bool LevelInterruptPending(unsigned int vector);
69 
70  // from IOSpecialRegClient
71  virtual unsigned char set_from_reg(const IOSpecialReg* reg, unsigned char nv);
72  virtual unsigned char get_from_client(const IOSpecialReg* reg, unsigned char v);
73 
74 };
75 
78 
79  protected:
82  int bitshift;
83  unsigned char mask;
84  unsigned char mode;
85 
87  void setHandlerIndex(ExternalIRQHandler *h, int idx) { handler = h; handlerIndex = idx; }
89  void fireInterrupt(void) { handler->fireInterrupt(handlerIndex); }
91  virtual void ResetMode(void) { mode = 0; }
93  virtual void ChangeMode(unsigned char m) { mode = m; }
95  virtual bool fireAgain(void) { return false; }
97  virtual bool mustSetFlagOnFire(void) { return true; }
98 
99  friend class ExternalIRQHandler;
100 
101  public:
102  ExternalIRQ(IOSpecialReg *ctrl, int ctrlOffset, int ctrlBits);
103 
104  // from IOSpecialRegClient
105  virtual unsigned char set_from_reg(const IOSpecialReg* reg, unsigned char nv);
106  virtual unsigned char get_from_client(const IOSpecialReg* reg, unsigned char v);
107 };
108 
111 
112  protected:
113  bool state;
114  bool twoBitMode;
115  bool mode8515;
116 
117  enum {
118  MODE_LEVEL_LOW = 0,
119  MODE_EDGE_ALL = 1,
120  MODE_EDGE_FALL = 2,
121  MODE_EDGE_RISE = 3
122  };
123 
124  public:
125  ExternalIRQSingle(IOSpecialReg *ctrl, int ctrlOffset, int ctrlBits, Pin *pin, bool _8515mode = false);
126 
127  // from ExternalIRQ
128  void ChangeMode(unsigned char m);
129  bool fireAgain(void);
130  bool mustSetFlagOnFire(void);
131 
132  // from HasPinNotifyFunction
133  void PinStateHasChanged(Pin *pin);
134 };
135 
138 
139  protected:
140  bool state[8];
141  Pin* pins[8];
142  unsigned int portSize;
143 
144  public:
145  ExternalIRQPort(IOSpecialReg *ctrl, HWPort *port);
146  ExternalIRQPort(IOSpecialReg *ctrl, Pin* pinList[8]);
147 
148  // from HasPinNotifyFunction
149  void PinStateHasChanged(Pin *pin);
150 };
151 
152 #endif
virtual void ClearIrqFlag(unsigned int vector)
Definition: externalirq.cpp:76
Basic AVR device, contains the core functionality.
Definition: avrdevice.h:66
ExternalIRQHandler(AvrDevice *core, HWIrqSystem *irqsys, IOSpecialReg *mask, IOSpecialReg *flag)
Definition: externalirq.cpp:29
Pin class, handles input and output to external parts.
Definition: pin.h:98
std::vector< int > irqbits
mapping index to mask bit
Definition: externalirq.h:52
std::vector< ExternalIRQ * > extirqs
list with external IRQ&#39;s
Definition: externalirq.h:47
void registerIrq(int vector, int irqBit, ExternalIRQ *extirq)
Definition: externalirq.cpp:53
Defines a Port, e.g. a hardware device for GPIO.
Definition: hwport.h:43
int bitshift
how many bits to shift to get mode from control register
Definition: externalirq.h:82
ExternalIRQHandler * handler
reference to IRQ handler
Definition: externalirq.h:81
std::map< int, int > vector2idx
mapping irq vector to index
Definition: externalirq.h:53
void setHandlerIndex(ExternalIRQHandler *h, int idx)
register handler and index for signaling interrupt
Definition: externalirq.h:87
Handler for external IRQ&#39;s to communicate with IRQ system and mask/flag registers.
Definition: externalirq.h:41
IOSpecialReg * flag_reg
the interrupt flag register
Definition: externalirq.h:46
virtual void ChangeMode(unsigned char m)
Handle change of control register.
Definition: externalirq.h:93
Interface class to connect hardware units to control registers.
Definition: rwmem.h:398
bool twoBitMode
IRQ is controlled by 2 mode bits.
Definition: externalirq.h:114
virtual bool mustSetFlagOnFire(void)
does fire interrupt set the interrupt flag? (level interrupt does this not!)
Definition: externalirq.h:97
bool mode8515
at90s8515 don&#39;t support MODE_EDGE_ALL
Definition: externalirq.h:115
virtual void ResetMode(void)
Reset mode.
Definition: externalirq.h:91
virtual bool fireAgain(void)
does the interrupt source fire again? (for interrupt on level)
Definition: externalirq.h:95
Basic handler for one external IRQ, handles control register.
Definition: externalirq.h:77
void fireInterrupt(void)
fire a interrupt
Definition: externalirq.h:89
virtual unsigned char set_from_reg(const IOSpecialReg *reg, unsigned char nv)
virtual void Reset(void)
bool state
saved state from pin
Definition: externalirq.h:113
IOSpecialReg * mask_reg
the interrupt mask register
Definition: externalirq.h:45
void fireInterrupt(int idx)
fire a interupt from IRQ with index
Definition: externalirq.cpp:67
unsigned char mask
mask for extract mode from control register
Definition: externalirq.h:83
int handlerIndex
my own index on handler instance
Definition: externalirq.h:80
std::vector< int > vectors
mapping index to vector
Definition: externalirq.h:51
unsigned char irq_mask
mask register value for registered IRQ&#39;s
Definition: externalirq.h:48
unsigned int portSize
how much pins the port controls
Definition: externalirq.h:142
HWIrqSystem * irqsystem
pointer to irq system
Definition: externalirq.h:44
unsigned char irq_flag
flag register value for registered IRQ&#39;s
Definition: externalirq.h:49
virtual unsigned char get_from_client(const IOSpecialReg *reg, unsigned char v)
unsigned char reg_mask
mask for relevant bits in flag and mask register
Definition: externalirq.h:50
virtual bool LevelInterruptPending(unsigned int vector)
Definition: externalirq.cpp:97
Pin-change interrupt on all pins of a port.
Definition: externalirq.h:137
virtual bool IsLevelInterrupt(unsigned int vector)
Definition: externalirq.cpp:91
unsigned char mode
control mode from control register
Definition: externalirq.h:84
External interrupt (INT0, INT1...) on a single pin, one and 2 bit configuration.
Definition: externalirq.h:110
friend class ExternalIRQ
Definition: externalirq.h:57