4 External Interrupt Handling (for INT0-3)
6 Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
8 This file is part of simavr.
10 simavr is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
15 simavr is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with simavr. If not, see <http://www.gnu.org/licenses/>.
31 EXTINT_IRQ_OUT_INT0 = 0,
32 EXTINT_IRQ_OUT_INT1, EXTINT_IRQ_OUT_INT2, EXTINT_IRQ_OUT_INT3,
33 EXTINT_IRQ_OUT_INT4, EXTINT_IRQ_OUT_INT5, EXTINT_IRQ_OUT_INT6,
38 // Get the internal IRQ corresponding to the INT
39 #define AVR_IOCTL_EXTINT_GETIRQ() AVR_IOCTL_DEF('i','n','t',' ')
42 * This module is just a "relay" for the pin change IRQ in the IO port
43 * module. We hook up to their IRQ and raise out interrupt vectors as needed
45 * "isc" is handled, apart from the "level" mode that doesn't make sense here (?)
47 typedef struct avr_extint_t {
51 avr_regbit_t isc[2]; // interrupt sense control bits
52 avr_int_vector_t vector; // interrupt vector
54 uint32_t port_ioctl; // ioctl to use to get port
55 uint8_t port_pin; // pin number in said port
60 void avr_extint_init(avr_t * avr, avr_extint_t * p);
62 // Declares a typical INT into a avr_extint_t in a core.
63 // this is a shortcut since INT declarations are pretty standard.
64 // The Tinies are slightly different. see sim_tinyx5.h
65 #define AVR_EXTINT_DECLARE(_index, _portname, _portpin) \
67 .port_ioctl = AVR_IOCTL_IOPORT_GETIRQ(_portname), \
68 .port_pin = _portpin, \
69 .isc = { AVR_IO_REGBIT(EICRA, ISC##_index##0), AVR_IO_REGBIT(EICRA, ISC##_index##1) },\
71 .enable = AVR_IO_REGBIT(EIMSK, INT##_index), \
72 .raised = AVR_IO_REGBIT(EIFR, INTF##_index), \
73 .vector = INT##_index##_vect, \
77 #define AVR_EXTINT_TINY_DECLARE(_index, _portname, _portpin, _IFR) \
79 .port_ioctl = AVR_IOCTL_IOPORT_GETIRQ(_portname), \
80 .port_pin = _portpin, \
81 .isc = { AVR_IO_REGBIT(MCUCR, ISC##_index##0), AVR_IO_REGBIT(MCUCR, ISC##_index##1) }, \
83 .enable = AVR_IO_REGBIT(GIMSK, INT##_index), \
84 .raised = AVR_IO_REGBIT(_IFR, INTF##_index), \
85 .vector = INT##_index##_vect, \
89 #endif /* AVR_EXTINT_H_ */