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

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 Segger SED137XE board accessing
  16.               a CF card in true IDE mode with P7,P8,P9,P10.
  17.                  CF                       CPU
  18.               =============================================
  19.                A00 - A02        <-      P70 - P72
  20.                A03 - A10        <-      GND
  21.                PDIAG            <->     PU
  22.                DASP             <->     PU
  23.                CD1 - CD2         ->     P80 - P81
  24.                CS0 - CS1        <-      P73 - P74
  25.                CSEL             <-      GND
  26.                D00 - D15        <->     P90 - P107
  27.                IORD             <-      P75
  28.                IOWR             <-      P76
  29.                ATA SEL          <-      GND
  30.                INTRQ             ->     P83 
  31.                REG              <-      VCC
  32.                RESET            <-      P77
  33.                VS1               ->     PU 
  34.                VS2               ->     PU 
  35.                IORDY             ->     P82
  36.                WE               <-      VCC
  37.                VCC              <-      VCC switched by P84
  38.               =============================================
  39.    
  40. ----------------------------------------------------------------------
  41. Known problems or limitations with current version
  42. ----------------------------------------------------------------------
  43. None.
  44. ---------------------------END-OF-HEADER------------------------------
  45. */
  46. /*********************************************************************
  47. *
  48. *             #include Section
  49. *
  50. **********************************************************************
  51. */
  52. #include "fs_port.h"
  53. #include "fs_conf.h"
  54. #if FS_USE_IDE_DRIVER
  55. #include "ide_x_hw.h"
  56. /* 
  57.   The following header file is part of the IAR compiler for M16C/80. 
  58.   If you use a different compiler, you may have to include a different 
  59.   file or you may even have to replace the SFR access within this 
  60.   file.
  61. */
  62. #include <IOMC80.H>
  63. /*********************************************************************
  64. *
  65. *             #define Macros
  66. *
  67. **********************************************************************
  68. */
  69. /*
  70.    To meet timing specification, you may have to add delays here
  71.    when porting to a different CPU. For MC80 at 16MHz, there is no
  72.    delay required.
  73. */
  74. #define FS__IDE_DELAY_WRITE   
  75. #define FS__IDE_DELAY_READ
  76. #define FS__IDE_DELAY_RESET
  77. /*********************************************************************
  78. *
  79. *             Local functions
  80. *
  81. **********************************************************************
  82. */
  83. /*********************************************************************
  84. *
  85. *             _FS_IDE_HW_SetA0A2
  86. *
  87.   Description:
  88.   FS driver internal function. Set the address lines of the IDE 
  89.   interface.
  90.   Parameters:
  91.   Unit        - Unit number. 
  92.   Address     - Value for A0..A2.
  93.  
  94.   Return value:
  95.   None.
  96. */
  97. static void _FS_IDE_HW_SetA0A2(FS_u32 Unit, unsigned char Addr) {
  98.   unsigned char x;
  99.   if (Unit != 0) {
  100.     return;
  101.   }
  102.   x = P7 & 0xf8;
  103.   x |= (Addr & 0x07);
  104.   P7 = x;
  105. }
  106. /*********************************************************************
  107. *
  108. *             _FS_IDE_HW_SetCS0CS1
  109. *
  110.   Description:
  111.   FS driver internal function. Set the CS0CS1 lines of the IDE 
  112.   interface.
  113.   Parameters:
  114.   Unit        - Unit number. 
  115.   Data        - Value for CS0..CS1.
  116.  
  117.   Return value:
  118.   None.
  119. */
  120. static void _FS_IDE_HW_SetCS0CS1(FS_u32 Unit, unsigned char Data) {
  121.   unsigned char x;
  122.   if (Unit != 0) {
  123.     return;
  124.   }
  125.   x = P7 & 0xe7;
  126.   x |= ((Data & 3) << 3);
  127.   P7 = x;
  128. }
  129. /*********************************************************************
  130. *
  131. *             _FS_IDE_HW_SetD0D15
  132. *
  133.   Description:
  134.   FS driver internal function. Set the data lines of the IDE interface.
  135.   Parameters:
  136.   Unit        - Unit number. 
  137.   Data        - Value for D0..D15.
  138.  
  139.   Return value:
  140.   None.
  141. */
  142. static void _FS_IDE_HW_SetD0D15(FS_u32 Unit, FS_u16 Data) {
  143.   if (Unit != 0) {
  144.     return;
  145.   }
  146.   /* Set mode output */
  147.   PRCR |= 0x04;
  148.   PD9  = 0xff;
  149.   PD10 = 0xff;
  150.   PRCR &= 0xfb;
  151.   /* Set Data */
  152.   P9  = Data & 0xff;
  153.   P10 = ((Data >> 8) & 0xff);
  154. }
  155. /*********************************************************************
  156. *
  157. *             _FS_IDE_HW_GetD0D15
  158. *
  159.   Description:
  160.   FS driver internal function. Read the data lines of the IDE interface.
  161.   Parameters:
  162.   Unit        - Unit number. 
  163.  
  164.   Return value:
  165.   Value of D0..D15.
  166. */
  167. static FS_u16 _FS_IDE_HW_GetD0D15(FS_u32 Unit) {
  168.   FS_u16 x;
  169.   
  170.   if (Unit != 0) {
  171.     return 0;
  172.   }
  173.   /* Set mode input */
  174.   PRCR |= 0x04;
  175.   PD9  = 0x00;
  176.   PD10 = 0x00;
  177.   PRCR &= 0xfb;
  178.   /* Get data */
  179.   x = P10;
  180.   x = x << 8;
  181.   x |= P9;
  182.   return x;
  183. }
  184. /*********************************************************************
  185. *
  186. *             _FS_IDE_HW_SetIORD
  187. *
  188.   Description:
  189.   FS driver internal function. Set the IORD line of the IDE interface.
  190.   Parameters:
  191.   Unit        - Unit number. 
  192.   Data        - Value for IORD.
  193.  
  194.   Return value:
  195.   None.
  196. */
  197. static void _FS_IDE_HW_SetIORD(FS_u32 Unit, unsigned char Data) {
  198.   if (Unit != 0) {
  199.     return;
  200.   }
  201.   if (Data) {
  202.     P7 |= 0x20;
  203.   }
  204.   else {
  205.     P7 &= 0xdf;
  206.   }
  207. }
  208. /*********************************************************************
  209. *
  210. *             _FS_IDE_HW_SetIOWR
  211. *
  212.   Description:
  213.   FS driver internal function. Set the IOWR line of the IDE interface.
  214.   Parameters:
  215.   Unit        - Unit number. 
  216.   Data        - Value for IOWR.
  217.  
  218.   Return value:
  219.   None.
  220. */
  221. static void _FS_IDE_HW_SetIOWR(FS_u32 Unit, unsigned char Data) {
  222.   if (Unit != 0) {
  223.     return;
  224.   }
  225.   if (Data) {
  226.     P7 |= 0x40;
  227.   }
  228.   else {
  229.     P7 &= 0xbf;
  230.   }
  231. }
  232. /*********************************************************************
  233. *
  234. *             _FS_IDE_HW_GetIORDY
  235. *
  236.   Description:
  237.   FS driver internal function. Read the IORDY line of the IDE interface.
  238.   Parameters:
  239.   Unit        - Unit number. 
  240.  
  241.   Return value:
  242.   ==0         - Value of IORDY.
  243.   ==1         - Value of IORDY.
  244.   ==0xff      - An error has occured.
  245. */
  246. static char _FS_IDE_HW_GetIORDY(FS_u32 Unit) {
  247.   if (Unit != 0) {
  248.     return 0xff;
  249.   }
  250.   if (P8 & 0x04) {
  251.     return 1;
  252.   }
  253.   return 0;
  254. }
  255. /*********************************************************************
  256. *
  257. *             _FS_IDE_HW_WriteBUS
  258. *
  259.   Description:
  260.   FS driver internal function. Write a value to an IDE register.
  261.   Parameters:
  262.   Unit        - Unit number. 
  263.   CS          - Value for CS0..CS1.
  264.   Addr        - Address of the register.
  265.   Data        - Data to be written to the register
  266.  
  267.   Return value:
  268.   None.
  269. */
  270. static void _FS_IDE_HW_WriteBUS(FS_u32 Unit, unsigned char CS, unsigned char Addr, FS_u16 Data) {
  271.   _FS_IDE_HW_SetA0A2(Unit, Addr);
  272.   _FS_IDE_HW_SetCS0CS1(Unit, CS);
  273.   _FS_IDE_HW_SetD0D15(Unit, Data);
  274.   _FS_IDE_HW_SetIOWR(Unit, 0);
  275.   FS__IDE_DELAY_WRITE;                /* delay */
  276.   while (!_FS_IDE_HW_GetIORDY(Unit)) {
  277.   }
  278.   _FS_IDE_HW_SetIOWR(Unit, 1);
  279.   _FS_IDE_HW_SetCS0CS1(Unit, 0x03);     /* Standby Mode */
  280.   _FS_IDE_HW_SetA0A2(Unit, 0x00);
  281. }
  282. /*********************************************************************
  283. *
  284. *             _FS_IDE_HW_ReadBUS
  285. *
  286.   Description:
  287.   FS driver internal function. Read value of an IDE register.
  288.   Parameters:
  289.   Unit        - Unit number. 
  290.   CS          - Value for CS0..CS1.
  291.   Addr        - Address of the register.
  292.    
  293.   Return value:
  294.   Value of the IDE register.
  295. */
  296. static FS_u16 _FS_IDE_HW_ReadBUS(FS_u32 Unit, unsigned char CS, unsigned char Addr) {
  297.   FS_u16 data;
  298.   
  299.   _FS_IDE_HW_SetA0A2(Unit, Addr);
  300.   _FS_IDE_HW_SetCS0CS1(Unit, CS);
  301.   _FS_IDE_HW_SetIORD(Unit, 0);
  302.   FS__IDE_DELAY_READ;                 /* delay */
  303.   while (!_FS_IDE_HW_GetIORDY(Unit)) {
  304.   }
  305.   data = _FS_IDE_HW_GetD0D15(Unit);
  306.   _FS_IDE_HW_SetIORD(Unit, 1);
  307.   _FS_IDE_HW_SetCS0CS1(Unit, 0x03);     /* Standby Mode */
  308.   _FS_IDE_HW_SetA0A2(Unit, 0x00);
  309.   return data;
  310. }
  311. /*********************************************************************
  312. *
  313. *             Global functions section
  314. *
  315. **********************************************************************
  316. */
  317. /*********************************************************************
  318. *
  319. *             FS_IDE_HW_X_BusyLedOn
  320. *
  321.   Description:
  322.   FS driver hardware layer function. Turn on busy led.
  323.   Parameters:
  324.   Unit        - Unit number.
  325.  
  326.   Return value:
  327.   None.
  328. */
  329. void FS_IDE_HW_X_BusyLedOn(FS_u32 Unit) {
  330. }
  331. /*********************************************************************
  332. *
  333. *             FS_IDE_HW_X_BusyLedOff
  334. *
  335.   Description:
  336.   FS driver hardware layer function. Turn off busy led.
  337.   Parameters:
  338.   Unit        - Unit number.
  339.  
  340.   Return value:
  341.   None.
  342. */
  343. void FS_IDE_HW_X_BusyLedOff(FS_u32 Unit) {
  344. }
  345. /*********************************************************************
  346. *
  347. *             FS_IDE_HW_X_SetData
  348. *
  349.   Description:
  350.   FS driver hardware layer function. Set the WR DATA register.
  351.   Parameters:
  352.   Unit        - Unit number.
  353.   Data        - Data to be set.
  354.  
  355.   Return value:
  356.   None.
  357. */
  358. void FS_IDE_HW_X_SetData(FS_u32 Unit, FS_u16 Data) {
  359.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x00, Data);
  360. }
  361. /*********************************************************************
  362. *
  363. *             FS_IDE_HW_X_GetData
  364. *
  365.   Description:
  366.   FS driver hardware layer function. Read the RD DATA register.
  367.   Parameters:
  368.   Unit        - Unit number.
  369.  
  370.   Return value:
  371.   Value of the RD DATA register.
  372. */
  373. FS_u16 FS_IDE_HW_X_GetData(FS_u32 Unit) {
  374.   FS_u16 data;
  375.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x00);
  376.   return data;
  377. }
  378. /*********************************************************************
  379. *
  380. *             FS_IDE_HW_X_SetFeatures
  381. *
  382.   Description:
  383.   FS driver hardware layer function. Set the FEATURES register.
  384.   Parameters:
  385.   Unit        - Unit number.
  386.   Data        - Value to write to the FEATURES register.
  387.  
  388.   Return value:
  389.   None.
  390. */
  391. void FS_IDE_HW_X_SetFeatures(FS_u32 Unit, unsigned char Data) {
  392.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x01, Data);
  393. }
  394. /*********************************************************************
  395. *
  396. *             FS_IDE_HW_X_GetError
  397. *
  398.   Description:
  399.   FS driver hardware layer function. Read the ERROR register.
  400.   Parameters:
  401.   Unit        - Unit number.
  402.  
  403.   Return value:
  404.   Value of the ERROR register.
  405. */
  406. unsigned char FS_IDE_HW_X_GetError(FS_u32 Unit) {
  407.   unsigned char data;
  408.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x01) & 0xff;
  409.   return data;
  410. }
  411. /*********************************************************************
  412. *
  413. *             FS_IDE_HW_X_SetSectorCount
  414. *
  415.   Description:
  416.   FS driver hardware layer function. Set the SECTOR COUNT register.
  417.   Parameters:
  418.   Unit        - Unit number.
  419.   Data        - Value to write to the SECTOR COUNT register.
  420.  
  421.   Return value:
  422.   None.
  423. */
  424. void FS_IDE_HW_X_SetSectorCount(FS_u32 Unit, unsigned char Data) {
  425.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x02, Data);
  426. }
  427. /*********************************************************************
  428. *
  429. *             FS_IDE_HW_X_GetSectorCount
  430. *
  431.   Description:
  432.   FS driver hardware layer function. Read the SECTOR COUNT register.
  433.   Parameters:
  434.   Unit        - Unit number.
  435.  
  436.   Return value:
  437.   Value of the SECTOR COUNT register.
  438. */
  439. unsigned char FS_IDE_HW_X_GetSectorCount(FS_u32 Unit) {
  440.   unsigned char data;
  441.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x02) & 0xff;
  442.   return data;
  443. }
  444. /*********************************************************************
  445. *
  446. *             FS_IDE_HW_X_SetSectorNo
  447. *
  448.   Description:
  449.   FS driver hardware layer function. Set the SECTOR NUMBER register.
  450.   Parameters:
  451.   Unit        - Unit number.
  452.   Data        - Value to write to the SECTOR NUMBER register.
  453.  
  454.   Return value:
  455.   None.
  456. */
  457. void FS_IDE_HW_X_SetSectorNo(FS_u32 Unit, unsigned char Data) {
  458.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x03, Data);
  459. }
  460. /*********************************************************************
  461. *
  462. *             FS_IDE_HW_X_GetSectorNo
  463. *
  464.   Description:
  465.   FS driver hardware layer function. Read the SECTOR NUMBER register.
  466.   Parameters:
  467.   Unit        - Unit number.
  468.  
  469.   Return value:
  470.   Value of the SECTOR NUMBER register.
  471. */
  472. unsigned char FS_IDE_HW_X_GetSectorNo(FS_u32 Unit) {
  473.   unsigned char data;
  474.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x03) & 0xff;
  475.   return data;
  476. }
  477. /*********************************************************************
  478. *
  479. *             FS_IDE_HW_X_SetCylLow
  480. *
  481.   Description:
  482.   FS driver hardware layer function. Set the CYLINDER LOW register.
  483.   Parameters:
  484.   Unit        - Unit number.
  485.   Data        - Value to write to the CYLINDER LOW register.
  486.  
  487.   Return value:
  488.   None.
  489. */
  490. void FS_IDE_HW_X_SetCylLow(FS_u32 Unit, unsigned char Data) {
  491.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x04, Data);
  492. }
  493. /*********************************************************************
  494. *
  495. *             FS_IDE_HW_X_GetCylLow
  496. *
  497.   Description:
  498.   FS driver hardware layer function. Read the CYLINDER LOW register.
  499.   Parameters:
  500.   Unit        - Unit number.
  501.  
  502.   Return value:
  503.   Value of the CYLINDER LOW register.
  504. */
  505. unsigned char FS_IDE_HW_X_GetCylLow(FS_u32 Unit) {
  506.   unsigned char data;
  507.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x04) & 0xff;
  508.   return data;
  509. }
  510. /*********************************************************************
  511. *
  512. *             FS_IDE_HW_X_SetCylHigh
  513. *
  514.   Description:
  515.   FS driver hardware layer function. Set the CYLINDER HIGH register.
  516.   Parameters:
  517.   Unit        - Unit number.
  518.   Data        - Value to write to the CYLINDER HIGH register.
  519.  
  520.   Return value:
  521.   None.
  522. */
  523. void FS_IDE_HW_X_SetCylHigh(FS_u32 Unit, unsigned char Data) {
  524.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x05, Data);
  525. }
  526. /*********************************************************************
  527. *
  528. *             FS_IDE_HW_X_GetCylHigh
  529. *
  530.   Description:
  531.   FS driver hardware layer function. Read the CYLINDER HIGH register.
  532.   Parameters:
  533.   Unit        - Unit number.
  534.  
  535.   Return value:
  536.   Value of the CYLINDER HIGH register.
  537. */
  538. unsigned char FS_IDE_HW_X_GetCylHigh(FS_u32 Unit) {
  539.   unsigned char data;
  540.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x05) & 0xff;
  541.   return data;
  542. }
  543. /*********************************************************************
  544. *
  545. *             FS_IDE_HW_X_SetDevice
  546. *
  547.   Description:
  548.   FS driver hardware layer function. Set the DEVICE/HEAD register.
  549.   Parameters:
  550.   Unit        - Unit number.
  551.   Data        - Value to write to the DEVICE/HEAD register.
  552.  
  553.   Return value:
  554.   None.
  555. */
  556. void FS_IDE_HW_X_SetDevice(FS_u32 Unit, unsigned char Data) {
  557.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x06, Data);
  558. }
  559. /*********************************************************************
  560. *
  561. *             FS_IDE_HW_X_GetDevice
  562. *
  563.   Description:
  564.   FS driver hardware layer function. Read the DEVICE/HEAD register.
  565.   Parameters:
  566.   Unit        - Unit number.
  567.  
  568.   Return value:
  569.   Value of the DEVICE/HEAD register.
  570. */
  571. unsigned char FS_IDE_HW_X_GetDevice(FS_u32 Unit) {
  572.   unsigned char data;
  573.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x06) & 0xff;
  574.   return data;
  575. }
  576. /*********************************************************************
  577. *
  578. *             FS_IDE_HW_X_SetCommand
  579. *
  580.   Description:
  581.   FS driver hardware layer function. Set the COMMAND register.
  582.   Parameters:
  583.   Unit        - Unit number.
  584.   Data        - Value to write to the COMMAND register.
  585.  
  586.   Return value:
  587.   None.
  588. */
  589. void FS_IDE_HW_X_SetCommand(FS_u32 Unit, unsigned char Data) {
  590.   _FS_IDE_HW_WriteBUS(Unit, 0x02, 0x07, Data);
  591. }
  592. /*********************************************************************
  593. *
  594. *             FS_IDE_HW_X_GetStatus
  595. *
  596.   Description:
  597.   FS driver hardware layer function. Read the STATUS register.
  598.   Parameters:
  599.   Unit        - Unit number.
  600.  
  601.   Return value:
  602.   Value of the STATUS register.
  603. */
  604. unsigned char FS_IDE_HW_X_GetStatus(FS_u32 Unit) {
  605.   unsigned char data;
  606.   data = _FS_IDE_HW_ReadBUS(Unit, 0x02, 0x07) & 0xff;
  607.   return data;
  608. }
  609. /*********************************************************************
  610. *
  611. *             FS_IDE_HW_X_SetDevControl
  612. *
  613.   Description:
  614.   FS driver hardware layer function. Set the DEVICE CONTROL register.
  615.   Parameters:
  616.   Unit        - Unit number.
  617.   Data        - Value to write to the DEVICE CONTROL register.
  618.  
  619.   Return value:
  620.   None.
  621. */
  622. void FS_IDE_HW_X_SetDevControl(FS_u32 Unit, unsigned char Data) {
  623.   _FS_IDE_HW_WriteBUS(Unit, 0x01, 0x06, Data);
  624. }
  625. /*********************************************************************
  626. *
  627. *             FS_IDE_HW_X_GetAltStatus
  628. *
  629.   Description:
  630.   FS driver hardware layer function. Read the ALTERNATE STATUS register.
  631.   Parameters:
  632.   Unit        - Unit number.
  633.  
  634.   Return value:
  635.   Value of the ALTERNATE STATUS register.
  636. */
  637. unsigned char FS_IDE_HW_X_GetAltStatus(FS_u32 Unit) {
  638.   unsigned char data;
  639.   data = _FS_IDE_HW_ReadBUS(Unit, 0x01, 0x06) & 0xff;
  640.   return data;
  641. }
  642. /*********************************************************************
  643. *
  644. *             FS_IDE_HW_X_DetectStatus
  645. *
  646.   Description:
  647.   FS driver hardware layer function. Check if the device is present.
  648.   Parameters:
  649.   Unit        - Unit number.
  650.  
  651.   Return value:
  652.   ==0         - Device is connected.
  653.   !=0         - Device has not been found.
  654. */
  655. char FS_IDE_HW_X_DetectStatus(FS_u32 Unit) {
  656.   static char init;
  657.   if (!init) {
  658.     init  = 1;
  659.     PD7   =  0xff;    /* P70 - P77 output */
  660.     P7    =  0xff;
  661.     PD8   =  0xf0;    /* P80 - P83 input / P84 - P87 output  */
  662.     P8    =  0xff;
  663.     PRCR  |= 0x04;    /* allow PD9 change */
  664.     PD9   =  0x00;    /* P90 - P97 input */
  665.     PRCR  &= 0xfb;    /* disable PD9 change */
  666.     PD10  =  0x00;    /* P100 - P107 input */
  667.   }
  668.   /* check CD1 & CD2 */
  669.   if (P8 & 0x03) {
  670.     return 1;
  671.   }
  672.   return 0;
  673. }
  674. /*********************************************************************
  675. *
  676. *             FS_IDE_HW_X_HWReset
  677. *
  678.   Description:
  679.   FS driver hardware layer function. This function is called, when 
  680.   the driver detects a new media is present. For ATA HD drives, there 
  681.   is no action required and this function can be empty.
  682.   When using a CF card, please be aware, that the card needs to be
  683.   power cycled while ~OE is grounded. If the card is inserted, VCC & 
  684.   GND will provide the card before ~OE is connected and the card will 
  685.   be in PC Card ATA mode.
  686.   Parameters:
  687.   Unit        - Unit number.
  688.  
  689.   Return value:
  690.   None.
  691. */
  692. void FS_IDE_HW_X_HWReset(FS_u32 Unit) {
  693.   volatile unsigned long int to;
  694.   
  695.   if (Unit!=0) {
  696.     return;
  697.   }
  698.   P8 |= 0x10;             /* power off */
  699.   PD7     = 0x00;
  700.   to = 10000;
  701.   while (to) {
  702.     to--;
  703.   }
  704.   PD7 = 0xff;
  705.   P8 &= 0xef;             /* power on */
  706.   P7 |= 0x80;             /* RESET high */
  707.   P7 &= 0x7f;             /* RESET low */
  708.   FS__IDE_DELAY_RESET;
  709.   P7 |= 0x80;             /* RESET high */
  710. }
  711. #endif /* FS_USE_IDE_DRIVER */