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

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        : ide_drv.c
  15. Purpose     : File system generic IDE driver
  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 "fs_port.h"
  29. #include "fs_dev.h" 
  30. #include "fs_conf.h"
  31. #if FS_USE_IDE_DRIVER
  32. #include "fs_api.h"
  33. #include "ide_x_hw.h"
  34. #include "ide.h"
  35. #include "fs_lbl.h" 
  36. /*********************************************************************
  37. *
  38. *             Local Variables        
  39. *
  40. **********************************************************************
  41. */
  42. static FS_u32   _FS_ide_logicalstart[FS_IDE_MAXUNIT];     /* start of partition */
  43. static char     _FS_ide_mbrbuffer[0x200];                 /* buffer for reading MBR */   
  44. static char     _FS_ide_diskchange[FS_IDE_MAXUNIT];       /* signal flag for driver */
  45. static char     _FS_ide_busycnt[FS_IDE_MAXUNIT];          /* counter for BSY LED on/off */
  46. /*********************************************************************
  47. *
  48. *             Local functions
  49. *
  50. **********************************************************************
  51. */
  52. /*********************************************************************
  53. *
  54. *             _FS_IDE_DevStatus
  55. *
  56.   Description:
  57.   FS driver function. Get status of the media.
  58.   Parameters:
  59.   Unit        - Unit number.
  60.  
  61.   Return value:
  62.   ==1 (FS_LBL_MEDIACHANGED) - The media of the device has changed.
  63.   ==0                       - Device okay and ready for operation.
  64.   <0                        - An error has occured.
  65. */
  66. static int _FS_IDE_DevStatus(FS_u32 Unit) {
  67.   static int init;
  68.   int x;
  69.   char a;
  70.   FS_IDE_HW_X_BusyLedOn(1);
  71.   if (!init) {
  72.     /* 
  73.        The function is called the first time. For each unit,
  74.        the flag for 'diskchange' is set. That makes sure, that
  75.        FS_LBL_MEDIACHANGED is returned, if there is already a
  76.        media in the reader.
  77.     */
  78.     for (init = 0; init < FS_IDE_MAXUNIT; init++) {
  79.       _FS_ide_diskchange[init] = 1;
  80.     }
  81.     init = 1;
  82.   }
  83.   if (Unit >= FS_IDE_MAXUNIT) {
  84.     return -1;  /* No valid unit number */
  85.   }
  86.   a = FS_IDE_HW_X_DetectStatus(Unit);  /* Check if a card is present */
  87.   if (a) {
  88.     return -1;  /* No card in reader */
  89.   }
  90.   /* When you get here, then there is a card in the reader */
  91.   a = _FS_ide_diskchange[Unit];  /* Check if the media has changed */
  92.   if (a) {
  93.     /* 
  94.        A diskchange took place. The following code reads the MBR of the
  95.        card to get its partition information.
  96.     */
  97.     _FS_ide_diskchange[Unit] = 0;  /* Reset 'diskchange' flag */
  98.     FS__IDE_Init(Unit);
  99.     x = FS__IDE_ReadSector(Unit, 0, (unsigned char*)&_FS_ide_mbrbuffer[0]);
  100.     if (x != 0) {
  101.       return -1;
  102.     }
  103.     /* Calculate start sector of the first partition */
  104.     _FS_ide_logicalstart[Unit]  = _FS_ide_mbrbuffer[0x1c6];
  105.     _FS_ide_logicalstart[Unit] += (0x100UL * _FS_ide_mbrbuffer[0x1c7]);
  106.     _FS_ide_logicalstart[Unit] += (0x10000UL * _FS_ide_mbrbuffer[0x1c8]);
  107.     _FS_ide_logicalstart[Unit] += (0x1000000UL * _FS_ide_mbrbuffer[0x1c9]);
  108.     return FS_LBL_MEDIACHANGED;
  109.   }
  110.     FS_IDE_HW_X_BusyLedOff(1);
  111.   return 0;
  112. }
  113. /*********************************************************************
  114. *
  115. *             _FS_IDE_DevRead
  116. *
  117.   Description:
  118.   FS driver function. Read a sector from the media.
  119.   Parameters:
  120.   Unit        - Unit number.
  121.   Sector      - Sector to be read from the device.
  122.   pBuffer     - Pointer to buffer for storing the data.
  123.  
  124.   Return value:
  125.   ==0         - Sector has been read and copied to pBuffer.
  126.   <0          - An error has occured.
  127. */
  128. static int _FS_IDE_DevRead(FS_u32 Unit, FS_u32 Sector, void *pBuffer) {
  129.   int x;
  130.   
  131.   if (Unit >= FS_IDE_MAXUNIT) {
  132.     return -1;  /* No valid unit number */
  133.   }
  134.   FS_IDE_HW_X_BusyLedOn(1);
  135.   x = FS__IDE_ReadSector(Unit, Sector + _FS_ide_logicalstart[Unit], (unsigned char*)pBuffer);
  136.   if (x != 0) {
  137.     x = -1;
  138.   }
  139.   FS_IDE_HW_X_BusyLedOff(1);
  140.   return x;
  141. }
  142. /*********************************************************************
  143. *
  144. *             _FS_IDE_DevWrite
  145. *
  146.   Description:
  147.   FS driver function. Write sector to the media.
  148.   Parameters:
  149.   Unit        - Unit number.
  150.   Sector      - Sector to be written to the device.
  151.   pBuffer     - Pointer to data to be stored.
  152.  
  153.   Return value:
  154.   ==0         - Sector has been written to the device.
  155.   <0          - An error has occured.
  156. */
  157. static int _FS_IDE_DevWrite(FS_u32 Unit, FS_u32 Sector, void *pBuffer) {
  158.   int x;
  159.   
  160.   if (Unit >= FS_IDE_MAXUNIT) {
  161.     return -1;  /* No valid unit number */
  162.   }
  163.     FS_IDE_HW_X_BusyLedOn(1);
  164.   x = FS__IDE_WriteSector(Unit, Sector + _FS_ide_logicalstart[Unit], (unsigned char*)pBuffer);
  165.   if (x != 0) {
  166.     x = -1;
  167.   }
  168.     FS_IDE_HW_X_BusyLedOff(1);
  169.   return x;
  170. }
  171. /*********************************************************************
  172. *
  173. *             _FS_IDE_DevIoCtl
  174. *
  175.   Description:
  176.   FS driver function. Execute device command.
  177.   Parameters:
  178.   Unit        - Unit number.
  179.   Cmd         - Command to be executed.
  180.   Aux         - Parameter depending on command.
  181.   pBuffer     - Pointer to a buffer used for the command.
  182.  
  183.   Return value:
  184.   Command specific. In general a negative value means an error.
  185. */
  186. static int _FS_IDE_DevIoCtl(FS_u32 Unit, FS_i32 Cmd, FS_i32 Aux, void *pBuffer) {
  187.   FS_u32 *info;
  188.   int x;
  189.   //char a;
  190.   FS_IDE_HW_X_BusyLedOn(1);
  191.   Aux = Aux;  /* Get rid of compiler warning */
  192.   if (Unit >= FS_IDE_MAXUNIT) {
  193.     return -1;  /* No valid unit number */
  194.   }
  195.   switch (Cmd) {
  196.     case FS_CMD_INC_BUSYCNT:
  197.       _FS_ide_busycnt[Unit]++;
  198.       if (_FS_ide_busycnt[Unit] > 0) {
  199.         FS_IDE_HW_X_BusyLedOn(Unit);
  200.       }
  201.       break;
  202.     case FS_CMD_DEC_BUSYCNT:
  203.       _FS_ide_busycnt[Unit]--;
  204.       if (_FS_ide_busycnt[Unit] <= 0) {
  205.         _FS_ide_busycnt[Unit] = 0;
  206.         FS_IDE_HW_X_BusyLedOff(Unit);
  207.       }
  208.       break;
  209.     case FS_CMD_CHK_DSKCHANGE:
  210.       //a = FS_IDE_HW_X_DetectStatus(Unit);
  211.       //if (a) {
  212.       //  _FS_ide_diskchange[Unit] = 1;
  213.       //}    
  214.       break;
  215.     case FS_CMD_GET_DEVINFO:
  216.       if (!pBuffer) {
  217.         return -1;
  218.       }
  219.       info = pBuffer;
  220.       FS__IDE_Init(Unit);
  221.       x = FS__IDE_ReadSector(Unit, 0, (unsigned char*)&_FS_ide_mbrbuffer[0]);
  222.       if (x != 0) {
  223.         return -1;
  224.       }
  225.       /* hidden */
  226.       *info = _FS_ide_mbrbuffer[0x1c6];
  227.       *info += (0x100UL * _FS_ide_mbrbuffer[0x1c7]);
  228.       *info += (0x10000UL * _FS_ide_mbrbuffer[0x1c8]);
  229.       *info += (0x1000000UL * _FS_ide_mbrbuffer[0x1c9]);
  230.       info++;
  231.       /* head */
  232.       *info = _FS_ide_mbrbuffer[0x1c3]; 
  233.       info++;
  234.       /* sec per track */
  235.       *info = _FS_ide_mbrbuffer[0x1c4]; 
  236.       info++;
  237.       /* size */
  238.       *info = _FS_ide_mbrbuffer[0x1ca];
  239.       *info += (0x100UL * _FS_ide_mbrbuffer[0x1cb]);
  240.       *info += (0x10000UL * _FS_ide_mbrbuffer[0x1cc]);
  241.       *info += (0x1000000UL * _FS_ide_mbrbuffer[0x1cd]);
  242.       break;
  243.     default:
  244.       break;
  245.   }
  246.     FS_IDE_HW_X_BusyLedOff(1);
  247.   return 0;
  248. }
  249. /*********************************************************************
  250. *
  251. *             Global variables
  252. *
  253. **********************************************************************
  254. */
  255. const FS__device_type FS__idedevice_driver = {
  256.   "IDE device",
  257.   _FS_IDE_DevStatus,
  258.   _FS_IDE_DevRead,
  259.   _FS_IDE_DevWrite,
  260.   _FS_IDE_DevIoCtl
  261. };
  262. #endif /* FS_USE_IDE_DRIVER */