summaryrefslogtreecommitdiff
path: root/include/lbrtc.h
blob: cf42577d1a3e035eb33488202638e72a032a87d2 (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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#ifndef LBRTC_H
#define LBRTC_H

#include "ultra64.h"

typedef struct OSRTCTime { // assumed from m_flashrom
    /* 0x00 */ u8 sec;
    /* 0x01 */ u8 min;
    /* 0x02 */ u8 hour;
    /* 0x03 */ u8 day;
    /* 0x04 */ u8 weekday;
    /* 0x05 */ u8 month;
    /* 0x06 */ u16 year;
} OSRTCTime; // size = 0x8

// Internal 

// docs from: https://n64brew.dev/wiki/Joybus_Protocol

#define RTC_CR_BLOCK_TYPE 0
#define RTC_SRAM_BLOCK_TYPE 1
#define RTC_TIME_BLOCK_TYPE 2
#define RTC_BLOCK_TYPE_3 3

#define CONT_CMD_RTC_INFO 6
#define CONT_CMD_READ_RTC 7
#define CONT_CMD_WRITE_RTC 8

#define CONT_CMD_RTC_INFO_TX 1
#define CONT_CMD_RTC_INFO_RX 3

#define CONT_CMD_READ_RTC_TX 2
#define CONT_CMD_READ_RTC_RX 9

#define CONT_CMD_WRITE_RTC_TX 10
#define CONT_CMD_WRITE_RTC_RX 1

#define RTC_STATUS_STOPPED 0x80
#define RTC_STATUS_CRYSTAL_FAILURE 0x2
#define RTC_STATUS_BATTERY_FAILURE 0x1

#define RTC_ERR_BATTERY 0x11
#define RTC_ERR_CRYSTAL 0x12

#define RTC_STOPPED 0x10

typedef struct __OSContRTCData {
    /* 0x00 */ u8 sec;
    /* 0x01 */ u8 min;
    /* 0x02 */ u8 hour;
    /* 0x03 */ u8 day;
    /* 0x04 */ u8 weekday;
    /* 0x05 */ u8 month;
    /* 0x06 */ u8 yearLo;
    /* 0x07 */ u8 centuriesSince1900; 
} __OSContRTCData; // size = 0x8

typedef struct __OSContRTCRWFormat {
    /* 0x0 */ u8 txsize;
    /* 0x1 */ u8 rxsize;
    /* 0x2 */ u8 cmd; 
    /* 0x3 */ u8 blockType;
    /* 0x4 */ __OSContRTCData data; 
    /* 0xC */ u8 status;
} __OSContRTCRWFormat; // size = 0xD

typedef struct __OSContRTCInfoFormat {
    /* 0x0 */ u8 txsize;
    /* 0x1 */ u8 rxsize;
    /* 0x2 */ u8 cmd;
    /* 0x3 */ u8 unk3;
    /* 0x4 */ u8 unk4;
    /* 0x5 */ u8 status;
} __OSContRTCInfoFormat; // size = 0x6

#define RTC_WRITE_PROTECT_NVRAM_BIT 1
#define RTC_WRITE_PROTECT_RTC_BIT 2
#define RTC_WRITE_STOP_COUNT_BIT 4
#define RTC_WRITE_STOP_COUNT2_BIT 6

typedef struct __OSContRTCControlRegs {
    /* 0x0 */ u8 writeProtectBitfield;
    /* 0x1 */ u8 flagsBitfield;
} __OSContRTCControlRegs; // size = 0x2

extern OSMesgQueue __contRTCMesgQ;
extern OSMesg __contRTCMesg;

//

s32 lbrtc_getTime(OSMesgQueue* mq, OSRTCTime* time);
s32 func_800FE420_jp(OSMesgQueue* mq, OSRTCTime* time);
s32 func_800FE480_jp(OSMesgQueue* mq, u8* status);
s32 lbrtc_setTime(OSMesgQueue* mq, OSRTCTime* time);
s32 func_800FE8D0_jp(OSMesgQueue* mq, u8 blockType, u8* data);
s32 func_800FEABC_jp(u8 blockType, u8* data);
s32 func_800FEBE0_jp(OSMesgQueue* mq, OSRTCTime* time);
s32 lbrtc_init(OSMesgQueue* mq);
s32 func_800FEE10_jp(OSMesgQueue* mq, u8 blockType, u8* buf);
void func_800FEF9C_jp(u8 blockType);
s32 lbrtc_GetIntervalMinutes(OSRTCTime* t0, OSRTCTime* t1);

#endif