⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal4ata.lst

📁 D12 USB源代码 硬盘
💻 LST
📖 第 1 页 / 共 2 页
字号:
 221   1              if(Hal4ATA_SelDevice())
 222   1          {
 223   2                  // Send IDE IDENTIFY command.
 224   2                      // IDE_COMMAND_IDENTIFY=0xEC ;
 225   2                  Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, IDE_COMMAND_IDENTIFY);
 226   2      
 227   2                  if(Hal4ATA_WaitOnBusyNDrq())
 228   2              {
 229   3                  /*
 230   3                      // Suck out 256 words. After waiting for one model that asserts busy
 231   3                      // after receiving the Packet Identify command.
 232   3                      */
 233   3                      if(Hal4ATA_InitDevExt())
 234   3                      retStatus = TRUE;
 235   3              }
 236   2      
 237   2                  /*
 238   2                  // Work around for some IDE and one model Atapi that will present more than
 239   2                  // 256 words for the Identify data.
 240   2                  */
 241   2                  for (i=10000; i != 0; i--)
C51 COMPILER V7.06   HAL4ATA                                                               02/17/2004 14:42:23 PAGE 5   

 242   2              {
 243   3                          Hal4ATA_GetStatus();
 244   3                          if (Hal4ATA_StatusByte_DRQ)
 245   3                  {
 246   4                                  /*
 247   4                                  // Suck out any remaining bytes and throw away.
 248   4                                  */
 249   4                                  Hal4Sys_ATADataPortInW();
 250   4                          }
 251   3                          else
 252   3                                  break;
 253   3                  }
 254   2          }
 255   1              return retStatus;
 256   1      } /* end IssueIdentify()*/
 257          
 258          
 259          BOOLEAN
 260          Hal4ATA_InitDevExt(void)
 261          {
 262   1          INT8 c;
 263   1          if(Hal4ATA_WaitOnBusyNDrq())
 264   1          {
 265   2              ATADevExt_IDData.GeneralConfiguration = Hal4Sys_ATADataPortInW();//INT16  00
 266   2              ATADevExt_IDData.NumberOfCylinders = Hal4Sys_ATADataPortInW();//INT16  01
 267   2              Hal4Sys_ATADataPortInW();
 268   2              ATADevExt_IDData.NumberOfHeads = Hal4Sys_ATADataPortInW();//INT16  03
 269   2      
 270   2              for(c = 2 ; c != 0; c--)
 271   2                  Hal4Sys_ATADataPortInW();
 272   2              ATADevExt_IDData.SectorsPerTrack = Hal4Sys_ATADataPortInW();//INT16  06
 273   2      
 274   2              for(c = 40 ; c != 0; c--) // 7 -47
 275   2                  Hal4Sys_ATADataPortInW();
 276   2              ATADevExt_IDData.MaximumBlockTransfer = Hal4Sys_ATADataPortInW();//INT8 47
 277   2      
 278   2              Hal4Sys_ATADataPortInW(); // 48
 279   2              ATADevExt_IDData.Capabilities = Hal4Sys_ATADataPortInW();//INT16  49
 280   2      
 281   2              for(c = 4; c != 0; c--)
 282   2                  Hal4Sys_ATADataPortInW();
 283   2              ATADevExt_IDData.NumberOfCurrentCylinders = Hal4Sys_ATADataPortInW();//INT16  54
 284   2              ATADevExt_IDData.NumberOfCurrentHeads = Hal4Sys_ATADataPortInW();//INT16  55
 285   2              ATADevExt_IDData.CurrentSectorsPerTrack = Hal4Sys_ATADataPortInW();//INT16  56
 286   2              ATADevExt_IDData.CurrentSectorCapacity.ints.i0 = Hal4Sys_ATADataPortInW();//INT32  57
 287   2              ATADevExt_IDData.CurrentSectorCapacity.ints.i1 = Hal4Sys_ATADataPortInW();//
 288   2      
 289   2              if(ATADevExt_IDData.CurrentSectorCapacity.u0 == 0)
 290   2              {
 291   3                  ATADevExt_IDData.NumberOfCurrentCylinders = ATADevExt_IDData.NumberOfCylinders;
 292   3                  ATADevExt_IDData.NumberOfCurrentHeads = ATADevExt_IDData.NumberOfHeads ;//INT16  55
 293   3                  ATADevExt_IDData.CurrentSectorsPerTrack = ATADevExt_IDData.SectorsPerTrack;//INT16  56
 294   3                  ATADevExt_IDData.CurrentSectorCapacity.u0 = (INT32)ATADevExt_IDData.NumberOfCurrentCylinders *
             - ATADevExt_IDData.NumberOfCurrentHeads * ATADevExt_IDData.CurrentSectorsPerTrack;
 295   3              }
 296   2              return(TRUE);
 297   2          }
 298   1          else
 299   1              return(FALSE);
 300   1      }
 301          
 302          
