git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9793 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			196 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Definition for the USB mass storage Bulk-Only Transport protocol,
 | |
|   based on the "Universal Serial Bus Mass Storage Class Bulk-Only
 | |
|   Transport" Revision 1.0, September 31, 1999.
 | |
| 
 | |
| Copyright (c) 2007 - 2010, Intel Corporation
 | |
| 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 _EFI_USBMASS_BOT_H_
 | |
| #define _EFI_USBMASS_BOT_H_
 | |
| 
 | |
| #include "UsbMass.h"
 | |
| 
 | |
| extern USB_MASS_TRANSPORT mUsbBotTransport;
 | |
| 
 | |
| //
 | |
| // Usb Bulk-Only class specfic request
 | |
| //
 | |
| #define USB_BOT_RESET_REQUEST    0xFF       ///< Bulk-Only Mass Storage Reset
 | |
| #define USB_BOT_GETLUN_REQUEST   0xFE       ///< Get Max Lun
 | |
| #define USB_BOT_CBW_SIGNATURE    0x43425355 ///< dCBWSignature, tag the packet as CBW
 | |
| #define USB_BOT_CSW_SIGNATURE    0x53425355 ///< dCSWSignature, tag the packet as CSW
 | |
| #define USB_BOT_MAX_LUN          0x0F       ///< Lun number is from 0 to 15
 | |
| #define USB_BOT_MAX_CMDLEN       16         ///< Maxium number of command from command set
 | |
| 
 | |
| //
 | |
| // Usb BOT command block status values
 | |
| //
 | |
| #define USB_BOT_COMMAND_OK       0x00 ///< Command passed, good status
 | |
| #define USB_BOT_COMMAND_FAILED   0x01 ///< Command failed
 | |
| #define USB_BOT_COMMAND_ERROR    0x02 ///< Phase error, need to reset the device
 | |
| 
 | |
| //
 | |
| // Usb Bot retry to get CSW, refers to specification[BOT10-5.3, it says 2 times]
 | |
| //
 | |
| #define USB_BOT_RECV_CSW_RETRY   3
 | |
| 
 | |
| //
 | |
| // Usb Bot wait device reset complete, set by experience
 | |
| //  
 | |
| #define USB_BOT_RESET_DEVICE_STALL  (100 * USB_MASS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Usb Bot transport timeout, set by experience
 | |
| //
 | |
| #define USB_BOT_SEND_CBW_TIMEOUT     (3 * USB_MASS_1_SECOND)
 | |
| #define USB_BOT_RECV_CSW_TIMEOUT     (3 * USB_MASS_1_SECOND)
 | |
| #define USB_BOT_RESET_DEVICE_TIMEOUT (3 * USB_MASS_1_SECOND)
 | |
| 
 | |
| #pragma pack(1)
 | |
| ///
 | |
| /// The CBW (Command Block Wrapper) structures used by the USB BOT protocol.
 | |
| ///
 | |
| typedef struct {
 | |
|   UINT32              Signature;
 | |
|   UINT32              Tag;
 | |
|   UINT32              DataLen;  ///< Length of data between CBW and CSW
 | |
|   UINT8               Flag;     ///< Bit 7, 0 ~ Data-Out, 1 ~ Data-In
 | |
|   UINT8               Lun;      ///< Lun number. Bits 0~3 are used
 | |
|   UINT8               CmdLen;   ///< Length of the command. Bits 0~4 are used
 | |
|   UINT8               CmdBlock[USB_BOT_MAX_CMDLEN];
 | |
| } USB_BOT_CBW;
 | |
| 
 | |
| ///
 | |
| /// The and CSW (Command Status Wrapper) structures used by the USB BOT protocol.
 | |
| ///
 | |
| typedef struct {
 | |
|   UINT32              Signature;
 | |
|   UINT32              Tag;
 | |
|   UINT32              DataResidue;
 | |
|   UINT8               CmdStatus;
 | |
| } USB_BOT_CSW;
 | |
| #pragma pack()
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Put Interface at the first field to make it easy to distinguish BOT/CBI Protocol instance
 | |
|   //
 | |
|   EFI_USB_INTERFACE_DESCRIPTOR  Interface;
 | |
