| /** @file | |
| Include file for ISA Floppy Driver | |
| Copyright (c) 2006 - 2009, Intel Corporation.<BR> | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef _ISA_FLOPPY_H_ | |
| #define _ISA_FLOPPY_H_ | |
| #include <Uefi.h> | |
| #include <Protocol/BlockIo.h> | |
| #include <Protocol/IsaIo.h> | |
| #include <Protocol/DevicePath.h> | |
| #include <Guid/StatusCodeDataTypeId.h> | |
| #include <Library/TimerLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/UefiDriverEntryPoint.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/UefiLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/ReportStatusCodeLib.h> | |
| #include <Library/PcdLib.h> | |
| extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver; | |
| #define STALL_1_SECOND 1000000 | |
| #define STALL_1_MSECOND 1000 | |
| #define DATA_IN 1 | |
| #define DATA_OUT 0 | |
| #define READ 0 | |
| #define WRITE 1 | |
| // | |
| // Internal Data Structures | |
| // | |
| #define FDC_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('F', 'B', 'I', 'O') | |
| #define FLOPPY_CONTROLLER_CONTEXT_SIGNATURE SIGNATURE_32 ('F', 'D', 'C', 'C') | |
| typedef enum { | |
| FdcDisk0 = 0, | |
| FdcDisk1 = 1, | |
| FdcMaxDisk = 2 | |
| } EFI_FDC_DISK; | |
| typedef struct { | |
| UINT32 Signature; | |
| LIST_ENTRY Link; | |
| BOOLEAN FddResetPerformed; | |
| EFI_STATUS FddResetStatus; | |
| BOOLEAN NeedRecalibrate; | |
| UINT8 NumberOfDrive; | |
| UINT16 BaseAddress; | |
| } FLOPPY_CONTROLLER_CONTEXT; | |
| typedef struct { | |
| UINTN Signature; | |
| EFI_HANDLE Handle; | |
| EFI_BLOCK_IO_PROTOCOL BlkIo; | |
| EFI_BLOCK_IO_MEDIA BlkMedia; | |
| EFI_ISA_IO_PROTOCOL *IsaIo; | |
| UINT16 BaseAddress; | |
| EFI_FDC_DISK Disk; | |
| UINT8 PresentCylinderNumber; | |
| UINT8 *Cache; | |
| EFI_EVENT Event; | |
| EFI_UNICODE_STRING_TABLE *ControllerNameTable; | |
| FLOPPY_CONTROLLER_CONTEXT *ControllerState; | |
| EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
| } FDC_BLK_IO_DEV; | |
| #include "ComponentName.h" | |
| #define FDD_BLK_IO_FROM_THIS(a) CR (a, FDC_BLK_IO_DEV, BlkIo, FDC_BLK_IO_DEV_SIGNATURE) | |
| #define FLOPPY_CONTROLLER_FROM_LIST_ENTRY(a) \ | |
| CR (a, \ | |
| FLOPPY_CONTROLLER_CONTEXT, \ | |
| Link, \ | |
| FLOPPY_CONTROLLER_CONTEXT_SIGNATURE \ | |
| ) | |
| #define DISK_1440K_EOT 0x12 | |
| #define DISK_1440K_GPL 0x1b | |
| #define DISK_1440K_DTL 0xff | |
| #define DISK_1440K_NUMBER 0x02 | |
| #define DISK_1440K_MAXTRACKNUM 0x4f | |
| #define DISK_1440K_BYTEPERSECTOR 512 | |
| typedef struct { | |
| UINT8 CommandCode; | |
| UINT8 DiskHeadSel; | |
| UINT8 Cylinder; | |
| UINT8 Head; | |
| UINT8 Sector; | |
| UINT8 Number; | |
| UINT8 EndOfTrack; | |
| UINT8 GapLength; | |
| UINT8 DataLength; | |
| } FDD_COMMAND_PACKET1; | |
| typedef struct { | |
| UINT8 CommandCode; | |
| UINT8 DiskHeadSel; | |
| } FDD_COMMAND_PACKET2; | |
| typedef struct { | |
| UINT8 CommandCode; | |
| UINT8 SrtHut; | |
| UINT8 HltNd; | |
| } FDD_SPECIFY_CMD; | |
| typedef struct { | |
| UINT8 CommandCode; | |
| UINT8 DiskHeadSel; | |
| UINT8 NewCylinder; | |
| } FDD_SEEK_CMD; | |
| typedef struct { | |
| UINT8 CommandCode; | |
| UINT8 DiskHeadSel; | |
| UINT8 Cylinder; | |
| UINT8 Head; | |
| UINT8 Sector; | |
| UINT8 EndOfTrack; | |
| UINT8 GapLength; | |
| UINT8 ScanTestPause; | |
| } FDD_SCAN_CMD; | |
| typedef struct { | |
| UINT8 Status0; | |
| UINT8 Status1; | |
| UINT8 Status2; | |
| UINT8 Cylinder; | |
| UINT8 Head; | |
| UINT8 Sector; | |
| UINT8 Number; | |
| } FDD_RESULT_PACKET; | |
| // | |
| // FDC Registers | |
| // | |
| // | |
| // Digital Output Register address offset | |
| // | |
| #define FDC_REGISTER_DOR 2 | |
| // | |
| // Main Status Register address offset | |
| // | |
| #define FDC_REGISTER_MSR 4 | |
| // | |
| // Data Register address offset | |
| // | |
| #define FDC_REGISTER_DTR 5 | |
| // | |
| // Configuration Control Register(data rate select) address offset | |
| // | |
| #define FDC_REGISTER_CCR 7 | |
| // | |
| // Digital Input Register(diskchange) address offset | |
| // | |
| #define FDC_REGISTER_DIR 7 | |
| // | |
| // FDC Register Bit Definitions | |
| // | |
| // | |
| // Digital Out Register(WO) | |
| // | |
| // | |
| // Select Drive: 0=A 1=B | |
| // | |
| #define SELECT_DRV BIT0 | |
| // | |
| // Reset FDC | |
| // | |
| #define RESET_FDC BIT2 | |
| // | |
| // Enable Int & DMA | |
| // | |
| #define INT_DMA_ENABLE BIT3 | |
| // | |
| // Turn On Drive A Motor | |
| // | |
| #define DRVA_MOTOR_ON BIT4 | |
| // | |
| // Turn On Drive B Motor | |
| // | |
| #define DRVB_MOTOR_ON BIT5 | |
| // | |
| // Main Status Register(RO) | |
| // | |
| // | |
| // Drive A Busy | |
| // | |
| #define MSR_DAB BIT0 | |
| // | |
| // Drive B Busy | |
| // | |
| #define MSR_DBB BIT1 | |
| // | |
| // FDC Busy | |
| // | |
| #define MSR_CB BIT4 | |
| // | |
| // Non-DMA Mode | |
| // | |
| #define MSR_NDM BIT5 | |
| // | |
| // Data Input/Output | |
| // | |
| #define MSR_DIO BIT6 | |
| // | |
| // Request For Master | |
| // | |
| #define MSR_RQM BIT7 | |
| // | |
| // Configuration Control Register(WO) | |
| // | |
| // | |
| // Data Rate select | |
| // | |
| #define CCR_DRC (BIT0 | BIT1) | |
| // | |
| // Digital Input Register(RO) | |
| // | |
| // | |
| // Disk change line | |
| // | |
| #define DIR_DCL BIT7 | |
| // | |
| // #define CCR_DCL BIT7 // Diskette change | |
| // | |
| // 500K | |
| // | |
| #define DRC_500KBS 0x0 | |
| // | |
| // 300K | |
| // | |
| #define DRC_300KBS 0x01 | |
| // | |
| // 250K | |
| // | |
| #define DRC_250KBS 0x02 | |
| // | |
| // FDC Command Code | |
| // | |
| #define READ_DATA_CMD 0x06 | |
| #define WRITE_DATA_CMD 0x05 | |
| #define WRITE_DEL_DATA_CMD 0x09 | |
| #define READ_DEL_DATA_CMD 0x0C | |
| #define READ_TRACK_CMD 0x02 | |
| #define READ_ID_CMD 0x0A | |
| #define FORMAT_TRACK_CMD 0x0D | |
| #define SCAN_EQU_CMD 0x11 | |
| #define SCAN_LOW_EQU_CMD 0x19 | |
| #define SCAN_HIGH_EQU_CMD 0x1D | |
| #define SEEK_CMD 0x0F | |
| #define RECALIBRATE_CMD 0x07 | |
| #define SENSE_INT_STATUS_CMD 0x08 | |
| #define SPECIFY_CMD 0x03 | |
| #define SENSE_DRV_STATUS_CMD 0x04 | |
| // | |
| // CMD_MT: Multi_Track Selector | |
| // when set , this flag selects the multi-track operating mode. | |
| // In this mode, the FDC treats a complete cylinder under head0 and 1 | |
| // as a single track | |
| // | |
| #define CMD_MT BIT7 | |
| // | |
| // CMD_MFM: MFM/FM Mode Selector | |
| // A one selects the double density(MFM) mode | |
| // A zero selects single density (FM) mode | |
| // | |
| #define CMD_MFM BIT6 | |
| // | |
| // CMD_SK: Skip Flag | |
| // When set to 1, sectors containing a deleted data address mark will | |
| // automatically be skipped during the execution of Read Data. | |
| // When set to 0, the sector is read or written the same as the read and | |
| // write commands. | |
| // | |
| #define CMD_SK BIT5 | |
| // | |
| // FDC Status Register Bit Definitions | |
| // | |
| // | |
| // Status Register 0 | |
| // | |
| // | |
| // Interrupt Code | |
| // | |
| #define STS0_IC (BIT7 | BIT6) | |
| // | |
| // Seek End: the FDC completed a seek or recalibrate command | |
| // | |
| #define STS0_SE BIT5 | |
| // | |
| // Equipment Check | |
| // | |
| #define STS0_EC BIT4 | |
| // | |
| // Not Ready(unused), this bit is always 0 | |
| // | |
| #define STS0_NR BIT3 | |
| // | |
| // Head Address: the current head address | |
| // | |
| #define STS0_HA BIT2 | |
| // | |
| // STS0_US1 & STS0_US0: Drive Select(the current selected drive) | |
| // | |
| // | |
| // Unit Select1 | |
| // | |
| #define STS0_US1 BIT1 | |
| // | |
| // Unit Select0 | |
| // | |
| #define STS0_US0 BIT0 | |
| // | |
| // Status Register 1 | |
| // | |
| // | |
| // End of Cylinder | |
| // | |
| #define STS1_EN BIT7 | |
| // | |
| // BIT6 is unused | |
| // | |
| // | |
| // Data Error: The FDC detected a CRC error in either the ID field or | |
| // data field of a sector | |
| // | |
| #define STS1_DE BIT5 | |
| // | |
| // Overrun/Underrun: Becomes set if FDC does not receive CPU or DMA service | |
| // within the required time interval | |
| // | |
| #define STS1_OR BIT4 | |
| // | |
| // BIT3 is unused | |
| // | |
| // | |
| // No data | |
| // | |
| #define STS1_ND BIT2 | |
| // | |
| // Not Writable | |
| // | |
| #define STS1_NW BIT1 | |
| // | |
| // Missing Address Mark | |
| // | |
| #define STS1_MA BIT0 | |
| // | |
| // Control Mark | |
| // | |
| #define STS2_CM BIT6 | |
| // | |
| // Data Error in Data Field: The FDC detected a CRC error in the data field | |
| // | |
| #define STS2_DD BIT5 | |
| // | |
| // Wrong Cylinder: The track address from sector ID field is different from | |
| // the track address maintained inside FDC | |
| // | |
| #define STS2_WC BIT4 | |
| // | |
| // Bad Cylinder | |
| // | |
| #define STS2_BC BIT1 | |
| // | |
| // Missing Address Mark in Data Field | |
| // | |
| #define STS2_MD BIT0 | |
| // | |
| // Write Protected | |
| // | |
| #define STS3_WP BIT6 | |
| // | |
| // Track 0 | |
| // | |
| #define STS3_T0 BIT4 | |
| // | |
| // Head Address | |
| // | |
| #define STS3_HD BIT2 | |
| // | |
| // STS3_US1 & STS3_US0 : Drive Select | |
| // | |
| #define STS3_US1 BIT1 | |
| #define STS3_US0 BIT0 | |
| // | |
| // Status Register 0 Interrupt Code Description | |
| // | |
| // | |
| // Normal Termination of Command | |
| // | |
| #define IC_NT 0x0 | |
| // | |
| // Abnormal Termination of Command | |
| // | |
| #define IC_AT 0x40 | |
| // | |
| // Invalid Command | |
| // | |
| #define IC_IC 0x80 | |
| // | |
| // Abnormal Termination caused by Polling | |
| // | |
| #define IC_ATRC 0xC0 | |
| // | |
| // EFI Driver Binding Protocol Functions | |
| // | |
| /** | |
| Test controller is a floppy disk drive device | |
| @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. | |
| @param[in] Controller The handle of the controller to test. | |
| @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. | |
| @retval EFI_SUCCESS The device is supported by this driver. | |
| @retval EFI_ALREADY_STARTED The device is already being managed by this driver. | |
| @retval EFI_ACCESS_DENIED The device is already being managed by a different driver | |
| or an application that requires exclusive access. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FdcControllerDriverSupported ( | |
| IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
| IN EFI_HANDLE Controller, | |
| IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath | |
| ); | |
| /** | |
| Start this driver on Controller. | |
| @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. | |
| @param[in] ControllerHandle The handle of the controller to start. This handle | |
| must support a protocol interface that supplies | |
| an I/O abstraction to the driver. | |
| @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. | |
| This parameter is ignored by device drivers, and is optional for bus drivers. | |
| @retval EFI_SUCCESS The device was started. | |
| @retval EFI_DEVICE_ERROR The device could not be started due to a device error. | |
| Currently not implemented. | |
| @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. | |
| @retval Others The driver failded to start the device. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FdcControllerDriverStart ( | |
| IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
| IN EFI_HANDLE Controller, | |
| IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath | |
| ); | |
| /** | |
| Stop this driver on ControllerHandle. | |
| @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. | |
| @param[in] ControllerHandle A handle to the device being stopped. The handle must | |
| support a bus specific I/O protocol for the driver | |
| to use to stop the device. | |
| @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer. | |
| @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL | |
| if NumberOfChildren is 0. | |
| @retval EFI_SUCCESS The device was stopped. | |
| @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FdcControllerDriverStop ( | |
| IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
| IN EFI_HANDLE Controller, | |
| IN UINTN NumberOfChildren, | |
| IN EFI_HANDLE *ChildHandleBuffer | |
| ); | |
| // | |
| // EFI Block I/O Protocol Functions | |
| // | |
| /** | |
| Reset the Floppy Logic Drive, call the FddReset function. | |
| @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface | |
| @param ExtendedVerification BOOLEAN: Indicate that the driver may perform a more | |
| exhaustive verification operation of the device during | |
| reset, now this par is ignored in this driver | |
| @retval EFI_SUCCESS: The Floppy Logic Drive is reset | |
| @retval EFI_DEVICE_ERROR: The Floppy Logic Drive is not functioning correctly | |
| and can not be reset | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FdcReset ( | |
| IN EFI_BLOCK_IO_PROTOCOL *This, | |
| IN BOOLEAN ExtendedVerification | |
| ); | |
| /** | |
| Flush block via fdd controller. | |
| @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface | |
| @return EFI_SUCCESS | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FddFlushBlocks ( | |
| IN EFI_BLOCK_IO_PROTOCOL *This | |
| ); | |
| /** | |
| Read the requested number of blocks from the device. | |
| @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface | |
| @param MediaId UINT32: The media id that the read request is for | |
| @param Lba EFI_LBA: The starting logic block address to read from on the device | |
| @param BufferSize UINTN: The size of the Buffer in bytes | |
| @param Buffer VOID *: A pointer to the destination buffer for the data | |
| @retval EFI_SUCCESS: The data was read correctly from the device | |
| @retval EFI_DEVICE_ERROR:The device reported an error while attempting to perform | |
| the read operation | |
| @retval EFI_NO_MEDIA: There is no media in the device | |
| @retval EFI_MEDIA_CHANGED: The MediaId is not for the current media | |
| @retval EFI_BAD_BUFFER_SIZE: The BufferSize parameter is not a multiple of the | |
| intrinsic block size of the device | |
| @retval EFI_INVALID_PARAMETER:The read request contains LBAs that are not valid, | |
| or the buffer is not on proper alignment | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FddReadBlocks ( | |
| IN EFI_BLOCK_IO_PROTOCOL *This, | |
| IN UINT32 MediaId, | |
| IN EFI_LBA Lba, | |
| IN UINTN BufferSize, | |
| OUT VOID *Buffer | |
| ); | |
| /** | |
| Write a specified number of blocks to the device. | |
| @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface | |
| @param MediaId UINT32: The media id that the write request is for | |
| @param Lba EFI_LBA: The starting logic block address to be written | |
| @param BufferSize UINTN: The size in bytes in Buffer | |
| @param Buffer VOID *: A pointer to the source buffer for the data | |
| @retval EFI_SUCCESS: The data were written correctly to the device | |
| @retval EFI_WRITE_PROTECTED: The device can not be written to | |
| @retval EFI_NO_MEDIA: There is no media in the device | |
| @retval EFI_MEDIA_CHANGED: The MediaId is not for the current media | |
| @retval EFI_DEVICE_ERROR: The device reported an error while attempting to perform | |
| the write operation | |
| @retval EFI_BAD_BUFFER_SIZE: The BufferSize parameter is not a multiple of the | |
| intrinsic block size of the device | |
| @retval EFI_INVALID_PARAMETER:The write request contains LBAs that are not valid, | |
| or the buffer is not on proper alignment | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FddWriteBlocks ( | |
| IN EFI_BLOCK_IO_PROTOCOL *This, | |
| IN UINT32 MediaId, | |
| IN EFI_LBA Lba, | |
| IN UINTN BufferSize, | |
| IN VOID *Buffer | |
| ); | |
| // | |
| // Prototypes of internal functions | |
| // | |
| /** | |
| Detect the floppy drive is presented or not. | |
| @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS Drive is presented | |
| @retval EFI_NOT_FOUND Drive is not presented | |
| **/ | |
| EFI_STATUS | |
| DiscoverFddDevice ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Do recalibrate and see the drive is presented or not. | |
| Set the media parameters. | |
| @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV | |
| @return the drive is presented or not | |
| **/ | |
| EFI_STATUS | |
| FddIdentify ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Reset the Floppy Logic Drive. | |
| @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: The Floppy Logic Drive is reset | |
| @retval EFI_DEVICE_ERROR: The Floppy Logic Drive is not functioning correctly and | |
| can not be reset | |
| **/ | |
| EFI_STATUS | |
| FddReset ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Turn the drive's motor on. | |
| The drive's motor must be on before any command can be executed. | |
| @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: Turn the drive's motor on successfully | |
| @retval EFI_DEVICE_ERROR: The drive is busy, so can not turn motor on | |
| @retval EFI_INVALID_PARAMETER: Fail to Set timer(Cancel timer) | |
| **/ | |
| EFI_STATUS | |
| MotorOn ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Set a Timer and when Timer goes off, turn the motor off. | |
| @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: Set the Timer successfully | |
| @retval EFI_INVALID_PARAMETER: Fail to Set the timer | |
| **/ | |
| EFI_STATUS | |
| MotorOff ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Detect the disk in the drive is changed or not. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: No disk media change | |
| @retval EFI_DEVICE_ERROR: Fail to do the recalibrate or seek operation | |
| @retval EFI_NO_MEDIA: No disk in the drive | |
| @retval EFI_MEDIA_CHANGED: There is a new disk in the drive | |
| **/ | |
| EFI_STATUS | |
| DisketChanged ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Do the Specify command, this command sets DMA operation | |
| and the initial values for each of the three internal | |
| times: HUT, SRT and HLT. | |
| @param FdcDev Pointer to instance of FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: Execute the Specify command successfully | |
| @retval EFI_DEVICE_ERROR: Fail to execute the command | |
| **/ | |
| EFI_STATUS | |
| Specify ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Set the head of floppy drive to track 0. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: Execute the Recalibrate operation successfully | |
| @retval EFI_DEVICE_ERROR: Fail to execute the Recalibrate operation | |
| **/ | |
| EFI_STATUS | |
| Recalibrate ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Set the head of floppy drive to the new cylinder. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param Lba EFI_LBA : The logic block address want to seek | |
| @retval EFI_SUCCESS: Execute the Seek operation successfully | |
| @retval EFI_DEVICE_ERROR: Fail to execute the Seek operation | |
| **/ | |
| EFI_STATUS | |
| Seek ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN EFI_LBA Lba | |
| ); | |
| /** | |
| Do the Sense Interrupt Status command, this command resets the interrupt signal. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param StatusRegister0 UINT8 *: Be used to save Status Register 0 read from FDC | |
| @param PresentCylinderNumber UINT8 *: Be used to save present cylinder number | |
| read from FDC | |
| @retval EFI_SUCCESS: Execute the Sense Interrupt Status command successfully | |
| @retval EFI_DEVICE_ERROR: Fail to execute the command | |
| **/ | |
| EFI_STATUS | |
| SenseIntStatus ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN OUT UINT8 *StatusRegister0, | |
| IN OUT UINT8 *PresentCylinderNumber | |
| ); | |
| /** | |
| Do the Sense Drive Status command. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param Lba EFI_LBA : Logic block address | |
| @retval EFI_SUCCESS: Execute the Sense Drive Status command successfully | |
| @retval EFI_DEVICE_ERROR: Fail to execute the command | |
| @retval EFI_WRITE_PROTECTED:The disk is write protected | |
| **/ | |
| EFI_STATUS | |
| SenseDrvStatus ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN EFI_LBA Lba | |
| ); | |
| /** | |
| Update the disk media properties and if necessary reinstall Block I/O interface. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS: Do the operation successfully | |
| @retval EFI_DEVICE_ERROR: Fail to the operation | |
| **/ | |
| EFI_STATUS | |
| DetectMedia ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Set the data rate and so on. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @retval EFI_SUCCESS success to set the data rate | |
| **/ | |
| EFI_STATUS | |
| Setup ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Read or Write a number of blocks in the same cylinder. | |
| @param FdcDev A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param HostAddress device address | |
| @param Lba The starting logic block address to read from on the device | |
| @param NumberOfBlocks The number of block wanted to be read or write | |
| @param Read Operation type: read or write | |
| @retval EFI_SUCCESS Success operate | |
| **/ | |
| EFI_STATUS | |
| ReadWriteDataSector ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN VOID *HostAddress, | |
| IN EFI_LBA Lba, | |
| IN UINTN NumberOfBlocks, | |
| IN BOOLEAN Read | |
| ); | |
| /** | |
| Fill in FDD command's parameter. | |
| @param FdcDev Pointer to instance of FDC_BLK_IO_DEV | |
| @param Lba The starting logic block address to read from on the device | |
| @param Command FDD command | |
| **/ | |
| VOID | |
| FillPara ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN EFI_LBA Lba, | |
| IN FDD_COMMAND_PACKET1 *Command | |
| ); | |
| /** | |
| Read result byte from Data Register of FDC. | |
| @param FdcDev Pointer to instance of FDC_BLK_IO_DEV | |
| @param Pointer Buffer to store the byte read from FDC | |
| @retval EFI_SUCCESS Read result byte from FDC successfully | |
| @retval EFI_DEVICE_ERROR The FDC is not ready to be read | |
| **/ | |
| EFI_STATUS | |
| DataInByte ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| OUT UINT8 *Pointer | |
| ); | |
| /** | |
| Write command byte to Data Register of FDC. | |
| @param FdcDev Pointer to instance of FDC_BLK_IO_DEV | |
| @param Pointer Be used to save command byte written to FDC | |
| @retval EFI_SUCCESS: Write command byte to FDC successfully | |
| @retval EFI_DEVICE_ERROR: The FDC is not ready to be written | |
| **/ | |
| EFI_STATUS | |
| DataOutByte ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN UINT8 *Pointer | |
| ); | |
| /** | |
| Detect the specified floppy logic drive is busy or not within a period of time. | |
| @param FdcDev Indicate it is drive A or drive B | |
| @param TimeoutInSeconds the time period for waiting | |
| @retval EFI_SUCCESS: The drive and command are not busy | |
| @retval EFI_TIMEOUT: The drive or command is still busy after a period time that | |
| set by TimeoutInSeconds | |
| **/ | |
| EFI_STATUS | |
| FddWaitForBSYClear ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN UINTN TimeoutInSeconds | |
| ); | |
| /** | |
| Determine whether FDC is ready to write or read. | |
| @param FdcDev Pointer to instance of FDC_BLK_IO_DEV | |
| @param Dio BOOLEAN: Indicate the FDC is waiting to write or read | |
| @param TimeoutInSeconds UINTN: The time period for waiting | |
| @retval EFI_SUCCESS: FDC is ready to write or read | |
| @retval EFI_NOT_READY: FDC is not ready within the specified time period | |
| **/ | |
| EFI_STATUS | |
| FddDRQReady ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN BOOLEAN Dio, | |
| IN UINTN TimeoutInSeconds | |
| ); | |
| /** | |
| Set FDC control structure's attribute according to result. | |
| @param Result Point to result structure | |
| @param FdcDev FDC control structure | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_SUCCESS - GC_TODO: Add description for return value | |
| **/ | |
| EFI_STATUS | |
| CheckResult ( | |
| IN FDD_RESULT_PACKET *Result, | |
| IN OUT FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| /** | |
| Check the drive status information. | |
| @param StatusRegister3 the value of Status Register 3 | |
| @retval EFI_SUCCESS The disk is not write protected | |
| @retval EFI_WRITE_PROTECTED: The disk is write protected | |
| **/ | |
| EFI_STATUS | |
| CheckStatus3 ( | |
| IN UINT8 StatusRegister3 | |
| ); | |
| /** | |
| Calculate the number of block in the same cylinder according to Lba. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param Lba EFI_LBA: The starting logic block address | |
| @param NumberOfBlocks UINTN: The number of blocks | |
| @return The number of blocks in the same cylinder which the starting | |
| logic block address is Lba | |
| **/ | |
| UINTN | |
| GetTransferBlockCount ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN EFI_LBA Lba, | |
| IN UINTN NumberOfBlocks | |
| ); | |
| /** | |
| When the Timer(2s) off, turn the drive's motor off. | |
| @param Event EFI_EVENT: Event(the timer) whose notification function is being | |
| invoked | |
| @param Context VOID *: Pointer to the notification function's context | |
| **/ | |
| VOID | |
| EFIAPI | |
| FddTimerProc ( | |
| IN EFI_EVENT Event, | |
| IN VOID *Context | |
| ); | |
| /** | |
| Read I/O port for FDC. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param Offset The offset address of port | |
| **/ | |
| UINT8 | |
| FdcReadPort ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN UINT32 Offset | |
| ); | |
| /** | |
| Write I/O port for FDC. | |
| @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV | |
| @param Offset The offset address of port | |
| @param Data Value written to port | |
| **/ | |
| VOID | |
| FdcWritePort ( | |
| IN FDC_BLK_IO_DEV *FdcDev, | |
| IN UINT32 Offset, | |
| IN UINT8 Data | |
| ); | |
| /** | |
| Read or Write a number of blocks to floppy device. | |
| @param This Pointer to instance of EFI_BLOCK_IO_PROTOCOL | |
| @param MediaId The media id of read/write request | |
| @param Lba The starting logic block address to read from on the device | |
| @param BufferSize The size of the Buffer in bytes | |
| @param Operation - GC_TODO: add argument description | |
| @param Buffer - GC_TODO: add argument description | |
| @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value | |
| @retval EFI_SUCCESS - GC_TODO: Add description for return value | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_NO_MEDIA - GC_TODO: Add description for return value | |
| @retval EFI_MEDIA_CHANGED - GC_TODO: Add description for return value | |
| @retval EFI_WRITE_PROTECTED - GC_TODO: Add description for return value | |
| @retval EFI_BAD_BUFFER_SIZE - GC_TODO: Add description for return value | |
| @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value | |
| @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value | |
| @retval EFI_SUCCESS - GC_TODO: Add description for return value | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value | |
| @retval EFI_SUCCESS - GC_TODO: Add description for return value | |
| **/ | |
| EFI_STATUS | |
| FddReadWriteBlocks ( | |
| IN EFI_BLOCK_IO_PROTOCOL *This, | |
| IN UINT32 MediaId, | |
| IN EFI_LBA Lba, | |
| IN UINTN BufferSize, | |
| IN BOOLEAN Operation, | |
| OUT VOID *Buffer | |
| ); | |
| /** | |
| Common interface for free cache. | |
| @param FdcDev Pointer of FDC_BLK_IO_DEV instance | |
| **/ | |
| VOID | |
| FdcFreeCache ( | |
| IN FDC_BLK_IO_DEV *FdcDev | |
| ); | |
| #endif | |