diff --git a/include/services/hid.hpp b/include/services/hid.hpp index e10f78f0..28ba4bd6 100644 --- a/include/services/hid.hpp +++ b/include/services/hid.hpp @@ -71,6 +71,7 @@ class HIDService { void getGyroscopeLowCalibrateParam(u32 messagePointer); void getGyroscopeCoefficient(u32 messagePointer); void getIPCHandles(u32 messagePointer); + void getSoundVolume(u32 messagePointer); // Don't call these prior to initializing shared mem pls template diff --git a/src/core/services/hid.cpp b/src/core/services/hid.cpp index 0c83487c..ef6cbb41 100644 --- a/src/core/services/hid.cpp +++ b/src/core/services/hid.cpp @@ -11,7 +11,8 @@ namespace HIDCommands { EnableGyroscopeLow = 0x00130000, DisableGyroscopeLow = 0x00140000, GetGyroscopeLowRawToDpsCoefficient = 0x00150000, - GetGyroscopeLowCalibrateParam = 0x00160000 + GetGyroscopeLowCalibrateParam = 0x00160000, + GetSoundVolume = 0x00170000, }; } @@ -46,6 +47,7 @@ void HIDService::handleSyncRequest(u32 messagePointer) { case HIDCommands::GetGyroscopeLowCalibrateParam: getGyroscopeLowCalibrateParam(messagePointer); break; case HIDCommands::GetGyroscopeLowRawToDpsCoefficient: getGyroscopeCoefficient(messagePointer); break; case HIDCommands::GetIPCHandles: getIPCHandles(messagePointer); break; + case HIDCommands::GetSoundVolume: getSoundVolume(messagePointer); break; default: Helpers::panic("HID service requested. Command: %08X\n", command); } } @@ -107,6 +109,18 @@ void HIDService::getGyroscopeCoefficient(u32 messagePointer) { mem.write32(messagePointer + 8, Helpers::bit_cast(gyroscopeCoeff)); } +// The volume here is in the range [0, 0x3F] +// It is read directly from I2C Device 3 register 0x09 +// Since we currently do not have audio, set the volume a bit below max (0x30) +void HIDService::getSoundVolume(u32 messagePointer) { + log("HID::GetSoundVolume\n"); + constexpr u8 volume = 0x30; + + mem.write32(messagePointer, IPC::responseHeader(0x17, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, volume); +} + void HIDService::getIPCHandles(u32 messagePointer) { log("HID::GetIPCHandles\n");