#include "SwitchUSBEndpoint.h" #include #include #include SwitchUSBEndpoint::SwitchUSBEndpoint(UsbHsClientIfSession &if_session, usb_endpoint_descriptor &desc) : m_ifSession(if_session), m_descriptor(desc) { } SwitchUSBEndpoint::~SwitchUSBEndpoint() { Close(); } Result SwitchUSBEndpoint::Open() { Result rc = usbHsIfOpenUsbEp(&m_ifSession, &m_epSession, 1, m_descriptor.wMaxPacketSize, &m_descriptor); if (R_FAILED(rc)) return 73011; return rc; } void SwitchUSBEndpoint::Close() { usbHsEpClose(&m_epSession); } Result SwitchUSBEndpoint::Write(void *inBuffer, size_t bufferSize) { Result rc = -1; void *tmpbuf = memalign(0x1000, bufferSize); if (tmpbuf != nullptr) { u32 transferredSize = 0; memset(tmpbuf, 0, bufferSize); for (size_t byte = 0; byte != bufferSize; ++byte) { static_cast(tmpbuf)[byte] = static_cast(inBuffer)[byte]; } rc = usbHsEpPostBuffer(&m_epSession, tmpbuf, bufferSize, &transferredSize); if (rc == 0xcc8c) rc = 0; free(tmpbuf); } return rc; } Result SwitchUSBEndpoint::Read(void *outBuffer, size_t bufferSize) { void *tmpbuf = memalign(0x1000, bufferSize); if (tmpbuf == nullptr) return -1; u32 transferredSize; Result rc = usbHsEpPostBuffer(&m_epSession, tmpbuf, bufferSize, &transferredSize); if (rc == 0xcc8c) rc = 0; if (R_SUCCEEDED(rc)) { for (size_t byte = 0; byte != bufferSize; ++byte) { static_cast(outBuffer)[byte] = static_cast(tmpbuf)[byte]; } } free(tmpbuf); return rc; } IUSBEndpoint::Direction SwitchUSBEndpoint::GetDirection() { return ((m_descriptor.bEndpointAddress & USB_ENDPOINT_IN) ? USB_ENDPOINT_IN : USB_ENDPOINT_OUT); } IUSBEndpoint::EndpointDescriptor *SwitchUSBEndpoint::GetDescriptor() { return reinterpret_cast(&m_descriptor); }