misc: Fixes clang warnings
[simavr] / simavr / sim / avr_extint.h
1 /*
2         avr_extint.h
3
4         External Interrupt Handling (for INT0-3)
5
6         Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
7
8         This file is part of simavr.
9
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.
14
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.
19
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/>.
22  */
23
24 #ifndef AVR_EXTINT_H_
25 #define AVR_EXTINT_H_
26
27 #include "sim_avr.h"
28
29
30 enum {
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,
34         EXTINT_IRQ_OUT_INT7,
35         EXTINT_COUNT
36 };
37
38 // Get the internal IRQ corresponding to the INT
39 #define AVR_IOCTL_EXTINT_GETIRQ() AVR_IOCTL_DEF('i','n','t',' ')
40
41 /*
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
44  *
45  * "isc" is handled, apart from the "level" mode that doesn't make sense here (?)
46  */
47 typedef struct avr_extint_t {
48         avr_io_t        io;
49
50         struct {
51                 avr_regbit_t    isc[2];         // interrupt sense control bits
52                 avr_int_vector_t vector;        // interrupt vector
53
54                 uint32_t                port_ioctl;             // ioctl to use to get port
55                 uint8_t                 port_pin;               // pin number in said port
56         }       eint[EXTINT_COUNT];
57
58 } avr_extint_t;
59
60 void avr_extint_init(avr_t * avr, avr_extint_t * p);
61
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) \
66                 .eint[_index] = { \
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) },\
70                         .vector = { \
71                                 .enable = AVR_IO_REGBIT(EIMSK, INT##_index), \
72                                 .raised = AVR_IO_REGBIT(EIFR, INTF##_index), \
73                                 .vector = INT##_index##_vect, \
74                         },\
75                 }
76
77 #define AVR_EXTINT_TINY_DECLARE(_index, _portname, _portpin, _IFR) \
78                 .eint[_index] = { \
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) }, \
82                         .vector = { \
83                                 .enable = AVR_IO_REGBIT(GIMSK, INT##_index), \
84                                 .raised = AVR_IO_REGBIT(_IFR, INTF##_index), \
85                                 .vector = INT##_index##_vect, \
86                         }, \
87                 }
88
89 #endif /* AVR_EXTINT_H_ */