embox

Форк
0
75 строк · 1.7 Кб
1
/**
2
 * @file
3
 *
4
 * @brief RISC-V build-in timer
5
 *
6
 * @date 12.12.2019
7
 * @author Anastasia Nizharadze
8
 */
9

10
#include <errno.h>
11
#include <stdint.h>
12

13
#include <asm/interrupts.h>
14
#include <asm/regs.h>
15
#include <framework/mod/options.h>
16
#include <hal/clock.h>
17
#include <hal/reg.h>
18
#include <hal/system.h>
19
#include <kernel/irq.h>
20
#include <kernel/time/clock_source.h>
21
#include <kernel/time/time.h>
22
#include <drivers/interrupt/riscv_clint.h>
23

24
#define COUNT_OFFSET  (RTC_CLOCK / JIFFIES_PERIOD)
25
#define RTC_CLOCK     OPTION_GET(NUMBER, rtc_freq)
26

27
#define OPENSBI_TIMER 0x54494D45
28

29
static int clock_handler(unsigned int irq_nr, void *dev_id) {
30
#if SMODE
31
    
32
	register uintptr_t a7 asm("a7") = (uintptr_t)(OPENSBI_TIMER);
33
	register uintptr_t a6 asm("a6") = (uintptr_t)(0);
34
	register uintptr_t a0 asm("a0") = 0;
35
	asm volatile("rdtime a0");
36
	a0 = a0 + COUNT_OFFSET;
37
	(void)a7;
38
	(void)a6;
39
	asm volatile("ecall");
40
#else
41
	clint_set_mtimecmp(clint_get_mtime() + COUNT_OFFSET);
42
#endif
43
	clock_tick_handler(dev_id);
44

45
	return IRQ_HANDLED;
46
}
47

48
static int riscv_clock_setup(struct clock_source *cs) {
49
#if SMODE
50
	register uintptr_t a7 asm("a7") = (uintptr_t)(OPENSBI_TIMER);
51
	register uintptr_t a6 asm("a6") = (uintptr_t)(0);
52
	register uintptr_t a0 asm("a0") = 0;
53
	asm volatile("rdtime a0");
54
	a0 = a0 + COUNT_OFFSET;
55
	(void)a7;
56
	(void)a6;
57
	asm volatile("ecall");
58
#else
59
	clint_set_mtimecmp(clint_get_mtime() + COUNT_OFFSET);
60
#endif
61

62
	enable_timer_interrupts();
63

64
	return ENOERR;
65
}
66

67
static struct time_event_device riscv_event_device = {
68
    .set_periodic = riscv_clock_setup,
69
    .name = "riscv_clk",
70
    .irq_nr = IRQ_TIMER,
71
};
72

73
CLOCK_SOURCE_DEF(riscv_clk, NULL, NULL, &riscv_event_device, NULL);
74

75
RISCV_TIMER_IRQ_DEF(clock_handler, &CLOCK_SOURCE_NAME(riscv_clk));
76

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

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

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

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