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