/********************************************************************* * @fn HalOADWrite * * @brief Write to the storage medium according to the image type. * * NOTE: Destructive write on page boundary! When writing to the first flash word * of a page boundary, the page is erased without saving/restoring the bytes not written. * Writes anywhere else on a page assume that the location written to has been erased. * * @param oset - Offset into the monolithic image, aligned to HAL_FLASH_WORD_SIZE. * @param pBuf - Pointer to the buffer in from which to write. * @param len - Number of bytes to write. If not an even multiple of HAL_FLASH_WORD_SIZE, * remainder bytes are overwritten with garbage. * @param type - Which image: HAL_OAD_RC or HAL_OAD_DL. * * @return None. *********************************************************************/ void HalOADWrite(uint32 oset, uint8 *pBuf, uint16 len, image_t type) { if (HAL_OAD_RC != type) { #if HAL_OAD_XNV_IS_INT preamble_t preamble; HalOADRead(PREAMBLE_OFFSET, (uint8 *)&preamble, sizeof(preamble_t), HAL_OAD_RC); //oset += HAL_OAD_RC_START + preamble.len; oset += HAL_OAD_RC_START + HAL_OAD_DL_OSET; #elif HAL_OAD_XNV_IS_SPI oset += HAL_OAD_DL_OSET; HalSPIWrite(oset, pBuf, len); return; #endif } else { oset += HAL_OAD_RC_START; } if ((oset % HAL_FLASH_PAGE_SIZE) == 0) { HalFlashErase(oset / HAL_FLASH_PAGE_SIZE); } HalFlashWrite(oset / HAL_FLASH_WORD_SIZE, pBuf, len / HAL_FLASH_WORD_SIZE); }
/****************************************************************************** * @fn HalOTAWrite * * @brief Write to the storage medium according to the image type. * * NOTE: Destructive write on page boundary! When writing to the first flash word * of a page boundary, the page is erased without saving/restoring the bytes not written. * Writes anywhere else on a page assume that the location written to has been erased. * * @param oset - Offset into the monolithic image, aligned to HAL_FLASH_WORD_SIZE. * @param pBuf - Pointer to the buffer in from which to write. * @param len - Number of bytes to write. If not an even multiple of HAL_FLASH_WORD_SIZE, * remainder bytes are overwritten with garbage. * @param type - Which image: HAL_OTA_RC or HAL_OTA_DL. * * @return None. */ void HalOTAWrite(uint32 oset, uint8 *pBuf, uint16 len, image_t type) { if (HAL_OTA_RC != type) { #if HAL_OTA_XNV_IS_INT oset += HAL_OTA_RC_START + HAL_OTA_DL_OSET; #elif HAL_OTA_XNV_IS_SPI oset += HAL_OTA_DL_OSET; HalSPIWrite(oset, pBuf, len); return; #endif } else { oset += HAL_OTA_RC_START; } if ((oset % HAL_FLASH_PAGE_SIZE) == 0) { HalFlashErase(oset / HAL_FLASH_PAGE_SIZE); } HalFlashWrite(oset / HAL_FLASH_WORD_SIZE, pBuf, len / HAL_FLASH_WORD_SIZE); }