EverDrive-64 v3: Difference between revisions

m (nits)
 
(10 intermediate revisions by the same user not shown)
Line 41:
| 0x08040018 || REG_SPI || R/W || SPI (SD card) DAT/CMD (write invoke CLK)
|-
| 0x0804001C || REG_SPI_CFG || R/W || SPI (SD card) configurations
|-
| 0x08040020 || REG_KEY || W || Enable or disable ED64 registers
|-
| 0x08040024 || REG_SAV_CFG || R/W || Save configurations (EEPROM/SRAM/FLASH)
|-
| 0x08040028 || REG_SEC || ? || ?
|-
| 0x0804002C || REG_VER || R || HardwareFirmware version
|-
| 0x08040030 || ? || R/W || I2C to access RTC
Line 59:
| 0x0804003C || ? || ? || ?
|-
| 0x08040040 || REG_CFG_CNT || ?R/W || FPGA? configuration control
|-
| 0x08040044 || REG_CFG_DAT || ?W || FPGA? configuration data
|-
| 0x08040048 || MAX_MSG || R/W || Some configurations
Line 80:
! bit from lsb !! description
|-
| 15 || 1=startfinish FPGA configuration?? (after REG_CFG_* writes)
|-
| 9-8 || D64 specific??
|-
| 6-5 ||RTC (00=disable, 01=RTC emulation enabled through Cart EEPROM command 06/07, 11=RTC access enabled via I2C)
| 6-5 || I2C/RTC??
|-
| 3 || WR_ADDR_MASK??
Line 198:
 
=== 0x0804001C (REG_SPI_CFG) ===
Read/Write only
{| class="wikitable"
!bit from lsb
Line 231:
 
=== 0x08040024 (REG_SAV_CFG) ===
Read/Write only
{| class="wikitable"
!bit from lsb
Line 237:
|-
|15
|1=enable ED64 save page
|always 1?
|-
|7
|1=enable game save page (have priority than ED64 page)
|unknown but 1?
|-
|3
Line 259:
!description
|-
|0x0080
|0x8080
|Save is disabled
|-
|0x0082
|0x8082
|32KiB SRAM enabled
|-
|0x008A
|0x808A
|128KiB SRAM enabled
|-
|0x0081
|0x8081
|4kibit EEPROM enabled
|-
|0x0085
|0x8085
|16kibit EEPROM enabled
|-
|0x0088
|0x8088
|128KiB Flash enabled (!?)
|-
|0x800A
|128KiB ED64 save page enabled (mainly from 0x1E000)
|}
=== 0x08040028 (REG_SEC) ===
Write only?
TBA
 
=== 0x0804002C (REG_VER) ===
Line 287 ⟶ 290:
|-
|15-8
|HWFirmware major version
|-
|7-0
|HWFirmware minor version
|}
ex. 0x0304 for HWFirmware v3.04
 
=== 0x08040030 (I2C/RTC) ===
Line 311 ⟶ 314:
 
=== 0x08040040 (REG_CFG_CNT) ===
Read/Write on REG_CFG&1==0
TBA
{| class="wikitable"
!bit from lsb
!description
|-
|3
|1=REG_CFG_DAT is transferring [R]
|-
|2
|1=FPGA is configuring? [R]
|-
|0
|0=unconfigure FPGA? [W]
|}
 
SDRAM must be disabled (REG_CFG & 1 must be zero).
 
=== 0x08040044 (REG_CFG_DAT) ===
Write only? on REG_CFG&1==0
TBA
{| class="wikitable"
!bit from lsb
!description
|-
|15-0
|configuration data (part of bitstream)
|}
 
SDRAM must be disabled (REG_CFG & 1 must be zero).
 
=== 0x08040048 (REG_MAX_MSG) ===
Read/Write on REG_CFG&1==0
{| class="wikitable"
!bit from lsb
Line 340 ⟶ 367:
|1=FPGA configured
|}
 
SDRAM must be disabled (REG_CFG & 1 must be zero).
=== 0x0804004C (REG_CRC) ===
Read only? on REG_CFG&1==0
TBA
{| class="wikitable"
!bit from lsb
!description
|-
|15-12
|HW major version?
|-
|11-0
|?
|}
SDRAM must be disabled (REG_CFG & 1 must be zero).
 
This register seems not related to "Cyclic Redundancy Check".
 
=== 0x08040050 ===
Write only? on REG_CFG&1==0
 
TBA
 
SDRAM must be disabled (REG_CFG & 1 must be zero).
 
=== 0x08040054 ===
Write only on REG_CFG&1==0 ?
 
TBA
 
SDRAM must be disabled (REG_CFG & 1 must be zero).
 
== ED64 Boot ROM Header ==
You can read boot ROM header by:
 
* set <code>REG_CFG &= ~1</code> (disable SDRAM)
* read from cart usually (by <code>*(uint32_t*)0xB0000000</code> etc, or use PI DMA)
 
{| class="wikitable"
!PI address
!bytes
!description
|-
|0x10000020
|12
|"ED64 SD boot", can be used to identify SD is usable or not (=SPI)
|-
|0x10000038
|2
|assembly date in FAT style
|-
|0x1000003A
|2
|assembly time in 2-seconds from 00:00:00, ex. 0x5878 for 12:34:56
|-
|0x1000003C
|2
|serial number (16bit binary, hex)
|}
They are, of course, big endian.
{| class="wikitable"
|+Date in FAT Style
!bit from lsb
!description
|-
|15-9
|year - 1980
|-
|8-5
|month (start from 1)
|-
|4-0
|day (start from 1)
|}
 
== USB Serial Communication ==
Line 410 ⟶ 503:
Of course if received data is shorter than "len", DMA will be timed out, cause waiting ~500ms to DMA done until timeout, so you should send data from host by 512 bytes block for faster communication.
 
<syntaxhighlight lang="c">
/* polling style */
 
Line 419 ⟶ 512:
) {
uintptr_t i;
 
/* REG_STATUS & RXF# is zero = data is arriving, not zero = not arrived */
if(*(volatile uint32_t *)0xA8040004 & 8) {
/* no data is arrived now */
return 0;
}
 
/* invalidate D-cache (primary data hit invalidate; 16 bytes per D-cache-line on N64) */
Line 428 ⟶ 527:
 
/* USB->Cart DMA on ED64 */
while(*(volatile uint32_t *)0xA8040004 & 4) /* busyloop */ ; /* wait until REG_STATUS & RXE# becomes zero = data is arriving */
*(volatile uint32_t *)0xA8040008 = len / 512 - 1; /* set REG_DMA_LEN */
*(volatile uint32_t *)0xA8040000; /* dummy read for previous PI write is done (REG_CFG is just because) */
Line 448 ⟶ 546:
 
/* success */
return 01;
}
 
...
uint8_t __attribute((aligned(8))) buffer[512];
int result;
host_to_rdram(buffer, 0x00400000 - 2048, 512); /* using last ROM area for communication */
result = host_to_rdram(buffer, 0x00400000 - 2048, 512); /* using last ROM area for communication */
/* "buffer" is modified */
/* "buffer" is modified if 0 < result */
</syntaxhighlight>
 
24

edits