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

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_X_hw.c
  15. Purpose     : IDE hardware layer for EP7312
  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_conf.h"
  30. #if FS_USE_IDE_DRIVER
  31. #include "ide_x_hw.h"
  32. /*********************************************************************
  33. *
  34. *             #define Macros
  35. *
  36. **********************************************************************
  37. */
  38. /* SFR definition of EP7312 */
  39. #define __PBDR                  *(volatile unsigned char*)0x80000001
  40. #define __PDDR                  *(volatile unsigned char*)0x80000003
  41. #define __PBDDR                 *(volatile unsigned char*)0x80000041
  42. #define __PDDDR                 *(volatile unsigned char*)0x80000043
  43. #define __SYSCON1               *(volatile unsigned int*)0x80000100
  44. #define __SYSFLG1               *(volatile unsigned int*)0x80000140
  45. #define __MEMCFG2               *(volatile unsigned int*)0x800001C0
  46. #define __INTSR1                *(volatile unsigned int*)0x80000240
  47. #define __INTMR1                *(volatile unsigned int*)0x80000280
  48. #define __TC1D                  *(volatile unsigned short*)0x80000300
  49. #define __TC2D                  *(volatile unsigned short*)0x80000340
  50. #define __UARTDR1               *(volatile unsigned short*)0x80000480
  51. #define __UBRLCR1               *(volatile unsigned int*)0x800004C0
  52. #define __TC1EOI                *(volatile unsigned int*)0x800006C0
  53. #define __TC2EOI                *(volatile unsigned int*)0x80000700
  54. #define __SYSFLG2               *(volatile unsigned int*)0x80001140
  55. #define __INTMR2                *(volatile unsigned int*)0x80001280
  56. #define __SYSCON3               *(volatile unsigned int*)0x80002200
  57. #define __PLLW                  *(volatile unsigned int*)0x80002610
  58. /* CSB238 IDE-Bus */
  59. #define __IDE_DATA              *(volatile unsigned short*) 0x50000000
  60. #define __IDE_FC                *(volatile unsigned char*)0x50000001
  61. #define __IDE_SC                *(volatile unsigned char*)0x50000002
  62. #define __IDE_SN                *(volatile unsigned char*)0x50000003
  63. #define __IDE_CL                *(volatile unsigned char*)0x50000004
  64. #define __IDE_CH                *(volatile unsigned char*)0x50000005
  65. #define __IDE_DH                *(volatile unsigned char*)0x50000006
  66. #define __IDE_CMD               *(volatile unsigned char*)0x50000007
  67. #define __IDE_DC                *(volatile unsigned char*)0x5000000e
  68. #define __IDE_PIO3              *(volatile unsigned char*)0x50010000
  69. #define HW__DELAY400NS          FS_IDE_HW_X_GetAltStatus(Unit); FS_IDE_HW_X_GetAltStatus(Unit); 
  70.                                 FS_IDE_HW_X_GetAltStatus(Unit); FS_IDE_HW_X_GetAltStatus(Unit)
  71. /*********************************************************************
  72. *
  73. *             Local Variables        
  74. *
  75. **********************************************************************
  76. */
  77. static char _HW_DevicePresent[2];
  78. /*********************************************************************
  79. *
  80. *             Global functions section
  81. *
  82. **********************************************************************
  83. */
  84. /*********************************************************************
  85. *
  86. *             FS_IDE_HW_X_BusyLedOn
  87. *
  88.   Description:
  89.   FS driver hardware layer function. Turn on busy led.
  90.   Parameters:
  91.   Unit        - Unit number.
  92.  
  93.   Return value:
  94.   None.
  95. */
  96. void FS_IDE_HW_X_BusyLedOn(FS_u32 Unit) {
  97. }
  98. /*********************************************************************
  99. *
  100. *             FS_IDE_HW_X_BusyLedOff
  101. *
  102.   Description:
  103.   FS driver hardware layer function. Turn off busy led.
  104.   Parameters:
  105.   Unit        - Unit number.
  106.  
  107.   Return value:
  108.   None.
  109. */
  110. void FS_IDE_HW_X_BusyLedOff(FS_u32 Unit) {
  111. }
  112. /*********************************************************************
  113. *
  114. *             FS_IDE_HW_X_SetData
  115. *
  116.   Description:
  117.   FS driver hardware layer function. Set the WR DATA register.
  118.   Parameters:
  119.   Unit        - Unit number.
  120.   Data        - Data to be set.
  121.  
  122.   Return value:
  123.   None.
  124. */
  125. void FS_IDE_HW_X_SetData(FS_u32 Unit, FS_u16 Data) {
  126.   __MEMCFG2   = 0x1c13;     /* CS5 16 bit */
  127.   __IDE_DATA  = Data;
  128. }
  129. /*********************************************************************
  130. *
  131. *             FS_IDE_HW_X_GetData
  132. *
  133.   Description:
  134.   FS driver hardware layer function. Read the RD DATA register.
  135.   Parameters:
  136.   Unit        - Unit number.
  137.  
  138.   Return value:
  139.   Value of the RD DATA register.
  140. */
  141. FS_u16 FS_IDE_HW_X_GetData(FS_u32 Unit) {
  142.   FS_u16 data;
  143.   __MEMCFG2   = 0x1c13;     /* CS5 16 bit */
  144.   data = __IDE_DATA;
  145.   return data;
  146. }
  147. /*********************************************************************
  148. *
  149. *             FS_IDE_HW_X_SetFeatures
  150. *
  151.   Description:
  152.   FS driver hardware layer function. Set the FEATURES register.
  153.   Parameters:
  154.   Unit        - Unit number.
  155.   Data        - Value to write to the FEATURES register.
  156.  
  157.   Return value:
  158.   None.
  159. */
  160. void FS_IDE_HW_X_SetFeatures(FS_u32 Unit, unsigned char Data) {
  161.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  162.   __IDE_FC    = Data;
  163. }
  164. /*********************************************************************
  165. *
  166. *             FS_IDE_HW_X_GetError
  167. *
  168.   Description:
  169.   FS driver hardware layer function. Read the ERROR register.
  170.   Parameters:
  171.   Unit        - Unit number.
  172.  
  173.   Return value:
  174.   Value of the ERROR register.
  175. */
  176. unsigned char FS_IDE_HW_X_GetError(FS_u32 Unit) {
  177.   unsigned char data;
  178.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  179.   data = __IDE_FC;
  180.   return data;
  181. }
  182. /*********************************************************************
  183. *
  184. *             FS_IDE_HW_X_SetSectorCount
  185. *
  186.   Description:
  187.   FS driver hardware layer function. Set the SECTOR COUNT register.
  188.   Parameters:
  189.   Unit        - Unit number.
  190.   Data        - Value to write to the SECTOR COUNT register.
  191.  
  192.   Return value:
  193.   None.
  194. */
  195. void FS_IDE_HW_X_SetSectorCount(FS_u32 Unit, unsigned char Data) {
  196.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  197.   __IDE_SC    = Data;
  198. }
  199. /*********************************************************************
  200. *
  201. *             FS_IDE_HW_X_GetSectorCount
  202. *
  203.   Description:
  204.   FS driver hardware layer function. Read the SECTOR COUNT register.
  205.   Parameters:
  206.   Unit        - Unit number.
  207.  
  208.   Return value:
  209.   Value of the SECTOR COUNT register.
  210. */
  211. unsigned char FS_IDE_HW_X_GetSectorCount(FS_u32 Unit) {
  212.   unsigned char data;
  213.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  214.   data = __IDE_SC;
  215.   return data;
  216. }
  217. /*********************************************************************
  218. *
  219. *             FS_IDE_HW_X_SetSectorNo
  220. *
  221.   Description:
  222.   FS driver hardware layer function. Set the SECTOR NUMBER register.
  223.   Parameters:
  224.   Unit        - Unit number.
  225.   Data        - Value to write to the SECTOR NUMBER register.
  226.  
  227.   Return value:
  228.   None.
  229. */
  230. void FS_IDE_HW_X_SetSectorNo(FS_u32 Unit, unsigned char Data) {
  231.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  232.   __IDE_SN    = Data;
  233. }
  234. /*********************************************************************
  235. *
  236. *             FS_IDE_HW_X_GetSectorNo
  237. *
  238.   Description:
  239.   FS driver hardware layer function. Read the SECTOR NUMBER register.
  240.   Parameters:
  241.   Unit        - Unit number.
  242.  
  243.   Return value:
  244.   Value of the SECTOR NUMBER register.
  245. */
  246. unsigned char FS_IDE_HW_X_GetSectorNo(FS_u32 Unit) {
  247.   unsigned char data;
  248.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  249.   data = __IDE_SN;
  250.   return data;
  251. }
  252. /*********************************************************************
  253. *
  254. *             FS_IDE_HW_X_SetCylLow
  255. *
  256.   Description:
  257.   FS driver hardware layer function. Set the CYLINDER LOW register.
  258.   Parameters:
  259.   Unit        - Unit number.
  260.   Data        - Value to write to the CYLINDER LOW register.
  261.  
  262.   Return value:
  263.   None.
  264. */
  265. void FS_IDE_HW_X_SetCylLow(FS_u32 Unit, unsigned char Data) {
  266.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  267.   __IDE_CL    = Data;
  268. }
  269. /*********************************************************************
  270. *
  271. *             FS_IDE_HW_X_GetCylLow
  272. *
  273.   Description:
  274.   FS driver hardware layer function. Read the CYLINDER LOW register.
  275.   Parameters:
  276.   Unit        - Unit number.
  277.  
  278.   Return value:
  279.   Value of the CYLINDER LOW register.
  280. */
  281. unsigned char FS_IDE_HW_X_GetCylLow(FS_u32 Unit) {
  282.   unsigned char data;
  283.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  284.   data = __IDE_CL;
  285.   return data;
  286. }
  287. /*********************************************************************
  288. *
  289. *             FS_IDE_HW_X_SetCylHigh
  290. *
  291.   Description:
  292.   FS driver hardware layer function. Set the CYLINDER HIGH register.
  293.   Parameters:
  294.   Unit        - Unit number.
  295.   Data        - Value to write to the CYLINDER HIGH register.
  296.  
  297.   Return value:
  298.   None.
  299. */
  300. void FS_IDE_HW_X_SetCylHigh(FS_u32 Unit, unsigned char Data) {
  301.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  302.   __IDE_CH    = Data;
  303. }
  304. /*********************************************************************
  305. *
  306. *             FS_IDE_HW_X_GetCylHigh
  307. *
  308.   Description:
  309.   FS driver hardware layer function. Read the CYLINDER HIGH register.
  310.   Parameters:
  311.   Unit        - Unit number.
  312.  
  313.   Return value:
  314.   Value of the CYLINDER HIGH register.
  315. */
  316. unsigned char FS_IDE_HW_X_GetCylHigh(FS_u32 Unit) {
  317.   unsigned char data;
  318.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  319.   data = __IDE_CH;
  320.   return data;
  321. }
  322. /*********************************************************************
  323. *
  324. *             FS_IDE_HW_X_SetDevice
  325. *
  326.   Description:
  327.   FS driver hardware layer function. Set the DEVICE/HEAD register.
  328.   Parameters:
  329.   Unit        - Unit number.
  330.   Data        - Value to write to the DEVICE/HEAD register.
  331.  
  332.   Return value:
  333.   None.
  334. */
  335. void FS_IDE_HW_X_SetDevice(FS_u32 Unit, unsigned char Data) {
  336.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  337.   __IDE_DH    = Data;
  338. }
  339. /*********************************************************************
  340. *
  341. *             FS_IDE_HW_X_GetDevice
  342. *
  343.   Description:
  344.   FS driver hardware layer function. Read the DEVICE/HEAD register.
  345.   Parameters:
  346.   Unit        - Unit number.
  347.  
  348.   Return value:
  349.   Value of the DEVICE/HEAD register.
  350. */
  351. unsigned char FS_IDE_HW_X_GetDevice(FS_u32 Unit) {
  352.   unsigned char data;
  353.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  354.   data = __IDE_DH;
  355.   return data;
  356. }
  357. /*********************************************************************
  358. *
  359. *             FS_IDE_HW_X_SetCommand
  360. *
  361.   Description:
  362.   FS driver hardware layer function. Set the COMMAND register.
  363.   Parameters:
  364.   Unit        - Unit number.
  365.   Data        - Value to write to the COMMAND register.
  366.  
  367.   Return value:
  368.   None.
  369. */
  370. void FS_IDE_HW_X_SetCommand(FS_u32 Unit, unsigned char Data) {
  371.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  372.   __IDE_CMD    = Data;
  373. }
  374. /*********************************************************************
  375. *
  376. *             FS_IDE_HW_X_GetStatus
  377. *
  378.   Description:
  379.   FS driver hardware layer function. Read the STATUS register.
  380.   Parameters:
  381.   Unit        - Unit number.
  382.  
  383.   Return value:
  384.   Value of the STATUS register.
  385. */
  386. unsigned char FS_IDE_HW_X_GetStatus(FS_u32 Unit) {
  387.   unsigned char data;
  388.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  389.   data = __IDE_CMD;
  390.   return data;
  391. }
  392. /*********************************************************************
  393. *
  394. *             FS_IDE_HW_X_SetDevControl
  395. *
  396.   Description:
  397.   FS driver hardware layer function. Set the DEVICE CONTROL register.
  398.   Parameters:
  399.   Unit        - Unit number.
  400.   Data        - Value to write to the DEVICE CONTROL register.
  401.  
  402.   Return value:
  403.   None.
  404. */
  405. void FS_IDE_HW_X_SetDevControl(FS_u32 Unit, unsigned char Data) {
  406.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  407.   __IDE_DC    = Data;
  408. }
  409. /*********************************************************************
  410. *
  411. *             FS_IDE_HW_X_GetAltStatus
  412. *
  413.   Description:
  414.   FS driver hardware layer function. Read the ALTERNATE STATUS register.
  415.   Parameters:
  416.   Unit        - Unit number.
  417.  
  418.   Return value:
  419.   Value of the ALTERNATE STATUS register.
  420. */
  421. unsigned char FS_IDE_HW_X_GetAltStatus(FS_u32 Unit) {
  422.   unsigned char data;
  423.   __MEMCFG2   = 0x1f13;     /* CS5 8 bit */
  424.   data = __IDE_DC;
  425.   return data;
  426. }
  427. /*********************************************************************
  428. *
  429. *             FS_IDE_HW_X_DetectStatus
  430. *
  431.   Description:
  432.   FS driver hardware layer function. Check if the device is present.
  433.   Parameters:
  434.   Unit        - Unit number.
  435.  
  436.   Return value:
  437.   ==0         - Device is connected.
  438.   !=0         - Device has not been found.
  439. */
  440. char FS_IDE_HW_X_DetectStatus(FS_u32 Unit) {
  441.   static char init;
  442.   int lexp;
  443.   unsigned char a;
  444.   unsigned char b;
  445.   if (!init) {
  446.     init  = 1;
  447.     __MEMCFG2  = 0x1f13;        /* CS5 8 bit */
  448.     __SYSCON1 |= 0x40000ul;     /* enable expansion clock */
  449.   }
  450.   if (Unit == 0) {
  451.     FS_IDE_HW_X_SetDevice(Unit, 0xa0);
  452.   }
  453.   else {
  454.     FS_IDE_HW_X_SetDevice(Unit, 0xe0);
  455.   }
  456.   HW__DELAY400NS;
  457.   FS_IDE_HW_X_SetSectorCount(Unit, 0x55);
  458.   FS_IDE_HW_X_SetSectorNo(Unit, 0xaa);
  459.   FS_IDE_HW_X_SetSectorCount(Unit, 0xaa);
  460.   FS_IDE_HW_X_SetSectorNo(Unit, 0x55);
  461.   FS_IDE_HW_X_SetSectorCount(Unit, 0x55);
  462.   FS_IDE_HW_X_SetSectorNo(Unit, 0xaa);
  463.   a = FS_IDE_HW_X_GetSectorCount(Unit);
  464.   b = FS_IDE_HW_X_GetSectorNo(Unit);
  465.   lexp = (a == 0x55);
  466.   lexp = lexp && (b == 0xaa);
  467.   if (lexp) {
  468.     _HW_DevicePresent[Unit] = 1;
  469.   }
  470.   else {
  471.     _HW_DevicePresent[Unit] = 0;
  472.   }
  473.   return (!_HW_DevicePresent[Unit]);
  474. }
  475. /*********************************************************************
  476. *
  477. *             FS_IDE_HW_X_HWReset
  478. *
  479.   Description:
  480.   FS driver hardware layer function. This function is called, when 
  481.   the driver detects a new media is present. For ATA HD drives, there 
  482.   is no action required and this function can be empty.
  483.   When using a CF card, please be aware, that the card needs to be
  484.   power cycled while ~OE is grounded. If the card is inserted, VCC & 
  485.   GND will provide the card before ~OE is connected and the card will 
  486.   be in PC Card ATA mode.
  487.   Parameters:
  488.   Unit        - Unit number.
  489.  
  490.   Return value:
  491.   None.
  492.    
  493. */
  494. void FS_IDE_HW_X_HWReset(FS_u32 Unit) {
  495.   if (Unit != 0) {
  496.     return;
  497.   }
  498. }
  499. #endif /* FS_USE_IDE_DRIVER */