embox

Форк
0
87 строк · 2.1 Кб
1
/**
2
 * @file
3
 * @brief Low level functions for interrupt controller.
4
 *
5
 * @date 23.11.09
6
 * @author Anton Bondarev
7
 */
8

9
#include <stdint.h>
10

11
#include <drivers/common/memory.h>
12

13
#include <asm/bitops.h>
14
#include <hal/reg.h>
15

16
#include <drivers/irqctrl.h>
17

18
#include <embox/unit.h>
19

20
#include <module/embox/driver/interrupt/mb_intc.h>
21

22
#define CONFIG_XILINX_INTC_BASEADDR OPTION_GET(NUMBER,mbintc_base)
23

24
/**
25
 * Microblaze interrupt controller registers definitions.
26
 */
27
struct irqc_regs {
28
	/* 0x00 */uint32_t isr; /**< interrupt status register */
29
	/* 0x04 */uint32_t ipr; /**< interrupt pending register */
30
	/* 0x08 */uint32_t ier; /**< interrupt enable register */
31
	/* 0x0C */uint32_t iar; /**< interrupt acknowledge register */
32
	/* 0x10 */uint32_t sie; /**< set interrupt enable bits */
33
	/* 0x14 */uint32_t cie; /**< clear interrupt enable bits */
34
	/* 0x18 */uint32_t ivr; /**< interrupt vector register */
35
	/* 0x1C */uint32_t mer; /**< master enable register */
36
};
37

38
#define MER_HIE_BIT     30
39
#define MER_ME_BIT      31
40

41
#define MER_HIE         REVERSE_MASK(MER_HIE_BIT)
42
#define MER_ME          REVERSE_MASK(MER_ME_BIT)
43

44
static volatile struct irqc_regs *irqc =
45
		(struct irqc_regs *) CONFIG_XILINX_INTC_BASEADDR;
46

47
static int mb_intc_init(void) {
48
	irqc->mer = 0;
49
	irqc->ier = 0;
50
	irqc->iar = ~(0x0);
51
	/* after set HIE bit we will not can clear it again.
52
	 * It's a problem because we will couldn't testing interrupts by soft
53
	 * (we will could use function irqc_force).
54
	 */
55
	irqc->mer = MER_HIE | MER_ME;
56

57
	return 0;
58
}
59

60
void irqctrl_enable(unsigned int irq) {
61
	REG_STORE(&irqc->sie, 1UL << irq);
62
}
63

64
void irqctrl_disable(unsigned int irq) {
65
	REG_STORE(&irqc->cie, 1UL << irq);
66
}
67

68
//TODO this not set in microblaze
69
void irqctrl_force(unsigned int irq_num) {
70
}
71

72
void irqctrl_clear(unsigned int irq) {
73
	REG_STORE(&irqc->iar, 1UL << irq);
74
}
75

76
int irqctrl_pending(unsigned int irq) {
77
	return REG_LOAD(&irqc->isr) & (1 << irq);
78
}
79

80
/* microblaze specific */
81
unsigned int irqctrl_get_irq_num(void) {
82
	return REG_LOAD(&irqc->ivr);
83
}
84

85
PERIPH_MEMORY_DEFINE(mb_intc, CONFIG_XILINX_INTC_BASEADDR, sizeof(struct irqc_regs));
86

87
IRQCTRL_DEF(mb_intc, mb_intc_init);
88

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

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

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

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