From 49fc7a873893d249a713571591a7f500417d2412 Mon Sep 17 00:00:00 2001 From: cathery Date: Sun, 12 Jan 2020 05:16:55 +0300 Subject: [PATCH] Remove Xbox One Adapter --- README.md | 1 - .../config/sys-con/config_xboxoneadapter.ini | 2 - .../sys-con/firmware/XboxOneAdapter.bin | Bin 70620 -> 0 bytes source/ControllerLib/ControllerTypes.h | 9 - source/ControllerLib/Controllers.h | 1 - .../Controllers/XboxOneAdapter.cpp | 227 ------------------ .../Controllers/XboxOneAdapter.h | 48 ---- .../Controllers/XboxOneAdapter/Firmware.cpp | 1 - .../Controllers/XboxOneAdapter/Firmware.h | 51 ---- .../Controllers/XboxOneController.cpp | 4 +- source/Sysmodule/Makefile | 2 +- source/Sysmodule/source/configFile.cpp | 13 - 12 files changed, 2 insertions(+), 357 deletions(-) delete mode 100644 common/config/sys-con/config_xboxoneadapter.ini delete mode 100644 common/config/sys-con/firmware/XboxOneAdapter.bin delete mode 100644 source/ControllerLib/Controllers/XboxOneAdapter.cpp delete mode 100644 source/ControllerLib/Controllers/XboxOneAdapter.h delete mode 100644 source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp delete mode 100644 source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h diff --git a/README.md b/README.md index 81abf83..b8add8c 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,6 @@ sys-con comes with a config folder located at `sdmc:/config/sys-con/`. It contai - [x] **~~Undocked USB Support~~** Works with a USB-C OTG adapter. Some knock-off brands may not support OTG. - [x] **~~Xbox 360 Wireless adapter~~** - [x] **~~Dualshock 4 Support~~** -- [ ] **[Xbox One Wireless adapter](https://github.com/cathery/sys-con/issues/36)** - [ ] **[Rumble Support](https://github.com/cathery/sys-con/issues/1)** - [ ] **[Bluetooth Support](https://github.com/cathery/sys-con/issues/5)** - [ ] **[Motion Controls Support](https://github.com/cathery/sys-con/issues/9)** diff --git a/common/config/sys-con/config_xboxoneadapter.ini b/common/config/sys-con/config_xboxoneadapter.ini deleted file mode 100644 index ffe2b4b..0000000 --- a/common/config/sys-con/config_xboxoneadapter.ini +++ /dev/null @@ -1,2 +0,0 @@ -; Doesn't work properly yet, disabled -firmware_path = /config/sys-con/firmware/XboxOneAdapter.bin \ No newline at end of file diff --git a/common/config/sys-con/firmware/XboxOneAdapter.bin b/common/config/sys-con/firmware/XboxOneAdapter.bin deleted file mode 100644 index 22624d59fa880037c248556c9a4ff94d170b99b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70620 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 z 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 bV~_s(Yu`!UTZJ;kNlenG7JcB0>F@srF*mF5 diff --git a/source/ControllerLib/ControllerTypes.h b/source/ControllerLib/ControllerTypes.h index c135803..36d7094 100644 --- a/source/ControllerLib/ControllerTypes.h +++ b/source/ControllerLib/ControllerTypes.h @@ -20,15 +20,6 @@ enum VendorIDs : uint16_t enum ProductIDs : uint16_t { PRODUCT_XBOX360 = 0x28e, - /* - PRODUCT_XBOX360_WIRELESS = 0x28F, - PRODUCT_XBOX360_WIRELESS_MODULE = 0x765, - PRODUCT_XBOX360_WIRELESS_ADAPTER = 0x719, - PRODUCT_XBOX360_WIRELESS_N_ADAPTER = 0x2A8, - PRODUCT_XBOX360_WIRELESS_NETWORK_ADAPTER = 0x292, - PRODUCT_XBOX360_WIRELESS_RECEIVER = 0x2A1, - PRODUCT_XBOX360_WIRELESS_RECEIVER_2 = 0x291, - */ PRODUCT_XBOXONE2013 = 0x2d1, PRODUCT_XBOXONE2015 = 0x2dd, PRODUCT_XBOXONEELITE = 0x2e3, diff --git a/source/ControllerLib/Controllers.h b/source/ControllerLib/Controllers.h index 942ab8e..93662e1 100644 --- a/source/ControllerLib/Controllers.h +++ b/source/ControllerLib/Controllers.h @@ -4,6 +4,5 @@ #include "Controllers/Xbox360WirelessController.h" #include "Controllers/XboxController.h" #include "Controllers/XboxOneController.h" -#include "Controllers/XboxOneAdapter.h" #include "Controllers/Dualshock3Controller.h" #include "Controllers/Dualshock4Controller.h" diff --git a/source/ControllerLib/Controllers/XboxOneAdapter.cpp b/source/ControllerLib/Controllers/XboxOneAdapter.cpp deleted file mode 100644 index 816fd03..0000000 --- a/source/ControllerLib/Controllers/XboxOneAdapter.cpp +++ /dev/null @@ -1,227 +0,0 @@ -#include "Controllers/XboxOneAdapter.h" -#include "Controllers/XboxOneAdapter/Firmware.h" -#include -#include "../../Sysmodule/source/log.h" -#include -#include "cstring" - -static ControllerConfig _xboxoneadapterConfig{}; -static char firmwarePath[100]; - -XboxOneAdapter::XboxOneAdapter(std::unique_ptr &&interface) - : IController(std::move(interface)) -{ -} - -XboxOneAdapter::~XboxOneAdapter() -{ - Exit(); -} - -Result XboxOneAdapter::Initialize() -{ - Result rc; - - rc = OpenInterfaces(); - if (R_FAILED(rc)) - return rc; - - rc = SendInitBytes(); - if (R_FAILED(rc)) - return rc; - return rc; -} -void XboxOneAdapter::Exit() -{ - CloseInterfaces(); -} - -Result XboxOneAdapter::OpenInterfaces() -{ - Result rc; - rc = m_device->Open(); - if (R_FAILED(rc)) - return rc; - - std::vector> &interfaces = m_device->GetInterfaces(); - for (auto &&interface : interfaces) - { - rc = interface->Open(); - if (R_FAILED(rc)) - return rc; - - if (interface->GetDescriptor()->bInterfaceProtocol != 255) - continue; - - if (interface->GetDescriptor()->bNumEndpoints < 2) - continue; - - m_interface = interface.get(); - - if (!m_inPipePacket) - { - IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, 3); - if (inEndpoint) - { - rc = inEndpoint->Open(); - if (R_FAILED(rc)) - return 3333; - - m_inPipePacket = inEndpoint; - } - } - - if (!m_inPipe) - { - IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, 4); - if (inEndpoint) - { - rc = inEndpoint->Open(); - if (R_FAILED(rc)) - return 4444; - - m_inPipe = inEndpoint; - } - } - - if (!m_outPipe) - { - IUSBEndpoint *outEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_OUT, 3); - if (outEndpoint) - { - rc = outEndpoint->Open(); - if (R_FAILED(rc)) - return 5555; - - m_outPipe = outEndpoint; - } - } - } - - if (!m_inPipe || !m_outPipe || !m_inPipePacket) - return 69; - - return rc; -} - -void XboxOneAdapter::CloseInterfaces() -{ - //m_device->Reset(); - m_device->Close(); -} - -Result XboxOneAdapter::SendInitBytes() -{ - Result rc; - DmaConfig config = {}; - - config.rxBulkEnabled = 1; - config.txBulkEnabled = 1; - - ControlWrite(m_interface, MT_USB_U3DMA_CFG, config.value, MT_VEND_WRITE_CFG); - ControlWrite(m_interface, MT_FCE_PSE_CTRL, 0x01); - ControlWrite(m_interface, MT_TX_CPU_FROM_FCE_BASE_PTR, 0x400230); - ControlWrite(m_interface, MT_TX_CPU_FROM_FCE_MAX_COUNT, 0x01); - ControlWrite(m_interface, MT_TX_CPU_FROM_FCE_CPU_DESC_IDX, 0x01); - ControlWrite(m_interface, MT_FCE_PDMA_GLOBAL_CONF, 0x44); - ControlWrite(m_interface, MT_FCE_SKIP_FS, 0x03); - - WriteToLog("firmware path: %s", firmwarePath); - if (!firmwarePath || *firmwarePath == '\0') - { - WriteToLog("But the string is empty!"); - return 256; - } - - std::ifstream fs(firmwarePath, std::ios::binary); - if (fs.fail()) - return 235; - - WriteToLog("Opening file..."); - - std::vector firmware(std::istreambuf_iterator(fs), {}); - - WriteToLog("File opened!"); - - fs.close(); - - WriteToLog("writing %lu bytes...", firmware.size()); - - FwHeader *header = reinterpret_cast(firmware.data()); - - uint8_t *ilmStart = reinterpret_cast(header) + sizeof(FwHeader); - uint8_t *dlmStart = ilmStart + header->ilmLength; - uint8_t *dlmEnd = dlmStart + header->dlmLength; - - WriteToLog("Writing 1st part"); - - rc = LoadFirmwarePart(MT_MCU_ILM_OFFSET, ilmStart, dlmStart); - if (R_FAILED(rc)) - return rc; - - WriteToLog("Writing 2nd part"); - rc = LoadFirmwarePart(MT_MCU_DLM_OFFSET, dlmStart, dlmEnd); - if (R_FAILED(rc)) - return rc; - - WriteToLog("Wrote"); - - return 0; -} - -Result XboxOneAdapter::LoadFirmwarePart(uint32_t offset, uint8_t *start, uint8_t *end) -{ - // Send firmware in chunks - Result rc = -1; - for (uint8_t *chunk = start; chunk < end; chunk += MT_FW_CHUNK_SIZE) - { - uint32_t address = (uint32_t)(offset + chunk - start); - uint32_t remaining = (uint32_t)(end - chunk); - uint16_t length = remaining > MT_FW_CHUNK_SIZE ? MT_FW_CHUNK_SIZE : remaining; - - rc = ControlWrite(m_interface, MT_FCE_DMA_ADDR, address, MT_VEND_WRITE_CFG); - if (R_FAILED(rc)) - return rc; - - rc = ControlWrite(m_interface, MT_FCE_DMA_LEN, length << 16, MT_VEND_WRITE_CFG); - if (R_FAILED(rc)) - return rc; - - uint8_t data[length + 8]{0x00, 0x38, 0x00, 0x10}; - - for (int i = 0; i != length; ++i) - { - data[i + 4] = chunk[i]; - } - - rc = m_outPipe->Write(data, sizeof(data)); - if (R_FAILED(rc)) - return rc; - } - return rc; -} - -Result XboxOneAdapter::ControlWrite(IUSBInterface *interface, uint16_t address, uint32_t value, VendorRequest request) -{ - Result rc; - if (request == MT_VEND_DEV_MODE) - { - rc = interface->ControlTransfer(0x40, request, address, 0, 0, static_cast(nullptr)); - } - else - { - rc = interface->ControlTransfer(0x40, request, address, 0, sizeof(uint32_t), &value); - } - return rc; -} - -void XboxOneAdapter::LoadConfig(const ControllerConfig *config, const char *path) -{ - _xboxoneadapterConfig = *config; - strcpy(firmwarePath, path); -} - -ControllerConfig *XboxOneAdapter::GetConfig() -{ - return &_xboxoneadapterConfig; -} \ No newline at end of file diff --git a/source/ControllerLib/Controllers/XboxOneAdapter.h b/source/ControllerLib/Controllers/XboxOneAdapter.h deleted file mode 100644 index 392028b..0000000 --- a/source/ControllerLib/Controllers/XboxOneAdapter.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "IController.h" -#include "Controllers/XboxOneController.h" - -//References used: -//https://github.com/quantus/xbox-one-controller-protocol -//https://cs.chromium.org/chromium/src/device/gamepad/xbox_controller_mac.mm - -enum VendorRequest : uint8_t -{ - MT_VEND_DEV_MODE = 0x1, - MT_VEND_WRITE = 0x2, - MT_VEND_MULTI_WRITE = 0x6, - MT_VEND_MULTI_READ = 0x7, - MT_VEND_READ_EEPROM = 0x9, - MT_VEND_WRITE_FCE = 0x42, - MT_VEND_WRITE_CFG = 0x46, - MT_VEND_READ_CFG = 0x47, -}; - -class XboxOneAdapter : public IController -{ -private: - IUSBEndpoint *m_inPipePacket = nullptr; - IUSBEndpoint *m_inPipe = nullptr; - IUSBEndpoint *m_outPipe = nullptr; - IUSBInterface *m_interface = nullptr; - -public: - XboxOneAdapter(std::unique_ptr &&interface); - virtual ~XboxOneAdapter() override; - - virtual Result Initialize() override; - virtual void Exit() override; - - Result OpenInterfaces(); - void CloseInterfaces(); - - virtual ControllerType GetType() override { return CONTROLLER_XBOXONEW; } - - Result LoadFirmwarePart(uint32_t offset, uint8_t *start, uint8_t *end); - Result SendInitBytes(); - Result ControlWrite(IUSBInterface *interface, uint16_t address, uint32_t value, VendorRequest request = MT_VEND_MULTI_WRITE); - - static void LoadConfig(const ControllerConfig *config, const char *path); - virtual ControllerConfig *GetConfig() override; -}; \ No newline at end of file diff --git a/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp b/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp deleted file mode 100644 index 088a77a..0000000 --- a/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "Controllers/XboxOneAdapter/Firmware.h" diff --git a/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h b/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h deleted file mode 100644 index 012afda..0000000 --- a/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#include - -#define MT_FW_RESOURCE "Firmware.bin" -#define MT_MCU_ILM_OFFSET 0x80000 -#define MT_MCU_DLM_OFFSET 0x100000 + 0x10800 -#define MT_FW_CHUNK_SIZE 0x3800 -#define MT_DMA_COMPLETE 0xc0000000 -#define MT_FW_LOAD_IVB 0x12 - -#define MT_FCE_DMA_ADDR 0x0230 -#define MT_FCE_DMA_LEN 0x0234 -#define MT_USB_DMA_CFG 0x0238 - -#define MT_USB_U3DMA_CFG 0x9018 -#define MT_FCE_PSE_CTRL 0x0800 -#define MT_TX_CPU_FROM_FCE_BASE_PTR 0x09a0 -#define MT_TX_CPU_FROM_FCE_MAX_COUNT 0x09a4 -#define MT_TX_CPU_FROM_FCE_CPU_DESC_IDX 0x09a8 -#define MT_FCE_PDMA_GLOBAL_CONF 0x09c4 -#define MT_FCE_SKIP_FS 0x0a6c - -struct FwHeader -{ - uint32_t ilmLength; - uint32_t dlmLength; - uint16_t buildVersion; - uint16_t firmwareVersion; - uint32_t padding; - char buildTime[16]; -} __attribute__((packed)); - -union DmaConfig { - struct - { - uint32_t rxBulkAggTimeout : 8; - uint32_t rxBulkAggLimit : 8; - uint32_t udmaTxWlDrop : 1; - uint32_t wakeupEnabled : 1; - uint32_t rxDropOrPad : 1; - uint32_t txClear : 1; - uint32_t txopHalt : 1; - uint32_t rxBulkAggEnabled : 1; - uint32_t rxBulkEnabled : 1; - uint32_t txBulkEnabled : 1; - uint32_t epOutValid : 6; - uint32_t rxBusy : 1; - uint32_t txBusy : 1; - } __attribute__((packed)); - uint32_t value; -}; diff --git a/source/ControllerLib/Controllers/XboxOneController.cpp b/source/ControllerLib/Controllers/XboxOneController.cpp index ee2c1c1..3ce7749 100644 --- a/source/ControllerLib/Controllers/XboxOneController.cpp +++ b/source/ControllerLib/Controllers/XboxOneController.cpp @@ -1,6 +1,6 @@ #include "Controllers/XboxOneController.h" #include -#include "../../Sysmodule/source/log.h" +//#include "../../Sysmodule/source/log.h" static ControllerConfig _xboxoneControllerConfig{}; @@ -202,8 +202,6 @@ Result XboxOneController::SendInitBytes() rc = m_outPipe->Write(init_packets[i].Packet, init_packets[i].Length); if (R_FAILED(rc)) break; - else - WriteToLog("Sent a specific init packet %i for controller v%u p%u", i, vendor, product); } return rc; } diff --git a/source/Sysmodule/Makefile b/source/Sysmodule/Makefile index b06883f..2d83ee6 100644 --- a/source/Sysmodule/Makefile +++ b/source/Sysmodule/Makefile @@ -38,7 +38,7 @@ include $(DEVKITPRO)/libnx/switch_rules # NACP building is skipped as well. #--------------------------------------------------------------------------------- TARGET := sys-con -SOURCES := source ../ControllerSwitch ../ControllerLib ../ControllerLib/Controllers ../ControllerLib/Controllers/XboxOneAdapter ../inih +SOURCES := source ../ControllerSwitch ../ControllerLib ../ControllerLib/Controllers ../inih DATA := data INCLUDES := include ../ControllerSwitch ../ControllerLib ../inih #ROMFS := romfs diff --git a/source/Sysmodule/source/configFile.cpp b/source/Sysmodule/source/configFile.cpp index ad0cf3f..60c9f95 100644 --- a/source/Sysmodule/source/configFile.cpp +++ b/source/Sysmodule/source/configFile.cpp @@ -14,7 +14,6 @@ #define XBOXCONFIG "config_xboxorig.ini" #define XBOX360CONFIG "config_xbox360.ini" #define XBOXONECONFIG "config_xboxone.ini" -#define XBOXONEADAPTERCONFIG "config_xboxoneadapter.ini" #define DUALSHOCK3CONFIG "config_dualshock3.ini" #define DUALSHOCK4CONFIG "config_dualshock4.ini" @@ -195,11 +194,6 @@ void LoadAllConfigs() else WriteToLog("Failed to read from xbox one config!"); - if (R_SUCCEEDED(_ReadFromConfig(CONFIG_PATH XBOXONEADAPTERCONFIG))) - XboxOneAdapter::LoadConfig(&temp_config, firmwarePath); - else - WriteToLog("Failed to read from xbox one adapter config!"); - if (R_SUCCEEDED(_ReadFromConfig(CONFIG_PATH XBOX360CONFIG))) { Xbox360Controller::LoadConfig(&temp_config); @@ -227,7 +221,6 @@ bool CheckForFileChanges() static time_t xboxConfigLastModified; static time_t xbox360ConfigLastModified; static time_t xboxOneConfigLastModified; - static time_t xboxOneAdapterConfigLastModified; static time_t dualshock3ConfigLastModified; static time_t dualshock4ConfigLastModified; struct stat result; @@ -273,11 +266,5 @@ bool CheckForFileChanges() dualshock4ConfigLastModified = result.st_mtime; filesChanged = true; } - if (stat(CONFIG_PATH XBOXONEADAPTERCONFIG, &result) == 0) - if (xboxOneAdapterConfigLastModified != result.st_mtime) - { - xboxOneAdapterConfigLastModified = result.st_mtime; - filesChanged = true; - } return filesChanged; } \ No newline at end of file