1
0
mirror of https://github.com/cathery/sys-con.git synced 2024-07-03 02:18:43 +00:00
sys-con/source/ControllerSwitch/SwitchUSBEndpoint.cpp

82 lines
1.9 KiB
C++
Raw Normal View History

2019-10-31 18:00:42 +00:00
#include "SwitchUSBEndpoint.h"
#include <cstring>
#include <malloc.h>
SwitchUSBEndpoint::SwitchUSBEndpoint(UsbHsClientIfSession &if_session, usb_endpoint_descriptor &desc)
: m_ifSession(&if_session),
m_descriptor(&desc)
2019-10-31 18:00:42 +00:00
{
}
SwitchUSBEndpoint::~SwitchUSBEndpoint()
{
2020-04-17 09:05:02 +00:00
if (m_buffer != nullptr)
{
free(m_buffer);
m_buffer = nullptr;
}
2019-10-31 18:00:42 +00:00
}
Result SwitchUSBEndpoint::Open(int maxPacketSize)
2019-10-31 18:00:42 +00:00
{
maxPacketSize = maxPacketSize != 0 ? maxPacketSize : m_descriptor->wMaxPacketSize;
Result rc = usbHsIfOpenUsbEp(m_ifSession, &m_epSession, 1, maxPacketSize, m_descriptor);
2019-10-31 18:00:42 +00:00
if (R_FAILED(rc))
return 73011;
2020-04-17 09:05:02 +00:00
if (m_buffer != nullptr)
free(m_buffer);
m_buffer = memalign(0x1000, maxPacketSize);
if (m_buffer == nullptr)
return -1;
2019-10-31 18:00:42 +00:00
return rc;
}
void SwitchUSBEndpoint::Close()
{
usbHsEpClose(&m_epSession);
}
Result SwitchUSBEndpoint::Write(const void *inBuffer, size_t bufferSize)
2019-10-31 18:00:42 +00:00
{
if (m_buffer == nullptr)
return -1;
u32 transferredSize = 0;
2019-10-31 18:00:42 +00:00
2020-04-17 09:04:36 +00:00
memcpy(m_buffer, inBuffer, bufferSize);
Result rc = usbHsEpPostBuffer(&m_epSession, m_buffer, bufferSize, &transferredSize);
if (R_SUCCEEDED(rc))
{
svcSleepThread(m_descriptor->bInterval * 1e+6L);
2019-10-31 18:00:42 +00:00
}
return rc;
}
Result SwitchUSBEndpoint::Read(void *outBuffer, size_t bufferSize)
{
if (m_buffer == nullptr)
2019-10-31 18:00:42 +00:00
return -1;
u32 transferredSize;
Result rc = usbHsEpPostBuffer(&m_epSession, m_buffer, bufferSize, &transferredSize);
2019-10-31 18:00:42 +00:00
if (R_SUCCEEDED(rc))
{
2020-04-17 09:04:36 +00:00
memcpy(outBuffer, m_buffer, transferredSize);
2019-10-31 18:00:42 +00:00
}
return rc;
}
IUSBEndpoint::Direction SwitchUSBEndpoint::GetDirection()
{
return ((m_descriptor->bEndpointAddress & USB_ENDPOINT_IN) ? USB_ENDPOINT_IN : USB_ENDPOINT_OUT);
2019-10-31 18:00:42 +00:00
}
IUSBEndpoint::EndpointDescriptor *SwitchUSBEndpoint::GetDescriptor()
{
return reinterpret_cast<IUSBEndpoint::EndpointDescriptor *>(m_descriptor);
2019-10-31 18:00:42 +00:00
}