From c929198c6b1b79e4f5ddbc5dc640e2932e9e07b2 Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:16:04 +0200 Subject: [PATCH] nn_ccr/sys: Add fw update functions --- include/nn/ccr/sys.h | 163 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 157 insertions(+), 6 deletions(-) diff --git a/include/nn/ccr/sys.h b/include/nn/ccr/sys.h index 1297e9db2..d38beaa1c 100644 --- a/include/nn/ccr/sys.h +++ b/include/nn/ccr/sys.h @@ -13,16 +13,25 @@ extern "C" { #endif +typedef struct CCRSysUpdateState CCRSysUpdateState; + typedef enum CCRSysPairingState { - //! Pairing is complete / hasn't started yet - CCR_SYS_PAIRING_FINISHED = 0, - //! Pairing is in progress - CCR_SYS_PAIRING_IN_PROGRESS = 1, - //! Pairing timed out - CCR_SYS_PAIRING_TIMED_OUT = 2, + //! Pairing is complete / hasn't started yet + CCR_SYS_PAIRING_FINISHED = 0, + //! Pairing is in progress + CCR_SYS_PAIRING_IN_PROGRESS = 1, + //! Pairing timed out + CCR_SYS_PAIRING_TIMED_OUT = 2, } CCRSysPairingState; +struct CCRSysUpdateState +{ + uint32_t state; + //! Progress from 0-100 + uint32_t progress; +}; + void CCRSysInit(void); @@ -118,6 +127,148 @@ CCRSysGetPincode(uint32_t *pin); int32_t CCRSysSetSystemTime(OSTime time); +/** + * Check if a DRC firmware update is needed. + * This function additionally verifies the DRC area compared to \link __CCRSysNeedsDRCFWUpdate \endlink. + * + * \param drcSlot + * Slot from 0 to 1. + * + * \param outNeedsUpdate + * Pointer to store the result to. + * + * \return + * 0 on success. + */ +int32_t +CCRSysNeedsDRCFWUpdate(uint32_t drcSlot, + BOOL *outNeedsUpdate); + +/** + * Check if a DRC firmware update is needed. + * + * \param drcSlot + * Slot from 0 to 1. + * + * \param outNeedsUpdate + * Pointer to store the result to. + * + * \param allowDowngrade + * Only check if the installed version doesn't match the running version, + * instead of checking that it's greater. + * + * \return + * 0 on success. + */ +int32_t +__CCRSysNeedsDRCFWUpdate(uint32_t drcSlot, + BOOL *outNeedsUpdate, + BOOL allowDowngrade); + +/** + * Starts a DRC firmware update if necessary and region matches. + * + * \note + * This function will wait for \link CCRSysDRCFWUpdateForward \endlink to be called once done. + * See \link CCRSysGetUpdateState \endlink for status and progress. + * + * \param drcSlot + * Slot from 0 to 1. + * + * \return + * 0 on success. + */ +int32_t +CCRSysDRCFWUpdate(uint32_t drcSlot); + +/** + * Starts a DRC firmware update if necessary. + * + * \note + * This function will wait for \link CCRSysDRCFWUpdateForward \endlink to be called once done. + * See \link CCRSysGetUpdateState \endlink for status and progress. + * + * \param drcSlot + * Slot from 0 to 1. + * + * \param allowDowngrade + * Only check if the installed version doesn't match the running version, + * instead of checking that it's greater. + * There are additional checks on the IOS side and this doesn't actually allow downgrading the firmware. + * + * \return + * 0 on success. + */ +int32_t +__CCRSysDRCFWUpdate(uint32_t drcSlot, + BOOL allowDowngrade); + + +/** + * Finish a pending DRC firmware update. + */ +void +CCRSysDRCFWUpdateForward(void); + +/** + * Get the update state during a pending DRC firmware update. + * + * \param outUpdateState + * Pointer to store the state to. + */ +void +CCRSysGetUpdateState(CCRSysUpdateState *outUpdateState); + +/** + * Initialize a DRC reattach. + * + * \param drcSlot + * Slot from 0 to 1. + */ +void +__CCRSysInitReattach(uint32_t drcSlot); + +/** + * Wait for the DRC to reattach. + * This returns once the DRC disconnects and reconnects or a timeout is reached. + * + * \param drcSlot + * Slot from 0 to 1. + * + * \return + * 0 on success. + */ +int32_t +__CCRSysWaitReattach(uint32_t drcSlot, + BOOL unknown); + +/** + * Get the version check flag. + * + * \param outFlag + * Pointer to write the flag to. + * + * \return + * 0 on success. + */ +int32_t +CCRSysGetVersionCheckFlag(uint32_t *outFlag); + +/** + * Set the version check flag. + * + * \param outFlag + * The flag to set. + * + * \return + * 0 on success. + */ +int32_t +CCRSysSetVersionCheckFlag(uint32_t flag); + +int32_t +CCRSysCaffeineSetCaffeineSlot(uint32_t slot); + #ifdef __cplusplus } #endif