aboutsummaryrefslogtreecommitdiff
path: root/src/Wifi.h
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2023-11-04 17:00:12 +0100
committerArisotura <thetotalworm@gmail.com>2023-11-04 17:00:12 +0100
commit2bd09eafebbc98e2e2b9fbb023b31551ccd8cf12 (patch)
tree3b35fb2c0ab0cbc4757eb24d0c3966a3e784dcbb /src/Wifi.h
parent76976fef3038918ad01a9dbda4c0e5d9bebef9af (diff)
convert Wifi and WifiAP
Diffstat (limited to 'src/Wifi.h')
-rw-r--r--src/Wifi.h410
1 files changed, 250 insertions, 160 deletions
diff --git a/src/Wifi.h b/src/Wifi.h
index e357039..5a4f839 100644
--- a/src/Wifi.h
+++ b/src/Wifi.h
@@ -21,178 +21,268 @@
#include "Savestate.h"
-namespace Wifi
-{
+class WifiAP;
-enum
+class Wifi
{
- W_ID = 0x000,
-
- W_ModeReset = 0x004,
- W_ModeWEP = 0x006,
- W_TXStatCnt = 0x008,
- W_IF = 0x010,
- W_IE = 0x012,
-
- W_MACAddr0 = 0x018,
- W_MACAddr1 = 0x01A,
- W_MACAddr2 = 0x01C,
- W_BSSID0 = 0x020,
- W_BSSID1 = 0x022,
- W_BSSID2 = 0x024,
- W_AIDLow = 0x028,
- W_AIDFull = 0x02A,
-
- W_TXRetryLimit = 0x02C,
- W_RXCnt = 0x030,
- W_WEPCnt = 0x032,
-
- W_PowerUS = 0x036,
- W_PowerTX = 0x038,
- W_PowerState = 0x03C,
- W_PowerForce = 0x040,
- W_PowerUnk = 0x48,
-
- W_Random = 0x044,
-
- W_RXBufBegin = 0x050,
- W_RXBufEnd = 0x052,
- W_RXBufWriteCursor = 0x054,
- W_RXBufWriteAddr = 0x056,
- W_RXBufReadAddr = 0x058,
- W_RXBufReadCursor = 0x05A,
- W_RXBufCount = 0x05C,
- W_RXBufDataRead = 0x060,
- W_RXBufGapAddr = 0x062,
- W_RXBufGapSize = 0x064,
-
- W_TXBufWriteAddr = 0x068,
- W_TXBufCount = 0x06C,
- W_TXBufDataWrite = 0x070,
- W_TXBufGapAddr = 0x074,
- W_TXBufGapSize = 0x076,
-
- W_TXSlotBeacon = 0x080,
- W_TXBeaconTIM = 0x084,
- W_ListenCount = 0x088,
- W_BeaconInterval = 0x08C,
- W_ListenInterval = 0x08E,
- W_TXSlotCmd = 0x090,
- W_TXSlotReply1 = 0x094,
- W_TXSlotReply2 = 0x098,
- W_TXSlotLoc1 = 0x0A0,
- W_TXSlotLoc2 = 0x0A4,
- W_TXSlotLoc3 = 0x0A8,
- W_TXReqReset = 0x0AC,
- W_TXReqSet = 0x0AE,
- W_TXReqRead = 0x0B0,
- W_TXSlotReset = 0x0B4,
- W_TXBusy = 0x0B6,
- W_TXStat = 0x0B8,
- W_Preamble = 0x0BC,
- W_CmdTotalTime = 0x0C0,
- W_CmdReplyTime = 0x0C4,
- W_RXFilter = 0x0D0,
- W_RXLenCrop = 0x0DA,
- W_RXFilter2 = 0x0E0,
-
- W_USCountCnt = 0x0E8,
- W_USCompareCnt = 0x0EA,
- W_CmdCountCnt = 0x0EE,
-
- W_USCount0 = 0x0F8,
- W_USCount1 = 0x0FA,
- W_USCount2 = 0x0FC,
- W_USCount3 = 0x0FE,
- W_USCompare0 = 0x0F0,
- W_USCompare1 = 0x0F2,
- W_USCompare2 = 0x0F4,
- W_USCompare3 = 0x0F6,
-
- W_ContentFree = 0x10C,
- W_PreBeacon = 0x110,
- W_CmdCount = 0x118,
- W_BeaconCount1 = 0x11C,
- W_BeaconCount2 = 0x134,
-
- W_BBCnt = 0x158,
- W_BBWrite = 0x15A,
- W_BBRead = 0x15C,
- W_BBBusy = 0x15E,
- W_BBMode = 0x160,
- W_BBPower = 0x168,
-
- W_RFData2 = 0x17C,
- W_RFData1 = 0x17E,
- W_RFBusy = 0x180,
- W_RFCnt = 0x184,
-
- W_TXHeaderCnt = 0x194,
- W_RFPins = 0x19C,
-
- W_RXStatIncIF = 0x1A8,
- W_RXStatIncIE = 0x1AA,
- W_RXStatHalfIF = 0x1AC,
- W_RXStatHalfIE = 0x1AE,
- W_TXErrorCount = 0x1C0,
- W_RXCount = 0x1C4,
-
- W_CMDStat0 = 0x1D0,
- W_CMDStat1 = 0x1D2,
- W_CMDStat2 = 0x1D4,
- W_CMDStat3 = 0x1D6,
- W_CMDStat4 = 0x1D8,
- W_CMDStat5 = 0x1DA,
- W_CMDStat6 = 0x1DC,
- W_CMDStat7 = 0x1DE,
-
- W_TXSeqNo = 0x210,
- W_RFStatus = 0x214,
- W_IFSet = 0x21C,
- W_RXTXAddr = 0x268,
-};
+public:
+
+ enum
+ {
+ W_ID = 0x000,
+
+ W_ModeReset = 0x004,
+ W_ModeWEP = 0x006,
+ W_TXStatCnt = 0x008,
+ W_IF = 0x010,
+ W_IE = 0x012,
+
+ W_MACAddr0 = 0x018,
+ W_MACAddr1 = 0x01A,
+ W_MACAddr2 = 0x01C,
+ W_BSSID0 = 0x020,
+ W_BSSID1 = 0x022,
+ W_BSSID2 = 0x024,
+ W_AIDLow = 0x028,
+ W_AIDFull = 0x02A,
+
+ W_TXRetryLimit = 0x02C,
+ W_RXCnt = 0x030,
+ W_WEPCnt = 0x032,
+
+ W_PowerUS = 0x036,
+ W_PowerTX = 0x038,
+ W_PowerState = 0x03C,
+ W_PowerForce = 0x040,
+ W_PowerUnk = 0x48,
+
+ W_Random = 0x044,
+
+ W_RXBufBegin = 0x050,
+ W_RXBufEnd = 0x052,
+ W_RXBufWriteCursor = 0x054,
+ W_RXBufWriteAddr = 0x056,
+ W_RXBufReadAddr = 0x058,
+ W_RXBufReadCursor = 0x05A,
+ W_RXBufCount = 0x05C,
+ W_RXBufDataRead = 0x060,
+ W_RXBufGapAddr = 0x062,
+ W_RXBufGapSize = 0x064,
+
+ W_TXBufWriteAddr = 0x068,
+ W_TXBufCount = 0x06C,
+ W_TXBufDataWrite = 0x070,
+ W_TXBufGapAddr = 0x074,
+ W_TXBufGapSize = 0x076,
+
+ W_TXSlotBeacon = 0x080,
+ W_TXBeaconTIM = 0x084,
+ W_ListenCount = 0x088,
+ W_BeaconInterval = 0x08C,
+ W_ListenInterval = 0x08E,
+ W_TXSlotCmd = 0x090,
+ W_TXSlotReply1 = 0x094,
+ W_TXSlotReply2 = 0x098,
+ W_TXSlotLoc1 = 0x0A0,
+ W_TXSlotLoc2 = 0x0A4,
+ W_TXSlotLoc3 = 0x0A8,
+ W_TXReqReset = 0x0AC,
+ W_TXReqSet = 0x0AE,
+ W_TXReqRead = 0x0B0,
+ W_TXSlotReset = 0x0B4,
+ W_TXBusy = 0x0B6,
+ W_TXStat = 0x0B8,
+ W_Preamble = 0x0BC,
+ W_CmdTotalTime = 0x0C0,
+ W_CmdReplyTime = 0x0C4,
+ W_RXFilter = 0x0D0,
+ W_RXLenCrop = 0x0DA,
+ W_RXFilter2 = 0x0E0,
+
+ W_USCountCnt = 0x0E8,
+ W_USCompareCnt = 0x0EA,
+ W_CmdCountCnt = 0x0EE,
+
+ W_USCount0 = 0x0F8,
+ W_USCount1 = 0x0FA,
+ W_USCount2 = 0x0FC,
+ W_USCount3 = 0x0FE,
+ W_USCompare0 = 0x0F0,
+ W_USCompare1 = 0x0F2,
+ W_USCompare2 = 0x0F4,
+ W_USCompare3 = 0x0F6,
+
+ W_ContentFree = 0x10C,
+ W_PreBeacon = 0x110,
+ W_CmdCount = 0x118,
+ W_BeaconCount1 = 0x11C,
+ W_BeaconCount2 = 0x134,
+
+ W_BBCnt = 0x158,
+ W_BBWrite = 0x15A,
+ W_BBRead = 0x15C,
+ W_BBBusy = 0x15E,
+ W_BBMode = 0x160,
+ W_BBPower = 0x168,
+
+ W_RFData2 = 0x17C,
+ W_RFData1 = 0x17E,
+ W_RFBusy = 0x180,
+ W_RFCnt = 0x184,
+
+ W_TXHeaderCnt = 0x194,
+ W_RFPins = 0x19C,
+
+ W_RXStatIncIF = 0x1A8,
+ W_RXStatIncIE = 0x1AA,
+ W_RXStatHalfIF = 0x1AC,
+ W_RXStatHalfIE = 0x1AE,
+ W_TXErrorCount = 0x1C0,
+ W_RXCount = 0x1C4,
+
+ W_CMDStat0 = 0x1D0,
+ W_CMDStat1 = 0x1D2,
+ W_CMDStat2 = 0x1D4,
+ W_CMDStat3 = 0x1D6,
+ W_CMDStat4 = 0x1D8,
+ W_CMDStat5 = 0x1DA,
+ W_CMDStat6 = 0x1DC,
+ W_CMDStat7 = 0x1DE,
+
+ W_TXSeqNo = 0x210,
+ W_RFStatus = 0x214,
+ W_IFSet = 0x21C,
+ W_RXTXAddr = 0x268,
+ };
+
+ Wifi();
+ ~Wifi();
+ void Reset();
+ void DoSavestate(Savestate* file);
+
+ void SetPowerCnt(u32 val);
+
+ void USTimer(u32 param);
+
+ u16 Read(u32 addr);
+ void Write(u32 addr, u16 val);
+
+ u8* GetMAC();
+ u8* GetBSSID();
+
+private:
+ u8 RAM[0x2000];
+ u16 IO[0x1000>>1];
+
+ static const u8 MPCmdMAC[6];
+ static const u8 MPReplyMAC[6];
+ static const u8 MPAckMAC[6];
+
+ static const int kTimerInterval = 8;
+ static const u32 kTimeCheckMask = ~(kTimerInterval - 1);
+
+ bool Enabled;
+ bool PowerOn;
+
+ s32 TimerError;
+
+ u16 Random;
+
+ // general, always-on microsecond counter
+ u64 USTimestamp;
+
+ u64 USCounter;
+ u64 USCompare;
+ bool BlockBeaconIRQ14;
+
+ u32 CmdCounter;
+
+ u8 BBRegs[0x100];
+ u8 BBRegsRO[0x100];
+
+ u8 RFVersion;
+ u32 RFRegs[0x40];
+
+ struct TXSlot
+ {
+ bool Valid;
+ u16 Addr;
+ u16 Length;
+ u8 Rate;
+ u8 CurPhase;
+ int CurPhaseTime;
+ u32 HalfwordTimeMask;
+ };
+
+ TXSlot TXSlots[6];
+ u8 TXBuffer[0x2000];
-enum
-{
- Event_RXCheck = 0,
- Event_IRQ15,
- Event_MSTimer,
- Event_RFWakeup,
- Event_RX,
- Event_TX,
- Event_MPClientSync,
- Event_RF,
- Event_BB,
-
- Event_MAX
-};
+ u8 RXBuffer[2048];
+ u32 RXBufferPtr;
+ int RXTime;
+ u32 RXHalfwordTimeMask;
-struct SchedEvent
-{
- void (*Func)(u32 param);
- u64 Timestamp;
- u32 Param;
-};
+ u32 ComStatus; // 0=waiting for packets 1=receiving 2=sending
+ u32 TXCurSlot;
+ u32 RXCounter;
+
+ int MPReplyTimer;
+ u16 MPClientMask, MPClientFail;
+ u8 MPClientReplies[15*1024];
-extern bool MPInited;
+ u16 MPLastSeqno;
+ bool MPInited;
+ bool LANInited;
-bool Init();
-void DeInit();
-void Reset();
-void DoSavestate(Savestate* file);
+ int USUntilPowerOn;
+ bool ForcePowerOn;
-void SetPowerCnt(u32 val);
+ // MULTIPLAYER SYNC APPARATUS
+ bool IsMP;
+ bool IsMPClient;
+ u64 NextSync; // for clients: timestamp for next sync point
+ u64 RXTimestamp;
-void USTimer(u32 param);
+ class WifiAP* WifiAP;
-u16 Read(u32 addr);
-void Write(u32 addr, u16 val);
+ void ScheduleTimer(bool first);
+ void UpdatePowerOn();
-u8* GetMAC();
-u8* GetBSSID();
+ void SetIRQ(u32 irq);
+ void SetIRQ13();
+ void SetIRQ14(int source);
+ void SetIRQ15();
-}
+ void SetStatus(u32 status);
+ void PowerDown();
+
+ int PreambleLen(int rate);
+ u32 NumClients(u16 bitmask);
+ void IncrementTXCount(TXSlot* slot);
+ void ReportMPReplyErrors(u16 clientfail);
+
+ void TXSendFrame(TXSlot* slot, int num);
+ void StartTX_LocN(int nslot, int loc);
+ void StartTX_Cmd();
+ void StartTX_Beacon();
+ void FireTX();
+ void SendMPDefaultReply();
+ void SendMPReply(u16 clienttime, u16 clientmask);
+ void SendMPAck(u16 cmdcount, u16 clientfail);
+ bool ProcessTX(TXSlot* slot, int num);
+
+ void IncrementRXAddr(u16& addr, u16 inc = 2);
+ void StartRX();
+ void FinishRX();
+ void MPClientReplyRX(int client);
+ bool CheckRX(int type);
+
+ void MSTimer();
+
+ void RFTransfer_Type2();
+ void RFTransfer_Type3();
+};
#endif