summaryrefslogtreecommitdiff
path: root/src/siirtc.c
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2019-03-23 09:39:46 -0500
committerMarcus Huderle <huderlem@gmail.com>2019-03-23 09:39:46 -0500
commit65391a1eb2979dc050dd4a98afea02bb0ef310ea (patch)
treee31a90d0966cec7e8713ead9ca8083d439c8d9b5 /src/siirtc.c
parenteb48cc2f7eefc1e56c2dcec21c38381b4534b897 (diff)
parentabe56579c107af58e6f3a43968ba2257ff358189 (diff)
Merge remote-tracking branch 'upstream/master' into use_pokeblock
# Conflicts: # src/use_pokeblock.c
Diffstat (limited to 'src/siirtc.c')
-rw-r--r--src/siirtc.c139
1 files changed, 76 insertions, 63 deletions
diff --git a/src/siirtc.c b/src/siirtc.c
index 965a068f1..5c153a841 100644
--- a/src/siirtc.c
+++ b/src/siirtc.c
@@ -46,6 +46,19 @@
#define CMD_TIME CMD(3)
#define CMD_ALARM CMD(4)
+#define SCK_HI 1
+#define SIO_HI 2
+#define CS_HI 4
+
+#define DIR_0_IN 0
+#define DIR_0_OUT 1
+#define DIR_1_IN 0
+#define DIR_1_OUT 2
+#define DIR_2_IN 0
+#define DIR_2_OUT 4
+#define DIR_ALL_IN (DIR_0_IN | DIR_1_IN | DIR_2_IN)
+#define DIR_ALL_OUT (DIR_0_OUT | DIR_1_OUT | DIR_2_OUT)
+
#define GPIO_PORT_DATA (*(vu16 *)0x80000C4)
#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6)
#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8)
@@ -63,19 +76,19 @@ static void DisableGpioPortRead();
static const char AgbLibRtcVersion[] = "SIIRTC_V001";
-void SiiRtcUnprotect()
+void SiiRtcUnprotect(void)
{
EnableGpioPortRead();
sLocked = FALSE;
}
-void SiiRtcProtect()
+void SiiRtcProtect(void)
{
DisableGpioPortRead();
sLocked = TRUE;
}
-u8 SiiRtcProbe()
+u8 SiiRtcProbe(void)
{
u8 errorCode;
struct SiiRtcInfo rtc;
@@ -116,7 +129,7 @@ u8 SiiRtcProbe()
return (errorCode << 4) | 1;
}
-bool8 SiiRtcReset()
+bool8 SiiRtcReset(void)
{
u8 result;
struct SiiRtcInfo rtc;
@@ -126,15 +139,15 @@ bool8 SiiRtcReset()
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_RESET | WR);
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -154,14 +167,14 @@ bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc)
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_STATUS | RD);
- GPIO_PORT_DIRECTION = 5;
+ GPIO_PORT_DIRECTION = DIR_0_OUT | DIR_1_IN | DIR_2_OUT;
statusData = ReadData();
@@ -170,8 +183,8 @@ bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc)
| ((statusData & STATUS_INTME) >> 2)
| ((statusData & STATUS_INTFE) >> 1);
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -187,22 +200,22 @@ bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc)
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
statusData = STATUS_24HOUR
| ((rtc->status & SIIRTCINFO_INTAE) << 3)
| ((rtc->status & SIIRTCINFO_INTME) << 2)
| ((rtc->status & SIIRTCINFO_INTFE) << 1);
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_STATUS | WR);
WriteData(statusData);
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -218,22 +231,22 @@ bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc)
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_DATETIME | RD);
- GPIO_PORT_DIRECTION = 5;
+ GPIO_PORT_DIRECTION = DIR_0_OUT | DIR_1_IN | DIR_2_OUT;
for (i = 0; i < DATETIME_BUF_LEN; i++)
DATETIME_BUF(rtc, i) = ReadData();
INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -249,18 +262,18 @@ bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc)
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_DATETIME | WR);
for (i = 0; i < DATETIME_BUF_LEN; i++)
WriteData(DATETIME_BUF(rtc, i));
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -276,22 +289,22 @@ bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc)
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_TIME | RD);
- GPIO_PORT_DIRECTION = 5;
+ GPIO_PORT_DIRECTION = DIR_0_OUT | DIR_1_IN | DIR_2_OUT;
for (i = 0; i < TIME_BUF_LEN; i++)
TIME_BUF(rtc, i) = ReadData();
INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -307,18 +320,18 @@ bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc)
sLocked = TRUE;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIO_PORT_DIRECTION = 7;
+ GPIO_PORT_DIRECTION = DIR_ALL_OUT;
WriteCommand(CMD_TIME | WR);
for (i = 0; i < TIME_BUF_LEN; i++)
WriteData(TIME_BUF(rtc, i));
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -347,18 +360,18 @@ bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc)
alarmData[1] = rtc->alarmMinute;
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
- GPIOPortDirection = 7; // Why is this the only instance that uses a symbol?
+ GPIOPortDirection = DIR_ALL_OUT; // Why is this the only instance that uses a symbol?
WriteCommand(CMD_ALARM | WR);
for (i = 0; i < 2; i++)
WriteData(alarmData[i]);
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = SCK_HI;
+ GPIO_PORT_DATA = SCK_HI;
sLocked = FALSE;
@@ -373,10 +386,10 @@ static int WriteCommand(u8 value)
for (i = 0; i < 8; i++)
{
temp = ((value >> (7 - i)) & 1);
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 5;
+ GPIO_PORT_DATA = (temp << 1) | CS_HI;
+ GPIO_PORT_DATA = (temp << 1) | CS_HI;
+ GPIO_PORT_DATA = (temp << 1) | CS_HI;
+ GPIO_PORT_DATA = (temp << 1) | SCK_HI | CS_HI;
}
// control reaches end of non-void function
@@ -390,10 +403,10 @@ static int WriteData(u8 value)
for (i = 0; i < 8; i++)
{
temp = ((value >> i) & 1);
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 5;
+ GPIO_PORT_DATA = (temp << 1) | CS_HI;
+ GPIO_PORT_DATA = (temp << 1) | CS_HI;
+ GPIO_PORT_DATA = (temp << 1) | CS_HI;
+ GPIO_PORT_DATA = (temp << 1) | SCK_HI | CS_HI;
}
// control reaches end of non-void function
@@ -407,14 +420,14 @@ static u8 ReadData()
for (i = 0; i < 8; i++)
{
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 5;
-
- temp = ((GPIO_PORT_DATA & 2) >> 1);
+ GPIO_PORT_DATA = CS_HI;
+ GPIO_PORT_DATA = CS_HI;
+ GPIO_PORT_DATA = CS_HI;
+ GPIO_PORT_DATA = CS_HI;
+ GPIO_PORT_DATA = CS_HI;
+ GPIO_PORT_DATA = SCK_HI | CS_HI;
+
+ temp = ((GPIO_PORT_DATA & SIO_HI) >> 1);
value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var
}