summaryrefslogtreecommitdiff
path: root/src/code/lbrtc/lbrtc_init.c
blob: e2980659d4c7ab26ed86754e39f114db6e43cca3 (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
#include "lbrtc.h"
#include "attributes.h"

s32 D_801160C0_jp = 0;

s32 lbrtc_init(OSMesgQueue* mq) {
    s32 ret;
    u8 status;
    UNUSED s32 pad;
    __OSContRTCControlRegs rtc[1];

    ret = func_800FE480_jp(mq, &status);
    if (ret == 0) {
        if (D_801160C0_jp == 0) {
            osCreateMesgQueue(&__contRTCMesgQ, &__contRTCMesg, OS_MESG_BLOCK);
            D_801160C0_jp = 1;
        }
        if (status & RTC_STATUS_STOPPED) {
            ret = func_800FEE10_jp(mq, RTC_CR_BLOCK_TYPE, (u8*)&rtc);
            if ((ret == 0) || (ret == RTC_STOPPED)) {
                rtc[0].flagsBitfield &= ~RTC_WRITE_STOP_COUNT2_BIT;
                ret = func_800FE8D0_jp(mq, RTC_CR_BLOCK_TYPE, (u8*)&rtc);
            }
        }
        if (status & RTC_STATUS_BATTERY_FAILURE) {
            ret = (status & RTC_STATUS_CRYSTAL_FAILURE) ? 0x13 : RTC_ERR_BATTERY;

        } else if (status & RTC_STATUS_CRYSTAL_FAILURE) {
            ret = RTC_ERR_CRYSTAL;
        }
    }
    return ret;
}