summaryrefslogtreecommitdiff
path: root/include/ultra64/bcp.h
blob: f66fee2f029a0da61d0e64d75feb4a118b5c543e (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#ifndef BCP_H
#define BCP_H

#include "rcp.h"

/******************************************************************************
 * Additional MIPS Interface (MI) Registers
 */

/**
 * Accesses to this register outside of Secure Mode cause an NMI to transfer control
 * to the Secure Kernel.
 *
 * [25] ?: System software writes to this bit when launching an app or game
 * [24] SK RAM Access: Set to 1 to enable access to 0x8000 bytes at 0x1FC40000
 *  [7] Secure Trap Cause: Memory card removed
 *  [6] Secure Trap Cause: Power button pressed
 *  [5] Secure Trap Cause: MI Error
 *  [4] Secure Trap Cause: PI Error
 *  [3] Secure Trap Cause: Timer expired
 *  [2] Secure Trap Cause: Syscall via read of this register outside of secure mode
 *  [1] Boot ROM Swap: 0 = SK mapped at 0x1FC00000, Boot ROM mapped at 0x1FC20000
 *                     1 = Boot ROM mapped at 0x1FC00000, SK mapped at 0x1FC20000
 *  [0] Secure Mode: 0 = not in secure mode
 *                   1 = in secure mode
 */
#define MI_SECURE_EXCEPTION_REG (MI_BASE_REG + 0x14)

/**
 * Read:
 *  [25] MD (active, 1 if card is currently disconnected else 0)
 *  [24] Power Button (active, 1 if button is currently pressed else 0)
 *  [13] MD (pending interrupt)
 *  [12] Power Button (pending interrupt)
 *  [11] USB1
 *  [10] USB0
 *  [ 9] PI_ERR
 *  [ 8] IDE
 *  [ 7] AES
 *  [ 6] FLASH
 *  [ 5] DP
 *  [ 4] PI
 *  [ 3] VI
 *  [ 2] AI
 *  [ 1] SI
 *  [ 0] SP
 *
 * Write:
 *  [13] Clear MD Interrupt
 */
#define MI_EX_INTR_REG (MI_BASE_REG + 0x38)

/*
 * MI_EX_INTR_REG: read bits
 */
#define MI_EX_INTR_SP               (1 <<  0)
#define MI_EX_INTR_SI               (1 <<  1)
#define MI_EX_INTR_AI               (1 <<  2)
#define MI_EX_INTR_VI               (1 <<  3)
#define MI_EX_INTR_PI               (1 <<  4)
#define MI_EX_INTR_DP               (1 <<  5)
#define MI_EX_INTR_FLASH            (1 <<  6)
#define MI_EX_INTR_AES              (1 <<  7)
#define MI_EX_INTR_IDE              (1 <<  8)
#define MI_EX_INTR_PI_ERR           (1 <<  9)
#define MI_EX_INTR_USB0             (1 << 10)
#define MI_EX_INTR_USB1             (1 << 11)
#define MI_EX_INTR_PWR_BTN          (1 << 12)
#define MI_EX_INTR_MD               (1 << 13)
#define MI_EX_INTR_PWR_BTN_PRESSED  (1 << 24)   /* updated in real-time, unrelated to interrupt */
#define MI_EX_INTR_CARD_NOT_PRESENT (1 << 25)   /* updated in real-time, unrelated to interrupt */

#define MI_EX_INTR_ALL                                                             \
   (MI_EX_INTR_FLASH | MI_EX_INTR_AES  | MI_EX_INTR_IDE     | MI_EX_INTR_PI_ERR  | \
    MI_EX_INTR_USB0  | MI_EX_INTR_USB1 | MI_EX_INTR_PWR_BTN | MI_EX_INTR_MD)

/*
 * MI_EX_INTR_REG: write bits
 */
#define MI_EX_INTR_CLR_MD           (1 << 13)

/**
 * Write:
 *  [27:26] Set/Clear MD
 *  [25:24] Set/Clear BUTTON
 *  [23:22] Set/Clear USB1
 *  [21:20] Set/Clear USB0
 *  [19:18] Set/Clear PI_ERR
 *  [17:16] Set/Clear IDE
 *  [15:14] Set/Clear AES
 *  [13:12] Set/Clear FLASH
 *  [11:10] Set/Clear DP
 *  [ 9: 8] Set/Clear PI
 *  [ 7: 6] Set/Clear VI
 *  [ 5: 4] Set/Clear AI
 *  [ 3: 2] Set/Clear SI
 *  [ 1: 0] Set/Clear SP
 *
 * Read:
 *  [13] MD
 *  [12] BUTTON
 *  [11] USB1
 *  [10] USB0
 *  [ 9] PI_ERR
 *  [ 8] IDE
 *  [ 7] AES
 *  [ 6] FLASH
 *  [ 5] DP
 *  [ 4] PI
 *  [ 3] VI
 *  [ 2] AI
 *  [ 1] SI
 *  [ 0] SP
 */
#define MI_EX_INTR_MASK_REG (MI_BASE_REG + 0x3C)

/*
 * MI_EX_INTR_MASK_REG: write bits
 */
#define MI_EX_INTR_MASK_CLR_SP      (1 <<  0)  /* clear SP      mask */
#define MI_EX_INTR_MASK_SET_SP      (1 <<  1)  /*   set SP      mask */
#define MI_EX_INTR_MASK_CLR_SI      (1 <<  2)  /* clear SI      mask */
#define MI_EX_INTR_MASK_SET_SI      (1 <<  3)  /*   set SI      mask */
#define MI_EX_INTR_MASK_CLR_AI      (1 <<  4)  /* clear AI      mask */
#define MI_EX_INTR_MASK_SET_AI      (1 <<  5)  /*   set AI      mask */
#define MI_EX_INTR_MASK_CLR_VI      (1 <<  6)  /* clear VI      mask */
#define MI_EX_INTR_MASK_SET_VI      (1 <<  7)  /*   set VI      mask */
#define MI_EX_INTR_MASK_CLR_PI      (1 <<  8)  /* clear PI      mask */
#define MI_EX_INTR_MASK_SET_PI      (1 <<  9)  /*   set PI      mask */
#define MI_EX_INTR_MASK_CLR_DP      (1 << 10)  /* clear DP      mask */
#define MI_EX_INTR_MASK_SET_DP      (1 << 11)  /*   set DP      mask */
#define MI_EX_INTR_MASK_CLR_FLASH   (1 << 12)  /* clear FLASH   mask */
#define MI_EX_INTR_MASK_SET_FLASH   (1 << 13)  /*   set FLASH   mask */
#define MI_EX_INTR_MASK_CLR_AES     (1 << 14)  /* clear AES     mask */
#define MI_EX_INTR_MASK_SET_AES     (1 << 15)  /*   set AES     mask */
#define MI_EX_INTR_MASK_CLR_IDE     (1 << 16)  /* clear IDE     mask */
#define MI_EX_INTR_MASK_SET_IDE     (1 << 17)  /*   set IDE     mask */
#define MI_EX_INTR_MASK_CLR_PI_ERR  (1 << 18)  /* clear PI_ERR  mask */
#define MI_EX_INTR_MASK_SET_PI_ERR  (1 << 19)  /*   set PI_ERR  mask */
#define MI_EX_INTR_MASK_CLR_USB0    (1 << 20)  /* clear USB0    mask */
#define MI_EX_INTR_MASK_SET_USB0    (1 << 21)  /*   set USB0    mask */
#define MI_EX_INTR_MASK_CLR_USB1    (1 << 22)  /* clear USB1    mask */
#define MI_EX_INTR_MASK_SET_USB1    (1 << 23)  /*   set USB1    mask */
#define MI_EX_INTR_MASK_CLR_PWR_BTN (1 << 24)  /* clear PWR_BTN mask */
#define MI_EX_INTR_MASK_SET_PWR_BTN (1 << 25)  /*   set PWR_BTN mask */
#define MI_EX_INTR_MASK_CLR_MD      (1 << 26)  /* clear MD      mask */
#define MI_EX_INTR_MASK_SET_MD      (1 << 27)  /*   set MD      mask */

/*
 * MI_EX_INTR_MASK_REG: read bits
 */
#define MI_EX_INTR_MASK_SP      (1 <<  0)   /* SP      intr mask */
#define MI_EX_INTR_MASK_SI      (1 <<  1)   /* SI      intr mask */
#define MI_EX_INTR_MASK_AI      (1 <<  2)   /* AI      intr mask */
#define MI_EX_INTR_MASK_VI      (1 <<  3)   /* VI      intr mask */
#define MI_EX_INTR_MASK_PI      (1 <<  4)   /* PI      intr mask */
#define MI_EX_INTR_MASK_DP      (1 <<  5)   /* DP      intr mask */
#define MI_EX_INTR_MASK_FLASH   (1 <<  6)   /* FLASH   intr mask */
#define MI_EX_INTR_MASK_AES     (1 <<  7)   /* AES     intr mask */
#define MI_EX_INTR_MASK_IDE     (1 <<  8)   /* IDE     intr mask */
#define MI_EX_INTR_MASK_PI_ERR  (1 <<  9)   /* PI_ERR  intr mask */
#define MI_EX_INTR_MASK_USB0    (1 << 10)   /* USB0    intr mask */
#define MI_EX_INTR_MASK_USB1    (1 << 11)   /* USB1    intr mask */
#define MI_EX_INTR_MASK_PWR_BTN (1 << 12)   /* PWR_BTN intr mask */
#define MI_EX_INTR_MASK_MD      (1 << 13)   /* MD      intr mask */

/******************************************************************************
 * Additional Parallel Interface (PI) Registers
 */

/**
 * Write:
 *     [31] Execute command after write
 *     [30] Interrupt when done
 *  [29:24] ?
 *  [23:16] NAND Command
 *     [15] ?
 *     [14] Buffer Select
 *  [13:12] Device Select
 *     [11] Do Error Correction
 *     [10] NAND Command is Multi-Cycle
 *  [ 9: 0] Data Transfer Length in Bytes
 *
 * Writing 0 to this register clears the interrupt
 *
 * Read:
 *     [31] Busy
 *     [11] Single-Bit Error Corrected
 *     [10] Double-Bit Error Uncorrectable
 */
#define PI_NAND_CTRL_REG (PI_BASE_REG + 0x48)

/**
 * PI internal buffer DMA read length. Writes initiate a DMA from RDRAM to the PI buffer.
 */
#define PI_EX_RD_LEN_REG (PI_BASE_REG + 0x58)

/**
 * PI internal buffer DMA write length. Writes initiate a DMA from the PI buffer to RDRAM.
 */
#define PI_EX_WR_LEN_REG (PI_BASE_REG + 0x5C)

/**
 * [31:16] Box ID
 *   [31:30] Hardware Revision? (osInitialize checks this and sets __osBbIsBb to 2 if != 0)
 *   [29:27] ?? (not seen)
 *   [26:25] ?? (system clock speed identifier?)
 *   [24:22] ?? (bootrom, checked against MI_10_REG and copied there if mismatch)
 *   [21:16] ?? (not seen)
 * [ 7: 4] GPIO direction control
 *     [7] RTC Data output enable
 *     [6] RTC Clock output enable
 *     [5] Error LED output enable
 *     [4] Power Control output enable
 * [ 3: 0] GPIO in/out value
 *     [3] RTC Data output value (0=low, 1=high)
 *     [2] RTC Clock output value (0=low, 1=high)
 *     [1] Error LED (0=on, 1=off)
 *     [0] Power Control (0=off, 1=on)
 */
#define PI_GPIO_REG (PI_BASE_REG + 0x60)

/* Box ID */
#define PI_GPIO_GET_BOXID(reg)  ((reg) >> 16)
#define PI_GPIO_IS_HW_V2(reg)   ((reg) & (3 << 30))

/* GPIO: Input/Output enables */
#define PI_GPIO_I_PWR       ((0 << 0) << 4)
#define PI_GPIO_O_PWR       ((1 << 0) << 4)
#define PI_GPIO_I_LED       ((0 << 1) << 4)
#define PI_GPIO_O_LED       ((1 << 1) << 4)
#define PI_GPIO_I_RTC_CLK   ((0 << 2) << 4)
#define PI_GPIO_O_RTC_CLK   ((1 << 2) << 4)
#define PI_GPIO_I_RTC_DAT   ((0 << 3) << 4)
#define PI_GPIO_O_RTC_DAT   ((1 << 3) << 4)

/* GPIO: Output controls */
/* Power */
#define PI_GPIO_PWR_OFF     (0 << 0)
#define PI_GPIO_PWR_ON      (1 << 0)
/* LED */
#define PI_GPIO_LED_ON      (0 << 1)
#define PI_GPIO_LED_OFF     (1 << 1)
/* RTC */
#define PI_GPIO_RTC_CLK_LO  (0 << 2)
#define PI_GPIO_RTC_CLK_HI  (1 << 2)
#define PI_GPIO_RTC_DAT_LO  (0 << 3)
#define PI_GPIO_RTC_DAT_HI  (1 << 3)

/* GPIO: Input getters */
#define PI_GPIO_GET_PWR(reg)     (((reg) >> 0) & 1)
#define PI_GPIO_GET_LED(reg)     (((reg) >> 1) & 1)
#define PI_GPIO_GET_RTC_CLK(reg) (((reg) >> 2) & 1)
#define PI_GPIO_GET_RTC_DAT(reg) (((reg) >> 3) & 1)

/**
 * [31] ?
 */
#define PI_64_REG (PI_BASE_REG + 0x64)

/******************************************************************************
 * Additional Serial Interface (SI) Registers
 */

/**
 * ?
 */
#define SI_0C_REG (SI_BASE_REG + 0x0C)

/**
 * ?
 */
#define SI_1C_REG (SI_BASE_REG + 0x1C)

#endif