Skip to content
Permalink
Browse files
Merge pull request #8853 from CrunchBite/feature-xlink-kai-bba
Feature XLink Kai BBA
  • Loading branch information
JMC47 committed Jun 28, 2020
2 parents ef464ef + 067667f commit 961f937
Show file tree
Hide file tree
Showing 15 changed files with 543 additions and 87 deletions.
@@ -592,8 +592,9 @@ endif()

if(WIN32)
target_sources(core PRIVATE
HW/EXI/BBA-TAP/TAP_Win32.cpp
HW/EXI/BBA-TAP/TAP_Win32.h
HW/EXI/BBA/TAP_Win32.cpp
HW/EXI/BBA/TAP_Win32.h
HW/EXI/BBA/XLINK_KAI_BBA.cpp
HW/WiimoteReal/IOWin.cpp
HW/WiimoteReal/IOWin.h
)
@@ -606,15 +607,17 @@ if(WIN32)
target_compile_definitions(core PRIVATE "-D_WINSOCK_DEPRECATED_NO_WARNINGS")
elseif(APPLE)
target_sources(core PRIVATE
HW/EXI/BBA-TAP/TAP_Apple.cpp
HW/EXI/BBA/TAP_Apple.cpp
HW/EXI/BBA/XLINK_KAI_BBA.cpp
HW/WiimoteReal/IOdarwin.h
HW/WiimoteReal/IOdarwin_private.h
HW/WiimoteReal/IOdarwin.mm
)
target_link_libraries(core PUBLIC ${IOB_LIBRARY})
elseif(UNIX)
target_sources(core PRIVATE
HW/EXI/BBA-TAP/TAP_Unix.cpp
HW/EXI/BBA/TAP_Unix.cpp
HW/EXI/BBA/XLINK_KAI_BBA.cpp
)
if(ANDROID)
target_sources(core PRIVATE
@@ -227,6 +227,8 @@ void SConfig::SaveCoreSettings(IniFile& ini)
core->Set("SlotB", m_EXIDevice[1]);
core->Set("SerialPort1", m_EXIDevice[2]);
core->Set("BBA_MAC", m_bba_mac);
core->Set("BBA_XLINK_IP", m_bba_xlink_ip);
core->Set("BBA_XLINK_CHAT_OSD", m_bba_xlink_chat_osd);
for (int i = 0; i < SerialInterface::MAX_SI_CHANNELS; ++i)
{
core->Set(fmt::format("SIDevice{}", i), m_SIDevice[i]);
@@ -495,6 +497,8 @@ void SConfig::LoadCoreSettings(IniFile& ini)
core->Get("SlotB", (int*)&m_EXIDevice[1], ExpansionInterface::EXIDEVICE_NONE);
core->Get("SerialPort1", (int*)&m_EXIDevice[2], ExpansionInterface::EXIDEVICE_NONE);
core->Get("BBA_MAC", &m_bba_mac);
core->Get("BBA_XLINK_IP", &m_bba_xlink_ip, "127.0.0.1");
core->Get("BBA_XLINK_CHAT_OSD", &m_bba_xlink_chat_osd, true);
for (size_t i = 0; i < std::size(m_SIDevice); ++i)
{
core->Get(fmt::format("SIDevice{}", i), &m_SIDevice[i],
@@ -226,7 +226,10 @@ struct SConfig
std::string m_strGbaCartB;
ExpansionInterface::TEXIDevices m_EXIDevice[3];
SerialInterface::SIDevices m_SIDevice[4];

std::string m_bba_mac;
std::string m_bba_xlink_ip;
bool m_bba_xlink_chat_osd = true;

// interface language
std::string m_InterfaceLanguage;
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
@@ -140,7 +140,8 @@
<ClCompile Include="HW\DVD\DVDMath.cpp" />
<ClCompile Include="HW\DVD\DVDThread.cpp" />
<ClCompile Include="HW\DVD\FileMonitor.cpp" />
<ClCompile Include="HW\EXI\BBA-TAP\TAP_Win32.cpp" />
<ClCompile Include="HW\EXI\BBA\TAP_Win32.cpp" />
<ClCompile Include="HW\EXI\BBA\XLINK_KAI_BBA.cpp" />
<ClCompile Include="HW\EXI\EXI.cpp" />
<ClCompile Include="HW\EXI\EXI_Channel.cpp" />
<ClCompile Include="HW\EXI\EXI_Device.cpp" />
@@ -498,7 +499,7 @@
<ClInclude Include="HW\DVD\DVDMath.h" />
<ClInclude Include="HW\DVD\DVDThread.h" />
<ClInclude Include="HW\DVD\FileMonitor.h" />
<ClInclude Include="HW\EXI\BBA-TAP\TAP_Win32.h" />
<ClInclude Include="HW\EXI\BBA\TAP_Win32.h" />
<ClInclude Include="HW\EXI\EXI.h" />
<ClInclude Include="HW\EXI\EXI_Channel.h" />
<ClInclude Include="HW\EXI\EXI_Device.h" />
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="ActionReplay">
@@ -993,6 +993,12 @@
<ClCompile Include="PowerPC\Jit64\RegCache\FPURegCache.cpp">
<Filter>PowerPC\Jit64</Filter>
</ClCompile>
<ClCompile Include="HW\EXI\BBA\XLINK_KAI_BBA.cpp">
<Filter>HW %28Flipper/Hollywood%29\EXI - Expansion Interface\BBA</Filter>
</ClCompile>
<ClCompile Include="HW\EXI\BBA\TAP_Win32.cpp">
<Filter>HW %28Flipper/Hollywood%29\EXI - Expansion Interface\BBA</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="BootManager.h" />
@@ -1743,6 +1749,9 @@
<ClInclude Include="PowerPC\JitArmCommon\BackPatch.h">
<Filter>PowerPC\JitArmCommon</Filter>
</ClInclude>
<ClInclude Include="HW\EXI\BBA\TAP_Win32.h">
<Filter>HW %28Flipper/Hollywood%29\EXI - Expansion Interface\BBA</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="CMakeLists.txt" />
@@ -12,7 +12,7 @@

namespace ExpansionInterface
{
bool CEXIETHERNET::Activate()
bool CEXIETHERNET::TAPNetworkInterface::Activate()
{
if (IsActivated())
return true;
@@ -30,7 +30,7 @@ bool CEXIETHERNET::Activate()
return RecvInit();
}

void CEXIETHERNET::Deactivate()
void CEXIETHERNET::TAPNetworkInterface::Deactivate()
{
close(fd);
fd = -1;
@@ -41,12 +41,12 @@ void CEXIETHERNET::Deactivate()
readThread.join();
}

bool CEXIETHERNET::IsActivated()
bool CEXIETHERNET::TAPNetworkInterface::IsActivated()
{
return fd != -1;
}

bool CEXIETHERNET::SendFrame(const u8* frame, u32 size)
bool CEXIETHERNET::TAPNetworkInterface::SendFrame(const u8* frame, u32 size)
{
INFO_LOG(SP1, "SendFrame %x\n%s", size, ArrayToString(frame, size, 0x10).c_str());

@@ -58,12 +58,12 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size)
}
else
{
SendComplete();
m_eth_ref->SendComplete();
return true;
}
}

void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self)
void CEXIETHERNET::TAPNetworkInterface::ReadThreadHandler(TAPNetworkInterface* self)
{
while (!self->readThreadShutdown.IsSet())
{
@@ -77,33 +77,33 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self)
if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0)
continue;

int readBytes = read(self->fd, self->mRecvBuffer.get(), BBA_RECV_SIZE);
int readBytes = read(self->fd, self->m_eth_ref->mRecvBuffer.get(), BBA_RECV_SIZE);
if (readBytes < 0)
{
ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes);
}
else if (self->readEnabled.IsSet())
{
INFO_LOG(SP1, "Read data: %s",
ArrayToString(self->mRecvBuffer.get(), readBytes, 0x10).c_str());
self->mRecvBufferLength = readBytes;
self->RecvHandlePacket();
ArrayToString(self->m_eth_ref->mRecvBuffer.get(), readBytes, 0x10).c_str());
self->m_eth_ref->mRecvBufferLength = readBytes;
self->m_eth_ref->RecvHandlePacket();
}
}
}

