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

VxWorks

开发平台:

C/C++

  1. /* templateNvRam.c - template NVRAM driver */
  2. /* Copyright 1984-1997 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. TODO - Remove the template modification history and begin a new history
  6. starting with version 01a and growing the history upward with
  7. each revision.
  8. modification history
  9. --------------------
  10. 01a,02sep97,dat  written (from byteNvRam.c, ver 01b)
  11. */
  12. /*
  13. .SH TODO
  14.  - Replace the documentation for this template driver with documentation
  15. for the driver being written.  
  16.  - Begin with an overview of the complete device.  Indicate if the new driver
  17. only implements a sub-section of the whole device or not.
  18.  - Describe all of the operating modes of the device, and indicate which
  19. ones this driver implements.
  20.  - Document the device initialization steps to be used in the BSP to create
  21. and initialize the device.  Document all the macros that
  22. can be used to customize the driver to a particular hardware environment.
  23.  - Document anything that will help the user to understand how this device
  24. works and interacts with this driver.
  25. DESCRIPTION
  26. This template is for byte-oriented non-volatile RAM (NVRAM).  Typical uses
  27. are EEPROMs, static RAM, and any other byte-oriented device.
  28. This is boilerplate driver code.  It is to be included in source form
  29. into sysLib.c.  Macros are used to provide the actual working elements
  30. while this code provides the generic logic.
  31. The following numeric value macros are required:
  32.   NV_RAM_ADRS   - address of first non-volatile byte
  33.   NV_RAM_INTRVL   - address interval between bytes
  34.   NV_RAM_SIZE   - total number of bytes in device
  35.   NV_BOOT_OFFSET  - Offset to first byte of boot line information
  36. The following procedural macros are used.  If not defined by the
  37. specific BSP, then default procedures assuming static RAM with no
  38. special read/write requirements will be used.
  39.   NV_RAM_READ(x)    - Read and return one byte at offset (x).
  40.   NV_RAM_WRITE(x,y) - Write data (y) at offset (x).
  41.   NV_RAM_WR_ENBL    - procedure to enable writing, if any
  42.   NV_RAM_WR_DSBL    - procedure to disable writing, if any
  43. */
  44. #include "vxWorks.h"
  45. #include "config.h"
  46. /* default procedures assume static ram with no special r/w routines */
  47. #ifndef NV_RAM_WR_ENBL
  48. #   define NV_RAM_WR_ENBL /* no write enable procedure */
  49. #endif /*NV_RAM_WR_ENBL*/
  50. #ifndef NV_RAM_WR_DSBL
  51. #   define NV_RAM_WR_DSBL /* no write disable procedure */
  52. #endif /*NV_RAM_WR_DSBL*/
  53. #ifndef NV_RAM_READ
  54. #   define NV_RAM_READ(x) 
  55. (*(UCHAR *)((int)NV_RAM_ADRS + ((x) * NV_RAM_INTRVL)))
  56. #endif /*NV_RAM_READ*/
  57. #ifndef NV_RAM_WRITE
  58. #   define NV_RAM_WRITE(x,y) 
  59. (*(UCHAR *)((int)NV_RAM_ADRS + ((x) * NV_RAM_INTRVL)) = (y))
  60. #endif /*NV_RAM_WRITE*/
  61. /******************************************************************************
  62. *
  63. * sysNvRamGet - get the contents of non-volatile RAM
  64. *
  65. * This routine copies the contents of non-volatile memory into a specified
  66. * string.  The string is terminated with an EOS.
  67. *
  68. * RETURNS: OK, or ERROR if access is outside the non-volatile RAM range.
  69. *
  70. * SEE ALSO: sysNvRamSet()
  71. */
  72. STATUS sysNvRamGet
  73.     (
  74.     char *string,    /* where to copy non-volatile RAM    */
  75.     int strLen,      /* maximum number of bytes to copy   */
  76.     int offset       /* byte offset into non-volatile RAM */
  77.     )
  78.     {
  79.     offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
  80.     if ((offset < 0)
  81.      || (strLen < 0)
  82.      || ((offset + strLen) > NV_RAM_SIZE))
  83.         return (ERROR);
  84.     while (strLen--)
  85. {
  86. *string = NV_RAM_READ (offset);
  87. string++, offset++;
  88. }
  89.     *string = EOS;
  90.     return (OK);
  91.     }
  92. /*******************************************************************************
  93. *
  94. * sysNvRamSet - write to non-volatile RAM
  95. *
  96. * This routine copies a specified string into non-volatile RAM.
  97. *
  98. * RETURNS: OK, or ERROR if access is outside the non-volatile RAM range.
  99. *
  100. * SEE ALSO: sysNvRamGet()
  101. */
  102. STATUS sysNvRamSet
  103.     (
  104.     char *string,     /* string to be copied into non-volatile RAM */
  105.     int strLen,       /* maximum number of bytes to copy           */
  106.     int offset        /* byte offset into non-volatile RAM         */
  107.     )
  108.     {
  109.     STATUS result = OK;
  110.     offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
  111.     if ((offset < 0)
  112.      || (strLen < 0)
  113.      || ((offset + strLen) > NV_RAM_SIZE))
  114.         return ERROR;
  115.     NV_RAM_WR_ENBL;
  116.     while (strLen--)
  117. {
  118. char data;
  119. data = *string; /* avoid any macro side effects */
  120. NV_RAM_WRITE (offset, data);
  121. /* verify data */
  122. if (NV_RAM_READ (offset) != (UCHAR)data)
  123.     {
  124.     result = ERROR;
  125.     goto exit;
  126.     }
  127. string++, offset++;
  128. }
  129. exit:
  130.     NV_RAM_WR_DSBL;
  131.     return result;
  132.     }