diff --git a/src/core/hle/service/i2c/i2c.cpp b/src/core/hle/service/i2c/i2c.cpp index 99decb37f9..d000487246 100644 --- a/src/core/hle/service/i2c/i2c.cpp +++ b/src/core/hle/service/i2c/i2c.cpp @@ -5,23 +5,66 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/core.h" +#include "core/hle/result.h" #include "core/hle/service/i2c/i2c.h" #include "core/hle/service/ipc_helpers.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" +#include "core/hle/service/server_manager.h" namespace Service::I2C { +class I2CSession final : public ServiceFramework { +public: + explicit I2CSession(Core::System& system_) + : ServiceFramework{system_, "I2CSession"} + { + static const FunctionInfo functions[] = { + {0, nullptr, "SendOld"}, + {1, nullptr, "ReceiveOld"}, + {2, nullptr, "ExecuteCommandListOld"}, + {10, C<&I2CSession::Send>, "Send"}, + {11, nullptr, "Receive"}, + {12, nullptr, "ExecuteCommandList"}, + {13, nullptr, "SetRetryPolicy"}, + }; + RegisterHandlers(functions); + } + ~I2CSession() override = default; + + Result Send(InBuffer in_data, u32 transaction_option) { + LOG_WARNING(Service, "(stubbed) topt={}", transaction_option); + R_THROW(ResultUnknown); + } +}; + +enum class I2CDevice : u32 { + ClassicController, + Ftm3bd56, +}; + class I2C final : public ServiceFramework { public: explicit I2C(Core::System& system_) : ServiceFramework{system_, "i2c"} { static const FunctionInfo functions[] = { - {0, nullptr, "Cmd0"}, + {0, nullptr, "OpenSessionForDev"}, + {1, C<&I2C::OpenSession>, "OpenSession"}, + {2, nullptr, "HasDevice"}, + {3, nullptr, "HasDeviceForDev"}, + {4, nullptr, "OpenSession2"}, }; RegisterHandlers(functions); } ~I2C() override = default; + + Result OpenSession(I2CDevice device, OutInterface out_session) { + LOG_DEBUG(Service, "(stubbed)"); + *out_session = std::make_shared(system); + R_SUCCEED(); + } }; void LoopProcess(Core::System& system) {