embox

Форк
0
110 строк · 2.7 Кб
1
/**
2
 * @file
3
 * @brief OMAP35x clock device driver
4
 *
5
 * @date 15.10.12
6
 * @author Ilia Vaprol
7
 */
8

9
#include <drivers/common/memory.h>
10
#include <drivers/irqctrl.h>
11
#include <hal/clock.h>
12
#include <hal/mmu.h>
13
#include <hal/reg.h>
14
#include <hal/system.h>
15
#include <kernel/irq.h>
16
#include <kernel/time/clock_source.h>
17
#include <kernel/printk.h>
18
#include <util/binalign.h>
19

20
#include <embox/unit.h>
21

22
/* omap's gptimer */
23

24
#define CM_FCLKEN_WKUP  0x48004C00
25
#define CM_ICLKEN_WKUP  0x48004C10
26
#define CM_CLKSEL_WKUP  0x48004C40
27

28
#define GPTIMER1_BASE ((void *) 0x48318000)
29
#define GPTIMER1_IRQ 37
30

31
struct gptimerxx_x {
32
	uint32_t tidr; 		/* 0x00 */
33
	char unused0[12];	/* 0x04 */
34
	uint32_t cfg;		/* 0x10 */
35
	uint32_t tistat;	/* 0x14 */
36
	uint32_t tisr;		/* 0x18 */
37
	uint32_t tier;		/* 0x1c */
38
	uint32_t twer;		/* 0x20 */
39
	uint32_t tclr;		/* 0x24 */
40
	uint32_t tcrr;		/* 0x28 */
41
	uint32_t tldr;		/* 0x2c */
42
	uint32_t ttgr;		/* 0x30 */
43
	uint32_t twps;		/* 0x34 */
44
	uint32_t tmar;		/* 0x38 */
45
	uint32_t tcar1;		/* 0x3c */
46
	uint32_t tsicr;		/* 0x40 */
47
	uint32_t tcar2;		/* 0x44 */
48
	uint32_t tpir;		/* 0x48 */
49
	uint32_t tnir;		/* 0x4c */
50
	uint32_t tcvr;		/* 0x50 */
51
	uint32_t tocr;		/* 0x54 */
52
	uint32_t towr;		/* 0x54 */
53
} __attribute__((packed));
54

55
#define OMAP_LOAD_VALUE 0xffffffe0
56

57
/* common register values */
58

59
#define GPTIMER_TCLR_START	(1 << 0)
60
#define GPTIMER_TCLR_AUTORELOAD (1 << 1)
61

62
#define GPTIMER_TIER_OVERFLOW   (1 << 1)
63
#define GPTIMER_TISR_OVERFLOW   (1 << 1)
64

65
static irq_return_t clock_handler(unsigned int irq_nr, void *data) {
66
	volatile struct gptimerxx_x *gptimer = GPTIMER1_BASE;
67
	clock_tick_handler(data);
68
	REG_STORE(&gptimer->tisr, GPTIMER_TISR_OVERFLOW);
69
	return IRQ_HANDLED;
70
}
71

72
static int omap3_clk_set_periodic(struct clock_source *cs) {
73
	volatile struct gptimerxx_x *gptimer = GPTIMER1_BASE;
74

75
	REG_ORIN(CM_FCLKEN_WKUP, 1);
76
	REG_ORIN(CM_ICLKEN_WKUP, 1);
77
	REG_ANDIN(CM_CLKSEL_WKUP, ~1);
78

79
	REG_STORE(&gptimer->cfg, 0x2);
80

81
	REG_STORE(&gptimer->tpir, 232000);
82
	REG_STORE(&gptimer->tnir, -768000);
83

84
	REG_STORE(&gptimer->tcrr, OMAP_LOAD_VALUE);
85
	REG_STORE(&gptimer->tldr, OMAP_LOAD_VALUE);
86

87
	REG_STORE(&gptimer->tclr, GPTIMER_TCLR_START | GPTIMER_TCLR_AUTORELOAD);
88

89
	REG_STORE(&gptimer->tier, GPTIMER_TIER_OVERFLOW);
90
	REG_STORE(&gptimer->twer, GPTIMER_TIER_OVERFLOW);
91

92
	return 0;
93
}
94

95
static struct time_event_device omap3_clk_event = {
96
	.set_periodic = omap3_clk_set_periodic,
97
	.irq_nr = GPTIMER1_IRQ,
98
};
99

100
static int omap_clk_init(struct clock_source *cs) {
101
	/* Map one vmem page to handle this device if mmu is used */
102
	return irq_attach(GPTIMER1_IRQ, clock_handler, 0, cs, "omap3_clk");
103
}
104

105
PERIPH_MEMORY_DEFINE(omap3_gptimer, (uintptr_t) GPTIMER1_BASE, 0x1000);
106

107
PERIPH_MEMORY_DEFINE(omap3_cm, CM_FCLKEN_WKUP, 0x50);
108

109
CLOCK_SOURCE_DEF(omap3_clk, omap_clk_init, NULL,
110
	&omap3_clk_event, NULL);
111

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

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

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

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