Initial implementation ir:user
This commit is contained in:
		| @@ -49,6 +49,7 @@ namespace Log { | |||||||
|         SUB(Service, DSP) \ |         SUB(Service, DSP) \ | ||||||
|         SUB(Service, HID) \ |         SUB(Service, HID) \ | ||||||
|         SUB(Service, SOC) \ |         SUB(Service, SOC) \ | ||||||
|  |         SUB(Service, IR) \ | ||||||
|         SUB(Service, Y2R) \ |         SUB(Service, Y2R) \ | ||||||
|         CLS(HW) \ |         CLS(HW) \ | ||||||
|         SUB(HW, Memory) \ |         SUB(HW, Memory) \ | ||||||
|   | |||||||
| @@ -64,6 +64,7 @@ enum class Class : ClassType { | |||||||
|     Service_DSP,                ///< The DSP (DSP control) service |     Service_DSP,                ///< The DSP (DSP control) service | ||||||
|     Service_HID,                ///< The HID (Human interface device) service |     Service_HID,                ///< The HID (Human interface device) service | ||||||
|     Service_SOC,                ///< The SOC (Socket) service |     Service_SOC,                ///< The SOC (Socket) service | ||||||
|  |     Service_IR,                 ///< The IR service | ||||||
|     Service_Y2R,                ///< The Y2R (YUV to RGB conversion) service |     Service_Y2R,                ///< The Y2R (YUV to RGB conversion) service | ||||||
|     HW,                         ///< Low-level hardware emulation |     HW,                         ///< Low-level hardware emulation | ||||||
|     HW_Memory,                  ///< Memory-map and address translation |     HW_Memory,                  ///< Memory-map and address translation | ||||||
|   | |||||||
| @@ -2,20 +2,22 @@ | |||||||
| // Licensed under GPLv2 or any later version | // Licensed under GPLv2 or any later version | ||||||
| // Refer to the license.txt file included. | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include "core/hle/kernel/event.h" | ||||||
|  | #include "core/hle/kernel/shared_memory.h" | ||||||
|  |  | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| #include "core/hle/service/ir/ir.h" | #include "core/hle/service/ir/ir.h" | ||||||
| #include "core/hle/service/ir/ir_rst.h" | #include "core/hle/service/ir/ir_rst.h" | ||||||
| #include "core/hle/service/ir/ir_u.h" | #include "core/hle/service/ir/ir_u.h" | ||||||
| #include "core/hle/service/ir/ir_user.h" | #include "core/hle/service/ir/ir_user.h" | ||||||
|  |  | ||||||
| #include "core/hle/kernel/event.h" |  | ||||||
| #include "core/hle/kernel/shared_memory.h" |  | ||||||
|  |  | ||||||
| namespace Service { | namespace Service { | ||||||
| namespace IR { | namespace IR { | ||||||
|  |  | ||||||
| static Kernel::SharedPtr<Kernel::Event> handle_event; | static Kernel::SharedPtr<Kernel::Event> handle_event; | ||||||
|  | static Kernel::SharedPtr<Kernel::Event> conn_status_event; | ||||||
| static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory; | static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory; | ||||||
|  | static Kernel::SharedPtr<Kernel::SharedMemory> transfer_shared_memory; | ||||||
|  |  | ||||||
| void GetHandles(Service::Interface* self) { | void GetHandles(Service::Interface* self) { | ||||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
| @@ -26,6 +28,64 @@ void GetHandles(Service::Interface* self) { | |||||||
|     cmd_buff[4] = Kernel::g_handle_table.Create(Service::IR::handle_event).MoveFrom(); |     cmd_buff[4] = Kernel::g_handle_table.Create(Service::IR::handle_event).MoveFrom(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void InitializeIrNopShared(Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  |  | ||||||
|  |     u32 transfer_buff_size = cmd_buff[1]; | ||||||
|  |     u32 recv_buff_size     = cmd_buff[2]; | ||||||
|  |     u32 unk1               = cmd_buff[3]; | ||||||
|  |     u32 send_buff_size     = cmd_buff[4]; | ||||||
|  |     u32 unk2               = cmd_buff[5]; | ||||||
|  |     u8  baud_rate          = cmd_buff[6] & 0xFF; | ||||||
|  |     Handle handle          = cmd_buff[8]; | ||||||
|  |  | ||||||
|  |     if(Kernel::g_handle_table.IsValid(handle)) { | ||||||
|  |         transfer_shared_memory = Kernel::g_handle_table.Get<Kernel::SharedMemory>(handle); | ||||||
|  |         transfer_shared_memory->name = "IR:TransferSharedMemory"; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_IR, "(STUBBED) called, transfer_buff_size=%d, recv_buff_size=%d, " | ||||||
|  |                 "unk1=%d, send_buff_size=%d, unk2=%d, baud_rate=%u, handle=0x%08X", | ||||||
|  |                 transfer_buff_size, recv_buff_size, unk1, send_buff_size, unk2, baud_rate, handle); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RequireConnection(Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  |  | ||||||
|  |     conn_status_event->Signal(); | ||||||
|  |  | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_IR, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Disconnect(Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  |  | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_IR, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void GetConnectionStatusEvent(Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  |  | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; | ||||||
|  |     cmd_buff[3] = Kernel::g_handle_table.Create(Service::IR::conn_status_event).MoveFrom(); | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_IR, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void FinalizeIrNop(Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  |  | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_IR, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  |  | ||||||
| void Init() { | void Init() { | ||||||
|     using namespace Kernel; |     using namespace Kernel; | ||||||
|  |  | ||||||
| @@ -35,15 +95,19 @@ void Init() { | |||||||
|  |  | ||||||
|     using Kernel::MemoryPermission; |     using Kernel::MemoryPermission; | ||||||
|     shared_memory = SharedMemory::Create(0x1000, Kernel::MemoryPermission::ReadWrite, |     shared_memory = SharedMemory::Create(0x1000, Kernel::MemoryPermission::ReadWrite, | ||||||
|             Kernel::MemoryPermission::ReadWrite, "IR:SharedMemory"); |                                          Kernel::MemoryPermission::ReadWrite, "IR:SharedMemory"); | ||||||
|  |     transfer_shared_memory = nullptr; | ||||||
|  |  | ||||||
|     // Create event handle(s) |     // Create event handle(s) | ||||||
|     handle_event  = Event::Create(RESETTYPE_ONESHOT, "IR:HandleEvent"); |     handle_event  = Event::Create(RESETTYPE_ONESHOT, "IR:HandleEvent"); | ||||||
|  |     conn_status_event = Event::Create(RESETTYPE_ONESHOT, "IR:ConnectionStatusEvent"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Shutdown() { | void Shutdown() { | ||||||
|  |     transfer_shared_memory = nullptr; | ||||||
|     shared_memory = nullptr; |     shared_memory = nullptr; | ||||||
|     handle_event = nullptr; |     handle_event = nullptr; | ||||||
|  |     conn_status_event = nullptr; | ||||||
| } | } | ||||||
|  |  | ||||||
| } // namespace IR | } // namespace IR | ||||||
|   | |||||||
| @@ -20,6 +20,53 @@ namespace IR { | |||||||
|  */ |  */ | ||||||
| void GetHandles(Interface* self); | void GetHandles(Interface* self); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * IR::InitializeIrNopShared service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Size of transfer buffer | ||||||
|  |  *      2 : Recv buffer size | ||||||
|  |  *      3 : unknown | ||||||
|  |  *      4 : Send buffer size | ||||||
|  |  *      5 : unknown | ||||||
|  |  *      6 : BaudRate (u8) | ||||||
|  |  *      7 : 0 | ||||||
|  |  *      8 : Handle of transfer shared memory | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void InitializeIrNopShared(Interface* self); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * IR::FinalizeIrNop service function | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void FinalizeIrNop(Interface* self); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * IR::GetConnectionStatusEvent service function | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  *      2 : Connection Status Event handle | ||||||
|  |  */ | ||||||
|  | void GetConnectionStatusEvent(Interface* self); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * IR::Disconnect service function | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void Disconnect(Interface* self); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * IR::RequireConnection service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : unknown (u8), looks like always 1 | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void RequireConnection(Interface* self); | ||||||
|  |  | ||||||
| /// Initialize IR service | /// Initialize IR service | ||||||
| void Init(); | void Init(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,26 +2,39 @@ | |||||||
| // Licensed under GPLv2 or any later version | // Licensed under GPLv2 or any later version | ||||||
| // Refer to the license.txt file included. | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include "core/hle/service/ir/ir.h" | ||||||
| #include "core/hle/service/ir/ir_user.h" | #include "core/hle/service/ir/ir_user.h" | ||||||
|  |  | ||||||
| namespace Service { | namespace Service { | ||||||
| namespace IR { | namespace IR { | ||||||
|  |  | ||||||
| const Interface::FunctionInfo FunctionTable[] = { | const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x00010182, nullptr,                 "InitializeIrNop"}, |     {0x00010182, nullptr,                  "InitializeIrNop"}, | ||||||
|     {0x00020000, nullptr,                 "FinalizeIrNop"}, |     {0x00020000, FinalizeIrNop,            "FinalizeIrNop"}, | ||||||
|     {0x00030000, nullptr,                 "ClearReceiveBuffer"}, |     {0x00030000, nullptr,                  "ClearReceiveBuffer"}, | ||||||
|     {0x00040000, nullptr,                 "ClearSendBuffer"}, |     {0x00040000, nullptr,                  "ClearSendBuffer"}, | ||||||
|     {0x00060040, nullptr,                 "RequireConnection"}, |     {0x000500C0, nullptr,                  "WaitConnection"}, | ||||||
|     {0x00090000, nullptr,                 "Disconnect"}, |     {0x00060040, RequireConnection,        "RequireConnection"}, | ||||||
|     {0x000A0000, nullptr,                 "GetReceiveEvent"}, |     {0x000702C0, nullptr,                  "AutoConnection"}, | ||||||
|     {0x000B0000, nullptr,                 "GetSendEvent"}, |     {0x00080000, nullptr,                  "AnyConnection"}, | ||||||
|     {0x000C0000, nullptr,                 "GetConnectionStatusEvent"}, |     {0x00090000, Disconnect,               "Disconnect"}, | ||||||
|     {0x000D0042, nullptr,                 "SendIrNop"}, |     {0x000A0000, nullptr,                  "GetReceiveEvent"}, | ||||||
|     {0x000E0042, nullptr,                 "SendIrNopLarge"}, |     {0x000B0000, nullptr,                  "GetSendEvent"}, | ||||||
|     {0x00180182, nullptr,                 "InitializeIrNopShared"}, |     {0x000C0000, GetConnectionStatusEvent, "GetConnectionStatusEvent"}, | ||||||
|     {0x00190040, nullptr,                 "ReleaseReceivedData"}, |     {0x000D0042, nullptr,                  "SendIrNop"}, | ||||||
|     {0x001A0040, nullptr,                 "SetOwnMachineId"}, |     {0x000E0042, nullptr,                  "SendIrNopLarge"}, | ||||||
|  |     {0x000F0040, nullptr,                  "ReceiveIrnop"}, | ||||||
|  |     {0x00100042, nullptr,                  "ReceiveIrnopLarge"}, | ||||||
|  |     {0x00110040, nullptr,                  "GetLatestReceiveErrorResult"}, | ||||||
|  |     {0x00120040, nullptr,                  "GetLatestSendErrorResult"}, | ||||||
|  |     {0x00130000, nullptr,                  "GetConnectionStatus"}, | ||||||
|  |     {0x00140000, nullptr,                  "GetTryingToConnectStatus"}, | ||||||
|  |     {0x00150000, nullptr,                  "GetReceiveSizeFreeAndUsed"}, | ||||||
|  |     {0x00160000, nullptr,                  "GetSendSizeFreeAndUsed"}, | ||||||
|  |     {0x00170000, nullptr,                  "GetConnectionRole"}, | ||||||
|  |     {0x00180182, InitializeIrNopShared,    "InitializeIrNopShared"}, | ||||||
|  |     {0x00190040, nullptr,                  "ReleaseReceivedData"}, | ||||||
|  |     {0x001A0040, nullptr,                  "SetOwnMachineId"}, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| IR_User_Interface::IR_User_Interface() { | IR_User_Interface::IR_User_Interface() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user