Skip to content

Commit a06d8de

Browse files
authored
[iQue] Decompile errorled.c, GPIO register defines (#74)
* Decompile errorled.c, GPIO register defines * LED_OFF <-> LED_ON * RTC doc * Correct GPIO
1 parent ee9fd71 commit a06d8de

File tree

6 files changed

+159
-45
lines changed

6 files changed

+159
-45
lines changed

include/PR/bcp.h

+52-4
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,58 @@
7070
//! ?
7171
#define PI_5C_REG (PI_BASE_REG + 0x5C)
7272

73-
74-
75-
//! PI_MISC_REG ?
76-
#define PI_60_REG (PI_BASE_REG + 0x60)
73+
/**
74+
* [31:16] Box ID
75+
* [31:30] ?? (osInitialize checks this and sets __osBbIsBb to 2 if != 0)
76+
* [29:27] ?? (unused so far)
77+
* [26:25] ?? (system clock speed identifier?)
78+
* [24:22] ?? (bootrom, checked against MI_10_REG and copied there if mismatch)
79+
* [21:16] ?? (unused so far)
80+
* [ 7: 4] GPIO direction control
81+
* [7] RTC Data output enable
82+
* [6] RTC Clock output enable
83+
* [5] Error LED output enable
84+
* [4] Power Control output enable
85+
* [ 3: 0] GPIO in/out value
86+
* [3] RTC Data output value (0=low, 1=high)
87+
* [2] RTC Clock output value (0=low, 1=high)
88+
* [1] Error LED (0=on, 1=off)
89+
* [0] Power Control (0=off, 1=on)
90+
*/
91+
#define PI_GPIO_REG (PI_BASE_REG + 0x60)
92+
93+
/* Box ID */
94+
#define PI_GPIO_GET_BOXID(reg) ((reg) >> 16)
95+
#define PI_GPIO_BOXID_MASK_30_31 (3 << 30)
96+
97+
/* Input/Output enables */
98+
#define PI_GPIO_I_PWR ((0 << 0) << 4)
99+
#define PI_GPIO_O_PWR ((1 << 0) << 4)
100+
#define PI_GPIO_I_LED ((0 << 1) << 4)
101+
#define PI_GPIO_O_LED ((1 << 1) << 4)
102+
#define PI_GPIO_I_RTC_CLK ((0 << 2) << 4)
103+
#define PI_GPIO_O_RTC_CLK ((1 << 2) << 4)
104+
#define PI_GPIO_I_RTC_DAT ((0 << 3) << 4)
105+
#define PI_GPIO_O_RTC_DAT ((1 << 3) << 4)
106+
107+
/* Output controls */
108+
/* Power */
109+
#define PI_GPIO_PWR_OFF (0 << 0)
110+
#define PI_GPIO_PWR_ON (1 << 0)
111+
/* LED */
112+
#define PI_GPIO_LED_ON (0 << 1)
113+
#define PI_GPIO_LED_OFF (1 << 1)
114+
/* RTC */
115+
#define PI_GPIO_RTC_CLK_LO (0 << 2)
116+
#define PI_GPIO_RTC_CLK_HI (1 << 2)
117+
#define PI_GPIO_RTC_DAT_LO (0 << 3)
118+
#define PI_GPIO_RTC_DAT_HI (1 << 3)
119+
120+
/* Input getters */
121+
#define PI_GPIO_GET_PWR(reg) (((reg) >> 0) & 1)
122+
#define PI_GPIO_GET_LED(reg) (((reg) >> 1) & 1)
123+
#define PI_GPIO_GET_RTC_CLK(reg) (((reg) >> 2) & 1)
124+
#define PI_GPIO_GET_RTC_DAT(reg) (((reg) >> 3) & 1)
77125

78126

79127

src/bb/misc/boxid.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
#include "PR/bcp.h"
33

44
u32 osBbGetBoxId(void) {
5-
return IO_READ(PI_60_REG) >> 0x10;
5+
return PI_GPIO_GET_BOXID(IO_READ(PI_GPIO_REG));
66
}

src/bb/misc/errorled.c

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "PR/os_internal.h"
2+
#include "PR/bcp.h"
3+
4+
void osBbSetErrorLed(u32 value) {
5+
u32 mask = IO_READ(PI_GPIO_REG);
6+
mask &= ~PI_GPIO_LED_OFF;
7+
mask &= ~PI_GPIO_O_LED;
8+
IO_WRITE(PI_GPIO_REG, mask | ((value == 0) ? PI_GPIO_LED_OFF : PI_GPIO_LED_ON) | PI_GPIO_O_LED);
9+
}
10+
11+
u32 osBbGetErrorLed(void) {
12+
u32 v = PI_GPIO_GET_LED(IO_READ(PI_GPIO_REG));
13+
return v;
14+
}

src/bb/misc/power.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22
#include "PR/bcp.h"
33

44
void osBbPowerOn(void) {
5-
// Power control = 1, Power mask = 1
6-
IO_WRITE(PI_60_REG, 0x11);
5+
IO_WRITE(PI_GPIO_REG, PI_GPIO_O_PWR | PI_GPIO_PWR_ON);
76
}
87

98
void osBbPowerOff(void) {
10-
// Power control = 0, Power mask = 1
11-
IO_WRITE(PI_60_REG, 0x10);
9+
IO_WRITE(PI_GPIO_REG, PI_GPIO_O_PWR | PI_GPIO_PWR_OFF);
1210
}

src/bb/misc/rtc.c

+89-35
Original file line numberDiff line numberDiff line change
@@ -2,95 +2,149 @@
22
#include "bcp.h"
33
#include "macros.h"
44

5+
#define RTC_MASK ((PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_HI) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI))
6+
7+
#define RTC_ADDR 0xD0
8+
#define RTC_WR 0
9+
#define RTC_RD 1
10+
511
void __osBbDelay(u32 usec);
612

713
static void write_rtc(u32 x) {
8-
IO_WRITE(PI_60_REG, x);
14+
IO_WRITE(PI_GPIO_REG, x);
915
__osBbDelay(2);
1016
}
1117

1218
static void send_start(u8 write) {
1319
u32 i;
1420
u32 j;
15-
u32 mask = IO_READ(PI_60_REG) & ~0xCC;
21+
u32 mask = IO_READ(PI_GPIO_REG) & ~RTC_MASK;
1622
u8 byte[2];
1723

18-
byte[0] = (!write) ? 0xD1 : 0xD0;
24+
byte[0] = (!write) ? (RTC_ADDR | RTC_RD) : (RTC_ADDR | RTC_WR);
1925
byte[1] = 0;
2026

21-
write_rtc(mask | 0xC4);
22-
write_rtc(mask | 0xC0);
27+
// Send start signal (DAT HIGH -> LOW while CLK HIGH) assuming both CLK and DAT were initially HIGH
28+
// Cyc -1 | 0 | 1
29+
// CLK ‾‾‾|‾‾‾|___
30+
// DAT ‾‾‾|___|___
31+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_LO) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
32+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_LO) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
2333

