From 12d9319eb5d2bd4d39565eb9770649967959d6fc Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Sun, 31 Mar 2024 23:06:29 +0200 Subject: [PATCH] nsysccr/cdc: Add software functions --- include/nsysccr/cdc.h | 141 +++++++++++++++++++++++++++++++++++++++++- include/nsysccr/cfg.h | 24 +++++++ 2 files changed, 164 insertions(+), 1 deletion(-) diff --git a/include/nsysccr/cdc.h b/include/nsysccr/cdc.h index 3c7bf2ad8..807273a40 100644 --- a/include/nsysccr/cdc.h +++ b/include/nsysccr/cdc.h @@ -19,6 +19,8 @@ typedef struct CCRCDCSysMessage CCRCDCSysMessage; typedef struct CCRCDCEepromData CCRCDCEepromData; typedef struct CCRCDCWowlWakeDrcArg CCRCDCWowlWakeDrcArg; typedef struct CCRCDCUicConfig CCRCDCUicConfig; +typedef struct CCRCDCFWInfo CCRCDCFWInfo; +typedef struct CCRCDCSoftwareVersion CCRCDCSoftwareVersion; typedef uint8_t CCRCDCDestination; typedef uint32_t CCRCDCWpsStatusType; typedef uint8_t CCRCDCDrcState; @@ -43,7 +45,7 @@ typedef enum CCRCDCDrcStateEnum { CCR_CDC_DRC_STATE_ACTIVE = 0, CCR_CDC_DRC_STATE_UNK1 = 1, - CCR_CDC_DRC_STATE_UNK2 = 2, + CCR_CDC_DRC_STATE_UPDATE = 2, CCR_CDC_DRC_STATE_UNK3 = 3, CCR_CDC_DRC_STATE_BACKGROUND = 4, CCR_CDC_DRC_STATE_DISCONNECT = 5, @@ -107,6 +109,17 @@ typedef enum CCRCDCUicConfigIdEnum CCR_CDC_UIC_CONFIG_ID_UNK24 = 24, } CCRCDCUicConfigIdEnum; +typedef enum CCRCDCExt +{ + //! Language data + CCR_CDC_EXT_LANGUAGE = 0, + //! Remote Control Database + CCR_CDC_EXT_RC_DATABASE = 1, + CCR_CDC_EXT_UNK2 = 2, + CCR_CDC_EXT_UNK3 = 3, + CCR_CDC_EXT_UNK4 = 4, +} CCRCDCExt; + struct WUT_PACKED CCRCDCMacAddress { //! The device this mac address belongs to @@ -175,6 +188,31 @@ WUT_CHECK_OFFSET(CCRCDCUicConfig, 0x00, configId); WUT_CHECK_OFFSET(CCRCDCUicConfig, 0x01, size); WUT_CHECK_OFFSET(CCRCDCUicConfig, 0x02, data); +struct CCRCDCFWInfo +{ + uint32_t imageSize; + uint32_t blockSize; + uint32_t imageVersion; + uint32_t sequencePerSession; + //! Progress from 0-100 + uint32_t updateProgress; +}; +WUT_CHECK_OFFSET(CCRCDCFWInfo, 0x00, imageSize); +WUT_CHECK_OFFSET(CCRCDCFWInfo, 0x04, blockSize); +WUT_CHECK_OFFSET(CCRCDCFWInfo, 0x08, imageVersion); +WUT_CHECK_OFFSET(CCRCDCFWInfo, 0x0C, sequencePerSession); +WUT_CHECK_OFFSET(CCRCDCFWInfo, 0x10, updateProgress); +WUT_CHECK_SIZE(CCRCDCFWInfo, 0x14); + +struct CCRCDCSoftwareVersion +{ + uint32_t runningVersion; + uint32_t activeVersion; +}; +WUT_CHECK_OFFSET(CCRCDCSoftwareVersion, 0x0, runningVersion); +WUT_CHECK_OFFSET(CCRCDCSoftwareVersion, 0x4, activeVersion); +WUT_CHECK_SIZE(CCRCDCSoftwareVersion, 0x8); + /** * Send a command directly to the specified destination. * @@ -454,6 +492,107 @@ uint16_t CCRCDCCalcCRC16(void *data, uint32_t dataSize); +/** + * Get the firmware info during a pending update. + * + * \param dest + * The destination to get the firmware info from. + * + * \param outInfo + * Pointer to write the info to. + * + * \return + * 0 on success. + */ +int32_t +CCRCDCGetFWInfo(CCRCDCDestination dest, + CCRCDCFWInfo *outInfo); + +/** + * Get software version information. + * + * \param dest + * The destination to get the version information from. + * + * \param outVersion + * Pointer to write the version info to. + * + * \return + * 0 on success. + */ +int32_t +CCRCDCSoftwareGetVersion(CCRCDCDestination dest, + CCRCDCSoftwareVersion *outVersion); + +/** + * Perform a software update. + * + * \param dest + * The destination to start a software update. + * + * \param path + * Absolute path to read the update file from. + * Note that this path needs to be accessible from IOS-PAD (e.g. on the MLC). + * + * \param callback + * Callback to call once the update completes or \c NULL for synchronous updating. + * + * \param userContext + * User provided value which is passed to the callback. + * + * \return + * 0 on success. + */ +int32_t +CCRCDCSoftwareUpdate(CCRCDCDestination dest, + const char *path, + IOSAsyncCallbackFn callback, + void *userContext); + +/** + * Abort a software update. + * + * \param dest + * The destination to send the command to. + * + * \return + * 0 on success. + */ +int32_t +CCRCDCSoftwareAbort(CCRCDCDestination dest); + +/** + * Activate a performed software update. + * + * \param dest + * The destination to send the command to. + * + * \return + * 0 on success. + */ +int32_t +CCRCDCSoftwareActivate(CCRCDCDestination dest); + +/** + * Get an ext id from the specified destination. + * + * \param dest + * The destination to get the ID from. + * + * \param ext + * The ext to get the ID for. + * + * \param outId + * Pointer to write the ID to. + * + * \return + * 0 on success. + */ +int32_t +CCRCDCSoftwareGetExtId(CCRCDCDestination dest, + CCRCDCExt ext, + uint32_t *outId); + #ifdef __cplusplus } #endif diff --git a/include/nsysccr/cfg.h b/include/nsysccr/cfg.h index 23c375abc..fe7a757b4 100644 --- a/include/nsysccr/cfg.h +++ b/include/nsysccr/cfg.h @@ -51,6 +51,30 @@ CCRCFGSetCachedEeprom(uint32_t drcSlot, void *buf, uint32_t size); +/** + * Get the version check flag. + * + * \param outFlag + * Pointer to write the flag to. + * + * \return + * 0 on success. + */ +int32_t +CCRCFGGetVersionCheckFlag(uint32_t *outFlag); + +/** + * Set the version check flag. + * + * \param outFlag + * The flag to set. + * + * \return + * 0 on success. + */ +int32_t +CCRCFGSetVersionCheckFlag(uint32_t flag); + #ifdef __cplusplus } #endif