49 for(
unsigned int idx = 0; idx <
extirqs.size(); idx++)
69 if(
extirqs[idx]->mustSetFlagOnFire())
94 return !
extirqs[idx]->mustSetFlagOnFire();
106 for(
unsigned int idx = 0; idx <
extirqs.size(); idx++)
113 for(
unsigned int idx = 0; idx <
irqbits.size(); idx++) {
114 unsigned char m = 1 <<
irqbits[idx];
115 if(((nv & m) != 0) &&
144 bitshift = ctrlOffset;
145 mask = ((1 << ctrlBits) - 1) << bitshift;
151 ChangeMode((nv & mask) >> bitshift);
156 return (v & ~mask) | (mode << bitshift);
189 if((s ==
false) && (
state ==
true))
194 if((s ==
true) && (
state ==
false))
209 avr_warning(
"External irq mode ISCx1:ISCx0 = 0:1 isn't supported here");
224 for(
unsigned int idx = 0; idx < 8; idx++) {
226 Pin *p = &port->
GetPin((
unsigned char)idx);
228 state[idx] = (bool)*p;
242 for(
unsigned int idx = 0; idx < 8; idx++) {
244 Pin *p = pinList[idx];
246 state[idx] = (bool)*p;
261 unsigned int idx = 0;
263 for(; idx <
portSize; idx++, m <<= 1) {
264 if(pin ==
pins[idx]) {
266 if(((m &
mode) != 0) && (s !=
state[idx]))
virtual void ClearIrqFlag(unsigned int vector)
Basic AVR device, contains the core functionality.
void PinStateHasChanged(Pin *pin)
virtual unsigned char get_from_client(const IOSpecialReg *reg, unsigned char v)
Pin * pins[8]
pins of port for identifying, which bit is changed
void hardwareChangeMask(unsigned char val, unsigned char mask)
ExternalIRQHandler(AvrDevice *core, HWIrqSystem *irqsys, IOSpecialReg *mask, IOSpecialReg *flag)
Pin class, handles input and output to external parts.
std::vector< int > irqbits
mapping index to mask bit
std::vector< ExternalIRQ * > extirqs
list with external IRQ's
void registerIrq(int vector, int irqBit, ExternalIRQ *extirq)
Pin & GetPin(unsigned char pinNo)
returns a pin reference of pin with pin number
Defines a Port, e.g. a hardware device for GPIO.
void ChangeMode(unsigned char m)
Handle change of control register.
std::map< int, int > vector2idx
mapping irq vector to index
Fire interrupt on low level.
bool fireAgain(void)
does the interrupt source fire again? (for interrupt on level)
void setHandlerIndex(ExternalIRQHandler *h, int idx)
register handler and index for signaling interrupt
IOSpecialReg * flag_reg
the interrupt flag register
bool twoBitMode
IRQ is controlled by 2 mode bits.
void connectSRegClient(IOSpecialRegClient *c)
Registers a client to this IO register to inform this client on read or write access.
bool mode8515
at90s8515 don't support MODE_EDGE_ALL
bool mustSetFlagOnFire(void)
does fire interrupt set the interrupt flag? (level interrupt does this not!)
virtual void ResetMode(void)
Reset mode.
Basic handler for one external IRQ, handles control register.
void SetIrqFlag(Hardware *, unsigned int vector_index)
void fireInterrupt(void)
fire a interrupt
virtual unsigned char set_from_reg(const IOSpecialReg *reg, unsigned char nv)
ExternalIRQPort(IOSpecialReg *ctrl, HWPort *port)
bool state
saved state from pin
virtual unsigned char set_from_reg(const IOSpecialReg *reg, unsigned char nv)
bool state[8]
saved states from all pins
void PinStateHasChanged(Pin *pin)
IOSpecialReg * mask_reg
the interrupt mask register
int GetPortSize(void)
returns, how much bits this port controls
void fireInterrupt(int idx)
fire a interupt from IRQ with index
void RegisterCallback(HasPinNotifyFunction *)
Fire interrupt on falling edge.
std::vector< int > vectors
mapping index to vector
Fire interrupt on rising edge.
unsigned char irq_mask
mask register value for registered IRQ's
unsigned int portSize
how much pins the port controls
HWIrqSystem * irqsystem
pointer to irq system
void DebugVerifyInterruptVector(unsigned int vector_index, const Hardware *source)
In datasheets RESET vector is index 1 but we use 0! And not a byte address.
unsigned char irq_flag
flag register value for registered IRQ's
ExternalIRQ(IOSpecialReg *ctrl, int ctrlOffset, int ctrlBits)
virtual unsigned char get_from_client(const IOSpecialReg *reg, unsigned char v)
Fire interrupt on any logical change.
unsigned char reg_mask
mask for relevant bits in flag and mask register
virtual bool LevelInterruptPending(unsigned int vector)
void ClearIrqFlag(unsigned int vector_index)
ExternalIRQSingle(IOSpecialReg *ctrl, int ctrlOffset, int ctrlBits, Pin *pin, bool _8515mode=false)
virtual bool IsLevelInterrupt(unsigned int vector)
unsigned char mode
control mode from control register