More correct emulation of the power registers.
(Tested, doesn't seem to break anything)
This commit is contained in:
parent
e05df5f15f
commit
ba617f9b7e
|
@ -418,6 +418,8 @@ void WIFI_Init(wifimac_t *wifi)
|
||||||
WIFI_resetRF(&wifi->RF) ;
|
WIFI_resetRF(&wifi->RF) ;
|
||||||
WIFI_Host_InitSystem() ;
|
WIFI_Host_InitSystem() ;
|
||||||
wifi->udpSocket = WIFI_Host_OpenChannel(1) ;
|
wifi->udpSocket = WIFI_Host_OpenChannel(1) ;
|
||||||
|
wifi->powerOn = FALSE;
|
||||||
|
wifi->powerOnPending = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WIFI_RXPutWord(wifimac_t *wifi,u16 val)
|
static void WIFI_RXPutWord(wifimac_t *wifi,u16 val)
|
||||||
|
@ -507,7 +509,7 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val)
|
||||||
break ;
|
break ;
|
||||||
case REG_WIFI_IE:
|
case REG_WIFI_IE:
|
||||||
wifi->IE.val = val ;
|
wifi->IE.val = val ;
|
||||||
printf("wifi ie write %04X\n", val);
|
//printf("wifi ie write %04X\n", val);
|
||||||
break ;
|
break ;
|
||||||
case REG_WIFI_IF:
|
case REG_WIFI_IF:
|
||||||
wifi->IF.val &= ~val ; /* clear flagging bits */
|
wifi->IF.val &= ~val ; /* clear flagging bits */
|
||||||
|
@ -528,6 +530,30 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val)
|
||||||
case REG_WIFI_WEPCNT:
|
case REG_WIFI_WEPCNT:
|
||||||
wifi->WEP_enable = (val & 0x8000) != 0 ;
|
wifi->WEP_enable = (val & 0x8000) != 0 ;
|
||||||
break ;
|
break ;
|
||||||
|
case REG_WIFI_POWERSTATE:
|
||||||
|
wifi->powerOn = ((val & 0x0002)?TRUE:FALSE);
|
||||||
|
if(wifi->powerOn) WIFI_triggerIRQ(wifi, 11);
|
||||||
|
break;
|
||||||
|
case REG_WIFI_FORCEPS:
|
||||||
|
if((val & 0x8000) && (!wifi->powerOnPending))
|
||||||
|
{
|
||||||
|
BOOL newPower = ((val & 0x0001)?FALSE:TRUE);
|
||||||
|
if(newPower != wifi->powerOn)
|
||||||
|
{
|
||||||
|
if(!newPower)
|
||||||
|
wifi->powerOn = FALSE;
|
||||||
|
else
|
||||||
|
wifi->powerOnPending = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case REG_WIFI_POWERACK:
|
||||||
|
if((val == 0x0000) && wifi->powerOnPending)
|
||||||
|
{
|
||||||
|
wifi->powerOn = TRUE;
|
||||||
|
wifi->powerOnPending = FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case REG_WIFI_RXRANGEBEGIN:
|
case REG_WIFI_RXRANGEBEGIN:
|
||||||
wifi->RXRangeBegin = val ;
|
wifi->RXRangeBegin = val ;
|
||||||
break ;
|
break ;
|
||||||
|
@ -645,6 +671,12 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val)
|
||||||
case REG_WIFI_AID_HIGH:
|
case REG_WIFI_AID_HIGH:
|
||||||
wifi->aid = val & 0x07FF ;
|
wifi->aid = val & 0x07FF ;
|
||||||
break ;
|
break ;
|
||||||
|
//case 0x36:
|
||||||
|
//case 0x38:
|
||||||
|
//case 0x3C:
|
||||||
|
//case 0x40:
|
||||||
|
// printf("wifi power reg %03X write %04X\n", address, val);
|
||||||
|
// break;
|
||||||
default:
|
default:
|
||||||
// val = 0 ; /* not handled yet */
|
// val = 0 ; /* not handled yet */
|
||||||
break ;
|
break ;
|
||||||
|
@ -687,6 +719,8 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address)
|
||||||
return wifi->IE.val ;
|
return wifi->IE.val ;
|
||||||
case REG_WIFI_IF:
|
case REG_WIFI_IF:
|
||||||
return wifi->IF.val ;
|
return wifi->IF.val ;
|
||||||
|
case REG_WIFI_POWERSTATE:
|
||||||
|
return ((wifi->powerOn ? 0x0000 : 0x0200) | (wifi->powerOnPending ? 0x0102 : 0x0000));
|
||||||
case REG_WIFI_RFIODATA1:
|
case REG_WIFI_RFIODATA1:
|
||||||
return WIFI_getRF_DATA(wifi,0) ;
|
return WIFI_getRF_DATA(wifi,0) ;
|
||||||
case REG_WIFI_RFIODATA2:
|
case REG_WIFI_RFIODATA2:
|
||||||
|
@ -757,10 +791,8 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address)
|
||||||
return wifi->pid ;
|
return wifi->pid ;
|
||||||
case REG_WIFI_AID_HIGH:
|
case REG_WIFI_AID_HIGH:
|
||||||
return wifi->aid ;
|
return wifi->aid ;
|
||||||
case 0x03C:
|
|
||||||
return 0x0200;
|
|
||||||
case 0x214:
|
case 0x214:
|
||||||
return 0x0000;
|
return 0x0009;
|
||||||
default:
|
default:
|
||||||
return wifi->ioMem[address >> 1];
|
return wifi->ioMem[address >> 1];
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,7 @@
|
||||||
#define REG_WIFI_RFIOBSY 0x180
|
#define REG_WIFI_RFIOBSY 0x180
|
||||||
#define REG_WIFI_RFIOCNT 0x184
|
#define REG_WIFI_RFIOCNT 0x184
|
||||||
#define REG_WIFI_IF_SET 0x21C
|
#define REG_WIFI_IF_SET 0x21C
|
||||||
|
#define REG_WIFI_POWERACK 0x2D0
|
||||||
|
|
||||||
/* WIFI misc constants */
|
/* WIFI misc constants */
|
||||||
#define WIFI_CHIPID 0x1440 /* emulates "old" wifi chip, new is 0xC340 */
|
#define WIFI_CHIPID 0x1440 /* emulates "old" wifi chip, new is 0xC340 */
|
||||||
|
@ -370,6 +371,10 @@ typedef union
|
||||||
/* http://www.akkit.org/info/dswifi.htm#WifiIOMap */
|
/* http://www.akkit.org/info/dswifi.htm#WifiIOMap */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
/* power */
|
||||||
|
BOOL powerOn;
|
||||||
|
BOOL powerOnPending;
|
||||||
|
|
||||||
/* wifi interrupt handling */
|
/* wifi interrupt handling */
|
||||||
wifiirq_t IE ;
|
wifiirq_t IE ;
|
||||||
wifiirq_t IF ;
|
wifiirq_t IF ;
|
||||||
|
|
Loading…
Reference in New Issue