embox

Форк
0
69 строк · 1.4 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @author Aleksey Zhmulin
6
 * @date 29.08.23
7
 */
8
#include <assert.h>
9

10
#include <drivers/irqctrl.h>
11
#include <kernel/critical.h>
12
#include <kernel/irq.h>
13
#include <kernel/printk.h>
14

15
#include <module/embox/driver/interrupt/vic_impl.h>
16

17
#include "vic.h"
18
#include "vic_util.h"
19

20
static int vic_irqctrl_init(void) {
21
	__irqctrl_init();
22

23
	return 0;
24
}
25

26
IRQCTRL_DEF(vic, vic_irqctrl_init);
27

28
void irqctrl_enable(unsigned int irq) {
29
	assert(irq_nr_valid(irq));
30

31
	__irqctrl_enable(irq);
32
}
33

34
void irqctrl_disable(unsigned int irq) {
35
	assert(irq_nr_valid(irq));
36

37
	/* Disable software interrupt. If the current interrupt is hardware, it has
38
	no effect. */
39
	VIC_REG_STORE(irq / VIC_IRQ_COUNT, VIC_SOFT_DISABLE,
40
	    1U << (irq % VIC_IRQ_COUNT));
41

42
	__irqctrl_disable(irq);
43
}
44

45
void irqctrl_force(unsigned int irq) {
46
	assert(irq_nr_valid(irq));
47

48
	/* Enable software interrupt. */
49
	VIC_REG_STORE(irq / VIC_IRQ_COUNT, VIC_SOFT_ENABLE,
50
	    1U << (irq % VIC_IRQ_COUNT));
51
}
52

53
void irqctrl_eoi(unsigned int irq) {
54
	int i;
55

56
	assert(irq_nr_valid(irq));
57

58
	/* Writing VIC_ADDR register clears the respective interrupt in the internal
59
	interrupt priority hardware. */
60
	for (i = 0; i < VIC_DEVICE_COUNT; i++) {
61
		VIC_REG_STORE(i, VIC_ADDR, irq);
62
	}
63
}
64

65
unsigned int irqctrl_get_intid(void) {
66
	/*  Reading VIC_ADDR register updates the hardware priority register of the
67
	interrupt controller. */
68
	return VIC_REG_LOAD(0, VIC_ADDR);
69
}
70

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

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

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

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