2434
for (i = 0; i < write + 1; i++) {
35+
// Send address in byte[0], for writes also send word address in byte[1]
2536
for (j = 0; j < 8; j++) {
26-
u32 b = ((byte[i] >> (7 - j)) & 1) ? 8 : 0;
27-
28-
write_rtc(mask | (0x80 | b) | 0x40);
29-
write_rtc(mask | (0x80 | b) | 0x44);
30-
write_rtc(mask | (0x80 | b) | 0x40);
37+
u32 b = ((byte[i] >> (7 - j)) & 1) ? PI_GPIO_RTC_DAT_HI : PI_GPIO_RTC_DAT_LO;
38+
39+
// Transmit single bit to the RTC
40+
// Cyc 0 | 1 | 2
41+
// CLK ___|‾‾‾|___
42+
// DAT b | b | b
43+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | b) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
44+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | b) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
45+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | b) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
3146
}
32-
write_rtc(mask | 0x40);
33-
write_rtc(mask | 0x44);
47+
48+
// Toggle CLK to receive ACK from the RTC, but don't read it
49+
// Cyc 0 | 1
50+
// CLK ___|‾‾‾
51+
// DAT x | x
52+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
53+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
3454
}
35-
write_rtc(mask | 0x40);
55+
56+
// End on CLK LOW
57+
// Cyc 0
58+
// CLK ___
59+
// DAT x
60+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
3661
}
3762

3863
static void send_stop(void) {
39-
u32 mask = IO_READ(PI_60_REG) & ~0xCC;
40-
write_rtc(mask | 0x80 | 0x40);
41-
write_rtc(mask | 0x80 | 0x44);
42-
write_rtc(mask | 0x80 | 0x4C);
64+
u32 mask = IO_READ(PI_GPIO_REG) & ~RTC_MASK;
65+
66+
// Send stop signal (DAT LOW -> HIGH while CLK HIGH)
67+
// Cyc 0 | 1 | 2
68+
// CLK ___|‾‾‾|‾‾‾
69+
// DAT ___|___|‾‾‾
70+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_LO) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
71+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_LO) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
72+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_HI) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
4373
}
4474