C51 COMPILER V7.06   HAL4ATA                                                               02/17/2004 14:42:23 PAGE 6   

 303          BOOLEAN
 304          Hal4ATA_IsLBAmode(void)
 305          {       Hal4ATA_DevReg_LBA = 1;
 306   1              return(Hal4ATA_DevReg_LBA);
 307   1      }
 308          
 309          
 310          BOOLEAN
 311          Hal4ATA_SetFeature(void)
 312          { /*  BOOLEAN retStatus = FALSE;
 313   1         Hal4Sys_ATAPortOutB(ATAREG4OUT_FEATURE,0x03);
 314   1         Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_COUNT, 0x08);
 315   1      
 316   1         Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,0);
 317   1         Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,0);
 318   1         Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,0);
 319   1      
 320   1         Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, 0xEF);
 321   1          while(TRUE)
 322   1          {
 323   1              if(Hal4ATA_WaitOnBusyNDrdy())
 324   1              {
 325   1                  retStatus = TRUE;
 326   1                  break;
 327   1              }
 328   1          }
 329   1         return retStatus;*/
 330   1         return TRUE;
 331   1      }
 332          
 333          
 334          /*
 335          //*************************************************************************
 336          //  Subroutines -- level 5 ATA transaction
 337          //*************************************************************************
 338          */
 339          BOOLEAN
 340          Hal4ATA_IdeHardReset(void)
 341          {
 342   1              //INT8 c;
 343   1          BOOLEAN retStatus = FALSE;
 344   1      
 345   1          ATA_RST_N = 0;
 346   1          Hal4Sys_WaitInUS(320); // >25 US
 347   1          ATA_RST_N = 1;
 348   1      
 349   1       //   for(c = 10; c != 0; c--)
 350   1              Hal4Sys_WaitInUS(50000); // 50MS
 351   1      
 352   1          if(Hal4ATA_SelDevice())
 353   1              {
 354   2      //          Hal4ATA_DevReg_DEV = FALSE;
 355   2       //        Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD,Hal4ATA_DevReg);
 356   2      //      }
 357   2      
 358   2          while(TRUE)
 359   2          {
 360   3              if(Hal4ATA_WaitOnBusyNDrdy())
 361   3              {
 362   4                  retStatus = TRUE;
 363   4                  break;
 364   4              }
C51 COMPILER V7.06   HAL4ATA                                                               02/17/2004 14:42:23 PAGE 7   

 365   3          }
 366   2              }
 367   1          return retStatus;
 368   1      }
 369          
 370          
 371          BOOLEAN
 372          Hal4ATA_FindIDEDevice(void)
 373          {
 374   1          INT8    c;
 375   1          ATABF_IsAttached = FALSE;
 376   1          Hal4ATA_DevReg_DEV = FALSE;
 377   1              if(Hal4ATA_IdeHardReset())
 378   1          {   Hal4ATA_SetFeature();
 379   2                  for ( c = 2; c != 0; c--, Hal4ATA_DevReg_DEV^=1 )
 380   2                  {   if(Hal4ATA_SelDevice())
 381   3                  {
 382   4                              if ( Hal4ATA_IssueIDEIdentify() )
 383   4                              {   ATABF_IsAttached = TRUE;
 384   5                          break;
 385   5                              }
 386   4                  }
 387   3                  }
 388   2      
 389   2              if(ATABF_IsAttached)
 390   2              {       Hal4ATA_IsLBAmode();// 设为LAB模式
 391   3              } // IDE HD is found
 392   2          } // IDE Reset OK
 393   1          return ATABF_IsAttached;
 394   1      } /*end Hal4ATA_FindIDEDevice()*/
 395          
 396          
 397          BOOLEAN
 398          Hal4ATA_ReadWriteSetting(void)
 399          {
 400   1          BOOLEAN retStatus = FALSE;
 401   1          /*
 402   1              // Select device  .
 403   1              */
 404   1              if(Hal4ATA_SelDevice())
 405   1          {   //Assume Sector Counter <256
 406   2              Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_COUNT, RBC_CDB.RbcCdb_Read.XferLength_0);
 407   2                  /* IN LBA mode */
 408   2                      if( ATABF_IDEXfer_dir )    // ATABF_Xfer_dir==1 Read(from Dev to Host)
 409   2                  {
 410   3                              Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_0);
 411   3                              Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_1);
 412   3                              Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_2);
 413   3                      Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD, (RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_3&0x0f) | Hal4AT
             -A_DevReg );
 414   3                      Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, IDE_COMMAND_READ);
 415   3                      }
 416   2                      else
 417   2                      {       // write command.
 418   3                          Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_0);
 419   3                          Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_1);
 420   3                          Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_2);
 421   3                  Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD, (RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_3&0x0f) | Hal
             -4ATA_DevReg );
 422   3                      Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND,IDE_COMMAND_WRITE);
 423   3                      }
 424   2              }
C51 COMPILER V7.06   HAL4ATA                                                               02/17/2004 14:42:23 PAGE 8   

 425   1              retStatus = Hal4ATA_WaitOnBusyNDrq();
 426   1          return retStatus;
 427   1      } /* end Hal4ATA_ReadWriteSetting()*/
 428          
 429          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    584    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       7
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -