remove a bunch of cruft
This commit is contained in:
parent
f0452ca149
commit
728eb38b88
253
src/Wifi.cpp
253
src/Wifi.cpp
|
@ -25,8 +25,8 @@
|
|||
#include "Platform.h"
|
||||
#include "ARM.h"
|
||||
#include "GPU.h"
|
||||
u16 zanf = 2423;
|
||||
namespace LocalMP { void _logstring(u64 ts, char* str);void _logstring2(u64 ts, char* str, u32 arg, u64 arg2); }
|
||||
|
||||
|
||||
namespace Wifi
|
||||
{
|
||||
|
||||
|
@ -108,7 +108,6 @@ bool ForcePowerOn;
|
|||
bool IsMPClient;
|
||||
u64 TimeOffsetToHost; // clienttime - hosttime
|
||||
u64 NextSync; // for clients: timestamp for next forced sync
|
||||
u64 RXCutoff;
|
||||
u32 NextSyncType;
|
||||
bool SyncBack; // for clients: whether to send the host a sync once the sync is reached
|
||||
const u64 kMaxRunahead = 4096;
|
||||
|
@ -228,7 +227,6 @@ void Reset()
|
|||
|
||||
USTimestamp = 0;
|
||||
RXTimestamp = 0;
|
||||
RXCutoff = 0;
|
||||
|
||||
USCounter = 0;
|
||||
USCompare = 0;
|
||||
|
@ -447,8 +445,8 @@ void StartTX_Cmd()
|
|||
|
||||
// TODO: cancel the transfer if there isn't enough time left (check CMDCOUNT)
|
||||
|
||||
if (IOPORT(W_TXSlotCmd) & 0x7000) printf("wifi: !! unusual TXSLOT_CMD bits set %04X %08X\n", IOPORT(W_TXSlotCmd), NDS::GetPC(1));
|
||||
//if (IOPORT(W_TXSlotCmd) & 0x7000) getc(stdin);
|
||||
if (IOPORT(W_TXSlotCmd) & 0x3000)
|
||||
printf("wifi: !! unusual TXSLOT_CMD bits set %04X\n", IOPORT(W_TXSlotCmd));
|
||||
|
||||
slot->Addr = (IOPORT(W_TXSlotCmd) & 0x0FFF) << 1;
|
||||
slot->Length = *(u16*)&RAM[slot->Addr + 0xA] & 0x3FFF;
|
||||
|
@ -519,7 +517,6 @@ void FireTX()
|
|||
return;
|
||||
}
|
||||
}
|
||||
u16 vogon = 0x1312;
|
||||
|
||||
void SendMPDefaultReply()
|
||||
{
|
||||
|
@ -533,8 +530,6 @@ void SendMPDefaultReply()
|
|||
// TODO
|
||||
reply[0x8] = 0x14;
|
||||
|
||||
*(u16*)&reply[0x6] = vogon;
|
||||
|
||||
*(u16*)&reply[0xC + 0x00] = 0x0158;
|
||||
*(u16*)&reply[0xC + 0x02] = 0x00F0;//0; // TODO??
|
||||
*(u16*)&reply[0xC + 0x04] = IOPORT(W_BSSID0);
|
||||
|
@ -557,8 +552,6 @@ void SendMPReply(u16 clienttime, u16 clientmask)
|
|||
{
|
||||
TXSlot* slot = &TXSlots[5];
|
||||
|
||||
vogon = *(u16*)&RXBuffer[0xC + 22]; // seqno
|
||||
|
||||
// mark the last packet as success. dunno what the MSB is, it changes.
|
||||
//if (slot->Valid)
|
||||
if (IOPORT(W_TXSlotReply2) & 0x8000)
|
||||
|
@ -571,7 +564,7 @@ void SendMPReply(u16 clienttime, u16 clientmask)
|
|||
|
||||
IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
|
||||
IOPORT(W_TXSlotReply1) = 0;
|
||||
//printf("SENDING MP REPLY: %04X/%04X, PORTS=%04X/%04X\n", clienttime, clientmask, IOPORT(W_TXSlotReply1), IOPORT(W_TXSlotReply2));
|
||||
|
||||
if (!(IOPORT(W_TXSlotReply2) & 0x8000))
|
||||
{
|
||||
slot->Valid = false;
|
||||
|
@ -587,12 +580,11 @@ void SendMPReply(u16 clienttime, u16 clientmask)
|
|||
u32 duration = PreambleLen(slot->Rate) + (slot->Length * (slot->Rate==2 ? 4:8));
|
||||
if (duration > clienttime)
|
||||
slot->Valid = false;
|
||||
|
||||
//printf("SENDING MP REPLY %04X, %d\n", slot->Addr, slot->Valid);
|
||||
// replies: 0000/0234
|
||||
// 04804000 / 04804234
|
||||
}
|
||||
|
||||
if (RAM[slot->Addr+4] > 0)
|
||||
printf("REPLY RETRY COUNTER %d\n", RAM[slot->Addr+4]);
|
||||
|
||||
// this seems to be set upon IRQ0
|
||||
// TODO: how does it behave if the packet addr is changed before it gets sent? (maybe just not possible)
|
||||
if (slot->Valid)
|
||||
|
@ -603,7 +595,7 @@ void SendMPReply(u16 clienttime, u16 clientmask)
|
|||
slot->CurPhase = 0;
|
||||
|
||||
int txlen = Platform::MP_SendReply(&RAM[slot->Addr], 12 + slot->Length, USTimestamp, IOPORT(W_AIDLow));
|
||||
WIFI_LOG("wifi: sent %d/40 bytes of MP reply\n", txlen);
|
||||
WIFI_LOG("wifi: sent %d/%d bytes of MP reply\n", txlen, 12 + slot->Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -747,23 +739,6 @@ bool ProcessTX(TXSlot* slot, int num)
|
|||
*(u64*)&RAM[slot->Addr + 0xC + 24] = USCounter;
|
||||
}
|
||||
|
||||
/*if (slot->Length==34)
|
||||
{
|
||||
printf("CMD: %d bytes, %04X\n", slot->Length+12, IOPORT(W_TXSlotCmd));
|
||||
for (int y = 0; y < slot->Length+12; y+=16)
|
||||
{
|
||||
printf("%04X: ", y);
|
||||
int linelen = 16;
|
||||
if ((y+linelen) > (slot->Length+12)) linelen = (slot->Length+12) - y;
|
||||
for (int x = 0; x < linelen; x++)
|
||||
{
|
||||
printf(" %02X", RAM[slot->Addr+y+x]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf("--------------\n");
|
||||
}*/
|
||||
|
||||
u32 noseqno = 0;
|
||||
if (num == 1) noseqno = (IOPORT(W_TXSlotCmd) & 0x4000);
|
||||
|
||||
|
@ -773,48 +748,27 @@ bool ProcessTX(TXSlot* slot, int num)
|
|||
IOPORT(W_TXSeqNo) = (IOPORT(W_TXSeqNo) + 1) & 0x0FFF;
|
||||
}
|
||||
|
||||
if ((num != 5) && (RAM[slot->Addr+4] > 0))
|
||||
printf("SLOT %d RETRY COUNTER %d\n", RAM[slot->Addr+4]);
|
||||
|
||||
// set TX addr
|
||||
IOPORT(W_RXTXAddr) = slot->Addr >> 1;
|
||||
|
||||
if (num == 1)
|
||||
{
|
||||
// make sure the clients are synced up
|
||||
// TODO!!!! this should be for all currently connected clients regardless of the clientmask in the packet
|
||||
u16 clientmask = *(u16*)&RAM[slot->Addr + 0xC + 26];
|
||||
//Platform::MP_SendSync(/*clientmask*/0x0002, 2, USCounter);
|
||||
//printf("[HOST] sending CMD, sent sync2, waiting\n");
|
||||
//u16 res = Platform::MP_WaitMultipleSyncs(3, /*clientmask*/0x0002, USCounter);
|
||||
//printf("[HOST] got sync3: %04X\n", res);
|
||||
//Platform::MP_SendSync(0xFFFF, 2, USTimestamp);
|
||||
|
||||
// send
|
||||
int txlen = Platform::MP_SendCmd(&RAM[slot->Addr], 12 + slot->Length, USTimestamp);
|
||||
WIFI_LOG("wifi: sent %d/%d bytes of slot%d packet, addr=%04X, framectl=%04X, %04X %04X\n",
|
||||
txlen, slot->Length+12, num, slot->Addr, *(u16*)&RAM[slot->Addr + 0xC],
|
||||
*(u16*)&RAM[slot->Addr + 0x24], *(u16*)&RAM[slot->Addr + 0x26]);
|
||||
//if (IOPORT(W_TXSlotCmd) & 0x4000)
|
||||
|
||||
// send further sync
|
||||
u32 numclients = NumClients(clientmask);
|
||||
u32 replywait = 112 + ((10 + IOPORT(W_CmdReplyTime)) * numclients);
|
||||
//u32 acklen = 32 * (slot->Rate==2 ? 4:8);
|
||||
//Platform::MP_SendSync(/*clientmask*/0x0002, 1, USCounter + len + replywait + acklen);// + kMaxRunahead);
|
||||
//Platform::MP_SendSync(/*clientmask*/0x0002, 2, USCounter + len + replywait);
|
||||
//Platform::MP_SendSync(0xFFFF, 2, USTimestamp + len + replywait);
|
||||
}
|
||||
else if (num == 5)
|
||||
{
|
||||
/*u16 barfo = *(u16*)&RAM[slot->Addr+6];
|
||||
*(u16*)&RAM[slot->Addr+6] = vogon;
|
||||
|
||||
// send
|
||||
int txlen = Platform::MP_SendReply(&RAM[slot->Addr], 12 + slot->Length, USTimestamp, IOPORT(W_AIDLow));
|
||||
/*int txlen = Platform::MP_SendReply(&RAM[slot->Addr], 12 + slot->Length, USTimestamp, IOPORT(W_AIDLow));
|
||||
WIFI_LOG("wifi: sent %d/%d bytes of slot%d packet, addr=%04X, framectl=%04X, %04X %04X\n",
|
||||
txlen, slot->Length+12, num, slot->Addr, *(u16*)&RAM[slot->Addr + 0xC],
|
||||
*(u16*)&RAM[slot->Addr + 0x24], *(u16*)&RAM[slot->Addr + 0x26]);
|
||||
|
||||
*(u16*)&RAM[slot->Addr+6] = barfo;*/
|
||||
// frame was
|
||||
*(u16*)&RAM[slot->Addr + 0x24], *(u16*)&RAM[slot->Addr + 0x26]);*/
|
||||
}
|
||||
else //if (num != 5)
|
||||
{
|
||||
|
@ -832,16 +786,8 @@ bool ProcessTX(TXSlot* slot, int num)
|
|||
u16 framectl = *(u16*)&RAM[slot->Addr + 0xC];
|
||||
if ((framectl & 0x00FF) == 0x0010)
|
||||
{
|
||||
// if we're sending an association response:
|
||||
// we are likely acting as a local MP host, and are welcoming a new client to the club
|
||||
// in this case, sync them up: send them our current microsecond timestamp
|
||||
|
||||
u16 aid = *(u16*)&RAM[slot->Addr + 0xC + 24 + 4];
|
||||
if (aid)
|
||||
{
|
||||
printf("[HOST] syncing client %04X, sync=%016llX\n", aid, USTimestamp);
|
||||
//Platform::MP_SendSync(1<<(aid&0xF), 0, USTimestamp);
|
||||
}
|
||||
if (aid) printf("[HOST] syncing client %04X, sync=%016llX\n", aid, USTimestamp);
|
||||
}
|
||||
|
||||
WifiAP::SendPacket(&RAM[slot->Addr], 12 + slot->Length);
|
||||
|
@ -952,30 +898,11 @@ bool ProcessTX(TXSlot* slot, int num)
|
|||
if (slot->Rate == 2) slot->CurPhaseTime = 32 * 4;
|
||||
else slot->CurPhaseTime = 32 * 8;
|
||||
|
||||
//SendMPAck();
|
||||
/*printf("HOST MP ACK:\n");
|
||||
PRINT_MAC("-MAC: ", (u8*)&IOPORT(W_MACAddr0));
|
||||
PRINT_MAC("-BSS: ", (u8*)&IOPORT(W_BSSID0));
|
||||
printf("-SeqNo: %04X\n", IOPORT(W_TXSeqNo)<<4);*/
|
||||
|
||||
// make sure the clients are synced up
|
||||
// TODO!!!! this should be for all currently connected clients regardless of the clientmask in the packet
|
||||
u16 clientmask = *(u16*)&RAM[slot->Addr + 0xC + 26];
|
||||
//Platform::MP_SendSync(/*clientmask*/0x0002, 2, USCounter);
|
||||
//printf("[HOST] sending CMD, sent sync2, waiting\n");
|
||||
//u16 res = Platform::MP_WaitMultipleSyncs(3, /*clientmask*/0x0002, USCounter);
|
||||
//printf("[HOST] got sync3: %04X\n", res);
|
||||
//if (MPClientFail) printf("client fail: %04X (%04X)\n", MPClientFail, clientmask);
|
||||
|
||||
ReportMPReplyErrors(MPClientFail);
|
||||
|
||||
// send
|
||||
SendMPAck(MPClientFail);
|
||||
|
||||
// send further sync
|
||||
//Platform::MP_SendSync(/*clientmask*/0x0002, 1, USCounter + slot->CurPhaseTime);
|
||||
//Platform::MP_SendSync(0xFFFF, 1, USTimestamp + slot->CurPhaseTime);
|
||||
|
||||
slot->CurPhase = 3;
|
||||
}
|
||||
break;
|
||||
|
@ -1009,11 +936,6 @@ bool ProcessTX(TXSlot* slot, int num)
|
|||
// (games seem to always configure CMDCOUNT such that there is no time for retries)
|
||||
SetIRQ(12);
|
||||
|
||||
// let clients run ahead some
|
||||
u16 clientmask = *(u16*)&RAM[slot->Addr + 12 + 24 + 2];
|
||||
//Platform::MP_SendSync(clientmask, 1, kMaxRunahead);
|
||||
|
||||
RXCutoff = USTimestamp;
|
||||
FireTX();
|
||||
}
|
||||
return true;
|
||||
|
@ -1043,14 +965,12 @@ inline void IncrementRXAddr(u16& addr, u16 inc = 2)
|
|||
addr = (IOPORT(W_RXBufBegin) & 0x1FFE);
|
||||
}
|
||||
}
|
||||
u64 zamf=0;bool fart=false;
|
||||
|
||||
void StartRX()
|
||||
{
|
||||
u16 framelen = *(u16*)&RXBuffer[8];
|
||||
RXTime = framelen;
|
||||
/*printf("RX: len=%d, fc=%04X, client=%04X, rdcsr=%05X wrcsr=%05X filter=%04X/%04X\n",
|
||||
framelen, *(u16*)&RXBuffer[12], *(u16*)&RXBuffer[12+26], IOPORT(W_RXBufReadCursor) << 1, IOPORT(W_RXBufWriteCursor) << 1,
|
||||
IOPORT(W_RXFilter), IOPORT(W_RXFilter2));fart=true;*/
|
||||
|
||||
u16 txrate = *(u16*)&RXBuffer[6];
|
||||
if (txrate == 0x14)
|
||||
{
|
||||
|
@ -1072,10 +992,6 @@ void StartRX()
|
|||
SetIRQ(6);
|
||||
SetStatus(6);
|
||||
ComStatus |= 1;
|
||||
//printf("%016llX: starting receiving packet %04X\n", USTimestamp, *(u16*)&RXBuffer[12]);
|
||||
//if (zamf != USTimestamp)
|
||||
// printf("PACKET %04X DESYNCED: %016llX =/= %016llX\n", *(u16*)&RXBuffer[12], zamf, USTimestamp);
|
||||
LocalMP::_logstring2(USTimestamp, "STARTING RX", ((*(u16*)&RXBuffer[12])<<16)|(*(u16*)&RXBuffer[12+26]), RXTimestamp);
|
||||
}
|
||||
|
||||
/*void FinishRX()
|
||||
|
@ -1223,7 +1139,6 @@ void MPClientReplyRX(int client)
|
|||
StartRX();
|
||||
}
|
||||
|
||||
u16 zarp = 0; u64 bazar=0, bidon=0;
|
||||
bool CheckRX(int type) // 0=regular 1=MP replies 2=MP host frames
|
||||
{
|
||||
if (IOPORT(W_PowerState) & 0x0300)
|
||||
|
@ -1234,8 +1149,7 @@ bool CheckRX(int type) // 0=regular 1=MP replies 2=MP host frames
|
|||
|
||||
if (IOPORT(W_RXBufBegin) == IOPORT(W_RXBufEnd))
|
||||
return false;
|
||||
//printf("CheckRX(%d) %016llX\n", local, USTimestamp);
|
||||
if (ComStatus & 1) printf("WHAT?????? CHECKRX(%d) WHILE ALREADY RECEIVING %04X\n", type, *(u16*)&RXBuffer[12]);
|
||||
|
||||
u16 framelen;
|
||||
u16 framectl;
|
||||
u8 txrate;
|
||||
|
@ -1251,9 +1165,6 @@ if (ComStatus & 1) printf("WHAT?????? CHECKRX(%d) WHILE ALREADY RECEIVING %04X\n
|
|||
if (rxlen == 0) return false;
|
||||
if (rxlen < 12+24) continue;
|
||||
|
||||
//if (timestamp < RXCutoff)
|
||||
// continue;
|
||||
|
||||
framelen = *(u16*)&RXBuffer[10];
|
||||
if (framelen != rxlen-12)
|
||||
{
|
||||
|
@ -1262,13 +1173,6 @@ if (ComStatus & 1) printf("WHAT?????? CHECKRX(%d) WHILE ALREADY RECEIVING %04X\n
|
|||
}
|
||||
framelen -= 4;
|
||||
|
||||
/*if (type == 1)
|
||||
{
|
||||
// reject stale frames, so we don't run too far ahead of the clients and cause a mess
|
||||
if (timestamp < (USTimestamp - 50))
|
||||
continue;
|
||||
}*/
|
||||
|
||||
framectl = *(u16*)&RXBuffer[12+0];
|
||||
txrate = RXBuffer[8];
|
||||
|
||||
|
@ -1312,6 +1216,7 @@ if (ComStatus & 1) printf("WHAT?????? CHECKRX(%d) WHILE ALREADY RECEIVING %04X\n
|
|||
}
|
||||
// TODO: those also trigger on other framectl values
|
||||
// like 0208 -> C
|
||||
// actually these don't depend on the framectl but on the destination MAC!!
|
||||
framectl &= 0xE7FF;
|
||||
if (framectl == 0x0228) rxflags |= 0x000C; // MP host frame
|
||||
else if (framectl == 0x0218) rxflags |= 0x000D; // MP ack frame
|
||||
|
@ -1341,29 +1246,11 @@ if (ComStatus & 1) printf("WHAT?????? CHECKRX(%d) WHILE ALREADY RECEIVING %04X\n
|
|||
continue;
|
||||
}
|
||||
|
||||
//if (timestamp != USTimestamp)
|
||||
// printf("PACKET %04X DESYNCED: %016llX =/= %016llX\n", framectl, timestamp, USTimestamp);
|
||||
|
||||
break;
|
||||
}
|
||||
//printf("received %04X time=%04X client=%04X\n", framectl, *(u16*)&RXBuffer[12+24], *(u16*)&RXBuffer[12+26]);
|
||||
LocalMP::_logstring2(USTimestamp, "RECEIVING FRAME", (framectl<<16)|(*(u16*)&RXBuffer[12+26]), timestamp);
|
||||
|
||||
WIFI_LOG("wifi: received packet FC:%04X SN:%04X CL:%04X RXT:%d CMT:%d\n",
|
||||
framectl, *(u16*)&RXBuffer[12+4+6+6+6], *(u16*)&RXBuffer[12+4+6+6+6+2+2], framelen*4, IOPORT(W_CmdReplyTime));
|
||||
//if (framectl==0x0228) printf("RX CMD: len=%d, client=%04X, rxfilter=%04X/%04X\n",
|
||||
// framelen, *(u16*)&RXBuffer[12+4+6+6+6+2+2], IOPORT(W_RXFilter), IOPORT(W_RXFilter2));
|
||||
//if (framectl==0x0228 && zarp==0x0228) printf("[CLIENT] failed to receive ack\n");
|
||||
//if (framectl==0x0218 && zarp==0x0218) printf("[CLIENT] failed to receive cmd\n");
|
||||
//if (framectl==0x0218) printf("[%016llX] CLIENT: ACK RECEIVED\n", USCounter);
|
||||
//if ((framectl&0xFF00)==0) printf("RECEIVED: %04X\n", framectl);
|
||||
zarp = framectl;
|
||||
|
||||
/*if (local && (framectl == 0x0118 || framectl == 0x0158))
|
||||
{//printf("received reply: %016llX, %016llX\n", timestamp, USTimestamp);
|
||||
u16 bourf = (IOPORT(W_TXSeqNo) - 0x1) << 4;
|
||||
if (bourf != *(u16*)&RXBuffer[6])
|
||||
printf("BAD REPLY SEQNO!!! SENT %04X, RECV %04X\n", bourf, *(u16*)&RXBuffer[6]);
|
||||
}*/
|
||||
|
||||
// make RX header
|
||||
|
||||
|
@ -1374,7 +1261,7 @@ if (ComStatus & 1) printf("WHAT?????? CHECKRX(%d) WHILE ALREADY RECEIVING %04X\n
|
|||
*(u16*)&RXBuffer[6] = txrate;
|
||||
*(u16*)&RXBuffer[8] = framelen;
|
||||
*(u16*)&RXBuffer[10] = 0x4080; // min/max RSSI. dunno
|
||||
zamf = timestamp;
|
||||
|
||||
if (((framectl & 0x00FF) == 0x0010) && timestamp)
|
||||
{
|
||||
// if receiving an association response: get the sync value from the host
|
||||
|
@ -1382,30 +1269,13 @@ zamf = timestamp;
|
|||
u16 aid = *(u16*)&RXBuffer[12+24+4];
|
||||
|
||||
if (aid)
|
||||
{
|
||||
//u64 sync = Platform::MP_WaitSync(0, 1<<(aid&0xF), 0);
|
||||
/*u64 sync = 0;
|
||||
for (;;)
|
||||
{
|
||||
u16 type; u64 val;
|
||||
bool res = Platform::MP_WaitSync(1<<(aid&0xF), &type, &val);
|
||||
printf("wait sync: %d, %d, %016llX\n", res, type, val);
|
||||
if (!res) break;
|
||||
if (type != 0) continue;
|
||||
sync = val;
|
||||
break;
|
||||
}
|
||||
if (sync)*/
|
||||
{
|
||||
printf("[CLIENT %01X] host sync=%016llX\n", aid&0xF, timestamp);
|
||||
|
||||
IsMPClient = true;
|
||||
//TimeOffsetToHost = USCounter - sync;
|
||||
//NextSync = USCounter + kMaxRunahead;
|
||||
USTimestamp = timestamp;
|
||||
NextSync = USTimestamp;// + 1024;//512; // TODO: tweak this!
|
||||
}
|
||||
}
|
||||
|
||||
RXTimestamp = 0;
|
||||
StartRX();
|
||||
|
@ -1427,7 +1297,7 @@ zamf = timestamp;
|
|||
RXTimestamp = timestamp;
|
||||
if (RXTimestamp < USTimestamp) RXTimestamp = USTimestamp;
|
||||
NextSync = RXTimestamp + (framelen * (txrate==0x14 ? 4:8));
|
||||
if (RXTimestamp < USTimestamp) printf("!!! RECEIVED FRAME IN THE PAST\n");
|
||||
|
||||
if ((rxflags & 0xF) == 0xC)
|
||||
{
|
||||
u16 clienttime = *(u16*)&RXBuffer[12+24];
|
||||
|
@ -1436,13 +1306,11 @@ if (RXTimestamp < USTimestamp) printf("!!! RECEIVED FRAME IN THE PAST\n");
|
|||
// include the MP reply time window
|
||||
NextSync += 112 + ((clienttime + 10) * NumClients(clientmask));
|
||||
}
|
||||
//printf("TS=%016llX NEXT+%016llX RX=%016llX\n", USTimestamp, NextSync, RXTimestamp);
|
||||
}
|
||||
else
|
||||
{
|
||||
// otherwise, just start receiving this frame now
|
||||
if ((rxflags&0xF)>=0xE && TXSlots[1].CurPhase!=2)
|
||||
printf("!!! RECEIVING MP REPLY OUTSIDE OF WINDOW (%016llX %016lX, type=%d phase=%d)\n", timestamp, USTimestamp, type, TXSlots[1].CurPhase);
|
||||
|
||||
RXTimestamp = 0;
|
||||
StartRX();
|
||||
}
|
||||
|
@ -1478,6 +1346,7 @@ void MSTimer()
|
|||
void USTimer(u32 param)
|
||||
{
|
||||
USTimestamp++;
|
||||
|
||||
if (IsMPClient)
|
||||
{
|
||||
if (RXTimestamp && (USTimestamp >= RXTimestamp))
|
||||
|
@ -1488,62 +1357,10 @@ void USTimer(u32 param)
|
|||
|
||||
if (USTimestamp >= NextSync)
|
||||
{
|
||||
/*if (SyncBack)
|
||||
{//printf("[CLIENT %01X] sending sync3\n", IOPORT(W_AIDLow));
|
||||
SyncBack = false;
|
||||
u16 aid = IOPORT(W_AIDLow);
|
||||
Platform::MP_SendSync(1<<(aid&0xF), 3, 0);
|
||||
|
||||
if (CheckRX(true))
|
||||
{
|
||||
ComStatus |= 0x1;
|
||||
}
|
||||
}*/
|
||||
//if (NextSyncType == 2)
|
||||
if (!(ComStatus & 1))
|
||||
{
|
||||
CheckRX(2);
|
||||
}
|
||||
|
||||
//u64 sync = Platform::MP_WaitSync(1, 1<<(IOPORT(W_AIDLow)&0xF), USCounter - TimeOffsetToHost);
|
||||
/*for (;;)
|
||||
{
|
||||
u16 type; u64 val;
|
||||
u16 aid = IOPORT(W_AIDLow);
|
||||
printf("[CLIENT %01X] waiting for sync\n", aid);
|
||||
bool res = Platform::MP_WaitSync(1<<(aid&0xF), &type, &val);
|
||||
//printf("[CLIENT %01X] got sync, res=%d type=%04X val=%016llX\n", aid, res, type, val);
|
||||
if (!res) printf("%04X SYNC FAILURE\n", aid);
|
||||
else printf("%04X SYNC TYPE=%d VAL=%016llX CUR=%016llX\n", aid, type, val, USTimestamp);
|
||||
if (!res) break;
|
||||
|
||||
// timeoffset = client - host
|
||||
//val += TimeOffsetToHost;
|
||||
|
||||
//if ((type == 1) && (val > USTimestamp))
|
||||
if (val > USTimestamp)
|
||||
{
|
||||
NextSync = val;
|
||||
NextSyncType = type;
|
||||
break;
|
||||
}
|
||||
/*else if ((type == 2) && (val > USTimestamp))
|
||||
{
|
||||
NextSync = val;
|
||||
|
||||
break;
|
||||
}
|
||||
/*else if ((type == 2) && (val > USCounter))
|
||||
{//printf("[CLIENT %01X] received sync2: %016llX\n", aid, val);
|
||||
NextSync = val;
|
||||
SyncBack = true;
|
||||
break;
|
||||
}*-/
|
||||
}*/
|
||||
/*if (sync)
|
||||
{
|
||||
NextSync = USCounter - sync;
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1590,11 +1407,7 @@ void USTimer(u32 param)
|
|||
if (IOPORT(W_ContentFree) != 0)
|
||||
IOPORT(W_ContentFree)--;
|
||||
|
||||
//if (!(IOPORT(W_PowerState) & 0x300))
|
||||
{
|
||||
if (ComStatus == 0)
|
||||
{
|
||||
//if (!(IOPORT(W_PowerState) & 0x0300))
|
||||
{
|
||||
u16 txbusy = IOPORT(W_TXBusy);
|
||||
if (txbusy)
|
||||
|
@ -1628,7 +1441,6 @@ void USTimer(u32 param)
|
|||
RXCounter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ComStatus & 0x2)
|
||||
{
|
||||
|
@ -1683,12 +1495,11 @@ void USTimer(u32 param)
|
|||
*(u16*)&RAM[headeraddr] = *(u16*)&RXBuffer[10];
|
||||
|
||||
IOPORT(W_RXBufWriteCursor) = (addr & ~0x3) >> 1;
|
||||
//printf("finish RX: fc=%04X rdcsr=%05X wrcsr=%05X\n", *(u16*)&RXBuffer[12], IOPORT(W_RXBufReadCursor)<<1, IOPORT(W_RXBufWriteCursor)<<1);fart=false;
|
||||
|
||||
SetIRQ(0);
|
||||
SetStatus(1);
|
||||
//printf("%016llX: finished receiving a frame, aid=%04X, FC=%04X, client=%04X\n", USTimestamp, IOPORT(W_AIDLow), *(u16*)&RXBuffer[0xC], *(u16*)&RXBuffer[0xC + 26]);
|
||||
|
||||
WIFI_LOG("wifi: finished receiving packet %04X\n", *(u16*)&RXBuffer[12]);
|
||||
LocalMP::_logstring2(USTimestamp, "FINISH RX", ((IOPORT(W_AIDLow))<<16)|(*(u16*)&RXBuffer[12+26]), RXTimestamp);
|
||||
|
||||
ComStatus &= ~0x1;
|
||||
RXCounter = 0;
|
||||
|
@ -1696,10 +1507,8 @@ void USTimer(u32 param)
|
|||
if ((RXBuffer[0] & 0x0F) == 0x0C)
|
||||
{
|
||||
u16 clientmask = *(u16*)&RXBuffer[0xC + 26];
|
||||
//printf("RECEIVED REPLY!!! CLIENT=%04X AID=%04X\n", clientmask, IOPORT(W_AIDLow));
|
||||
if (IOPORT(W_AIDLow) && (RXBuffer[0xC + 4] & 0x01) && (clientmask & (1 << IOPORT(W_AIDLow))))
|
||||
{//printf("%016llX: sending MP reply\n", USTimestamp);
|
||||
LocalMP::_logstring(USTimestamp, "SENDING MP REPLY");
|
||||
{
|
||||
SendMPReply(*(u16*)&RXBuffer[0xC + 24], clientmask);
|
||||
}
|
||||
else
|
||||
|
@ -1707,6 +1516,7 @@ void USTimer(u32 param)
|
|||
// send a blank
|
||||
// this is just so the host can have something to receive, instead of hitting a timeout
|
||||
// in the case this client wasn't ready to send a reply
|
||||
// TODO: also send this if we have RX disabled
|
||||
|
||||
Platform::MP_SendReply(nullptr, 0, USTimestamp, 0);
|
||||
}
|
||||
|
@ -1720,7 +1530,7 @@ void USTimer(u32 param)
|
|||
|
||||
if (addr == (IOPORT(W_RXBufReadCursor) << 1))
|
||||
{
|
||||
printf("wifi: RX buffer full\n");fart=false;
|
||||
printf("wifi: RX buffer full\n");
|
||||
RXTime = 0;
|
||||
SetStatus(1);
|
||||
if (TXCurSlot == 0xFFFFFFFF)
|
||||
|
@ -1738,7 +1548,6 @@ void USTimer(u32 param)
|
|||
IOPORT(W_RXTXAddr) = addr >> 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: make it more accurate, eventually
|
||||
// in the DS, the wifi system has its own 22MHz clock and doesn't use the system clock
|
||||
|
@ -2240,6 +2049,10 @@ void Write(u32 addr, u16 val)
|
|||
case 0x268:
|
||||
return;
|
||||
|
||||
case 0xD0:
|
||||
printf("RXFILTER=%04X\n", val);
|
||||
break;
|
||||
|
||||
default:
|
||||
//printf("WIFI unk: write %08X %04X\n", addr, val);
|
||||
break;
|
||||
|
|
|
@ -21,48 +21,22 @@
|
|||
#include <string.h>
|
||||
|
||||
#ifdef __WIN32__
|
||||
#define NTDDI_VERSION 0x06000000 // GROSS FUCKING HACK
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
//#include <knownfolders.h> // FUCK THAT SHIT
|
||||
#include <shlobj.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <io.h>
|
||||
#define dup _dup
|
||||
#define socket_t SOCKET
|
||||
#define sockaddr_t SOCKADDR
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#define socket_t int
|
||||
#define sockaddr_t struct sockaddr
|
||||
#define closesocket close
|
||||
// todo
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <QSharedMemory>
|
||||
#include <QSystemSemaphore>
|
||||
|
||||
#include "Config.h"
|
||||
#include "LocalMP.h"
|
||||
#include "SPI.h"
|
||||
|
||||
|
||||
#ifndef INVALID_SOCKET
|
||||
#define INVALID_SOCKET (socket_t)-1
|
||||
#endif
|
||||
|
||||
extern u16 zanf;
|
||||
|
||||
namespace LocalMP
|
||||
{
|
||||
|
||||
u32 MPUniqueID;
|
||||
socket_t MPSocket[2];
|
||||
sockaddr_t MPSendAddr[2];
|
||||
u8 PacketBuffer[2048];
|
||||
|
||||
struct MPQueueHeader
|
||||
|
@ -94,7 +68,6 @@ struct MPSync
|
|||
};
|
||||
|
||||
QSharedMemory* MPQueue;
|
||||
//QSystemSemaphore* MPQueueSem[16];
|
||||
int InstanceID;
|
||||
u32 PacketReadOffset;
|
||||
u32 ReplyReadOffset;
|
||||
|
@ -108,8 +81,6 @@ const u32 kReplyEnd = kQueueSize;
|
|||
|
||||
const int RecvTimeout = 500;
|
||||
|
||||
#define NIFI_VER 2
|
||||
|
||||
|
||||
// we need to come up with our own abstraction layer for named semaphores
|
||||
// because QSystemSemaphore doesn't support waiting with a timeout
|
||||
|
@ -200,154 +171,8 @@ bool SemWait(int num, int timeout)
|
|||
#endif // _WIN32
|
||||
|
||||
|
||||
void _logpacket(bool tx, u8* data, int len, u64 ts)
|
||||
{//return;
|
||||
char path[256];
|
||||
sprintf(path, "framelog_%08X.log", InstanceID);
|
||||
static FILE* f = nullptr;
|
||||
if (!f) f = fopen(path, "a");
|
||||
|
||||
/*fprintf(f, "---- %s PACKET LEN=%d ----\n", tx?"SENDING":"RECEIVING", len);
|
||||
|
||||
for (int y = 0; y < len; y+=16)
|
||||
{
|
||||
fprintf(f, "%04X: ", y);
|
||||
int linelen = 16;
|
||||
if ((y+linelen) > len) linelen = len-y;
|
||||
for (int x = 0; x < linelen; x++)
|
||||
{
|
||||
fprintf(f, " %02X", data[y+x]);
|
||||
}
|
||||
fprintf(f, "\n");
|
||||
}
|
||||
|
||||
fprintf(f, "-------------------------------------\n\n\n");*/
|
||||
|
||||
fprintf(f, "[%016llX] %s PACKET: LEN=%0.4d FC=%04X SN=%04X CL=%04X/%04X\n", ts, tx?"TX":"RX",
|
||||
len, *(u16*)&data[12], *(u16*)&data[12+22], *(u16*)&data[12+24], *(u16*)&data[12+26]);
|
||||
fflush(f);
|
||||
}
|
||||
|
||||
void _logstring(u64 ts, char* str)
|
||||
{//return;
|
||||
char path[256];
|
||||
sprintf(path, "framelog_%08X.log", InstanceID);
|
||||
static FILE* f = nullptr;
|
||||
if (!f) f = fopen(path, "a");
|
||||
|
||||
fprintf(f, "[%016llX] %s\n", ts, str);
|
||||
fflush(f);
|
||||
}
|
||||
|
||||
void _logstring2(u64 ts, char* str, u32 arg, u64 arg2)
|
||||
{//return;
|
||||
char path[256];
|
||||
sprintf(path, "framelog_%08X.log", InstanceID);
|
||||
static FILE* f = nullptr;
|
||||
if (!f) f = fopen(path, "a");
|
||||
|
||||
fprintf(f, "[%016llX] %s %08X %016llX\n", ts, str, arg, arg2);
|
||||
fflush(f);
|
||||
}
|
||||
|
||||
bool Init()
|
||||
{
|
||||
/*int opt_true = 1;
|
||||
int res0, res1;
|
||||
|
||||
#ifdef __WIN32__
|
||||
WSADATA wsadata;
|
||||
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif // __WIN32__
|
||||
|
||||
MPSocket[0] = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (MPSocket[0] < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
MPSocket[1] = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (MPSocket[1] < 0)
|
||||
{
|
||||
closesocket(MPSocket[0]);
|
||||
MPSocket[0] = INVALID_SOCKET;
|
||||
return false;
|
||||
}
|
||||
|
||||
res0 = setsockopt(MPSocket[0], SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(int));
|
||||
res1 = setsockopt(MPSocket[1], SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(int));
|
||||
if (res0 < 0 || res1 < 0)
|
||||
{
|
||||
closesocket(MPSocket[0]);
|
||||
MPSocket[0] = INVALID_SOCKET;
|
||||
closesocket(MPSocket[1]);
|
||||
MPSocket[1] = INVALID_SOCKET;
|
||||
return false;
|
||||
}
|
||||
|
||||
#if defined(BSD) || defined(__APPLE__)
|
||||
res0 = setsockopt(MPSocket[0], SOL_SOCKET, SO_REUSEPORT, (const char*)&opt_true, sizeof(int));
|
||||
res0 = setsockopt(MPSocket[1], SOL_SOCKET, SO_REUSEPORT, (const char*)&opt_true, sizeof(int));
|
||||
if (res0 < 0 || res1 < 0)
|
||||
{
|
||||
closesocket(MPSocket[0]);
|
||||
MPSocket[0] = INVALID_SOCKET;
|
||||
closesocket(MPSocket[1]);
|
||||
MPSocket[1] = INVALID_SOCKET;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
sockaddr_t saddr;
|
||||
saddr.sa_family = AF_INET;
|
||||
*(u32*)&saddr.sa_data[2] = htonl(Config::SocketBindAnyAddr ? INADDR_ANY : INADDR_LOOPBACK);
|
||||
*(u16*)&saddr.sa_data[0] = htons(7064);
|
||||
res0 = bind(MPSocket[0], &saddr, sizeof(sockaddr_t));
|
||||
*(u16*)&saddr.sa_data[0] = htons(7065);
|
||||
res1 = bind(MPSocket[1], &saddr, sizeof(sockaddr_t));
|
||||
if (res0 < 0 || res1 < 0)
|
||||
{
|
||||
closesocket(MPSocket[0]);
|
||||
MPSocket[0] = INVALID_SOCKET;
|
||||
closesocket(MPSocket[1]);
|
||||
MPSocket[1] = INVALID_SOCKET;
|
||||
return false;
|
||||
}
|
||||
|
||||
res0 = setsockopt(MPSocket[0], SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(int));
|
||||
res1 = setsockopt(MPSocket[1], SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(int));
|
||||
if (res0 < 0 || res1 < 0)
|
||||
{
|
||||
closesocket(MPSocket[0]);
|
||||
MPSocket[0] = INVALID_SOCKET;
|
||||
closesocket(MPSocket[1]);
|
||||
MPSocket[1] = INVALID_SOCKET;
|
||||
return false;
|
||||
}
|
||||
|
||||
MPSendAddr[0].sa_family = AF_INET;
|
||||
*(u32*)&MPSendAddr[0].sa_data[2] = htonl(INADDR_BROADCAST);
|
||||
*(u16*)&MPSendAddr[0].sa_data[0] = htons(7064);
|
||||
|
||||
MPSendAddr[1].sa_family = AF_INET;
|
||||
*(u32*)&MPSendAddr[1].sa_data[2] = htonl(INADDR_BROADCAST);
|
||||
*(u16*)&MPSendAddr[1].sa_data[0] = htons(7065);
|
||||
|
||||
u8* mac = SPI_Firmware::GetWifiMAC();
|
||||
MPUniqueID = *(u32*)&mac[0];
|
||||
MPUniqueID ^= *(u32*)&mac[2];
|
||||
printf("local MP unique ID: %08X\n", MPUniqueID);
|
||||
|
||||
return true;*/
|
||||
|
||||
/*u8* mac = SPI_Firmware::GetWifiMAC();
|
||||
MPUniqueID = *(u32*)&mac[0];
|
||||
MPUniqueID ^= *(u32*)&mac[2];
|
||||
printf("local MP unique ID: %08X\n", MPUniqueID);*/
|
||||
|
||||
MPQueue = new QSharedMemory("melonNIFI_FIFO");
|
||||
|
||||
if (!MPQueue->attach())
|
||||
|
@ -387,12 +212,6 @@ bool Init()
|
|||
|
||||
MPQueue->unlock();
|
||||
|
||||
/*for (int i = 0; i < 16; i++)
|
||||
{
|
||||
QString key = QString("melonSEMA%1").arg(i);
|
||||
MPQueueSem[i] = new QSystemSemaphore(key, 0, (i==InstanceID) ? QSystemSemaphore::Create : QSystemSemaphore::Open)
|
||||
}*/
|
||||
|
||||
// prepare semaphores
|
||||
// semaphores 0-15: regular frames; semaphore I is posted when instance I needs to process a new frame
|
||||
// semaphores 16-31: MP replies; semaphore I is posted by instance I when it sends a MP reply
|
||||
|
@ -408,16 +227,6 @@ bool Init()
|
|||
|
||||
void DeInit()
|
||||
{
|
||||
/*if (MPSocket[0] >= 0)
|
||||
closesocket(MPSocket[0]);
|
||||
if (MPSocket[1] >= 0)
|
||||
closesocket(MPSocket[1]);
|
||||
|
||||
#ifdef __WIN32__
|
||||
WSACleanup();
|
||||
#endif // __WIN32__*/
|
||||
//SemDeinit(InstanceID);
|
||||
//SemDeinit(16+InstanceID);
|
||||
MPQueue->lock();
|
||||
MPQueueHeader* header = (MPQueueHeader*)MPQueue->data();
|
||||
header->InstanceBitmask &= ~(1 << InstanceID);
|
||||
|
@ -556,7 +365,6 @@ int SendPacketGeneric(u32 type, u8* packet, int len, u64 timestamp)
|
|||
|
||||
int SendPacket(u8* packet, int len, u64 timestamp)
|
||||
{
|
||||
//_logpacket(true, packet, len, timestamp);
|
||||
return SendPacketGeneric(0, packet, len, timestamp);
|
||||
}
|
||||
|
||||
|
@ -595,7 +403,7 @@ int RecvPacket(u8* packet, bool block, u64* timestamp)
|
|||
|
||||
if (pktheader.Length)
|
||||
FIFORead(0, packet, pktheader.Length);
|
||||
//_logpacket(false, packet, pktheader.Length, pktheader.Timestamp);
|
||||
|
||||
if (timestamp) *timestamp = pktheader.Timestamp;
|
||||
MPQueue->unlock();
|
||||
return pktheader.Length;
|
||||
|
|
Loading…
Reference in New Issue