diff --git a/nx/include/switch/services/hid.h b/nx/include/switch/services/hid.h index 711409b6..92d056dd 100644 --- a/nx/include/switch/services/hid.h +++ b/nx/include/switch/services/hid.h @@ -1633,6 +1633,18 @@ Result hidSendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibratio */ Result hidGetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out); +/** + * @brief Begins a forced-permitted vibration session. + * @note Only available on [4.0.0+]. + */ +Result hidBeginPermitVibrationSession(void); + +/** + * @brief Ends the session started by \ref hidBeginPermitVibrationSession. + * @note Only available on [4.0.0+]. + */ +Result hidEndPermitVibrationSession(void); + /** * @brief Gets whether vibration is available with the specified device. * @note Only available on [7.0.0+]. diff --git a/nx/source/services/hid.c b/nx/source/services/hid.c index 59457192..57d622df 100644 --- a/nx/source/services/hid.c +++ b/nx/source/services/hid.c @@ -955,6 +955,10 @@ static Result _hidSetDualModeAll(void) { return rc; } +static Result _hidCmdNoIO(Service* srv, u32 cmd_id) { + return serviceDispatch(srv, cmd_id); +} + static Result _hidCmdGetHandle(Service* srv, Handle* handle_out, u32 cmd_id) { return serviceDispatch(srv, cmd_id, .out_handle_attrs = { SfOutHandleAttr_HipcCopy }, @@ -989,6 +993,10 @@ static Result _hidCmdInU32NoOut(Service* srv, u32 inval, u32 cmd_id) { return serviceDispatchIn(srv, cmd_id, inval); } +static Result _hidCmdInU64NoOut(Service* srv, u64 inval, u32 cmd_id) { + return serviceDispatchIn(srv, cmd_id, inval); +} + static Result _hidCmdInU32AruidNoOut(u32 inval, u32 cmd_id) { const struct { u32 inval; @@ -1326,6 +1334,20 @@ Result hidGetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVib return rc; } +Result hidBeginPermitVibrationSession(void) { + if (hosversionBefore(4,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _hidCmdInU64NoOut(&g_hidSrv, appletGetAppletResourceUserId(), 209); +} + +Result hidEndPermitVibrationSession(void) { + if (hosversionBefore(4,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _hidCmdNoIO(&g_hidSrv, 210); +} + Result hidIsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag) { if (hosversionBefore(7,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);