summaryrefslogtreecommitdiff
path: root/Core/EM/usb/rt/UsbMass.h
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/usb/rt/UsbMass.h')
-rw-r--r--Core/EM/usb/rt/UsbMass.h465
1 files changed, 465 insertions, 0 deletions
diff --git a/Core/EM/usb/rt/UsbMass.h b/Core/EM/usb/rt/UsbMass.h
new file mode 100644
index 0000000..5fb4e9f
--- /dev/null
+++ b/Core/EM/usb/rt/UsbMass.h
@@ -0,0 +1,465 @@
+//**********************************************************************
+//**********************************************************************
+//** **
+//** (C)Copyright 1985-2013, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//**********************************************************************
+//**********************************************************************
+
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/USB/ALASKA/RT/UsbMass.h 3 7/04/14 5:34a Wilsonlee $
+//
+// $Revision: 3 $
+//
+// $Date: 7/04/14 5:34a $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/USB/ALASKA/RT/UsbMass.h $
+//
+// 3 7/04/14 5:34a Wilsonlee
+// [TAG] EIP175485
+// [Category] Bug Fix
+// [Severity] Minor
+// [Symptom] USB key can't be save during secure boot key.
+// [RootCause] The usb key, MSI 8G Team, has two luns. One is CD-ROM, it
+// always reports there is no media until we send "Get_Configuration"
+// command to it, then it causes the other lun will report media change
+// when we read/write data later.
+// [Solution] Send "Get_Configuration" command for CD/DVD devices.
+// [Files] usbmass.c, UsbMass.h
+//
+// 2 12/15/13 10:16p Wilsonlee
+// [TAG] EIP136594
+// [Category] New Feature
+// [Description] Support 64 bits LBA of usb mass storages.
+// [Files] Bfiusb.asm, Bfiusb.equ, UsbInt13.c, UsbInt13.h, amiusb.c,
+// usbdef.h, usbmass.c, UsbMass.h, efiusbmass.c, UI13.bin
+//
+// 1 1/22/13 3:08a Wilsonlee
+// [TAG] EIP112938
+// [Category] Improvement
+// [Description] Create a header file for usb mass storage driver.
+// [Files] UsbMass.h, usbmass.c, usbdef.h, amiusb.c, efiusbmass.c
+//
+//
+//**********************************************************************
+//<AMI_FHDR_START>
+//
+// Name: UsbMass.h
+//
+// Description: AMI USB Mass Storage support header
+//
+//<AMI_FHDR_END>
+//**********************************************************************
+#ifndef __USBMASS__H__
+#define __USBMASS__H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: BOT_STATUS_BLOCK
+//
+// Description: USB mass device boot only protocol status block structure.
+// Referred as CSW - Command status wrapper. Refer Bulk-Only
+// transport specification for more detail.
+//
+// Fields: Name Type Description
+// ------------------------------------------------------------
+// dCswSignature DWORD CBS signature "USBS"
+// dCswTag DWORD Tag used to link the command with status response
+// dCswDataResidue DWORD Size of remaining data that is not processed in this transfer
+// bmCswStatus BYTE CSW status byte
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+#pragma pack(push, 1)
+
+typedef struct {
+ UINT32 dCswSignature; // 0-3h, CSW signature = "USBS"
+ UINT32 dCswTag; // 4-7h, Tag
+ UINT32 dCswDataResidue; // 8-0Bh, Data residue
+ UINT8 bmCswStatus; // 0Ch, CSW status
+} BOT_STATUS_BLOCK;
+
+#pragma pack(pop)
+
+// Common device specific command structures and values
+//----------------------------------------------------------------------------
+#define COMMON_INQUIRY_OPCODE 0x12
+#define COMMON_READ_CAPACITY_10_OPCODE 0x25
+#define COMMON_READ_CAPACITY_16_OPCODE 0x9E
+#define COMMON_READ_10_OPCODE 0x28
+#define COMMON_READ_16_OPCODE 0x88
+#define COMMON_WRITE_10_OPCODE 0x2A
+#define COMMON_WRITE_16_OPCODE 0x8A
+#define COMMON_MODE_SENSE_6_OPCODE 0x1A
+#define COMMON_MODE_SENSE_10_OPCODE 0x5A
+#define COMMON_SEND_DIAGNOSTIC_OPCODE 0x1D
+#define COMMON_TEST_UNIT_READY_OPCODE 0x00
+#define COMMON_REQUEST_SENSE_OPCODE 0x03
+#define COMMON_START_STOP_UNIT_OPCODE 0x1B
+#define COMMON_FORMAT_UNIT_OPCODE 0x04
+#define COMMON_VERIFY_10_OPCODE 0x2F
+#define COMMON_VERIFY_16_OPCODE 0x8F
+#define COMMON_READ_FORMAT_CAPACITY_OPCODE 0x23
+#define COMMON_GET_CONFIGURATION_OPCODE 0x46
+
+#pragma pack(push, 1)
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT8 bPageCode; // 02h, Page Code
+ UINT8 bReserved; // 03h, Reserved
+ UINT8 bAllocLength; // 04h, Allocation Length
+ UINT8 bControl; // 05h, Control/Reserved
+ UINT8 aReserved[6]; // 06h-0Bh, Reserved
+} COMMON_INQ_CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT32 dLba; // 02h-05h, Logical Block Address
+ UINT16 wbReserved; // 06h-07, Reserved
+ UINT8 bPMI; // 08h, PMI - bit 0
+ UINT8 bControl; // 09h, Control/Reserved
+ UINT16 wdReserved; // 0Ah-0Bh, Reserved
+} COMN_READ_CAPACITY_10_CMD;
+
+typedef struct {
+ UINT8 OpCode; // 00h, Operation Code
+ UINT8 ServiceAction; // 01h, Service Action - bit0..bit4
+ UINT64 Lba; // 02h-09h, Logical Block Address
+ UINT32 AllocLength; // 10h-0Dh, Allocation Length
+ UINT8 PMI; // 0Eh, PMI - bit 0
+ UINT8 Control; // 0Fh, Control
+} COMN_READ_CAPACITY_16_CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT8 aReserved[5]; // 02-06h, Reserved
+ UINT16 wAllocLength; // 07h-08h, Allocation Length(BIG ENDIAN)
+ UINT8 aReserved1[3]; // 09h-0Bh, Reserved
+} COMN_READ_FMT_CAPACITY;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT32 dLba; // 02h-05h, Logical Block Address
+ UINT8 bReserved; // 06h, Reserved
+ UINT16 wTransferLength;// 07h-08h, Transfer Length(BIG ENDIAN)
+ UINT8 bControl; // 09h, Control/Reserved
+ UINT16 wReserved; // 0Ah-0Bh, Reserved
+} COMN_RWV_10_CMD;
+
+typedef struct {
+ UINT8 OpCode; // 00h, Operation Code
+ UINT8 Lun; // 01h, Logical Unit Number, etc
+ UINT64 Lba; // 02h-09h, Logical Block Address
+ UINT32 TransferLength; // 0Ah-0Dh, Transfer Length(BIG ENDIAN)
+ UINT8 GroupNum; // 0Eh, Group Number, etc
+ UINT8 Control; // 0Fh, Control
+} COMN_RWV_16_CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT8 bPageCode; // 02h, Page Code
+ UINT8 bReserved; // 03h, Reserved
+ UINT8 bAllocLength; // 04h, Allocation Length
+ UINT8 bControl; // 05h, Control/Reserved
+} COMN_MODE_SENSE_6CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT8 bPageCode; // 02h, Page Code
+ UINT32 dReserved; // 03-06h, Reserved
+ UINT16 wAllocLength; // 07h-08h, Allocation Length(BIG ENDIAN)
+ UINT8 bControl; // 09h, Control/Reserved
+ UINT16 wReserved; // 0Ah-0Bh, Reserved
+} COMN_MODE_SENSE_10CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code (1D)
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT8 bReserved[10]; // 02h-0Bh, Reserved
+} COMN_SEND_DIAG_CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number
+ UINT8 bReserved[10]; // 02h-0Bh, Reserved
+} COMN_TEST_UNIT_READY_CMD;
+
+typedef struct {
+ UINT8 bOpCode; //00h, Operation Code
+ UINT8 bLun; //01h, Logical Unit Number
+ UINT16 wReserved; //02-03h, Reserved
+ UINT8 bAllocLength; //04h, Allocation Length
+ UINT8 aReserved[7]; //05h-0Bh, Reserved
+} COMMON_REQ_SENSE_CMD;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT16 wReserved; // 02-03h, Reserved
+ UINT8 bStart; // 04h, LoEj, Start bits
+ UINT8 aReserved[7]; // 05h-0Bh, Reserved
+} COMMON_START_STOP_UNIT_CMD;
+
+typedef struct {
+ UINT8 OpCode; // 00h, Operation Code
+ UINT8 Rt; // 01h, Logical Unit Number, etc
+ UINT16 StartingFeatureNumber; // 02h, StartingFeatureNumber
+ UINT8 Reserved[3]; // 03-06h, Reserved
+ UINT16 AllocLength; // 07h, Allocation Length
+ UINT8 Control; // 09h, Control
+} COMMON_GET_CONFIGURATION;
+
+typedef struct {
+ UINT8 bOpCode; // 00h, Operation Code
+ UINT8 bLun; // 01h, Logical Unit Number, etc
+ UINT8 bTrackNumber; // 02h, Track Number
+ UINT16 wInterleave; // 03h-04h, Interleave (BIG ENDIAN)
+ UINT16 wReserved; // 05-06h, Reserved
+ UINT16 wParamLength; // 07h-08h, Parameter List Length(BIG ENDIAN)
+ UINT8 aReserved[3]; // 09h-0Bh, Reserved
+} UFI_FMT_UNIT_CMD;
+
+typedef struct {
+ UINT16 wLength;
+ UINT8 bMediaType;
+ UINT8 aReserved[3];
+ UINT16 wBlkDescSize;
+} MODE_SENSE_10_HEADER;
+
+typedef struct {
+ UINT32 dCbwSignature; // 0-3h, CBW signature = "USBC"
+ UINT32 dCbwTag; // 4-7h, Tag
+ UINT32 dCbwDataLength; // 8-0Bh, Data transfer length
+ UINT8 bmCbwFlags; // 0Ch, Flags
+ UINT8 bCbwLun; // 0Dh, Logical unit number
+ UINT8 bCbwLength; // 0Eh, Command block length
+ UINT8 aCBWCB[16]; // 0Fh-1Eh, Command block buffer
+} BOT_CMD_BLK;
+
+typedef struct {
+ UINT8 bPageCode;
+ UINT8 bPageSize;
+ UINT16 wXferRate;
+ UINT8 bHeads;
+ UINT8 bSectors;
+ UINT16 wBlockSize;
+ UINT16 wCylinders;
+ UINT8 aReserved[22];
+} PAGE_CODE_5;
+
+typedef struct {
+ UINT8 aReserved[3];
+ UINT8 bCapListLength; // Amount of capacity format data after the header
+} READ_FMT_CAP_HDR;
+
+typedef struct {
+ READ_FMT_CAP_HDR stCapHeader;
+ UINT32 dNumBlocks;
+ UINT8 bDescCode;
+ UINT8 bReserved;
+ UINT16 wBlockSize;
+}READ_FMT_CAPACITY;
+
+#pragma pack(pop)
+
+#define MODE_SENSE_COMMAND_EXECUTED BIT0
+#define READ_CAPACITY_COMMAND_EXECUTED BIT1
+
+//----------------------------------------------------------------------------
+// Physical Device Type Constants for BIOS internal use
+//----------------------------------------------------------------------------
+#define USB_MASS_DEV_TYPE_FLOPPY 1 // USB FD drive
+#define USB_MASS_DEV_TYPE_CDROM 2 // USB CDROM drive
+#define USB_MASS_DEV_TYPE_ZIP 3 // USB ZIP drive
+#define USB_MASS_DEV_TYPE_ZIP_FLOPPY 4 // USB ZIP drive as floppy emulated
+#define USB_MASS_DEV_TYPE_SUPER_DISK 5 // USB super disk (LS120/240)
+#define USB_MASS_DEV_TYPE_HARD_DISK 6 // USB HD drive
+#define USB_MASS_DEV_TYPE_DISKONKEY 7 // USB Disk On Key
+
+//----------------------------------------------------------------------------
+// USB Mass Storage Related Data Structures and Equates
+//----------------------------------------------------------------------------
+//#define MAX_SIZE_FOR_FLOPPY_EMULATION 530 // 530MB //(EIP80382-)
+//#define MAX_LBA_FOR_FLOPPY_EMULATION 0x109000 // 530MB //(EIP80382-)
+
+// LBA to CHS conversion parameters
+#define USB_FIXED_LBA_HPT_ABOVE_1GB 0xFF
+#define USB_FIXED_LBA_SPT_ABOVE_1GB 0x3F
+#define USB_FIXED_LBA_HPT_BELOW_1GB 0x40
+#define USB_FIXED_LBA_SPT_BELOW_1GB 0x20
+
+// Parameters regarding 1.44MB FDD
+#define USB_144MB_FDD_MAX_LBA 0xB40
+#define USB_144MB_FDD_MEDIA_TYPE 0x94
+#define USB_144MB_FDD_MAX_HEADS 0x02
+#define USB_144MB_FDD_MAX_SECTORS 0x12
+#define USB_144MB_FDD_MAX_CYLINDERS 0x50
+#define USB_144MB_FDD_MAX_BLOCK_SIZE 0x200
+
+// Parameters regarding 720KB FDD
+#define USB_720KB_FDD_MAX_LBA 0x5A0
+#define USB_720KB_FDD_MEDIA_TYPE 0x1E
+#define USB_720KB_FDD_MAX_HEADS 0x02
+#define USB_720KB_FDD_MAX_SECTORS 0x09
+#define USB_720KB_FDD_MAX_CYLINDERS 0x50
+#define USB_720KB_FDD_MAX_BLOCK_SIZE 0x200
+
+#define USB_UNKNOWN_MEDIA_TYPE 0x0F0
+
+//-----------------------------------------------
+// ATAPI ERROR CODE REPORTED TO CALLER
+//-----------------------------------------------
+#define USB_ATA_WRITE_PROTECT_ERR 0x003 // Write protect error
+#define USB_ATA_TIME_OUT_ERR 0x080 // Command timed out error
+#define USB_ATA_DRIVE_NOT_READY_ERR 0x0AA // Drive not ready error
+#define USB_ATA_DATA_CORRECTED_ERR 0x011 // Data corrected error
+#define USB_ATA_PARAMETER_FAILED 0x007 // Bad parameter error
+#define USB_ATA_MARK_NOT_FOUND_ERR 0x002 // Address mark not found error
+#define USB_ATA_NO_MEDIA_ERR 0x031 // No media in drive
+#define USB_ATA_READ_ERR 0x004 // Read error
+#define USB_ATA_UNCORRECTABLE_ERR 0x010 // Uncorrectable data error
+#define USB_ATA_BAD_SECTOR_ERR 0x00A // Bad sector error
+#define USB_ATA_GENERAL_FAILURE 0x020 // Controller general failure
+
+#define atapi_cntlr_not_ready_err 0x080 // ATAPI controller not ready/media not present
+#define atapi_check_condition_err 0x0fd // check condition reported by ATAPI controller
+#define atapi_resend_err 0x0fe // resend the command to ATAPI controller
+#define atapi_media_change_err 0x006 // ATAPI media change error
+#define atapi_reset_err 0x005 // ATAPI reset error
+#define atapi_invalid_func 0x001 // ATAPI invalid function
+
+#define atapi_volume_not_locked_err 0x0B0 // volume not locked in drive
+#define atapi_volume_locked_err 0x0B1 // volume locked in drive
+#define atapi_volume_not_removable_err 0x0B2 // volume not removable
+#define atapi_volume_in_use_err 0x0B3 // volume in use
+#define atapi_lock_count_exceeded_err 0x0B4 // lock count exceeded
+#define atapi_eject_request_failed_err 0x0B5 // valid eject request failed
+
+#define atapi_sense_failed 0x0ff // Sense key command failed
+
+//-----------------------------------------------------------------------
+// Bulk-Only Mass Storage Reset (Class Specific Request)
+//-----------------------------------------------------------------------
+#define BOT_RESET_REQUEST_CODE 0x0FF // Reset Request code
+
+//-----------------------------------------------------------------------
+// Bulk-Only Get Max Lun (Class Specific Request)
+//-----------------------------------------------------------------------
+#define BOT_GET_MAX_LUN_REQUEST_CODE 0x0FE // Get Max Lun Request code
+
+//-----------------------------------------------------------------------
+// USB Command Status Wrapper Structure
+//-----------------------------------------------------------------------
+#define BOT_CSW_SIGNATURE 0x53425355 // 0-3h, signature = "USBS"
+
+//-----------------------------------------------------------------------
+// USB Command Block Wrapper Structure
+//-----------------------------------------------------------------------
+#define BOT_CBW_SIGNATURE 0x43425355 // 0-3h, signature = "USBC"
+
+#pragma pack(push, 1)
+
+typedef struct {
+ UINT8 BootIndicator;
+ UINT8 StartHead;
+ UINT8 StartSector;
+ UINT8 StartTrack;
+ UINT8 OSType;
+ UINT8 EndHead;
+ UINT8 EndSector;
+ UINT8 EndTrack;
+ UINT32 StartingLba;
+ UINT32 SizeInLba;
+} MBR_PARTITION;
+
+typedef struct {
+ UINT8 BootCode[440];
+ UINT32 UniqueMbrSig;
+ UINT16 Unknown;
+ MBR_PARTITION PartRec[4];
+ UINT16 Sig;
+} MASTER_BOOT_RECORD;
+
+typedef struct {
+ UINT8 jmp[3]; //0x0
+ CHAR8 OEMName[8]; //0x3
+ UINT16 BytsPerSec; //0xB
+ UINT8 SecPerClus; //0xD
+ UINT16 RsvdSecCnt; //0xE
+ UINT8 NumFATs; //0x10
+ UINT16 RootEntCnt; //0x11
+ UINT16 TotSec16; //0x13
+ UINT8 Media; //0x15
+ UINT16 FATSz16; //0x16
+ UINT16 SecPerTrk; //0x18
+ UINT16 NumHeads; //0x1A
+ UINT32 HiddSec; //0x1C
+ UINT32 TotSec32; //0x20
+ union {
+ struct {
+ UINT8 DrvNum; //0x24
+ UINT8 Reserved1; //0x25
+ UINT8 BootSig; //0x26
+ UINT32 VolID; //0x27
+ CHAR8 VolLab[11]; //0x2B
+ CHAR8 FilSysType[8]; //0x36
+ UINT8 Padding[510 - 0x3E]; //0x3E
+ } Fat16;
+ struct {
+ UINT32 FATSz32; //0x24
+ UINT16 ExtFlags; //0x28
+ UINT16 FSVer; //0x2A
+ UINT32 RootClus; //0x2C
+ UINT16 FSInfo; //0x30
+ UINT16 BkBootSec; //0x32
+ UINT8 Reserved[12]; //0x34
+ UINT8 DrvNum; //0x40
+ UINT8 Reserved1; //0x41
+ UINT8 BootSig; //0x42
+ UINT32 VolID; //0x43
+ CHAR8 VolLab[11]; //0x47
+ CHAR8 FilSysType[8]; //0x52
+ UINT8 Padding2[510 - 0x5A]; //0x5A
+ } Fat32;
+ } Fat;
+ UINT16 Signature;
+} BOOT_SECTOR;
+
+#pragma pack(pop)
+
+/****** DO NOT WRITE BELOW THIS LINE *******/
+#ifdef __cplusplus
+}
+#endif
+#endif
+//**********************************************************************
+//**********************************************************************
+//** **
+//** (C)Copyright 1985-2013, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//**********************************************************************
+//**********************************************************************