bool CEXIETHERNET::RecvInit()
bool CEXIETHERNET::TAPNetworkInterface::RecvInit()
{
readThread = std::thread(ReadThreadHandler, this);
return true;
}

void CEXIETHERNET::RecvStart()
void CEXIETHERNET::TAPNetworkInterface::RecvStart()
{
readEnabled.Set();
}

void CEXIETHERNET::RecvStop()
void CEXIETHERNET::TAPNetworkInterface::RecvStop()
{
readEnabled.Clear();
}
@@ -28,7 +28,7 @@ namespace ExpansionInterface
#define NOTIMPLEMENTED(Name) \
NOTICE_LOG(SP1, "CEXIETHERNET::%s not implemented for your UNIX", Name);

bool CEXIETHERNET::Activate()
bool CEXIETHERNET::TAPNetworkInterface::Activate()
{
#ifdef __linux__
if (IsActivated())
@@ -50,7 +50,7 @@ bool CEXIETHERNET::Activate()
const int MAX_INTERFACES = 32;
for (int i = 0; i < MAX_INTERFACES; ++i)
{
strncpy(ifr.ifr_name, StringFromFormat("Dolphin%d", i).c_str(), IFNAMSIZ - 1);
strncpy(ifr.ifr_name, StringFromFormat("Dolphin%d", i).c_str(), IFNAMSIZ);

int err;
if ((err = ioctl(fd, TUNSETIFF, (void*)&ifr)) < 0)
@@ -78,7 +78,7 @@ bool CEXIETHERNET::Activate()
#endif
}

void CEXIETHERNET::Deactivate()
void CEXIETHERNET::TAPNetworkInterface::Deactivate()
{
#ifdef __linux__
close(fd);
@@ -93,7 +93,7 @@ void CEXIETHERNET::Deactivate()
#endif
}

bool CEXIETHERNET::IsActivated()
bool CEXIETHERNET::TAPNetworkInterface::IsActivated()
{
#ifdef __linux__
return fd != -1 ? true : false;
@@ -102,7 +102,7 @@ bool CEXIETHERNET::IsActivated()
#endif
}

bool CEXIETHERNET::SendFrame(const u8* frame, u32 size)
bool CEXIETHERNET::TAPNetworkInterface::SendFrame(const u8* frame, u32 size)
{
#ifdef __linux__
DEBUG_LOG(SP1, "SendFrame %x\n%s", size, ArrayToString(frame, size, 0x10).c_str());
@@ -115,7 +115,7 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size)
}
else
{
SendComplete();
m_eth_ref->SendComplete();
return true;
}
#else
@@ -125,7 +125,7 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size)
}

