Wifi: add support for periodic beacon transmission.
The socket stuff works fine; I could see all the beacons by using an ethernet sniffer, as expected :)
This commit is contained in:
parent
399f024fcb
commit
ce8b6bc7b9
|
@ -621,6 +621,9 @@ static void WIFI_triggerIRQMask(u16 mask)
|
||||||
|
|
||||||
static void WIFI_triggerIRQ(u8 irq)
|
static void WIFI_triggerIRQ(u8 irq)
|
||||||
{
|
{
|
||||||
|
if (irq == 14)
|
||||||
|
wifiMac.BeaconCount2 = 0xFFFF;
|
||||||
|
|
||||||
WIFI_triggerIRQMask(1<<irq) ;
|
WIFI_triggerIRQMask(1<<irq) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,9 +712,9 @@ static void WIFI_TXStart(u8 slot)
|
||||||
if (wifiMac.TXSlot[slot] & 0x8000) /* is slot enabled? */
|
if (wifiMac.TXSlot[slot] & 0x8000) /* is slot enabled? */
|
||||||
{
|
{
|
||||||
u16 txLen;
|
u16 txLen;
|
||||||
/* the address has to be somewhere in the circular buffer, so drop the other bits */
|
// the address has to be somewhere in the circular buffer, so drop the other bits
|
||||||
u16 address = (wifiMac.TXSlot[slot] & 0x0FFF);
|
u16 address = (wifiMac.TXSlot[slot] & 0x0FFF);
|
||||||
/* is there even enough space for the header (6 hwords) in the tx buffer? */
|
// is there even enough space for the header (6 hwords) in the tx buffer?
|
||||||
if (address > 0x1000-6)
|
if (address > 0x1000-6)
|
||||||
{
|
{
|
||||||
WIFI_LOG(1, "TX slot %i trying to send a packet overflowing from the TX buffer (address %04X). Attempt ignored.\n",
|
WIFI_LOG(1, "TX slot %i trying to send a packet overflowing from the TX buffer (address %04X). Attempt ignored.\n",
|
||||||
|
@ -719,28 +722,28 @@ static void WIFI_TXStart(u8 slot)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 12 byte header TX Header: http://www.akkit.org/info/dswifi.htm#FmtTx */
|
// 12 byte header TX Header: http://www.akkit.org/info/dswifi.htm#FmtTx
|
||||||
txLen = wifiMac.circularBuffer[address+5];
|
txLen = wifiMac.circularBuffer[address+5];
|
||||||
/* zero length */
|
// zero length
|
||||||
if (txLen == 0)
|
if (txLen == 0)
|
||||||
{
|
{
|
||||||
WIFI_LOG(1, "TX slot %i trying to send a packet with length field set to zero. Attempt ignored.\n",
|
WIFI_LOG(1, "TX slot %i trying to send a packet with length field set to zero. Attempt ignored.\n",
|
||||||
slot);
|
slot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* unsupported txRate */
|
// unsupported txRate
|
||||||
switch (wifiMac.circularBuffer[address+4] & 0xFF)
|
switch (wifiMac.circularBuffer[address+4] & 0xFF)
|
||||||
{
|
{
|
||||||
case 10: /* 1 mbit */
|
case 10: // 1 mbit
|
||||||
case 20: /* 2 mbit */
|
case 20: // 2 mbit
|
||||||
break;
|
break;
|
||||||
default: /* other rates */
|
default: // other rates
|
||||||
WIFI_LOG(1, "TX slot %i trying to send a packet with transfer rate field set to an invalid value of %i. Attempt ignored.\n",
|
WIFI_LOG(1, "TX slot %i trying to send a packet with transfer rate field set to an invalid value of %i. Attempt ignored.\n",
|
||||||
slot, wifiMac.circularBuffer[address+4] & 0xFF);
|
slot, wifiMac.circularBuffer[address+4] & 0xFF);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: calculate FCS */
|
// FIXME: calculate FCS
|
||||||
|
|
||||||
WIFI_triggerIRQ(WIFI_IRQ_SENDSTART) ;
|
WIFI_triggerIRQ(WIFI_IRQ_SENDSTART) ;
|
||||||
|
|
||||||
|
@ -765,6 +768,47 @@ static void WIFI_TXStart(u8 slot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void WIFI_BeaconTXStart()
|
||||||
|
{
|
||||||
|
if (wifiMac.BeaconEnable)
|
||||||
|
{
|
||||||
|
u16 txLen;
|
||||||
|
u16 address = wifiMac.BeaconAddr;
|
||||||
|
// is there even enough space for the header (6 hwords) in the tx buffer?
|
||||||
|
if (address > 0x1000-6)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 12 byte header TX Header: http://www.akkit.org/info/dswifi.htm#FmtTx
|
||||||
|
txLen = wifiMac.circularBuffer[address+5];
|
||||||
|
// zero length
|
||||||
|
if (txLen == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unsupported txRate
|
||||||
|
switch (wifiMac.circularBuffer[address+4] & 0xFF)
|
||||||
|
{
|
||||||
|
case 10: // 1 mbit
|
||||||
|
case 20: // 2 mbit
|
||||||
|
break;
|
||||||
|
default: // other rates
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: calculate FCS
|
||||||
|
|
||||||
|
WIFI_triggerIRQ(WIFI_IRQ_SENDSTART);
|
||||||
|
wifiCom->SendPacket((u8*)&wifiMac.circularBuffer[address+6], txLen);
|
||||||
|
WIFI_triggerIRQ(WIFI_IRQ_SENDCOMPLETE);
|
||||||
|
|
||||||
|
wifiMac.circularBuffer[address] = 0x0001;
|
||||||
|
wifiMac.circularBuffer[address+4] &= 0x00FF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void WIFI_write16(u32 address, u16 val)
|
void WIFI_write16(u32 address, u16 val)
|
||||||
{
|
{
|
||||||
BOOL action = FALSE ;
|
BOOL action = FALSE ;
|
||||||
|
@ -933,9 +977,6 @@ void WIFI_write16(u32 address, u16 val)
|
||||||
WIFI_LOG(3, "Beacon transmission enabled to send the packet at %08X every %i milliseconds.\n",
|
WIFI_LOG(3, "Beacon transmission enabled to send the packet at %08X every %i milliseconds.\n",
|
||||||
0x04804000 + (wifiMac.BeaconAddr << 1), wifiMac.BeaconInterval);
|
0x04804000 + (wifiMac.BeaconAddr << 1), wifiMac.BeaconInterval);
|
||||||
break ;
|
break ;
|
||||||
case REG_WIFI_BEACONPERIOD:
|
|
||||||
wifiMac.BeaconInterval = val & 0x03FF;
|
|
||||||
break;
|
|
||||||
case REG_WIFI_TXLOC1:
|
case REG_WIFI_TXLOC1:
|
||||||
case REG_WIFI_TXLOC2:
|
case REG_WIFI_TXLOC2:
|
||||||
case REG_WIFI_TXLOC3:
|
case REG_WIFI_TXLOC3:
|
||||||
|
@ -989,6 +1030,15 @@ void WIFI_write16(u32 address, u16 val)
|
||||||
case REG_WIFI_USCOMPARECNT:
|
case REG_WIFI_USCOMPARECNT:
|
||||||
wifiMac.ucmpEnable = (val & 1)==1 ;
|
wifiMac.ucmpEnable = (val & 1)==1 ;
|
||||||
break ;
|
break ;
|
||||||
|
case REG_WIFI_BEACONPERIOD:
|
||||||
|
wifiMac.BeaconInterval = val & 0x03FF;
|
||||||
|
break;
|
||||||
|
case REG_WIFI_BEACONCOUNT1:
|
||||||
|
wifiMac.BeaconCount1 = val;
|
||||||
|
break;
|
||||||
|
case REG_WIFI_BEACONCOUNT2:
|
||||||
|
wifiMac.BeaconCount2 = val;
|
||||||
|
break;
|
||||||
case REG_WIFI_BBSIOCNT:
|
case REG_WIFI_BBSIOCNT:
|
||||||
WIFI_setBB_CNT(val) ;
|
WIFI_setBB_CNT(val) ;
|
||||||
break ;
|
break ;
|
||||||
|
@ -1206,6 +1256,10 @@ u16 WIFI_read16(u32 address)
|
||||||
return (u16)(wifiMac.usec >> 32);
|
return (u16)(wifiMac.usec >> 32);
|
||||||
case REG_WIFI_USCOMPARE3:
|
case REG_WIFI_USCOMPARE3:
|
||||||
return (u16)(wifiMac.usec >> 48);
|
return (u16)(wifiMac.usec >> 48);
|
||||||
|
case REG_WIFI_BEACONCOUNT1:
|
||||||
|
return wifiMac.BeaconCount1;
|
||||||
|
case REG_WIFI_BEACONCOUNT2:
|
||||||
|
return wifiMac.BeaconCount2;
|
||||||
case REG_WIFI_POWER_US:
|
case REG_WIFI_POWER_US:
|
||||||
return wifiMac.crystalEnabled?0:1 ;
|
return wifiMac.crystalEnabled?0:1 ;
|
||||||
case REG_WIFI_CIRCBUFRD_END:
|
case REG_WIFI_CIRCBUFRD_END:
|
||||||
|
@ -1236,7 +1290,7 @@ void WIFI_usTrigger()
|
||||||
{
|
{
|
||||||
if (wifiMac.crystalEnabled)
|
if (wifiMac.crystalEnabled)
|
||||||
{
|
{
|
||||||
/* a usec (=3F03 cycles) has passed */
|
/* a usec has passed */
|
||||||
if (wifiMac.usecEnable)
|
if (wifiMac.usecEnable)
|
||||||
wifiMac.usec++ ;
|
wifiMac.usec++ ;
|
||||||
if (wifiMac.eCountEnable)
|
if (wifiMac.eCountEnable)
|
||||||
|
@ -1246,6 +1300,31 @@ void WIFI_usTrigger()
|
||||||
wifiMac.eCount-- ;
|
wifiMac.eCount-- ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The beacon counters are in milliseconds
|
||||||
|
// GBATek says they're decremented every 1024 usecs
|
||||||
|
if (!(wifiMac.usec & 1023))
|
||||||
|
{
|
||||||
|
wifiMac.BeaconCount1--;
|
||||||
|
if (wifiMac.BeaconCount1 == 0)
|
||||||
|
{
|
||||||
|
// FIXME: handle pre-beacon interval for IRQ 15
|
||||||
|
WIFI_triggerIRQ(WIFI_IRQ_TIMEPREBEACON);
|
||||||
|
WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON);
|
||||||
|
|
||||||
|
WIFI_BeaconTXStart();
|
||||||
|
|
||||||
|
wifiMac.BeaconCount1 = wifiMac.BeaconInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wifiMac.BeaconCount2 > 0)
|
||||||
|
{
|
||||||
|
if (wifiMac.BeaconCount2 == 1)
|
||||||
|
WIFI_triggerIRQ(WIFI_IRQ_TIMEPOSTBEACON);
|
||||||
|
|
||||||
|
wifiMac.BeaconCount2--;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((wifiMac.ucmpEnable) && (wifiMac.ucmp == wifiMac.usec))
|
if ((wifiMac.ucmpEnable) && (wifiMac.ucmp == wifiMac.usec))
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,6 +91,8 @@
|
||||||
#define REG_WIFI_USCOUNTER2 0x0FC
|
#define REG_WIFI_USCOUNTER2 0x0FC
|
||||||
#define REG_WIFI_USCOUNTER3 0x0FE
|
#define REG_WIFI_USCOUNTER3 0x0FE
|
||||||
#define REG_WIFI_EXTRACOUNT 0x118
|
#define REG_WIFI_EXTRACOUNT 0x118
|
||||||
|
#define REG_WIFI_BEACONCOUNT1 0x11C
|
||||||
|
#define REG_WIFI_BEACONCOUNT2 0x134
|
||||||
#define REG_WIFI_BBSIOCNT 0x158
|
#define REG_WIFI_BBSIOCNT 0x158
|
||||||
#define REG_WIFI_BBSIOWRITE 0x15A
|
#define REG_WIFI_BBSIOWRITE 0x15A
|
||||||
#define REG_WIFI_BBSIOREAD 0x15C
|
#define REG_WIFI_BBSIOREAD 0x15C
|
||||||
|
@ -335,6 +337,7 @@ typedef union
|
||||||
#define WIFI_IRQ_RECVSTART 6
|
#define WIFI_IRQ_RECVSTART 6
|
||||||
#define WIFI_IRQ_SENDSTART 7
|
#define WIFI_IRQ_SENDSTART 7
|
||||||
#define WIFI_IRQ_RFWAKEUP 11
|
#define WIFI_IRQ_RFWAKEUP 11
|
||||||
|
#define WIFI_IRQ_TIMEPOSTBEACON 13
|
||||||
#define WIFI_IRQ_TIMEBEACON 14
|
#define WIFI_IRQ_TIMEBEACON 14
|
||||||
#define WIFI_IRQ_TIMEPREBEACON 15
|
#define WIFI_IRQ_TIMEPREBEACON 15
|
||||||
|
|
||||||
|
@ -389,7 +392,6 @@ typedef struct
|
||||||
u16 TXStat;
|
u16 TXStat;
|
||||||
u16 BeaconAddr;
|
u16 BeaconAddr;
|
||||||
BOOL BeaconEnable;
|
BOOL BeaconEnable;
|
||||||
u16 BeaconInterval;
|
|
||||||
u16 TXSeqNo;
|
u16 TXSeqNo;
|
||||||
u8 txCurSlot;
|
u8 txCurSlot;
|
||||||
u8 txSlotBusy[3];
|
u8 txSlotBusy[3];
|
||||||
|
@ -425,6 +427,9 @@ typedef struct
|
||||||
BOOL ucmpEnable ;
|
BOOL ucmpEnable ;
|
||||||
u16 eCount ;
|
u16 eCount ;
|
||||||
BOOL eCountEnable ;
|
BOOL eCountEnable ;
|
||||||
|
u16 BeaconInterval;
|
||||||
|
u16 BeaconCount1;
|
||||||
|
u16 BeaconCount2;
|
||||||
|
|
||||||
/* subchips */
|
/* subchips */
|
||||||
rffilter_t RF ;
|
rffilter_t RF ;
|
||||||
|
|
Loading…
Reference in New Issue