11bd4fe43Sopenharmony_ci/*
21bd4fe43Sopenharmony_ci * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License.
51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at
61bd4fe43Sopenharmony_ci *
71bd4fe43Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81bd4fe43Sopenharmony_ci *
91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and
131bd4fe43Sopenharmony_ci * limitations under the License.
141bd4fe43Sopenharmony_ci */
151bd4fe43Sopenharmony_ci
161bd4fe43Sopenharmony_ci#ifndef PLATFORM_RTC_HI35XX_H
171bd4fe43Sopenharmony_ci#define PLATFORM_RTC_HI35XX_H
181bd4fe43Sopenharmony_ci
191bd4fe43Sopenharmony_ci#include "rtc_core.h"
201bd4fe43Sopenharmony_ci
211bd4fe43Sopenharmony_ci#ifdef __cplusplus
221bd4fe43Sopenharmony_ci#if __cplusplus
231bd4fe43Sopenharmony_ciextern "C" {
241bd4fe43Sopenharmony_ci#endif /* __cplusplus */
251bd4fe43Sopenharmony_ci#endif /* __cplusplus */
261bd4fe43Sopenharmony_ci
271bd4fe43Sopenharmony_cienum RtcErrorType {
281bd4fe43Sopenharmony_ci    RTC_ERROR_READ_FAIL     = 1,
291bd4fe43Sopenharmony_ci    RTC_ERROR_WRITE_FAIL    = 2,
301bd4fe43Sopenharmony_ci    RTC_ERROR_READ_BUSY     = 3,
311bd4fe43Sopenharmony_ci    RTC_ERROR_WRITE_BUSY    = 4,
321bd4fe43Sopenharmony_ci    RTC_ERROR_NULL          = 5,
331bd4fe43Sopenharmony_ci};
341bd4fe43Sopenharmony_ci
351bd4fe43Sopenharmony_cienum RtcFeatureSupportType {
361bd4fe43Sopenharmony_ci    RTC_FEATURE_NO_SUPPORT = 0,
371bd4fe43Sopenharmony_ci    RTC_FEATURE_SUPPORT    = 1,
381bd4fe43Sopenharmony_ci};
391bd4fe43Sopenharmony_ci
401bd4fe43Sopenharmony_ci/* define the union SPI_RW */
411bd4fe43Sopenharmony_ciunion RtcSpiConfig {
421bd4fe43Sopenharmony_ci    struct {
431bd4fe43Sopenharmony_ci        uint32_t spiWriteData   : 8; /* [7:0] */
441bd4fe43Sopenharmony_ci        uint32_t spiReadData    : 8; /* [15:8] */
451bd4fe43Sopenharmony_ci        uint32_t spiAddr        : 7; /* [22:16] */
461bd4fe43Sopenharmony_ci        uint32_t spiOperateType : 1; /* [23] */
471bd4fe43Sopenharmony_ci        uint32_t spiStart       : 1; /* [24] */
481bd4fe43Sopenharmony_ci        uint32_t reserved       : 6; /* [30:25] */
491bd4fe43Sopenharmony_ci        uint32_t spiBusy        : 1; /* [31] */
501bd4fe43Sopenharmony_ci    } bits;
511bd4fe43Sopenharmony_ci    uint32_t data; /* define an unsigned int member */
521bd4fe43Sopenharmony_ci};
531bd4fe43Sopenharmony_ci
541bd4fe43Sopenharmony_cistruct RtcLockAddr {
551bd4fe43Sopenharmony_ci    uint8_t lock0Addr;
561bd4fe43Sopenharmony_ci    uint8_t lock1Addr;
571bd4fe43Sopenharmony_ci    uint8_t lock2Addr;
581bd4fe43Sopenharmony_ci    uint8_t lock3Addr;
591bd4fe43Sopenharmony_ci};
601bd4fe43Sopenharmony_ci
611bd4fe43Sopenharmony_cistruct RtcConfigInfo {
621bd4fe43Sopenharmony_ci    uint32_t spiBaseAddr;
631bd4fe43Sopenharmony_ci    volatile void *remapBaseAddr;
641bd4fe43Sopenharmony_ci    uint16_t regAddrLength;
651bd4fe43Sopenharmony_ci    uint8_t supportAnaCtrl;
661bd4fe43Sopenharmony_ci    uint8_t supportLock;
671bd4fe43Sopenharmony_ci    uint8_t irq;
681bd4fe43Sopenharmony_ci    uint8_t alarmIndex;
691bd4fe43Sopenharmony_ci    uint8_t anaCtrlAddr;
701bd4fe43Sopenharmony_ci    struct RtcLockAddr lockAddr;
711bd4fe43Sopenharmony_ci    RtcAlarmCallback cb;
721bd4fe43Sopenharmony_ci    struct OsalMutex mutex;
731bd4fe43Sopenharmony_ci};
741bd4fe43Sopenharmony_cistruct RtcTimeReg {
751bd4fe43Sopenharmony_ci    uint8_t millisecondAddr;
761bd4fe43Sopenharmony_ci    uint8_t secondAddr;
771bd4fe43Sopenharmony_ci    uint8_t minuteAddr;
781bd4fe43Sopenharmony_ci    uint8_t hourAddr;
791bd4fe43Sopenharmony_ci    uint8_t dayLowAddr;
801bd4fe43Sopenharmony_ci    uint8_t dayHighAddr;
811bd4fe43Sopenharmony_ci};
821bd4fe43Sopenharmony_ci
831bd4fe43Sopenharmony_ci#define RTC_SPI_WRITE           0
841bd4fe43Sopenharmony_ci#define RTC_SPI_READ            1
851bd4fe43Sopenharmony_ci
861bd4fe43Sopenharmony_ci/* RTC control over SPI */
871bd4fe43Sopenharmony_ci#define RTC_SPI_CLK_DIV(base)   ((base) + 0x000)
881bd4fe43Sopenharmony_ci#define RTC_SPI_RW(base)        ((base) + 0x004)
891bd4fe43Sopenharmony_ci
901bd4fe43Sopenharmony_ci/* RTC reg */
911bd4fe43Sopenharmony_ci#define RTC_10MS_COUN           0x00
921bd4fe43Sopenharmony_ci#define RTC_S_COUNT             0x01
931bd4fe43Sopenharmony_ci#define RTC_M_COUNT             0x02
941bd4fe43Sopenharmony_ci#define RTC_H_COUNT             0x03
951bd4fe43Sopenharmony_ci#define RTC_D_COUNT_L           0x04
961bd4fe43Sopenharmony_ci#define RTC_D_COUNT_H           0x05
971bd4fe43Sopenharmony_ci#define RTC_MR_10MS             0x06
981bd4fe43Sopenharmony_ci#define RTC_MR_S                0x07
991bd4fe43Sopenharmony_ci#define RTC_MR_M                0x08
1001bd4fe43Sopenharmony_ci#define RTC_MR_H                0x09
1011bd4fe43Sopenharmony_ci#define RTC_MR_D_L              0x0A
1021bd4fe43Sopenharmony_ci#define RTC_MR_D_H              0x0B
1031bd4fe43Sopenharmony_ci#define RTC_LR_10MS             0x0C
1041bd4fe43Sopenharmony_ci#define RTC_LR_S                0x0D
1051bd4fe43Sopenharmony_ci#define RTC_LR_M                0x0E
1061bd4fe43Sopenharmony_ci#define RTC_LR_H                0x0F
1071bd4fe43Sopenharmony_ci#define RTC_LR_D_L              0x10
1081bd4fe43Sopenharmony_ci#define RTC_LR_D_H              0x11
1091bd4fe43Sopenharmony_ci#define RTC_LORD                0x12
1101bd4fe43Sopenharmony_ci#define RTC_MSC                 0x13
1111bd4fe43Sopenharmony_ci#define RTC_INT_CLR             0x14
1121bd4fe43Sopenharmony_ci#define RTC_INT                 0x15
1131bd4fe43Sopenharmony_ci#define RTC_INT_RAW             0x16
1141bd4fe43Sopenharmony_ci#define RTC_CLK                 0x17
1151bd4fe43Sopenharmony_ci#define RTC_POR_N               0x18
1161bd4fe43Sopenharmony_ci#define RTC_SAR_CTRL            0x1A
1171bd4fe43Sopenharmony_ci#define RTC_FREQ_H              0x51
1181bd4fe43Sopenharmony_ci#define RTC_FREQ_L              0x52
1191bd4fe43Sopenharmony_ci
1201bd4fe43Sopenharmony_ci#define RTC_USER_REG1           0x53
1211bd4fe43Sopenharmony_ci#define RTC_USER_REG2           0x54
1221bd4fe43Sopenharmony_ci#define RTC_USER_REG3           0x55
1231bd4fe43Sopenharmony_ci#define RTC_USER_REG4           0x56
1241bd4fe43Sopenharmony_ci#define RTC_USER_REG5           0x57
1251bd4fe43Sopenharmony_ci#define RTC_USER_REG6           0x58
1261bd4fe43Sopenharmony_ci#define RTC_USER_REG7           0x59
1271bd4fe43Sopenharmony_ci#define RTC_USER_REG8           0x5A
1281bd4fe43Sopenharmony_ci
1291bd4fe43Sopenharmony_ci/* RTC reg value */
1301bd4fe43Sopenharmony_ci#define RTC_CLK_DIV_VALUE       0X4
1311bd4fe43Sopenharmony_ci#define RTC_MSC_ENABLE          0x4  /* 0x4:[2] bit,irq enable */
1321bd4fe43Sopenharmony_ci#define RTC_UV_CTRL_ENABLE      0x20 /* 0x20:[5] bit,low-power detect */
1331bd4fe43Sopenharmony_ci#define RTC_ANA_CTRL_ENABLE     0x02 /* 0x20:[2],ana ctl */
1341bd4fe43Sopenharmony_ci#define RTC_ANA_CTRL_ORDER      0x03 /* 0x03:ana ctl order */
1351bd4fe43Sopenharmony_ci#define RTC_LOCK_ORDER0         0xCD /* 0xCD:ctl order */
1361bd4fe43Sopenharmony_ci#define RTC_LOCK_ORDER1         0xAB /* 0xAB:ctl order */
1371bd4fe43Sopenharmony_ci#define RTC_LOCK_ORDER2         0x5A /* 0x5A:ctl order */
1381bd4fe43Sopenharmony_ci#define FREQ_H_DEFAULT          0x8
1391bd4fe43Sopenharmony_ci#define FREQ_L_DEFAULT          0x1B
1401bd4fe43Sopenharmony_ci#define RTC_CLK_OUT_SEL         0x01
1411bd4fe43Sopenharmony_ci#define RTC_INT_CLR_MASK        0x1
1421bd4fe43Sopenharmony_ci#define RTC_INT_RAW_MASK        0x2
1431bd4fe43Sopenharmony_ci#define RTC_MSC_TIME_MASK       0x1
1441bd4fe43Sopenharmony_ci#define RTC_INT_MASK            0x1
1451bd4fe43Sopenharmony_ci#define RTC_INT_UV_MASK         0x2
1461bd4fe43Sopenharmony_ci#define RTC_LOCK_BYPASS_MASK    0x4
1471bd4fe43Sopenharmony_ci#define RTC_LOCK_MASK           0x2
1481bd4fe43Sopenharmony_ci#define RTC_LOAD_MASK           0x1
1491bd4fe43Sopenharmony_ci
1501bd4fe43Sopenharmony_ci#define RETRY_CNT               500
1511bd4fe43Sopenharmony_ci#define RTC_WAIT_TIME           10
1521bd4fe43Sopenharmony_ci#define FREQ_MAX_VAL            3277000
1531bd4fe43Sopenharmony_ci#define FREQ_MIN_VAL            3276000
1541bd4fe43Sopenharmony_ci#define FREQ_ROUND_OFF_NUMBER   100 /* freq * 100 round-ff number */
1551bd4fe43Sopenharmony_ci#define REG_INDEX_MAX_VAL       8
1561bd4fe43Sopenharmony_ci#define SHIFT_BYTE              8
1571bd4fe43Sopenharmony_ci#define FREQ_DIFF               3270000
1581bd4fe43Sopenharmony_ci#define FREQ_COEFFICIENT        3052
1591bd4fe43Sopenharmony_ci#define FREQ_UNIT               10000
1601bd4fe43Sopenharmony_ci#define SHIFT_BYTE              8
1611bd4fe43Sopenharmony_ci#define MS_OF_ACCURACY          10
1621bd4fe43Sopenharmony_ci
1631bd4fe43Sopenharmony_ci#ifdef __cplusplus
1641bd4fe43Sopenharmony_ci#if __cplusplus
1651bd4fe43Sopenharmony_ci}
1661bd4fe43Sopenharmony_ci#endif /* __cplusplus */
1671bd4fe43Sopenharmony_ci#endif /* __cplusplus */
1681bd4fe43Sopenharmony_ci
1691bd4fe43Sopenharmony_ci#endif /* PLATFORM_RTC_HI35XX_H */
170