#ifdef __linux__
void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self)
void CEXIETHERNET::TAPNetworkInterface::ReadThreadHandler(TAPNetworkInterface* self)
{
while (!self->readThreadShutdown.IsSet())
{
@@ -139,23 +139,23 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self)
if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0)
continue;

int readBytes = read(self->fd, self->mRecvBuffer.get(), BBA_RECV_SIZE);
int readBytes = read(self->fd, self->m_eth_ref->mRecvBuffer.get(), BBA_RECV_SIZE);
if (readBytes < 0)
{
ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes);
}
else if (self->readEnabled.IsSet())
{
DEBUG_LOG(SP1, "Read data: %s",
ArrayToString(self->mRecvBuffer.get(), readBytes, 0x10).c_str());
self->mRecvBufferLength = readBytes;
self->RecvHandlePacket();
ArrayToString(self->m_eth_ref->mRecvBuffer.get(), readBytes, 0x10).c_str());
self->m_eth_ref->mRecvBufferLength = readBytes;
self->m_eth_ref->RecvHandlePacket();
}
}
}
#endif

bool CEXIETHERNET::RecvInit()
bool CEXIETHERNET::TAPNetworkInterface::RecvInit()
{
#ifdef __linux__
readThread = std::thread(ReadThreadHandler, this);
@@ -166,7 +166,7 @@ bool CEXIETHERNET::RecvInit()
#endif
}

void CEXIETHERNET::RecvStart()
void CEXIETHERNET::TAPNetworkInterface::RecvStart()
{
#ifdef __linux__
readEnabled.Set();
@@ -175,7 +175,7 @@ void CEXIETHERNET::RecvStart()
#endif
}

void CEXIETHERNET::RecvStop()
void CEXIETHERNET::TAPNetworkInterface::RecvStop()
{
#ifdef __linux__
readEnabled.Clear();

0 comments on commit 961f937

Please sign in to comment.