encapsuled wifi abilities in #ifdef EXPERIMENTAL_WIFI, first TX implementation

This commit is contained in:
mightymax 2007-01-25 19:59:21 +00:00
parent a408099120
commit 8c098bde24
2 changed files with 53 additions and 7 deletions

View File

@ -18,6 +18,8 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifdef EXPERIMENTAL_WIFI
#include "wifi.h"
#include "armcpu.h"
@ -268,7 +270,8 @@ void WIFI_setRF_DATA(wifimac_t *wifi, u16 val, u8 part)
channelFreqN -= 0x00A2E8BA ;
/* every channel is now ~3813000 steps further */
WIFI_Host_CloseChannel(wifi->udpSocket) ;
WIFI_Host_OpenChannel((wifi->udpSocket,channelFreqN / 3813000)+1) ;
wifi->channel = (wifi->udpSocket,channelFreqN / 3813000)+1 ;
WIFI_Host_OpenChannel(wifi->channel) ;
}
return ;
case 13:
@ -367,10 +370,34 @@ void WIFI_RXPutWord(wifimac_t *wifi,u16 val)
void WIFI_TXStart(wifimac_t *wifi,u8 slot)
{
u16 address = (wifi->TXSlot[slot] & 0x7FFF) << 1 ;
WIFI_triggerIRQ(wifi,WIFI_IRQ_SENDSTART) ;
/* FIXME check and send data */
WIFI_triggerIRQ(wifi,WIFI_IRQ_SENDCOMPLETE) ;
if (wifi->TXSlot[slot] & 0x8000) /* is slot enabled? */
{
u16 txLen ;
/* the address has to be somewhere in the circular buffer, so drop the other bits */
u16 address = (wifi->TXSlot[slot] & 0x7FFF) ;
/* 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 = ntohs(wifi->circularBuffer[address+5]) ;
/* zero length */
if (txLen==0) return ;
/* unsupported txRate */
switch (ntohs(wifi->circularBuffer[address+4]))
{
case 10: /* 1 mbit */
case 20: /* 2 mbit */
break ;
default: /* other rates */
return ;
}
/* FIXME: calculate FCS */
WIFI_triggerIRQ(wifi,WIFI_IRQ_SENDSTART) ;
WIFI_Host_SendData(wifi->udpSocket,wifi->channel,(u8 *)&wifi->circularBuffer[address],txLen) ;
WIFI_triggerIRQ(wifi,WIFI_IRQ_SENDCOMPLETE) ;
}
}
void WIFI_write16(wifimac_t *wifi,u32 address, u16 val)
@ -472,7 +499,7 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val)
case REG_WIFI_TXLOC1:
case REG_WIFI_TXLOC2:
case REG_WIFI_TXLOC3:
wifi->TXSlot[address - REG_WIFI_TXLOC1] = val ;
wifi->TXSlot[(address - REG_WIFI_TXLOC1) >> 2] = val ;
break ;
case REG_WIFI_TXOPT:
if (val == 0xFFFF)
@ -563,6 +590,14 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address)
case REG_WIFI_RANDOM:
/* FIXME: random generator */
return 0 ;
case REG_WIFI_MAC0:
case REG_WIFI_MAC1:
case REG_WIFI_MAC2:
return wifi->mac.words[(address - REG_WIFI_MAC0) >> 1] ;
case REG_WIFI_BSS0:
case REG_WIFI_BSS1:
case REG_WIFI_BSS2:
return wifi->bss.words[(address - REG_WIFI_BSS0) >> 1] ;
default:
return 0 ;
}
@ -663,7 +698,12 @@ u16 WIFI_Host_RecvData(socket_t sock, u8 *data, u16 maxLength)
if (select(1,&dataCheck,0,0,&tv))
{
/* there is data available */
return recv(sock,(char*)data,maxLength,0) ;
u32 receivedBytes = recv(sock,(char*)data,maxLength,0) ;
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 ;
}
@ -687,3 +727,5 @@ void WIFI_Host_ShutdownSystem(void)
WSACleanup() ;
#endif
}
#endif

View File

@ -17,6 +17,7 @@
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifdef EXPERIMENTAL_WIFI
#ifndef WIFI_H
#define WIFI_H
@ -424,6 +425,7 @@ typedef struct
/* desmume host communication */
socket_t udpSocket ;
u8 channel ;
} wifimac_t ;
@ -462,3 +464,5 @@ extern u8 FW_WFCProfile[0xC0] ;
#endif
#endif
#endif /* #ifdef EXPERIMENTAL_WIFI */