embox

Форк
0
75 строк · 1.8 Кб
1
/**
2
 * @file
3
 * @brief Driver for Advanced Interrupt Controller.
4
 *
5
 * @date 11.07.10
6
 * @author Anton Kozlov
7
 */
8

9
#include <assert.h>
10
#include <stdint.h>
11

12
#include <drivers/at91sam7s256.h>
13
#include <drivers/irqctrl.h>
14
#include <embox/unit.h>
15
#include <hal/arch.h>
16
#include <hal/ipl.h>
17
#include <hal/reg.h>
18
#include <kernel/irq.h>
19
#include <kernel/panic.h>
20

21
static void irq_def_handler(void) {
22
	panic(__func__);
23
}
24

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);
35
	}
36

37
	REG_STORE(AT91C_AIC_IDCR, ~0); /* disabling all interrupts */
38
	REG_STORE(AT91C_AIC_ICCR, ~0); /* clearing all pending interrupts */
39

40
	return 0;
41
}
42

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);
48
}
49

50
void irqctrl_disable(unsigned int interrupt_nr) {
51
	REG_STORE(AT91C_AIC_IDCR, 1 << interrupt_nr);
52
}
53

54
void irqctrl_clear(unsigned int interrupt_nr) {
55
	REG_STORE(AT91C_AIC_ICCR, 1 << interrupt_nr);
56
}
57

58
void irqctrl_force(unsigned int interrupt_nr) {
59
	REG_STORE(AT91C_AIC_ISCR, 1 << interrupt_nr);
60
}
61

62
void irqctrl_eoi(unsigned int irq) {
63
	REG_STORE(AT91C_AIC_EOICR, irq); /* write anything */
64
}
65

66
unsigned int irqctrl_get_intid(void) {
67
	unsigned int irq;
68

69
	REG_LOAD(AT91C_AIC_IVR);
70
	irq = REG_LOAD(AT91C_AIC_ISR);
71

72
	return irq;
73
}
74

75
IRQCTRL_DEF(at91_intc, at91_intc_init);
76

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.