1 /** @file 2 3 Copyright (c) 2014, ARM Ltd. All rights reserved.<BR> 4 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 /* 16 Transport protocol over which Android Fastboot transactions can be made. 17 Fastboot is designed for USB, but this protocol is intended as an abstraction 18 so that it can be implemented over any transport mechanism. 19 */ 20 21 #ifndef __ANDROID_FASTBOOT_TRANSPORT_H__ 22 #define __ANDROID_FASTBOOT_TRANSPORT_H__ 23 24 extern EFI_GUID gAndroidFastbootTransportProtocolGuid; 25 26 /* 27 Set up the transport system for use by Fastboot. 28 e.g. For USB this probably means making the device enumerable. For TCP, 29 preparing to accept incoming connections. 30 31 It is _not_ the responsibility of this protocol's implementer to unite the 32 data phase into a single buffer - that is handled by the Fastboot UEFI 33 application. As the Fastboot protocol spec says: "Short packets are always 34 acceptable and zero-length packets are ignored." 35 However the commands and responses must be in a single packet, and the order 36 of the packets must of course be maintained. 37 38 If there is a fatal error in the receive channel, ReceiveEvent will be 39 signalled, and a subsequent call to Receive() will return an error. This 40 allows data transported prior to the error to be received. 41 42 @param[in] ReceiveEvent Event to be Signalled when a packet has been received 43 and is ready to be retrieved via Receive(). 44 45 @retval EFI_SUCCESS Initialised successfully. 46 @retval EFI_DEVICE_ERROR Error in initialising hardware 47 @retval (other) Error return from LocateProtocol functions. 48 */ 49 typedef 50 EFI_STATUS 51 (*FASTBOOT_TRANSPORT_START) ( 52 IN EFI_EVENT ReceiveEvent 53 ); 54 55 /* 56 Function to be called when all Fastboot transactions are finished, to 57 de-initialise the transport system. 58 e.g. A USB OTG system might want to get out of peripheral mode so it can be 59 a USB host. 60 61 Note that this function will be called after an error is reported by Send or 62 Receive 63 64 @retval EFI_SUCCESS De-initialised successfully. 65 @retval EFI_DEVICE_ERROR Error de-initialising hardware. 66 */ 67 typedef 68 EFI_STATUS 69 (* FASTBOOT_TRANSPORT_STOP) ( 70 VOID 71 ); 72 73 /* 74 Send data. This function can be used both for command responses like "OKAY" 75 and for the data phase (the protocol doesn't describe any situation when the 76 latter might be necessary, but does allow it) 77 78 Transmission need not finish before the function returns. 79 If there is an error in transmission from which the transport system cannot 80 recover, FatalErrorEvent will be signalled. Otherwise, it is assumed that all 81 data was delivered successfully. 82 83 @param[in] BufferSize Size in bytes of data to send. 84 @param[in] Buffer Data to send. 85 @param[in] FatalErrorEvent Event to signal if there was an error in 86 transmission from which the transport system 87 cannot recover. 88 89 @retval EFI_SUCCESS The data was sent or queued for send. 90 @retval EFI_DEVICE_ERROR There was an error preparing to send the data. 91 */ 92 typedef 93 EFI_STATUS 94 (*FASTBOOT_TRANSPORT_SEND) ( 95 IN UINTN BufferSize, 96 IN CONST VOID *Buffer, 97 IN EFI_EVENT *FatalErrorEvent 98 ); 99 100 /* 101 When the event has been Signalled to say data is available from the host, 102 this function is used to get data. In order to handle the case where several 103 packets are received before ReceiveEvent's notify function is called, packets 104 received are queued, and each call to this function returns the next packet in 105 the queue. It should therefore be called in a loop, the exit condition being a 106 return of EFI_NOT_READY. 107 108 @param[out] Buffer Pointer to received data. Callee allocated - the 109 caller must free it with FreePool. 110 @param[out] BufferSize The size of received data in bytes 111 112 @retval EFI_NOT_READY There is no data available 113 @retval EFI_DEVICE_ERROR There was a fatal error in the receive channel. 114 e.g. for USB the cable was unplugged or for TCP the 115 connection was closed by the remote host.. 116 */ 117 typedef 118 EFI_STATUS 119 (*FASTBOOT_TRANSPORT_RECEIVE) ( 120 OUT UINTN *BufferSize, 121 OUT VOID **Buffer 122 ); 123 124 typedef 125 EFI_STATUS 126 (*FASTBOOT_TRANSPORT_REQUEST_RECEIVE) ( 127 IN UINTN BufferSize 128 ); 129 130 typedef struct _FASTBOOT_TRANSPORT_PROTOCOL { 131 FASTBOOT_TRANSPORT_START Start; 132 FASTBOOT_TRANSPORT_STOP Stop; 133 FASTBOOT_TRANSPORT_SEND Send; 134 FASTBOOT_TRANSPORT_RECEIVE Receive; 135 FASTBOOT_TRANSPORT_REQUEST_RECEIVE RequestReceive; 136 } FASTBOOT_TRANSPORT_PROTOCOL; 137 138 #endif 139