|   EFI_USB_ENDPOINT_DESCRIPTOR   *BulkInEndpoint;
 | |
|   EFI_USB_ENDPOINT_DESCRIPTOR   *BulkOutEndpoint;
 | |
|   UINT32                        CbwTag;
 | |
|   EFI_USB_IO_PROTOCOL           *UsbIo;
 | |
| } USB_BOT_PROTOCOL;
 | |
| 
 | |
| /**
 | |
|   Initializes USB BOT protocol.
 | |
| 
 | |
|   This function initializes the USB mass storage class BOT protocol.
 | |
|   It will save its context which is a USB_BOT_PROTOCOL structure
 | |
|   in the Context if Context isn't NULL.
 | |
| 
 | |
|   @param  UsbIo                 The USB I/O Protocol instance
 | |
|   @param  Context               The buffer to save the context to
 | |
| 
 | |
|   @retval EFI_SUCCESS           The device is successfully initialized.
 | |
|   @retval EFI_UNSUPPORTED       The transport protocol doesn't support the device.
 | |
|   @retval Other                 The USB BOT initialization fails.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UsbBotInit (
 | |
|   IN  EFI_USB_IO_PROTOCOL       *UsbIo,
 | |
|   OUT VOID                      **Context OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Call the USB Mass Storage Class BOT protocol to issue
 | |
|   the command/data/status circle to execute the commands.
 | |
| 
 | |
|   @param  Context               The context of the BOT protocol, that is,
 | |
|                                 USB_BOT_PROTOCOL
 | |
|   @param  Cmd                   The high level command
 | |
|   @param  CmdLen                The command length
 | |
|   @param  DataDir               The direction of the data transfer
 | |
|   @param  Data                  The buffer to hold data
 | |
|   @param  DataLen               The length of the data
 | |
|   @param  Lun                   The number of logic unit
 | |
|   @param  Timeout               The time to wait command
 | |
|   @param  CmdStatus             The result of high level command execution
 | |
| 
 | |
|   @retval EFI_SUCCESS           The command is executed successfully.
 | |
|   @retval Other                 Failed to excute command
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UsbBotExecCommand (
 | |
|   IN  VOID                    *Context,
 | |
|   IN  VOID                    *Cmd,
 | |
|   IN  UINT8                   CmdLen,
 | |
|   IN  EFI_USB_DATA_DIRECTION  DataDir,
 | |
|   IN  VOID                    *Data,
 | |
|   IN  UINT32                  DataLen,
 | |
|   IN  UINT8                   Lun,
 | |
|   IN  UINT32                  Timeout,
 | |
|   OUT UINT32                  *CmdStatus
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Reset the USB mass storage device by BOT protocol.
 | |
| 
 | |
|   @param  Context               The context of the BOT protocol, that is,
 | |
|                                 USB_BOT_PROTOCOL.
 | |
|   @param  ExtendedVerification  If FALSE, just issue Bulk-Only Mass Storage Reset request.
 | |
|                                 If TRUE, additionally reset parent hub port.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The device is reset.
 | |
|   @retval Others                Failed to reset the device..
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UsbBotResetDevice (
 | |
|   IN  VOID                    *Context,
 | |
|   IN  BOOLEAN                 ExtendedVerification
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the max LUN (Logical Unit Number) of USB mass storage device.
 | |
| 
 | |
|   @param  Context          The context of the BOT protocol, that is, USB_BOT_PROTOCOL
 | |
|   @param  MaxLun           Return pointer to the max number of LUN. (e.g. MaxLun=1 means LUN0 and
 | |
|                            LUN1 in all.)
 | |
| 
 | |
|   @retval EFI_SUCCESS      Max LUN is got successfully.
 | |
|   @retval Others           Fail to execute this request.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UsbBotGetMaxLun (
 | |
|   IN  VOID                    *Context,
 | |
|   OUT UINT8                   *MaxLun
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Clean up the resource used by this BOT protocol.
 | |
| 
 | |
|   @param  Context         The context of the BOT protocol, that is, USB_BOT_PROTOCOL.
 | |
| 
 | |
|   @retval EFI_SUCCESS     The resource is cleaned up.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UsbBotCleanUp (
 | |
|   IN  VOID                    *Context
 | |
|   );
 | |
| 
 | |
| #endif
 |