Skip to content

Commit 7a56c6f

Browse files
committed
1 parent 69f0a12 commit 7a56c6f

File tree

10 files changed

+64
-105
lines changed

10 files changed

+64
-105
lines changed

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@
2424
url = https://github.com/arduino-libraries/Ethernet.git
2525
[submodule "tools/sdk/uzlib"]
2626
path = tools/sdk/uzlib
27-
url = https://github.com/earlephilhower/uzlib.git
27+
url = https://github.com/pfalcon/uzlib.git

bootloaders/eboot/Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ APP_FW := eboot.bin
4040

4141
all: $(APP_OUT)
4242

43-
tinflate.o: $(UZLIB_PATH)/tinflate.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h
43+
tinflate.o: $(UZLIB_PATH)/tinflate.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h Makefile
4444
$(CC) $(CFLAGS) -c -o tinflate.o $(UZLIB_PATH)/tinflate.c
4545

46-
tinfgzip.o: $(UZLIB_PATH)/tinfgzip.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h
46+
tinfgzip.o: $(UZLIB_PATH)/tinfgzip.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h Makefile
4747
$(CC) $(CFLAGS) -c -o tinfgzip.o $(UZLIB_PATH)/tinfgzip.c
4848

49-
$(APP_AR): $(TARGET_OBJ_PATHS) tinflate.o tinfgzip.o
49+
$(APP_AR): $(TARGET_OBJ_PATHS) tinflate.o tinfgzip.o Makefile
5050
$(AR) cru $@ $^
5151

