r_misc.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:7k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. **********************************************************************
  3. *                          Micrium, Inc.
  4. *                      949 Crestview Circle
  5. *                     Weston,  FL 33327-1848
  6. *
  7. *                            uC/FS
  8. *
  9. *             (c) Copyright 2001 - 2003, Micrium, Inc.
  10. *                      All rights reserved.
  11. *
  12. ***********************************************************************
  13. ----------------------------------------------------------------------
  14. File        : r_misc.c 
  15. Purpose     : Device Driver for simple array in RAM
  16. ----------------------------------------------------------------------
  17. Known problems or limitations with current version
  18. ----------------------------------------------------------------------
  19. None.
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. /*********************************************************************
  23. *
  24. *             #include Section
  25. *
  26. **********************************************************************
  27. */
  28. #include "stdio.h"
  29. #include "fs_port.h"
  30. #include "fs_dev.h" 
  31. #include "fs_lbl.h" 
  32. #include "fs_conf.h"
  33. #if FS_USE_RAMDISK_DRIVER
  34. #include "includes.h"
  35. #include "fs_api.h"
  36. #include "fs_clib.h"
  37. /*********************************************************************
  38. *
  39. *             Local Variables        
  40. *
  41. **********************************************************************
  42. */
  43. static char _array[(long)FS_RR_BLOCKNUM * FS_RR_BLOCKSIZE];
  44. static FILE  *f;
  45. /*********************************************************************
  46. *
  47. *             Local functions
  48. *
  49. **********************************************************************
  50. */
  51. /*********************************************************************
  52. *
  53. *             RamFlush
  54. *
  55.   Description:
  56.   flush ram to file.
  57.   Parameters:
  58.   Unit        - Unit number.
  59.   Cmd         - Command to be executed.
  60.   Aux         - Parameter depending on command.
  61.   pBuffer     - Pointer to a buffer used for the command.
  62.  
  63.   Return value:
  64.   0 means dump successfully
  65.   >0 means dump failure
  66. */
  67. static BOOLEAN RamFlush()
  68. {
  69.   fseek(f, 0, SEEK_SET);
  70.   fwrite(_array, FS_RR_BLOCKNUM * FS_RR_BLOCKSIZE*(sizeof(char)), 1, f);
  71.   fflush(f);
  72.   return 0;
  73. }
  74. /*********************************************************************
  75. *
  76. *             _FS_RAM_DevStatus
  77. *
  78.   Description:
  79.   FS driver function. Get status of the RAM disk.
  80.   Parameters:
  81.   Unit        - Unit number.
  82.  
  83.   Return value:
  84.   ==1 (FS_LBL_MEDIACHANGED) - The media of the device has changed.
  85.   ==0                       - Device okay and ready for operation.
  86.   <0                        - An error has occured.
  87. */
  88. static int _FS_RAM_DevStatus(FS_u32 Unit) {
  89.   static int online[1];
  90.   if (Unit != 0) {
  91.     return -1;  /* Invalid unit number */
  92.   }
  93.   if (!online[Unit]) {
  94.     /* 
  95.        Make sure, the function returns FS_LBL_MEDIACHANGED when it is
  96.        called the first time
  97.     */
  98.     online[Unit] = 1;
  99.     return FS_LBL_MEDIACHANGED;
  100.   }
  101.   return 0;
  102. }
  103. /*********************************************************************
  104. *
  105. *             _FS_RAM_DevRead
  106. *
  107.   Description:
  108.   FS driver function. Read a sector from the RAM disk.
  109.   Parameters:
  110.   Unit        - Unit number.
  111.   Sector      - Sector to be read from the device.
  112.   pBuffer     - Pointer to buffer for storing the data.
  113.  
  114.   Return value:
  115.   ==0         - Sector has been read and copied to pBuffer.
  116.   <0          - An error has occured.
  117. */
  118. static int _FS_RAM_DevRead(FS_u32 Unit, FS_u32 Sector, void *pBuffer) {
  119.   if (Unit != 0) {
  120.     return -1;  /* Invalid unit number */
  121.   }
  122.   if (Sector >= FS_RR_BLOCKNUM) {
  123.     return -1;  /* Out of physical range */
  124.   }
  125.   FS__CLIB_memcpy(pBuffer, ((char*)&_array[0]) + Sector * FS_RR_BLOCKSIZE,
  126.                   (FS_size_t)FS_RR_BLOCKSIZE);
  127.   return 0;
  128. }
  129. /*********************************************************************
  130. *
  131. *             _FS_RAM_DevWrite
  132. *
  133.   Description:
  134.   FS driver function. Write sector to the RAM disk.
  135.   Parameters:
  136.   Unit        - Unit number.
  137.   Sector      - Sector to be written to the device.
  138.   pBuffer     - Pointer to data to be stored.
  139.  
  140.   Return value:
  141.   ==0         - Sector has been written to the device.
  142.   <0          - An error has occured.
  143. */
  144. static int _FS_RAM_DevWrite(FS_u32 Unit, FS_u32 Sector, void *pBuffer) {
  145.   if (Unit != 0) {
  146.     return -1;  /* Invalid unit number */
  147.   }
  148.   if (Sector >= FS_RR_BLOCKNUM) {
  149.     return -1;  /* Out of physical range */
  150.   }
  151.   FS__CLIB_memcpy(((char*)&_array[0]) + Sector * FS_RR_BLOCKSIZE, pBuffer,
  152.                   (FS_size_t)FS_RR_BLOCKSIZE);
  153.   RamFlush(); //write to file
  154.   return 0;
  155. }
  156. /*********************************************************************
  157. *
  158. *             _FS_RAM_DevIoCtl
  159. *
  160.   Description:
  161.   FS driver function. Execute device command.
  162.   Parameters:
  163.   Unit        - Unit number.
  164.   Cmd         - Command to be executed.
  165.   Aux         - Parameter depending on command.
  166.   pBuffer     - Pointer to a buffer used for the command.
  167.  
  168.   Return value:
  169.   Command specific. In general a negative value means an error.
  170. */
  171. static int _FS_RAM_DevIoCtl(FS_u32 Unit, FS_i32 Cmd, FS_i32 Aux, void *pBuffer) {
  172.   FS_u32 *info;
  173.   Aux = Aux;  /* Get rid of compiler warning */
  174.   if (Unit != 0) {
  175.     return -1;  /* Invalid unit number */
  176.   }
  177.   switch (Cmd) {
  178.     case FS_CMD_GET_DEVINFO:
  179.       if (!pBuffer) {
  180.         return -1;
  181.       }
  182.       info = pBuffer;
  183.       *info = 0;  /* hidden */
  184.       info++;
  185.       *info = 2;  /* head */
  186.       info++;
  187.       *info = 4;  /* sec per track */
  188.       info++;
  189.       *info = FS_RR_BLOCKNUM;
  190.       break;
  191.     default:
  192.       break;
  193.   }
  194.   return 0;
  195. }
  196. /*********************************************************************
  197. *
  198. *             Global function
  199. *
  200. **********************************************************************
  201. */
  202. /*********************************************************************
  203. *
  204. *             InitRamDisk
  205. *
  206.   Description:
  207.   Initialize Ramdisk from file:ram.img
  208.   Parameters:
  209.   no
  210.  
  211.   Return value:
  212.   ==0 means init successfully
  213.   !=0 means init failure
  214. */
  215. BOOLEAN InitRamDisk()
  216. {
  217.   int x;
  218.   if((f = fopen("ram.img","rb+"))==NULL) //if exist ram.img read it
  219.   {
  220.   f = fopen("ram.img", "wb+"); //or create and format it
  221.   x = FS_IoCtl("ram:",FS_CMD_FORMAT_MEDIA,FS_MEDIA_RAM_16KB,0);
  222.   _log("create new ramdisknn");
  223.   if (x!=0) 
  224.   {
  225.   _error("Cannot format RAM disk.n");
  226.   return 1;
  227.   };
  228.   }
  229.   else  
  230.   {
  231.   if(fread(_array, sizeof(char), FS_RR_BLOCKNUM * FS_RR_BLOCKSIZE, f) != FS_RR_BLOCKNUM * FS_RR_BLOCKSIZE)
  232.   {
  233.   x = FS_IoCtl("ram:",FS_CMD_FORMAT_MEDIA,FS_MEDIA_RAM_16KB,0); //read error format it
  234.   if (x!=0) 
  235.   {
  236.   _error("Cannot format RAM disk.n");
  237.   return 1;
  238.   }
  239.   }
  240.   else
  241.   _log("read disk from file successnn");
  242.   }
  243.   _FS_RAM_DevStatus(0); //set status
  244.   return 0;
  245. }
  246. /*********************************************************************
  247. *
  248. *             Global variables
  249. *
  250. **********************************************************************
  251. */
  252. const FS__device_type FS__ramdevice_driver = {
  253.   "RAMDISK device",
  254.   _FS_RAM_DevStatus,
  255.   _FS_RAM_DevRead,
  256.   _FS_RAM_DevWrite,
  257.   _FS_RAM_DevIoCtl
  258. };
  259. #endif /* FS_USE_RAMDISK_DRIVER */