1 /**
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 *
15 * Description: Provides V100 HAL rtc \n
16 *
17 * History: \n
18 * 2023-03-02, Create file. \n
19 */
20 #include <stdint.h>
21 #include "common_def.h"
22 #include "hal_rtc_v100_regs_op.h"
23 #include "hal_rtc.h"
24 #include "rtc_porting.h"
25 #include "hal_rtc_v100.h"
26
27 static hal_rtc_callback_t g_hal_rtc_callback[RTC_MAX_NUM] = {NULL};
28 static uint32_t g_rtc_int_cnt_record = 0;
29
30 #pragma weak hal_rtc_init = hal_rtc_v100_init
hal_rtc_v100_init(rtc_index_t index,hal_rtc_callback_t callback)31 errcode_t hal_rtc_v100_init(rtc_index_t index, hal_rtc_callback_t callback)
32 {
33 if ((hal_rtc_regs_init(index)) != ERRCODE_SUCC) {
34 return ERRCODE_RTC_REG_ADDR_INVALID;
35 }
36 g_hal_rtc_callback[index] = callback;
37 return ERRCODE_SUCC;
38 }
39
40 #pragma weak hal_rtc_deinit = hal_rtc_v100_deinit
hal_rtc_v100_deinit(rtc_index_t index)41 void hal_rtc_v100_deinit(rtc_index_t index)
42 {
43 g_hal_rtc_callback[index] = NULL;
44 hal_rtc_regs_deinit(index);
45 }
46
47 #pragma weak hal_rtc_start = hal_rtc_v100_start
hal_rtc_v100_start(rtc_index_t index)48 void hal_rtc_v100_start(rtc_index_t index)
49 {
50 hal_rtc_control_reg_set_enable(index, 1);
51 }
52
53 #pragma weak hal_rtc_stop = hal_rtc_v100_stop
hal_rtc_v100_stop(rtc_index_t index)54 void hal_rtc_v100_stop(rtc_index_t index)
55 {
56 hal_rtc_get_eoi(index);
57 hal_rtc_control_reg_set_enable(index, 0);
58 }
59
60 #pragma weak hal_rtc_config_load = hal_rtc_v100_config_load
hal_rtc_v100_config_load(rtc_index_t index,uint64_t delay_count)61 void hal_rtc_v100_config_load(rtc_index_t index, uint64_t delay_count)
62 {
63 hal_rtc_control_reg_set_mode(index, (uint32_t)RTC_MODE_FREE_RUN);
64 hal_rtc_load_count_set(index, (uint32_t)delay_count);
65 }
66
67 #pragma weak hal_rtc_get_current_value = hal_rtc_v100_get_current_value
hal_rtc_v100_get_current_value(rtc_index_t index)68 uint64_t hal_rtc_v100_get_current_value(rtc_index_t index)
69 {
70 /* 判断enable不为1时认为时钟已到期,返回0。 */
71 if (hal_rtc_control_reg_get_enable(index) != 1) {
72 return 0;
73 }
74
75 return (uint64_t)hal_rtc_get_current_load(index);
76 }
77
78 #if defined(CONFIG_RTC_SUPPORT_LPM)
79 #pragma weak hal_rtc_get_int_status = hal_rtc_v100_get_int_status
hal_rtc_v100_get_int_status(rtc_index_t index)80 uint32_t hal_rtc_v100_get_int_status(rtc_index_t index)
81 {
82 return hal_rtc_v100_get_int_sts(index);
83 }
84 #endif /* CONFIG_RTC_SUPPORT_LPM */
85
hal_rtc_v100_irq_handler(rtc_index_t index)86 void hal_rtc_v100_irq_handler(rtc_index_t index)
87 {
88 g_rtc_int_cnt_record++;
89
90 /* Read the register to clear the interrupt */
91 uint32_t int_clear = hal_rtc_get_eoi(index);
92 unused(int_clear);
93 if (g_hal_rtc_callback[index]) {
94 g_hal_rtc_callback[index](index);
95 }
96 }
97
98 #pragma weak hal_rtc_get_int_cnt_record = hal_rtc_v100_get_int_cnt_record
hal_rtc_v100_get_int_cnt_record(void)99 uint32_t hal_rtc_v100_get_int_cnt_record(void)
100 {
101 uint32_t rtc_int_cnt = g_rtc_int_cnt_record;
102 return rtc_int_cnt;
103 }