5252
$(APP_OUT): $(APP_AR) eboot.ld | Makefile
53-
$(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group -Wl,--whole-archive $(APP_AR) -Wl,--end-group -o $@
53+
$(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group -Wl,--sort-common $(APP_AR) -Wl,--end-group -o $@
5454

5555
clean:
5656
rm -f *.o

bootloaders/eboot/eboot.c

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,19 @@
1414
#include "eboot_command.h"
1515
#include <uzlib.h>
1616

17-
extern unsigned char _gzip_dict;
1817

1918
#define SWRST do { (*((volatile uint32_t*) 0x60000700)) |= 0x80000000; } while(0);
2019

2120
extern void ets_wdt_enable(void);
2221
extern void ets_wdt_disable(void);
2322

24-
// Converts bit of a string into a uint32
25-
#define S(a,b,c,d) ( (((uint32_t)a) & 0xff) | (((uint32_t)b) << 8) | (((uint32_t)c) << 16) | (((uint32_t)d)<<24) )
26-
2723
int print_version(const uint32_t flash_addr)
2824
{
2925
uint32_t ver;
3026
if (SPIRead(flash_addr + APP_START_OFFSET + sizeof(image_header_t) + sizeof(section_header_t), &ver, sizeof(ver))) {
3127
return 1;
3228
}
33-
// We don't have BSS and can't print from flash, so build up string
34-
// 4 chars at a time. Smaller code than byte-wise assignment.
35-
uint32_t fmt[2];
36-
fmt[0] = S('v', '%', '0', '8');
37-
fmt[1] = S('x', '\n', 0, 0);
38-
ets_printf((const char*) fmt, ver);
29+
ets_printf("v%08x\n", ver);
3930
return 0;
4031
}
4132

@@ -222,6 +213,16 @@ int main()
222213
bool clear_cmd = false;
223214
struct eboot_command cmd;
224215

216+
// BSS init commented out for now to save space. If any static variables set
217+
// to 0 are used, need to uncomment it or else the BSS will not be cleared and
218+
// the static vars will power on with random values.
219+
#if 0
220+
// Clear BSS ourselves, we don't have handy C runtime
221+
extern char _bss_start;
222+
extern char _bss_end;
223+
ets_bzero(&_bss_start, &_bss_end - &_bss_start);
224+
#endif
225+
225226
print_version(0);
226227

227228
if (eboot_command_read(&cmd) == 0) {
@@ -236,32 +237,26 @@ int main()
236237
}
237238

238239
if (cmd.action == ACTION_COPY_RAW) {
239-
uint32_t cp = S('c', 'p', ':', 0);
240-
ets_printf((const char *)&cp);
240+
ets_printf("cp:");
241241

242242
ets_wdt_disable();
243243
res = copy_raw(cmd.args[0], cmd.args[1], cmd.args[2], false);
244244
ets_wdt_enable();
245245

246-
cp = S('0' + res, '\n', 0, 0 );
247-
ets_printf((const char *)&cp);
246+
ets_printf("%d\n", res);
248247
#if 0
249248
//devyte: this verify step below (cmp:) only works when the end of copy operation above does not overwrite the
250249
//beginning of the image in the empty area, see #7458. Disabling for now.
251250
//TODO: replace the below verify with hash type, crc, or similar.
252251
// Verify the copy
253-
uint32_t v[2];
254-
v[0] = S('c', 'm', 'p', ':');
255-
v[1] = 0;
256-
ets_printf(const char *)v);
252+
ets_printf("cmp:");
257253
if (res == 0) {
258254
ets_wdt_disable();
259255
res = copy_raw(cmd.args[0], cmd.args[1], cmd.args[2], true);
260256
ets_wdt_enable();
261257
}
262258

263-
cp = S('0' + res, '\n', 0, 0 );
264-
ets_printf((const char *)&cp);
259+
ets_printf("%d\n", res);
265260
#endif
266261
if (res == 0) {
267262
cmd.action = ACTION_LOAD_APP;
@@ -274,13 +269,10 @@ int main()
274269
}
275270

276271
if (cmd.action == ACTION_LOAD_APP) {
277-
ets_putc('l'); ets_putc('d'); ets_putc('\n');
272+
ets_printf("ld\n");
278273
res = load_app_from_flash_raw(cmd.args[0]);
279274
// We will get to this only on load fail
280-
uint32_t e[2];
281-
e[0] = S('e', ':', '0' + res, '\n' );
282-
e[1] = 0;
283-
ets_printf((const char*)e);
275+
ets_printf("e:%d\n", res);
284276
}
285277

286278
if (res) {

bootloaders/eboot/eboot.elf

43.1 KB
Binary file not shown.

bootloaders/eboot/eboot.ld

Lines changed: 24 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -42,53 +42,13 @@ PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
4242
SECTIONS
4343
{
4444

45-
.dport0.rodata : ALIGN(4)
46-
{
47-
_dport0_rodata_start = ABSOLUTE(.);
48-
*(.dport0.rodata)
49-
*(.dport.rodata)
50-
_dport0_rodata_end = ABSOLUTE(.);
51-
} >dport0_0_seg :dport0_0_phdr
52-
53-
.dport0.literal : ALIGN(4)
54-
{
55-
_dport0_literal_start = ABSOLUTE(.);
56-
*(.dport0.literal)
57-
*(.dport.literal)
58-
_dport0_literal_end = ABSOLUTE(.);
59-
} >dport0_0_seg :dport0_0_phdr
60-
61-
.dport0.data : ALIGN(4)
62-
{
63-
_dport0_data_start = ABSOLUTE(.);
64-
*(.dport0.data)
65-
*(.dport.data)
66-
_dport0_data_end = ABSOLUTE(.);
67-
} >dport0_0_seg :dport0_0_phdr
68-
69-
.data : ALIGN(4)
45+
.globals : ALIGN(4)
7046
{
7147
*(COMMON) /* Global vars */
72-
. = ALIGN(4);
73-
_heap_start = ABSOLUTE(.);
74-
/* _stack_sentry = ALIGN(0x8); */
7548
} >dram0_0_seg :dram0_0_bss_phdr
76-
/* __stack = 0x3ffc8000; */
7749

78-
.text : ALIGN(4)
50+
.data : ALIGN(4)
7951
{
80-
_stext = .;
81-
_text_start = ABSOLUTE(.);
82-
*(.entry.text)
83-
*(.init.literal)
84-
*(.init)
85-
*(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
86-
*(.fini.literal)
87-
*(.fini)
88-
*(.gnu.version)
89-
_text_end = ABSOLUTE(.);
90-
_etext = .;
91-
. = ALIGN (8);
9252
_data_start = ABSOLUTE(.);
9353
*(.data)
9454
*(.data.*)
@@ -102,7 +62,10 @@ SECTIONS
10262
*(.gnu.linkonce.s2.*)
10363
*(.jcr)
10464
_data_end = ABSOLUTE(.);
105-
. = ALIGN (8);
65+
} >dram0_0_seg :dram0_0_bss_phdr
66+
67+
.rodata : ALIGN(4)
68+
{
10669
_rodata_start = ABSOLUTE(.);
10770
*(.rodata)
10871
*(.rodata.*)
@@ -131,14 +94,11 @@ SECTIONS
13194
*(.xt_except_desc_end)
13295
*(.dynamic)
13396
*(.gnu.version_d)
134-
. = ALIGN(4); /* this table MUST be 4-byte aligned */
135-
_bss_table_start = ABSOLUTE(.);
136-
LONG(_bss_start)
137-
LONG(_bss_end)
138-
_bss_table_end = ABSOLUTE(.);
13997
_rodata_end = ABSOLUTE(.);
98+
} >dram0_0_seg :dram0_0_bss_phdr
14099

141-
. = ALIGN (8);
100+
.bss : ALIGN(4)
101+
{
142102
_bss_start = ABSOLUTE(.);
143103
*(.dynsbss)
144104
*(.sbss)
@@ -152,26 +112,24 @@ SECTIONS
152112
*(.bss)
153113
*(.bss.*)
154114
*(.gnu.linkonce.b.*)
155-
. = ALIGN (8);
156115
_bss_end = ABSOLUTE(.);
157-
_free_space = 4096 - 17 - (. - _stext);
158-
/*
159-
The boot loader checksum must be before the CRC, which is written by elf2bin.py.
160-
This leaves 16 bytes after the checksum for the CRC placed at the end of the
161-
4096-byte sector. */
162-
_cs_here = (ALIGN((. + 1), 16) == ALIGN(16)) ? (ALIGN(16) - 1) : (. + 0x0F);
116+
} >dram0_0_seg :dram0_0_bss_phdr
163117

164-
/*
165-
The filling (padding) and values for _crc_size and _crc_val are handled by
166-
elf2bin.py. With this, we give values to the symbols without explicitly
167-
assigning space. This avoids the linkers back *fill* operation that causes
168-
trouble.
169118

170-
The CRC info is stored in last 8 bytes. */
171-
_crc_size = _stext + 4096 - 8;
172-
_crc_val = _stext + 4096 - 4;
173-
ASSERT((4096 > (17 + (. - _stext))), "Error: No space for CS and CRC in bootloader sector.");
174-
ASSERT((_crc_size > _cs_here), "Error: CRC must be located after CS.");
119+
.text : ALIGN(4)
120+
{
121+
_stext = .;
122+
_text_start = ABSOLUTE(.);
123+
*(.entry.text)
124+
*(.init.literal)
125+
*(.init)
126+
*(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
127+
*(.fini.literal)
128+
*(.fini)
129+
*(.gnu.version)
130+
_text_end = ABSOLUTE(.);
131+
_etext = .;
132+
. = ALIGN (4); /* Ensure 32b alignment since this is written to IRAM */
175133
} >iram1_0_seg :iram1_0_phdr
176134

177135
.lit4 : ALIGN(4)

cores/esp8266/Esp.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -444,21 +444,23 @@ bool EspClass::checkFlashConfig(bool needsEquals) {
444444
return false;
445445
}
446446

447+
extern "C" uint32_t __crc_len;
448+
extern "C" uint32_t __crc_val;
447449
bool EspClass::checkFlashCRC() {
448450
// The CRC and total length are placed in extra space at the end of the 4K chunk
449451
// of flash occupied by the bootloader. If the bootloader grows to >4K-8 bytes,
450452
// we'll need to adjust this.
451-
uint32_t flashsize = *((uint32_t*)(0x40200000 + 4088)); // Start of PROGMEM plus 4K-8
452-
uint32_t flashcrc = *((uint32_t*)(0x40200000 + 4092)); // Start of PROGMEM plus 4K-4
453+
uint32_t flashsize = __crc_len;
454+
uint32_t flashcrc = __crc_val;
453455
uint32_t z[2];
454456
z[0] = z[1] = 0;
455457

456458
// Start the checksum
457-
uint32_t crc = crc32((const void*)0x40200000, 4096-8, 0xffffffff);
459+
uint32_t crc = crc32((const void*)0x40200000, 4096 + 16, 0xffffffff);
458460
// Pretend the 2 words of crc/len are zero to be idempotent
459461
crc = crc32(z, 8, crc);
460462
// Finish the CRC calculation over the rest of flash
461-
crc = crc32((const void*)0x40201000, flashsize-4096, crc);
463+
crc = crc32((const void*)0x40201018, flashsize - 4096 - 16 - 8, crc);
462464
return crc == flashcrc;
463465
}
464466

tools/elf2bin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
ffreqb = { '40': 0, '26': 1, '20': 2, '80': 15 }
3131
fsizeb = { '512K': 0, '256K': 1, '1M': 2, '2M': 3, '4M': 4, '8M': 8, '16M': 9 }
3232

33-
crcsize_offset = 4088
34-
crcval_offset = 4092
33+
crcsize_offset = 4096 + 16
34+
crcval_offset = 4096 + 16 + 4
3535

3636
def get_elf_entry(elf, path):
3737
p = subprocess.Popen([path + "/xtensa-lx106-elf-readelf", '-h', elf], stdout=subprocess.PIPE, universal_newlines=True )
@@ -188,7 +188,7 @@ def wrapper(**kwargs):
188188

189189
wrapper(
190190
elf=args.eboot,
191-
segments=[".text"],
191+
segments=[".text", ".rodata"],
192192
to_addr=4096
193193
)
194194

tools/sdk/ld/eagle.app.v6.common.ld.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ SECTIONS
147147
.irom0.text : ALIGN(4)
148148
{
149149
_irom0_text_start = ABSOLUTE(.);
150+
151+
/* Stuff the CRC in well known symbols at a well known location */
152+
__crc_len = ABSOLUTE(.);
153+
LONG(0x00000000);
154+
__crc_val = ABSOLUTE(.);
155+
LONG(0x00000000);
156+
150157
*(.ver_number)
151158
*.c.o(.literal*, .text*)
152159
*.cpp.o(EXCLUDE_FILE (umm_malloc.cpp.o) .literal*, EXCLUDE_FILE (umm_malloc.cpp.o) .text*)

tools/sdk/uzlib

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy