embox

Форк
0
/
da1469x_rtc_sdk.c 
132 строки · 2.7 Кб
1
/**
2
 * @file
3
 *
4
 * @date   26.11.2020
5
 * @author Alexander Kalmuk
6
 */
7

8
#include <time.h>
9
#include <hal/reg.h>
10
#include <kernel/irq.h>
11
#include <drivers/rtc.h>
12
#include <framework/mod/options.h>
13
#include <embox/unit.h>
14

15
#include <config/custom_config_qspi.h>
16
#include <hw_rtc.h>
17

18
#define DA1469X_RTC_IRQ       OPTION_GET(NUMBER, irq)
19

20
EMBOX_UNIT_INIT(da1469x_rtc_init);
21

22
static irq_return_t da1469x_rtc_irq_handler(unsigned int irq_nr, void *data) {
23
	hw_rtc_get_event_flags();
24

25
	rtc_update_irq((struct rtc_device *) data, 1, (RTC_AF | RTC_IRQF));
26

27
	return IRQ_HANDLED;
28
}
29

30
static int da1469x_rtc_get_time(struct rtc_device *dev, struct tm *tm) {
31
	hw_rtc_time_t time;
32
	hw_rtc_calendar_t clndr;
33

34
	hw_rtc_get_time_clndr(&time, &clndr);
35

36
	tm->tm_hour = time.hour;
37
	tm->tm_min  = time.minute;
38
	tm->tm_sec  = time.sec;
39

40
	tm->tm_year = clndr.year - 1900;
41
	tm->tm_mon  = clndr.month - 1;
42
	tm->tm_mday = clndr.mday;
43
	tm->tm_wday = clndr.wday - 1;
44

45
	return 0;
46
}
47

48
static int da1469x_rtc_set_time(struct rtc_device *dev, struct tm *tm) {
49
	const hw_rtc_time_t time = {
50
		.hour   = tm->tm_hour,
51
		.minute = tm->tm_min,
52
		.sec    = tm->tm_sec,
53
		.hsec   = 0,
54
	};
55
	const hw_rtc_calendar_t clndr = {
56
		.year  = tm->tm_year + 1900,
57
		.month = tm->tm_mon + 1,
58
		.mday  = tm->tm_mday,
59
		.wday  = tm->tm_wday + 1,
60
	};
61

62
	hw_rtc_set_time_clndr(&time, &clndr);
63

64
	return 0;
65
}
66

67
static int da1469x_rtc_get_alarm(struct rtc_device *dev, struct tm *tm) {
68
	hw_rtc_time_t time;
69
	hw_rtc_alarm_calendar_t clndr;
70

71
	hw_rtc_get_alarm(&time, &clndr, NULL);
72

73
	tm->tm_hour = time.hour;
74
	tm->tm_min  = time.minute;
75
	tm->tm_sec  = time.sec;
76

77
	tm->tm_mon  = clndr.month - 1;
78
	tm->tm_mday = clndr.mday;
79

80
	return 0;
81
}
82

83
int da1469x_rtc_set_alarm(struct rtc_device *dev, struct tm *tm) {
84
	const hw_rtc_time_t time = {
85
		.hour   = tm->tm_hour,
86
		.minute = tm->tm_min,
87
		.sec    = tm->tm_sec,
88
		.hsec   = 0,
89
	};
90
	const hw_rtc_alarm_calendar_t clndr = {
91
		.mday  = tm->tm_mday,
92
		.month = tm->tm_mon + 1,
93
	};
94

95
	hw_rtc_set_alarm(&time, &clndr, 0xff);
96

97
	return 0;
98
}
99

100
int da1469x_rtc_alarm_irq_enable(struct rtc_device *dev, int enabled) {
101
	if (enabled) {
102
		hw_rtc_interrupt_enable(HW_RTC_INT_ALRM);
103
	} else {
104
		hw_rtc_interrupt_disable(HW_RTC_INT_ALRM);
105
	}
106

107
	return 0;
108
}
109

110
static struct rtc_ops da1469x_rtc_ops = {
111
	.get_time = da1469x_rtc_get_time,
112
	.set_time = da1469x_rtc_set_time,
113
	.get_alarm = da1469x_rtc_get_alarm,
114
	.set_alarm = da1469x_rtc_set_alarm,
115
	.alarm_irq_enable = da1469x_rtc_alarm_irq_enable,
116
};
117

118
static struct rtc_device da1469x_rtc_device = {
119
	.rtc_ops = &da1469x_rtc_ops
120
};
121

122
RTC_DEVICE_DEF(&da1469x_rtc_device);
123

124
static int da1469x_rtc_init(void) {
125
	return irq_attach(DA1469X_RTC_IRQ,
126
			da1469x_rtc_irq_handler,
127
			0,
128
			&da1469x_rtc_device,
129
			"da1469x_rtc");
130
}
131

132
STATIC_IRQ_ATTACH(DA1469X_RTC_IRQ, da1469x_rtc_irq_handler, &da1469x_rtc_device);
133

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

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

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

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