File indexing completed on 2025-05-11 08:24:05
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <dev/i2c/i2c.h>
0037 #include <libchip/abeoz9-rtc.h>
0038
0039 #include <stdint.h>
0040
0041 #define REG_ABEOZ9_CONTROL_1 0x00u
0042
0043 #define ABEOZ9_CONTROL_1_WE (0x1u << 0)
0044 #define ABEOZ9_CONTROL_1_TE (0x1u << 1)
0045 #define ABEOZ9_CONTROL_1_TAR (0x1u << 2)
0046 #define ABEOZ9_CONTROL_1_EERE (0x1u << 3)
0047 #define ABEOZ9_CONTROL_1_SROn (0x1u << 4)
0048 #define ABEOZ9_CONTROL_1_TD0 (0x1u << 5)
0049 #define ABEOZ9_CONTROL_1_TD1 (0x1u << 6)
0050 #define ABEOZ9_CONTROL_1_ClkInt (0x1u << 7)
0051
0052 #define REG_ABEOZ9_CONTROL_INT 0x01u
0053
0054 #define ABEOZ9_CONTROL_INT_AIE (0x1u << 0)
0055 #define ABEOZ9_CONTROL_INT_TIE (0x1u << 1)
0056 #define ABEOZ9_CONTROL_INT_V1IE (0x1u << 2)
0057 #define ABEOZ9_CONTROL_INT_V2IE (0x1u << 3)
0058 #define ABEOZ9_CONTROL_INT_SRIE (0x1u << 4)
0059
0060 #define REG_ABEOZ9_CONTROL_INT_FLAG 0x02u
0061
0062 #define ABEOZ9_CONTROL_INT_FLAG_AF (0x1u << 0)
0063 #define ABEOZ9_CONTROL_INT_FLAG_TF (0x1u << 1)
0064 #define ABEOZ9_CONTROL_INT_FLAG_V1IF (0x1u << 2)
0065 #define ABEOZ9_CONTROL_INT_FLAG_V2IF (0x1u << 3)
0066 #define ABEOZ9_CONTROL_INT_FLAG_SRF (0x1u << 4)
0067
0068 #define REG_ABEOZ9_CONTROL_STATUS 0x03u
0069
0070 #define ABEOZ9_CONTROL_STATUS_V1F (0x1u << 2)
0071 #define ABEOZ9_CONTROL_STATUS_V2F (0x1u << 3)
0072 #define ABEOZ9_CONTROL_STATUS_SR (0x1u << 4)
0073 #define ABEOZ9_CONTROL_STATUS_PON (0x1u << 5)
0074 #define ABEOZ9_CONTROL_STATUS_EEBusy (0x1u << 7)
0075
0076 #define REG_ABEOZ9_CONTROL_RESET 0x04u
0077
0078 #define ABEOZ9_CONTROL_RESET_SysR (0x1u << 1)
0079
0080 #define REG_ABEOZ9_CLOCK_SEC 0x08u
0081 #define REG_ABEOZ9_CLOCK_MIN 0x09u
0082 #define REG_ABEOZ9_CLOCK_HOUR 0x0au
0083 #define REG_ABEOZ9_CLOCK_WKDAY 0x0bu
0084 #define REG_ABEOZ9_CLOCK_DATE 0x0cu
0085 #define REG_ABEOZ9_CLOCK_MTH 0x0du
0086 #define REG_ABEOZ9_CLOCK_YEAR 0x0eu
0087 #define CLOCK_LEN (REG_ABEOZ9_CLOCK_YEAR + 1 - REG_ABEOZ9_CLOCK_SEC)
0088
0089 #define REG_ABEOZ9_ALARM_SEC 0x10u
0090 #define REG_ABEOZ9_ALARM_MIN 0x11u
0091 #define REG_ABEOZ9_ALARM_HOUR 0x12u
0092 #define REG_ABEOZ9_ALARM_WKDAY 0x13u
0093 #define REG_ABEOZ9_ALARM_DATE 0x14u
0094 #define REG_ABEOZ9_ALARM_MTH 0x15u
0095 #define REG_ABEOZ9_ALARM_YEAR 0x16u
0096 #define ALARM_LEN (REG_ABEOZ9_ALARM_YEAR + 1 - REG_ABEOZ9_ALARM_SEC)
0097
0098 int abeoz9_rtc_hw_init(struct i2c_rtc_base *base)
0099 {
0100 uint8_t reg;
0101 ssize_t rv;
0102 struct abeoz9_rtc *ctx =
0103 RTEMS_CONTAINER_OF(base, struct abeoz9_rtc, base);
0104
0105
0106
0107
0108 rv = i2c_rtc_read(&ctx->base, REG_ABEOZ9_CONTROL_STATUS, ®, 1);
0109 if (rv == 0) {
0110 if ((reg & (ABEOZ9_CONTROL_STATUS_PON | ABEOZ9_CONTROL_STATUS_SR)) != 0) {
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132 uint8_t clock[CLOCK_LEN] = {0, 0, 0, 1, 1, 1, 1};
0133
0134 rv = i2c_rtc_write(&ctx->base, REG_ABEOZ9_CLOCK_SEC, clock, CLOCK_LEN);
0135
0136 if (rv == 0) {
0137 reg &= ~(ABEOZ9_CONTROL_STATUS_PON | ABEOZ9_CONTROL_STATUS_SR);
0138 rv = i2c_rtc_write(&ctx->base, REG_ABEOZ9_CONTROL_STATUS, ®, 1);
0139 }
0140 } else {
0141
0142
0143
0144
0145 uint8_t alarm[ALARM_LEN] = {0, 0, 0, 0, 0, 0, 0};
0146
0147 reg = 0;
0148 rv = i2c_rtc_write(&ctx->base, REG_ABEOZ9_CONTROL_INT, ®, 1);
0149
0150 reg = 0;
0151 rv = i2c_rtc_write(&ctx->base, REG_ABEOZ9_ALARM_SEC, alarm, ALARM_LEN);
0152 }
0153 }
0154
0155 return rv;
0156 }