📄 sysnvram.c
字号:
/* sysNvRam.c - NVRAM driver *//* Copyright 1984-2002 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01b,15dec01,g_h Fixe bug in sysNvRamGet that cause the VTS to fail01a,03jul01,g_h created.*//*DESCRIPTIONThis library contains routines to manipulate NvRAM on Flash memory.The macros NV_RAM_ADRS and NV_RAM_SIZE must be defined to indicate theaddress and size of the Flash memory.*/#include "vxWorks.h"#include "config.h"#include "memLib.h"#include "stdlib.h"#include "i28F640J3Mem.h"#include "i28F640J3Mem.c"/*********************************************************************** ** sysNvRamGet - get the contents of non-volatile RAM** This routine copies the contents of non-volatile memory into a specified* string. The string will be terminated with an EOS.** NOTE: The board has no NVRAM, so we've implemented some pseudo-NVRAM* in the flash.** RETURNS: OK or ERROR** SEE ALSO: sysNvRamSet()*/STATUS sysNvRamGet ( char * string, /* where to copy flash memory */ int strLen, /* maximum number of bytes to copy */ int offset /* byte offset into flash memory */ ) { char * pNvRam; char * pString; int i; offset += NV_BOOT_OFFSET; /* boot line begins at <offset> = 0 */ /* Check that the string is entirely within the NVRAM */ if ((offset < 0) || (strLen < 0) || ((offset + strLen) > NV_RAM_SIZE)) return ERROR; pNvRam = (char *)(NV_RAM_ADRS + offset); pString = (char *)string; for (i = 0; i < strLen; i++) *pString++ = *pNvRam++; *pString = EOS; /* force EOS onto nvram string */ /* * It seems that the generic boot-line code expects this function to check * the contents and report any errors. The default boot line is only used if * this function returns ERROR. So, we return ERROR if the NvRam block contine * only 0xFF character (= erased flash). */ for (pNvRam = (char*)NV_RAM_ADRS; pNvRam < (char*)(NV_RAM_ADRS + NV_RAM_SIZE); pNvRam++) { if (*pNvRam != 0xFF) return (OK); } return (ERROR);}/************************************************************************* sysNvRamSet - write data to non-volatile RAM** This routine copies the provided string to the non-volatile memory.** NOTE: The board has no NVRAM, so we've implemented some pseudo-NVRAM* in the flash. The "NVRAM" is a small region at the very top of * flash memory, and can thus be read using normal memory accesses. * However, to write the data we have to read the entire top sector, * modify its contents, erase the top sector, and then reprogram it.** RETURNS: OK or ERROR** SEE ALSO: sysNvRamGet()*/STATUS sysNvRamSet ( char * string, /* string to be copied into flash memory */ int strLen, /* maximum number of bytes to copy */ int offset /* byte offset into flash memory */ ) { UINT32 blockOffs; char * pBlock; char * pTmpBuf; offset += NV_BOOT_OFFSET; /* boot line begins at <offset> = 0 */ /* Check that the string will fit entirely into the NVRAM */ if ((offset < 0) || (strLen < 0) || ((offset + strLen) > NV_RAM_SIZE)) return ERROR; /* see if contents are actually changing */ if (bcmp ((char *) (NV_RAM_ADRS + offset), string, strLen) == 0) return OK; /* Allocate a temporary buffer for the operation */ pTmpBuf = (char *)malloc (FLASH_SECTOR_SIZE); if ( pTmpBuf == NULL ) return ERROR; pBlock = (UINT8 *)((UINT32)(NV_RAM_ADRS + offset) & ~(FLASH_SECTOR_SIZE-1)); /* Copy current contents of flash (entire sector) to the buffer */ memcpy (pTmpBuf,(void*)pBlock,FLASH_SECTOR_SIZE); /* Now erase the flash sector */ i28F640J3EraseSector ((volatile UINT8 *)pBlock); blockOffs = (NV_RAM_ADRS + offset) & (FLASH_SECTOR_SIZE-1); /* Overwrite buffer contents with specified string */ memcpy ((void*)(pTmpBuf + blockOffs),string,strLen); /* Now program the flash sector */ i28F640J3Write ((volatile UINT8 *)pBlock, pTmpBuf, FLASH_SECTOR_SIZE); /* * We could verify the programming here, but there's big trouble if * it didn't work, so we won't bother. */ free (pTmpBuf); return OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -