diff options
Diffstat (limited to 'src/SPI.h')
-rw-r--r-- | src/SPI.h | 155 |
1 files changed, 122 insertions, 33 deletions
@@ -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 |