/// <summary> /// Perform disk software reset /// </summary> /// <returns>Error code</returns> DWORD PhysicalDisk::Reset() { DWORD err = SendATACommand( IDE_COMMAND_SLEEP ); if (err) return err; return SendATACommand( IDE_COMMAND_ATAPI_RESET ); }
/** IDENTIFY_DEVICE command @param CardData Pointer to CARD_DATA. @retval EFI_SUCCESS Success @retval EFI_DEVICE_ERROR Hardware Error @retval EFI_INVALID_PARAMETER Parameter is error @retval EFI_NO_MEDIA No media @retval EFI_MEDIA_CHANGED Media Change @retval EFI_BAD_BUFFER_SIZE Buffer size is bad **/ EFI_STATUS IndentifyDevice ( IN CARD_DATA *CardData ) { EFI_STATUS Status; ZeroMem (&CardData->TaskFile, sizeof (TASK_FILE)); // //The host only supports nIEN = 0 // CardData->TaskFile.Command_Status = IDENTIFY_DEVICE; Status = SendATACommand ( CardData, &CardData->TaskFile, FALSE, (UINT8*)&(CardData->IndentifyDeviceData), 1 ); return Status; }
/** WRITE_DMA_EXT command @param CardData Pointer to CARD_DATA. @param LBA The starting logical block address to read from on the device. @param Buffer A pointer to the destination buffer for the data. The caller is responsible for either having implicit or explicit ownership of the buffer. @param SectorCount Size in 512 bytes unit. @retval EFI_SUCCESS Success @retval EFI_DEVICE_ERROR Hardware Error @retval EFI_INVALID_PARAMETER Parameter is error @retval EFI_NO_MEDIA No media @retval EFI_MEDIA_CHANGED Media Change @retval EFI_BAD_BUFFER_SIZE Buffer size is bad **/ EFI_STATUS WriteDMAExt ( IN CARD_DATA *CardData, IN EFI_LBA LBA, IN UINT8 *Buffer, IN UINT16 SectorCount ) { EFI_STATUS Status; ZeroMem (&CardData->TaskFile, sizeof (TASK_FILE)); // //The host only supports nIEN = 0 // CardData->TaskFile.Command_Status = WRITE_DMA_EXT; CardData->TaskFile.SectorCount = (UINT8)SectorCount; CardData->TaskFile.SectorCount_Exp = (UINT8)(SectorCount >> 8); CardData->TaskFile.LBALow = (UINT8)LBA; CardData->TaskFile.LBAMid = (UINT8)RShiftU64(LBA, 8); CardData->TaskFile.LBAHigh = (UINT8)RShiftU64(LBA, 16); CardData->TaskFile.LBALow_Exp = (UINT8)RShiftU64(LBA, 24); CardData->TaskFile.LBAMid_Exp = (UINT8)RShiftU64(LBA, 32); CardData->TaskFile.LBAHigh_Exp = (UINT8)RShiftU64(LBA, 40); Status = SendATACommand ( CardData, &CardData->TaskFile, TRUE, Buffer, SectorCount ); return Status; }
/** STANDBY_IMMEDIATE command @param CardData Pointer to CARD_DATA. @retval EFI_SUCCESS Success @retval EFI_DEVICE_ERROR Hardware Error @retval EFI_INVALID_PARAMETER Parameter is error @retval EFI_NO_MEDIA No media @retval EFI_MEDIA_CHANGED Media Change @retval EFI_BAD_BUFFER_SIZE Buffer size is bad **/ EFI_STATUS StandByImmediate ( IN CARD_DATA *CardData ) { EFI_STATUS Status; ZeroMem (&CardData->TaskFile, sizeof (TASK_FILE)); // //The host only supports nIEN = 0 // CardData->TaskFile.Command_Status = STANDBY_IMMEDIATE; Status = SendATACommand ( CardData, &CardData->TaskFile, FALSE, NULL, 0 ); return Status; }
/// <summary> /// Put device into sleep power state /// </summary> /// <returns>Error code</returns> DWORD PhysicalDisk::Sleep() { return SendATACommand( IDE_COMMAND_SLEEP ); }