2 Include for ISA Floppy Driver
3 Define the data structure and so on
5 Copyright (c) 2006 - 2007, Intel Corporation.<BR>
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include <FrameworkPei.h>
22 #include <Protocol/BlockIo.h>
23 #include <Protocol/IsaIo.h>
24 #include <Protocol/DevicePath.h>
26 #include <Library/TimerLib.h>
27 #include <Library/DebugLib.h>
28 #include <Library/UefiDriverEntryPoint.h>
29 #include <Library/BaseLib.h>
30 #include <Library/UefiLib.h>
31 #include <Library/BaseMemoryLib.h>
32 #include <Library/MemoryAllocationLib.h>
33 #include <Library/UefiBootServicesTableLib.h>
34 #include <Library/ReportStatusCodeLib.h>
36 // Driver Binding Externs
38 extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver
;
39 extern EFI_COMPONENT_NAME_PROTOCOL gIsaFloppyComponentName
;
40 extern EFI_COMPONENT_NAME2_PROTOCOL gIsaFloppyComponentName2
;
45 #define STALL_1_SECOND 1000000
46 #define STALL_1_MSECOND 1000
54 // Internal Data Structures
56 #define FDC_BLK_IO_DEV_SIGNATURE EFI_SIGNATURE_32 ('F', 'B', 'I', 'O')
57 #define FLOPPY_CONTROLLER_CONTEXT_SIGNATURE EFI_SIGNATURE_32 ('F', 'D', 'C', 'C')
68 BOOLEAN FddResetPerformed
;
69 EFI_STATUS FddResetStatus
;
70 BOOLEAN NeedRecalibrate
;
73 } FLOPPY_CONTROLLER_CONTEXT
;
78 EFI_BLOCK_IO_PROTOCOL BlkIo
;
79 EFI_BLOCK_IO_MEDIA BlkMedia
;
81 EFI_ISA_IO_PROTOCOL
*IsaIo
;
86 UINT8 PresentCylinderNumber
;
90 EFI_UNICODE_STRING_TABLE
*ControllerNameTable
;
91 FLOPPY_CONTROLLER_CONTEXT
*ControllerState
;
93 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
96 #include "ComponentName.h"
98 #define FDD_BLK_IO_FROM_THIS(a) CR (a, FDC_BLK_IO_DEV, BlkIo, FDC_BLK_IO_DEV_SIGNATURE)
99 #define FLOPPY_CONTROLLER_FROM_LIST_ENTRY(a) \
101 FLOPPY_CONTROLLER_CONTEXT, \
103 FLOPPY_CONTROLLER_CONTEXT_SIGNATURE \
106 #define DISK_1440K_EOT 0x12
107 #define DISK_1440K_GPL 0x1b
108 #define DISK_1440K_DTL 0xff
109 #define DISK_1440K_NUMBER 0x02
110 #define DISK_1440K_MAXTRACKNUM 0x4f
111 #define DISK_1440K_BYTEPERSECTOR 512
123 } FDD_COMMAND_PACKET1
;
128 } FDD_COMMAND_PACKET2
;
167 // 0x3F2 Digital Output Register
169 #define FDC_REGISTER_DOR 2
172 // 0x3F4 Main Status Register
174 #define FDC_REGISTER_MSR 4
177 // 0x3F5 Data Register
179 #define FDC_REGISTER_DTR 5
182 // 0x3F7 Configuration Control Register(data rate select)
184 #define FDC_REGISTER_CCR 7
187 // 0x3F7 Digital Input Register(diskchange)
189 #define FDC_REGISTER_DIR 7
194 // FDC Register Bit Definitions
197 // Digital Out Register(WO)
200 // Select Drive: 0=A 1=B
202 #define SELECT_DRV BIT0
207 #define RESET_FDC BIT2
212 #define INT_DMA_ENABLE BIT3
215 // Turn On Drive A Motor
217 #define DRVA_MOTOR_ON BIT4
220 // Turn On Drive B Motor
222 #define DRVB_MOTOR_ON BIT5
225 // Main Status Register(RO)
253 // Request For Master
258 // Configuration Control Register(WO)
263 #define CCR_DRC (BIT0 | BIT1)
266 // Digital Input Register(RO)
273 // #define CCR_DCL BIT7 // Diskette change
277 #define DRC_500KBS 0x0
282 #define DRC_300KBS 0x01
287 #define DRC_250KBS 0x02
292 #define READ_DATA_CMD 0x06
293 #define WRITE_DATA_CMD 0x05
294 #define WRITE_DEL_DATA_CMD 0x09
295 #define READ_DEL_DATA_CMD 0x0C
296 #define READ_TRACK_CMD 0x02
297 #define READ_ID_CMD 0x0A
298 #define FORMAT_TRACK_CMD 0x0D
299 #define SCAN_EQU_CMD 0x11
300 #define SCAN_LOW_EQU_CMD 0x19
301 #define SCAN_HIGH_EQU_CMD 0x1D
302 #define SEEK_CMD 0x0F
303 #define RECALIBRATE_CMD 0x07
304 #define SENSE_INT_STATUS_CMD 0x08
305 #define SPECIFY_CMD 0x03
306 #define SENSE_DRV_STATUS_CMD 0x04
309 // CMD_MT: Multi_Track Selector
310 // when set , this flag selects the multi-track operating mode.
311 // In this mode, the FDC treats a complete cylinder under head0 and 1
317 // CMD_MFM: MFM/FM Mode Selector
318 // A one selects the double density(MFM) mode
319 // A zero selects single density (FM) mode
325 // When set to 1, sectors containing a deleted data address mark will
326 // automatically be skipped during the execution of Read Data.
327 // When set to 0, the sector is read or written the same as the read and
333 // FDC Status Register Bit Definitions
341 #define STS0_IC (BIT7 | BIT6)
344 // Seek End: the FDC completed a seek or recalibrate command
354 // Not Ready(unused), this bit is always 0
359 // Head Address: the current head address
364 // STS0_US1 & STS0_US0: Drive Select(the current selected drive)
369 #define STS0_US1 BIT1
374 #define STS0_US0 BIT0
388 // Data Error: The FDC detected a CRC error in either the ID field or
389 // data field of a sector
394 // Overrun/Underrun: Becomes set if FDC does not receive CPU or DMA service
395 // within the required time interval
413 // Missing Address Mark
423 // Data Error in Data Field: The FDC detected a CRC error in the data field
428 // Wrong Cylinder: The track address from sector ID field is different from
429 // the track address maintained inside FDC
439 // Missing Address Mark in Data Field
459 // STS3_US1 & STS3_US0 : Drive Select
461 #define STS3_US1 BIT1
462 #define STS3_US0 BIT0
465 // Status Register 0 Interrupt Code Description
468 // Normal Termination of Command
473 // Abnormal Termination of Command
483 // Abnormal Termination caused by Polling
490 extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver
;
493 // EFI Driver Binding Protocol Functions
497 FdcControllerDriverSupported (
498 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
499 IN EFI_HANDLE Controller
,
500 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
506 GC_TODO: Add function description
510 This - GC_TODO: add argument description
511 Controller - GC_TODO: add argument description
512 RemainingDevicePath - GC_TODO: add argument description
516 GC_TODO: add return values
523 FdcControllerDriverStart (
524 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
525 IN EFI_HANDLE Controller
,
526 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
532 GC_TODO: Add function description
536 This - GC_TODO: add argument description
537 Controller - GC_TODO: add argument description
538 RemainingDevicePath - GC_TODO: add argument description
542 GC_TODO: add return values
549 FdcControllerDriverStop (
550 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
551 IN EFI_HANDLE Controller
,
552 IN UINTN NumberOfChildren
,
553 IN EFI_HANDLE
*ChildHandleBuffer
559 GC_TODO: Add function description
563 This - GC_TODO: add argument description
564 Controller - GC_TODO: add argument description
565 NumberOfChildren - GC_TODO: add argument description
566 ChildHandleBuffer - GC_TODO: add argument description
570 GC_TODO: add return values
576 // EFI Block I/O Protocol Functions
581 IN EFI_BLOCK_IO_PROTOCOL
*This
,
582 IN BOOLEAN ExtendedVerification
588 GC_TODO: Add function description
592 This - GC_TODO: add argument description
593 ExtendedVerification - GC_TODO: add argument description
597 GC_TODO: add return values
605 IN EFI_BLOCK_IO_PROTOCOL
*This
611 GC_TODO: Add function description
615 This - GC_TODO: add argument description
619 GC_TODO: add return values
627 IN EFI_BLOCK_IO_PROTOCOL
*This
,
637 GC_TODO: Add function description
641 This - GC_TODO: add argument description
642 MediaId - GC_TODO: add argument description
643 LBA - GC_TODO: add argument description
644 BufferSize - GC_TODO: add argument description
645 Buffer - GC_TODO: add argument description
649 GC_TODO: add return values
657 IN EFI_BLOCK_IO_PROTOCOL
*This
,
667 GC_TODO: Add function description
671 This - GC_TODO: add argument description
672 MediaId - GC_TODO: add argument description
673 LBA - GC_TODO: add argument description
674 BufferSize - GC_TODO: add argument description
675 Buffer - GC_TODO: add argument description
679 GC_TODO: add return values
685 // Prototypes of internal functions
689 IN FDC_BLK_IO_DEV
*FdcDev
695 GC_TODO: Add function description
699 FdcDev - GC_TODO: add argument description
703 GC_TODO: add return values
710 IN FDC_BLK_IO_DEV
*FdcDev
716 GC_TODO: Add function description
720 FdcDev - GC_TODO: add argument description
724 GC_TODO: add return values
731 IN FDC_BLK_IO_DEV
*FdcDev
737 GC_TODO: Add function description
741 FdcDev - GC_TODO: add argument description
745 GC_TODO: add return values
752 IN FDC_BLK_IO_DEV
*FdcDev
758 GC_TODO: Add function description
762 FdcDev - GC_TODO: add argument description
766 GC_TODO: add return values
773 IN FDC_BLK_IO_DEV
*FdcDev
779 GC_TODO: Add function description
783 FdcDev - GC_TODO: add argument description
787 GC_TODO: add return values
794 IN FDC_BLK_IO_DEV
*FdcDev
800 GC_TODO: Add function description
804 FdcDev - GC_TODO: add argument description
808 GC_TODO: add return values
815 IN FDC_BLK_IO_DEV
*FdcDev
821 GC_TODO: Add function description
825 FdcDev - GC_TODO: add argument description
829 GC_TODO: add return values
836 IN FDC_BLK_IO_DEV
*FdcDev
842 GC_TODO: Add function description
846 FdcDev - GC_TODO: add argument description
850 GC_TODO: add return values
857 IN FDC_BLK_IO_DEV
*FdcDev
,
864 GC_TODO: Add function description
868 FdcDev - GC_TODO: add argument description
869 Lba - GC_TODO: add argument description
873 GC_TODO: add return values
880 IN FDC_BLK_IO_DEV
*FdcDev
,
881 IN OUT UINT8
*StatusRegister0
,
882 IN OUT UINT8
*PresentCylinderNumber
888 GC_TODO: Add function description
892 FdcDev - GC_TODO: add argument description
893 StatusRegister0 - GC_TODO: add argument description
894 PresentCylinderNumber - GC_TODO: add argument description
898 GC_TODO: add return values
905 IN FDC_BLK_IO_DEV
*FdcDev
,
912 GC_TODO: Add function description
916 FdcDev - GC_TODO: add argument description
917 Lba - GC_TODO: add argument description
921 GC_TODO: add return values
928 IN FDC_BLK_IO_DEV
*FdcDev
934 GC_TODO: Add function description
938 FdcDev - GC_TODO: add argument description
942 GC_TODO: add return values
949 IN FDC_BLK_IO_DEV
*FdcDev
955 GC_TODO: Add function description
959 FdcDev - GC_TODO: add argument description
963 GC_TODO: add return values
969 ReadWriteDataSector (
970 IN FDC_BLK_IO_DEV
*FdcDev
,
971 IN VOID
*HostAddress
,
973 IN UINTN NumberOfBlocks
,
980 GC_TODO: Add function description
984 FdcDev - GC_TODO: add argument description
985 HostAddress - GC_TODO: add argument description
986 Lba - GC_TODO: add argument description
987 NumberOfBlocks - GC_TODO: add argument description
988 Read - GC_TODO: add argument description
992 GC_TODO: add return values
999 IN FDC_BLK_IO_DEV
*FdcDev
,
1001 IN FDD_COMMAND_PACKET1
*Command
1005 Routine Description:
1007 GC_TODO: Add function description
1011 FdcDev - GC_TODO: add argument description
1012 Lba - GC_TODO: add argument description
1013 Command - GC_TODO: add argument description
1017 GC_TODO: add return values
1024 IN FDC_BLK_IO_DEV
*FdcDev
,
1029 Routine Description:
1031 GC_TODO: Add function description
1035 FdcDev - GC_TODO: add argument description
1036 Pointer - GC_TODO: add argument description
1040 GC_TODO: add return values
1047 IN FDC_BLK_IO_DEV
*FdcDev
,
1052 Routine Description:
1054 GC_TODO: Add function description
1058 FdcDev - GC_TODO: add argument description
1059 Pointer - GC_TODO: add argument description
1063 GC_TODO: add return values
1069 FddWaitForBSYClear (
1070 IN FDC_BLK_IO_DEV
*FdcDev
,
1071 IN UINTN TimeoutInSeconds
1075 Routine Description:
1077 GC_TODO: Add function description
1081 FdcDev - GC_TODO: add argument description
1082 TimeoutInSeconds - GC_TODO: add argument description
1086 GC_TODO: add return values
1093 IN FDC_BLK_IO_DEV
*FdcDev
,
1095 IN UINTN TimeoutInSeconds
1099 Routine Description:
1101 GC_TODO: Add function description
1105 FdcDev - GC_TODO: add argument description
1106 Dio - GC_TODO: add argument description
1107 TimeoutInSeconds - GC_TODO: add argument description
1111 GC_TODO: add return values
1118 IN FDD_RESULT_PACKET
*Result
,
1119 IN OUT FDC_BLK_IO_DEV
*FdcDev
1123 Routine Description:
1125 GC_TODO: Add function description
1129 Result - GC_TODO: add argument description
1130 FdcDev - GC_TODO: add argument description
1134 GC_TODO: add return values
1141 IN UINT8 StatusRegister3
1145 Routine Description:
1147 GC_TODO: Add function description
1151 StatusRegister3 - GC_TODO: add argument description
1155 GC_TODO: add return values
1161 GetTransferBlockCount (
1162 IN FDC_BLK_IO_DEV
*FdcDev
,
1164 IN UINTN NumberOfBlocks
1168 Routine Description:
1170 GC_TODO: Add function description
1174 FdcDev - GC_TODO: add argument description
1175 LBA - GC_TODO: add argument description
1176 NumberOfBlocks - GC_TODO: add argument description
1180 GC_TODO: add return values
1193 Routine Description:
1195 GC_TODO: Add function description
1199 Event - GC_TODO: add argument description
1200 Context - GC_TODO: add argument description
1204 GC_TODO: add return values
1211 IN FDC_BLK_IO_DEV
*FdcDev
,
1216 Routine Description:
1218 GC_TODO: Add function description
1222 FdcDev - GC_TODO: add argument description
1223 Offset - GC_TODO: add argument description
1227 GC_TODO: add return values
1234 IN FDC_BLK_IO_DEV
*FdcDev
,
1240 Routine Description:
1242 GC_TODO: Add function description
1246 FdcDev - GC_TODO: add argument description
1247 Offset - GC_TODO: add argument description
1248 Data - GC_TODO: add argument description
1252 GC_TODO: add return values
1258 FddReadWriteBlocks (
1259 IN EFI_BLOCK_IO_PROTOCOL
*This
,
1262 IN UINTN BufferSize
,
1263 IN BOOLEAN Operation
,
1268 Routine Description:
1270 GC_TODO: Add function description
1274 This - GC_TODO: add argument description
1275 MediaId - GC_TODO: add argument description
1276 LBA - GC_TODO: add argument description
1277 BufferSize - GC_TODO: add argument description
1278 Operation - GC_TODO: add argument description
1279 Buffer - GC_TODO: add argument description
1283 GC_TODO: add return values
1290 IN FDC_BLK_IO_DEV
*FdcDev
1294 Routine Description:
1296 GC_TODO: Add function description
1300 FdcDev - GC_TODO: add argument description
1304 GC_TODO: add return values