mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 06:39:46 -06:00
fix sd commands 0x40 and 0x41. thanks to tueidj for the test.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7126 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -133,20 +133,30 @@ void Shutdown()
|
||||
|
||||
void SetDefaultContentFile(const std::string& _rFilename)
|
||||
{
|
||||
CWII_IPC_HLE_Device_es* pDevice = (CWII_IPC_HLE_Device_es*)AccessDeviceByID(GetDeviceIDByName(std::string("/dev/es")));
|
||||
CWII_IPC_HLE_Device_es* pDevice =
|
||||
(CWII_IPC_HLE_Device_es*)AccessDeviceByID(GetDeviceIDByName(std::string("/dev/es")));
|
||||
if (pDevice)
|
||||
pDevice->LoadWAD(_rFilename);
|
||||
}
|
||||
|
||||
void ES_DIVerify(u8 *_pTMD, u32 _sz)
|
||||
{
|
||||
CWII_IPC_HLE_Device_es* pDevice = (CWII_IPC_HLE_Device_es*)AccessDeviceByID(GetDeviceIDByName(std::string("/dev/es")));
|
||||
CWII_IPC_HLE_Device_es* pDevice =
|
||||
(CWII_IPC_HLE_Device_es*)AccessDeviceByID(GetDeviceIDByName(std::string("/dev/es")));
|
||||
if (pDevice)
|
||||
pDevice->ES_DIVerify(_pTMD, _sz);
|
||||
else
|
||||
ERROR_LOG(WII_IPC_ES, "DIVerify called but /dev/es is not available");
|
||||
}
|
||||
|
||||
void SDIO_EventNotify()
|
||||
{
|
||||
CWII_IPC_HLE_Device_sdio_slot0 *pDevice =
|
||||
(CWII_IPC_HLE_Device_sdio_slot0*)AccessDeviceByID(GetDeviceIDByName(std::string("/dev/sdio/slot0")));
|
||||
if (pDevice)
|
||||
pDevice->EventNotify();
|
||||
}
|
||||
|
||||
int GetDeviceIDByName(const std::string& _rDeviceName)
|
||||
{
|
||||
TDeviceMap::const_iterator itr = g_DeviceMap.begin();
|
||||
|
@ -44,6 +44,8 @@ void DoState(PointerWrap &p);
|
||||
void SetDefaultContentFile(const std::string& _rFilename);
|
||||
void ES_DIVerify(u8 *_pTMD, u32 _sz);
|
||||
|
||||
void SDIO_EventNotify();
|
||||
|
||||
int GetDeviceIDByName(const std::string& _rDeviceName);
|
||||
|
||||
IWII_IPC_HLE_Device* AccessDeviceByID(u32 _ID);
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "SDCardUtil.h"
|
||||
|
||||
#include "WII_IPC_HLE.h"
|
||||
#include "WII_IPC_HLE_Device_sdio_slot0.h"
|
||||
|
||||
#include "../HW/CPU.h"
|
||||
@ -43,6 +44,18 @@ CWII_IPC_HLE_Device_sdio_slot0::~CWII_IPC_HLE_Device_sdio_slot0()
|
||||
}
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_sdio_slot0::EventNotify()
|
||||
{
|
||||
if ((SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_INSERT) ||
|
||||
(!SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_REMOVE))
|
||||
{
|
||||
Memory::Write_U32(m_event.type, m_event.addr + 4);
|
||||
WII_IPC_HLE_Interface::EnqReply(m_event.addr);
|
||||
m_event.addr = 0;
|
||||
m_event.type = EVENT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
bool CWII_IPC_HLE_Device_sdio_slot0::Open(u32 _CommandAddress, u32 _Mode)
|
||||
{
|
||||
INFO_LOG(WII_IPC_SD, "Open");
|
||||
@ -159,10 +172,8 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
||||
break;
|
||||
|
||||
case IOCTL_SENDCMD:
|
||||
if (Memory::Read_U32(BufferIn) != SDHC_CAPABILITIES)
|
||||
{
|
||||
INFO_LOG(WII_IPC_SD, "IOCTL_SENDCMD 0x%08x", Memory::Read_U32(BufferIn));
|
||||
}
|
||||
INFO_LOG(WII_IPC_SD, "IOCTL_SENDCMD %x ipc:%08x",
|
||||
Memory::Read_U32(BufferIn), _CommandAddress);
|
||||
ReturnValue = ExecuteCommand(BufferIn, BufferInSize, 0, 0, BufferOut, BufferOutSize);
|
||||
break;
|
||||
|
||||
@ -172,7 +183,7 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
||||
else
|
||||
m_Status = CARD_NOT_EXIST;
|
||||
INFO_LOG(WII_IPC_SD, "IOCTL_GETSTATUS. Replying that SD card is %s%s",
|
||||
(m_Status & CARD_INSERTED) ? "inserted" : "not exitsting",
|
||||
(m_Status & CARD_INSERTED) ? "inserted" : "not present",
|
||||
(m_Status & CARD_INITIALIZED) ? " and initialized" : "");
|
||||
Memory::Write_U32(m_Status, BufferOut);
|
||||
break;
|
||||
@ -192,9 +203,32 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
||||
// INFO_LOG(WII_IPC_SD, "OutBuffer");
|
||||
// DumpCommands(BufferOut, BufferOutSize/4, LogTypes::WII_IPC_SD);
|
||||
|
||||
Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
|
||||
|
||||
return true;
|
||||
if (ReturnValue == RET_EVENT_REGISTER)
|
||||
{
|
||||
// async
|
||||
m_event.addr = _CommandAddress;
|
||||
Memory::Write_U32(0, _CommandAddress + 0x4);
|
||||
// Check if the condition is already true
|
||||
EventNotify();
|
||||
return false;
|
||||
}
|
||||
else if (ReturnValue == RET_EVENT_UNREGISTER)
|
||||
{
|
||||
// release returns 0
|
||||
// unknown sd int
|
||||
// technically we do it out of order, oh well
|
||||
Memory::Write_U32(EVENT_INVALID, m_event.addr + 4);
|
||||
WII_IPC_HLE_Interface::EnqReply(m_event.addr);
|
||||
m_event.addr = 0;
|
||||
m_event.type = EVENT_NONE;
|
||||
Memory::Write_U32(0, _CommandAddress + 0x4);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool CWII_IPC_HLE_Device_sdio_slot0::IOCtlV(u32 _CommandAddress)
|
||||
@ -264,7 +298,7 @@ u32 CWII_IPC_HLE_Device_sdio_slot0::ExecuteCommand(u32 _BufferIn, u32 _BufferInS
|
||||
// Note: req.addr is the virtual address of _rwBuffer
|
||||
|
||||
|
||||
u32 rwFail = 0;
|
||||
u32 ret = RET_OK;
|
||||
|
||||
switch (req.command)
|
||||
{
|
||||
@ -365,7 +399,7 @@ u32 CWII_IPC_HLE_Device_sdio_slot0::ExecuteCommand(u32 _BufferIn, u32 _BufferInS
|
||||
"read %lx, error %i, eof? %i",
|
||||
(unsigned long)nRead,
|
||||
ferror(m_Card), feof(m_Card));
|
||||
rwFail = 1;
|
||||
ret = RET_FAIL;
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
@ -402,7 +436,7 @@ u32 CWII_IPC_HLE_Device_sdio_slot0::ExecuteCommand(u32 _BufferIn, u32 _BufferInS
|
||||
"wrote %lx, error %i, eof? %i",
|
||||
(unsigned long)nWritten,
|
||||
ferror(m_Card), feof(m_Card));
|
||||
rwFail = 1;
|
||||
ret = RET_FAIL;
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
@ -411,23 +445,16 @@ u32 CWII_IPC_HLE_Device_sdio_slot0::ExecuteCommand(u32 _BufferIn, u32 _BufferInS
|
||||
Memory::Write_U32(0x900, _BufferOut);
|
||||
break;
|
||||
|
||||
case SDHC_CAPABILITIES:
|
||||
{
|
||||
DEBUG_LOG(WII_IPC_SD, "SDHC_CAPABILITIES");
|
||||
// SDHC 1.0 supports only 10-63 MHz.
|
||||
// So of course we reply 63MHz :)
|
||||
u32 freq = (63 << 8) + (1 << 7) + 63;
|
||||
// Only support 3.3V
|
||||
u32 voltage = 1 << 24;
|
||||
// High Speed support
|
||||
u32 speed = 1 << 21;
|
||||
u32 caps = freq | voltage | speed;
|
||||
Memory::Write_U32(caps, _BufferOut);
|
||||
break;
|
||||
}
|
||||
case EVENT_REGISTER: // async
|
||||
DEBUG_LOG(WII_IPC_SD, "Register event %x", req.arg);
|
||||
m_event.type = (EventType)req.arg;
|
||||
ret = RET_EVENT_REGISTER;
|
||||
break;
|
||||
|
||||
case CRAZY_BIGN65:
|
||||
// Just means unmount/detach, but we don't care
|
||||
case EVENT_UNREGISTER: // synchronous
|
||||
DEBUG_LOG(WII_IPC_SD, "Unregister event %x", req.arg);
|
||||
m_event.type = (EventType)req.arg;
|
||||
ret = RET_EVENT_UNREGISTER;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -435,5 +462,5 @@ u32 CWII_IPC_HLE_Device_sdio_slot0::ExecuteCommand(u32 _BufferIn, u32 _BufferInS
|
||||
break;
|
||||
}
|
||||
|
||||
return rwFail;
|
||||
return ret;
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ public:
|
||||
bool IOCtl(u32 _CommandAddress);
|
||||
bool IOCtlV(u32 _CommandAddress);
|
||||
|
||||
void EventNotify();
|
||||
|
||||
private:
|
||||
|
||||
enum
|
||||
@ -67,6 +69,15 @@ private:
|
||||
IOCTLV_SENDCMD = 0x07,
|
||||
};
|
||||
|
||||
// ExecuteCommand
|
||||
enum
|
||||
{
|
||||
RET_OK,
|
||||
RET_FAIL,
|
||||
RET_EVENT_REGISTER, // internal state only - not actually returned
|
||||
RET_EVENT_UNREGISTER
|
||||
};
|
||||
|
||||
// Status
|
||||
enum
|
||||
{
|
||||
@ -95,10 +106,30 @@ private:
|
||||
ACMD_SENDOPCOND = 0x29,
|
||||
ACMD_SENDSCR = 0x33,
|
||||
|
||||
SDHC_CAPABILITIES = 0x40,
|
||||
CRAZY_BIGN65 = 0x41,
|
||||
EVENT_REGISTER = 0x40,
|
||||
EVENT_UNREGISTER = 0x41,
|
||||
};
|
||||
|
||||
enum EventType
|
||||
{
|
||||
EVENT_NONE = 0,
|
||||
EVENT_INSERT,
|
||||
EVENT_REMOVE,
|
||||
// from unregister, i think it is just meant to be invalid
|
||||
EVENT_INVALID = 0xc210000
|
||||
};
|
||||
|
||||
// TODO do we need more than one?
|
||||
struct Event
|
||||
{
|
||||
EventType type;
|
||||
u32 addr;
|
||||
Event()
|
||||
: type(EVENT_NONE)
|
||||
, addr()
|
||||
{}
|
||||
} m_event;
|
||||
|
||||
u32 m_Status;
|
||||
u32 m_BlockLength;
|
||||
u32 m_BusWidth;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "HW/SI.h"
|
||||
#include "HW/DSPHLE/DSPHLE.h"
|
||||
#include "HW/DSPLLE/DSPLLE.h"
|
||||
#include "IPC_HLE/WII_IPC_HLE.h"
|
||||
|
||||
#include "Globals.h" // Local
|
||||
#include "ConfigMain.h"
|
||||
@ -1268,6 +1269,7 @@ void CConfigMain::WiiSettingsChanged(wxCommandEvent& event)
|
||||
// Wii - Devices
|
||||
case ID_WII_SD_CARD:
|
||||
SConfig::GetInstance().m_WiiSDCard = WiiSDCard->IsChecked();
|
||||
WII_IPC_HLE_Interface::SDIO_EventNotify();
|
||||
break;
|
||||
case ID_WII_KEYBOARD:
|
||||
SConfig::GetInstance().m_WiiKeyboard = WiiKeyboard->IsChecked();
|
||||
|
Reference in New Issue
Block a user