1 /** @file 2 3 Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR> 4 5 6 This program and the accompanying materials are licensed and made available under 7 8 the terms and conditions of the BSD License that accompanies this distribution. 9 10 The full text of the license may be found at 11 12 http://opensource.org/licenses/bsd-license.php. 13 14 15 16 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 17 18 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 19 20 21 22 23 **/ 24 25 #ifndef _FIRMWARE_UPDATE_H_ 26 #define _FIRMWARE_UPDATE_H_ 27 28 #include <Uefi.h> 29 30 #include <PiDxe.h> 31 32 #include <Guid/FileInfo.h> 33 34 #include <Protocol/FirmwareVolumeBlock.h> 35 #include <Protocol/LoadedImage.h> 36 #include <Protocol/SimpleFileSystem.h> 37 #include <Protocol/Spi.h> 38 39 #include <Library/BaseLib.h> 40 #include <Library/BaseMemoryLib.h> 41 #include <Library/CacheMaintenanceLib.h> 42 #include <Library/DebugLib.h> 43 #include <Library/FileHandleLib.h> 44 #include <Library/HiiLib.h> 45 #include <Library/MemoryAllocationLib.h> 46 #include <Library/PcdLib.h> 47 #include <Library/PrintLib.h> 48 #include <Library/ShellLib.h> 49 #include <Library/UefiApplicationEntryPoint.h> 50 #include <Library/UefiBootServicesTableLib.h> 51 #include <Library/UefiLib.h> 52 #include <Library/UefiRuntimeServicesTableLib.h> 53 54 // 55 // Function Prototypes. 56 // 57 STATIC 58 EFI_STATUS 59 ReadFileData ( 60 IN CHAR16 *FileName, 61 OUT UINT8 **Buffer, 62 OUT UINT32 *BufferSize 63 ); 64 65 STATIC 66 EFI_STATUS 67 InternalEraseBlock ( 68 IN EFI_PHYSICAL_ADDRESS BaseAddress 69 ); 70 71 #if 0 72 STATIC 73 EFI_STATUS 74 InternalReadBlock ( 75 IN EFI_PHYSICAL_ADDRESS BaseAddress, 76 OUT VOID *ReadBuffer 77 ); 78 #endif 79 80 STATIC 81 EFI_STATUS 82 InternalCompareBlock ( 83 IN EFI_PHYSICAL_ADDRESS BaseAddress, 84 IN UINT8 *Buffer 85 ); 86 87 STATIC 88 EFI_STATUS 89 InternalWriteBlock ( 90 IN EFI_PHYSICAL_ADDRESS BaseAddress, 91 IN UINT8 *Buffer, 92 IN UINT32 BufferSize 93 ); 94 95 STATIC 96 VOID 97 PrintHelpInfo ( 98 VOID 99 ); 100 101 STATIC 102 EFI_STATUS 103 EFIAPI 104 SpiFlashRead ( 105 IN UINTN Address, 106 IN OUT UINT32 *NumBytes, 107 OUT UINT8 *Buffer 108 ); 109 110 STATIC 111 EFI_STATUS 112 EFIAPI 113 SpiFlashWrite ( 114 IN UINTN Address, 115 IN OUT UINT32 *NumBytes, 116 IN UINT8 *Buffer 117 ); 118 119 STATIC 120 EFI_STATUS 121 EFIAPI 122 SpiFlashBlockErase ( 123 IN UINTN Address, 124 IN UINTN *NumBytes 125 ); 126 127 STATIC 128 EFI_STATUS 129 EFIAPI 130 ConvertMac ( 131 CHAR16 *Str 132 ); 133 134 EFI_STATUS 135 InitializeFVUPDATE ( 136 IN EFI_HANDLE ImageHandle, 137 IN EFI_SYSTEM_TABLE *SystemTable 138 ); 139 140 // 141 // Flash specific definitions. 142 // - Should we use a PCD for this information? 143 // 144 #define BLOCK_SIZE SIZE_4KB 145 146 // 147 // Flash region layout and update information. 148 // 149 typedef struct { 150 EFI_PHYSICAL_ADDRESS Base; 151 UINTN Size; 152 BOOLEAN Update; 153 } FV_REGION_INFO; 154 155 // 156 // MAC Address information. 157 // 158 #define MAC_ADD_STR_LEN 12 159 #define MAC_ADD_STR_SIZE (MAC_ADD_STR_LEN + 1) 160 #define MAC_ADD_BYTE_COUNT 6 161 #define MAC_ADD_TMP_STR_LEN 2 162 #define MAC_ADD_TMP_STR_SIZE (MAC_ADD_TMP_STR_LEN + 1) 163 164 // 165 // Command Line Data. 166 // 167 #define INPUT_STRING_LEN 255 168 #define INPUT_STRING_SIZE (INPUT_STRING_LEN + 1) 169 typedef struct { 170 BOOLEAN UpdateFromFile; 171 CHAR16 FileName[INPUT_STRING_SIZE]; 172 BOOLEAN UpdateMac; 173 UINT8 MacValue[MAC_ADD_BYTE_COUNT]; 174 BOOLEAN FullFlashUpdate; 175 } FV_INPUT_DATA; 176 177 // 178 // Prefix Opcode Index on the host SPI controller. 179 // 180 typedef enum { 181 SPI_WREN, // Prefix Opcode 0: Write Enable. 182 SPI_EWSR, // Prefix Opcode 1: Enable Write Status Register. 183 } PREFIX_OPCODE_INDEX; 184 185 // 186 // Opcode Menu Index on the host SPI controller. 187 // 188 typedef enum { 189 SPI_READ_ID, // Opcode 0: READ ID, Read cycle with address. 190 SPI_READ, // Opcode 1: READ, Read cycle with address. 191 SPI_RDSR, // Opcode 2: Read Status Register, No address. 192 SPI_WRDI_SFDP, // Opcode 3: Write Disable or Discovery Parameters, No address. 193 SPI_SERASE, // Opcode 4: Sector Erase (4KB), Write cycle with address. 194 SPI_BERASE, // Opcode 5: Block Erase (32KB), Write cycle with address. 195 SPI_PROG, // Opcode 6: Byte Program, Write cycle with address. 196 SPI_WRSR, // Opcode 7: Write Status Register, No address. 197 } SPI_OPCODE_INDEX; 198 199 #endif 200