blob: 30b5d16f6782da663a107b424258f971fb24663c (
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
|
{$ifndef ARM7}
{$error Serial header is for ARM7 only}
{$endif ARM7}
{$ifdef NDS_INTERFACE}
const
// 'Networking'
REG_RCNT : pcuint16 = pointer($04000134);
REG_KEYXY : pcuint16 = pointer($04000136);
RTC_CR : pcuint16 = pointer($04000138);
RTC_CR8 : pcuint8 = pointer($04000138);
REG_SIOCNT : pcuint16 = pointer($04000128);
SIO_DATA8 : pcuint8 = pointer($0400012A);
SIO_DATA32 : pcuint32 = pointer($04000120);
// Fixme: Does the hardware still support 16 bit comms mode?
// BIOS makes use of 32 bit mode, so some regs still exist
SIO_MULTI_0 : pcuint16 = pointer($04000120);
SIO_MULTI_1 : pcuint16 = pointer($04000122);
SIO_MULTI_2 : pcuint16 = pointer($04000124);
SIO_MULTI_3 : pcuint16 = pointer($04000126);
SIO_MULTI_SEND : pcuint16 = pointer($0400012A);
// SPI chain registers
REG_SPICNT : pcuint16 = pointer($040001C0);
REG_SPIDATA : pcuint16 = pointer($040001C2);
SPI_ENABLE = (1 shl 15);
SPI_IRQ = (1 shl 14);
SPI_BUSY = (1 shl 7);
// Pick the SPI clock speed
SPI_BAUD_4MHZ = 0;
SPI_BAUD_2MHZ = 1;
SPI_BAUD_1MHZ = 2;
SPI_BAUD_512KHZ = 3;
// Pick the SPI transfer length
SPI_BYTE_MODE = (0 shl 10);
SPI_HWORD_MODE = (1 shl 10);
// Pick the SPI device
SPI_DEVICE_POWER = (0 shl 8);
SPI_DEVICE_FIRMWARE = (1 shl 8);
SPI_DEVICE_NVRAM = (1 shl 8);
SPI_DEVICE_TOUCH = (2 shl 8);
SPI_DEVICE_MICROPHONE = (2 shl 8);
// When used, the /CS line will stay low after the transfer ends
// i.e. when we're part of a continuous transfer
SPI_CONTINUOUS = (1 shl 11);
const
// Firmware commands
FIRMWARE_WREN = $06;
FIRMWARE_WRDI = $04;
FIRMWARE_RDID = $9F;
FIRMWARE_RDSR = $05;
FIRMWARE_READ = $03;
FIRMWARE_PW = $0A;
FIRMWARE_PP = $02;
FIRMWARE_FAST = $0B;
FIRMWARE_PE = $DB;
FIRMWARE_SE = $D8;
FIRMWARE_DP = $B9;
FIRMWARE_RDP = $AB;
procedure SerialWaitBusy(); inline;
procedure readFirmware(address: cuint32; destination: pointer; size: cuint32); cdecl; external;
{$endif NDS_INTERFACE}
{$ifdef NDS_IMPLEMENTATION}
procedure SerialWaitBusy(); inline;
begin
while (REG_SPICNT^ and SPI_BUSY) <> 0 do;
end;
{$endif NDS_IMPLEMENTATION}
|