embox

Форк
0
120 строк · 3.5 Кб
1
/**
2
 * @file imx6_gpt.c
3
 * @brief General Purpose Timer for i.MX6 board
4
 * @author Denis Deryugin <deryugin.denis@gmail.com>
5
 * @version 0.1
6
 * @date 2016-06-12
7
 *
8
 * @author Evgeny Svirin <eugenysvirin@gmail.com>
9
 * @date 2021-04-9
10
 */
11
#include <sys/mman.h>
12

13
#include <drivers/common/memory.h>
14
#include <hal/clock.h>
15
#include <hal/reg.h>
16
#include <kernel/irq.h>
17
#include <kernel/printk.h>
18
#include <kernel/time/clock_source.h>
19
#include <kernel/time/time_device.h>
20

21
#include <framework/mod/options.h>
22
#include <embox/unit.h>
23

24
#define GPT_BASE      OPTION_GET(NUMBER, base_addr)
25
#define GPT_IRQ       OPTION_GET(NUMBER, irq_nr)
26
#define GPT_TARGET_HZ OPTION_GET(NUMBER, freq)
27

28
#define GPT_PRESCALER 0 /* 2^0 */
29

30
#define GPT_CR   (GPT_BASE + 0x00) /* Control register */
31
#define GPT_PR   (GPT_BASE + 0x04) /* Prescaler register */
32
#define GPT_SR   (GPT_BASE + 0x08) /* Status register */
33
#define GPT_IR   (GPT_BASE + 0x0C) /* Interrupt register */
34
#define GPT_OCR1 (GPT_BASE + 0x10) /* Output compare register 1 */
35
#define GPT_OCR2 (GPT_BASE + 0x14) /* Output compare register 2 */
36
#define GPT_OCR3 (GPT_BASE + 0x18) /* Output compare register 3 */
37
#define GPT_ICR1 (GPT_BASE + 0x1C) /* Input capture register 1 */
38
#define GPT_ICR2 (GPT_BASE + 0x20) /* Input capture register 2 */
39
#define GPT_CNT  (GPT_BASE + 0x24) /* Counter register */
40

41
#define GPT_IR_INT1   (1 << 0)     /* Enable interruption on OutputCompare1 */
42
#define GPT_CR_MASK   (0b10000011) /* Enable interruptable periodic timer mode */
43
#define GPT_SR_CLR    (0)          /* Clear status mask */
44

45
#define GPT_CR_EN     (1u <<  0)
46
#define GPT_CR_ENMOD  (1u <<  1)
47
#define GPT_CR_DBGEN  (1u <<  2)
48
#define GPT_CR_WAITEN (1u <<  3)
49
#define GPT_CR_DOZEEN (1u <<  4)
50
#define GPT_CR_STOPEN (1u <<  5)
51
#define GPT_CR_FRR    (1u <<  9)
52
#define GPT_CR_SWR    (1u << 15)
53
#define GPT_CR_FO1    (1u << 29)
54
#define GPT_CR_FO2    (1u << 30)
55
#define GPT_CR_FO3    (1u << 31)
56

57
#define GPT_CR_CLKSRC_OFFT  6
58
#define GPT_CR_IM1_OFFT    16
59
#define GPT_CR_IM2_OFFT    18
60
#define GPT_CR_OM1_OFFT    20
61
#define GPT_CR_OM2_OFFT    23
62
#define GPT_CR_OM3_OFFT    26
63

64
#define GPT_IR_OF1IE (1 << 0)
65

66
#define CLKSRC_PERIPH  1
67
#define CLKSRC_LOWFREQ 4
68

69
/* By default, periphal clock source is PPL2, 528MHz */
70
#define _BASE_HZ     528000000
71
#define _BASE_SCALER 8
72

73
static irq_return_t clock_handler(unsigned int irq_nr, void *data) {
74
	clock_tick_handler(data);
75

76
	REG32_CLEAR(GPT_SR, GPT_SR_CLR);
77
	return IRQ_HANDLED;
78
}
79

80
static int imx6_gpt_init(struct clock_source *cs) {
81
	/* We can configure GPT only when disabled */
82
	REG32_STORE(GPT_CR,   0);
83
	REG32_STORE(GPT_IR,   0);
84

85
	return irq_attach(GPT_IRQ,
86
	                  clock_handler,
87
	                  0,
88
	                  cs,
89
	                  "i.MX6 General Purpose Timer");
90
}
91

92
static int imx6_gpt_set_periodic(struct clock_source *cs) {
93
	REG32_STORE(GPT_PR, GPT_PRESCALER);
94
	REG32_STORE(GPT_OCR1, _BASE_HZ / _BASE_SCALER / GPT_TARGET_HZ); 
95
	REG32_STORE(GPT_IR, GPT_IR_INT1);
96
	REG32_STORE(GPT_CR, GPT_CR_MASK); 
97
	
98
	return 0;
99
}
100

101
static cycle_t imx6_gpt_read(struct clock_source *cs) {
102
	return REG32_LOAD(GPT_CNT);
103
}
104

105
static struct time_event_device imx6_gpt_event = {
106
	.set_periodic   = imx6_gpt_set_periodic,
107
	.irq_nr   = GPT_IRQ,
108
};
109

110
static struct time_counter_device imx6_gpt_counter = {
111
	.read     = imx6_gpt_read,
112
	.cycle_hz = GPT_TARGET_HZ,
113
};
114

115
STATIC_IRQ_ATTACH(GPT_IRQ, clock_handler, &this_clock_source);
116

117
PERIPH_MEMORY_DEFINE(imx_gpt, GPT_BASE, 0x40);
118

119
CLOCK_SOURCE_DEF(imx6_gpt,  imx6_gpt_init, NULL,
120
	&imx6_gpt_event, &imx6_gpt_counter);
121

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

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

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

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