aboutsummaryrefslogtreecommitdiff
path: root/src/SPI.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/SPI.h')
-rw-r--r--src/SPI.h155
1 files changed, 122 insertions, 33 deletions
diff --git a/src/SPI.h b/src/SPI.h
index d815203..4578ad5 100644
--- a/src/SPI.h
+++ b/src/SPI.h
@@ -28,61 +28,150 @@
#include "Savestate.h"
#include "SPI_Firmware.h"
-namespace SPI_Firmware
+enum
{
+ SPIDevice_PowerMan = 0,
+ SPIDevice_FirmwareMem,
+ SPIDevice_TSC,
+
+ SPIDevice_MAX
+};
u16 CRC16(const u8* data, u32 len, u32 start);
-void SetupDirectBoot(bool dsi);
-u32 FixFirmwareLength(u32 originalLength);
+class SPIHost;
+
+class SPIDevice
+{
+public:
+ SPIDevice(SPIHost* host) : Host(host), Hold(false), DataPos(0) {}
+ virtual ~SPIDevice() {}
+
+ virtual void Reset() = 0;
+
+ virtual void DoSavestate(Savestate* file) = 0;
+
+ virtual u8 Read() { return Data; }
+ virtual void Write(u8 val) = 0;
+ virtual void Release() { Hold = false; DataPos = 0; }
+
+protected:
+ SPIHost* Host;
+
+ bool Hold;
+ u32 DataPos;
+ u8 Data;
+};
+
+class FirmwareMem : public SPIDevice
+{
+public:
+ FirmwareMem(SPIHost* host);
+ ~FirmwareMem() override;
+
+ void Reset() override;
+
+ void DoSavestate(Savestate* file) override;
+
+ void SetupDirectBoot(bool dsi);
+
+ const class Firmware* GetFirmware();
+ bool IsLoadedFirmwareBuiltIn();
+ bool InstallFirmware(class Firmware&& firmware);
+ bool InstallFirmware(std::unique_ptr<class Firmware>&& firmware);
+ void RemoveFirmware();
+
+ void Write(u8 val) override;
+ void Release() override;
-/// @return A pointer to the installed firmware blob if one exists, otherwise \c nullptr.
-/// @warning The pointer refers to memory that melonDS owns. Do not deallocate it yourself.
-/// @see InstallFirmware
-const Firmware* GetFirmware();
+private:
+ std::unique_ptr<Firmware> Firmware;
-bool IsLoadedFirmwareBuiltIn();
-bool InstallFirmware(Firmware&& firmware);
-bool InstallFirmware(std::unique_ptr<Firmware>&& firmware);
-void RemoveFirmware();
-}
+ u8 CurCmd;
-namespace SPI_Powerman
+ u8 StatusReg;
+ u32 Addr;
+
+ bool VerifyCRC16(u32 start, u32 offset, u32 len, u32 crcoffset);
+};
+
+class PowerMan : public SPIDevice
{
+public:
+ PowerMan(SPIHost* host);
+ ~PowerMan() override;
+
+ void Reset() override;
+
+ void DoSavestate(Savestate* file) override;
-bool GetBatteryLevelOkay();
-void SetBatteryLevelOkay(bool okay);
+ bool GetBatteryLevelOkay();
+ void SetBatteryLevelOkay(bool okay);
-}
+ void Write(u8 val) override;
-namespace SPI_TSC
+private:
+ u8 Index;
+
+ u8 Registers[8];
+ u8 RegMasks[8];
+};
+
+class TSC : public SPIDevice
{
+public:
+ TSC(SPIHost* host);
+ virtual ~TSC() override;
+
+ virtual void Reset() override;
+
+ virtual void DoSavestate(Savestate* file) override;
-void SetTouchCoords(u16 x, u16 y);
-void MicInputFrame(s16* data, int samples);
+ virtual void SetTouchCoords(u16 x, u16 y);
+ virtual void MicInputFrame(s16* data, int samples);
-u8 Read();
-void Write(u8 val, u32 hold);
+ virtual void Write(u8 val) override;
-}
+protected:
+ u8 ControlByte;
-namespace SPI
+ u16 ConvResult;
+
+ u16 TouchX, TouchY;
+
+ s16 MicBuffer[1024];
+ int MicBufferLen;
+};
+
+
+class SPIHost
{
+public:
+ SPIHost();
+ ~SPIHost();
+
+ void Reset();
+
+ void DoSavestate(Savestate* file);
+
+ FirmwareMem* GetFirmwareMem() { return (FirmwareMem*)Devices[SPIDevice_FirmwareMem]; }
+ PowerMan* GetPowerMan() { return (PowerMan*)Devices[SPIDevice_PowerMan]; }
+ TSC* GetTSC() { return (TSC*)Devices[SPIDevice_TSC]; }
-extern u16 Cnt;
+ const Firmware* GetFirmware() { return GetFirmwareMem()->GetFirmware(); }
-bool Init();
-void DeInit();
-void Reset();
-void DoSavestate(Savestate* file);
+ u16 ReadCnt() { return Cnt; }
+ void WriteCnt(u16 val);
-void WriteCnt(u16 val);
+ u8 ReadData();
+ void WriteData(u8 val);
-u8 ReadData();
-void WriteData(u8 val);
+ void TransferDone(u32 param);
-void TransferDone(u32 param);
+private:
+ u16 Cnt;
-}
+ SPIDevice* Devices[3];
+};
#endif