wifi: cmd timer

This commit is contained in:
StapleButter 2017-06-05 14:10:12 +02:00
parent 9e36cba941
commit f749ede319
2 changed files with 37 additions and 10 deletions

View File

@ -1280,7 +1280,7 @@ void ARM7Write16(u32 addr, u16 val)
return; return;
} }
printf("unknown arm7 write16 %08X %04X @ %08X\n", addr, val, ARM7->R[15]); //printf("unknown arm7 write16 %08X %04X @ %08X\n", addr, val, ARM7->R[15]);
} }
void ARM7Write32(u32 addr, u32 val) void ARM7Write32(u32 addr, u32 val)
@ -1316,7 +1316,7 @@ void ARM7Write32(u32 addr, u32 val)
return; return;
} }
printf("unknown arm7 write32 %08X %08X @ %08X\n", addr, val, ARM7->R[15]); //printf("unknown arm7 write32 %08X %08X @ %08X\n", addr, val, ARM7->R[15]);
} }

View File

@ -37,6 +37,8 @@ u16 Random;
u64 USCounter; u64 USCounter;
u64 USCompare; u64 USCompare;
u32 CmdCounter;
u16 BBCnt; u16 BBCnt;
u8 BBWrite; u8 BBWrite;
u8 BBRegs[0x100]; u8 BBRegs[0x100];
@ -161,6 +163,11 @@ void Reset()
memset(&IOPORT(0x018), 0xFF, 6); memset(&IOPORT(0x018), 0xFF, 6);
memset(&IOPORT(0x020), 0xFF, 6); memset(&IOPORT(0x020), 0xFF, 6);
USCounter = 0;
USCompare = 0;
CmdCounter = 0;
} }
@ -208,7 +215,7 @@ void SetIRQ14(bool forced)
if (IOPORT(W_ListenCount) == 0) if (IOPORT(W_ListenCount) == 0)
IOPORT(W_ListenCount) = IOPORT(W_ListenInterval); IOPORT(W_ListenCount) = IOPORT(W_ListenInterval);
IOPORT(W_ListenCount)--;printf("IRQ14 prebeacon %04X\n", IOPORT(W_PreBeacon)); IOPORT(W_ListenCount)--;
} }
void SetIRQ15() void SetIRQ15()
@ -216,7 +223,7 @@ void SetIRQ15()
SetIRQ(15); SetIRQ(15);
if (IOPORT(W_PowerTX) & 0x0001) if (IOPORT(W_PowerTX) & 0x0001)
{printf("wakeup\n"); {
IOPORT(W_RFPins) |= 0x0080; IOPORT(W_RFPins) |= 0x0080;
IOPORT(W_RFStatus) = 1; IOPORT(W_RFStatus) = 1;
} }
@ -258,7 +265,8 @@ void StartTX_LocN(int nslot, int loc)
*(u16*)&RAM[slot->Addr + 0xC + 22] = IOPORT(W_TXSeqNo) << 4; *(u16*)&RAM[slot->Addr + 0xC + 22] = IOPORT(W_TXSeqNo) << 4;
int txlen = Platform::MP_SendPacket(&RAM[slot->Addr], 12 + slot->Length); int txlen = Platform::MP_SendPacket(&RAM[slot->Addr], 12 + slot->Length);
printf("wifi: sent %d/%d bytes of loc%d packet\n", txlen, 12+slot->Length, loc); printf("wifi: sent %d/%d bytes of loc%d packet. framectl=%04X\n",
txlen, 12+slot->Length, loc, *(u16*)&RAM[slot->Addr + 0xC]);
} }
void StartTX_Beacon() void StartTX_Beacon()
@ -295,7 +303,7 @@ void FireTX()
u16 txreq = IOPORT(W_TXReqRead); u16 txreq = IOPORT(W_TXReqRead);
if ((txreq & 0x0001) && (IOPORT(W_TXSlotLoc1) & 0x8000)) txbusy |= 0x0001; if ((txreq & 0x0001) && (IOPORT(W_TXSlotLoc1) & 0x8000)) txbusy |= 0x0001;
if ((txreq & 0x0002) && (IOPORT(W_TXSlotCmd) & 0x8000)) txbusy |= 0x0002; //if ((txreq & 0x0002) && (IOPORT(W_TXSlotCmd) & 0x8000)) txbusy |= 0x0002;
if ((txreq & 0x0004) && (IOPORT(W_TXSlotLoc2) & 0x8000)) txbusy |= 0x0004; if ((txreq & 0x0004) && (IOPORT(W_TXSlotLoc2) & 0x8000)) txbusy |= 0x0004;
if ((txreq & 0x0008) && (IOPORT(W_TXSlotLoc3) & 0x8000)) txbusy |= 0x0008; if ((txreq & 0x0008) && (IOPORT(W_TXSlotLoc3) & 0x8000)) txbusy |= 0x0008;
@ -441,6 +449,8 @@ void CheckRX()
if (MACEqual(&RXBuffer[12 + a_src], (u8*)&IOPORT(W_MACAddr0))) if (MACEqual(&RXBuffer[12 + a_src], (u8*)&IOPORT(W_MACAddr0)))
return; // oops. we received a packet we just sent. return; // oops. we received a packet we just sent.
printf("wifi: received %04X frame, checking bssid\n", framectl);
bool bssidmatch = MACEqual(&RXBuffer[12 + a_bss], (u8*)&IOPORT(W_BSSID0)); bool bssidmatch = MACEqual(&RXBuffer[12 + a_bss], (u8*)&IOPORT(W_BSSID0));
if (!(IOPORT(W_BSSID0) & 0x0001) && !(RXBuffer[12 + a_bss] & 0x01) && if (!(IOPORT(W_BSSID0) & 0x0001) && !(RXBuffer[12 + a_bss] & 0x01) &&
!bssidmatch) !bssidmatch)
@ -524,6 +534,21 @@ void USTimer(u32 param)
if (!uspart) MSTimer(); if (!uspart) MSTimer();
} }
if (IOPORT(W_CmdCountCnt) & 0x0001)
{
if (CmdCounter > 0)
{
CmdCounter--;
if (CmdCounter == 0)
{
if ((IOPORT(W_TXReqRead) & 0x0002) && (IOPORT(W_TXSlotCmd) & 0x8000))
{
printf("send CMD packet\n");
}
}
}
}
if (IOPORT(W_ContentFree) != 0) if (IOPORT(W_ContentFree) != 0)
IOPORT(W_ContentFree)--; IOPORT(W_ContentFree)--;
@ -623,6 +648,8 @@ u16 Read(u32 addr)
case W_USCompare2: return (u16)((USCompare >> 32) & 0xFFFF); case W_USCompare2: return (u16)((USCompare >> 32) & 0xFFFF);
case W_USCompare3: return (u16)(USCompare >> 48); case W_USCompare3: return (u16)(USCompare >> 48);
case W_CmdCount: return (CmdCounter + 9) / 10;
case W_BBRead: case W_BBRead:
if ((IOPORT(W_BBCnt) & 0xF000) != 0x6000) if ((IOPORT(W_BBCnt) & 0xF000) != 0x6000)
{ {
@ -746,7 +773,6 @@ void Write(u32 addr, u16 val)
IOPORT(0x1A2) = 0x0001; IOPORT(0x1A2) = 0x0001;
IOPORT(0x224) = 0x0003; IOPORT(0x224) = 0x0003;
IOPORT(0x230) = 0x0047; IOPORT(0x230) = 0x0047;
} }
} }
break; break;
@ -825,6 +851,8 @@ void Write(u32 addr, u16 val)
case W_USCompare2: USCompare = (USCompare & 0xFFFF0000FFFFFFFF) | ((u64)val << 32); return; case W_USCompare2: USCompare = (USCompare & 0xFFFF0000FFFFFFFF) | ((u64)val << 32); return;
case W_USCompare3: USCompare = (USCompare & 0x0000FFFFFFFFFFFF) | ((u64)val << 48); return; case W_USCompare3: USCompare = (USCompare & 0x0000FFFFFFFFFFFF) | ((u64)val << 48); return;
case W_CmdCount: CmdCounter = val * 10; return;
case W_BBCnt: case W_BBCnt:
IOPORT(W_BBCnt) = val; IOPORT(W_BBCnt) = val;
if ((IOPORT(W_BBCnt) & 0xF000) == 0x5000) if ((IOPORT(W_BBCnt) & 0xF000) == 0x5000)
@ -852,6 +880,7 @@ void Write(u32 addr, u16 val)
} }
if (val & 0x0080) if (val & 0x0080)
{ {
printf("wifi: latching shit\n");
IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1); IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
IOPORT(W_TXSlotReply1) = 0; IOPORT(W_TXSlotReply1) = 0;
} }
@ -887,11 +916,9 @@ void Write(u32 addr, u16 val)
case W_TXReqSet: case W_TXReqSet:
IOPORT(W_TXReqRead) |= val; IOPORT(W_TXReqRead) |= val;
FireTX(); FireTX();
// CHECKME!!!!!!!!!!!
return; return;
case W_TXSlotReset: case W_TXSlotReset:
printf("TX slot reset: %04X\n", val);
if (val & 0x0001) IOPORT(W_TXSlotLoc1) &= 0x7FFF; if (val & 0x0001) IOPORT(W_TXSlotLoc1) &= 0x7FFF;
if (val & 0x0002) IOPORT(W_TXSlotCmd) &= 0x7FFF; if (val & 0x0002) IOPORT(W_TXSlotCmd) &= 0x7FFF;
if (val & 0x0004) IOPORT(W_TXSlotLoc2) &= 0x7FFF; if (val & 0x0004) IOPORT(W_TXSlotLoc2) &= 0x7FFF;
@ -899,6 +926,7 @@ void Write(u32 addr, u16 val)
// checkme: any bits affecting the beacon slot? // checkme: any bits affecting the beacon slot?
if (val & 0x0040) IOPORT(W_TXSlotReply2) &= 0x7FFF; if (val & 0x0040) IOPORT(W_TXSlotReply2) &= 0x7FFF;
if (val & 0x0080) IOPORT(W_TXSlotReply1) &= 0x7FFF; if (val & 0x0080) IOPORT(W_TXSlotReply1) &= 0x7FFF;
if ((val & 0xFF30) && (val != 0xFFFF)) printf("unusual TXSLOTRESET %04X\n", val);
val = 0; // checkme (write-only port) val = 0; // checkme (write-only port)
break; break;
@ -934,7 +962,6 @@ void Write(u32 addr, u16 val)
val &= 0x0FFF; val &= 0x0FFF;
break; break;
case W_TXSlotCmd:
case W_TXSlotLoc1: case W_TXSlotLoc1:
case W_TXSlotLoc2: case W_TXSlotLoc2:
case W_TXSlotLoc3: case W_TXSlotLoc3: