47 #define BLOCK_PAYLOAD_SIZE 20 48 #define FIRST_BLOCK_MASK 0x80 49 #define LINKED_BLOCK_MASK 0x40 50 #define RECID_BLOCK_MASK 0x3f 56 U8BIT payload[BLOCK_PAYLOAD_SIZE];
95 static U16BIT GetBlockMap(U16BIT last_blk, BOOLEAN setclr);
96 static void SetBlockMap(U16BIT blk, BOOLEAN setclr);
98 static BOOLEAN ReadBlock(U16BIT blk_no,
NVM_BLOCK_REC *blk_ptr, BOOLEAN check);
99 static BOOLEAN WriteBlock(U16BIT blk_no,
NVM_BLOCK_REC *blk_ptr, BOOLEAN check);
101 static BOOLEAN CacheNVMRecord(U16BIT block_no);
102 static BOOLEAN SaveNVMCache(
void);
118 static U16BIT GetBlockMap(U16BIT last_blk, BOOLEAN setclr)
123 U16BIT next_blk = NVM_INVALID_BLOCK_ID;
125 FUNCTION_START(GetBlockMap);
127 if (last_blk == NVM_INVALID_BLOCK_ID)
138 while (blk < db_status.num_blks)
140 byte = (U16BIT)(blk / 8);
141 bit = (U8BIT)(blk % 8);
142 if ((db_status.blk_map[byte] & (0x80 >> bit)) == 0x00)
161 FUNCTION_FINISH(GetBlockMap);
178 static void SetBlockMap(U16BIT blk, BOOLEAN setclr)
183 FUNCTION_START(SetBlockMap);
185 ASSERT(blk < db_status.num_blks);
187 byte = (U16BIT)(blk / 8);
188 bit = (U8BIT)(blk % 8);
192 db_status.blk_map[byte] |= (0x80 >> bit);
196 db_status.blk_map[byte] &= ~(0x80 >> bit);
199 FUNCTION_FINISH(SetBlockMap);
215 static BOOLEAN ReadBlock(U16BIT blk_no,
NVM_BLOCK_REC *blk_ptr, BOOLEAN check)
218 BOOLEAN ret_val = FALSE;
222 ASSERT(blk_no < db_status.num_blks);
223 ASSERT(blk_ptr != NULL);
226 offset = (U32BIT)db_status.blk_off +
228 if (db_status.ram_data == NULL)
239 memcpy((
void *)blk_ptr, (
void *)(db_status.ram_data + offset), (
size_t)
sizeof(
NVM_BLOCK_REC));
244 if (check && ret_val && (blk_ptr->block_type != 0xff))
270 static BOOLEAN WriteBlock(U16BIT blk_no,
NVM_BLOCK_REC *blk_ptr, BOOLEAN check)
273 BOOLEAN ret_val = FALSE;
277 ASSERT(blk_no < db_status.num_blks);
278 ASSERT(blk_ptr != NULL);
287 offset = (U32BIT)db_status.blk_off +
289 if (db_status.ram_data == NULL)
300 memcpy((
void *)(db_status.ram_data + offset), (
void *)blk_ptr, (
size_t)
sizeof(
NVM_BLOCK_REC));
301 db_status.changed = TRUE;
321 static BOOLEAN CacheNVMRecord(U16BIT block_no)
324 BOOLEAN ret_val = TRUE;
326 FUNCTION_START(CacheNVMRecord);
328 ASSERT(block_no < db_status.num_blks);
331 if ((cache_status.blk_no != block_no) || (cache_status.data == NULL))
336 if (cache_status.data != NULL)
342 cache_status.data = NULL;
343 cache_status.size = 0;
344 cache_status.blk_no = block_no;
345 cache_status.changed = FALSE;
348 while (block_no != NVM_INVALID_BLOCK_ID)
351 if (ReadBlock(block_no, &curr_blk, TRUE))
355 (U32BIT)(cache_status.size + BLOCK_PAYLOAD_SIZE));
356 if (cache_status.data != NULL)
359 memcpy((
void *)(cache_status.data + cache_status.size),
360 (
void *)curr_blk.payload, (
size_t)BLOCK_PAYLOAD_SIZE);
361 cache_status.size += BLOCK_PAYLOAD_SIZE;
364 if ((curr_blk.block_type & LINKED_BLOCK_MASK) != 0)
369 block_no = NVM_INVALID_BLOCK_ID;
387 FUNCTION_FINISH(CacheNVMRecord);
403 static BOOLEAN SaveNVMCache(
void)
408 BOOLEAN ret_val = TRUE;
410 FUNCTION_START(SaveNVMCache);
413 if ((cache_status.changed == TRUE) && (cache_status.data != NULL))
415 src_ptr = cache_status.data;
416 cache_status.changed = FALSE;
419 block_no = cache_status.blk_no;
420 while (block_no != NVM_INVALID_BLOCK_ID)
423 if (ReadBlock(block_no, &curr_blk, TRUE))
426 memcpy((
void *)curr_blk.payload, (
void *)src_ptr, (
size_t)BLOCK_PAYLOAD_SIZE);
427 if (WriteBlock(block_no, &curr_blk, TRUE))
430 src_ptr += BLOCK_PAYLOAD_SIZE;
431 if ((curr_blk.block_type & LINKED_BLOCK_MASK) != 0)
436 block_no = NVM_INVALID_BLOCK_ID;
454 FUNCTION_FINISH(SaveNVMCache);
480 size -= (U32BIT)offset;
484 db_status.blk_map = NULL;
485 db_status.ram_data = NULL;
486 db_status.blk_off = offset;
487 db_status.num_blks = (U16BIT)(size / (U32BIT)
sizeof(
NVM_BLOCK_REC));
488 db_status.changed = FALSE;
514 size = (U32BIT)(db_status.num_blks / 8);
515 if ((db_status.num_blks % 8) > 0)
519 if (db_status.blk_map != NULL)
526 if (db_status.blk_map != NULL)
528 memset((
void *)db_status.blk_map, 0xff, (
size_t)size);
530 for (i = 0; i < db_status.num_blks; i++)
533 if (ReadBlock(i, &curr_blk, FALSE))
536 if (curr_blk.block_type == 0xff)
539 byte = (U16BIT)(i / 8);
540 bit = (U8BIT)(i % 8);
541 db_status.blk_map[byte] &= ~(0x80 >> bit);
575 for (i = 0; (i < db_status.num_blks) && retval; i++)
577 if (!ReadBlock(i, &blk, TRUE))
603 db_status.ram_data = ram_ptr;
623 return(db_status.ram_data);
643 ret_val = db_status.num_blks;
663 U16BIT block_no, ret_val;
668 if (db_status.blk_map != NULL)
670 block_no = GetBlockMap(NVM_INVALID_BLOCK_ID, TRUE);
671 while (block_no != NVM_INVALID_BLOCK_ID)
674 block_no = GetBlockMap(block_no, TRUE);
710 ret_val = (size / BLOCK_PAYLOAD_SIZE);
711 if ((size % BLOCK_PAYLOAD_SIZE) > 0)
733 U16BIT block_no, next_block, first_block, num_blks;
739 ASSERT(db_status.blk_map != NULL);
745 first_block = NVM_INVALID_BLOCK_ID;
746 block_no = GetBlockMap(NVM_INVALID_BLOCK_ID, FALSE);
747 while (block_no != NVM_INVALID_BLOCK_ID)
751 curr_blk.block_type = rec_id;
754 if (first_block == NVM_INVALID_BLOCK_ID)
756 curr_blk.block_type |= FIRST_BLOCK_MASK;
757 first_block = block_no;
763 curr_blk.block_type |= LINKED_BLOCK_MASK;
764 next_block = GetBlockMap(block_no, FALSE);
768 next_block = NVM_INVALID_BLOCK_ID;
775 if (WriteBlock(block_no, &curr_blk, TRUE))
778 SetBlockMap(block_no, TRUE);
780 block_no = next_block;
812 ASSERT(block_no < db_status.num_blks);
815 while (block_no != NVM_INVALID_BLOCK_ID)
818 if (ReadBlock(block_no, &curr_blk, TRUE))
821 if ((curr_blk.block_type & LINKED_BLOCK_MASK) != 0)
826 next_block = NVM_INVALID_BLOCK_ID;
829 memset((
void *)&curr_blk, 0xff, (
size_t)
sizeof(
NVM_BLOCK_REC));
830 if (WriteBlock(block_no, &curr_blk, FALSE))
833 SetBlockMap(block_no, FALSE);
834 block_no = next_block;
871 ASSERT(block_no < db_status.num_blks);
874 while (block_no != NVM_INVALID_BLOCK_ID)
877 if (ReadBlock(block_no, &curr_blk, TRUE))
879 if ((curr_blk.block_type & LINKED_BLOCK_MASK) != 0)
892 WriteBlock(block_no, &curr_blk, TRUE);
893 block_no = NVM_INVALID_BLOCK_ID;
921 U16BIT ret_val = NVM_INVALID_BLOCK_ID;
925 ASSERT(block_no < db_status.num_blks);
928 while (block_no != NVM_INVALID_BLOCK_ID)
931 if (ReadBlock(block_no, &curr_blk, TRUE))
938 if ((curr_blk.block_type & LINKED_BLOCK_MASK) == 0)
942 block_no = NVM_INVALID_BLOCK_ID;
973 U16BIT ret_val = NVM_INVALID_BLOCK_ID;
977 ASSERT(rec_id < DBA_NUM_RECORDS);
978 ASSERT(db_status.blk_map != NULL);
981 block_no = GetBlockMap(last_blk, TRUE);
982 while (block_no != NVM_INVALID_BLOCK_ID)
985 if (ReadBlock(block_no, &curr_blk, TRUE))
988 if ((curr_blk.block_type & FIRST_BLOCK_MASK) != 0)
991 if ((curr_blk.block_type & RECID_BLOCK_MASK) == rec_id)
998 block_no = GetBlockMap(block_no, TRUE);
1006 void STB_NVMChanged(BOOLEAN state)
1008 FUNCTION_START(STB_NVMChanged);
1009 db_status.changed = state;
1010 FUNCTION_FINISH(STB_NVMChanged);
1025 if (cache_status.data != NULL)
1028 cache_status.data = NULL;
1030 cache_status.changed = FALSE;
1055 if ((db_status.ram_data != NULL) && db_status.changed)
1058 db_status.changed = FALSE;
1081 ASSERT(block_no < db_status.num_blks);
1084 if (CacheNVMRecord(block_no))
1087 data_ptr = cache_status.data;
1088 data_ptr += (offset / 8);
1093 for (i = 0; i < (size / 8); i++)
1095 *data_ptr++ =
string[i];
1097 *(data_ptr - 1) =
'\0';
1104 cache_status.changed = TRUE;
1126 ASSERT(block_no < db_status.num_blks);
1130 if (CacheNVMRecord(block_no))
1133 data_ptr = cache_status.data;
1134 data_ptr += ((offset + size - 1) / 8);
1135 offset = (7 - ((offset + size - 1) % 8));
1141 *data_ptr &= (U8BIT) ~(0x00000001 << offset);
1142 *data_ptr |= (U8BIT)((value & 0x00000001) << offset);
1143 value = (value >> 1);
1154 cache_status.changed = TRUE;
1176 USE_UNWANTED_PARAM(size);
1178 ASSERT(block_no < db_status.num_blks);
1181 if (CacheNVMRecord(block_no))
1184 data_ptr = cache_status.data;
1185 data_ptr += (offset / 8);
1215 ASSERT(block_no < db_status.num_blks);
1219 if (CacheNVMRecord(block_no))
1222 data_ptr = cache_status.data;
1223 data_ptr += (offset / 8);
1224 offset = (offset % 8);
1231 value = (value << 1);
1232 value |= (U32BIT)((*data_ptr >> (7 - offset)) & 0x01);
1268 if (db_status.ram_data == NULL)
1276 addr = db_status.ram_data + offset;
1277 memcpy((
void *)addr, (
void *)data_ptr, (
size_t)size);
1278 db_status.changed = TRUE;
1299 BOOLEAN ret_val = FALSE;
1303 if (db_status.ram_data == NULL)
1314 memcpy((
void *)data_ptr, (
void *)(db_status.ram_data + offset), (
size_t)size);
U32BIT STB_GetNVMRecordNumber(U16BIT block_no, U16BIT offset, U16BIT size)
Reads the specified value of a field from a NVM record.
U16BIT STB_GetNextNVMBlock(U16BIT block_no)
Returns the block number of the next NVM record pointed to by the NVM record starting at the specifie...
void * STB_GetMemory(U32BIT bytes)
Attempts to allocate memory from the heap.
void STB_DestroyNVMRecord(U16BIT block_no)
Destroys NVM record by marking all NVM blocks used by the record as invalid.
NVM database access defines, structures and functions.
BOOLEAN STB_CheckNVMDatabaseIntegrity(void)
Reads each database block from NVM and checks its checksum. If the data has already been read into th...
BOOLEAN STB_NVMSTBRead(U32BIT offset, U32BIT bytes, U8BIT *dest_addr)
Reads bytes from the given position of the STB area of NVM.
U8BIT * STB_GetNVMRecordString(U16BIT block_no, U16BIT offset, U16BIT size)
Reads string of a field from a NVM record.
void STB_SetNVMRecordString(U16BIT block_no, U16BIT offset, U16BIT size, U8BIT *string)
Writes the specified value into a field of a NVM record.
void STB_NVMSave(void)
Saves the RAM cache data to NVM.
void STB_SetBE16Bit(U16BIT *addr, U16BIT value)
Stores 16bit int in address, forcing value to be stored in Big endian format.
void STB_InitNVMAccess(U16BIT offset)
Initialises parameters needed for NVM block access.
Header file - Function prototypes for NVM control.
void * STB_ResizeMemory(void *ptr, U32BIT new_num_bytes)
Re-allocates a given memory area to the new size, ensuring data contained within the original memory ...
void STB_SetNVMRecordNumber(U16BIT block_no, U16BIT offset, U16BIT size, U32BIT value)
Writes the specified value into a field of a NVM record.
Header file - Function prototypes for NVM database.
U8BIT STB_CalcChecksum(U8BIT *data_ptr, U32BIT data_size)
Calculates the checksum to zero for the data block provided.
void STB_SetNextNVMBlock(U16BIT block_no, U16BIT next_block)
Repairs NVM linked list by pointing the NVM record starting at the specified block number to the reco...
U16BIT STB_GetNVMBlocksNeeded(U16BIT size)
Returns number of NVM database blocks needed for specified number of bytes.
U16BIT STB_FindNVMRecordFromId(U8BIT rec_id, U16BIT last_blk)
Finds next record of the type given in NVM.
void STB_FreeMemory(void *addr)
Releases previously allocated heap memory.
U16BIT STB_GetBE16Bit(U16BIT *addr)
Returns 16bit int from address, assuming value is stored in Big endian format.
Debug functions header file.
Database access defines, structures and public functions.
U16BIT STB_CreateNVMRecord(U8BIT rec_id, U16BIT size)
Creates a record of the type given in NVM by overwriting invalid blocks.
void STB_WriteNVMData(U16BIT offset, U16BIT size, U8BIT *data_ptr)
Writes the given data to NVM.
void STB_InitNVMMap(void)
Initialises parameters needed for NVM block access (calcs num blocks if required) ...
U16BIT STB_GetNVMBlocksUsed(void)
Returns total number of NVM database blocks in use.
BOOLEAN STB_ReadNVMData(U16BIT offset, U16BIT size, U8BIT *data_ptr)
Reads data from the NVM into the given buffer.
System Wide Global Technical Data Type Definitions.
U16BIT STB_GetNVMBlockCount(void)
Returns total number of NVM database blocks.
BOOLEAN STB_CheckChecksum(U8BIT *data_ptr, U32BIT data_size)
Validates the checksum to zero for the block pointer provided.
Header file - Function prototypes for check sum calcs.
BOOLEAN STB_NVMSTBWrite(U32BIT offset, U32BIT bytes, U8BIT *src_addr)
Writes bytes into the given position of the STB area of NVM.
Header file - Function prototypes for heap memory.
void STB_SetNVMAccessRAM(U8BIT *ram_ptr)
Sets all DB NVM access to RAM block supplied instead of NVM (cancel if NULL).
U32BIT STB_NVMGetSTBSize(void)
Returns size of STB database storage are (in bytes).
void STB_NVMFlushCache(BOOLEAN clear)
Flush cached changes.
U16BIT STB_GetNVMBlockSize(void)
Returns the size of an NVM database block, in bytes.
U8BIT * STB_GetNVMAccessRAM(void)
Returns the current RAM pointer used for DB NVM access.