Cleanup in wifi core:
- removed socket shit (which is anyway not suited to our needs) - Added a logging system configured by a logging level - Some other stuff...
This commit is contained in:
parent
43b31e3f0c
commit
7f483fcab4
|
@ -22,18 +22,12 @@
|
||||||
#include "wifi.h"
|
#include "wifi.h"
|
||||||
#include "armcpu.h"
|
#include "armcpu.h"
|
||||||
#include "NDSSystem.h"
|
#include "NDSSystem.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_WIFI
|
#ifdef EXPERIMENTAL_WIFI
|
||||||
|
|
||||||
wifimac_t wifiMac ;
|
wifimac_t wifiMac ;
|
||||||
|
|
||||||
socket_t WIFI_Host_OpenChannel(u8 num) ;
|
|
||||||
void WIFI_Host_CloseChannel(socket_t sock) ;
|
|
||||||
void WIFI_Host_SendData(socket_t sock, u8 channel, u8 *data, u16 length) ;
|
|
||||||
u16 WIFI_Host_RecvData(socket_t sock, u8 *data, u16 maxLength) ;
|
|
||||||
BOOL WIFI_Host_InitSystem(void) ;
|
|
||||||
void WIFI_Host_ShutdownSystem(void) ;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
@ -192,6 +186,26 @@ FW_WFCProfile FW_WFCProfile3 = {"",
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_WIFI
|
#ifdef EXPERIMENTAL_WIFI
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
Logging
|
||||||
|
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
// 0: disable logging
|
||||||
|
// 1: lowest logging, shows most important messages such as errors
|
||||||
|
// 2: low logging, shows things such as warnings
|
||||||
|
// 3: medium logging, for debugging, shows lots of stuff
|
||||||
|
// 4: high logging, for debugging, shows almost everything, may slow down
|
||||||
|
// 5: highest logging, for debugging, shows everything, may slow down a lot
|
||||||
|
#define WIFI_LOGGING_LEVEL 3
|
||||||
|
|
||||||
|
#if (WIFI_LOGGING_LEVEL >= 1)
|
||||||
|
#define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) LOGC(8, "WIFI: "__VA_ARGS__);
|
||||||
|
#else
|
||||||
|
#define WIFI_LOG(level, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
|
||||||
Helpers
|
Helpers
|
||||||
|
@ -374,10 +388,6 @@ void WIFI_setRF_DATA(wifimac_t *wifi, u16 val, u8 part)
|
||||||
if (channelFreqN<0x00A2E8BA) return ;
|
if (channelFreqN<0x00A2E8BA) return ;
|
||||||
/* substract base frequency (channel 1) */
|
/* substract base frequency (channel 1) */
|
||||||
channelFreqN -= 0x00A2E8BA ;
|
channelFreqN -= 0x00A2E8BA ;
|
||||||
/* every channel is now ~3813000 steps further */
|
|
||||||
WIFI_Host_CloseChannel(wifi->udpSocket) ;
|
|
||||||
wifi->channel = (wifi->udpSocket,channelFreqN / 3813000)+1 ;
|
|
||||||
WIFI_Host_OpenChannel(wifi->channel) ;
|
|
||||||
}
|
}
|
||||||
return ;
|
return ;
|
||||||
case 13:
|
case 13:
|
||||||
|
@ -471,17 +481,6 @@ static void WIFI_triggerIRQ(wifimac_t *wifi, u8 irq)
|
||||||
WIFI_triggerIRQMask(wifi,1<<irq) ;
|
WIFI_triggerIRQMask(wifi,1<<irq) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*int WIFI_uSleep(socket_t sock, long usec)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
fd_set dummy;
|
|
||||||
FD_ZERO(&dummy);
|
|
||||||
FD_SET(sock, &dummy);
|
|
||||||
tv.tv_sec = (usec / 1000000);
|
|
||||||
tv.tv_usec = (usec % 1000000);
|
|
||||||
return select(0, 0, 0, &dummy, &tv);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
void WIFI_Init(wifimac_t *wifi)
|
void WIFI_Init(wifimac_t *wifi)
|
||||||
{
|
{
|
||||||
|
@ -492,7 +491,6 @@ void WIFI_Init(wifimac_t *wifi)
|
||||||
if(driver->WIFI_Host_InitSystem())
|
if(driver->WIFI_Host_InitSystem())
|
||||||
{
|
{
|
||||||
wifi->netEnabled = true;
|
wifi->netEnabled = true;
|
||||||
wifi->udpSocket = WIFI_Host_OpenChannel(1) ;
|
|
||||||
}
|
}
|
||||||
wifi->powerOn = FALSE;
|
wifi->powerOn = FALSE;
|
||||||
wifi->powerOnPending = FALSE;
|
wifi->powerOnPending = FALSE;
|
||||||
|
@ -501,16 +499,6 @@ void WIFI_Init(wifimac_t *wifi)
|
||||||
wifi->rfPins = 0x0004;
|
wifi->rfPins = 0x0004;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void WIFI_Thread(wifimac_t *wifi)
|
|
||||||
{
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
WIFI_usTrigger(wifi);
|
|
||||||
WIFI_SoftAP_usTrigger(wifi);
|
|
||||||
WIFI_uSleep(wifi->udpSocket, 1);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
static void WIFI_RXPutWord(wifimac_t *wifi,u16 val)
|
static void WIFI_RXPutWord(wifimac_t *wifi,u16 val)
|
||||||
{
|
{
|
||||||
// printf("wifi: rx circbuf write attempt: rxcnt=%04X, rxread=%04X, rxwrite=%04X\n",
|
// printf("wifi: rx circbuf write attempt: rxcnt=%04X, rxread=%04X, rxwrite=%04X\n",
|
||||||
|
@ -540,34 +528,46 @@ static void WIFI_RXPutWord(wifimac_t *wifi,u16 val)
|
||||||
|
|
||||||
static void WIFI_TXStart(wifimac_t *wifi,u8 slot)
|
static void WIFI_TXStart(wifimac_t *wifi,u8 slot)
|
||||||
{
|
{
|
||||||
//printf("wifi: send attempt on slot %i, txcnt=%04X, slotcnt=%04X\n",
|
WIFI_LOG(3, "TX slot %i trying to send a packet: TXCnt = %04X, TXBufLoc = %04X\n",
|
||||||
// slot, wifi->TXCnt, wifi->TXSlot[slot]);
|
slot, wifi->TXCnt, wifi->TXSlot[slot]);
|
||||||
|
|
||||||
if (wifi->TXSlot[slot] & 0x8000) /* is slot enabled? */
|
if (wifi->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 = (wifi->TXSlot[slot] & 0x7FFF) ; //luigi: shouldnt this be 0xFFF (see W_TXBUF_LOC3 in gbatek)
|
u16 address = (wifi->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) return ; //luigi: you shouldnt do this. put assertions or LOG() calls in spots like this.
|
if (address > 0x1000-6)
|
||||||
//when an emulation is in the state that wifi is at, silently swallowing errors will make it hard to debug
|
{
|
||||||
|
WIFI_LOG(1, "TX slot %i trying to send a packet overflowing from the TX buffer (address %04X). Attempt ignored.\n",
|
||||||
|
slot, (address << 1));
|
||||||
|
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 = /*ntohs*/(wifi->circularBuffer[address+5]) ;
|
txLen = wifi->circularBuffer[address+5];
|
||||||
/* zero length */
|
/* zero length */
|
||||||
if (txLen==0) return ;
|
if (txLen == 0)
|
||||||
|
{
|
||||||
|
WIFI_LOG(1, "TX slot %i trying to send a packet with length field set to zero. Attempt ignored.\n",
|
||||||
|
slot);
|
||||||
|
return;
|
||||||
|
}
|
||||||
/* unsupported txRate */
|
/* unsupported txRate */
|
||||||
switch (/*ntohs*/(wifi->circularBuffer[address+4] & 0xFF))
|
switch (wifi->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 */
|
||||||
return ;
|
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, wifi->circularBuffer[address+4] & 0xFF);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: calculate FCS */
|
/* FIXME: calculate FCS */
|
||||||
|
|
||||||
WIFI_triggerIRQ(wifi,/*WIFI_IRQ_SENDSTART*/7) ;
|
WIFI_triggerIRQ(wifi, WIFI_IRQ_SENDSTART) ;
|
||||||
|
|
||||||
if(slot > wifi->txCurSlot)
|
if(slot > wifi->txCurSlot)
|
||||||
wifi->txCurSlot = slot;
|
wifi->txCurSlot = slot;
|
||||||
|
@ -581,9 +581,8 @@ static void WIFI_TXStart(wifimac_t *wifi,u8 slot)
|
||||||
wifi->rfPins = 0x0046;
|
wifi->rfPins = 0x0046;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
WIFI_Host_SendData(wifi->udpSocket,wifi->channel,(u8 *)&wifi->circularBuffer[address],txLen) ;
|
|
||||||
WIFI_SoftAP_RecvPacketFromDS(wifi, (u8*)&wifi->circularBuffer[address+6], txLen);
|
WIFI_SoftAP_RecvPacketFromDS(wifi, (u8*)&wifi->circularBuffer[address+6], txLen);
|
||||||
WIFI_triggerIRQ(wifi,/*WIFI_IRQ_SENDCOMPLETE*/1) ;
|
WIFI_triggerIRQ(wifi, WIFI_IRQ_SENDCOMPLETE) ;
|
||||||
|
|
||||||
wifi->circularBuffer[address] = 0x0001;
|
wifi->circularBuffer[address] = 0x0001;
|
||||||
wifi->circularBuffer[address+4] &= 0x00FF;
|
wifi->circularBuffer[address+4] &= 0x00FF;
|
||||||
|
@ -595,7 +594,9 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val)
|
||||||
{
|
{
|
||||||
BOOL action = FALSE ;
|
BOOL action = FALSE ;
|
||||||
if (!(MMU_read32(ARMCPU_ARM7,REG_PWRCNT) & 0x0002)) return ; /* access to wifi hardware was disabled */
|
if (!(MMU_read32(ARMCPU_ARM7,REG_PWRCNT) & 0x0002)) return ; /* access to wifi hardware was disabled */
|
||||||
if ((address & 0xFF800000) != 0x04800000) return ; /* error: the address does not describe a wiifi register */
|
if ((address & 0xFF800000) != 0x04800000) return ; /* error: the address does not describe a wifi register */
|
||||||
|
|
||||||
|
WIFI_LOG(5, "Write at address %08X, %04X\n", address, val);
|
||||||
|
|
||||||
/* the first 0x1000 bytes are mirrored at +0x1000,+0x2000,+0x3000,+06000,+0x7000 */
|
/* the first 0x1000 bytes are mirrored at +0x1000,+0x2000,+0x3000,+06000,+0x7000 */
|
||||||
/* only the first mirror causes an special action */
|
/* only the first mirror causes an special action */
|
||||||
|
@ -860,7 +861,9 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address)
|
||||||
BOOL action = FALSE ;
|
BOOL action = FALSE ;
|
||||||
u16 temp ;
|
u16 temp ;
|
||||||
if (!(MMU_read32(ARMCPU_ARM7,REG_PWRCNT) & 0x0002)) return 0 ; /* access to wifi hardware was disabled */
|
if (!(MMU_read32(ARMCPU_ARM7,REG_PWRCNT) & 0x0002)) return 0 ; /* access to wifi hardware was disabled */
|
||||||
if ((address & 0xFF800000) != 0x04800000) return 0 ; /* error: the address does not describe a wiifi register */
|
if ((address & 0xFF800000) != 0x04800000) return 0 ; /* error: the address does not describe a wifi register */
|
||||||
|
|
||||||
|
WIFI_LOG(5, "Read at address %08X\n", address);
|
||||||
|
|
||||||
/* the first 0x1000 bytes are mirrored at +0x1000,+0x2000,+0x3000,+06000,+0x7000 */
|
/* the first 0x1000 bytes are mirrored at +0x1000,+0x2000,+0x3000,+06000,+0x7000 */
|
||||||
/* only the first mirror causes an special action */
|
/* only the first mirror causes an special action */
|
||||||
|
@ -1055,28 +1058,9 @@ void WIFI_usTrigger(wifimac_t *wifi)
|
||||||
}
|
}
|
||||||
if ((wifi->ucmpEnable) && (wifi->ucmp == wifi->usec))
|
if ((wifi->ucmpEnable) && (wifi->ucmp == wifi->usec))
|
||||||
{
|
{
|
||||||
WIFI_triggerIRQ(wifi,/*WIFI_IRQ_TIMEBEACON*/14) ;
|
WIFI_triggerIRQ(wifi, WIFI_IRQ_TIMEBEACON) ;
|
||||||
}
|
}
|
||||||
/* receive check, given a 2 mbit connection, 2 bits per usec can be transfered. */
|
|
||||||
/* for a packet of 32 Bytes, at least 128 usec passed, we will use the 32 byte accuracy to reduce load */
|
|
||||||
#if 0
|
|
||||||
if (!(wifi->RXCheckCounter++ & 0x7F))
|
|
||||||
{
|
|
||||||
/* check if data arrived in the meantime */
|
|
||||||
rcvSize = WIFI_Host_RecvData(wifi->udpSocket,dataBuffer,0x2000) ;
|
|
||||||
if (rcvSize)
|
|
||||||
{
|
|
||||||
u16 i ;
|
|
||||||
/* process data, put it into mac memory */
|
|
||||||
WIFI_triggerIRQ(wifi,/*WIFI_IRQ_RECVSTART*/6) ;
|
|
||||||
for (i=0;i<(rcvSize+1) << 1;i++)
|
|
||||||
{
|
|
||||||
WIFI_RXPutWord(wifi,((u16 *)dataBuffer)[i]) ;
|
|
||||||
}
|
|
||||||
WIFI_triggerIRQ(wifi,/*WIFI_IRQ_RECVCOMPLETE*/0) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if((wifi->usec & 3) == 0)
|
if((wifi->usec & 3) == 0)
|
||||||
{
|
{
|
||||||
int slot = wifi->txCurSlot;
|
int slot = wifi->txCurSlot;
|
||||||
|
@ -1098,15 +1082,15 @@ void WIFI_usTrigger(wifimac_t *wifi)
|
||||||
|
|
||||||
wifi->TXStat = (0x0001 | (slot << 12));
|
wifi->TXStat = (0x0001 | (slot << 12));
|
||||||
|
|
||||||
WIFI_triggerIRQ(wifi, 1);
|
WIFI_triggerIRQ(wifi, WIFI_IRQ_SENDCOMPLETE);
|
||||||
|
|
||||||
//wifi->rfStatus = 0x0001;
|
//wifi->rfStatus = 0x0001;
|
||||||
//wifi->rfPins = 0x0084;
|
//wifi->rfPins = 0x0084;
|
||||||
wifi->rfStatus = 0x0009;
|
wifi->rfStatus = 0x0009;
|
||||||
wifi->rfPins = 0x0004;
|
wifi->rfPins = 0x0004;
|
||||||
|
|
||||||
//printf("wifi: finished sending packet on slot %i (addr=%04X, txstat=%04X)\n",
|
WIFI_LOG(3, "TX slot %i finished sending its packet. Next is slot %i. TXStat = %04X\n",
|
||||||
// slot, wifi->txSlotAddr[slot], wifi->TXStat);
|
slot, wifi->txCurSlot, wifi->TXStat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1277,7 +1261,8 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
|
||||||
int alignedLen = WIFI_alignedLen(len);
|
int alignedLen = WIFI_alignedLen(len);
|
||||||
u16 frameCtl = *(u16*)&packet[12];
|
u16 frameCtl = *(u16*)&packet[12];
|
||||||
|
|
||||||
//printf("wifi: packet arrived, len = %i (%i), frame ctl = %04X\n", len, alignedLen, frameCtl);
|
WIFI_LOG(3, "SoftAP: Received a packet of length %i bytes (%i aligned). Frame control = %04X\n",
|
||||||
|
len, alignedLen, frameCtl);
|
||||||
|
|
||||||
switch((frameCtl >> 2) & 0x3)
|
switch((frameCtl >> 2) & 0x3)
|
||||||
{
|
{
|
||||||
|
@ -1469,15 +1454,11 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
|
||||||
/* ie ~8 microseconds to transfer a word. */
|
/* ie ~8 microseconds to transfer a word. */
|
||||||
if((wifi->SoftAP.curPacketSending) && !(wifi->SoftAP.usecCounter & 7))
|
if((wifi->SoftAP.curPacketSending) && !(wifi->SoftAP.usecCounter & 7))
|
||||||
{
|
{
|
||||||
/* if(wifi->SoftAP.curPacketPos == -4)
|
if(wifi->SoftAP.curPacketPos >= 0)
|
||||||
{
|
|
||||||
WIFI_triggerIRQ(wifi, 6);
|
|
||||||
}
|
|
||||||
else*/ if(wifi->SoftAP.curPacketPos >= 0)
|
|
||||||
{
|
{
|
||||||
if(wifi->SoftAP.curPacketPos == 0)
|
if(wifi->SoftAP.curPacketPos == 0)
|
||||||
{
|
{
|
||||||
WIFI_triggerIRQ(wifi, 6);
|
WIFI_triggerIRQ(wifi, WIFI_IRQ_RECVSTART);
|
||||||
|
|
||||||
wifi->rfStatus = 0x0009;
|
wifi->rfStatus = 0x0009;
|
||||||
wifi->rfPins = 0x0004;
|
wifi->rfPins = 0x0004;
|
||||||
|
@ -1492,10 +1473,6 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 word = (wifi->SoftAP.curPacket[wifi->SoftAP.curPacketPos] | (wifi->SoftAP.curPacket[wifi->SoftAP.curPacketPos+1] << 8));
|
u16 word = (wifi->SoftAP.curPacket[wifi->SoftAP.curPacketPos] | (wifi->SoftAP.curPacket[wifi->SoftAP.curPacketPos+1] << 8));
|
||||||
//WIFI_SoftAP_SendWordToDS(wifi, word);
|
|
||||||
// if(wifi->SoftAP.curPacketPos<12)
|
|
||||||
// printf("wifi: writing word %i (%04X) of packet to %04X\n",
|
|
||||||
// wifi->SoftAP.curPacketPos, word, wifi->RXHWWriteCursor);
|
|
||||||
WIFI_RXPutWord(wifi, word);
|
WIFI_RXPutWord(wifi, word);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1511,7 +1488,7 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
|
||||||
|
|
||||||
wifi->RXHWWriteCursorReg = ((wifi->RXHWWriteCursor + 1) & (~1));
|
wifi->RXHWWriteCursorReg = ((wifi->RXHWWriteCursor + 1) & (~1));
|
||||||
|
|
||||||
WIFI_triggerIRQ(wifi, 0);
|
WIFI_triggerIRQ(wifi, WIFI_IRQ_RECVCOMPLETE);
|
||||||
|
|
||||||
// hax
|
// hax
|
||||||
//packet_arrived=1;
|
//packet_arrived=1;
|
||||||
|
@ -1521,79 +1498,4 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
|
|
||||||
Host system operations
|
|
||||||
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
socket_t WIFI_Host_OpenChannel(u8 num)
|
|
||||||
{
|
|
||||||
sockaddr_t address ;
|
|
||||||
/* create a new socket */
|
|
||||||
socket_t channelSocket = socket(AF_INET,SOCK_DGRAM,0) ;
|
|
||||||
/* set the sockets address */
|
|
||||||
memset(&address,0,sizeof(sockaddr_t)) ;
|
|
||||||
address.sa_family = AF_INET ;
|
|
||||||
*(u32 *)&address.sa_data[2] = htonl(0) ; /* IP: any */
|
|
||||||
*(u16 *)&address.sa_data[0] = htons(BASEPORT + num-1) ; /* Port */
|
|
||||||
bind(channelSocket,&address,sizeof(sockaddr_t)) ;
|
|
||||||
return channelSocket ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WIFI_Host_CloseChannel(socket_t sock)
|
|
||||||
{
|
|
||||||
if (sock!=INVALID_SOCKET)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
closesocket(sock) ;
|
|
||||||
#else
|
|
||||||
close(sock) ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WIFI_Host_SendData(socket_t sock, u8 channel, u8 *data, u16 length)
|
|
||||||
{
|
|
||||||
//printf("wifi: sending packet of length %i on channel %i\n", length, channel);
|
|
||||||
sockaddr_t address ;
|
|
||||||
/* create the frame to validate data: "DSWIFI" string and a u16 constant of the payload length */
|
|
||||||
u8 *frame = (u8 *)malloc(length + 8) ;
|
|
||||||
sprintf((char *)frame,"DSWIFI") ;
|
|
||||||
*(u16 *)(frame+6) = htons(length) ;
|
|
||||||
memcpy(frame+8,data,length) ;
|
|
||||||
/* target address */
|
|
||||||
memset(&address,0,sizeof(sockaddr_t)) ;
|
|
||||||
address.sa_family = AF_INET ;
|
|
||||||
*(u32 *)&address.sa_data[2] = htonl(0xFFFFFFFF) ; /* IP: broadcast */
|
|
||||||
*(u16 *)&address.sa_data[0] = htons(BASEPORT + channel-1) ; /* Port */
|
|
||||||
/* send the data now */
|
|
||||||
sendto(sock,(const char *)frame,length+8,0,&address,sizeof(sockaddr_t)) ;
|
|
||||||
/* clean up frame buffer */
|
|
||||||
free(frame) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
u16 WIFI_Host_RecvData(socket_t sock, u8 *data, u16 maxLength)
|
|
||||||
{
|
|
||||||
fd_set dataCheck ;
|
|
||||||
struct timeval tv ;
|
|
||||||
FD_ZERO(&dataCheck) ;
|
|
||||||
FD_SET(sock,&dataCheck) ;
|
|
||||||
tv.tv_sec = 0 ;
|
|
||||||
tv.tv_usec = 0 ;
|
|
||||||
/* check if there is data, without blocking */
|
|
||||||
if (select(1,&dataCheck,0,0,&tv))
|
|
||||||
{
|
|
||||||
/* there is data available */
|
|
||||||
u32 receivedBytes = recv(sock,(char*)data,maxLength,0) ;
|
|
||||||
//printf("wifi: received %i bytes\n", receivedBytes);
|
|
||||||
if (receivedBytes < 8) return 0 ; /* this cant be data for us, the header alone is 8 bytes */
|
|
||||||
if (memcmp(data,"DSWIFI",6)!=0) return 0 ; /* this isnt data for us, as the tag is not our */
|
|
||||||
if (ntohs(*(u16 *)(data+6))+8 != receivedBytes) return 0 ; /* the datalen+headerlen is not what we received */
|
|
||||||
memmove(data,data+8,receivedBytes-8) ;
|
|
||||||
return receivedBytes-8 ;
|
|
||||||
}
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25,27 +25,9 @@
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_WIFI
|
#ifdef EXPERIMENTAL_WIFI
|
||||||
|
|
||||||
/* standardize socket interface for linux and windows */
|
|
||||||
/* TODO: get rid of the socket thing, as we're going to use libpcap */
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <winsock2.h>
|
|
||||||
#define socket_t SOCKET
|
|
||||||
#define sockaddr_t SOCKADDR
|
|
||||||
#include "windriver.h"
|
#include "windriver.h"
|
||||||
#else
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#define socket_t int
|
|
||||||
#define sockaddr_t struct sockaddr
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef INVALID_SOCKET
|
|
||||||
#define INVALID_SOCKET (socket_t)-1
|
|
||||||
#endif
|
|
||||||
#define BASEPORT 7000 /* channel 1: 7000 ... channel 13: 7012 */
|
|
||||||
/* FIXME: make it configureable */
|
|
||||||
|
|
||||||
#define HAVE_REMOTE
|
#define HAVE_REMOTE
|
||||||
#define WPCAP
|
#define WPCAP
|
||||||
|
@ -345,17 +327,17 @@ typedef union
|
||||||
u16 val ;
|
u16 val ;
|
||||||
} bbIOCnt_t ;
|
} bbIOCnt_t ;
|
||||||
|
|
||||||
#define WIFI_IRQ_RECVCOMPLETE 0x0001
|
#define WIFI_IRQ_RECVCOMPLETE 0
|
||||||
#define WIFI_IRQ_SENDCOMPLETE 0x0002
|
#define WIFI_IRQ_SENDCOMPLETE 1
|
||||||
#define WIFI_IRQ_COUNTUP 0x0004
|
#define WIFI_IRQ_COUNTUP 2
|
||||||
#define WIFI_IRQ_SENDERROR 0x0008
|
#define WIFI_IRQ_SENDERROR 3
|
||||||
#define WIFI_IRQ_STATCOUNTUP 0x0010
|
#define WIFI_IRQ_STATCOUNTUP 4
|
||||||
#define WIFI_IRQ_STATACKUP 0x0020
|
#define WIFI_IRQ_STATACKUP 5
|
||||||
#define WIFI_IRQ_RECVSTART 0x0040
|
#define WIFI_IRQ_RECVSTART 6
|
||||||
#define WIFI_IRQ_SENDSTART 0x0080
|
#define WIFI_IRQ_SENDSTART 7
|
||||||
#define WIFI_IRQ_RFWAKEUP 0x0800
|
#define WIFI_IRQ_RFWAKEUP 11
|
||||||
#define WIFI_IRQ_TIMEBEACON 0x4000
|
#define WIFI_IRQ_TIMEBEACON 14
|
||||||
#define WIFI_IRQ_TIMEPREBEACON 0x8000
|
#define WIFI_IRQ_TIMEPREBEACON 15
|
||||||
|
|
||||||
/* definition of the irq bitfields for wifi irq's (cascaded at arm7 irq #24) */
|
/* definition of the irq bitfields for wifi irq's (cascaded at arm7 irq #24) */
|
||||||
typedef union
|
typedef union
|
||||||
|
@ -498,8 +480,6 @@ typedef struct
|
||||||
|
|
||||||
/* desmume host communication */
|
/* desmume host communication */
|
||||||
bool netEnabled;
|
bool netEnabled;
|
||||||
socket_t udpSocket ;
|
|
||||||
u8 channel ;
|
|
||||||
|
|
||||||
} wifimac_t ;
|
} wifimac_t ;
|
||||||
|
|
||||||
|
@ -507,8 +487,6 @@ extern wifimac_t wifiMac ;
|
||||||
|
|
||||||
void WIFI_Init(wifimac_t *wifi);
|
void WIFI_Init(wifimac_t *wifi);
|
||||||
|
|
||||||
//void WIFI_Thread(wifimac_t *wifi);
|
|
||||||
|
|
||||||
/* subchip communication IO functions */
|
/* subchip communication IO functions */
|
||||||
void WIFI_setRF_CNT(wifimac_t *wifi, u16 val) ;
|
void WIFI_setRF_CNT(wifimac_t *wifi, u16 val) ;
|
||||||
void WIFI_setRF_DATA(wifimac_t *wifi, u16 val, u8 part) ;
|
void WIFI_setRF_DATA(wifimac_t *wifi, u16 val, u8 part) ;
|
||||||
|
|
|
@ -1518,14 +1518,6 @@ class WinDriver : public Driver
|
||||||
{
|
{
|
||||||
virtual bool WIFI_Host_InitSystem() {
|
virtual bool WIFI_Host_InitSystem() {
|
||||||
#ifdef EXPERIMENTAL_WIFI
|
#ifdef EXPERIMENTAL_WIFI
|
||||||
//require winsock initialization
|
|
||||||
WSADATA wsaData ;
|
|
||||||
WORD version = MAKEWORD(1,1) ;
|
|
||||||
if (WSAStartup(version,&wsaData))
|
|
||||||
{
|
|
||||||
printf("Failed initializing WSAStartup - softAP support disabled\n");
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
//require wpcap.dll
|
//require wpcap.dll
|
||||||
HMODULE temp = LoadLibrary("wpcap.dll");
|
HMODULE temp = LoadLibrary("wpcap.dll");
|
||||||
if(temp == NULL) {
|
if(temp == NULL) {
|
||||||
|
@ -1539,9 +1531,6 @@ class WinDriver : public Driver
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
virtual void WIFI_Host_ShutdownSystem() {
|
virtual void WIFI_Host_ShutdownSystem() {
|
||||||
#ifdef EXPERIMENTAL_WIFI
|
|
||||||
WSACleanup() ;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool AVI_IsRecording()
|
virtual bool AVI_IsRecording()
|
||||||
|
|
Loading…
Reference in New Issue