12
#include <drivers/at91sam7s256.h>
13
#include <drivers/irqctrl.h>
14
#include <embox/unit.h>
18
#include <kernel/irq.h>
19
#include <kernel/panic.h>
21
static void irq_def_handler(void) {
25
static int at91_intc_init(void) {
26
REG_STORE(AT91C_PMC_PCER,
27
1 << AT91C_ID_IRQ0 | 1 << AT91C_ID_IRQ1 | 1 << AT91C_ID_FIQ);
28
REG_STORE(AT91C_PIOA_PDR,
29
AT91C_PA20_IRQ0 | AT91C_PA30_IRQ1 | AT91C_PA19_FIQ);
30
REG_STORE(AT91C_PIOA_BSR,
31
AT91C_PA20_IRQ0 | AT91C_PA30_IRQ1 | AT91C_PA19_FIQ);
32
for (int i = 0; i < 32; i++) {
33
REG_STORE(AT91C_AIC_SVR[i], (uint32_t)&irq_def_handler);
34
REG_STORE(AT91C_AIC_SMR + i, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED);
37
REG_STORE(AT91C_AIC_IDCR, ~0);
38
REG_STORE(AT91C_AIC_ICCR, ~0);
43
void irqctrl_enable(unsigned int interrupt_nr) {
44
REG_STORE(AT91C_AIC_SMR + interrupt_nr,
45
AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED);
46
REG_STORE(AT91C_AIC_SVR + interrupt_nr, 0);
47
REG_STORE(AT91C_AIC_IECR, 1 << interrupt_nr);
50
void irqctrl_disable(unsigned int interrupt_nr) {
51
REG_STORE(AT91C_AIC_IDCR, 1 << interrupt_nr);
54
void irqctrl_clear(unsigned int interrupt_nr) {
55
REG_STORE(AT91C_AIC_ICCR, 1 << interrupt_nr);
58
void irqctrl_force(unsigned int interrupt_nr) {
59
REG_STORE(AT91C_AIC_ISCR, 1 << interrupt_nr);
62
void irqctrl_eoi(unsigned int irq) {
63
REG_STORE(AT91C_AIC_EOICR, irq);
66
unsigned int irqctrl_get_intid(void) {
69
REG_LOAD(AT91C_AIC_IVR);
70
irq = REG_LOAD(AT91C_AIC_ISR);
75
IRQCTRL_DEF(at91_intc, at91_intc_init);