4 Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
6 This file is part of simavr.
8 simavr is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 simavr is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with simavr. If not, see <http://www.gnu.org/licenses/>.
30 * This subsystem allow any piece of code to "register" a hook to be called when an IRQ is
31 * raised. The IRQ definition is up to the module defining it, for example a IOPORT pin change
32 * might be an IRQ in wich case any oiece of code can be notified when a pin has changed state
34 * The notify hooks are chained, and duplicates are filtered out so you can't register a
35 * notify hook twice on one particylar IRQ
37 * IRQ calling order is not defined, so don't rely on it.
39 * IRQ hook needs to be registered in reset() handlers, ie after all modules init() bits
40 * have been called, to prevent race condition of the initialization order.
42 // internal structure for a hook, never seen by the notify procs
45 typedef void (*avr_irq_notify_t)(avr_t * avr, struct avr_irq_t * irq, uint32_t value, void * param);
47 typedef struct avr_irq_hook_t {
48 struct avr_irq_hook_t * next;
50 int busy; // prevent reentrance of callbacks
51 avr_irq_notify_t notify;
54 typedef struct avr_irq_t {
57 avr_irq_hook_t * hook;
60 avr_irq_t * avr_alloc_irq(avr_t * avr, uint32_t base, uint32_t count);
61 void avr_init_irq(avr_t * avr, avr_irq_t * irq, uint32_t base, uint32_t count);
62 void avr_raise_irq(avr_t * avr, avr_irq_t * irq, uint32_t value);
63 // this connects a "source" IRQ to a "destination" IRQ
64 void avr_connect_irq(avr_t * avr, avr_irq_t * src, avr_irq_t * dst);
65 void avr_irq_register_notify(avr_t * avr, avr_irq_t * irq, avr_irq_notify_t notify, void * param);
67 #endif /* __SIM_IRQ_H__ */