mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
- moved all SPI code to the ARM11 - reimplemented NVRAM reading for the new SPI interface
78 lines
1.3 KiB
C
Executable File
78 lines
1.3 KiB
C
Executable File
#include <types.h>
|
|
|
|
#include "hw/spi.h"
|
|
#include "hw/nvram.h"
|
|
|
|
#define NVRAM_SPI_DEV 1
|
|
|
|
// returns manuf id, memory type and size
|
|
// size = (1 << id[2]) ?
|
|
// apparently unreliable on some Sanyo chips?
|
|
#define CMD_RDID 0x9F
|
|
|
|
#define CMD_READ 0x03
|
|
#define CMD_WREN 0x06
|
|
#define CMD_WRDI 0x04
|
|
|
|
#define CMD_RDSR 0x05
|
|
|
|
#define CMD_DPD 0xB9 // deep power down
|
|
#define CMD_RDP 0xAB // release from deep power down
|
|
|
|
static u32 NVRAM_SendStatusCommand(u32 cmd, u32 width)
|
|
{
|
|
u32 ret;
|
|
SPI_XferInfo xfer[2];
|
|
|
|
xfer[0].buf = &cmd;
|
|
xfer[0].len = 1;
|
|
xfer[0].read = false;
|
|
|
|
xfer[1].buf = &ret;
|
|
xfer[1].len = width;
|
|
xfer[1].read = true;
|
|
|
|
ret = 0;
|
|
SPI_DoXfer(NVRAM_SPI_DEV, xfer, 2);
|
|
return ret;
|
|
}
|
|
|
|
u32 NVRAM_Status(void)
|
|
{
|
|
return NVRAM_SendStatusCommand(CMD_RDSR, 1);
|
|
}
|
|
|
|
u32 NVRAM_ReadID(void)
|
|
{
|
|
return NVRAM_SendStatusCommand(CMD_RDID, 3);
|
|
}
|
|
|
|
void NVRAM_DeepStandby(void)
|
|
{
|
|
NVRAM_SendStatusCommand(CMD_DPD, 0);
|
|
}
|
|
|
|
void NVRAM_Wakeup(void)
|
|
{
|
|
NVRAM_SendStatusCommand(CMD_RDP, 0);
|
|
}
|
|
|
|
void NVRAM_Read(u32 address, u32 *buffer, u32 len)
|
|
{
|
|
SPI_XferInfo xfer[2];
|
|
u32 cmd;
|
|
|
|
address &= BIT(24) - 1;
|
|
cmd = __builtin_bswap32(address) | CMD_READ;
|
|
|
|
xfer[0].buf = &cmd;
|
|
xfer[0].len = 4;
|
|
xfer[0].read = false;
|
|
|
|
xfer[1].buf = buffer;
|
|
xfer[1].len = len;
|
|
xfer[1].read = true;
|
|
|
|
SPI_DoXfer(NVRAM_SPI_DEV, xfer, 2);
|
|
}
|