Commit 071f1bdea14ebc98f4b2c00d4afa44bfd589b9fb
1 parent
36a06d13e2
Exists in
smarc_8mq-imx_v2020.04_5.4.24_2.1.0
and in
1 other branch
MA-17046-1 Show orange warning for unlocked device
According to the google boot flow, an orange warning should be displayed on UNLOCKED device to reminder the users of the potential risks. This commit will show an orange warning logo and warning text on the screen, it shall be dismissed after 3 seconds, users can also skip it by pressing the ON-OFF button. Config 'CONFIG_AVB_WARNING_LOGO_COLS' and 'CONFIG_AVB_WARNING_LOGO_ROWS' define the (x, y) position of the warning logo, its default value is for 1080*720 resolution display and can be overridden. Test: Orange warning logo show on all imx8m/imx8q platfroms. Change-Id: I607edb3da039b47ddfac681f855834d8da187af8 Signed-off-by: Ji Luo <ji.luo@nxp.com>
Showing 7 changed files with 1192 additions and 0 deletions Inline Diff
drivers/fastboot/fb_fsl/fastboot_lock_unlock.c
1 | // SPDX-License-Identifier: GPL-2.0+ | 1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016, Freescale Semiconductor, Inc. | 3 | * Copyright (c) 2016, Freescale Semiconductor, Inc. |
4 | */ | 4 | */ |
5 | #include <common.h> | 5 | #include <common.h> |
6 | #include <mapmem.h> | 6 | #include <mapmem.h> |
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <part.h> | 8 | #include <part.h> |
9 | #include <mmc.h> | 9 | #include <mmc.h> |
10 | #include <ext_common.h> | 10 | #include <ext_common.h> |
11 | #include <stdio_dev.h> | 11 | #include <stdio_dev.h> |
12 | #include <stdlib.h> | 12 | #include <stdlib.h> |
13 | #include "fastboot_lock_unlock.h" | 13 | #include "fastboot_lock_unlock.h" |
14 | #include <fb_fsl.h> | 14 | #include <fb_fsl.h> |
15 | #include <memalign.h> | 15 | #include <memalign.h> |
16 | #include <asm/mach-imx/sys_proto.h> | 16 | #include <asm/mach-imx/sys_proto.h> |
17 | #ifdef CONFIG_IMX_TRUSTY_OS | 17 | #ifdef CONFIG_IMX_TRUSTY_OS |
18 | #include <trusty/libtipc.h> | 18 | #include <trusty/libtipc.h> |
19 | #include <asm/mach-imx/hab.h> | 19 | #include <asm/mach-imx/hab.h> |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #ifdef FASTBOOT_ENCRYPT_LOCK | 22 | #ifdef FASTBOOT_ENCRYPT_LOCK |
23 | 23 | ||
24 | #include <hash.h> | 24 | #include <hash.h> |
25 | #include <fsl_caam.h> | 25 | #include <fsl_caam.h> |
26 | 26 | ||
27 | //Encrypted data is 80bytes length. | 27 | //Encrypted data is 80bytes length. |
28 | #define ENDATA_LEN 80 | 28 | #define ENDATA_LEN 80 |
29 | 29 | ||
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #ifdef CONFIG_AVB_WARNING_LOGO | ||
33 | #include "lcd.h" | ||
34 | #include "video.h" | ||
35 | #include "dm/uclass.h" | ||
36 | #include "fsl_avb_logo.h" | ||
37 | #include "video_link.h" | ||
38 | #include "video_console.h" | ||
39 | #include "video_font_data.h" | ||
40 | #endif | ||
41 | |||
32 | int fastboot_flash_find_index(const char *name); | 42 | int fastboot_flash_find_index(const char *name); |
33 | 43 | ||
34 | #if defined(CONFIG_IMX_TRUSTY_OS) && !defined(CONFIG_ARM64) | 44 | #if defined(CONFIG_IMX_TRUSTY_OS) && !defined(CONFIG_ARM64) |
35 | #define IVT_HEADER_MAGIC 0xD1 | 45 | #define IVT_HEADER_MAGIC 0xD1 |
36 | #define IVT_HDR_LEN 0x20 | 46 | #define IVT_HDR_LEN 0x20 |
37 | #define HAB_MAJ_VER 0x40 | 47 | #define HAB_MAJ_VER 0x40 |
38 | #define HAB_MAJ_MASK 0xF0 | 48 | #define HAB_MAJ_MASK 0xF0 |
39 | 49 | ||
40 | bool tos_flashed; | 50 | bool tos_flashed; |
41 | 51 | ||
42 | static bool tos_ivt_check(ulong start_addr, int ivt_offset) { | 52 | static bool tos_ivt_check(ulong start_addr, int ivt_offset) { |
43 | const struct ivt *ivt_initial = NULL; | 53 | const struct ivt *ivt_initial = NULL; |
44 | const uint8_t *start = (const uint8_t *)start_addr; | 54 | const uint8_t *start = (const uint8_t *)start_addr; |
45 | 55 | ||
46 | if (start_addr & 0x3) { | 56 | if (start_addr & 0x3) { |
47 | puts("Error: tos's start address is not 4 byte aligned\n"); | 57 | puts("Error: tos's start address is not 4 byte aligned\n"); |
48 | return false; | 58 | return false; |
49 | } | 59 | } |
50 | 60 | ||
51 | ivt_initial = (const struct ivt *)(start + ivt_offset); | 61 | ivt_initial = (const struct ivt *)(start + ivt_offset); |
52 | 62 | ||
53 | const struct ivt_header *ivt_hdr = &ivt_initial->hdr; | 63 | const struct ivt_header *ivt_hdr = &ivt_initial->hdr; |
54 | 64 | ||
55 | if ((ivt_hdr->magic == IVT_HEADER_MAGIC && \ | 65 | if ((ivt_hdr->magic == IVT_HEADER_MAGIC && \ |
56 | (be16_to_cpu(ivt_hdr->length) == IVT_HDR_LEN) && \ | 66 | (be16_to_cpu(ivt_hdr->length) == IVT_HDR_LEN) && \ |
57 | (ivt_hdr->version & HAB_MAJ_MASK) == HAB_MAJ_VER) && \ | 67 | (ivt_hdr->version & HAB_MAJ_MASK) == HAB_MAJ_VER) && \ |
58 | (ivt_initial->entry != 0x0) && \ | 68 | (ivt_initial->entry != 0x0) && \ |
59 | (ivt_initial->reserved1 == 0x0) && \ | 69 | (ivt_initial->reserved1 == 0x0) && \ |
60 | (ivt_initial->self == (uint32_t)ivt_initial) && \ | 70 | (ivt_initial->self == (uint32_t)ivt_initial) && \ |
61 | (ivt_initial->csf != 0x0) && \ | 71 | (ivt_initial->csf != 0x0) && \ |
62 | (ivt_initial->reserved2 == 0x0)) { | 72 | (ivt_initial->reserved2 == 0x0)) { |
63 | if (ivt_initial->dcd != 0x0) | 73 | if (ivt_initial->dcd != 0x0) |
64 | return false; | 74 | return false; |
65 | else | 75 | else |
66 | return true; | 76 | return true; |
67 | } | 77 | } |
68 | 78 | ||
69 | return false; | 79 | return false; |
70 | } | 80 | } |
71 | 81 | ||
72 | bool valid_tos() { | 82 | bool valid_tos() { |
73 | /* | 83 | /* |
74 | * If enabled SECURE_BOOT then use HAB to verify tos. | 84 | * If enabled SECURE_BOOT then use HAB to verify tos. |
75 | * Or check the IVT only. | 85 | * Or check the IVT only. |
76 | */ | 86 | */ |
77 | bool valid = false; | 87 | bool valid = false; |
78 | #ifdef CONFIG_IMX_HAB | 88 | #ifdef CONFIG_IMX_HAB |
79 | if (is_hab_enabled()) { | 89 | if (is_hab_enabled()) { |
80 | valid = authenticate_image(TRUSTY_OS_ENTRY, TRUSTY_OS_PADDED_SZ); | 90 | valid = authenticate_image(TRUSTY_OS_ENTRY, TRUSTY_OS_PADDED_SZ); |
81 | } else | 91 | } else |
82 | #endif | 92 | #endif |
83 | valid = tos_ivt_check(TRUSTY_OS_ENTRY, TRUSTY_OS_PADDED_SZ); | 93 | valid = tos_ivt_check(TRUSTY_OS_ENTRY, TRUSTY_OS_PADDED_SZ); |
84 | 94 | ||
85 | if (valid) { | 95 | if (valid) { |
86 | tos_flashed = true; | 96 | tos_flashed = true; |
87 | return true; | 97 | return true; |
88 | } else { | 98 | } else { |
89 | tos_flashed = false; | 99 | tos_flashed = false; |
90 | return false; | 100 | return false; |
91 | } | 101 | } |
92 | } | 102 | } |
93 | 103 | ||
94 | #endif | 104 | #endif |
95 | 105 | ||
96 | #if !defined(FASTBOOT_ENCRYPT_LOCK) || defined(NON_SECURE_FASTBOOT) | 106 | #if !defined(FASTBOOT_ENCRYPT_LOCK) || defined(NON_SECURE_FASTBOOT) |
97 | 107 | ||
98 | /* | 108 | /* |
99 | * This will return FASTBOOT_LOCK, FASTBOOT_UNLOCK or FASTBOOT_ERROR | 109 | * This will return FASTBOOT_LOCK, FASTBOOT_UNLOCK or FASTBOOT_ERROR |
100 | */ | 110 | */ |
101 | #ifndef CONFIG_IMX_TRUSTY_OS | 111 | #ifndef CONFIG_IMX_TRUSTY_OS |
102 | static FbLockState decrypt_lock_store(unsigned char* bdata) { | 112 | static FbLockState decrypt_lock_store(unsigned char* bdata) { |
103 | if (!strncmp((const char *)bdata, "locked", strlen("locked"))) | 113 | if (!strncmp((const char *)bdata, "locked", strlen("locked"))) |
104 | return FASTBOOT_LOCK; | 114 | return FASTBOOT_LOCK; |
105 | else if (!strncmp((const char *)bdata, "unlocked", strlen("unlocked"))) | 115 | else if (!strncmp((const char *)bdata, "unlocked", strlen("unlocked"))) |
106 | return FASTBOOT_UNLOCK; | 116 | return FASTBOOT_UNLOCK; |
107 | else | 117 | else |
108 | return FASTBOOT_LOCK_ERROR; | 118 | return FASTBOOT_LOCK_ERROR; |
109 | } | 119 | } |
110 | static inline int encrypt_lock_store(FbLockState lock, unsigned char* bdata) { | 120 | static inline int encrypt_lock_store(FbLockState lock, unsigned char* bdata) { |
111 | if (FASTBOOT_LOCK == lock) | 121 | if (FASTBOOT_LOCK == lock) |
112 | strncpy((char *)bdata, "locked", strlen("locked")); | 122 | strncpy((char *)bdata, "locked", strlen("locked")); |
113 | else if (FASTBOOT_UNLOCK == lock) | 123 | else if (FASTBOOT_UNLOCK == lock) |
114 | strncpy((char *)bdata, "unlocked", strlen("unlocked")); | 124 | strncpy((char *)bdata, "unlocked", strlen("unlocked")); |
115 | else | 125 | else |
116 | return -1; | 126 | return -1; |
117 | return 0; | 127 | return 0; |
118 | } | 128 | } |
119 | #endif | 129 | #endif |
120 | #else | 130 | #else |
121 | 131 | ||
122 | static int sha1sum(unsigned char* data, int len, unsigned char* output) { | 132 | static int sha1sum(unsigned char* data, int len, unsigned char* output) { |
123 | struct hash_algo *algo; | 133 | struct hash_algo *algo; |
124 | void *buf; | 134 | void *buf; |
125 | if (hash_lookup_algo("sha1", &algo)) { | 135 | if (hash_lookup_algo("sha1", &algo)) { |
126 | printf("error in lookup sha1 algo!\n"); | 136 | printf("error in lookup sha1 algo!\n"); |
127 | return -1; | 137 | return -1; |
128 | } | 138 | } |
129 | buf = map_sysmem((ulong)data, len); | 139 | buf = map_sysmem((ulong)data, len); |
130 | algo->hash_func_ws(buf, len, output, algo->chunk_size); | 140 | algo->hash_func_ws(buf, len, output, algo->chunk_size); |
131 | unmap_sysmem(buf); | 141 | unmap_sysmem(buf); |
132 | 142 | ||
133 | return algo->digest_size; | 143 | return algo->digest_size; |
134 | 144 | ||
135 | } | 145 | } |
136 | 146 | ||
137 | static int generate_salt(unsigned char* salt) { | 147 | static int generate_salt(unsigned char* salt) { |
138 | unsigned long time = get_timer(0); | 148 | unsigned long time = get_timer(0); |
139 | return sha1sum((unsigned char *)&time, sizeof(unsigned long), salt); | 149 | return sha1sum((unsigned char *)&time, sizeof(unsigned long), salt); |
140 | 150 | ||
141 | } | 151 | } |
142 | 152 | ||
143 | static FbLockState decrypt_lock_store(unsigned char *bdata) { | 153 | static FbLockState decrypt_lock_store(unsigned char *bdata) { |
144 | int p = 0, ret; | 154 | int p = 0, ret; |
145 | ALLOC_CACHE_ALIGN_BUFFER(uint8_t, plain_data, ENDATA_LEN); | 155 | ALLOC_CACHE_ALIGN_BUFFER(uint8_t, plain_data, ENDATA_LEN); |
146 | 156 | ||
147 | caam_open(); | 157 | caam_open(); |
148 | ret = caam_decap_blob((uint32_t)(ulong)plain_data, | 158 | ret = caam_decap_blob((uint32_t)(ulong)plain_data, |
149 | (uint32_t)(ulong)bdata + ROUND(ENDATA_LEN, ARCH_DMA_MINALIGN), | 159 | (uint32_t)(ulong)bdata + ROUND(ENDATA_LEN, ARCH_DMA_MINALIGN), |
150 | ENDATA_LEN); | 160 | ENDATA_LEN); |
151 | if (ret != 0) { | 161 | if (ret != 0) { |
152 | printf("Error during blob decap operation: 0x%x\n",ret); | 162 | printf("Error during blob decap operation: 0x%x\n",ret); |
153 | return FASTBOOT_LOCK_ERROR; | 163 | return FASTBOOT_LOCK_ERROR; |
154 | } | 164 | } |
155 | #ifdef FASTBOOT_LOCK_DEBUG | 165 | #ifdef FASTBOOT_LOCK_DEBUG |
156 | FB_DEBUG("Decrypt data block are:\n \t=======\t\n"); | 166 | FB_DEBUG("Decrypt data block are:\n \t=======\t\n"); |
157 | for (p = 0; p < ENDATA_LEN; p++) { | 167 | for (p = 0; p < ENDATA_LEN; p++) { |
158 | FB_DEBUG("0x%2x ", *(bdata + p)); | 168 | FB_DEBUG("0x%2x ", *(bdata + p)); |
159 | if (p % 16 == 0) | 169 | if (p % 16 == 0) |
160 | FB_DEBUG("\n"); | 170 | FB_DEBUG("\n"); |
161 | } | 171 | } |
162 | FB_DEBUG("\n \t========\t\n"); | 172 | FB_DEBUG("\n \t========\t\n"); |
163 | for (p = ENDATA_LEN; p < (ENDATA_LEN + ENDATA_LEN + 48 ); p++) { | 173 | for (p = ENDATA_LEN; p < (ENDATA_LEN + ENDATA_LEN + 48 ); p++) { |
164 | FB_DEBUG("0x%2x ", *(bdata + p)); | 174 | FB_DEBUG("0x%2x ", *(bdata + p)); |
165 | if (p % 16 == 0) | 175 | if (p % 16 == 0) |
166 | FB_DEBUG("\n"); | 176 | FB_DEBUG("\n"); |
167 | } | 177 | } |
168 | 178 | ||
169 | FB_DEBUG("\n plain text are:\n"); | 179 | FB_DEBUG("\n plain text are:\n"); |
170 | for (p = 0; p < ENDATA_LEN; p++) { | 180 | for (p = 0; p < ENDATA_LEN; p++) { |
171 | FB_DEBUG("0x%2x ", plain_data[p]); | 181 | FB_DEBUG("0x%2x ", plain_data[p]); |
172 | if (p % 16 == 0) | 182 | if (p % 16 == 0) |
173 | FB_DEBUG("\n"); | 183 | FB_DEBUG("\n"); |
174 | } | 184 | } |
175 | FB_DEBUG("\n"); | 185 | FB_DEBUG("\n"); |
176 | #endif | 186 | #endif |
177 | 187 | ||
178 | for (p = 0; p < ENDATA_LEN-1; p++) { | 188 | for (p = 0; p < ENDATA_LEN-1; p++) { |
179 | if (*(bdata+p) != plain_data[p]) { | 189 | if (*(bdata+p) != plain_data[p]) { |
180 | FB_DEBUG("Verify salt in decrypt error on pointer %d\n", p); | 190 | FB_DEBUG("Verify salt in decrypt error on pointer %d\n", p); |
181 | return FASTBOOT_LOCK_ERROR; | 191 | return FASTBOOT_LOCK_ERROR; |
182 | } | 192 | } |
183 | } | 193 | } |
184 | 194 | ||
185 | if (plain_data[ENDATA_LEN - 1] >= FASTBOOT_LOCK_NUM) | 195 | if (plain_data[ENDATA_LEN - 1] >= FASTBOOT_LOCK_NUM) |
186 | return FASTBOOT_LOCK_ERROR; | 196 | return FASTBOOT_LOCK_ERROR; |
187 | else | 197 | else |
188 | return plain_data[ENDATA_LEN-1]; | 198 | return plain_data[ENDATA_LEN-1]; |
189 | } | 199 | } |
190 | 200 | ||
191 | static int encrypt_lock_store(FbLockState lock, unsigned char* bdata) { | 201 | static int encrypt_lock_store(FbLockState lock, unsigned char* bdata) { |
192 | unsigned int p = 0; | 202 | unsigned int p = 0; |
193 | int ret; | 203 | int ret; |
194 | int salt_len = generate_salt(bdata); | 204 | int salt_len = generate_salt(bdata); |
195 | if (salt_len < 0) | 205 | if (salt_len < 0) |
196 | return -1; | 206 | return -1; |
197 | 207 | ||
198 | //salt_len cannot be longer than endata block size. | 208 | //salt_len cannot be longer than endata block size. |
199 | if (salt_len >= ENDATA_LEN) | 209 | if (salt_len >= ENDATA_LEN) |
200 | salt_len = ENDATA_LEN - 1; | 210 | salt_len = ENDATA_LEN - 1; |
201 | 211 | ||
202 | p = ENDATA_LEN - 1; | 212 | p = ENDATA_LEN - 1; |
203 | 213 | ||
204 | //Set lock value | 214 | //Set lock value |
205 | *(bdata + p) = lock; | 215 | *(bdata + p) = lock; |
206 | 216 | ||
207 | caam_open(); | 217 | caam_open(); |
208 | ret = caam_gen_blob((uint32_t)(ulong)bdata, | 218 | ret = caam_gen_blob((uint32_t)(ulong)bdata, |
209 | (uint32_t)(ulong)bdata + ROUND(ENDATA_LEN, ARCH_DMA_MINALIGN), | 219 | (uint32_t)(ulong)bdata + ROUND(ENDATA_LEN, ARCH_DMA_MINALIGN), |
210 | ENDATA_LEN); | 220 | ENDATA_LEN); |
211 | if (ret != 0) { | 221 | if (ret != 0) { |
212 | printf("error in caam_gen_blob:0x%x\n", ret); | 222 | printf("error in caam_gen_blob:0x%x\n", ret); |
213 | return -1; | 223 | return -1; |
214 | } | 224 | } |
215 | 225 | ||
216 | 226 | ||
217 | #ifdef FASTBOOT_LOCK_DEBUG | 227 | #ifdef FASTBOOT_LOCK_DEBUG |
218 | int i = 0; | 228 | int i = 0; |
219 | FB_DEBUG("encrypt plain_text:\n"); | 229 | FB_DEBUG("encrypt plain_text:\n"); |
220 | for (i = 0; i < ENDATA_LEN; i++) { | 230 | for (i = 0; i < ENDATA_LEN; i++) { |
221 | FB_DEBUG("0x%2x\t", *(bdata+i)); | 231 | FB_DEBUG("0x%2x\t", *(bdata+i)); |
222 | if (i % 16 == 0) | 232 | if (i % 16 == 0) |
223 | printf("\n"); | 233 | printf("\n"); |
224 | } | 234 | } |
225 | printf("\nto:\n"); | 235 | printf("\nto:\n"); |
226 | for (i=0; i < ENDATA_LEN + 48; i++) { | 236 | for (i=0; i < ENDATA_LEN + 48; i++) { |
227 | FB_DEBUG("0x%2x\t", *(bdata + ENDATA_LEN + i)); | 237 | FB_DEBUG("0x%2x\t", *(bdata + ENDATA_LEN + i)); |
228 | if (i % 16 == 0) | 238 | if (i % 16 == 0) |
229 | printf("\n"); | 239 | printf("\n"); |
230 | } | 240 | } |
231 | printf("\n"); | 241 | printf("\n"); |
232 | 242 | ||
233 | #endif | 243 | #endif |
234 | //protect value | 244 | //protect value |
235 | *(bdata + p) = 0xff; | 245 | *(bdata + p) = 0xff; |
236 | return 0; | 246 | return 0; |
237 | } | 247 | } |
238 | 248 | ||
239 | #endif | 249 | #endif |
240 | 250 | ||
241 | static char mmc_dev_part[16]; | 251 | static char mmc_dev_part[16]; |
242 | static char* get_mmc_part(int part) { | 252 | static char* get_mmc_part(int part) { |
243 | u32 dev_no = mmc_get_env_dev(); | 253 | u32 dev_no = mmc_get_env_dev(); |
244 | sprintf(mmc_dev_part,"%x:%x",dev_no, part); | 254 | sprintf(mmc_dev_part,"%x:%x",dev_no, part); |
245 | return mmc_dev_part; | 255 | return mmc_dev_part; |
246 | } | 256 | } |
247 | 257 | ||
248 | static inline void set_lock_disable_data(unsigned char* bdata) { | 258 | static inline void set_lock_disable_data(unsigned char* bdata) { |
249 | *(bdata + SECTOR_SIZE -1) = 0; | 259 | *(bdata + SECTOR_SIZE -1) = 0; |
250 | } | 260 | } |
251 | 261 | ||
252 | /* | 262 | /* |
253 | * The enabling value is stored in the last byte of target partition. | 263 | * The enabling value is stored in the last byte of target partition. |
254 | */ | 264 | */ |
255 | static inline unsigned char lock_enable_parse(unsigned char* bdata) { | 265 | static inline unsigned char lock_enable_parse(unsigned char* bdata) { |
256 | FB_DEBUG("lock_enable_parse: 0x%x\n", *(bdata + SECTOR_SIZE -1)); | 266 | FB_DEBUG("lock_enable_parse: 0x%x\n", *(bdata + SECTOR_SIZE -1)); |
257 | if (*(bdata + SECTOR_SIZE -1) >= FASTBOOT_UL_NUM) | 267 | if (*(bdata + SECTOR_SIZE -1) >= FASTBOOT_UL_NUM) |
258 | return FASTBOOT_UL_ERROR; | 268 | return FASTBOOT_UL_ERROR; |
259 | else | 269 | else |
260 | return *(bdata + SECTOR_SIZE -1); | 270 | return *(bdata + SECTOR_SIZE -1); |
261 | } | 271 | } |
262 | 272 | ||
263 | static FbLockState g_lockstat = FASTBOOT_UNLOCK; | 273 | static FbLockState g_lockstat = FASTBOOT_UNLOCK; |
264 | 274 | ||
265 | #ifdef CONFIG_IMX_TRUSTY_OS | 275 | #ifdef CONFIG_IMX_TRUSTY_OS |
266 | FbLockState fastboot_get_lock_stat(void) { | 276 | FbLockState fastboot_get_lock_stat(void) { |
267 | uint8_t l_status; | 277 | uint8_t l_status; |
268 | int ret; | 278 | int ret; |
269 | /* | 279 | /* |
270 | * If Trusty OS not flashed, then must return | 280 | * If Trusty OS not flashed, then must return |
271 | * unlock status to make device been able | 281 | * unlock status to make device been able |
272 | * to flash Trusty OS binary. | 282 | * to flash Trusty OS binary. |
273 | */ | 283 | */ |
274 | #ifndef CONFIG_ARM64 | 284 | #ifndef CONFIG_ARM64 |
275 | if (!tos_flashed) | 285 | if (!tos_flashed) |
276 | return FASTBOOT_UNLOCK; | 286 | return FASTBOOT_UNLOCK; |
277 | #endif | 287 | #endif |
278 | ret = trusty_read_lock_state(&l_status); | 288 | ret = trusty_read_lock_state(&l_status); |
279 | if (ret < 0) | 289 | if (ret < 0) |
280 | return g_lockstat; | 290 | return g_lockstat; |
281 | else | 291 | else |
282 | return l_status; | 292 | return l_status; |
283 | 293 | ||
284 | } | 294 | } |
285 | 295 | ||
286 | int fastboot_set_lock_stat(FbLockState lock) { | 296 | int fastboot_set_lock_stat(FbLockState lock) { |
287 | int ret; | 297 | int ret; |
288 | /* | 298 | /* |
289 | * If Trusty OS not flashed, we must prevent set lock | 299 | * If Trusty OS not flashed, we must prevent set lock |
290 | * status. Due the Trusty IPC won't work here. | 300 | * status. Due the Trusty IPC won't work here. |
291 | */ | 301 | */ |
292 | #ifndef CONFIG_ARM64 | 302 | #ifndef CONFIG_ARM64 |
293 | if (!tos_flashed) | 303 | if (!tos_flashed) |
294 | return 0; | 304 | return 0; |
295 | #endif | 305 | #endif |
296 | ret = trusty_write_lock_state(lock); | 306 | ret = trusty_write_lock_state(lock); |
297 | if (ret < 0) { | 307 | if (ret < 0) { |
298 | printf("cannot set lock status due Trusty return %d\n", ret); | 308 | printf("cannot set lock status due Trusty return %d\n", ret); |
299 | return ret; | 309 | return ret; |
300 | } | 310 | } |
301 | return 0; | 311 | return 0; |
302 | } | 312 | } |
303 | #else | 313 | #else |
304 | 314 | ||
305 | /* | 315 | /* |
306 | * Set status of the lock&unlock to FSL_FASTBOOT_FB_PART | 316 | * Set status of the lock&unlock to FSL_FASTBOOT_FB_PART |
307 | * Currently use the very first Byte of FSL_FASTBOOT_FB_PART | 317 | * Currently use the very first Byte of FSL_FASTBOOT_FB_PART |
308 | * to store the fastboot lock&unlock status | 318 | * to store the fastboot lock&unlock status |
309 | */ | 319 | */ |
310 | int fastboot_set_lock_stat(FbLockState lock) { | 320 | int fastboot_set_lock_stat(FbLockState lock) { |
311 | struct blk_desc *fs_dev_desc; | 321 | struct blk_desc *fs_dev_desc; |
312 | disk_partition_t fs_partition; | 322 | disk_partition_t fs_partition; |
313 | unsigned char *bdata; | 323 | unsigned char *bdata; |
314 | int mmc_id; | 324 | int mmc_id; |
315 | int status, ret; | 325 | int status, ret; |
316 | 326 | ||
317 | bdata = (unsigned char *)memalign(ARCH_DMA_MINALIGN, SECTOR_SIZE); | 327 | bdata = (unsigned char *)memalign(ARCH_DMA_MINALIGN, SECTOR_SIZE); |
318 | if (bdata == NULL) | 328 | if (bdata == NULL) |
319 | goto fail2; | 329 | goto fail2; |
320 | memset(bdata, 0, SECTOR_SIZE); | 330 | memset(bdata, 0, SECTOR_SIZE); |
321 | 331 | ||
322 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_FBMISC); | 332 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_FBMISC); |
323 | if (mmc_id < 0) { | 333 | if (mmc_id < 0) { |
324 | printf("%s: error in get mmc part\n", __FUNCTION__); | 334 | printf("%s: error in get mmc part\n", __FUNCTION__); |
325 | ret = -1; | 335 | ret = -1; |
326 | goto fail; | 336 | goto fail; |
327 | } | 337 | } |
328 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, | 338 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, |
329 | get_mmc_part(mmc_id), | 339 | get_mmc_part(mmc_id), |
330 | &fs_dev_desc, &fs_partition, 1); | 340 | &fs_dev_desc, &fs_partition, 1); |
331 | if (status < 0) { | 341 | if (status < 0) { |
332 | printf("%s:error in getdevice partition.\n", __FUNCTION__); | 342 | printf("%s:error in getdevice partition.\n", __FUNCTION__); |
333 | ret = -1; | 343 | ret = -1; |
334 | goto fail; | 344 | goto fail; |
335 | } | 345 | } |
336 | 346 | ||
337 | status = encrypt_lock_store(lock, bdata); | 347 | status = encrypt_lock_store(lock, bdata); |
338 | if (status < 0) { | 348 | if (status < 0) { |
339 | ret = -1; | 349 | ret = -1; |
340 | goto fail; | 350 | goto fail; |
341 | } | 351 | } |
342 | status = blk_dwrite(fs_dev_desc, fs_partition.start, 1, bdata); | 352 | status = blk_dwrite(fs_dev_desc, fs_partition.start, 1, bdata); |
343 | if (!status) { | 353 | if (!status) { |
344 | printf("%s:error in block write.\n", __FUNCTION__); | 354 | printf("%s:error in block write.\n", __FUNCTION__); |
345 | ret = -1; | 355 | ret = -1; |
346 | goto fail; | 356 | goto fail; |
347 | } | 357 | } |
348 | ret = 0; | 358 | ret = 0; |
349 | fail: | 359 | fail: |
350 | free(bdata); | 360 | free(bdata); |
351 | return ret; | 361 | return ret; |
352 | fail2: | 362 | fail2: |
353 | g_lockstat = lock; | 363 | g_lockstat = lock; |
354 | return 0; | 364 | return 0; |
355 | } | 365 | } |
356 | 366 | ||
357 | FbLockState fastboot_get_lock_stat(void) { | 367 | FbLockState fastboot_get_lock_stat(void) { |
358 | struct blk_desc *fs_dev_desc; | 368 | struct blk_desc *fs_dev_desc; |
359 | disk_partition_t fs_partition; | 369 | disk_partition_t fs_partition; |
360 | unsigned char *bdata; | 370 | unsigned char *bdata; |
361 | int mmc_id; | 371 | int mmc_id; |
362 | FbLockState ret; | 372 | FbLockState ret; |
363 | /* uboot used by uuu will boot from USB, always return UNLOCK state */ | 373 | /* uboot used by uuu will boot from USB, always return UNLOCK state */ |
364 | if (is_boot_from_usb()) | 374 | if (is_boot_from_usb()) |
365 | return g_lockstat; | 375 | return g_lockstat; |
366 | 376 | ||
367 | bdata = (unsigned char *)memalign(ARCH_DMA_MINALIGN, SECTOR_SIZE); | 377 | bdata = (unsigned char *)memalign(ARCH_DMA_MINALIGN, SECTOR_SIZE); |
368 | if (bdata == NULL) | 378 | if (bdata == NULL) |
369 | return g_lockstat; | 379 | return g_lockstat; |
370 | 380 | ||
371 | int status; | 381 | int status; |
372 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_FBMISC); | 382 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_FBMISC); |
373 | if (mmc_id < 0) { | 383 | if (mmc_id < 0) { |
374 | printf("%s: error in get mmc part\n", __FUNCTION__); | 384 | printf("%s: error in get mmc part\n", __FUNCTION__); |
375 | ret = g_lockstat; | 385 | ret = g_lockstat; |
376 | goto fail; | 386 | goto fail; |
377 | } | 387 | } |
378 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, | 388 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, |
379 | get_mmc_part(mmc_id), | 389 | get_mmc_part(mmc_id), |
380 | &fs_dev_desc, &fs_partition, 1); | 390 | &fs_dev_desc, &fs_partition, 1); |
381 | 391 | ||
382 | if (status < 0) { | 392 | if (status < 0) { |
383 | printf("%s:error in getdevice partition.\n", __FUNCTION__); | 393 | printf("%s:error in getdevice partition.\n", __FUNCTION__); |
384 | ret = g_lockstat; | 394 | ret = g_lockstat; |
385 | goto fail; | 395 | goto fail; |
386 | } | 396 | } |
387 | 397 | ||
388 | status = blk_dread(fs_dev_desc, fs_partition.start, 1, bdata); | 398 | status = blk_dread(fs_dev_desc, fs_partition.start, 1, bdata); |
389 | if (!status) { | 399 | if (!status) { |
390 | printf("%s:error in block read.\n", __FUNCTION__); | 400 | printf("%s:error in block read.\n", __FUNCTION__); |
391 | ret = FASTBOOT_LOCK_ERROR; | 401 | ret = FASTBOOT_LOCK_ERROR; |
392 | goto fail; | 402 | goto fail; |
393 | } | 403 | } |
394 | 404 | ||
395 | ret = decrypt_lock_store(bdata); | 405 | ret = decrypt_lock_store(bdata); |
396 | fail: | 406 | fail: |
397 | free(bdata); | 407 | free(bdata); |
398 | return ret; | 408 | return ret; |
399 | } | 409 | } |
400 | #endif | 410 | #endif |
401 | 411 | ||
402 | 412 | ||
403 | /* Return the last byte of of FSL_FASTBOOT_PR_DATA | 413 | /* Return the last byte of of FSL_FASTBOOT_PR_DATA |
404 | * which is managed by PresistDataService | 414 | * which is managed by PresistDataService |
405 | */ | 415 | */ |
406 | 416 | ||
407 | #ifdef CONFIG_ENABLE_LOCKSTATUS_SUPPORT | 417 | #ifdef CONFIG_ENABLE_LOCKSTATUS_SUPPORT |
408 | //Brillo has no presist data partition | 418 | //Brillo has no presist data partition |
409 | FbLockEnableResult fastboot_lock_enable(void) { | 419 | FbLockEnableResult fastboot_lock_enable(void) { |
410 | return FASTBOOT_UL_ENABLE; | 420 | return FASTBOOT_UL_ENABLE; |
411 | } | 421 | } |
412 | void set_fastboot_lock_disable(void) { | 422 | void set_fastboot_lock_disable(void) { |
413 | } | 423 | } |
414 | #else | 424 | #else |
415 | void set_fastboot_lock_disable(void) { | 425 | void set_fastboot_lock_disable(void) { |
416 | struct blk_desc *fs_dev_desc; | 426 | struct blk_desc *fs_dev_desc; |
417 | disk_partition_t fs_partition; | 427 | disk_partition_t fs_partition; |
418 | unsigned char *bdata; | 428 | unsigned char *bdata; |
419 | int mmc_id; | 429 | int mmc_id; |
420 | 430 | ||
421 | bdata = (unsigned char *)memalign(ALIGN_BYTES, SECTOR_SIZE); | 431 | bdata = (unsigned char *)memalign(ALIGN_BYTES, SECTOR_SIZE); |
422 | if (bdata == NULL) | 432 | if (bdata == NULL) |
423 | return; | 433 | return; |
424 | set_lock_disable_data(bdata); | 434 | set_lock_disable_data(bdata); |
425 | int status; | 435 | int status; |
426 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_PRDATA); | 436 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_PRDATA); |
427 | if (mmc_id < 0) { | 437 | if (mmc_id < 0) { |
428 | printf("%s: error in get mmc part\n", __FUNCTION__); | 438 | printf("%s: error in get mmc part\n", __FUNCTION__); |
429 | goto fail; | 439 | goto fail; |
430 | } | 440 | } |
431 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, | 441 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, |
432 | get_mmc_part(mmc_id), | 442 | get_mmc_part(mmc_id), |
433 | &fs_dev_desc, &fs_partition, 1); | 443 | &fs_dev_desc, &fs_partition, 1); |
434 | if (status < 0) { | 444 | if (status < 0) { |
435 | printf("%s:error in getdevice partition.\n", __FUNCTION__); | 445 | printf("%s:error in getdevice partition.\n", __FUNCTION__); |
436 | goto fail; | 446 | goto fail; |
437 | } | 447 | } |
438 | 448 | ||
439 | lbaint_t target_block = fs_partition.start + fs_partition.size - 1; | 449 | lbaint_t target_block = fs_partition.start + fs_partition.size - 1; |
440 | status = blk_dwrite(fs_dev_desc, target_block, 1, bdata); | 450 | status = blk_dwrite(fs_dev_desc, target_block, 1, bdata); |
441 | if (!status) { | 451 | if (!status) { |
442 | printf("%s: error in block read\n", __FUNCTION__); | 452 | printf("%s: error in block read\n", __FUNCTION__); |
443 | goto fail; | 453 | goto fail; |
444 | } | 454 | } |
445 | 455 | ||
446 | fail: | 456 | fail: |
447 | free(bdata); | 457 | free(bdata); |
448 | return; | 458 | return; |
449 | 459 | ||
450 | } | 460 | } |
451 | FbLockEnableResult fastboot_lock_enable() { | 461 | FbLockEnableResult fastboot_lock_enable() { |
452 | #ifdef CONFIG_DUAL_BOOTLOADER | 462 | #ifdef CONFIG_DUAL_BOOTLOADER |
453 | /* Always allow unlock device in spl recovery mode. */ | 463 | /* Always allow unlock device in spl recovery mode. */ |
454 | if (is_spl_recovery()) | 464 | if (is_spl_recovery()) |
455 | return FASTBOOT_UL_ENABLE; | 465 | return FASTBOOT_UL_ENABLE; |
456 | #endif | 466 | #endif |
457 | 467 | ||
458 | #if defined(CONFIG_IMX_TRUSTY_OS) || defined(CONFIG_TRUSTY_UNLOCK_PERMISSION) | 468 | #if defined(CONFIG_IMX_TRUSTY_OS) || defined(CONFIG_TRUSTY_UNLOCK_PERMISSION) |
459 | int ret; | 469 | int ret; |
460 | uint8_t oem_device_unlock; | 470 | uint8_t oem_device_unlock; |
461 | 471 | ||
462 | ret = trusty_read_oem_unlock_device_permission(&oem_device_unlock); | 472 | ret = trusty_read_oem_unlock_device_permission(&oem_device_unlock); |
463 | if (ret < 0) | 473 | if (ret < 0) |
464 | return FASTBOOT_UL_ERROR; | 474 | return FASTBOOT_UL_ERROR; |
465 | else | 475 | else |
466 | return oem_device_unlock; | 476 | return oem_device_unlock; |
467 | #else /* CONFIG_IMX_TRUSTY_OS */ | 477 | #else /* CONFIG_IMX_TRUSTY_OS */ |
468 | FbLockEnableResult ret; | 478 | FbLockEnableResult ret; |
469 | struct blk_desc *fs_dev_desc; | 479 | struct blk_desc *fs_dev_desc; |
470 | disk_partition_t fs_partition; | 480 | disk_partition_t fs_partition; |
471 | unsigned char *bdata; | 481 | unsigned char *bdata; |
472 | int mmc_id; | 482 | int mmc_id; |
473 | 483 | ||
474 | bdata = (unsigned char *)memalign(ALIGN_BYTES, SECTOR_SIZE); | 484 | bdata = (unsigned char *)memalign(ALIGN_BYTES, SECTOR_SIZE); |
475 | if (bdata == NULL) | 485 | if (bdata == NULL) |
476 | return FASTBOOT_UL_ERROR; | 486 | return FASTBOOT_UL_ERROR; |
477 | int status; | 487 | int status; |
478 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_PRDATA); | 488 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_PRDATA); |
479 | if (mmc_id < 0) { | 489 | if (mmc_id < 0) { |
480 | printf("%s: error in get mmc part\n", __FUNCTION__); | 490 | printf("%s: error in get mmc part\n", __FUNCTION__); |
481 | ret = FASTBOOT_UL_ERROR; | 491 | ret = FASTBOOT_UL_ERROR; |
482 | goto fail; | 492 | goto fail; |
483 | } | 493 | } |
484 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, | 494 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, |
485 | get_mmc_part(mmc_id), | 495 | get_mmc_part(mmc_id), |
486 | &fs_dev_desc, &fs_partition, 1); | 496 | &fs_dev_desc, &fs_partition, 1); |
487 | if (status < 0) { | 497 | if (status < 0) { |
488 | printf("%s:error in getdevice partition.\n", __FUNCTION__); | 498 | printf("%s:error in getdevice partition.\n", __FUNCTION__); |
489 | ret = FASTBOOT_UL_ERROR; | 499 | ret = FASTBOOT_UL_ERROR; |
490 | goto fail; | 500 | goto fail; |
491 | } | 501 | } |
492 | 502 | ||
493 | //The data is stored in the last blcok of this partition. | 503 | //The data is stored in the last blcok of this partition. |
494 | lbaint_t target_block = fs_partition.start + fs_partition.size - 1; | 504 | lbaint_t target_block = fs_partition.start + fs_partition.size - 1; |
495 | status = blk_dread(fs_dev_desc, target_block, 1, bdata); | 505 | status = blk_dread(fs_dev_desc, target_block, 1, bdata); |
496 | if (!status) { | 506 | if (!status) { |
497 | printf("%s: error in block read\n", __FUNCTION__); | 507 | printf("%s: error in block read\n", __FUNCTION__); |
498 | ret = FASTBOOT_UL_ERROR; | 508 | ret = FASTBOOT_UL_ERROR; |
499 | goto fail; | 509 | goto fail; |
500 | } | 510 | } |
501 | int i = 0; | 511 | int i = 0; |
502 | FB_DEBUG("\n PRIST last sector is:\n"); | 512 | FB_DEBUG("\n PRIST last sector is:\n"); |
503 | for (i = 0; i < SECTOR_SIZE; i++) { | 513 | for (i = 0; i < SECTOR_SIZE; i++) { |
504 | FB_DEBUG("0x%x ", *(bdata + i)); | 514 | FB_DEBUG("0x%x ", *(bdata + i)); |
505 | if (i % 32 == 0) | 515 | if (i % 32 == 0) |
506 | FB_DEBUG("\n"); | 516 | FB_DEBUG("\n"); |
507 | } | 517 | } |
508 | FB_DEBUG("\n"); | 518 | FB_DEBUG("\n"); |
509 | ret = lock_enable_parse(bdata); | 519 | ret = lock_enable_parse(bdata); |
510 | fail: | 520 | fail: |
511 | free(bdata); | 521 | free(bdata); |
512 | return ret; | 522 | return ret; |
513 | #endif /* CONFIG_IMX_TRUSTY_OS */ | 523 | #endif /* CONFIG_IMX_TRUSTY_OS */ |
514 | 524 | ||
515 | } | 525 | } |
516 | #endif | 526 | #endif |
517 | 527 | ||
518 | int display_lock(FbLockState lock, int verify) { | 528 | int display_lock(FbLockState lock, int verify) { |
519 | struct stdio_dev *disp; | 529 | struct stdio_dev *disp; |
520 | disp = stdio_get_by_name("vga"); | 530 | disp = stdio_get_by_name("vga"); |
521 | if (disp != NULL) { | 531 | if (disp != NULL) { |
522 | if (lock == FASTBOOT_UNLOCK) { | 532 | if (lock == FASTBOOT_UNLOCK) { |
523 | disp->puts(disp, "\n============= NOTICE ============\n"); | 533 | disp->puts(disp, "\n============= NOTICE ============\n"); |
524 | disp->puts(disp, "| |\n"); | 534 | disp->puts(disp, "| |\n"); |
525 | disp->puts(disp, "| Your device is NOT locked. |\n"); | 535 | disp->puts(disp, "| Your device is NOT locked. |\n"); |
526 | disp->puts(disp, "| |\n"); | 536 | disp->puts(disp, "| |\n"); |
527 | disp->puts(disp, "=================================\n"); | 537 | disp->puts(disp, "=================================\n"); |
528 | } else { | 538 | } else { |
529 | if (verify == -1) { | 539 | if (verify == -1) { |
530 | disp->puts(disp, "\n============= NOTICE ============\n"); | 540 | disp->puts(disp, "\n============= NOTICE ============\n"); |
531 | disp->puts(disp, "| |\n"); | 541 | disp->puts(disp, "| |\n"); |
532 | disp->puts(disp, "| Your device is NOT protected. |\n"); | 542 | disp->puts(disp, "| Your device is NOT protected. |\n"); |
533 | disp->puts(disp, "| |\n"); | 543 | disp->puts(disp, "| |\n"); |
534 | disp->puts(disp, "=================================\n"); | 544 | disp->puts(disp, "=================================\n"); |
535 | } else if (verify == 1) { | 545 | } else if (verify == 1) { |
536 | disp->puts(disp, "\n============= NOTICE ============\n"); | 546 | disp->puts(disp, "\n============= NOTICE ============\n"); |
537 | disp->puts(disp, "| |\n"); | 547 | disp->puts(disp, "| |\n"); |
538 | disp->puts(disp, "| Boot verify failed! |\n"); | 548 | disp->puts(disp, "| Boot verify failed! |\n"); |
539 | disp->puts(disp, "| |\n"); | 549 | disp->puts(disp, "| |\n"); |
540 | disp->puts(disp, "=================================\n"); | 550 | disp->puts(disp, "=================================\n"); |
541 | } | 551 | } |
542 | } | 552 | } |
543 | return 0; | 553 | return 0; |
544 | } else | 554 | } else |
545 | printf("not found VGA disp console.\n"); | 555 | printf("not found VGA disp console.\n"); |
546 | 556 | ||
547 | return -1; | 557 | return -1; |
548 | 558 | ||
549 | } | 559 | } |
560 | |||
561 | #ifdef CONFIG_AVB_WARNING_LOGO | ||
562 | int display_unlock_warning(void) { | ||
563 | int ret; | ||
564 | struct udevice *dev; | ||
565 | |||
566 | ret = uclass_first_device_err(UCLASS_VIDEO, &dev); | ||
567 | if (!ret) { | ||
568 | /* clear screen first */ | ||
569 | video_clear(dev); | ||
570 | /* Draw the orange warning bmp logo */ | ||
571 | ret = bmp_display((ulong)orange_warning_bmp_bitmap, | ||
572 | CONFIG_AVB_WARNING_LOGO_COLS, CONFIG_AVB_WARNING_LOGO_ROWS); | ||
573 | |||
574 | /* Show warning text. */ | ||
575 | if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev)) { | ||
576 | printf("no text console device found!\n"); | ||
577 | return -1; | ||
578 | } | ||
579 | /* Adjust the cursor postion, the (x, y) are hard-coded here. */ | ||
580 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
581 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 6); | ||
582 | vidconsole_put_string(dev, "The bootloader is unlocked and software"); | ||
583 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
584 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 7); | ||
585 | vidconsole_put_string(dev, "integrity cannot be guaranteed. Any data"); | ||
586 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
587 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 8); | ||
588 | vidconsole_put_string(dev, "stored on the device may be available to"); | ||
589 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
590 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 9); | ||
591 | vidconsole_put_string(dev, "attackers. Do not store any sensitive data"); | ||
592 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
593 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 10); | ||
594 | vidconsole_put_string(dev, "on the device."); | ||
595 | /* Jump one line to show the link */ | ||
596 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
597 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 13); | ||
598 | vidconsole_put_string(dev, "Visit this link on another device:"); | ||
599 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
600 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 14); | ||
601 | vidconsole_put_string(dev, "g.co/ABH"); | ||
602 | |||
603 | vidconsole_position_cursor(dev, CONFIG_AVB_WARNING_LOGO_COLS/VIDEO_FONT_WIDTH, | ||
604 | CONFIG_AVB_WARNING_LOGO_ROWS/VIDEO_FONT_HEIGHT + 20); | ||
605 | vidconsole_put_string(dev, "PRESS POWER BUTTON TO CONTINUE..."); | ||
606 | /* sync frame buffer */ | ||
607 | video_sync_all(); | ||
608 | |||
609 | return 0; | ||
610 | } else { | ||
611 | printf("no video device found!\n"); | ||
612 | return -1; | ||
613 | } | ||
614 | } | ||
615 | #endif | ||
550 | 616 | ||
551 | int fastboot_wipe_data_partition(void) | 617 | int fastboot_wipe_data_partition(void) |
552 | { | 618 | { |
553 | struct blk_desc *fs_dev_desc; | 619 | struct blk_desc *fs_dev_desc; |
554 | disk_partition_t fs_partition; | 620 | disk_partition_t fs_partition; |
555 | int status; | 621 | int status; |
556 | int mmc_id; | 622 | int mmc_id; |
557 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_DATA); | 623 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_DATA); |
558 | if (mmc_id < 0) { | 624 | if (mmc_id < 0) { |
559 | printf("%s: error in get mmc part\n", __FUNCTION__); | 625 | printf("%s: error in get mmc part\n", __FUNCTION__); |
560 | return -1; | 626 | return -1; |
561 | } | 627 | } |
562 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, | 628 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, |
563 | get_mmc_part(mmc_id), &fs_dev_desc, &fs_partition, 1); | 629 | get_mmc_part(mmc_id), &fs_dev_desc, &fs_partition, 1); |
564 | if (status < 0) { | 630 | if (status < 0) { |
565 | printf("error in get device partition for wipe /data\n"); | 631 | printf("error in get device partition for wipe /data\n"); |
566 | return -1; | 632 | return -1; |
567 | } | 633 | } |
568 | status = blk_derase(fs_dev_desc, fs_partition.start , fs_partition.size ); | 634 | status = blk_derase(fs_dev_desc, fs_partition.start , fs_partition.size ); |
569 | if (status != fs_partition.size ) { | 635 | if (status != fs_partition.size ) { |
570 | printf("erase not complete\n"); | 636 | printf("erase not complete\n"); |
571 | return -1; | 637 | return -1; |
572 | } | 638 | } |
573 | mdelay(2000); | 639 | mdelay(2000); |
574 | 640 | ||
575 | return 0; | 641 | return 0; |
576 | } | 642 | } |
577 | 643 | ||
578 | void fastboot_wipe_all(void) { | 644 | void fastboot_wipe_all(void) { |
579 | struct blk_desc *fs_dev_desc; | 645 | struct blk_desc *fs_dev_desc; |
580 | disk_partition_t fs_partition; | 646 | disk_partition_t fs_partition; |
581 | int status; | 647 | int status; |
582 | int mmc_id; | 648 | int mmc_id; |
583 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_GPT); | 649 | mmc_id = fastboot_flash_find_index(FASTBOOT_PARTITION_GPT); |
584 | if (mmc_id < 0) { | 650 | if (mmc_id < 0) { |
585 | printf("%s: error in get mmc part\n", __FUNCTION__); | 651 | printf("%s: error in get mmc part\n", __FUNCTION__); |
586 | return; | 652 | return; |
587 | } | 653 | } |
588 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, | 654 | status = blk_get_device_part_str(FSL_FASTBOOT_FB_DEV, |
589 | get_mmc_part(mmc_id), &fs_dev_desc, &fs_partition, 1); | 655 | get_mmc_part(mmc_id), &fs_dev_desc, &fs_partition, 1); |
590 | if (status < 0) { | 656 | if (status < 0) { |
591 | printf("error in get device partition for wipe user partition\n"); | 657 | printf("error in get device partition for wipe user partition\n"); |
592 | return; | 658 | return; |
593 | } | 659 | } |
594 | status = blk_derase(fs_dev_desc, fs_partition.start , fs_partition.size ); | 660 | status = blk_derase(fs_dev_desc, fs_partition.start , fs_partition.size ); |
595 | if (status != fs_partition.size ) { | 661 | if (status != fs_partition.size ) { |
596 | printf("erase not complete\n"); | 662 | printf("erase not complete\n"); |
597 | return; | 663 | return; |
598 | } | 664 | } |
599 | printf("fastboot wiped all.\n"); | 665 | printf("fastboot wiped all.\n"); |
600 | } | 666 | } |
601 | 667 |
drivers/fastboot/fb_fsl/fastboot_lock_unlock.h
1 | /* | 1 | /* |
2 | * Copyright (c) 2016, Freescale Semiconductor, Inc. | 2 | * Copyright (c) 2016, Freescale Semiconductor, Inc. |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without modification, | 5 | * Redistribution and use in source and binary forms, with or without modification, |
6 | * are permitted provided that the following conditions are met: | 6 | * are permitted provided that the following conditions are met: |
7 | * | 7 | * |
8 | * o Redistributions of source code must retain the above copyright notice, this list | 8 | * o Redistributions of source code must retain the above copyright notice, this list |
9 | * of conditions and the following disclaimer. | 9 | * of conditions and the following disclaimer. |
10 | * | 10 | * |
11 | * o Redistributions in binary form must reproduce the above copyright notice, this | 11 | * o Redistributions in binary form must reproduce the above copyright notice, this |
12 | * list of conditions and the following disclaimer in the documentation and/or | 12 | * list of conditions and the following disclaimer in the documentation and/or |
13 | * other materials provided with the distribution. | 13 | * other materials provided with the distribution. |
14 | * | 14 | * |
15 | * o Neither the name of Freescale Semiconductor, Inc. nor the names of its | 15 | * o Neither the name of Freescale Semiconductor, Inc. nor the names of its |
16 | * contributors may be used to endorse or promote products derived from this | 16 | * contributors may be used to endorse or promote products derived from this |
17 | * software without specific prior written permission. | 17 | * software without specific prior written permission. |
18 | * | 18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
22 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | 22 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
23 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 23 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
24 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 24 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
26 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 27 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
28 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #ifndef FASTBOOT_LOCK_UNLOCK_H | 31 | #ifndef FASTBOOT_LOCK_UNLOCK_H |
32 | #define FASTBOOT_LOCK_UNLOCK_H | 32 | #define FASTBOOT_LOCK_UNLOCK_H |
33 | 33 | ||
34 | #define ALIGN_BYTES 64 /*armv7 cache line need 64 bytes aligned */ | 34 | #define ALIGN_BYTES 64 /*armv7 cache line need 64 bytes aligned */ |
35 | 35 | ||
36 | //#define FASTBOOT_LOCK_DEBUG | 36 | //#define FASTBOOT_LOCK_DEBUG |
37 | #ifdef CONFIG_FSL_CAAM_KB | 37 | #ifdef CONFIG_FSL_CAAM_KB |
38 | #define FASTBOOT_ENCRYPT_LOCK | 38 | #define FASTBOOT_ENCRYPT_LOCK |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | #ifdef FASTBOOT_LOCK_DEBUG | 41 | #ifdef FASTBOOT_LOCK_DEBUG |
42 | #define FB_DEBUG(format, ...) printf(format, ##__VA_ARGS__) | 42 | #define FB_DEBUG(format, ...) printf(format, ##__VA_ARGS__) |
43 | #else | 43 | #else |
44 | #define FB_DEBUG(format, ...) | 44 | #define FB_DEBUG(format, ...) |
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | typedef enum { | 47 | typedef enum { |
48 | FASTBOOT_UNLOCK, | 48 | FASTBOOT_UNLOCK, |
49 | FASTBOOT_LOCK, | 49 | FASTBOOT_LOCK, |
50 | FASTBOOT_LOCK_ERROR, | 50 | FASTBOOT_LOCK_ERROR, |
51 | FASTBOOT_LOCK_NUM | 51 | FASTBOOT_LOCK_NUM |
52 | }FbLockState; | 52 | }FbLockState; |
53 | 53 | ||
54 | typedef enum { | 54 | typedef enum { |
55 | FASTBOOT_UL_DISABLE, | 55 | FASTBOOT_UL_DISABLE, |
56 | FASTBOOT_UL_ENABLE, | 56 | FASTBOOT_UL_ENABLE, |
57 | FASTBOOT_UL_ERROR, | 57 | FASTBOOT_UL_ERROR, |
58 | FASTBOOT_UL_NUM | 58 | FASTBOOT_UL_NUM |
59 | }FbLockEnableResult; | 59 | }FbLockEnableResult; |
60 | 60 | ||
61 | FbLockState fastboot_get_lock_stat(void); | 61 | FbLockState fastboot_get_lock_stat(void); |
62 | 62 | ||
63 | int fastboot_set_lock_stat(FbLockState lock); | 63 | int fastboot_set_lock_stat(FbLockState lock); |
64 | 64 | ||
65 | int fastboot_wipe_data_partition(void); | 65 | int fastboot_wipe_data_partition(void); |
66 | void fastboot_wipe_all(void); | 66 | void fastboot_wipe_all(void); |
67 | 67 | ||
68 | FbLockEnableResult fastboot_lock_enable(void); | 68 | FbLockEnableResult fastboot_lock_enable(void); |
69 | void set_fastboot_lock_disable(void); | 69 | void set_fastboot_lock_disable(void); |
70 | 70 | ||
71 | int display_lock(FbLockState lock, int verify); | 71 | int display_lock(FbLockState lock, int verify); |
72 | 72 | ||
73 | int display_unlock_warning(void); | ||
74 | |||
73 | bool valid_tos(void); | 75 | bool valid_tos(void); |
74 | #endif | 76 | #endif |
75 | 77 |
drivers/fastboot/fb_fsl/fb_fsl_boot.c
1 | // SPDX-License-Identifier: GPL-2.0+ | 1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* | 2 | /* |
3 | * Copyright 2019 NXP | 3 | * Copyright 2019 NXP |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <asm/mach-imx/sys_proto.h> | 6 | #include <asm/mach-imx/sys_proto.h> |
7 | #include <fb_fsl.h> | 7 | #include <fb_fsl.h> |
8 | #include <fastboot.h> | 8 | #include <fastboot.h> |
9 | #include <mmc.h> | 9 | #include <mmc.h> |
10 | #include <android_image.h> | 10 | #include <android_image.h> |
11 | #include <asm/bootm.h> | 11 | #include <asm/bootm.h> |
12 | #include <nand.h> | 12 | #include <nand.h> |
13 | #include <part.h> | 13 | #include <part.h> |
14 | #include <sparse_format.h> | 14 | #include <sparse_format.h> |
15 | #include <image-sparse.h> | 15 | #include <image-sparse.h> |
16 | #include <image.h> | 16 | #include <image.h> |
17 | #include <asm/mach-imx/boot_mode.h> | 17 | #include <asm/mach-imx/boot_mode.h> |
18 | #include <asm/arch/sys_proto.h> | 18 | #include <asm/arch/sys_proto.h> |
19 | #include <asm/setup.h> | 19 | #include <asm/setup.h> |
20 | #include <env.h> | 20 | #include <env.h> |
21 | #include "../lib/avb/fsl/utils.h" | 21 | #include "../lib/avb/fsl/utils.h" |
22 | 22 | ||
23 | #ifdef CONFIG_AVB_SUPPORT | 23 | #ifdef CONFIG_AVB_SUPPORT |
24 | #include <dt_table.h> | 24 | #include <dt_table.h> |
25 | #include <fsl_avb.h> | 25 | #include <fsl_avb.h> |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | #ifdef CONFIG_ANDROID_THINGS_SUPPORT | 28 | #ifdef CONFIG_ANDROID_THINGS_SUPPORT |
29 | #include <asm-generic/gpio.h> | 29 | #include <asm-generic/gpio.h> |
30 | #include <asm/mach-imx/gpio.h> | 30 | #include <asm/mach-imx/gpio.h> |
31 | #include "../lib/avb/fsl/fsl_avbkey.h" | 31 | #include "../lib/avb/fsl/fsl_avbkey.h" |
32 | #include "../arch/arm/include/asm/mach-imx/hab.h" | 32 | #include "../arch/arm/include/asm/mach-imx/hab.h" |
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | #if defined(CONFIG_FASTBOOT_LOCK) | 35 | #if defined(CONFIG_FASTBOOT_LOCK) |
36 | #include "fastboot_lock_unlock.h" | 36 | #include "fastboot_lock_unlock.h" |
37 | #endif | 37 | #endif |
38 | 38 | ||
39 | #ifdef CONFIG_IMX_TRUSTY_OS | 39 | #ifdef CONFIG_IMX_TRUSTY_OS |
40 | #include "u-boot/sha256.h" | 40 | #include "u-boot/sha256.h" |
41 | #include <trusty/libtipc.h> | 41 | #include <trusty/libtipc.h> |
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #include "fb_fsl_common.h" | 44 | #include "fb_fsl_common.h" |
45 | 45 | ||
46 | /* max kernel image size */ | 46 | /* max kernel image size */ |
47 | #ifdef CONFIG_ARCH_IMX8 | 47 | #ifdef CONFIG_ARCH_IMX8 |
48 | /* imx8q has more limitation so we assign less memory here. */ | 48 | /* imx8q has more limitation so we assign less memory here. */ |
49 | #define MAX_KERNEL_LEN (60 * 1024 * 1024) | 49 | #define MAX_KERNEL_LEN (60 * 1024 * 1024) |
50 | #else | 50 | #else |
51 | #define MAX_KERNEL_LEN (64 * 1024 * 1024) | 51 | #define MAX_KERNEL_LEN (64 * 1024 * 1024) |
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | #ifdef CONFIG_ANDROID_THINGS_SUPPORT | 54 | #ifdef CONFIG_ANDROID_THINGS_SUPPORT |
55 | #define FDT_PART_NAME "oem_bootloader" | 55 | #define FDT_PART_NAME "oem_bootloader" |
56 | #else | 56 | #else |
57 | #define FDT_PART_NAME "dtbo" | 57 | #define FDT_PART_NAME "dtbo" |
58 | #endif | 58 | #endif |
59 | 59 | ||
60 | /* Offset (in u32's) of start and end fields in the zImage header. */ | 60 | /* Offset (in u32's) of start and end fields in the zImage header. */ |
61 | #define ZIMAGE_START_ADDR 10 | 61 | #define ZIMAGE_START_ADDR 10 |
62 | #define ZIMAGE_END_ADDR 11 | 62 | #define ZIMAGE_END_ADDR 11 |
63 | 63 | ||
64 | /* Boot metric variables */ | 64 | /* Boot metric variables */ |
65 | boot_metric metrics = { | 65 | boot_metric metrics = { |
66 | .bll_1 = 0, | 66 | .bll_1 = 0, |
67 | .ble_1 = 0, | 67 | .ble_1 = 0, |
68 | .kl = 0, | 68 | .kl = 0, |
69 | .kd = 0, | 69 | .kd = 0, |
70 | .avb = 0, | 70 | .avb = 0, |
71 | .odt = 0, | 71 | .odt = 0, |
72 | .sw = 0 | 72 | .sw = 0 |
73 | }; | 73 | }; |
74 | 74 | ||
75 | int read_from_partition_multi(const char* partition, | 75 | int read_from_partition_multi(const char* partition, |
76 | int64_t offset, size_t num_bytes, void* buffer, size_t* out_num_read) | 76 | int64_t offset, size_t num_bytes, void* buffer, size_t* out_num_read) |
77 | { | 77 | { |
78 | struct fastboot_ptentry *pte; | 78 | struct fastboot_ptentry *pte; |
79 | unsigned char *bdata; | 79 | unsigned char *bdata; |
80 | unsigned char *out_buf = (unsigned char *)buffer; | 80 | unsigned char *out_buf = (unsigned char *)buffer; |
81 | unsigned char *dst, *dst64 = NULL; | 81 | unsigned char *dst, *dst64 = NULL; |
82 | unsigned long blksz; | 82 | unsigned long blksz; |
83 | unsigned long s, cnt; | 83 | unsigned long s, cnt; |
84 | size_t num_read = 0; | 84 | size_t num_read = 0; |
85 | lbaint_t part_start, part_end, bs, be, bm, blk_num; | 85 | lbaint_t part_start, part_end, bs, be, bm, blk_num; |
86 | margin_pos_t margin; | 86 | margin_pos_t margin; |
87 | struct blk_desc *fs_dev_desc = NULL; | 87 | struct blk_desc *fs_dev_desc = NULL; |
88 | int dev_no; | 88 | int dev_no; |
89 | int ret; | 89 | int ret; |
90 | 90 | ||
91 | assert(buffer != NULL && out_num_read != NULL); | 91 | assert(buffer != NULL && out_num_read != NULL); |
92 | 92 | ||
93 | dev_no = mmc_get_env_dev(); | 93 | dev_no = mmc_get_env_dev(); |
94 | if ((fs_dev_desc = blk_get_dev("mmc", dev_no)) == NULL) { | 94 | if ((fs_dev_desc = blk_get_dev("mmc", dev_no)) == NULL) { |
95 | printf("mmc device not found\n"); | 95 | printf("mmc device not found\n"); |
96 | return -1; | 96 | return -1; |
97 | } | 97 | } |
98 | 98 | ||
99 | pte = fastboot_flash_find_ptn(partition); | 99 | pte = fastboot_flash_find_ptn(partition); |
100 | if (!pte) { | 100 | if (!pte) { |
101 | printf("no %s partition\n", partition); | 101 | printf("no %s partition\n", partition); |
102 | fastboot_flash_dump_ptn(); | 102 | fastboot_flash_dump_ptn(); |
103 | return -1; | 103 | return -1; |
104 | } | 104 | } |
105 | 105 | ||
106 | blksz = fs_dev_desc->blksz; | 106 | blksz = fs_dev_desc->blksz; |
107 | part_start = pte->start; | 107 | part_start = pte->start; |
108 | part_end = pte->start + pte->length - 1; | 108 | part_end = pte->start + pte->length - 1; |
109 | 109 | ||
110 | if (get_margin_pos((uint64_t)part_start, (uint64_t)part_end, blksz, | 110 | if (get_margin_pos((uint64_t)part_start, (uint64_t)part_end, blksz, |
111 | &margin, offset, num_bytes, true)) | 111 | &margin, offset, num_bytes, true)) |
112 | return -1; | 112 | return -1; |
113 | 113 | ||
114 | bs = (lbaint_t)margin.blk_start; | 114 | bs = (lbaint_t)margin.blk_start; |
115 | be = (lbaint_t)margin.blk_end; | 115 | be = (lbaint_t)margin.blk_end; |
116 | s = margin.start; | 116 | s = margin.start; |
117 | bm = margin.multi; | 117 | bm = margin.multi; |
118 | 118 | ||
119 | /* alloc a blksz mem */ | 119 | /* alloc a blksz mem */ |
120 | bdata = (unsigned char *)memalign(ALIGN_BYTES, blksz); | 120 | bdata = (unsigned char *)memalign(ALIGN_BYTES, blksz); |
121 | if (bdata == NULL) { | 121 | if (bdata == NULL) { |
122 | printf("Failed to allocate memory!\n"); | 122 | printf("Failed to allocate memory!\n"); |
123 | return -1; | 123 | return -1; |
124 | } | 124 | } |
125 | 125 | ||
126 | /* support multi blk read */ | 126 | /* support multi blk read */ |
127 | while (bs <= be) { | 127 | while (bs <= be) { |
128 | if (!s && bm > 1) { | 128 | if (!s && bm > 1) { |
129 | dst = out_buf; | 129 | dst = out_buf; |
130 | dst64 = PTR_ALIGN(out_buf, 64); /* for mmc blk read alignment */ | 130 | dst64 = PTR_ALIGN(out_buf, 64); /* for mmc blk read alignment */ |
131 | if (dst64 != dst) { | 131 | if (dst64 != dst) { |
132 | dst = dst64; | 132 | dst = dst64; |
133 | bm--; | 133 | bm--; |
134 | } | 134 | } |
135 | blk_num = bm; | 135 | blk_num = bm; |
136 | cnt = bm * blksz; | 136 | cnt = bm * blksz; |
137 | bm = 0; /* no more multi blk */ | 137 | bm = 0; /* no more multi blk */ |
138 | } else { | 138 | } else { |
139 | blk_num = 1; | 139 | blk_num = 1; |
140 | cnt = blksz - s; | 140 | cnt = blksz - s; |
141 | if (num_read + cnt > num_bytes) | 141 | if (num_read + cnt > num_bytes) |
142 | cnt = num_bytes - num_read; | 142 | cnt = num_bytes - num_read; |
143 | dst = bdata; | 143 | dst = bdata; |
144 | } | 144 | } |
145 | if (blk_dread(fs_dev_desc, bs, blk_num, dst) != blk_num) { | 145 | if (blk_dread(fs_dev_desc, bs, blk_num, dst) != blk_num) { |
146 | ret = -1; | 146 | ret = -1; |
147 | goto fail; | 147 | goto fail; |
148 | } | 148 | } |
149 | 149 | ||
150 | if (dst == bdata) | 150 | if (dst == bdata) |
151 | memcpy(out_buf, bdata + s, cnt); | 151 | memcpy(out_buf, bdata + s, cnt); |
152 | else if (dst == dst64) | 152 | else if (dst == dst64) |
153 | memcpy(out_buf, dst, cnt); /* internal copy */ | 153 | memcpy(out_buf, dst, cnt); /* internal copy */ |
154 | 154 | ||
155 | s = 0; | 155 | s = 0; |
156 | bs += blk_num; | 156 | bs += blk_num; |
157 | num_read += cnt; | 157 | num_read += cnt; |
158 | out_buf += cnt; | 158 | out_buf += cnt; |
159 | } | 159 | } |
160 | *out_num_read = num_read; | 160 | *out_num_read = num_read; |
161 | ret = 0; | 161 | ret = 0; |
162 | 162 | ||
163 | fail: | 163 | fail: |
164 | free(bdata); | 164 | free(bdata); |
165 | return ret; | 165 | return ret; |
166 | } | 166 | } |
167 | 167 | ||
168 | 168 | ||
169 | #if defined(CONFIG_FASTBOOT_LOCK) | 169 | #if defined(CONFIG_FASTBOOT_LOCK) |
170 | int do_lock_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { | 170 | int do_lock_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { |
171 | FbLockState status = fastboot_get_lock_stat(); | 171 | FbLockState status = fastboot_get_lock_stat(); |
172 | if (status != FASTBOOT_LOCK_ERROR) { | 172 | if (status != FASTBOOT_LOCK_ERROR) { |
173 | if (status == FASTBOOT_LOCK) | 173 | if (status == FASTBOOT_LOCK) |
174 | printf("fastboot lock status: locked.\n"); | 174 | printf("fastboot lock status: locked.\n"); |
175 | else | 175 | else |
176 | printf("fastboot lock status: unlocked.\n"); | 176 | printf("fastboot lock status: unlocked.\n"); |
177 | } else | 177 | } else |
178 | printf("fastboot lock status error!\n"); | 178 | printf("fastboot lock status error!\n"); |
179 | 179 | ||
180 | display_lock(status, -1); | 180 | display_lock(status, -1); |
181 | 181 | ||
182 | return 0; | 182 | return 0; |
183 | 183 | ||
184 | } | 184 | } |
185 | 185 | ||
186 | U_BOOT_CMD( | 186 | U_BOOT_CMD( |
187 | lock_status, 2, 1, do_lock_status, | 187 | lock_status, 2, 1, do_lock_status, |
188 | "lock_status", | 188 | "lock_status", |
189 | "lock_status"); | 189 | "lock_status"); |
190 | #endif | 190 | #endif |
191 | 191 | ||
192 | #if defined(CONFIG_FLASH_MCUFIRMWARE_SUPPORT) && defined(CONFIG_ARCH_IMX8M) | 192 | #if defined(CONFIG_FLASH_MCUFIRMWARE_SUPPORT) && defined(CONFIG_ARCH_IMX8M) |
193 | static int do_bootmcu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | 193 | static int do_bootmcu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
194 | { | 194 | { |
195 | int ret; | 195 | int ret; |
196 | size_t out_num_read; | 196 | size_t out_num_read; |
197 | void *mcu_base_addr = (void *)MCU_BOOTROM_BASE_ADDR; | 197 | void *mcu_base_addr = (void *)MCU_BOOTROM_BASE_ADDR; |
198 | char command[32]; | 198 | char command[32]; |
199 | 199 | ||
200 | ret = read_from_partition_multi(FASTBOOT_MCU_FIRMWARE_PARTITION, | 200 | ret = read_from_partition_multi(FASTBOOT_MCU_FIRMWARE_PARTITION, |
201 | 0, ANDROID_MCU_FIRMWARE_SIZE, (void *)mcu_base_addr, &out_num_read); | 201 | 0, ANDROID_MCU_FIRMWARE_SIZE, (void *)mcu_base_addr, &out_num_read); |
202 | if ((ret != 0) || (out_num_read != ANDROID_MCU_FIRMWARE_SIZE)) { | 202 | if ((ret != 0) || (out_num_read != ANDROID_MCU_FIRMWARE_SIZE)) { |
203 | printf("Read MCU images failed!\n"); | 203 | printf("Read MCU images failed!\n"); |
204 | return 1; | 204 | return 1; |
205 | } else { | 205 | } else { |
206 | printf("run command: 'bootaux 0x%x'\n",(unsigned int)(ulong)mcu_base_addr); | 206 | printf("run command: 'bootaux 0x%x'\n",(unsigned int)(ulong)mcu_base_addr); |
207 | 207 | ||
208 | sprintf(command, "bootaux 0x%x", (unsigned int)(ulong)mcu_base_addr); | 208 | sprintf(command, "bootaux 0x%x", (unsigned int)(ulong)mcu_base_addr); |
209 | ret = run_command(command, 0); | 209 | ret = run_command(command, 0); |
210 | if (ret) { | 210 | if (ret) { |
211 | printf("run 'bootaux' command failed!\n"); | 211 | printf("run 'bootaux' command failed!\n"); |
212 | return 1; | 212 | return 1; |
213 | } | 213 | } |
214 | } | 214 | } |
215 | return 0; | 215 | return 0; |
216 | } | 216 | } |
217 | 217 | ||
218 | U_BOOT_CMD( | 218 | U_BOOT_CMD( |
219 | bootmcu, 1, 0, do_bootmcu, | 219 | bootmcu, 1, 0, do_bootmcu, |
220 | "boot mcu images\n", | 220 | "boot mcu images\n", |
221 | "boot mcu images from 'mcu_os' partition, only support images run from TCM" | 221 | "boot mcu images from 'mcu_os' partition, only support images run from TCM" |
222 | ); | 222 | ); |
223 | #endif | 223 | #endif |
224 | 224 | ||
225 | #if defined CONFIG_SYSTEM_RAMDISK_SUPPORT && defined CONFIG_ANDROID_AUTO_SUPPORT | 225 | #if defined CONFIG_SYSTEM_RAMDISK_SUPPORT && defined CONFIG_ANDROID_AUTO_SUPPORT |
226 | /* Setup booargs for taking the system parition as ramdisk */ | 226 | /* Setup booargs for taking the system parition as ramdisk */ |
227 | static void fastboot_setup_system_boot_args(const char *slot, bool append_root) | 227 | static void fastboot_setup_system_boot_args(const char *slot, bool append_root) |
228 | { | 228 | { |
229 | const char *system_part_name = NULL; | 229 | const char *system_part_name = NULL; |
230 | #ifdef CONFIG_ANDROID_AB_SUPPORT | 230 | #ifdef CONFIG_ANDROID_AB_SUPPORT |
231 | if(slot == NULL) | 231 | if(slot == NULL) |
232 | return; | 232 | return; |
233 | if(!strncmp(slot, "_a", strlen("_a")) || !strncmp(slot, "boot_a", strlen("boot_a"))) { | 233 | if(!strncmp(slot, "_a", strlen("_a")) || !strncmp(slot, "boot_a", strlen("boot_a"))) { |
234 | system_part_name = FASTBOOT_PARTITION_SYSTEM_A; | 234 | system_part_name = FASTBOOT_PARTITION_SYSTEM_A; |
235 | } | 235 | } |
236 | else if(!strncmp(slot, "_b", strlen("_b")) || !strncmp(slot, "boot_b", strlen("boot_b"))) { | 236 | else if(!strncmp(slot, "_b", strlen("_b")) || !strncmp(slot, "boot_b", strlen("boot_b"))) { |
237 | system_part_name = FASTBOOT_PARTITION_SYSTEM_B; | 237 | system_part_name = FASTBOOT_PARTITION_SYSTEM_B; |
238 | } else { | 238 | } else { |
239 | printf("slot invalid!\n"); | 239 | printf("slot invalid!\n"); |
240 | return; | 240 | return; |
241 | } | 241 | } |
242 | #else | 242 | #else |
243 | system_part_name = FASTBOOT_PARTITION_SYSTEM; | 243 | system_part_name = FASTBOOT_PARTITION_SYSTEM; |
244 | #endif | 244 | #endif |
245 | 245 | ||
246 | struct fastboot_ptentry *ptentry = fastboot_flash_find_ptn(system_part_name); | 246 | struct fastboot_ptentry *ptentry = fastboot_flash_find_ptn(system_part_name); |
247 | if(ptentry != NULL) { | 247 | if(ptentry != NULL) { |
248 | char bootargs_3rd[ANDR_BOOT_ARGS_SIZE] = {'\0'}; | 248 | char bootargs_3rd[ANDR_BOOT_ARGS_SIZE] = {'\0'}; |
249 | if (append_root) { | 249 | if (append_root) { |
250 | u32 dev_no = mmc_map_to_kernel_blk(mmc_get_env_dev()); | 250 | u32 dev_no = mmc_map_to_kernel_blk(mmc_get_env_dev()); |
251 | sprintf(bootargs_3rd, "root=/dev/mmcblk%dp%d ", | 251 | sprintf(bootargs_3rd, "root=/dev/mmcblk%dp%d ", |
252 | dev_no, | 252 | dev_no, |
253 | ptentry->partition_index); | 253 | ptentry->partition_index); |
254 | } | 254 | } |
255 | strcat(bootargs_3rd, "rootwait"); | 255 | strcat(bootargs_3rd, "rootwait"); |
256 | 256 | ||
257 | env_set("bootargs_3rd", bootargs_3rd); | 257 | env_set("bootargs_3rd", bootargs_3rd); |
258 | } else { | 258 | } else { |
259 | printf("Can't find partition: %s\n", system_part_name); | 259 | printf("Can't find partition: %s\n", system_part_name); |
260 | fastboot_flash_dump_ptn(); | 260 | fastboot_flash_dump_ptn(); |
261 | } | 261 | } |
262 | } | 262 | } |
263 | #endif | 263 | #endif |
264 | 264 | ||
265 | #ifdef CONFIG_CMD_BOOTA | 265 | #ifdef CONFIG_CMD_BOOTA |
266 | 266 | ||
267 | /* Section for Android bootimage format support | 267 | /* Section for Android bootimage format support |
268 | * Refer: | 268 | * Refer: |
269 | * http://android.git.kernel.org/?p=platform/system/core.git;a=blob; | 269 | * http://android.git.kernel.org/?p=platform/system/core.git;a=blob; |
270 | * f=mkbootimg/bootimg.h | 270 | * f=mkbootimg/bootimg.h |
271 | */ | 271 | */ |
272 | 272 | ||
273 | void | 273 | void |
274 | bootimg_print_image_hdr(struct andr_img_hdr *hdr) | 274 | bootimg_print_image_hdr(struct andr_img_hdr *hdr) |
275 | { | 275 | { |
276 | #ifdef DEBUG | 276 | #ifdef DEBUG |
277 | int i; | 277 | int i; |
278 | printf(" Image magic: %s\n", hdr->magic); | 278 | printf(" Image magic: %s\n", hdr->magic); |
279 | 279 | ||
280 | printf(" kernel_size: 0x%x\n", hdr->kernel_size); | 280 | printf(" kernel_size: 0x%x\n", hdr->kernel_size); |
281 | printf(" kernel_addr: 0x%x\n", hdr->kernel_addr); | 281 | printf(" kernel_addr: 0x%x\n", hdr->kernel_addr); |
282 | 282 | ||
283 | printf(" rdisk_size: 0x%x\n", hdr->ramdisk_size); | 283 | printf(" rdisk_size: 0x%x\n", hdr->ramdisk_size); |
284 | printf(" rdisk_addr: 0x%x\n", hdr->ramdisk_addr); | 284 | printf(" rdisk_addr: 0x%x\n", hdr->ramdisk_addr); |
285 | 285 | ||
286 | printf(" second_size: 0x%x\n", hdr->second_size); | 286 | printf(" second_size: 0x%x\n", hdr->second_size); |
287 | printf(" second_addr: 0x%x\n", hdr->second_addr); | 287 | printf(" second_addr: 0x%x\n", hdr->second_addr); |
288 | 288 | ||
289 | printf(" tags_addr: 0x%x\n", hdr->tags_addr); | 289 | printf(" tags_addr: 0x%x\n", hdr->tags_addr); |
290 | printf(" page_size: 0x%x\n", hdr->page_size); | 290 | printf(" page_size: 0x%x\n", hdr->page_size); |
291 | 291 | ||
292 | printf(" name: %s\n", hdr->name); | 292 | printf(" name: %s\n", hdr->name); |
293 | printf(" cmdline: %s\n", hdr->cmdline); | 293 | printf(" cmdline: %s\n", hdr->cmdline); |
294 | 294 | ||
295 | for (i = 0; i < 8; i++) | 295 | for (i = 0; i < 8; i++) |
296 | printf(" id[%d]: 0x%x\n", i, hdr->id[i]); | 296 | printf(" id[%d]: 0x%x\n", i, hdr->id[i]); |
297 | #endif | 297 | #endif |
298 | } | 298 | } |
299 | 299 | ||
300 | #if !defined(CONFIG_AVB_SUPPORT) || !defined(CONFIG_MMC) | 300 | #if !defined(CONFIG_AVB_SUPPORT) || !defined(CONFIG_MMC) |
301 | static struct andr_img_hdr boothdr __aligned(ARCH_DMA_MINALIGN); | 301 | static struct andr_img_hdr boothdr __aligned(ARCH_DMA_MINALIGN); |
302 | #endif | 302 | #endif |
303 | 303 | ||
304 | #ifdef CONFIG_IMX_TRUSTY_OS | 304 | #ifdef CONFIG_IMX_TRUSTY_OS |
305 | #if defined(CONFIG_DUAL_BOOTLOADER) && defined(CONFIG_AVB_ATX) | 305 | #if defined(CONFIG_DUAL_BOOTLOADER) && defined(CONFIG_AVB_ATX) |
306 | static int sha256_concatenation(uint8_t *hash_buf, uint8_t *vbh, uint8_t *image_hash) | 306 | static int sha256_concatenation(uint8_t *hash_buf, uint8_t *vbh, uint8_t *image_hash) |
307 | { | 307 | { |
308 | if ((hash_buf == NULL) || (vbh == NULL) || (image_hash == NULL)) { | 308 | if ((hash_buf == NULL) || (vbh == NULL) || (image_hash == NULL)) { |
309 | printf("sha256_concatenation: null buffer found!\n"); | 309 | printf("sha256_concatenation: null buffer found!\n"); |
310 | return -1; | 310 | return -1; |
311 | } | 311 | } |
312 | 312 | ||
313 | memcpy(hash_buf, vbh, AVB_SHA256_DIGEST_SIZE); | 313 | memcpy(hash_buf, vbh, AVB_SHA256_DIGEST_SIZE); |
314 | memcpy(hash_buf + AVB_SHA256_DIGEST_SIZE, | 314 | memcpy(hash_buf + AVB_SHA256_DIGEST_SIZE, |
315 | image_hash, AVB_SHA256_DIGEST_SIZE); | 315 | image_hash, AVB_SHA256_DIGEST_SIZE); |
316 | sha256_csum_wd((unsigned char *)hash_buf, 2 * AVB_SHA256_DIGEST_SIZE, | 316 | sha256_csum_wd((unsigned char *)hash_buf, 2 * AVB_SHA256_DIGEST_SIZE, |
317 | (unsigned char *)vbh, CHUNKSZ_SHA256); | 317 | (unsigned char *)vbh, CHUNKSZ_SHA256); |
318 | 318 | ||
319 | return 0; | 319 | return 0; |
320 | } | 320 | } |
321 | 321 | ||
322 | /* Since we use fit format to organize the atf, tee, u-boot and u-boot dtb, | 322 | /* Since we use fit format to organize the atf, tee, u-boot and u-boot dtb, |
323 | * so calculate the hash of fit is enough. | 323 | * so calculate the hash of fit is enough. |
324 | */ | 324 | */ |
325 | static int vbh_bootloader(uint8_t *image_hash) | 325 | static int vbh_bootloader(uint8_t *image_hash) |
326 | { | 326 | { |
327 | char* slot_suffixes[2] = {"_a", "_b"}; | 327 | char* slot_suffixes[2] = {"_a", "_b"}; |
328 | char partition_name[20]; | 328 | char partition_name[20]; |
329 | AvbABData ab_data; | 329 | AvbABData ab_data; |
330 | uint8_t *image_buf = NULL; | 330 | uint8_t *image_buf = NULL; |
331 | uint32_t image_size; | 331 | uint32_t image_size; |
332 | size_t image_num_read; | 332 | size_t image_num_read; |
333 | int target_slot; | 333 | int target_slot; |
334 | int ret = 0; | 334 | int ret = 0; |
335 | 335 | ||
336 | /* Load A/B metadata and decide which slot we are going to load */ | 336 | /* Load A/B metadata and decide which slot we are going to load */ |
337 | if (fsl_avb_ab_ops.read_ab_metadata(&fsl_avb_ab_ops, &ab_data) != | 337 | if (fsl_avb_ab_ops.read_ab_metadata(&fsl_avb_ab_ops, &ab_data) != |
338 | AVB_IO_RESULT_OK) { | 338 | AVB_IO_RESULT_OK) { |
339 | ret = -1; | 339 | ret = -1; |
340 | goto fail ; | 340 | goto fail ; |
341 | } | 341 | } |
342 | target_slot = get_curr_slot(&ab_data); | 342 | target_slot = get_curr_slot(&ab_data); |
343 | sprintf(partition_name, "bootloader%s", slot_suffixes[target_slot]); | 343 | sprintf(partition_name, "bootloader%s", slot_suffixes[target_slot]); |
344 | 344 | ||
345 | /* Read image header to find the image size */ | 345 | /* Read image header to find the image size */ |
346 | image_buf = (uint8_t *)malloc(MMC_SATA_BLOCK_SIZE); | 346 | image_buf = (uint8_t *)malloc(MMC_SATA_BLOCK_SIZE); |
347 | if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, partition_name, | 347 | if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, partition_name, |
348 | 0, MMC_SATA_BLOCK_SIZE, | 348 | 0, MMC_SATA_BLOCK_SIZE, |
349 | image_buf, &image_num_read)) { | 349 | image_buf, &image_num_read)) { |
350 | printf("bootloader image load error!\n"); | 350 | printf("bootloader image load error!\n"); |
351 | ret = -1; | 351 | ret = -1; |
352 | goto fail; | 352 | goto fail; |
353 | } | 353 | } |
354 | image_size = fdt_totalsize((struct image_header *)image_buf); | 354 | image_size = fdt_totalsize((struct image_header *)image_buf); |
355 | image_size = (image_size + 3) & ~3; | 355 | image_size = (image_size + 3) & ~3; |
356 | free(image_buf); | 356 | free(image_buf); |
357 | 357 | ||
358 | /* Load full fit image */ | 358 | /* Load full fit image */ |
359 | image_buf = (uint8_t *)malloc(image_size); | 359 | image_buf = (uint8_t *)malloc(image_size); |
360 | if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, partition_name, | 360 | if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, partition_name, |
361 | 0, image_size, | 361 | 0, image_size, |
362 | image_buf, &image_num_read)) { | 362 | image_buf, &image_num_read)) { |
363 | printf("bootloader image load error!\n"); | 363 | printf("bootloader image load error!\n"); |
364 | ret = -1; | 364 | ret = -1; |
365 | goto fail; | 365 | goto fail; |
366 | } | 366 | } |
367 | /* Calculate hash */ | 367 | /* Calculate hash */ |
368 | sha256_csum_wd((unsigned char *)image_buf, image_size, | 368 | sha256_csum_wd((unsigned char *)image_buf, image_size, |
369 | (unsigned char *)image_hash, CHUNKSZ_SHA256); | 369 | (unsigned char *)image_hash, CHUNKSZ_SHA256); |
370 | 370 | ||
371 | fail: | 371 | fail: |
372 | if (image_buf != NULL) | 372 | if (image_buf != NULL) |
373 | free(image_buf); | 373 | free(image_buf); |
374 | return ret; | 374 | return ret; |
375 | } | 375 | } |
376 | 376 | ||
377 | int vbh_calculate(uint8_t *vbh, AvbSlotVerifyData *avb_out_data) | 377 | int vbh_calculate(uint8_t *vbh, AvbSlotVerifyData *avb_out_data) |
378 | { | 378 | { |
379 | uint8_t image_hash[AVB_SHA256_DIGEST_SIZE]; | 379 | uint8_t image_hash[AVB_SHA256_DIGEST_SIZE]; |
380 | uint8_t hash_buf[2 * AVB_SHA256_DIGEST_SIZE]; | 380 | uint8_t hash_buf[2 * AVB_SHA256_DIGEST_SIZE]; |
381 | uint8_t* image_buf = NULL; | 381 | uint8_t* image_buf = NULL; |
382 | uint32_t image_size; | 382 | uint32_t image_size; |
383 | size_t image_num_read; | 383 | size_t image_num_read; |
384 | int ret = 0; | 384 | int ret = 0; |
385 | 385 | ||
386 | if (vbh == NULL) | 386 | if (vbh == NULL) |
387 | return -1; | 387 | return -1; |
388 | 388 | ||
389 | /* Initial VBH (VBH0) should be 32 bytes 0 */ | 389 | /* Initial VBH (VBH0) should be 32 bytes 0 */ |
390 | memset(vbh, 0, AVB_SHA256_DIGEST_SIZE); | 390 | memset(vbh, 0, AVB_SHA256_DIGEST_SIZE); |
391 | /* Load and calculate the sha256 hash of spl.bin */ | 391 | /* Load and calculate the sha256 hash of spl.bin */ |
392 | image_size = (ANDROID_SPL_SIZE + MMC_SATA_BLOCK_SIZE -1) / | 392 | image_size = (ANDROID_SPL_SIZE + MMC_SATA_BLOCK_SIZE -1) / |
393 | MMC_SATA_BLOCK_SIZE; | 393 | MMC_SATA_BLOCK_SIZE; |
394 | image_buf = (uint8_t *)malloc(image_size); | 394 | image_buf = (uint8_t *)malloc(image_size); |
395 | if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, | 395 | if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, |
396 | FASTBOOT_PARTITION_BOOTLOADER, | 396 | FASTBOOT_PARTITION_BOOTLOADER, |
397 | 0, image_size, | 397 | 0, image_size, |
398 | image_buf, &image_num_read)) { | 398 | image_buf, &image_num_read)) { |
399 | printf("spl image load error!\n"); | 399 | printf("spl image load error!\n"); |
400 | ret = -1; | 400 | ret = -1; |
401 | goto fail; | 401 | goto fail; |
402 | } | 402 | } |
403 | sha256_csum_wd((unsigned char *)image_buf, image_size, | 403 | sha256_csum_wd((unsigned char *)image_buf, image_size, |
404 | (unsigned char *)image_hash, CHUNKSZ_SHA256); | 404 | (unsigned char *)image_hash, CHUNKSZ_SHA256); |
405 | /* Calculate VBH1 */ | 405 | /* Calculate VBH1 */ |
406 | if (sha256_concatenation(hash_buf, vbh, image_hash)) { | 406 | if (sha256_concatenation(hash_buf, vbh, image_hash)) { |
407 | ret = -1; | 407 | ret = -1; |
408 | goto fail; | 408 | goto fail; |
409 | } | 409 | } |
410 | free(image_buf); | 410 | free(image_buf); |
411 | 411 | ||
412 | /* Load and calculate hash of bootloader.img */ | 412 | /* Load and calculate hash of bootloader.img */ |
413 | if (vbh_bootloader(image_hash)) { | 413 | if (vbh_bootloader(image_hash)) { |
414 | ret = -1; | 414 | ret = -1; |
415 | goto fail; | 415 | goto fail; |
416 | } | 416 | } |
417 | 417 | ||
418 | /* Calculate VBH2 */ | 418 | /* Calculate VBH2 */ |
419 | if (sha256_concatenation(hash_buf, vbh, image_hash)) { | 419 | if (sha256_concatenation(hash_buf, vbh, image_hash)) { |
420 | ret = -1; | 420 | ret = -1; |
421 | goto fail; | 421 | goto fail; |
422 | } | 422 | } |
423 | 423 | ||
424 | /* Calculate the hash of vbmeta.img */ | 424 | /* Calculate the hash of vbmeta.img */ |
425 | avb_slot_verify_data_calculate_vbmeta_digest(avb_out_data, | 425 | avb_slot_verify_data_calculate_vbmeta_digest(avb_out_data, |
426 | AVB_DIGEST_TYPE_SHA256, | 426 | AVB_DIGEST_TYPE_SHA256, |
427 | image_hash); | 427 | image_hash); |
428 | /* Calculate VBH3 */ | 428 | /* Calculate VBH3 */ |
429 | if (sha256_concatenation(hash_buf, vbh, image_hash)) { | 429 | if (sha256_concatenation(hash_buf, vbh, image_hash)) { |
430 | ret = -1; | 430 | ret = -1; |
431 | goto fail; | 431 | goto fail; |
432 | } | 432 | } |
433 | 433 | ||
434 | fail: | 434 | fail: |
435 | if (image_buf != NULL) | 435 | if (image_buf != NULL) |
436 | free(image_buf); | 436 | free(image_buf); |
437 | return ret; | 437 | return ret; |
438 | } | 438 | } |
439 | #endif /* CONFIG_DUAL_BOOTLOADER && CONFIG_AVB_ATX */ | 439 | #endif /* CONFIG_DUAL_BOOTLOADER && CONFIG_AVB_ATX */ |
440 | 440 | ||
441 | int trusty_setbootparameter(struct andr_img_hdr *hdr, AvbABFlowResult avb_result, | 441 | int trusty_setbootparameter(struct andr_img_hdr *hdr, AvbABFlowResult avb_result, |
442 | AvbSlotVerifyData *avb_out_data) { | 442 | AvbSlotVerifyData *avb_out_data) { |
443 | #if defined(CONFIG_DUAL_BOOTLOADER) && defined(CONFIG_AVB_ATX) | 443 | #if defined(CONFIG_DUAL_BOOTLOADER) && defined(CONFIG_AVB_ATX) |
444 | uint8_t vbh[AVB_SHA256_DIGEST_SIZE]; | 444 | uint8_t vbh[AVB_SHA256_DIGEST_SIZE]; |
445 | #endif | 445 | #endif |
446 | int ret = 0; | 446 | int ret = 0; |
447 | u32 os_ver = hdr->os_version >> 11; | 447 | u32 os_ver = hdr->os_version >> 11; |
448 | u32 os_ver_km = (((os_ver >> 14) & 0x7F) * 100 + ((os_ver >> 7) & 0x7F)) * 100 | 448 | u32 os_ver_km = (((os_ver >> 14) & 0x7F) * 100 + ((os_ver >> 7) & 0x7F)) * 100 |
449 | + (os_ver & 0x7F); | 449 | + (os_ver & 0x7F); |
450 | u32 os_lvl = hdr->os_version & ((1U << 11) - 1); | 450 | u32 os_lvl = hdr->os_version & ((1U << 11) - 1); |
451 | u32 os_lvl_km = ((os_lvl >> 4) + 2000) * 100 + (os_lvl & 0x0F); | 451 | u32 os_lvl_km = ((os_lvl >> 4) + 2000) * 100 + (os_lvl & 0x0F); |
452 | keymaster_verified_boot_t vbstatus; | 452 | keymaster_verified_boot_t vbstatus; |
453 | FbLockState lock_status = fastboot_get_lock_stat(); | 453 | FbLockState lock_status = fastboot_get_lock_stat(); |
454 | 454 | ||
455 | uint8_t boot_key_hash[AVB_SHA256_DIGEST_SIZE]; | 455 | uint8_t boot_key_hash[AVB_SHA256_DIGEST_SIZE]; |
456 | #ifdef CONFIG_AVB_ATX | 456 | #ifdef CONFIG_AVB_ATX |
457 | if (fsl_read_permanent_attributes_hash(&fsl_avb_atx_ops, boot_key_hash)) { | 457 | if (fsl_read_permanent_attributes_hash(&fsl_avb_atx_ops, boot_key_hash)) { |
458 | printf("ERROR - failed to read permanent attributes hash for keymaster\n"); | 458 | printf("ERROR - failed to read permanent attributes hash for keymaster\n"); |
459 | memset(boot_key_hash, 0, AVB_SHA256_DIGEST_SIZE); | 459 | memset(boot_key_hash, 0, AVB_SHA256_DIGEST_SIZE); |
460 | } | 460 | } |
461 | #else | 461 | #else |
462 | uint8_t public_key_buf[AVB_MAX_BUFFER_LENGTH]; | 462 | uint8_t public_key_buf[AVB_MAX_BUFFER_LENGTH]; |
463 | if (trusty_read_vbmeta_public_key(public_key_buf, | 463 | if (trusty_read_vbmeta_public_key(public_key_buf, |
464 | AVB_MAX_BUFFER_LENGTH) != 0) { | 464 | AVB_MAX_BUFFER_LENGTH) != 0) { |
465 | printf("ERROR - failed to read public key for keymaster\n"); | 465 | printf("ERROR - failed to read public key for keymaster\n"); |
466 | memset(boot_key_hash, 0, AVB_SHA256_DIGEST_SIZE); | 466 | memset(boot_key_hash, 0, AVB_SHA256_DIGEST_SIZE); |
467 | } else | 467 | } else |
468 | sha256_csum_wd((unsigned char *)public_key_buf, AVB_SHA256_DIGEST_SIZE, | 468 | sha256_csum_wd((unsigned char *)public_key_buf, AVB_SHA256_DIGEST_SIZE, |
469 | (unsigned char *)boot_key_hash, CHUNKSZ_SHA256); | 469 | (unsigned char *)boot_key_hash, CHUNKSZ_SHA256); |
470 | #endif | 470 | #endif |
471 | 471 | ||
472 | bool lock = (lock_status == FASTBOOT_LOCK)? true: false; | 472 | bool lock = (lock_status == FASTBOOT_LOCK)? true: false; |
473 | if (avb_result == AVB_AB_FLOW_RESULT_OK) | 473 | if (avb_result == AVB_AB_FLOW_RESULT_OK) |
474 | vbstatus = KM_VERIFIED_BOOT_VERIFIED; | 474 | vbstatus = KM_VERIFIED_BOOT_VERIFIED; |
475 | else | 475 | else |
476 | vbstatus = KM_VERIFIED_BOOT_FAILED; | 476 | vbstatus = KM_VERIFIED_BOOT_FAILED; |
477 | 477 | ||
478 | /* Calculate VBH */ | 478 | /* Calculate VBH */ |
479 | #if defined(CONFIG_DUAL_BOOTLOADER) && defined(CONFIG_AVB_ATX) | 479 | #if defined(CONFIG_DUAL_BOOTLOADER) && defined(CONFIG_AVB_ATX) |
480 | if (vbh_calculate(vbh, avb_out_data)) { | 480 | if (vbh_calculate(vbh, avb_out_data)) { |
481 | ret = -1; | 481 | ret = -1; |
482 | goto fail; | 482 | goto fail; |
483 | } | 483 | } |
484 | 484 | ||
485 | trusty_set_boot_params(os_ver_km, os_lvl_km, vbstatus, lock, | 485 | trusty_set_boot_params(os_ver_km, os_lvl_km, vbstatus, lock, |
486 | boot_key_hash, AVB_SHA256_DIGEST_SIZE, | 486 | boot_key_hash, AVB_SHA256_DIGEST_SIZE, |
487 | vbh, AVB_SHA256_DIGEST_SIZE); | 487 | vbh, AVB_SHA256_DIGEST_SIZE); |
488 | #else | 488 | #else |
489 | trusty_set_boot_params(os_ver_km, os_lvl_km, vbstatus, lock, | 489 | trusty_set_boot_params(os_ver_km, os_lvl_km, vbstatus, lock, |
490 | boot_key_hash, AVB_SHA256_DIGEST_SIZE, | 490 | boot_key_hash, AVB_SHA256_DIGEST_SIZE, |
491 | NULL, 0); | 491 | NULL, 0); |
492 | #endif | 492 | #endif |
493 | 493 | ||
494 | fail: | 494 | fail: |
495 | return ret; | 495 | return ret; |
496 | } | 496 | } |
497 | #endif | 497 | #endif |
498 | 498 | ||
499 | #if defined(CONFIG_AVB_SUPPORT) && defined(CONFIG_MMC) | 499 | #if defined(CONFIG_AVB_SUPPORT) && defined(CONFIG_MMC) |
500 | /* we can use avb to verify Trusty if we want */ | 500 | /* we can use avb to verify Trusty if we want */ |
501 | const char *requested_partitions_boot[] = {"boot", FDT_PART_NAME, NULL}; | 501 | const char *requested_partitions_boot[] = {"boot", FDT_PART_NAME, NULL}; |
502 | const char *requested_partitions_recovery[] = {"recovery", FDT_PART_NAME, NULL}; | 502 | const char *requested_partitions_recovery[] = {"recovery", FDT_PART_NAME, NULL}; |
503 | 503 | ||
504 | static bool is_load_fdt_from_part(void) | 504 | static bool is_load_fdt_from_part(void) |
505 | { | 505 | { |
506 | bool ptn_find; | 506 | bool ptn_find; |
507 | 507 | ||
508 | #if defined(CONFIG_ANDROID_THINGS_SUPPORT) | 508 | #if defined(CONFIG_ANDROID_THINGS_SUPPORT) |
509 | ptn_find = fastboot_flash_find_ptn("oem_bootloader_a") && | 509 | ptn_find = fastboot_flash_find_ptn("oem_bootloader_a") && |
510 | fastboot_flash_find_ptn("oem_bootloader_b"); | 510 | fastboot_flash_find_ptn("oem_bootloader_b"); |
511 | #elif defined(CONFIG_ANDROID_AB_SUPPORT) | 511 | #elif defined(CONFIG_ANDROID_AB_SUPPORT) |
512 | ptn_find = fastboot_flash_find_ptn("dtbo_a") && | 512 | ptn_find = fastboot_flash_find_ptn("dtbo_a") && |
513 | fastboot_flash_find_ptn("dtbo_b"); | 513 | fastboot_flash_find_ptn("dtbo_b"); |
514 | #else | 514 | #else |
515 | ptn_find = fastboot_flash_find_ptn("dtbo"); | 515 | ptn_find = fastboot_flash_find_ptn("dtbo"); |
516 | #endif | 516 | #endif |
517 | 517 | ||
518 | if (ptn_find) | 518 | if (ptn_find) |
519 | return true; | 519 | return true; |
520 | else | 520 | else |
521 | return false; | 521 | return false; |
522 | } | 522 | } |
523 | 523 | ||
524 | static int find_partition_data_by_name(char* part_name, | 524 | static int find_partition_data_by_name(char* part_name, |
525 | AvbSlotVerifyData* avb_out_data, AvbPartitionData** avb_loadpart) | 525 | AvbSlotVerifyData* avb_out_data, AvbPartitionData** avb_loadpart) |
526 | { | 526 | { |
527 | int num = 0; | 527 | int num = 0; |
528 | AvbPartitionData* loadpart = NULL; | 528 | AvbPartitionData* loadpart = NULL; |
529 | 529 | ||
530 | for (num = 0; num < avb_out_data->num_loaded_partitions; num++) { | 530 | for (num = 0; num < avb_out_data->num_loaded_partitions; num++) { |
531 | loadpart = &(avb_out_data->loaded_partitions[num]); | 531 | loadpart = &(avb_out_data->loaded_partitions[num]); |
532 | if (!(strncmp(loadpart->partition_name, | 532 | if (!(strncmp(loadpart->partition_name, |
533 | part_name, strlen(part_name)))) { | 533 | part_name, strlen(part_name)))) { |
534 | *avb_loadpart = loadpart; | 534 | *avb_loadpart = loadpart; |
535 | break; | 535 | break; |
536 | } | 536 | } |
537 | } | 537 | } |
538 | if (num == avb_out_data->num_loaded_partitions) { | 538 | if (num == avb_out_data->num_loaded_partitions) { |
539 | printf("Error! Can't find %s partition from avb partition data!\n", | 539 | printf("Error! Can't find %s partition from avb partition data!\n", |
540 | part_name); | 540 | part_name); |
541 | return -1; | 541 | return -1; |
542 | } | 542 | } |
543 | else | 543 | else |
544 | return 0; | 544 | return 0; |
545 | } | 545 | } |
546 | 546 | ||
547 | bool __weak is_power_key_pressed(void) { | ||
548 | return false; | ||
549 | } | ||
550 | |||
547 | int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { | 551 | int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { |
548 | 552 | ||
549 | ulong addr = 0; | 553 | ulong addr = 0; |
550 | struct andr_img_hdr *hdr = NULL; | 554 | struct andr_img_hdr *hdr = NULL; |
551 | ulong image_size; | 555 | ulong image_size; |
552 | u32 avb_metric; | 556 | u32 avb_metric; |
553 | bool check_image_arm64 = false; | 557 | bool check_image_arm64 = false; |
554 | bool is_recovery_mode = false; | 558 | bool is_recovery_mode = false; |
555 | 559 | ||
556 | AvbABFlowResult avb_result; | 560 | AvbABFlowResult avb_result; |
557 | AvbSlotVerifyData *avb_out_data = NULL; | 561 | AvbSlotVerifyData *avb_out_data = NULL; |
558 | AvbPartitionData *avb_loadpart = NULL; | 562 | AvbPartitionData *avb_loadpart = NULL; |
559 | 563 | ||
560 | /* get bootmode, default to boot "boot" */ | 564 | /* get bootmode, default to boot "boot" */ |
561 | if (argc > 1) { | 565 | if (argc > 1) { |
562 | is_recovery_mode = | 566 | is_recovery_mode = |
563 | (strncmp(argv[1], "recovery", sizeof("recovery")) != 0) ? false: true; | 567 | (strncmp(argv[1], "recovery", sizeof("recovery")) != 0) ? false: true; |
564 | if (is_recovery_mode) | 568 | if (is_recovery_mode) |
565 | printf("Will boot from recovery!\n"); | 569 | printf("Will boot from recovery!\n"); |
566 | } | 570 | } |
567 | 571 | ||
568 | /* check lock state */ | 572 | /* check lock state */ |
569 | FbLockState lock_status = fastboot_get_lock_stat(); | 573 | FbLockState lock_status = fastboot_get_lock_stat(); |
570 | if (lock_status == FASTBOOT_LOCK_ERROR) { | 574 | if (lock_status == FASTBOOT_LOCK_ERROR) { |
571 | #ifdef CONFIG_AVB_ATX | 575 | #ifdef CONFIG_AVB_ATX |
572 | printf("In boota get fastboot lock status error, enter fastboot mode.\n"); | 576 | printf("In boota get fastboot lock status error, enter fastboot mode.\n"); |
573 | goto fail; | 577 | goto fail; |
574 | #else | 578 | #else |
575 | printf("In boota get fastboot lock status error. Set lock status\n"); | 579 | printf("In boota get fastboot lock status error. Set lock status\n"); |
576 | fastboot_set_lock_stat(FASTBOOT_LOCK); | 580 | fastboot_set_lock_stat(FASTBOOT_LOCK); |
577 | lock_status = FASTBOOT_LOCK; | 581 | lock_status = FASTBOOT_LOCK; |
578 | #endif | 582 | #endif |
579 | } | 583 | } |
580 | bool allow_fail = (lock_status == FASTBOOT_UNLOCK ? true : false); | 584 | bool allow_fail = (lock_status == FASTBOOT_UNLOCK ? true : false); |
581 | avb_metric = get_timer(0); | 585 | avb_metric = get_timer(0); |
582 | /* we don't need to verify fdt partition if we don't have it. */ | 586 | /* we don't need to verify fdt partition if we don't have it. */ |
583 | if (!is_load_fdt_from_part()) { | 587 | if (!is_load_fdt_from_part()) { |
584 | requested_partitions_boot[1] = NULL; | 588 | requested_partitions_boot[1] = NULL; |
585 | requested_partitions_recovery[1] = NULL; | 589 | requested_partitions_recovery[1] = NULL; |
586 | } | 590 | } |
587 | #ifndef CONFIG_SYSTEM_RAMDISK_SUPPORT | 591 | #ifndef CONFIG_SYSTEM_RAMDISK_SUPPORT |
588 | else if (is_recovery_mode){ | 592 | else if (is_recovery_mode){ |
589 | requested_partitions_recovery[1] = NULL; | 593 | requested_partitions_recovery[1] = NULL; |
590 | } | 594 | } |
591 | #endif | 595 | #endif |
592 | 596 | ||
593 | /* if in lock state, do avb verify */ | 597 | /* if in lock state, do avb verify */ |
594 | #ifndef CONFIG_DUAL_BOOTLOADER | 598 | #ifndef CONFIG_DUAL_BOOTLOADER |
595 | /* For imx6 on Android, we don't have a/b slot and we want to verify | 599 | /* For imx6 on Android, we don't have a/b slot and we want to verify |
596 | * boot/recovery with AVB. For imx8 and Android Things we don't have | 600 | * boot/recovery with AVB. For imx8 and Android Things we don't have |
597 | * recovery and support a/b slot for boot */ | 601 | * recovery and support a/b slot for boot */ |
598 | #ifdef CONFIG_ANDROID_AB_SUPPORT | 602 | #ifdef CONFIG_ANDROID_AB_SUPPORT |
599 | /* we can use avb to verify Trusty if we want */ | 603 | /* we can use avb to verify Trusty if we want */ |
600 | avb_result = avb_ab_flow_fast(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, | 604 | avb_result = avb_ab_flow_fast(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, |
601 | AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE, &avb_out_data); | 605 | AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE, &avb_out_data); |
602 | #else | 606 | #else |
603 | #ifndef CONFIG_SYSTEM_RAMDISK_SUPPORT | 607 | #ifndef CONFIG_SYSTEM_RAMDISK_SUPPORT |
604 | if (!is_recovery_mode) { | 608 | if (!is_recovery_mode) { |
605 | avb_result = avb_single_flow(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, | 609 | avb_result = avb_single_flow(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, |
606 | AVB_HASHTREE_ERROR_MODE_RESTART, &avb_out_data); | 610 | AVB_HASHTREE_ERROR_MODE_RESTART, &avb_out_data); |
607 | } else { | 611 | } else { |
608 | avb_result = avb_single_flow(&fsl_avb_ab_ops, requested_partitions_recovery, allow_fail, | 612 | avb_result = avb_single_flow(&fsl_avb_ab_ops, requested_partitions_recovery, allow_fail, |
609 | AVB_HASHTREE_ERROR_MODE_RESTART, &avb_out_data); | 613 | AVB_HASHTREE_ERROR_MODE_RESTART, &avb_out_data); |
610 | } | 614 | } |
611 | #else /* CONFIG_SYSTEM_RAMDISK_SUPPORT defined */ | 615 | #else /* CONFIG_SYSTEM_RAMDISK_SUPPORT defined */ |
612 | avb_result = avb_single_flow(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, | 616 | avb_result = avb_single_flow(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, |
613 | AVB_HASHTREE_ERROR_MODE_RESTART, &avb_out_data); | 617 | AVB_HASHTREE_ERROR_MODE_RESTART, &avb_out_data); |
614 | #endif /*CONFIG_SYSTEM_RAMDISK_SUPPORT*/ | 618 | #endif /*CONFIG_SYSTEM_RAMDISK_SUPPORT*/ |
615 | #endif | 619 | #endif |
616 | #else /* !CONFIG_DUAL_BOOTLOADER */ | 620 | #else /* !CONFIG_DUAL_BOOTLOADER */ |
617 | /* We will only verify single one slot which has been selected in SPL */ | 621 | /* We will only verify single one slot which has been selected in SPL */ |
618 | avb_result = avb_flow_dual_uboot(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, | 622 | avb_result = avb_flow_dual_uboot(&fsl_avb_ab_ops, requested_partitions_boot, allow_fail, |
619 | AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE, &avb_out_data); | 623 | AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE, &avb_out_data); |
620 | 624 | ||
621 | /* Reboot if current slot is not bootable. */ | 625 | /* Reboot if current slot is not bootable. */ |
622 | if (avb_result == AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS) { | 626 | if (avb_result == AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS) { |
623 | printf("boota: slot verify fail!\n"); | 627 | printf("boota: slot verify fail!\n"); |
624 | do_reset(NULL, 0, 0, NULL); | 628 | do_reset(NULL, 0, 0, NULL); |
625 | } | 629 | } |
626 | #endif /* !CONFIG_DUAL_BOOTLOADER */ | 630 | #endif /* !CONFIG_DUAL_BOOTLOADER */ |
627 | 631 | ||
628 | /* get the duration of avb */ | 632 | /* get the duration of avb */ |
629 | metrics.avb = get_timer(avb_metric); | 633 | metrics.avb = get_timer(avb_metric); |
630 | 634 | ||
631 | if ((avb_result == AVB_AB_FLOW_RESULT_OK) || | 635 | if ((avb_result == AVB_AB_FLOW_RESULT_OK) || |
632 | (avb_result == AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR)) { | 636 | (avb_result == AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR)) { |
633 | assert(avb_out_data != NULL); | 637 | assert(avb_out_data != NULL); |
634 | /* We may have more than one partition loaded by AVB, find the boot | 638 | /* We may have more than one partition loaded by AVB, find the boot |
635 | * partition first. | 639 | * partition first. |
636 | */ | 640 | */ |
637 | #ifdef CONFIG_SYSTEM_RAMDISK_SUPPORT | 641 | #ifdef CONFIG_SYSTEM_RAMDISK_SUPPORT |
638 | if (find_partition_data_by_name("boot", avb_out_data, &avb_loadpart)) | 642 | if (find_partition_data_by_name("boot", avb_out_data, &avb_loadpart)) |
639 | goto fail; | 643 | goto fail; |
640 | #else | 644 | #else |
641 | if (!is_recovery_mode) { | 645 | if (!is_recovery_mode) { |
642 | if (find_partition_data_by_name("boot", avb_out_data, &avb_loadpart)) | 646 | if (find_partition_data_by_name("boot", avb_out_data, &avb_loadpart)) |
643 | goto fail; | 647 | goto fail; |
644 | } else { | 648 | } else { |
645 | if (find_partition_data_by_name("recovery", avb_out_data, &avb_loadpart)) | 649 | if (find_partition_data_by_name("recovery", avb_out_data, &avb_loadpart)) |
646 | goto fail; | 650 | goto fail; |
647 | } | 651 | } |
648 | #endif | 652 | #endif |
649 | assert(avb_loadpart != NULL); | 653 | assert(avb_loadpart != NULL); |
650 | /* we should use avb_part_data->data as boot image */ | 654 | /* we should use avb_part_data->data as boot image */ |
651 | /* boot image is already read by avb */ | 655 | /* boot image is already read by avb */ |
652 | hdr = (struct andr_img_hdr *)avb_loadpart->data; | 656 | hdr = (struct andr_img_hdr *)avb_loadpart->data; |
653 | if (android_image_check_header(hdr)) { | 657 | if (android_image_check_header(hdr)) { |
654 | printf("boota: bad boot image magic\n"); | 658 | printf("boota: bad boot image magic\n"); |
655 | goto fail; | 659 | goto fail; |
656 | } | 660 | } |
657 | if (avb_result == AVB_AB_FLOW_RESULT_OK) | 661 | if (avb_result == AVB_AB_FLOW_RESULT_OK) |
658 | printf(" verify OK, boot '%s%s'\n", | 662 | printf(" verify OK, boot '%s%s'\n", |
659 | avb_loadpart->partition_name, avb_out_data->ab_suffix); | 663 | avb_loadpart->partition_name, avb_out_data->ab_suffix); |
660 | else { | 664 | else { |
661 | printf(" verify FAIL, state: UNLOCK\n"); | 665 | printf(" verify FAIL, state: UNLOCK\n"); |
662 | printf(" boot '%s%s' still\n", | 666 | printf(" boot '%s%s' still\n", |
663 | avb_loadpart->partition_name, avb_out_data->ab_suffix); | 667 | avb_loadpart->partition_name, avb_out_data->ab_suffix); |
664 | } | 668 | } |
665 | char bootargs_sec[ANDR_BOOT_EXTRA_ARGS_SIZE]; | 669 | char bootargs_sec[ANDR_BOOT_EXTRA_ARGS_SIZE]; |
666 | if (lock_status == FASTBOOT_LOCK) { | 670 | if (lock_status == FASTBOOT_LOCK) { |
667 | snprintf(bootargs_sec, sizeof(bootargs_sec), | 671 | snprintf(bootargs_sec, sizeof(bootargs_sec), |
668 | "androidboot.verifiedbootstate=green androidboot.flash.locked=1 androidboot.slot_suffix=%s ", | 672 | "androidboot.verifiedbootstate=green androidboot.flash.locked=1 androidboot.slot_suffix=%s ", |
669 | avb_out_data->ab_suffix); | 673 | avb_out_data->ab_suffix); |
670 | } else { | 674 | } else { |
671 | snprintf(bootargs_sec, sizeof(bootargs_sec), | 675 | snprintf(bootargs_sec, sizeof(bootargs_sec), |
672 | "androidboot.verifiedbootstate=orange androidboot.flash.locked=0 androidboot.slot_suffix=%s ", | 676 | "androidboot.verifiedbootstate=orange androidboot.flash.locked=0 androidboot.slot_suffix=%s ", |
673 | avb_out_data->ab_suffix); | 677 | avb_out_data->ab_suffix); |
674 | } | 678 | } |
675 | strcat(bootargs_sec, avb_out_data->cmdline); | 679 | strcat(bootargs_sec, avb_out_data->cmdline); |
676 | #ifndef CONFIG_ANDROID_AUTO_SUPPORT | 680 | #ifndef CONFIG_ANDROID_AUTO_SUPPORT |
677 | /* for standard android, recovery ramdisk will be used anyway, to | 681 | /* for standard android, recovery ramdisk will be used anyway, to |
678 | * boot up Android, "androidboot.force_normal_boot=1" is needed */ | 682 | * boot up Android, "androidboot.force_normal_boot=1" is needed */ |
679 | if(!is_recovery_mode) { | 683 | if(!is_recovery_mode) { |
680 | strcat(bootargs_sec, " androidboot.force_normal_boot=1"); | 684 | strcat(bootargs_sec, " androidboot.force_normal_boot=1"); |
681 | } | 685 | } |
682 | #endif | 686 | #endif |
683 | env_set("bootargs_sec", bootargs_sec); | 687 | env_set("bootargs_sec", bootargs_sec); |
684 | #if defined CONFIG_SYSTEM_RAMDISK_SUPPORT && defined CONFIG_ANDROID_AUTO_SUPPORT | 688 | #if defined CONFIG_SYSTEM_RAMDISK_SUPPORT && defined CONFIG_ANDROID_AUTO_SUPPORT |
685 | if(!is_recovery_mode) { | 689 | if(!is_recovery_mode) { |
686 | if(avb_out_data->cmdline != NULL && strstr(avb_out_data->cmdline, "root=")) | 690 | if(avb_out_data->cmdline != NULL && strstr(avb_out_data->cmdline, "root=")) |
687 | fastboot_setup_system_boot_args(avb_out_data->ab_suffix, false); | 691 | fastboot_setup_system_boot_args(avb_out_data->ab_suffix, false); |
688 | else | 692 | else |
689 | fastboot_setup_system_boot_args(avb_out_data->ab_suffix, true); | 693 | fastboot_setup_system_boot_args(avb_out_data->ab_suffix, true); |
690 | } | 694 | } |
691 | #endif /* CONFIG_SYSTEM_RAMDISK_SUPPORT */ | 695 | #endif /* CONFIG_SYSTEM_RAMDISK_SUPPORT */ |
692 | image_size = avb_loadpart->data_size; | 696 | image_size = avb_loadpart->data_size; |
693 | #if defined (CONFIG_ARCH_IMX8) || defined (CONFIG_ARCH_IMX8M) | 697 | #if defined (CONFIG_ARCH_IMX8) || defined (CONFIG_ARCH_IMX8M) |
694 | /* If we are using uncompressed kernel image, copy it directly to | 698 | /* If we are using uncompressed kernel image, copy it directly to |
695 | * hdr->kernel_addr, if we are using compressed lz4 kernel image, | 699 | * hdr->kernel_addr, if we are using compressed lz4 kernel image, |
696 | * we need to decompress the kernel image first. */ | 700 | * we need to decompress the kernel image first. */ |
697 | if (image_arm64((void *)((ulong)hdr + hdr->page_size))) { | 701 | if (image_arm64((void *)((ulong)hdr + hdr->page_size))) { |
698 | memcpy((void *)(long)hdr->kernel_addr, | 702 | memcpy((void *)(long)hdr->kernel_addr, |
699 | (void *)((ulong)hdr + hdr->page_size), hdr->kernel_size); | 703 | (void *)((ulong)hdr + hdr->page_size), hdr->kernel_size); |
700 | } else { | 704 | } else { |
701 | #ifdef CONFIG_LZ4 | 705 | #ifdef CONFIG_LZ4 |
702 | size_t lz4_len = MAX_KERNEL_LEN; | 706 | size_t lz4_len = MAX_KERNEL_LEN; |
703 | if (ulz4fn((void *)((ulong)hdr + hdr->page_size), | 707 | if (ulz4fn((void *)((ulong)hdr + hdr->page_size), |
704 | hdr->kernel_size, (void *)(ulong)hdr->kernel_addr, &lz4_len) != 0) { | 708 | hdr->kernel_size, (void *)(ulong)hdr->kernel_addr, &lz4_len) != 0) { |
705 | printf("Decompress kernel fail!\n"); | 709 | printf("Decompress kernel fail!\n"); |
706 | goto fail; | 710 | goto fail; |
707 | } | 711 | } |
708 | #else /* CONFIG_LZ4 */ | 712 | #else /* CONFIG_LZ4 */ |
709 | printf("please enable CONFIG_LZ4 if we're using compressed lz4 kernel image!\n"); | 713 | printf("please enable CONFIG_LZ4 if we're using compressed lz4 kernel image!\n"); |
710 | goto fail; | 714 | goto fail; |
711 | #endif /* CONFIG_LZ4 */ | 715 | #endif /* CONFIG_LZ4 */ |
712 | } | 716 | } |
713 | #else /* CONFIG_ARCH_IMX8 || CONFIG_ARCH_IMX8M */ | 717 | #else /* CONFIG_ARCH_IMX8 || CONFIG_ARCH_IMX8M */ |
714 | /* copy kernel image and boot header to hdr->kernel_addr - hdr->page_size */ | 718 | /* copy kernel image and boot header to hdr->kernel_addr - hdr->page_size */ |
715 | memcpy((void *)(ulong)(hdr->kernel_addr - hdr->page_size), (void *)hdr, | 719 | memcpy((void *)(ulong)(hdr->kernel_addr - hdr->page_size), (void *)hdr, |
716 | hdr->page_size + ALIGN(hdr->kernel_size, hdr->page_size)); | 720 | hdr->page_size + ALIGN(hdr->kernel_size, hdr->page_size)); |
717 | #endif /* CONFIG_ARCH_IMX8 || CONFIG_ARCH_IMX8M */ | 721 | #endif /* CONFIG_ARCH_IMX8 || CONFIG_ARCH_IMX8M */ |
718 | } else { | 722 | } else { |
719 | /* Fall into fastboot mode if get unacceptable error from avb | 723 | /* Fall into fastboot mode if get unacceptable error from avb |
720 | * or verify fail in lock state. | 724 | * or verify fail in lock state. |
721 | */ | 725 | */ |
722 | if (lock_status == FASTBOOT_LOCK) | 726 | if (lock_status == FASTBOOT_LOCK) |
723 | printf(" verify FAIL, state: LOCK\n"); | 727 | printf(" verify FAIL, state: LOCK\n"); |
724 | 728 | ||
725 | goto fail; | 729 | goto fail; |
726 | } | 730 | } |
731 | |||
732 | /* Show orange warning for unlocked device, press power button to skip. */ | ||
733 | #ifdef CONFIG_AVB_WARNING_LOGO | ||
734 | if (fastboot_get_lock_stat() == FASTBOOT_UNLOCK) { | ||
735 | int count = 0; | ||
736 | |||
737 | printf("Device is unlocked, press power key to skip warning logo... \n"); | ||
738 | if (display_unlock_warning()) | ||
739 | printf("can't show unlock warning.\n"); | ||
740 | while ( (count < 10 * CONFIG_AVB_WARNING_TIME_LAST) && !is_power_key_pressed()) { | ||
741 | mdelay(100); | ||
742 | count++; | ||
743 | } | ||
744 | } | ||
745 | #endif | ||
727 | 746 | ||
728 | flush_cache((ulong)image_load_addr, image_size); | 747 | flush_cache((ulong)image_load_addr, image_size); |
729 | check_image_arm64 = image_arm64((void *)(ulong)hdr->kernel_addr); | 748 | check_image_arm64 = image_arm64((void *)(ulong)hdr->kernel_addr); |
730 | #if !defined(CONFIG_SYSTEM_RAMDISK_SUPPORT) || !defined(CONFIG_ANDROID_AUTO_SUPPORT) | 749 | #if !defined(CONFIG_SYSTEM_RAMDISK_SUPPORT) || !defined(CONFIG_ANDROID_AUTO_SUPPORT) |
731 | memcpy((void *)(ulong)hdr->ramdisk_addr, (void *)(ulong)hdr + hdr->page_size | 750 | memcpy((void *)(ulong)hdr->ramdisk_addr, (void *)(ulong)hdr + hdr->page_size |
732 | + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); | 751 | + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); |
733 | #else | 752 | #else |
734 | if (is_recovery_mode) | 753 | if (is_recovery_mode) |
735 | memcpy((void *)(ulong)hdr->ramdisk_addr, (void *)(ulong)hdr + hdr->page_size | 754 | memcpy((void *)(ulong)hdr->ramdisk_addr, (void *)(ulong)hdr + hdr->page_size |
736 | + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); | 755 | + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); |
737 | #endif | 756 | #endif |
738 | 757 | ||
739 | #ifdef CONFIG_OF_LIBFDT | 758 | #ifdef CONFIG_OF_LIBFDT |
740 | /* load the dtb file */ | 759 | /* load the dtb file */ |
741 | u32 fdt_addr = 0; | 760 | u32 fdt_addr = 0; |
742 | u32 fdt_size = 0; | 761 | u32 fdt_size = 0; |
743 | struct dt_table_header *dt_img = NULL; | 762 | struct dt_table_header *dt_img = NULL; |
744 | 763 | ||
745 | if (is_load_fdt_from_part()) { | 764 | if (is_load_fdt_from_part()) { |
746 | fdt_addr = (ulong)((ulong)(hdr->kernel_addr) + MAX_KERNEL_LEN); | 765 | fdt_addr = (ulong)((ulong)(hdr->kernel_addr) + MAX_KERNEL_LEN); |
747 | #ifdef CONFIG_ANDROID_THINGS_SUPPORT | 766 | #ifdef CONFIG_ANDROID_THINGS_SUPPORT |
748 | if (find_partition_data_by_name("oem_bootloader", | 767 | if (find_partition_data_by_name("oem_bootloader", |
749 | avb_out_data, &avb_loadpart)) { | 768 | avb_out_data, &avb_loadpart)) { |
750 | goto fail; | 769 | goto fail; |
751 | } else | 770 | } else |
752 | dt_img = (struct dt_table_header *)avb_loadpart->data; | 771 | dt_img = (struct dt_table_header *)avb_loadpart->data; |
753 | #elif defined(CONFIG_SYSTEM_RAMDISK_SUPPORT) /* It means boot.img(recovery) do not include dtb, it need load dtb from partition */ | 772 | #elif defined(CONFIG_SYSTEM_RAMDISK_SUPPORT) /* It means boot.img(recovery) do not include dtb, it need load dtb from partition */ |
754 | if (find_partition_data_by_name("dtbo", | 773 | if (find_partition_data_by_name("dtbo", |
755 | avb_out_data, &avb_loadpart)) { | 774 | avb_out_data, &avb_loadpart)) { |
756 | goto fail; | 775 | goto fail; |
757 | } else | 776 | } else |
758 | dt_img = (struct dt_table_header *)avb_loadpart->data; | 777 | dt_img = (struct dt_table_header *)avb_loadpart->data; |
759 | #else /* recovery.img include dts while boot.img use dtbo */ | 778 | #else /* recovery.img include dts while boot.img use dtbo */ |
760 | if (is_recovery_mode) { | 779 | if (is_recovery_mode) { |
761 | if (hdr->header_version != 1) { | 780 | if (hdr->header_version != 1) { |
762 | printf("boota: boot image header version error!\n"); | 781 | printf("boota: boot image header version error!\n"); |
763 | goto fail; | 782 | goto fail; |
764 | } | 783 | } |
765 | 784 | ||
766 | dt_img = (struct dt_table_header *)((void *)(ulong)hdr + | 785 | dt_img = (struct dt_table_header *)((void *)(ulong)hdr + |
767 | hdr->page_size + | 786 | hdr->page_size + |
768 | ALIGN(hdr->kernel_size, hdr->page_size) + | 787 | ALIGN(hdr->kernel_size, hdr->page_size) + |
769 | ALIGN(hdr->ramdisk_size, hdr->page_size) + | 788 | ALIGN(hdr->ramdisk_size, hdr->page_size) + |
770 | ALIGN(hdr->second_size, hdr->page_size)); | 789 | ALIGN(hdr->second_size, hdr->page_size)); |
771 | } else if (find_partition_data_by_name("dtbo", | 790 | } else if (find_partition_data_by_name("dtbo", |
772 | avb_out_data, &avb_loadpart)) { | 791 | avb_out_data, &avb_loadpart)) { |
773 | goto fail; | 792 | goto fail; |
774 | } else | 793 | } else |
775 | dt_img = (struct dt_table_header *)avb_loadpart->data; | 794 | dt_img = (struct dt_table_header *)avb_loadpart->data; |
776 | #endif | 795 | #endif |
777 | 796 | ||
778 | if (be32_to_cpu(dt_img->magic) != DT_TABLE_MAGIC) { | 797 | if (be32_to_cpu(dt_img->magic) != DT_TABLE_MAGIC) { |
779 | printf("boota: bad dt table magic %08x\n", | 798 | printf("boota: bad dt table magic %08x\n", |
780 | be32_to_cpu(dt_img->magic)); | 799 | be32_to_cpu(dt_img->magic)); |
781 | goto fail; | 800 | goto fail; |
782 | } else if (!be32_to_cpu(dt_img->dt_entry_count)) { | 801 | } else if (!be32_to_cpu(dt_img->dt_entry_count)) { |
783 | printf("boota: no dt entries\n"); | 802 | printf("boota: no dt entries\n"); |
784 | goto fail; | 803 | goto fail; |
785 | } | 804 | } |
786 | 805 | ||
787 | struct dt_table_entry *dt_entry; | 806 | struct dt_table_entry *dt_entry; |
788 | dt_entry = (struct dt_table_entry *)((ulong)dt_img + | 807 | dt_entry = (struct dt_table_entry *)((ulong)dt_img + |
789 | be32_to_cpu(dt_img->dt_entries_offset)); | 808 | be32_to_cpu(dt_img->dt_entries_offset)); |
790 | fdt_size = be32_to_cpu(dt_entry->dt_size); | 809 | fdt_size = be32_to_cpu(dt_entry->dt_size); |
791 | memcpy((void *)fdt_addr, (void *)((ulong)dt_img + | 810 | memcpy((void *)fdt_addr, (void *)((ulong)dt_img + |
792 | be32_to_cpu(dt_entry->dt_offset)), fdt_size); | 811 | be32_to_cpu(dt_entry->dt_offset)), fdt_size); |
793 | } else { | 812 | } else { |
794 | fdt_addr = (ulong)(hdr->second_addr); | 813 | fdt_addr = (ulong)(hdr->second_addr); |
795 | fdt_size = (ulong)(hdr->second_size); | 814 | fdt_size = (ulong)(hdr->second_size); |
796 | if (fdt_size && fdt_addr) { | 815 | if (fdt_size && fdt_addr) { |
797 | memcpy((void *)(ulong)fdt_addr, | 816 | memcpy((void *)(ulong)fdt_addr, |
798 | (void *)(ulong)hdr + hdr->page_size | 817 | (void *)(ulong)hdr + hdr->page_size |
799 | + ALIGN(hdr->kernel_size, hdr->page_size) | 818 | + ALIGN(hdr->kernel_size, hdr->page_size) |
800 | + ALIGN(hdr->ramdisk_size, hdr->page_size), | 819 | + ALIGN(hdr->ramdisk_size, hdr->page_size), |
801 | fdt_size); | 820 | fdt_size); |
802 | } | 821 | } |
803 | } | 822 | } |
804 | #endif /*CONFIG_OF_LIBFDT*/ | 823 | #endif /*CONFIG_OF_LIBFDT*/ |
805 | 824 | ||
806 | if (check_image_arm64) { | 825 | if (check_image_arm64) { |
807 | android_image_get_kernel(hdr, 0, NULL, NULL); | 826 | android_image_get_kernel(hdr, 0, NULL, NULL); |
808 | addr = hdr->kernel_addr; | 827 | addr = hdr->kernel_addr; |
809 | } else { | 828 | } else { |
810 | addr = (ulong)(hdr->kernel_addr - hdr->page_size); | 829 | addr = (ulong)(hdr->kernel_addr - hdr->page_size); |
811 | } | 830 | } |
812 | printf("kernel @ %08x (%d)\n", hdr->kernel_addr, hdr->kernel_size); | 831 | printf("kernel @ %08x (%d)\n", hdr->kernel_addr, hdr->kernel_size); |
813 | printf("ramdisk @ %08x (%d)\n", hdr->ramdisk_addr, hdr->ramdisk_size); | 832 | printf("ramdisk @ %08x (%d)\n", hdr->ramdisk_addr, hdr->ramdisk_size); |
814 | #ifdef CONFIG_OF_LIBFDT | 833 | #ifdef CONFIG_OF_LIBFDT |
815 | if (fdt_size) | 834 | if (fdt_size) |
816 | printf("fdt @ %08x (%d)\n", fdt_addr, fdt_size); | 835 | printf("fdt @ %08x (%d)\n", fdt_addr, fdt_size); |
817 | #endif /*CONFIG_OF_LIBFDT*/ | 836 | #endif /*CONFIG_OF_LIBFDT*/ |
818 | 837 | ||
819 | char boot_addr_start[12]; | 838 | char boot_addr_start[12]; |
820 | char ramdisk_addr[25]; | 839 | char ramdisk_addr[25]; |
821 | char fdt_addr_start[12]; | 840 | char fdt_addr_start[12]; |
822 | 841 | ||
823 | char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr_start}; | 842 | char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr_start}; |
824 | if (check_image_arm64) | 843 | if (check_image_arm64) |
825 | boot_args[0] = "booti"; | 844 | boot_args[0] = "booti"; |
826 | else | 845 | else |
827 | boot_args[0] = "bootm"; | 846 | boot_args[0] = "bootm"; |
828 | 847 | ||
829 | sprintf(boot_addr_start, "0x%lx", addr); | 848 | sprintf(boot_addr_start, "0x%lx", addr); |
830 | sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size); | 849 | sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size); |
831 | sprintf(fdt_addr_start, "0x%x", fdt_addr); | 850 | sprintf(fdt_addr_start, "0x%x", fdt_addr); |
832 | 851 | ||
833 | /* when CONFIG_SYSTEM_RAMDISK_SUPPORT is enabled and it's for Android Auto, if it's not recovery mode | 852 | /* when CONFIG_SYSTEM_RAMDISK_SUPPORT is enabled and it's for Android Auto, if it's not recovery mode |
834 | * do not pass ramdisk addr*/ | 853 | * do not pass ramdisk addr*/ |
835 | #if defined(CONFIG_SYSTEM_RAMDISK_SUPPORT) && defined(CONFIG_ANDROID_AUTO_SUPPORT) | 854 | #if defined(CONFIG_SYSTEM_RAMDISK_SUPPORT) && defined(CONFIG_ANDROID_AUTO_SUPPORT) |
836 | if (!is_recovery_mode) | 855 | if (!is_recovery_mode) |
837 | boot_args[2] = NULL; | 856 | boot_args[2] = NULL; |
838 | #endif | 857 | #endif |
839 | 858 | ||
840 | #ifdef CONFIG_IMX_TRUSTY_OS | 859 | #ifdef CONFIG_IMX_TRUSTY_OS |
841 | /* Trusty keymaster needs some parameters before it work */ | 860 | /* Trusty keymaster needs some parameters before it work */ |
842 | if (trusty_setbootparameter(hdr, avb_result, avb_out_data)) | 861 | if (trusty_setbootparameter(hdr, avb_result, avb_out_data)) |
843 | goto fail; | 862 | goto fail; |
844 | /* lock the boot status and rollback_idx preventing Linux modify it */ | 863 | /* lock the boot status and rollback_idx preventing Linux modify it */ |
845 | trusty_lock_boot_state(); | 864 | trusty_lock_boot_state(); |
846 | /* lock the boot state so linux can't use some hwcrypto commands. */ | 865 | /* lock the boot state so linux can't use some hwcrypto commands. */ |
847 | hwcrypto_lock_boot_state(); | 866 | hwcrypto_lock_boot_state(); |
848 | /* put ql-tipc to release resource for Linux */ | 867 | /* put ql-tipc to release resource for Linux */ |
849 | trusty_ipc_shutdown(); | 868 | trusty_ipc_shutdown(); |
850 | #endif | 869 | #endif |
851 | 870 | ||
852 | if (avb_out_data != NULL) | 871 | if (avb_out_data != NULL) |
853 | avb_slot_verify_data_free(avb_out_data); | 872 | avb_slot_verify_data_free(avb_out_data); |
854 | 873 | ||
855 | if (check_image_arm64) { | 874 | if (check_image_arm64) { |
856 | #ifdef CONFIG_CMD_BOOTI | 875 | #ifdef CONFIG_CMD_BOOTI |
857 | do_booti(NULL, 0, 4, boot_args); | 876 | do_booti(NULL, 0, 4, boot_args); |
858 | #else | 877 | #else |
859 | debug("please enable CONFIG_CMD_BOOTI when kernel are Image"); | 878 | debug("please enable CONFIG_CMD_BOOTI when kernel are Image"); |
860 | #endif | 879 | #endif |
861 | } else { | 880 | } else { |
862 | do_bootm(NULL, 0, 4, boot_args); | 881 | do_bootm(NULL, 0, 4, boot_args); |
863 | } | 882 | } |
864 | 883 | ||
865 | /* This only happens if image is somehow faulty so we start over */ | 884 | /* This only happens if image is somehow faulty so we start over */ |
866 | do_reset(NULL, 0, 0, NULL); | 885 | do_reset(NULL, 0, 0, NULL); |
867 | 886 | ||
868 | return 1; | 887 | return 1; |
869 | 888 | ||
870 | fail: | 889 | fail: |
871 | /* avb has no recovery */ | 890 | /* avb has no recovery */ |
872 | if (avb_out_data != NULL) | 891 | if (avb_out_data != NULL) |
873 | avb_slot_verify_data_free(avb_out_data); | 892 | avb_slot_verify_data_free(avb_out_data); |
874 | 893 | ||
875 | return run_command("fastboot 0", 0); | 894 | return run_command("fastboot 0", 0); |
876 | } | 895 | } |
877 | 896 | ||
878 | U_BOOT_CMD( | 897 | U_BOOT_CMD( |
879 | boota, 2, 1, do_boota, | 898 | boota, 2, 1, do_boota, |
880 | "boota - boot android bootimg \n", | 899 | "boota - boot android bootimg \n", |
881 | "boot from current mmc with avb verify\n" | 900 | "boot from current mmc with avb verify\n" |
882 | ); | 901 | ); |
883 | 902 | ||
884 | #else /* CONFIG_AVB_SUPPORT */ | 903 | #else /* CONFIG_AVB_SUPPORT */ |
885 | /* boota <addr> [ mmc0 | mmc1 [ <partition> ] ] */ | 904 | /* boota <addr> [ mmc0 | mmc1 [ <partition> ] ] */ |
886 | int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | 905 | int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
887 | { | 906 | { |
888 | ulong addr = 0; | 907 | ulong addr = 0; |
889 | char *ptn = "boot"; | 908 | char *ptn = "boot"; |
890 | int mmcc = -1; | 909 | int mmcc = -1; |
891 | struct andr_img_hdr *hdr = &boothdr; | 910 | struct andr_img_hdr *hdr = &boothdr; |
892 | ulong image_size; | 911 | ulong image_size; |
893 | bool check_image_arm64 = false; | 912 | bool check_image_arm64 = false; |
894 | int i = 0; | 913 | int i = 0; |
895 | 914 | ||
896 | for (i = 0; i < argc; i++) | 915 | for (i = 0; i < argc; i++) |
897 | printf("%s ", argv[i]); | 916 | printf("%s ", argv[i]); |
898 | printf("\n"); | 917 | printf("\n"); |
899 | 918 | ||
900 | if (argc < 2) | 919 | if (argc < 2) |
901 | return -1; | 920 | return -1; |
902 | 921 | ||
903 | mmcc = simple_strtoul(argv[1]+3, NULL, 10); | 922 | mmcc = simple_strtoul(argv[1]+3, NULL, 10); |
904 | 923 | ||
905 | if (argc > 2) | 924 | if (argc > 2) |
906 | ptn = argv[2]; | 925 | ptn = argv[2]; |
907 | 926 | ||
908 | if (mmcc != -1) { | 927 | if (mmcc != -1) { |
909 | #ifdef CONFIG_MMC | 928 | #ifdef CONFIG_MMC |
910 | struct fastboot_ptentry *pte; | 929 | struct fastboot_ptentry *pte; |
911 | struct mmc *mmc; | 930 | struct mmc *mmc; |
912 | disk_partition_t info; | 931 | disk_partition_t info; |
913 | struct blk_desc *dev_desc = NULL; | 932 | struct blk_desc *dev_desc = NULL; |
914 | unsigned bootimg_sectors; | 933 | unsigned bootimg_sectors; |
915 | 934 | ||
916 | memset((void *)&info, 0 , sizeof(disk_partition_t)); | 935 | memset((void *)&info, 0 , sizeof(disk_partition_t)); |
917 | /* i.MX use MBR as partition table, so this will have | 936 | /* i.MX use MBR as partition table, so this will have |
918 | to find the start block and length for the | 937 | to find the start block and length for the |
919 | partition name and register the fastboot pte we | 938 | partition name and register the fastboot pte we |
920 | define the partition number of each partition in | 939 | define the partition number of each partition in |
921 | config file | 940 | config file |
922 | */ | 941 | */ |
923 | mmc = find_mmc_device(mmcc); | 942 | mmc = find_mmc_device(mmcc); |
924 | if (!mmc) { | 943 | if (!mmc) { |
925 | printf("boota: cannot find '%d' mmc device\n", mmcc); | 944 | printf("boota: cannot find '%d' mmc device\n", mmcc); |
926 | goto fail; | 945 | goto fail; |
927 | } | 946 | } |
928 | dev_desc = blk_get_dev("mmc", mmcc); | 947 | dev_desc = blk_get_dev("mmc", mmcc); |
929 | if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { | 948 | if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { |
930 | printf("** Block device MMC %d not supported\n", mmcc); | 949 | printf("** Block device MMC %d not supported\n", mmcc); |
931 | goto fail; | 950 | goto fail; |
932 | } | 951 | } |
933 | 952 | ||
934 | /* below was i.MX mmc operation code */ | 953 | /* below was i.MX mmc operation code */ |
935 | if (mmc_init(mmc)) { | 954 | if (mmc_init(mmc)) { |
936 | printf("mmc%d init failed\n", mmcc); | 955 | printf("mmc%d init failed\n", mmcc); |
937 | goto fail; | 956 | goto fail; |
938 | } | 957 | } |
939 | 958 | ||
940 | pte = fastboot_flash_find_ptn(ptn); | 959 | pte = fastboot_flash_find_ptn(ptn); |
941 | if (!pte) { | 960 | if (!pte) { |
942 | printf("boota: cannot find '%s' partition\n", ptn); | 961 | printf("boota: cannot find '%s' partition\n", ptn); |
943 | fastboot_flash_dump_ptn(); | 962 | fastboot_flash_dump_ptn(); |
944 | goto fail; | 963 | goto fail; |
945 | } | 964 | } |
946 | 965 | ||
947 | if (blk_dread(dev_desc, pte->start, | 966 | if (blk_dread(dev_desc, pte->start, |
948 | 1, (void *)hdr) < 0) { | 967 | 1, (void *)hdr) < 0) { |
949 | printf("boota: mmc failed to read bootimg header\n"); | 968 | printf("boota: mmc failed to read bootimg header\n"); |
950 | goto fail; | 969 | goto fail; |
951 | } | 970 | } |
952 | 971 | ||
953 | if (android_image_check_header(hdr)) { | 972 | if (android_image_check_header(hdr)) { |
954 | printf("boota: bad boot image magic\n"); | 973 | printf("boota: bad boot image magic\n"); |
955 | goto fail; | 974 | goto fail; |
956 | } | 975 | } |
957 | 976 | ||
958 | image_size = android_image_get_end(hdr) - (ulong)hdr; | 977 | image_size = android_image_get_end(hdr) - (ulong)hdr; |
959 | bootimg_sectors = image_size/512; | 978 | bootimg_sectors = image_size/512; |
960 | 979 | ||
961 | if (blk_dread(dev_desc, pte->start, | 980 | if (blk_dread(dev_desc, pte->start, |
962 | bootimg_sectors, | 981 | bootimg_sectors, |
963 | (void *)(hdr->kernel_addr - hdr->page_size)) < 0) { | 982 | (void *)(hdr->kernel_addr - hdr->page_size)) < 0) { |
964 | printf("boota: mmc failed to read bootimage\n"); | 983 | printf("boota: mmc failed to read bootimage\n"); |
965 | goto fail; | 984 | goto fail; |
966 | } | 985 | } |
967 | check_image_arm64 = image_arm64((void *)hdr->kernel_addr); | 986 | check_image_arm64 = image_arm64((void *)hdr->kernel_addr); |
968 | #if defined(CONFIG_FASTBOOT_LOCK) | 987 | #if defined(CONFIG_FASTBOOT_LOCK) |
969 | int verifyresult = -1; | 988 | int verifyresult = -1; |
970 | #endif | 989 | #endif |
971 | 990 | ||
972 | #if defined(CONFIG_FASTBOOT_LOCK) | 991 | #if defined(CONFIG_FASTBOOT_LOCK) |
973 | int lock_status = fastboot_get_lock_stat(); | 992 | int lock_status = fastboot_get_lock_stat(); |
974 | if (lock_status == FASTBOOT_LOCK_ERROR) { | 993 | if (lock_status == FASTBOOT_LOCK_ERROR) { |
975 | printf("In boota get fastboot lock status error. Set lock status\n"); | 994 | printf("In boota get fastboot lock status error. Set lock status\n"); |
976 | fastboot_set_lock_stat(FASTBOOT_LOCK); | 995 | fastboot_set_lock_stat(FASTBOOT_LOCK); |
977 | } | 996 | } |
978 | display_lock(fastboot_get_lock_stat(), verifyresult); | 997 | display_lock(fastboot_get_lock_stat(), verifyresult); |
979 | #endif | 998 | #endif |
980 | /* load the ramdisk file */ | 999 | /* load the ramdisk file */ |
981 | memcpy((void *)hdr->ramdisk_addr, (void *)hdr->kernel_addr | 1000 | memcpy((void *)hdr->ramdisk_addr, (void *)hdr->kernel_addr |
982 | + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); | 1001 | + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); |
983 | 1002 | ||
984 | #ifdef CONFIG_OF_LIBFDT | 1003 | #ifdef CONFIG_OF_LIBFDT |
985 | u32 fdt_size = 0; | 1004 | u32 fdt_size = 0; |
986 | /* load the dtb file */ | 1005 | /* load the dtb file */ |
987 | if (hdr->second_addr) { | 1006 | if (hdr->second_addr) { |
988 | u32 zimage_size = ((u32 *)hdrload->kernel_addr)[ZIMAGE_END_ADDR] | 1007 | u32 zimage_size = ((u32 *)hdrload->kernel_addr)[ZIMAGE_END_ADDR] |
989 | - ((u32 *)hdrload->kernel_addr)[ZIMAGE_START_ADDR]; | 1008 | - ((u32 *)hdrload->kernel_addr)[ZIMAGE_START_ADDR]; |
990 | fdt_size = hdrload->kernel_size - zimage_size; | 1009 | fdt_size = hdrload->kernel_size - zimage_size; |
991 | memcpy((void *)(ulong)hdrload->second_addr, | 1010 | memcpy((void *)(ulong)hdrload->second_addr, |
992 | (void*)(ulong)hdrload->kernel_addr + zimage_size, fdt_size); | 1011 | (void*)(ulong)hdrload->kernel_addr + zimage_size, fdt_size); |
993 | } | 1012 | } |
994 | #endif /*CONFIG_OF_LIBFDT*/ | 1013 | #endif /*CONFIG_OF_LIBFDT*/ |
995 | 1014 | ||
996 | #else /*! CONFIG_MMC*/ | 1015 | #else /*! CONFIG_MMC*/ |
997 | return -1; | 1016 | return -1; |
998 | #endif /*! CONFIG_MMC*/ | 1017 | #endif /*! CONFIG_MMC*/ |
999 | } else { | 1018 | } else { |
1000 | printf("boota: parameters is invalid. only support mmcX device\n"); | 1019 | printf("boota: parameters is invalid. only support mmcX device\n"); |
1001 | return -1; | 1020 | return -1; |
1002 | } | 1021 | } |
1003 | 1022 | ||
1004 | printf("kernel @ %08x (%d)\n", hdr->kernel_addr, hdr->kernel_size); | 1023 | printf("kernel @ %08x (%d)\n", hdr->kernel_addr, hdr->kernel_size); |
1005 | printf("ramdisk @ %08x (%d)\n", hdr->ramdisk_addr, hdr->ramdisk_size); | 1024 | printf("ramdisk @ %08x (%d)\n", hdr->ramdisk_addr, hdr->ramdisk_size); |
1006 | #ifdef CONFIG_OF_LIBFDT | 1025 | #ifdef CONFIG_OF_LIBFDT |
1007 | if (fdt_size) | 1026 | if (fdt_size) |
1008 | printf("fdt @ %08x (%d)\n", hdr->second_addr, fdt_size); | 1027 | printf("fdt @ %08x (%d)\n", hdr->second_addr, fdt_size); |
1009 | #endif /*CONFIG_OF_LIBFDT*/ | 1028 | #endif /*CONFIG_OF_LIBFDT*/ |
1010 | 1029 | ||
1011 | 1030 | ||
1012 | char boot_addr_start[12]; | 1031 | char boot_addr_start[12]; |
1013 | char ramdisk_addr[25]; | 1032 | char ramdisk_addr[25]; |
1014 | char fdt_addr[12]; | 1033 | char fdt_addr[12]; |
1015 | char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr}; | 1034 | char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr}; |
1016 | if (check_image_arm64 ) { | 1035 | if (check_image_arm64 ) { |
1017 | addr = hdr->kernel_addr; | 1036 | addr = hdr->kernel_addr; |
1018 | boot_args[0] = "booti"; | 1037 | boot_args[0] = "booti"; |
1019 | } else { | 1038 | } else { |
1020 | addr = hdr->kernel_addr - hdr->page_size; | 1039 | addr = hdr->kernel_addr - hdr->page_size; |
1021 | boot_args[0] = "bootm"; | 1040 | boot_args[0] = "bootm"; |
1022 | } | 1041 | } |
1023 | 1042 | ||
1024 | sprintf(boot_addr_start, "0x%lx", addr); | 1043 | sprintf(boot_addr_start, "0x%lx", addr); |
1025 | sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size); | 1044 | sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size); |
1026 | sprintf(fdt_addr, "0x%x", hdr->second_addr); | 1045 | sprintf(fdt_addr, "0x%x", hdr->second_addr); |
1027 | if (check_image_arm64) { | 1046 | if (check_image_arm64) { |
1028 | android_image_get_kernel(hdr, 0, NULL, NULL); | 1047 | android_image_get_kernel(hdr, 0, NULL, NULL); |
1029 | #ifdef CONFIG_CMD_BOOTI | 1048 | #ifdef CONFIG_CMD_BOOTI |
1030 | do_booti(NULL, 0, 4, boot_args); | 1049 | do_booti(NULL, 0, 4, boot_args); |
1031 | #else | 1050 | #else |
1032 | debug("please enable CONFIG_CMD_BOOTI when kernel are Image"); | 1051 | debug("please enable CONFIG_CMD_BOOTI when kernel are Image"); |
1033 | #endif | 1052 | #endif |
1034 | } else { | 1053 | } else { |
1035 | do_bootm(NULL, 0, 4, boot_args); | 1054 | do_bootm(NULL, 0, 4, boot_args); |
1036 | } | 1055 | } |
1037 | /* This only happens if image is somehow faulty so we start over */ | 1056 | /* This only happens if image is somehow faulty so we start over */ |
1038 | do_reset(NULL, 0, 0, NULL); | 1057 | do_reset(NULL, 0, 0, NULL); |
1039 | 1058 | ||
1040 | return 1; | 1059 | return 1; |
1041 | 1060 | ||
1042 | fail: | 1061 | fail: |
1043 | #if defined(CONFIG_FSL_FASTBOOT) | 1062 | #if defined(CONFIG_FSL_FASTBOOT) |
1044 | return run_command("fastboot 0", 0); | 1063 | return run_command("fastboot 0", 0); |
1045 | #else /*! CONFIG_FSL_FASTBOOT*/ | 1064 | #else /*! CONFIG_FSL_FASTBOOT*/ |
1046 | return -1; | 1065 | return -1; |
1047 | #endif /*! CONFIG_FSL_FASTBOOT*/ | 1066 | #endif /*! CONFIG_FSL_FASTBOOT*/ |
1048 | } | 1067 | } |
1049 | 1068 | ||
1050 | U_BOOT_CMD( | 1069 | U_BOOT_CMD( |
1051 | boota, 3, 1, do_boota, | 1070 | boota, 3, 1, do_boota, |
1052 | "boota - boot android bootimg from memory\n", | 1071 | "boota - boot android bootimg from memory\n", |
1053 | "[<addr> | mmc0 | mmc1 | mmc2 | mmcX] [<partition>]\n " | 1072 | "[<addr> | mmc0 | mmc1 | mmc2 | mmcX] [<partition>]\n " |
1054 | "- boot application image stored in memory or mmc\n" | 1073 | "- boot application image stored in memory or mmc\n" |
1055 | "\t'addr' should be the address of boot image " | 1074 | "\t'addr' should be the address of boot image " |
1056 | "which is zImage+ramdisk.img\n" | 1075 | "which is zImage+ramdisk.img\n" |
1057 | "\t'mmcX' is the mmc device you store your boot.img, " | 1076 | "\t'mmcX' is the mmc device you store your boot.img, " |
1058 | "which will read the boot.img from 1M offset('/boot' partition)\n" | 1077 | "which will read the boot.img from 1M offset('/boot' partition)\n" |
1059 | "\t 'partition' (optional) is the partition id of your device, " | 1078 | "\t 'partition' (optional) is the partition id of your device, " |
1060 | "if no partition give, will going to 'boot' partition\n" | 1079 | "if no partition give, will going to 'boot' partition\n" |
1061 | ); | 1080 | ); |
1062 | #endif /* CONFIG_AVB_SUPPORT */ | 1081 | #endif /* CONFIG_AVB_SUPPORT */ |
1063 | #endif /* CONFIG_CMD_BOOTA */ | 1082 | #endif /* CONFIG_CMD_BOOTA */ |
1064 | 1083 |
include/fsl_avb_logo.h
File was created | 1 | // SPDX-License-Identifier: GPL-2.0+ | |
2 | /* | ||
3 | * Copyright NXP 2020 | ||
4 | * | ||
5 | */ | ||
6 | |||
7 | #ifndef __FSL_AVB_LOGO_H__ | ||
8 | #define __FSL_AVB_LOGO_H__ | ||
9 | |||
10 | extern unsigned short orange_warning_bmp_palette[]; | ||
11 | extern unsigned char orange_warning_bmp_bitmap[]; | ||
12 | |||
13 | #endif /* __FSL_AVB_LOGO_H__ */ | ||
14 |
lib/Kconfig
1 | menu "Library routines" | 1 | menu "Library routines" |
2 | 2 | ||
3 | config BCH | 3 | config BCH |
4 | bool "Enable Software based BCH ECC" | 4 | bool "Enable Software based BCH ECC" |
5 | help | 5 | help |
6 | Enables software based BCH ECC algorithm present in lib/bch.c | 6 | Enables software based BCH ECC algorithm present in lib/bch.c |
7 | This is used by SoC platforms which do not have built-in ELM | 7 | This is used by SoC platforms which do not have built-in ELM |
8 | hardware engine required for BCH ECC correction. | 8 | hardware engine required for BCH ECC correction. |
9 | 9 | ||
10 | config BINMAN_FDT | 10 | config BINMAN_FDT |
11 | bool "Allow access to binman information in the device tree" | 11 | bool "Allow access to binman information in the device tree" |
12 | depends on BINMAN && OF_CONTROL | 12 | depends on BINMAN && OF_CONTROL |
13 | default y | 13 | default y |
14 | help | 14 | help |
15 | This enables U-Boot to access information about binman entries, | 15 | This enables U-Boot to access information about binman entries, |
16 | stored in the device tree in a binman node. Typical uses are to | 16 | stored in the device tree in a binman node. Typical uses are to |
17 | locate entries in the firmware image. See binman.h for the available | 17 | locate entries in the firmware image. See binman.h for the available |
18 | functionality. | 18 | functionality. |
19 | 19 | ||
20 | config CC_OPTIMIZE_LIBS_FOR_SPEED | 20 | config CC_OPTIMIZE_LIBS_FOR_SPEED |
21 | bool "Optimize libraries for speed" | 21 | bool "Optimize libraries for speed" |
22 | help | 22 | help |
23 | Enabling this option will pass "-O2" to gcc when compiling | 23 | Enabling this option will pass "-O2" to gcc when compiling |
24 | under "lib" directory. | 24 | under "lib" directory. |
25 | 25 | ||
26 | If unsure, say N. | 26 | If unsure, say N. |
27 | 27 | ||
28 | config DYNAMIC_CRC_TABLE | 28 | config DYNAMIC_CRC_TABLE |
29 | bool "Enable Dynamic tables for CRC" | 29 | bool "Enable Dynamic tables for CRC" |
30 | help | 30 | help |
31 | Enable this option to calculate entries for CRC tables at runtime. | 31 | Enable this option to calculate entries for CRC tables at runtime. |
32 | This can be helpful when reducing the size of the build image | 32 | This can be helpful when reducing the size of the build image |
33 | 33 | ||
34 | config HAVE_ARCH_IOMAP | 34 | config HAVE_ARCH_IOMAP |
35 | bool | 35 | bool |
36 | help | 36 | help |
37 | Enable this option if architecture provides io{read,write}{8,16,32} | 37 | Enable this option if architecture provides io{read,write}{8,16,32} |
38 | I/O accessor functions. | 38 | I/O accessor functions. |
39 | 39 | ||
40 | config HAVE_PRIVATE_LIBGCC | 40 | config HAVE_PRIVATE_LIBGCC |
41 | bool | 41 | bool |
42 | 42 | ||
43 | config LIB_UUID | 43 | config LIB_UUID |
44 | bool | 44 | bool |
45 | 45 | ||
46 | config PRINTF | 46 | config PRINTF |
47 | bool | 47 | bool |
48 | default y | 48 | default y |
49 | 49 | ||
50 | config SPL_PRINTF | 50 | config SPL_PRINTF |
51 | bool | 51 | bool |
52 | select SPL_SPRINTF | 52 | select SPL_SPRINTF |
53 | select SPL_STRTO if !SPL_USE_TINY_PRINTF | 53 | select SPL_STRTO if !SPL_USE_TINY_PRINTF |
54 | 54 | ||
55 | config TPL_PRINTF | 55 | config TPL_PRINTF |
56 | bool | 56 | bool |
57 | select TPL_SPRINTF | 57 | select TPL_SPRINTF |
58 | select TPL_STRTO if !TPL_USE_TINY_PRINTF | 58 | select TPL_STRTO if !TPL_USE_TINY_PRINTF |
59 | 59 | ||
60 | config SPRINTF | 60 | config SPRINTF |
61 | bool | 61 | bool |
62 | default y | 62 | default y |
63 | 63 | ||
64 | config SPL_SPRINTF | 64 | config SPL_SPRINTF |
65 | bool | 65 | bool |
66 | 66 | ||
67 | config TPL_SPRINTF | 67 | config TPL_SPRINTF |
68 | bool | 68 | bool |
69 | 69 | ||
70 | config STRTO | 70 | config STRTO |
71 | bool | 71 | bool |
72 | default y | 72 | default y |
73 | 73 | ||
74 | config SPL_STRTO | 74 | config SPL_STRTO |
75 | bool | 75 | bool |
76 | 76 | ||
77 | config TPL_STRTO | 77 | config TPL_STRTO |
78 | bool | 78 | bool |
79 | 79 | ||
80 | config IMAGE_SPARSE | 80 | config IMAGE_SPARSE |
81 | bool | 81 | bool |
82 | 82 | ||
83 | config IMAGE_SPARSE_FILLBUF_SIZE | 83 | config IMAGE_SPARSE_FILLBUF_SIZE |
84 | hex "Android sparse image CHUNK_TYPE_FILL buffer size" | 84 | hex "Android sparse image CHUNK_TYPE_FILL buffer size" |
85 | default 0x80000 | 85 | default 0x80000 |
86 | depends on IMAGE_SPARSE | 86 | depends on IMAGE_SPARSE |
87 | help | 87 | help |
88 | Set the size of the fill buffer used when processing CHUNK_TYPE_FILL | 88 | Set the size of the fill buffer used when processing CHUNK_TYPE_FILL |
89 | chunks. | 89 | chunks. |
90 | 90 | ||
91 | config USE_PRIVATE_LIBGCC | 91 | config USE_PRIVATE_LIBGCC |
92 | bool "Use private libgcc" | 92 | bool "Use private libgcc" |
93 | depends on HAVE_PRIVATE_LIBGCC | 93 | depends on HAVE_PRIVATE_LIBGCC |
94 | default y if HAVE_PRIVATE_LIBGCC && ((ARM && !ARM64) || MIPS) | 94 | default y if HAVE_PRIVATE_LIBGCC && ((ARM && !ARM64) || MIPS) |
95 | help | 95 | help |
96 | This option allows you to use the built-in libgcc implementation | 96 | This option allows you to use the built-in libgcc implementation |
97 | of U-Boot instead of the one provided by the compiler. | 97 | of U-Boot instead of the one provided by the compiler. |
98 | If unsure, say N. | 98 | If unsure, say N. |
99 | 99 | ||
100 | config SYS_HZ | 100 | config SYS_HZ |
101 | int | 101 | int |
102 | default 1000 | 102 | default 1000 |
103 | help | 103 | help |
104 | The frequency of the timer returned by get_timer(). | 104 | The frequency of the timer returned by get_timer(). |
105 | get_timer() must operate in milliseconds and this option must be | 105 | get_timer() must operate in milliseconds and this option must be |
106 | set to 1000. | 106 | set to 1000. |
107 | 107 | ||
108 | config SPL_USE_TINY_PRINTF | 108 | config SPL_USE_TINY_PRINTF |
109 | bool "Enable tiny printf() version in SPL" | 109 | bool "Enable tiny printf() version in SPL" |
110 | depends on SPL | 110 | depends on SPL |
111 | default y | 111 | default y |
112 | help | 112 | help |
113 | This option enables a tiny, stripped down printf version. | 113 | This option enables a tiny, stripped down printf version. |
114 | This should only be used in space limited environments, | 114 | This should only be used in space limited environments, |
115 | like SPL versions with hard memory limits. This version | 115 | like SPL versions with hard memory limits. This version |
116 | reduces the code size by about 2.5KiB on armv7. | 116 | reduces the code size by about 2.5KiB on armv7. |
117 | 117 | ||
118 | The supported format specifiers are %c, %s, %u/%d and %x. | 118 | The supported format specifiers are %c, %s, %u/%d and %x. |
119 | 119 | ||
120 | config TPL_USE_TINY_PRINTF | 120 | config TPL_USE_TINY_PRINTF |
121 | bool "Enable tiny printf() version in TPL" | 121 | bool "Enable tiny printf() version in TPL" |
122 | depends on TPL | 122 | depends on TPL |
123 | default y if SPL_USE_TINY_PRINTF | 123 | default y if SPL_USE_TINY_PRINTF |
124 | help | 124 | help |
125 | This option enables a tiny, stripped down printf version. | 125 | This option enables a tiny, stripped down printf version. |
126 | This should only be used in space limited environments, | 126 | This should only be used in space limited environments, |
127 | like SPL versions with hard memory limits. This version | 127 | like SPL versions with hard memory limits. This version |
128 | reduces the code size by about 2.5KiB on armv7. | 128 | reduces the code size by about 2.5KiB on armv7. |
129 | 129 | ||
130 | The supported format specifiers are %c, %s, %u/%d and %x. | 130 | The supported format specifiers are %c, %s, %u/%d and %x. |
131 | 131 | ||
132 | config PANIC_HANG | 132 | config PANIC_HANG |
133 | bool "Do not reset the system on fatal error" | 133 | bool "Do not reset the system on fatal error" |
134 | help | 134 | help |
135 | Define this option to stop the system in case of a fatal error, | 135 | Define this option to stop the system in case of a fatal error, |
136 | so that you have to reset it manually. This is probably NOT a good | 136 | so that you have to reset it manually. This is probably NOT a good |
137 | idea for an embedded system where you want the system to reboot | 137 | idea for an embedded system where you want the system to reboot |
138 | automatically as fast as possible, but it may be useful during | 138 | automatically as fast as possible, but it may be useful during |
139 | development since you can try to debug the conditions that lead to | 139 | development since you can try to debug the conditions that lead to |
140 | the situation. | 140 | the situation. |
141 | 141 | ||
142 | config REGEX | 142 | config REGEX |
143 | bool "Enable regular expression support" | 143 | bool "Enable regular expression support" |
144 | default y if NET | 144 | default y if NET |
145 | help | 145 | help |
146 | If this variable is defined, U-Boot is linked against the | 146 | If this variable is defined, U-Boot is linked against the |
147 | SLRE (Super Light Regular Expression) library, which adds | 147 | SLRE (Super Light Regular Expression) library, which adds |
148 | regex support to some commands, for example "env grep" and | 148 | regex support to some commands, for example "env grep" and |
149 | "setexpr". | 149 | "setexpr". |
150 | 150 | ||
151 | choice | 151 | choice |
152 | prompt "Pseudo-random library support type" | 152 | prompt "Pseudo-random library support type" |
153 | depends on NET_RANDOM_ETHADDR || RANDOM_UUID || CMD_UUID || \ | 153 | depends on NET_RANDOM_ETHADDR || RANDOM_UUID || CMD_UUID || \ |
154 | RNG_SANDBOX || UT_LIB && AES | 154 | RNG_SANDBOX || UT_LIB && AES |
155 | default LIB_RAND | 155 | default LIB_RAND |
156 | help | 156 | help |
157 | Select the library to provide pseudo-random number generator | 157 | Select the library to provide pseudo-random number generator |
158 | functions. LIB_HW_RAND supports certain hardware engines that | 158 | functions. LIB_HW_RAND supports certain hardware engines that |
159 | provide this functionality. If in doubt, select LIB_RAND. | 159 | provide this functionality. If in doubt, select LIB_RAND. |
160 | 160 | ||
161 | config LIB_RAND | 161 | config LIB_RAND |
162 | bool "Pseudo-random library support" | 162 | bool "Pseudo-random library support" |
163 | 163 | ||
164 | config LIB_HW_RAND | 164 | config LIB_HW_RAND |
165 | bool "HW Engine for random libray support" | 165 | bool "HW Engine for random libray support" |
166 | 166 | ||
167 | endchoice | 167 | endchoice |
168 | 168 | ||
169 | config SPL_TINY_MEMSET | 169 | config SPL_TINY_MEMSET |
170 | bool "Use a very small memset() in SPL" | 170 | bool "Use a very small memset() in SPL" |
171 | help | 171 | help |
172 | The faster memset() is the arch-specific one (if available) enabled | 172 | The faster memset() is the arch-specific one (if available) enabled |
173 | by CONFIG_USE_ARCH_MEMSET. If that is not enabled, we can still get | 173 | by CONFIG_USE_ARCH_MEMSET. If that is not enabled, we can still get |
174 | better performance by writing a word at a time. But in very | 174 | better performance by writing a word at a time. But in very |
175 | size-constrained environments even this may be too big. Enable this | 175 | size-constrained environments even this may be too big. Enable this |
176 | option to reduce code size slightly at the cost of some speed. | 176 | option to reduce code size slightly at the cost of some speed. |
177 | 177 | ||
178 | config TPL_TINY_MEMSET | 178 | config TPL_TINY_MEMSET |
179 | bool "Use a very small memset() in TPL" | 179 | bool "Use a very small memset() in TPL" |
180 | help | 180 | help |
181 | The faster memset() is the arch-specific one (if available) enabled | 181 | The faster memset() is the arch-specific one (if available) enabled |
182 | by CONFIG_USE_ARCH_MEMSET. If that is not enabled, we can still get | 182 | by CONFIG_USE_ARCH_MEMSET. If that is not enabled, we can still get |
183 | better performance by writing a word at a time. But in very | 183 | better performance by writing a word at a time. But in very |
184 | size-constrained environments even this may be too big. Enable this | 184 | size-constrained environments even this may be too big. Enable this |
185 | option to reduce code size slightly at the cost of some speed. | 185 | option to reduce code size slightly at the cost of some speed. |
186 | 186 | ||
187 | config RBTREE | 187 | config RBTREE |
188 | bool | 188 | bool |
189 | 189 | ||
190 | config BITREVERSE | 190 | config BITREVERSE |
191 | bool "Bit reverse library from Linux" | 191 | bool "Bit reverse library from Linux" |
192 | 192 | ||
193 | config TRACE | 193 | config TRACE |
194 | bool "Support for tracing of function calls and timing" | 194 | bool "Support for tracing of function calls and timing" |
195 | imply CMD_TRACE | 195 | imply CMD_TRACE |
196 | help | 196 | help |
197 | Enables function tracing within U-Boot. This allows recording of call | 197 | Enables function tracing within U-Boot. This allows recording of call |
198 | traces including timing information. The command can write data to | 198 | traces including timing information. The command can write data to |
199 | memory for exporting for analysis (e.g. using bootchart). | 199 | memory for exporting for analysis (e.g. using bootchart). |
200 | See doc/README.trace for full details. | 200 | See doc/README.trace for full details. |
201 | 201 | ||
202 | config TRACE_BUFFER_SIZE | 202 | config TRACE_BUFFER_SIZE |
203 | hex "Size of trace buffer in U-Boot" | 203 | hex "Size of trace buffer in U-Boot" |
204 | depends on TRACE | 204 | depends on TRACE |
205 | default 0x01000000 | 205 | default 0x01000000 |
206 | help | 206 | help |
207 | Sets the size of the trace buffer in U-Boot. This is allocated from | 207 | Sets the size of the trace buffer in U-Boot. This is allocated from |
208 | memory during relocation. If this buffer is too small, the trace | 208 | memory during relocation. If this buffer is too small, the trace |
209 | history will be truncated, with later records omitted. | 209 | history will be truncated, with later records omitted. |
210 | 210 | ||
211 | If early trace is enabled (i.e. before relocation), this buffer must | 211 | If early trace is enabled (i.e. before relocation), this buffer must |
212 | be large enough to include all the data from the early trace buffer as | 212 | be large enough to include all the data from the early trace buffer as |
213 | well, since this is copied over to the main buffer during relocation. | 213 | well, since this is copied over to the main buffer during relocation. |
214 | 214 | ||
215 | A trace record is emitted for each function call and each record is | 215 | A trace record is emitted for each function call and each record is |
216 | 12 bytes (see struct trace_call). A suggested minimum size is 1MB. If | 216 | 12 bytes (see struct trace_call). A suggested minimum size is 1MB. If |
217 | the size is too small then 'trace stats' will show a message saying | 217 | the size is too small then 'trace stats' will show a message saying |
218 | how many records were dropped due to buffer overflow. | 218 | how many records were dropped due to buffer overflow. |
219 | 219 | ||
220 | config TRACE_CALL_DEPTH_LIMIT | 220 | config TRACE_CALL_DEPTH_LIMIT |
221 | int "Trace call depth limit" | 221 | int "Trace call depth limit" |
222 | depends on TRACE | 222 | depends on TRACE |
223 | default 15 | 223 | default 15 |
224 | help | 224 | help |
225 | Sets the maximum call depth up to which function calls are recorded. | 225 | Sets the maximum call depth up to which function calls are recorded. |
226 | 226 | ||
227 | config TRACE_EARLY | 227 | config TRACE_EARLY |
228 | bool "Enable tracing before relocation" | 228 | bool "Enable tracing before relocation" |
229 | depends on TRACE | 229 | depends on TRACE |
230 | help | 230 | help |
231 | Sometimes it is helpful to trace execution of U-Boot before | 231 | Sometimes it is helpful to trace execution of U-Boot before |
232 | relocation. This is possible by using a arch-specific, fixed buffer | 232 | relocation. This is possible by using a arch-specific, fixed buffer |
233 | position in memory. Enable this option to start tracing as early as | 233 | position in memory. Enable this option to start tracing as early as |
234 | possible after U-Boot starts. | 234 | possible after U-Boot starts. |
235 | 235 | ||
236 | config TRACE_EARLY_SIZE | 236 | config TRACE_EARLY_SIZE |
237 | hex "Size of early trace buffer in U-Boot" | 237 | hex "Size of early trace buffer in U-Boot" |
238 | depends on TRACE_EARLY | 238 | depends on TRACE_EARLY |
239 | default 0x00100000 | 239 | default 0x00100000 |
240 | help | 240 | help |
241 | Sets the size of the early trace buffer in bytes. This is used to hold | 241 | Sets the size of the early trace buffer in bytes. This is used to hold |
242 | tracing information before relocation. | 242 | tracing information before relocation. |
243 | 243 | ||
244 | config TRACE_EARLY_CALL_DEPTH_LIMIT | 244 | config TRACE_EARLY_CALL_DEPTH_LIMIT |
245 | int "Early trace call depth limit" | 245 | int "Early trace call depth limit" |
246 | depends on TRACE_EARLY | 246 | depends on TRACE_EARLY |
247 | default 200 | 247 | default 200 |
248 | help | 248 | help |
249 | Sets the maximum call depth up to which function calls are recorded | 249 | Sets the maximum call depth up to which function calls are recorded |
250 | during early tracing. | 250 | during early tracing. |
251 | 251 | ||
252 | config TRACE_EARLY_ADDR | 252 | config TRACE_EARLY_ADDR |
253 | hex "Address of early trace buffer in U-Boot" | 253 | hex "Address of early trace buffer in U-Boot" |
254 | depends on TRACE_EARLY | 254 | depends on TRACE_EARLY |
255 | default 0x00100000 | 255 | default 0x00100000 |
256 | help | 256 | help |
257 | Sets the address of the early trace buffer in U-Boot. This memory | 257 | Sets the address of the early trace buffer in U-Boot. This memory |
258 | must be accessible before relocation. | 258 | must be accessible before relocation. |
259 | 259 | ||
260 | A trace record is emitted for each function call and each record is | 260 | A trace record is emitted for each function call and each record is |
261 | 12 bytes (see struct trace_call). A suggested minimum size is 1MB. If | 261 | 12 bytes (see struct trace_call). A suggested minimum size is 1MB. If |
262 | the size is too small then the message which says the amount of early | 262 | the size is too small then the message which says the amount of early |
263 | data being coped will the the same as the | 263 | data being coped will the the same as the |
264 | 264 | ||
265 | source lib/dhry/Kconfig | 265 | source lib/dhry/Kconfig |
266 | 266 | ||
267 | menu "Security support" | 267 | menu "Security support" |
268 | 268 | ||
269 | config AES | 269 | config AES |
270 | bool "Support the AES algorithm" | 270 | bool "Support the AES algorithm" |
271 | help | 271 | help |
272 | This provides a means to encrypt and decrypt data using the AES | 272 | This provides a means to encrypt and decrypt data using the AES |
273 | (Advanced Encryption Standard). This algorithm uses a symetric key | 273 | (Advanced Encryption Standard). This algorithm uses a symetric key |
274 | and is widely used as a streaming cipher. Different key lengths are | 274 | and is widely used as a streaming cipher. Different key lengths are |
275 | supported by the algorithm but only a 128-bit key is supported at | 275 | supported by the algorithm but only a 128-bit key is supported at |
276 | present. | 276 | present. |
277 | 277 | ||
278 | source lib/rsa/Kconfig | 278 | source lib/rsa/Kconfig |
279 | source lib/crypto/Kconfig | 279 | source lib/crypto/Kconfig |
280 | 280 | ||
281 | config TPM | 281 | config TPM |
282 | bool "Trusted Platform Module (TPM) Support" | 282 | bool "Trusted Platform Module (TPM) Support" |
283 | depends on DM | 283 | depends on DM |
284 | help | 284 | help |
285 | This enables support for TPMs which can be used to provide security | 285 | This enables support for TPMs which can be used to provide security |
286 | features for your board. The TPM can be connected via LPC or I2C | 286 | features for your board. The TPM can be connected via LPC or I2C |
287 | and a sandbox TPM is provided for testing purposes. Use the 'tpm' | 287 | and a sandbox TPM is provided for testing purposes. Use the 'tpm' |
288 | command to interactive the TPM. Driver model support is provided | 288 | command to interactive the TPM. Driver model support is provided |
289 | for the low-level TPM interface, but only one TPM is supported at | 289 | for the low-level TPM interface, but only one TPM is supported at |
290 | a time by the TPM library. | 290 | a time by the TPM library. |
291 | 291 | ||
292 | config SPL_TPM | 292 | config SPL_TPM |
293 | bool "Trusted Platform Module (TPM) Support in SPL" | 293 | bool "Trusted Platform Module (TPM) Support in SPL" |
294 | depends on SPL_DM | 294 | depends on SPL_DM |
295 | help | 295 | help |
296 | This enables support for TPMs which can be used to provide security | 296 | This enables support for TPMs which can be used to provide security |
297 | features for your board. The TPM can be connected via LPC or I2C | 297 | features for your board. The TPM can be connected via LPC or I2C |
298 | and a sandbox TPM is provided for testing purposes. Use the 'tpm' | 298 | and a sandbox TPM is provided for testing purposes. Use the 'tpm' |
299 | command to interactive the TPM. Driver model support is provided | 299 | command to interactive the TPM. Driver model support is provided |
300 | for the low-level TPM interface, but only one TPM is supported at | 300 | for the low-level TPM interface, but only one TPM is supported at |
301 | a time by the TPM library. | 301 | a time by the TPM library. |
302 | 302 | ||
303 | config TPL_TPM | 303 | config TPL_TPM |
304 | bool "Trusted Platform Module (TPM) Support in TPL" | 304 | bool "Trusted Platform Module (TPM) Support in TPL" |
305 | depends on TPL_DM | 305 | depends on TPL_DM |
306 | help | 306 | help |
307 | This enables support for TPMs which can be used to provide security | 307 | This enables support for TPMs which can be used to provide security |
308 | features for your board. The TPM can be connected via LPC or I2C | 308 | features for your board. The TPM can be connected via LPC or I2C |
309 | and a sandbox TPM is provided for testing purposes. Use the 'tpm' | 309 | and a sandbox TPM is provided for testing purposes. Use the 'tpm' |
310 | command to interactive the TPM. Driver model support is provided | 310 | command to interactive the TPM. Driver model support is provided |
311 | for the low-level TPM interface, but only one TPM is supported at | 311 | for the low-level TPM interface, but only one TPM is supported at |
312 | a time by the TPM library. | 312 | a time by the TPM library. |
313 | 313 | ||
314 | endmenu | 314 | endmenu |
315 | 315 | ||
316 | menu "Android Verified Boot" | 316 | menu "Android Verified Boot" |
317 | 317 | ||
318 | config LIBAVB | 318 | config LIBAVB |
319 | bool "Android Verified Boot 2.0 support" | 319 | bool "Android Verified Boot 2.0 support" |
320 | depends on ANDROID_BOOT_IMAGE | 320 | depends on ANDROID_BOOT_IMAGE |
321 | default n | 321 | default n |
322 | help | 322 | help |
323 | This enables support of Android Verified Boot 2.0 which can be used | 323 | This enables support of Android Verified Boot 2.0 which can be used |
324 | to assure the end user of the integrity of the software running on a | 324 | to assure the end user of the integrity of the software running on a |
325 | device. Introduces such features as boot chain of trust, rollback | 325 | device. Introduces such features as boot chain of trust, rollback |
326 | protection etc. | 326 | protection etc. |
327 | 327 | ||
328 | config AVB_SUPPORT | 328 | config AVB_SUPPORT |
329 | bool "Enable Android AVB lib support" | 329 | bool "Enable Android AVB lib support" |
330 | select LIBAVB | 330 | select LIBAVB |
331 | 331 | ||
332 | config AVB_ATX | 332 | config AVB_ATX |
333 | bool "Enable AVB_ATX support" | 333 | bool "Enable AVB_ATX support" |
334 | depends on AVB_SUPPORT | 334 | depends on AVB_SUPPORT |
335 | 335 | ||
336 | config AVB_WARNING_LOGO | ||
337 | bool "Enable avb warning show logo on screen" | ||
338 | help | ||
339 | Enable avb warning show logo on screen | ||
340 | |||
341 | config AVB_WARNING_LOGO_COLS | ||
342 | hex "x resolution on the screen" | ||
343 | default 0x1E0 | ||
344 | depends on AVB_WARNING_LOGO | ||
345 | help | ||
346 | The x resolution on the screen. | ||
347 | |||
348 | config AVB_WARNING_LOGO_ROWS | ||
349 | hex "y resolution on the screen" | ||
350 | default 0x60 | ||
351 | depends on AVB_WARNING_LOGO | ||
352 | help | ||
353 | The y resolution on the screen. | ||
354 | |||
355 | config AVB_WARNING_TIME_LAST | ||
356 | hex "the time of avb warning logo will last" | ||
357 | default 0x3 | ||
358 | help | ||
359 | The time of avb warning logo will last (s). | ||
360 | |||
336 | config APPEND_BOOTARGS | 361 | config APPEND_BOOTARGS |
337 | bool "Append bootargs support" | 362 | bool "Append bootargs support" |
338 | 363 | ||
339 | config DUAL_BOOTLOADER | 364 | config DUAL_BOOTLOADER |
340 | bool "Enable dual bootloader support" | 365 | bool "Enable dual bootloader support" |
341 | help | 366 | help |
342 | Enable A/B bootloader select in SPL. | 367 | Enable A/B bootloader select in SPL. |
343 | 368 | ||
344 | config AT_AUTHENTICATE_UNLOCK | 369 | config AT_AUTHENTICATE_UNLOCK |
345 | bool "Enable authenticate unlock for Android Things devices" | 370 | bool "Enable authenticate unlock for Android Things devices" |
346 | 371 | ||
347 | config SECURE_UNLOCK | 372 | config SECURE_UNLOCK |
348 | bool "Enable secure unlock for Android devices, it can only be enabled on HAB closed board" | 373 | bool "Enable secure unlock for Android devices, it can only be enabled on HAB closed board" |
349 | 374 | ||
350 | config TRUSTY_UNLOCK_PERMISSION | 375 | config TRUSTY_UNLOCK_PERMISSION |
351 | bool "Support unlock permission protection in trusty" | 376 | bool "Support unlock permission protection in trusty" |
352 | depends on IMX_TRUSTY_OS | 377 | depends on IMX_TRUSTY_OS |
353 | 378 | ||
354 | endmenu | 379 | endmenu |
355 | 380 | ||
356 | menu "Hashing Support" | 381 | menu "Hashing Support" |
357 | 382 | ||
358 | config SHA1 | 383 | config SHA1 |
359 | bool "Enable SHA1 support" | 384 | bool "Enable SHA1 support" |
360 | help | 385 | help |
361 | This option enables support of hashing using SHA1 algorithm. | 386 | This option enables support of hashing using SHA1 algorithm. |
362 | The hash is calculated in software. | 387 | The hash is calculated in software. |
363 | The SHA1 algorithm produces a 160-bit (20-byte) hash value | 388 | The SHA1 algorithm produces a 160-bit (20-byte) hash value |
364 | (digest). | 389 | (digest). |
365 | 390 | ||
366 | config SHA256 | 391 | config SHA256 |
367 | bool "Enable SHA256 support" | 392 | bool "Enable SHA256 support" |
368 | help | 393 | help |
369 | This option enables support of hashing using SHA256 algorithm. | 394 | This option enables support of hashing using SHA256 algorithm. |
370 | The hash is calculated in software. | 395 | The hash is calculated in software. |
371 | The SHA256 algorithm produces a 256-bit (32-byte) hash value | 396 | The SHA256 algorithm produces a 256-bit (32-byte) hash value |
372 | (digest). | 397 | (digest). |
373 | 398 | ||
374 | config SHA_HW_ACCEL | 399 | config SHA_HW_ACCEL |
375 | bool "Enable hashing using hardware" | 400 | bool "Enable hashing using hardware" |
376 | help | 401 | help |
377 | This option enables hardware acceleration | 402 | This option enables hardware acceleration |
378 | for SHA1/SHA256 hashing. | 403 | for SHA1/SHA256 hashing. |
379 | This affects the 'hash' command and also the | 404 | This affects the 'hash' command and also the |
380 | hash_lookup_algo() function. | 405 | hash_lookup_algo() function. |
381 | 406 | ||
382 | config SHA_PROG_HW_ACCEL | 407 | config SHA_PROG_HW_ACCEL |
383 | bool "Enable Progressive hashing support using hardware" | 408 | bool "Enable Progressive hashing support using hardware" |
384 | depends on SHA_HW_ACCEL | 409 | depends on SHA_HW_ACCEL |
385 | help | 410 | help |
386 | This option enables hardware-acceleration for | 411 | This option enables hardware-acceleration for |
387 | SHA1/SHA256 progressive hashing. | 412 | SHA1/SHA256 progressive hashing. |
388 | Data can be streamed in a block at a time and the hashing | 413 | Data can be streamed in a block at a time and the hashing |
389 | is performed in hardware. | 414 | is performed in hardware. |
390 | 415 | ||
391 | config MD5 | 416 | config MD5 |
392 | bool | 417 | bool |
393 | 418 | ||
394 | config CRC32C | 419 | config CRC32C |
395 | bool | 420 | bool |
396 | 421 | ||
397 | config XXHASH | 422 | config XXHASH |
398 | bool | 423 | bool |
399 | 424 | ||
400 | endmenu | 425 | endmenu |
401 | 426 | ||
402 | menu "Compression Support" | 427 | menu "Compression Support" |
403 | 428 | ||
404 | config LZ4 | 429 | config LZ4 |
405 | bool "Enable LZ4 decompression support" | 430 | bool "Enable LZ4 decompression support" |
406 | help | 431 | help |
407 | If this option is set, support for LZ4 compressed images | 432 | If this option is set, support for LZ4 compressed images |
408 | is included. The LZ4 algorithm can run in-place as long as the | 433 | is included. The LZ4 algorithm can run in-place as long as the |
409 | compressed image is loaded to the end of the output buffer, and | 434 | compressed image is loaded to the end of the output buffer, and |
410 | trades lower compression ratios for much faster decompression. | 435 | trades lower compression ratios for much faster decompression. |
411 | 436 | ||
412 | NOTE: This implements the release version of the LZ4 frame | 437 | NOTE: This implements the release version of the LZ4 frame |
413 | format as generated by default by the 'lz4' command line tool. | 438 | format as generated by default by the 'lz4' command line tool. |
414 | This is not the same as the outdated, less efficient legacy | 439 | This is not the same as the outdated, less efficient legacy |
415 | frame format currently (2015) implemented in the Linux kernel | 440 | frame format currently (2015) implemented in the Linux kernel |
416 | (generated by 'lz4 -l'). The two formats are incompatible. | 441 | (generated by 'lz4 -l'). The two formats are incompatible. |
417 | 442 | ||
418 | config LZMA | 443 | config LZMA |
419 | bool "Enable LZMA decompression support" | 444 | bool "Enable LZMA decompression support" |
420 | help | 445 | help |
421 | This enables support for LZMA (Lempel-Ziv-Markov chain algorithm), | 446 | This enables support for LZMA (Lempel-Ziv-Markov chain algorithm), |
422 | a dictionary compression algorithm that provides a high compression | 447 | a dictionary compression algorithm that provides a high compression |
423 | ratio and fairly fast decompression speed. See also | 448 | ratio and fairly fast decompression speed. See also |
424 | CONFIG_CMD_LZMADEC which provides a decode command. | 449 | CONFIG_CMD_LZMADEC which provides a decode command. |
425 | 450 | ||
426 | config LZO | 451 | config LZO |
427 | bool "Enable LZO decompression support" | 452 | bool "Enable LZO decompression support" |
428 | help | 453 | help |
429 | This enables support for LZO compression algorithm.r | 454 | This enables support for LZO compression algorithm.r |
430 | 455 | ||
431 | config GZIP | 456 | config GZIP |
432 | bool "Enable gzip decompression support" | 457 | bool "Enable gzip decompression support" |
433 | select ZLIB | 458 | select ZLIB |
434 | default y | 459 | default y |
435 | help | 460 | help |
436 | This enables support for GZIP compression algorithm. | 461 | This enables support for GZIP compression algorithm. |
437 | 462 | ||
438 | config ZLIB | 463 | config ZLIB |
439 | bool | 464 | bool |
440 | default y | 465 | default y |
441 | help | 466 | help |
442 | This enables ZLIB compression lib. | 467 | This enables ZLIB compression lib. |
443 | 468 | ||
444 | config ZSTD | 469 | config ZSTD |
445 | bool "Enable Zstandard decompression support" | 470 | bool "Enable Zstandard decompression support" |
446 | select XXHASH | 471 | select XXHASH |
447 | help | 472 | help |
448 | This enables Zstandard decompression library. | 473 | This enables Zstandard decompression library. |
449 | 474 | ||
450 | config SPL_LZ4 | 475 | config SPL_LZ4 |
451 | bool "Enable LZ4 decompression support in SPL" | 476 | bool "Enable LZ4 decompression support in SPL" |
452 | help | 477 | help |
453 | This enables support for tge LZ4 decompression algorithm in SPL. LZ4 | 478 | This enables support for tge LZ4 decompression algorithm in SPL. LZ4 |
454 | is a lossless data compression algorithm that is focused on | 479 | is a lossless data compression algorithm that is focused on |
455 | fast compression and decompression speed. It belongs to the LZ77 | 480 | fast compression and decompression speed. It belongs to the LZ77 |
456 | family of byte-oriented compression schemes. | 481 | family of byte-oriented compression schemes. |
457 | 482 | ||
458 | config SPL_LZO | 483 | config SPL_LZO |
459 | bool "Enable LZO decompression support in SPL" | 484 | bool "Enable LZO decompression support in SPL" |
460 | help | 485 | help |
461 | This enables support for LZO compression algorithm in the SPL. | 486 | This enables support for LZO compression algorithm in the SPL. |
462 | 487 | ||
463 | config SPL_GZIP | 488 | config SPL_GZIP |
464 | bool "Enable gzip decompression support for SPL build" | 489 | bool "Enable gzip decompression support for SPL build" |
465 | select SPL_ZLIB | 490 | select SPL_ZLIB |
466 | help | 491 | help |
467 | This enables support for GZIP compression altorithm for SPL boot. | 492 | This enables support for GZIP compression altorithm for SPL boot. |
468 | 493 | ||
469 | config SPL_ZLIB | 494 | config SPL_ZLIB |
470 | bool | 495 | bool |
471 | help | 496 | help |
472 | This enables compression lib for SPL boot. | 497 | This enables compression lib for SPL boot. |
473 | 498 | ||
474 | config SPL_ZSTD | 499 | config SPL_ZSTD |
475 | bool "Enable Zstandard decompression support in SPL" | 500 | bool "Enable Zstandard decompression support in SPL" |
476 | select XXHASH | 501 | select XXHASH |
477 | help | 502 | help |
478 | This enables Zstandard decompression library in the SPL. | 503 | This enables Zstandard decompression library in the SPL. |
479 | 504 | ||
480 | endmenu | 505 | endmenu |
481 | 506 | ||
482 | config ERRNO_STR | 507 | config ERRNO_STR |
483 | bool "Enable function for getting errno-related string message" | 508 | bool "Enable function for getting errno-related string message" |
484 | help | 509 | help |
485 | The function errno_str(int errno), returns a pointer to the errno | 510 | The function errno_str(int errno), returns a pointer to the errno |
486 | corresponding text message: | 511 | corresponding text message: |
487 | - if errno is null or positive number - a pointer to "Success" message | 512 | - if errno is null or positive number - a pointer to "Success" message |
488 | - if errno is negative - a pointer to errno related message | 513 | - if errno is negative - a pointer to errno related message |
489 | 514 | ||
490 | config HEXDUMP | 515 | config HEXDUMP |
491 | bool "Enable hexdump" | 516 | bool "Enable hexdump" |
492 | help | 517 | help |
493 | This enables functions for printing dumps of binary data. | 518 | This enables functions for printing dumps of binary data. |
494 | 519 | ||
495 | config OF_LIBFDT | 520 | config OF_LIBFDT |
496 | bool "Enable the FDT library" | 521 | bool "Enable the FDT library" |
497 | default y if OF_CONTROL | 522 | default y if OF_CONTROL |
498 | help | 523 | help |
499 | This enables the FDT library (libfdt). It provides functions for | 524 | This enables the FDT library (libfdt). It provides functions for |
500 | accessing binary device tree images in memory, such as adding and | 525 | accessing binary device tree images in memory, such as adding and |
501 | removing nodes and properties, scanning through the tree and finding | 526 | removing nodes and properties, scanning through the tree and finding |
502 | particular compatible nodes. The library operates on a flattened | 527 | particular compatible nodes. The library operates on a flattened |
503 | version of the device tree. | 528 | version of the device tree. |
504 | 529 | ||
505 | config OF_LIBFDT_ASSUME_MASK | 530 | config OF_LIBFDT_ASSUME_MASK |
506 | hex "Mask of conditions to assume for libfdt" | 531 | hex "Mask of conditions to assume for libfdt" |
507 | depends on OF_LIBFDT || FIT | 532 | depends on OF_LIBFDT || FIT |
508 | default 0 | 533 | default 0 |
509 | help | 534 | help |
510 | Use this to change the assumptions made by libfdt about the | 535 | Use this to change the assumptions made by libfdt about the |
511 | device tree it is working with. A value of 0 means that no assumptions | 536 | device tree it is working with. A value of 0 means that no assumptions |
512 | are made, and libfdt is able to deal with malicious data. A value of | 537 | are made, and libfdt is able to deal with malicious data. A value of |
513 | 0xff means all assumptions are made and any invalid data may cause | 538 | 0xff means all assumptions are made and any invalid data may cause |
514 | unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h | 539 | unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h |
515 | 540 | ||
516 | config OF_LIBFDT_OVERLAY | 541 | config OF_LIBFDT_OVERLAY |
517 | bool "Enable the FDT library overlay support" | 542 | bool "Enable the FDT library overlay support" |
518 | depends on OF_LIBFDT | 543 | depends on OF_LIBFDT |
519 | default y if ARCH_OMAP2PLUS || ARCH_KEYSTONE | 544 | default y if ARCH_OMAP2PLUS || ARCH_KEYSTONE |
520 | help | 545 | help |
521 | This enables the FDT library (libfdt) overlay support. | 546 | This enables the FDT library (libfdt) overlay support. |
522 | 547 | ||
523 | config SPL_OF_LIBFDT | 548 | config SPL_OF_LIBFDT |
524 | bool "Enable the FDT library for SPL" | 549 | bool "Enable the FDT library for SPL" |
525 | default y if SPL_OF_CONTROL | 550 | default y if SPL_OF_CONTROL |
526 | help | 551 | help |
527 | This enables the FDT library (libfdt). It provides functions for | 552 | This enables the FDT library (libfdt). It provides functions for |
528 | accessing binary device tree images in memory, such as adding and | 553 | accessing binary device tree images in memory, such as adding and |
529 | removing nodes and properties, scanning through the tree and finding | 554 | removing nodes and properties, scanning through the tree and finding |
530 | particular compatible nodes. The library operates on a flattened | 555 | particular compatible nodes. The library operates on a flattened |
531 | version of the device tree. | 556 | version of the device tree. |
532 | 557 | ||
533 | config SPL_OF_LIBFDT_ASSUME_MASK | 558 | config SPL_OF_LIBFDT_ASSUME_MASK |
534 | hex "Mask of conditions to assume for libfdt" | 559 | hex "Mask of conditions to assume for libfdt" |
535 | depends on SPL_OF_LIBFDT || FIT | 560 | depends on SPL_OF_LIBFDT || FIT |
536 | default 0xff | 561 | default 0xff |
537 | help | 562 | help |
538 | Use this to change the assumptions made by libfdt in SPL about the | 563 | Use this to change the assumptions made by libfdt in SPL about the |
539 | device tree it is working with. A value of 0 means that no assumptions | 564 | device tree it is working with. A value of 0 means that no assumptions |
540 | are made, and libfdt is able to deal with malicious data. A value of | 565 | are made, and libfdt is able to deal with malicious data. A value of |
541 | 0xff means all assumptions are made and any invalid data may cause | 566 | 0xff means all assumptions are made and any invalid data may cause |
542 | unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h | 567 | unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h |
543 | 568 | ||
544 | config TPL_OF_LIBFDT | 569 | config TPL_OF_LIBFDT |
545 | bool "Enable the FDT library for TPL" | 570 | bool "Enable the FDT library for TPL" |
546 | default y if TPL_OF_CONTROL | 571 | default y if TPL_OF_CONTROL |
547 | help | 572 | help |
548 | This enables the FDT library (libfdt). It provides functions for | 573 | This enables the FDT library (libfdt). It provides functions for |
549 | accessing binary device tree images in memory, such as adding and | 574 | accessing binary device tree images in memory, such as adding and |
550 | removing nodes and properties, scanning through the tree and finding | 575 | removing nodes and properties, scanning through the tree and finding |
551 | particular compatible nodes. The library operates on a flattened | 576 | particular compatible nodes. The library operates on a flattened |
552 | version of the device tree. | 577 | version of the device tree. |
553 | 578 | ||
554 | config TPL_OF_LIBFDT_ASSUME_MASK | 579 | config TPL_OF_LIBFDT_ASSUME_MASK |
555 | hex "Mask of conditions to assume for libfdt" | 580 | hex "Mask of conditions to assume for libfdt" |
556 | depends on TPL_OF_LIBFDT || FIT | 581 | depends on TPL_OF_LIBFDT || FIT |
557 | default 0xff | 582 | default 0xff |
558 | help | 583 | help |
559 | Use this to change the assumptions made by libfdt in TPL about the | 584 | Use this to change the assumptions made by libfdt in TPL about the |
560 | device tree it is working with. A value of 0 means that no assumptions | 585 | device tree it is working with. A value of 0 means that no assumptions |
561 | are made, and libfdt is able to deal with malicious data. A value of | 586 | are made, and libfdt is able to deal with malicious data. A value of |
562 | 0xff means all assumptions are made and any invalid data may cause | 587 | 0xff means all assumptions are made and any invalid data may cause |
563 | unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h | 588 | unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h |
564 | 589 | ||
565 | config FDT_FIXUP_PARTITIONS | 590 | config FDT_FIXUP_PARTITIONS |
566 | bool "overwrite MTD partitions in DTS through defined in 'mtdparts'" | 591 | bool "overwrite MTD partitions in DTS through defined in 'mtdparts'" |
567 | depends on OF_LIBFDT | 592 | depends on OF_LIBFDT |
568 | depends on CMD_MTDPARTS | 593 | depends on CMD_MTDPARTS |
569 | help | 594 | help |
570 | Allow overwriting defined partitions in the device tree blob | 595 | Allow overwriting defined partitions in the device tree blob |
571 | using partition info defined in the 'mtdparts' environment | 596 | using partition info defined in the 'mtdparts' environment |
572 | variable. | 597 | variable. |
573 | 598 | ||
574 | menu "System tables" | 599 | menu "System tables" |
575 | depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER) | 600 | depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER) |
576 | 601 | ||
577 | config GENERATE_SMBIOS_TABLE | 602 | config GENERATE_SMBIOS_TABLE |
578 | bool "Generate an SMBIOS (System Management BIOS) table" | 603 | bool "Generate an SMBIOS (System Management BIOS) table" |
579 | default y | 604 | default y |
580 | depends on X86 || EFI_LOADER | 605 | depends on X86 || EFI_LOADER |
581 | help | 606 | help |
582 | The System Management BIOS (SMBIOS) specification addresses how | 607 | The System Management BIOS (SMBIOS) specification addresses how |
583 | motherboard and system vendors present management information about | 608 | motherboard and system vendors present management information about |
584 | their products in a standard format by extending the BIOS interface | 609 | their products in a standard format by extending the BIOS interface |
585 | on Intel architecture systems. | 610 | on Intel architecture systems. |
586 | 611 | ||
587 | Check http://www.dmtf.org/standards/smbios for details. | 612 | Check http://www.dmtf.org/standards/smbios for details. |
588 | 613 | ||
589 | config SMBIOS_MANUFACTURER | 614 | config SMBIOS_MANUFACTURER |
590 | string "SMBIOS Manufacturer" | 615 | string "SMBIOS Manufacturer" |
591 | depends on GENERATE_SMBIOS_TABLE | 616 | depends on GENERATE_SMBIOS_TABLE |
592 | default SYS_VENDOR | 617 | default SYS_VENDOR |
593 | help | 618 | help |
594 | The board manufacturer to store in SMBIOS structures. | 619 | The board manufacturer to store in SMBIOS structures. |
595 | Change this to override the default one (CONFIG_SYS_VENDOR). | 620 | Change this to override the default one (CONFIG_SYS_VENDOR). |
596 | 621 | ||
597 | config SMBIOS_PRODUCT_NAME | 622 | config SMBIOS_PRODUCT_NAME |
598 | string "SMBIOS Product Name" | 623 | string "SMBIOS Product Name" |
599 | depends on GENERATE_SMBIOS_TABLE | 624 | depends on GENERATE_SMBIOS_TABLE |
600 | default SYS_BOARD | 625 | default SYS_BOARD |
601 | help | 626 | help |
602 | The product name to store in SMBIOS structures. | 627 | The product name to store in SMBIOS structures. |
603 | Change this to override the default one (CONFIG_SYS_BOARD). | 628 | Change this to override the default one (CONFIG_SYS_BOARD). |
604 | 629 | ||
605 | endmenu | 630 | endmenu |
606 | 631 | ||
607 | config ASN1_COMPILER | 632 | config ASN1_COMPILER |
608 | bool | 633 | bool |
609 | 634 | ||
610 | config ASN1_DECODER | 635 | config ASN1_DECODER |
611 | bool | 636 | bool |
612 | help | 637 | help |
613 | Enable asn1 decoder library. | 638 | Enable asn1 decoder library. |
614 | 639 | ||
615 | config OID_REGISTRY | 640 | config OID_REGISTRY |
616 | bool | 641 | bool |
617 | help | 642 | help |
618 | Enable fast lookup object identifier registry. | 643 | Enable fast lookup object identifier registry. |
619 | 644 | ||
620 | source lib/efi/Kconfig | 645 | source lib/efi/Kconfig |
621 | source lib/efi_loader/Kconfig | 646 | source lib/efi_loader/Kconfig |
622 | source lib/optee/Kconfig | 647 | source lib/optee/Kconfig |
623 | 648 | ||
624 | config TEST_FDTDEC | 649 | config TEST_FDTDEC |
625 | bool "enable fdtdec test" | 650 | bool "enable fdtdec test" |
626 | depends on OF_LIBFDT | 651 | depends on OF_LIBFDT |
627 | 652 | ||
628 | config LIB_DATE | 653 | config LIB_DATE |
629 | bool | 654 | bool |
630 | 655 | ||
631 | endmenu | 656 | endmenu |
632 | 657 |
lib/avb/fsl/Makefile
1 | ifndef CONFIG_SPL_BUILD | 1 | ifndef CONFIG_SPL_BUILD |
2 | obj-y += fsl_avb.o | 2 | obj-y += fsl_avb.o |
3 | obj-y += fsl_bootctl.o | 3 | obj-y += fsl_bootctl.o |
4 | endif | 4 | endif |
5 | 5 | ||
6 | obj-y += fsl_avbkey.o | 6 | obj-y += fsl_avbkey.o |
7 | obj-y += utils.o | 7 | obj-y += utils.o |
8 | obj-y += fsl_avb_ab_flow.o | 8 | obj-y += fsl_avb_ab_flow.o |
9 | obj-$(CONFIG_AVB_ATX) += fsl_atx_attributes.o | 9 | obj-$(CONFIG_AVB_ATX) += fsl_atx_attributes.o |
10 | obj-$(CONFIG_AVB_WARNING_LOGO) += orange_warning_bmp_data.o | ||
10 | 11 |
lib/avb/fsl/orange_warning_bmp_data.c
File was created | 1 | // SPDX-License-Identifier: GPL-2.0+ | |
2 | /* | ||
3 | * Copyright NXP 2020 | ||
4 | * | ||
5 | */ | ||
6 | |||
7 | /* | ||
8 | * Note: The orange_warning_bmp_palette[] and orange_warning_bmp_bitmap | ||
9 | * data are generated by "tools/bmp_logo", command: | ||
10 | * "./bmp_logo --gen-bmp source.bmp > bmp_data.c" | ||
11 | * */ | ||
12 | |||
13 | #include "fsl_avb_logo.h" | ||
14 | |||
15 | unsigned short orange_warning_bmp_palette[] = { | ||
16 | 0x0000, 0x0233, 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, 0x02E7, | ||
17 | 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, | ||
18 | 0x02E7, 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, 0x02E7, 0x072E, | ||
19 | 0x0E72, 0x02E7, 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, 0x02E7, | ||
20 | 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, 0x02E7, 0x072E, 0x0E72, | ||
21 | 0x01E7, 0x0207, 0x0000, 0x02C6, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
22 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
23 | 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
24 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
25 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
26 | 0x072F, 0x0F72, 0x02F7, 0x030F, 0x0000, 0x0211, 0x072F, 0x0F72, | ||
27 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
28 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
29 | 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
30 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
31 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x000E, 0x0000, 0x0000, | ||
32 | 0x0824, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
33 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
34 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
35 | 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
36 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x00F8, 0x0002, | ||
37 | 0x0000, 0x0000, 0x0720, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
38 | 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
39 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
40 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
41 | 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
42 | 0x00D7, 0x0000, 0x0000, 0x0000, 0x0100, 0x0F82, 0x02F7, 0x072F, | ||
43 | 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, | ||
44 | 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, | ||
45 | 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, 0x0F72, 0x02F7, 0x072F, | ||
46 | |||
47 | }; | ||
48 | |||
49 | unsigned char orange_warning_bmp_bitmap[] = { | ||
50 | 0x42, 0x4D, 0xB6, 0x1F, 0x00, 0x00, 0x00, 0x00, | ||
51 | 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, | ||
52 | 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, | ||
53 | 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, | ||
54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x0E, | ||
55 | 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00, | ||
56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, | ||
57 | 0x05, 0x0C, 0x30, 0x34, 0x24, 0x7A, 0xE3, 0x25, | ||
58 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
59 | 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, | ||
60 | 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, | ||
61 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
62 | 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, | ||
63 | 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, | ||
64 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
65 | 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, | ||
66 | 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, | ||
67 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
68 | 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, | ||
69 | 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, | ||
70 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
71 | 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, | ||
72 | 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, | ||
73 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
74 | 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, | ||
75 | 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, | ||
76 | 0x7D, 0xEA, 0x25, 0x7D, 0xEA, 0x25, 0x7D, 0xEA, | ||
77 | 0x1B, 0x6C, 0x75, 0x0C, 0x2E, 0x33, 0x01, 0x05, | ||
78 | 0x06, 0x20, 0x6E, 0xC7, 0x27, 0x7F, 0xFF, 0x27, | ||
79 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
80 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
81 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
82 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
83 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
84 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
85 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
86 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
87 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
88 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
89 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
90 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
91 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
92 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
93 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
94 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
95 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
96 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
97 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
98 | 0x27, 0x80, 0xFE, 0x0E, 0x36, 0x3A, 0x00, 0x00, | ||
99 | 0x00, 0x06, 0x16, 0x18, 0x26, 0x7F, 0xF1, 0x27, | ||
100 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
101 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
102 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
103 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
104 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
105 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
106 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
107 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
108 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
109 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
110 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
111 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
112 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
113 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
114 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
115 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
116 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
117 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
118 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
119 | 0x25, 0x7B, 0xE6, 0x03, 0x0D, 0x0E, 0x00, 0x00, | ||
120 | 0x00, 0x01, 0x03, 0x03, 0x0F, 0x3E, 0x43, 0x27, | ||
121 | 0x80, 0xFE, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
122 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
123 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
124 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
125 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
126 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
127 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
128 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
129 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
130 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
131 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
132 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
133 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
134 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
135 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
136 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
137 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
138 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
139 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x80, 0xFD, | ||
140 | 0x0A, 0x26, 0x2A, 0x00, 0x01, 0x01, 0x00, 0x00, | ||
141 | 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x0D, 0x24, | ||
142 | 0x79, 0xDF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
143 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
144 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
145 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
146 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
147 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
148 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
149 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
150 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
151 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
152 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
153 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
154 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
155 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
156 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
157 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
158 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
159 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
160 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x22, 0x73, 0xD2, | ||
161 | 0x02, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, | ||
163 | 0x1E, 0x20, 0x27, 0x81, 0xFC, 0x27, 0x7F, 0xFF, | ||
164 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
165 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
166 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
167 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
168 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
169 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
170 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
171 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
172 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
173 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
174 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
175 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
176 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
177 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
178 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
179 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
180 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
181 | 0x7F, 0xFF, 0x27, 0x80, 0xF6, 0x07, 0x1D, 0x1F, | ||
182 | 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | ||
184 | 0x06, 0x06, 0x22, 0x73, 0xD3, 0x27, 0x7F, 0xFF, | ||
185 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
186 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
187 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
188 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
189 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
190 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
191 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
192 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
193 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
194 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
195 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
196 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
197 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
198 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
199 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
200 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
201 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
202 | 0x7F, 0xFF, 0x1D, 0x64, 0xB5, 0x01, 0x04, 0x04, | ||
203 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
204 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
205 | 0x00, 0x00, 0x08, 0x20, 0x23, 0x26, 0x80, 0xF3, | ||
206 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
207 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
208 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
209 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
210 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
211 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
212 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
213 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
214 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
215 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
216 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
217 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
218 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
219 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
220 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
221 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
222 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x26, | ||
223 | 0x80, 0xF2, 0x03, 0x0C, 0x0C, 0x00, 0x00, 0x00, | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
226 | 0x00, 0x00, 0x01, 0x06, 0x07, 0x11, 0x42, 0x47, | ||
227 | 0x27, 0x80, 0xFE, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
228 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
229 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
230 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
231 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
232 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
233 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
234 | 0xFF, 0x27, 0x7F, 0xFF, 0x1E, 0x67, 0xBA, 0x13, | ||
235 | 0x3E, 0x75, 0x12, 0x3E, 0x74, 0x13, 0x3F, 0x76, | ||
236 | 0x21, 0x70, 0xCD, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
237 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
238 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
239 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
240 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
241 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
242 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
243 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x80, 0xFD, 0x0C, | ||
244 | 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
247 | 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x16, 0x17, | ||
248 | 0x26, 0x7E, 0xEC, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
249 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
250 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
251 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
252 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
253 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
254 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
255 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
256 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
257 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
258 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
259 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
260 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
261 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
262 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
263 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
264 | 0xFF, 0x27, 0x7F, 0xFF, 0x24, 0x79, 0xE0, 0x03, | ||
265 | 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x05, | ||
269 | 0x0D, 0x34, 0x38, 0x27, 0x81, 0xFC, 0x27, 0x7F, | ||
270 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
271 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
272 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
273 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
274 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
275 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
276 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
277 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
278 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
279 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
280 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
281 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
282 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
283 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
284 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
285 | 0xFF, 0x27, 0x81, 0xFB, 0x09, 0x25, 0x28, 0x00, | ||
286 | 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
290 | 0x04, 0x0F, 0x10, 0x23, 0x77, 0xDA, 0x27, 0x7F, | ||
291 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
292 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
293 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
294 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
295 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
296 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
297 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
298 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
299 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
300 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
301 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
302 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
303 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
304 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
305 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
306 | 0xFF, 0x22, 0x74, 0xD4, 0x01, 0x05, 0x05, 0x00, | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
308 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
309 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
310 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
311 | 0x00, 0x00, 0x00, 0x06, 0x17, 0x19, 0x27, 0x81, | ||
312 | 0xFA, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
313 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
314 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
315 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
316 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
317 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
318 | 0xFF, 0x27, 0x7F, 0xFF, 0x25, 0x7B, 0xE5, 0x22, | ||
319 | 0x72, 0xCF, 0x22, 0x71, 0xCF, 0x22, 0x72, 0xCF, | ||
320 | 0x26, 0x7F, 0xF1, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
321 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
322 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
323 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
324 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
325 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
326 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x26, 0x7E, | ||
327 | 0xED, 0x05, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x14, 0x4F, | ||
333 | 0x56, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
334 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
335 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
336 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
337 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
338 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
339 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
340 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
341 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
342 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
343 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
344 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
345 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
346 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
347 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x0C, 0x30, | ||
348 | 0x34, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, | ||
349 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x19, | ||
354 | 0x1C, 0x26, 0x7F, 0xEF, 0x27, 0x7F, 0xFF, 0x27, | ||
355 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
356 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
357 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
358 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
359 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
360 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
361 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
362 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
363 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
364 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
365 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
366 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
367 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
368 | 0x27, 0x7F, 0xFF, 0x26, 0x7D, 0xEB, 0x02, 0x06, | ||
369 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, | ||
375 | 0x05, 0x0F, 0x3C, 0x42, 0x27, 0x80, 0xFE, 0x27, | ||
376 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
377 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
378 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
379 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
380 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
381 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
382 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
383 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
384 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
385 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
386 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
387 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
388 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
389 | 0x27, 0x80, 0xFD, 0x0B, 0x2A, 0x2E, 0x00, 0x00, | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
396 | 0x00, 0x04, 0x10, 0x12, 0x25, 0x7B, 0xE6, 0x27, | ||
397 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
398 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
399 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
400 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
401 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
402 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
403 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
404 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
405 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
406 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
407 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
408 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
409 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
410 | 0x22, 0x73, 0xD1, 0x01, 0x07, 0x08, 0x00, 0x00, | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
413 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
414 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
415 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
417 | 0x00, 0x00, 0x01, 0x01, 0x0A, 0x2A, 0x2D, 0x27, | ||
418 | 0x81, 0xFA, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
419 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
420 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
421 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
422 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
423 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x81, 0xFC, 0x27, | ||
424 | 0x81, 0xF7, 0x27, 0x81, 0xF7, 0x27, 0x81, 0xF7, | ||
425 | 0x27, 0x80, 0xFD, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
426 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
427 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
428 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
429 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
430 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x81, 0xF8, | ||
431 | 0x08, 0x21, 0x23, 0x00, 0x01, 0x01, 0x00, 0x00, | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
436 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0x08, 0x22, | ||
439 | 0x73, 0xD1, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
440 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
441 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
442 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
443 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
444 | 0xFF, 0x27, 0x7F, 0xFF, 0x12, 0x46, 0x4C, 0x07, | ||
445 | 0x1C, 0x1F, 0x07, 0x1B, 0x1E, 0x07, 0x1D, 0x1F, | ||
446 | 0x23, 0x75, 0xD6, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
447 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
448 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
449 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
450 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
451 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x12, 0x46, 0x4B, | ||
452 | 0x01, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
453 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
454 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
455 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
456 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
457 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
458 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
459 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, | ||
460 | 0x16, 0x18, 0x27, 0x81, 0xF9, 0x27, 0x7F, 0xFF, | ||
461 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
462 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
463 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
464 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
465 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x30, 0x35, 0x00, | ||
466 | 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, | ||
467 | 0x12, 0x45, 0x4B, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
468 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
469 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
470 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
471 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
472 | 0x7F, 0xFF, 0x26, 0x7F, 0xEF, 0x04, 0x10, 0x11, | ||
473 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
474 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
475 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
476 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
477 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
478 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
479 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
480 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | ||
481 | 0x02, 0x02, 0x10, 0x3F, 0x45, 0x27, 0x80, 0xFE, | ||
482 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
483 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
484 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
485 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
486 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
487 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
488 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
489 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
490 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
491 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
492 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
493 | 0x80, 0xFE, 0x0A, 0x26, 0x29, 0x00, 0x01, 0x02, | ||
494 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
495 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
496 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
497 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
498 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
499 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
500 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
501 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
502 | 0x00, 0x00, 0x04, 0x13, 0x15, 0x26, 0x7E, 0xEB, | ||
503 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
504 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
505 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
506 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
507 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
508 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
509 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
510 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
511 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
512 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
513 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x24, | ||
514 | 0x7B, 0xE3, 0x02, 0x08, 0x09, 0x00, 0x00, 0x00, | ||
515 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
516 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
517 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
518 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
519 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
520 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
521 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
522 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
523 | 0x00, 0x00, 0x01, 0x05, 0x05, 0x0D, 0x34, 0x38, | ||
524 | 0x27, 0x80, 0xFD, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
525 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
526 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
527 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
528 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
529 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
530 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
531 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
532 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
533 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
534 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x81, 0xFA, 0x0A, | ||
535 | 0x25, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
536 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
537 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
538 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
539 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
540 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
541 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
542 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
543 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
544 | 0x00, 0x00, 0x00, 0x01, 0x01, 0x04, 0x0F, 0x10, | ||
545 | 0x24, 0x7B, 0xE4, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
546 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
547 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
548 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
549 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
550 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
551 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
552 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
553 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
554 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
555 | 0xFF, 0x27, 0x7F, 0xFF, 0x22, 0x73, 0xD2, 0x02, | ||
556 | 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
557 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
558 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
559 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
560 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
561 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
562 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
563 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
564 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
565 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
566 | 0x08, 0x1F, 0x22, 0x27, 0x81, 0xF9, 0x27, 0x7F, | ||
567 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
568 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
569 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
570 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
571 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
572 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
573 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
574 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
575 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
576 | 0xFF, 0x26, 0x7F, 0xF2, 0x05, 0x13, 0x14, 0x00, | ||
577 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
578 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
579 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
580 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
581 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
582 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
583 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
584 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
585 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
586 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
587 | 0x01, 0x06, 0x06, 0x20, 0x6B, 0xC2, 0x27, 0x7F, | ||
588 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
589 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
590 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
591 | 0xFF, 0x27, 0x80, 0xFE, 0x0C, 0x2F, 0x34, 0x00, | ||
592 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
593 | 0x12, 0x45, 0x4A, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
594 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
595 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
596 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
597 | 0xFF, 0x0F, 0x3B, 0x40, 0x01, 0x04, 0x04, 0x00, | ||
598 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
599 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
600 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
601 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
602 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
603 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
604 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
605 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
606 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
607 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
608 | 0x00, 0x00, 0x00, 0x04, 0x11, 0x12, 0x26, 0x80, | ||
609 | 0xF2, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
610 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
611 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
612 | 0xFF, 0x27, 0x80, 0xFE, 0x0E, 0x3A, 0x3F, 0x03, | ||
613 | 0x0E, 0x0F, 0x03, 0x0D, 0x0E, 0x03, 0x0E, 0x0F, | ||
614 | 0x21, 0x71, 0xCE, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
615 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
616 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
617 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x24, 0x7A, | ||
618 | 0xE3, 0x04, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x00, | ||
619 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
620 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
621 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
622 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
623 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
624 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
625 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
626 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
627 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
628 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
629 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x3F, | ||
630 | 0x45, 0x27, 0x80, 0xFE, 0x27, 0x7F, 0xFF, 0x27, | ||
631 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
632 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
633 | 0xFF, 0x27, 0x7F, 0xFF, 0x26, 0x7F, 0xF0, 0x25, | ||
634 | 0x7B, 0xE4, 0x25, 0x7B, 0xE4, 0x25, 0x7B, 0xE4, | ||
635 | 0x27, 0x81, 0xF8, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
636 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
637 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
638 | 0x27, 0x7F, 0xFF, 0x27, 0x80, 0xFE, 0x09, 0x23, | ||
639 | 0x26, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
640 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
641 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
642 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
643 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
644 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
645 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
646 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
647 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
648 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
649 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
650 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, | ||
651 | 0x11, 0x25, 0x7B, 0xE4, 0x27, 0x7F, 0xFF, 0x27, | ||
652 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
653 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
654 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
655 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
656 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
657 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
658 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
659 | 0x27, 0x7F, 0xFF, 0x23, 0x75, 0xD6, 0x01, 0x02, | ||
660 | 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
661 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
662 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
663 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
664 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
665 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
666 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
667 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
668 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
669 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
670 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
671 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, | ||
672 | 0x03, 0x0B, 0x2B, 0x2E, 0x27, 0x81, 0xFB, 0x27, | ||
673 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
674 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
675 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
676 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
677 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
678 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
679 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
680 | 0x27, 0x81, 0xF7, 0x08, 0x20, 0x23, 0x00, 0x00, | ||
681 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
682 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
683 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
684 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
685 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
686 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
687 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
688 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
689 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
690 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
691 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
692 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
693 | 0x00, 0x03, 0x0C, 0x0C, 0x23, 0x76, 0xD9, 0x27, | ||
694 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
695 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
696 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
697 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
698 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
699 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
700 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
701 | 0x20, 0x6D, 0xC6, 0x01, 0x06, 0x07, 0x00, 0x00, | ||
702 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
703 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
704 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
705 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
706 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
707 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
708 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
709 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
710 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
711 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
712 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
713 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
714 | 0x00, 0x00, 0x01, 0x02, 0x09, 0x25, 0x29, 0x27, | ||
715 | 0x80, 0xF5, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
716 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
717 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
718 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
719 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
720 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
721 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x26, 0x80, 0xF2, | ||
722 | 0x04, 0x12, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
723 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
724 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
725 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
726 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
727 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
728 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
729 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
730 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
731 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
732 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
733 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
734 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
735 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x04, 0x0F, | ||
736 | 0x3D, 0x42, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
737 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
738 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
739 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
740 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
741 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
742 | 0x7F, 0xFF, 0x27, 0x80, 0xFD, 0x0D, 0x33, 0x37, | ||
743 | 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
744 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
745 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
746 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
747 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
748 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
749 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
750 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
751 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
752 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
753 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
754 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
755 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
756 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, | ||
757 | 0x0D, 0x0E, 0x26, 0x7F, 0xF1, 0x27, 0x7F, 0xFF, | ||
758 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
759 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
760 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
761 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
762 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
763 | 0x7F, 0xFF, 0x24, 0x7A, 0xE1, 0x03, 0x0D, 0x0E, | ||
764 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
765 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
766 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
767 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
768 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
769 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
770 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
771 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
772 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
773 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
774 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
775 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
776 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
777 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
778 | 0x02, 0x02, 0x0E, 0x38, 0x3C, 0x27, 0x80, 0xFC, | ||
779 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
780 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
781 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
782 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
783 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
784 | 0x80, 0xFD, 0x07, 0x1C, 0x1E, 0x00, 0x01, 0x01, | ||
785 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
786 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
787 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
788 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
789 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
790 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
791 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
792 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
793 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
794 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
795 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
796 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
797 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
798 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
799 | 0x00, 0x00, 0x04, 0x11, 0x12, 0x24, 0x79, 0xE0, | ||
800 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
801 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
802 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
803 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
804 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x23, | ||
805 | 0x77, 0xDA, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00, | ||
806 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
807 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
808 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
809 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
810 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
811 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
812 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
813 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
814 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
815 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
816 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
817 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
818 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
819 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
820 | 0x00, 0x00, 0x00, 0x02, 0x02, 0x0A, 0x27, 0x2A, | ||
821 | 0x27, 0x81, 0xF9, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
822 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
823 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
824 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
825 | 0xFF, 0x27, 0x7F, 0xFF, 0x26, 0x80, 0xF3, 0x06, | ||
826 | 0x16, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
827 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
828 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
829 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
830 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
831 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
832 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
833 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
834 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
835 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
836 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
837 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
838 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
839 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
840 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
841 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x08, | ||
842 | 0x22, 0x73, 0xD2, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
843 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
844 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
845 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
846 | 0xFF, 0x27, 0x7F, 0xFF, 0x10, 0x3F, 0x44, 0x01, | ||
847 | 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
848 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
849 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
850 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
851 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
852 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
853 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
854 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
855 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
856 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
857 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
858 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
859 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
860 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
861 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
862 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | ||
863 | 0x06, 0x19, 0x1B, 0x26, 0x7F, 0xF2, 0x27, 0x7F, | ||
864 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
865 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
866 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, | ||
867 | 0xFF, 0x26, 0x7E, 0xEC, 0x04, 0x10, 0x11, 0x00, | ||
868 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
869 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
870 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
871 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
872 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
873 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
874 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
875 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
876 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
877 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
878 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
879 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
880 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
881 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
882 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
883 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
884 | 0x01, 0x05, 0x05, 0x1E, 0x65, 0xB6, 0x27, 0x7F, | ||
885 | 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
886 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
887 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x80, | ||
888 | 0xFE, 0x0A, 0x2A, 0x2D, 0x00, 0x01, 0x01, 0x00, | ||
889 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
890 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
891 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
892 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
893 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
894 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
895 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
896 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
897 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
898 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
899 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
900 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
901 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
902 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
903 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
904 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
905 | 0x00, 0x00, 0x00, 0x03, 0x0B, 0x0D, 0x25, 0x7C, | ||
906 | 0xE7, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, | ||
907 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
908 | 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x22, 0x72, | ||
909 | 0xD0, 0x01, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, | ||
910 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
911 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
912 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
913 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
914 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
915 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
916 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
917 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
918 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
919 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
920 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
921 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
922 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
923 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
924 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
925 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
926 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0C, 0x2E, | ||
927 | 0x32, 0x27, 0x81, 0xFB, 0x27, 0x7F, 0xFF, 0x27, | ||
928 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
929 | 0x27, 0x7F, 0xFF, 0x27, 0x81, 0xFA, 0x06, 0x18, | ||
930 | 0x1B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
931 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
932 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
933 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
934 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
935 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
936 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
937 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
938 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
939 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
940 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
941 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
942 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
943 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
944 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
945 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
946 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
947 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0D, | ||
948 | 0x0E, 0x23, 0x75, 0xD7, 0x27, 0x7F, 0xFF, 0x27, | ||
949 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
950 | 0x27, 0x7F, 0xFF, 0x21, 0x6F, 0xCA, 0x01, 0x02, | ||
951 | 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
952 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
953 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
954 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
955 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
956 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
957 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
958 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
959 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
960 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
961 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
962 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
963 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
964 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
965 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
966 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
967 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
968 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, | ||
969 | 0x02, 0x09, 0x23, 0x26, 0x27, 0x81, 0xF7, 0x27, | ||
970 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x7F, 0xFF, | ||
971 | 0x26, 0x80, 0xF2, 0x05, 0x15, 0x16, 0x00, 0x00, | ||
972 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
973 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
974 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
975 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
976 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
977 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
978 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
979 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
980 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
981 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
982 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
983 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
984 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
985 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
986 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
987 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
988 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
989 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
990 | 0x00, 0x01, 0x07, 0x07, 0x11, 0x43, 0x48, 0x27, | ||
991 | 0x7F, 0xFF, 0x27, 0x7F, 0xFF, 0x27, 0x80, 0xFE, | ||
992 | 0x0D, 0x32, 0x36, 0x01, 0x02, 0x02, 0x00, 0x00, | ||
993 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
994 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
995 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
996 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
997 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
998 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
999 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1000 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1001 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1002 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1003 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1004 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1005 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1006 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1007 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1008 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1009 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1010 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1011 | 0x00, 0x00, 0x00, 0x00, 0x05, 0x13, 0x14, 0x26, | ||
1012 | 0x7E, 0xED, 0x27, 0x7F, 0xFF, 0x25, 0x7C, 0xE6, | ||
1013 | 0x04, 0x11, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1014 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1015 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1016 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1017 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1018 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1019 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1020 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1021 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1022 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1023 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1024 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1025 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1026 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1027 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1028 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1029 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1030 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1031 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1032 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0C, | ||
1033 | 0x2F, 0x32, 0x25, 0x7C, 0xE8, 0x0A, 0x27, 0x2B, | ||
1034 | 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1035 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1036 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1037 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1038 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1039 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1040 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1041 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1042 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1043 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1044 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1045 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1046 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1047 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1048 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1049 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1050 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1051 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1052 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1053 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, | ||
1054 | 0x08, 0x09, 0x05, 0x13, 0x14, 0x01, 0x04, 0x04, | ||
1055 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1056 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1057 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1058 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1059 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1060 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1061 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1062 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1063 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1064 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
1065 | }; | ||
1066 | |||
1067 |