/********************************************************************* * @fn writeItem * * @brief Write a data item to NV. Function can write an entire item to NV * * @param pg - Page number * @param offset - offset within the NV page where to write the new item * @param id - NV item ID * @param alignedLen - Length of data to write, alinged in flash word * boundary * @param *pBuf - Data to write. * * @return none */ static void writeItem( uint8 pg, uint16 offset, osalSnvId_t id, uint16 alignedLen, uint8 *pBuf ) { osalNvItemHdr_t hdr; hdr.id = 0xFFFF; hdr.len = alignedLen | OSAL_NV_INVALID_LEN_MARK; // Write the len portion of the header first writeWord(pg, offset + alignedLen, (uint8 *) &hdr); // remove invalid len mark hdr.len &= ~OSAL_NV_INVALID_LEN_MARK; writeWord(pg, offset + alignedLen, (uint8 *) &hdr); // Copy over the data writeWordM(pg, offset, pBuf, alignedLen / OSAL_NV_WORD_SIZE); // value is valid. Write header except for the most significant bit. hdr.id = id | OSAL_NV_INVALID_ID_MARK; writeWord(pg, offset + alignedLen, (uint8 *) &hdr); // write the most significant bit hdr.id &= ~OSAL_NV_INVALID_ID_MARK; writeWord(pg, offset + alignedLen, (uint8 *) &hdr); }
/********************************************************************* * @fn writeBuf * * @brief Writes a data buffer to NV. * * @param dstPg - A valid NV Flash page. * @param offset - A valid offset into the page. * @param len - Byte count of the data to write. * @param buf - The data to write. * * @return TRUE if data buf checksum matches read back checksum, else FALSE. */ static void writeBuf( uint8 dstPg, uint16 dstOff, uint16 len, uint8 *buf ) { uint8 rem = dstOff % OSAL_NV_WORD_SIZE; uint8 tmp[OSAL_NV_WORD_SIZE]; if ( rem ) { dstOff = (dstOff / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE; HalFlashRead(dstPg, dstOff, tmp, OSAL_NV_WORD_SIZE); while ( (rem < OSAL_NV_WORD_SIZE) && len ) { tmp[rem++] = *buf++; len--; } writeWord( dstPg, dstOff, tmp ); dstOff += OSAL_NV_WORD_SIZE; } rem = len % OSAL_NV_WORD_SIZE; len /= OSAL_NV_WORD_SIZE; if ( len ) { writeWordM( dstPg, dstOff, buf, len ); dstOff += OSAL_NV_WORD_SIZE * len; buf += OSAL_NV_WORD_SIZE * len; } if ( rem ) { uint8 idx = 0; HalFlashRead(dstPg, dstOff, tmp, OSAL_NV_WORD_SIZE); while ( rem-- ) { tmp[idx++] = *buf++; } writeWord( dstPg, dstOff, tmp ); } }