summaryrefslogtreecommitdiff
path: root/bsp/bouffalo_lab/libraries/bl_mcu_sdk/drivers/lhal/src/bflb_rtc.c
blob: d2ca2801a7d103ab321acb4cecc8c7b6d13e6249 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "bflb_rtc.h"
#include "hardware/rtc_reg.h"

#if defined(BL602) || defined(BL702) || defined(BL702L)
#define BFLB_RTC_BASE 0x4000F000
#elif defined(BL808) || defined(BL606P) || defined(BL616)
#define BFLB_RTC_BASE 0x2000F000
#elif defined(BL628)
#define BFLB_RTC_BASE 0x2008F000
#endif

void bflb_rtc_disable(struct bflb_device_s *dev)
{
    uint32_t reg_base;
    uint32_t regval;

    reg_base = BFLB_RTC_BASE;

    /* Clear & Disable RTC counter */
    regval = getreg32(reg_base + HBN_CTL_OFFSET);
    regval &=~ HBN_RTC_ENABLE;
    putreg32(regval, reg_base + HBN_CTL_OFFSET);
}

void bflb_rtc_set_time(struct bflb_device_s *dev, uint64_t time)
{
    uint32_t reg_base;
    uint32_t regval;
    uint64_t rtc_cnt;

    reg_base = BFLB_RTC_BASE;

    /* Clear RTC Control */
    regval = getreg32(reg_base + HBN_CTL_OFFSET);
    regval &= ~HBN_RTC_CTL_MASK;
    putreg32(regval, reg_base + HBN_CTL_OFFSET);

    regval |= HBN_RTC_DLY_OPTION;
    regval |= HBN_RTC_BIT39_0_COMPARE;
    putreg32(regval, reg_base + HBN_CTL_OFFSET);

    /* Tigger RTC val read */
    regval = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET);
    regval |= HBN_RTC_TIME_LATCH;
    putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);
    regval &= ~HBN_RTC_TIME_LATCH;
    putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);

    /* Read RTC val */
    rtc_cnt = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET) & 0xff;
    rtc_cnt <<= 32;
    rtc_cnt |= getreg32(reg_base + HBN_RTC_TIME_L_OFFSET);

    /* calculate RTC Comp time */
    rtc_cnt += time;

    /* Set RTC Comp time  */
    putreg32((uint32_t)rtc_cnt, reg_base + HBN_TIME_L_OFFSET);
    putreg32((uint32_t)(rtc_cnt >> 32) & 0xff, reg_base + HBN_TIME_H_OFFSET);

    /* Enable RTC Counter */
    regval = getreg32(reg_base + HBN_CTL_OFFSET);
    regval |= HBN_RTC_ENABLE;
    putreg32(regval, reg_base + HBN_CTL_OFFSET);
}

uint64_t bflb_rtc_get_time(struct bflb_device_s *dev)
{
    uint32_t reg_base;
    uint32_t regval;
    uint64_t time_l;
    uint64_t time_h;

    reg_base = BFLB_RTC_BASE;

    /* Tigger RTC val read */
    regval = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET);
    regval |= HBN_RTC_TIME_LATCH;
    putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);
    regval &= ~HBN_RTC_TIME_LATCH;
    putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);

    /* Read RTC val */
    time_l = getreg32(reg_base + HBN_RTC_TIME_L_OFFSET);
    time_h = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET) & 0xff;

    return (((uint64_t)time_h << 32) | (uint64_t)time_l);
}