byteNvRam.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* byteNvRam.c - byte-oriented generic NVRAM driver */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,29oct96,wlf  doc: cleanup.
  8. 01a,03jun96,dat  written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This driver is for byte-oriented non-volatile RAM (NVRAM).  Typical uses
  13. are EEPROMs, static RAM, and any other byte-oriented device.
  14. There are other generic drivers for block-oriented devices like flash memory,
  15. and for boards that have no non-volatile memory at all.
  16. This is boilerplate driver code.  It is to be included in source form
  17. into sysLib.c.  Macros are used to provide the actual working elements
  18. while this code provides the generic logic.
  19. The following numeric value macros are required:
  20.   NV_RAM_ADRS   - address of first non-volatile byte
  21.   NV_RAM_INTRVL   - address interval between bytes
  22.   NV_RAM_SIZE   - total number of bytes in device
  23.   NV_BOOT_OFFSET  - Offset to first byte of boot line information
  24. The following procedural macros are used.  If not defined by the
  25. specific BSP, then default procedures assuming static RAM with no
  26. special read/write requirements will be used.
  27.   NV_RAM_READ(x)    - Read and return one byte at offset (x).
  28.   NV_RAM_WRITE(x,y) - Write data (y) at offset (x).
  29.   NV_RAM_WR_ENBL    - procedure to enable writing, if any
  30.   NV_RAM_WR_DSBL    - procedure to disable writing, if any
  31. */
  32. #include "vxWorks.h"
  33. #include "config.h"
  34. /* default procedures assume static ram with no special r/w routines */
  35. #ifndef NV_RAM_WR_ENBL
  36. #   define NV_RAM_WR_ENBL /* no write enable procedure */
  37. #endif /*NV_RAM_WR_ENBL*/
  38. #ifndef NV_RAM_WR_DSBL
  39. #   define NV_RAM_WR_DSBL /* no write disable procedure */
  40. #endif /*NV_RAM_WR_DSBL*/
  41. #ifndef NV_RAM_READ
  42. #   define NV_RAM_READ(x) 
  43. (*(UCHAR *)((int)NV_RAM_ADRS + ((x) * NV_RAM_INTRVL)))
  44. #endif /*NV_RAM_READ*/
  45. #ifndef NV_RAM_WRITE
  46. #   define NV_RAM_WRITE(x,y) 
  47. (*(UCHAR *)((int)NV_RAM_ADRS + ((x) * NV_RAM_INTRVL)) = (y))
  48. #endif /*NV_RAM_WRITE*/
  49. /******************************************************************************
  50. *
  51. * sysNvRamGet - get the contents of non-volatile RAM
  52. *
  53. * This routine copies the contents of non-volatile memory into a specified
  54. * string.  The string is terminated with an EOS.
  55. *
  56. * RETURNS: OK, or ERROR if access is outside the non-volatile RAM range.
  57. *
  58. * SEE ALSO: sysNvRamSet()
  59. */
  60. STATUS sysNvRamGet
  61.     (
  62.     char *string,    /* where to copy non-volatile RAM    */
  63.     int strLen,      /* maximum number of bytes to copy   */
  64.     int offset       /* byte offset into non-volatile RAM */
  65.     )
  66.     {
  67.     offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
  68.     if ((offset < 0)
  69.      || (strLen < 0)
  70.      || ((offset + strLen) > NV_RAM_SIZE))
  71.         return (ERROR);
  72.     while (strLen--)
  73. {
  74. *string = NV_RAM_READ (offset);
  75. string++, offset++;
  76. }
  77.     *string = EOS;
  78.     return (OK);
  79.     }
  80. /*******************************************************************************
  81. *
  82. * sysNvRamSet - write to non-volatile RAM
  83. *
  84. * This routine copies a specified string into non-volatile RAM.
  85. *
  86. * RETURNS: OK, or ERROR if access is outside the non-volatile RAM range.
  87. *
  88. * SEE ALSO: sysNvRamGet()
  89. */
  90. STATUS sysNvRamSet
  91.     (
  92.     char *string,     /* string to be copied into non-volatile RAM */
  93.     int strLen,       /* maximum number of bytes to copy           */
  94.     int offset        /* byte offset into non-volatile RAM         */
  95.     )
  96.     {
  97.     STATUS result = OK;
  98.     offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
  99.     if ((offset < 0)
  100.      || (strLen < 0)
  101.      || ((offset + strLen) > NV_RAM_SIZE))
  102.         return ERROR;
  103.     NV_RAM_WR_ENBL;
  104.     while (strLen--)
  105. {
  106. char data;
  107. data = *string; /* avoid any macro side effects */
  108. NV_RAM_WRITE (offset, data);
  109. /* verify data */
  110. if (NV_RAM_READ (offset) != (UCHAR)data)
  111.     {
  112.     result = ERROR;
  113.     goto exit;
  114.     }
  115. string++, offset++;
  116. }
  117. exit:
  118.     NV_RAM_WR_DSBL;
  119.     return result;
  120.     }