embox

Форк
0
59 строк · 1.4 Кб
1
/**
2
 * @file
3
 * @brief MIPS build-in timer
4
 *
5
 * @date 04.07.2012
6
 * @author Anton Bondarev
7
 */
8

9
#include <stdint.h>
10

11
#include <asm/mipsregs.h>
12
#include <framework/mod/options.h>
13
#include <hal/clock.h>
14
#include <hal/system.h>
15
#include <kernel/irq.h>
16
#include <kernel/time/clock_source.h>
17
#include <kernel/time/time.h>
18

19
#define CYC_PER_TICK       OPTION_GET(NUMBER, cyc_per_tick)
20

21
#define TIMER_IRQ_INTERVAL (SYS_CLOCK / (CYC_PER_TICK * JIFFIES_PERIOD))
22

23
static irq_return_t clock_handler(unsigned int irq_nr, void *dev_id) {
24
	mips_write_c0_compare(TIMER_IRQ_INTERVAL); /* this lowers irq line */
25
	mips_write_c0_count(0);
26

27
	clock_tick_handler(dev_id);
28

29
	return IRQ_HANDLED;
30
}
31

32
static cycle_t mips_clk_read(struct clock_source *cs) {
33
	return (cycle_t)mips_read_c0_count();
34
}
35

36
static int mips_clock_setup(struct clock_source *cs) {
37
	mips_write_c0_compare(TIMER_IRQ_INTERVAL);
38
	mips_write_c0_count(0);
39

40
	return 0;
41
}
42

43
static struct time_event_device mips_event_device = {
44
    .set_periodic = mips_clock_setup,
45
    .name = "mips_clk",
46
    .irq_nr = MIPS_IRQN_TIMER,
47
};
48

49
static struct time_counter_device mips_counter_device = {
50
    .read = mips_clk_read,
51
    .cycle_hz = SYS_CLOCK,
52
};
53

54
static int mips_clock_init(struct clock_source *cs) {
55
	return irq_attach(MIPS_IRQN_TIMER, clock_handler, 0, cs, "mips_clk");
56
}
57

58
CLOCK_SOURCE_DEF(mips_clk, mips_clock_init, NULL, &mips_event_device,
59
    &mips_counter_device);
60

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

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

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

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