mirror of https://github.com/acidanthera/audk.git
1103 lines
27 KiB
C
1103 lines
27 KiB
C
/**@file
|
|
Include for ISA Floppy Driver
|
|
Define the data structure and so on
|
|
|
|
Copyright (c) 2006 - 2007, 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 <PiDxe.h>
|
|
#include <FrameworkPei.h>
|
|
|
|
#include <Protocol/BlockIo.h>
|
|
#include <Protocol/IsaIo.h>
|
|
#include <Protocol/DevicePath.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>
|
|
//
|
|
// Driver Binding Externs
|
|
//
|
|
extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver;
|
|
extern EFI_COMPONENT_NAME_PROTOCOL gIsaFloppyComponentName;
|
|
extern EFI_COMPONENT_NAME2_PROTOCOL gIsaFloppyComponentName2;
|
|
|
|
//
|
|
// define some value
|
|
//
|
|
#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 EFI_SIGNATURE_32 ('F', 'B', 'I', 'O')
|
|
#define FLOPPY_CONTROLLER_CONTEXT_SIGNATURE EFI_SIGNATURE_32 ('F', 'D', 'C', 'C')
|
|
|
|
typedef enum {
|
|
FDC_DISK0 = 0,
|
|
FDC_DISK1 = 1,
|
|
FDC_MAX_DISK= 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 C;
|
|
UINT8 H;
|
|
UINT8 S;
|
|
UINT8 Number;
|
|
} FDD_RESULT_PACKET;
|
|
|
|
//
|
|
// FDC Registers
|
|
//
|
|
//
|
|
// 0x3F2 Digital Output Register
|
|
//
|
|
#define FDC_REGISTER_DOR 2
|
|
|
|
//
|
|
// 0x3F4 Main Status Register
|
|
//
|
|
#define FDC_REGISTER_MSR 4
|
|
|
|
//
|
|
// 0x3F5 Data Register
|
|
//
|
|
#define FDC_REGISTER_DTR 5
|
|
|
|
//
|
|
// 0x3F7 Configuration Control Register(data rate select)
|
|
//
|
|
#define FDC_REGISTER_CCR 7
|
|
|
|
//
|
|
// 0x3F7 Digital Input Register(diskchange)
|
|
//
|
|
#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
|
|
|
|
//
|
|
// Global Variables
|
|
//
|
|
extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver;
|
|
|
|
//
|
|
// EFI Driver Binding Protocol Functions
|
|
//
|
|
/**
|
|
Test controller is a Floppy Disk Controller
|
|
|
|
@param This Pointer of EFI_DRIVER_BINDING_PROTOCOL
|
|
@param Controller driver's controller
|
|
@param RemainingDevicePath children device path
|
|
|
|
@retval EFI_UNSUPPORTED controller is not floppy disk
|
|
@retval EFI_SUCCESS controller is floppy disk
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FdcControllerDriverSupported (
|
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
|
IN EFI_HANDLE Controller,
|
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
|
);
|
|
|
|
/**
|
|
Create floppy control instance on controller.
|
|
|
|
@param This Pointer of EFI_DRIVER_BINDING_PROTOCOL
|
|
@param Controller driver controller handle
|
|
@param RemainingDevicePath Children's device path
|
|
|
|
@retval whether success to create floppy control instance.
|
|
**/
|
|
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. Support stoping any child handles
|
|
created by this driver.
|
|
|
|
@param This Protocol instance pointer.
|
|
@param Controller Handle of device to stop driver on
|
|
@param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
|
|
children is zero stop the entire bus driver.
|
|
@param ChildHandleBuffer List of Child Handles to Stop.
|
|
|
|
@retval EFI_SUCCESS This driver is removed ControllerHandle
|
|
@retval other This driver was not removed from this device
|
|
|
|
**/
|
|
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 UINT8 *: Be used to save result 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,
|
|
IN 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
|
|
);
|
|
|
|
/**
|
|
|
|
Routine Description: 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
|
|
|