4575
static void read_bytes(u8* bytes, u8 len) {
4676
u32 ack;
4777
u32 i;
48-
u32 mask = IO_READ(PI_60_REG) & ~0xCC;
78+
u32 mask = IO_READ(PI_GPIO_REG) & ~RTC_MASK;
4979

5080
while (len-- > 0) {
5181
u32 x = 0;
5282

83+
// Read 1 byte
5384
for (i = 0; i < 8; i++) {
54-
write_rtc(mask | 0x40);
55-
write_rtc(mask | 0x44);
85+
// Toggle CLK to receive the bit from the RTC
86+
// Cyc 0 | 1
87+
// CLK ___|‾‾‾
88+
// DAT x | x
89+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
90+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
91+
92+
// Read the bit sent by the RTC
5693
x <<= 1;
57-
x |= (IO_READ(PI_60_REG) >> 3) & 1;
94+
x |= PI_GPIO_GET_RTC_DAT(IO_READ(PI_GPIO_REG));
5895
}
5996
*(bytes++) = x;
6097

61-
ack = (len == 0) ? 0x88 : 0x80;
98+
ack = (len == 0) ? (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_HI) : (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_LO);
6299

63-
write_rtc(mask | 0x40 | 0x80);
64-
write_rtc(mask | 0x44 | ack);
100+
// Send ACK or NACK, DAT HIGH is NACK while DAT LOW is ACK. NACK is sent at th end.
101+
// Cyc 0 | 1
102+
// CLK ___|‾‾‾
103+
// DAT ___| a
104+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_LO) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
105+
write_rtc(mask | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI) | ack);
65106
}
66107
send_stop();
67108
}
68109

69110
static void write_bytes(u8* bytes, u8 len) {
70111
u32 i;
71-
u32 mask = IO_READ(PI_60_REG) & ~0xCC;
112+
u32 mask = IO_READ(PI_GPIO_REG) & ~RTC_MASK;
72113

73114
while (len-- > 0) {
74115
u32 x = *(bytes++);
75116

76117
for (i = 0; i < 8; i++) {
77-
u32 b = (x & 0x80) ? 8 : 0;
78-
79-
write_rtc(mask | (0x80 | b) | 0x40);
80-
write_rtc(mask | (0x80 | b) | 0x44);
81-
write_rtc(mask | (0x80 | b) | 0x44);
118+
u32 b = (x & 0x80) ? PI_GPIO_RTC_DAT_HI : PI_GPIO_RTC_DAT_LO;
119+
120+
// Transmit single bit to the RTC
121+
// Cyc 0 | 1 | 2
122+
// CLK ___|‾‾‾|‾‾‾
123+
// DAT b | b | b
124+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | b) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
125+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | b) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
126+
write_rtc(mask | (PI_GPIO_O_RTC_DAT | b) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
82127
x <<= 1;
83128
}
84-
write_rtc(mask | 0x40);
85-
write_rtc(mask | 0x44);
86-
IO_READ(PI_60_REG);
87-
write_rtc(mask | 0x40);
129+
130+
// Toggle CLK to receive ACK from the RTC, read but don't check?
131+
// Cyc 0 | 1 | 2 | 3
132+
// CLK ___|‾‾‾|‾‾‾|___
133+
// DAT x | x | x | x
134+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
135+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
136+
IO_READ(PI_GPIO_REG);
137+
write_rtc(mask | PI_GPIO_I_RTC_DAT | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_LO));
88138
}
89139
send_stop();
90140
}
91141

92142
void osBbRtcInit(void) {
93-
write_rtc(IO_READ(PI_60_REG) | 0xCC);
143+
// Set line state to idle (both CLK and DAT HIGH)
144+
// Cyc 0
145+
// CLK ‾‾‾
146+
// DAT ‾‾‾
147+
write_rtc(IO_READ(PI_GPIO_REG) | (PI_GPIO_O_RTC_DAT | PI_GPIO_RTC_DAT_HI) | (PI_GPIO_O_RTC_CLK | PI_GPIO_RTC_CLK_HI));
94148
}
95149

96150
void osBbRtcSet(u8 year, u8 month, u8 day, u8 dow, u8 hour, u8 min, u8 sec) {

src/os/initialize.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void INITIALIZE_FUNC() {
106106
}
107107

108108
if (__osBbIsBb) {
109-
if (IO_READ(PI_60_REG) & 0xC0000000) {
109+
if (IO_READ(PI_GPIO_REG) & PI_GPIO_BOXID_MASK_30_31) {
110110
__osBbIsBb = 2;
111111
}
112112
}

0 commit comments

Comments
 (0)