8000 Add ota_bootloader_stage1.c from TheSeven on IRC. · esp8266/esp8266-wiki@fa1c83f · GitHub
[go: up one dir, main page]

Skip to content

Commit fa1c83f

Browse files
committed
Add ota_bootloader_stage1.c from TheSeven on IRC.
1 parent e024fc1 commit fa1c83f

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

reversed/ota_bootloader_stage1.c

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// From TheSeven on IRC.
2+
3+
#define PAGESIZE 4096
4+
5+
void main()
6+
{
7+
struct __attribute__((packed))
8+
{
9+
uint8_t unknown0;
10+
uint8_t unknown1;
11+
enum
12+
{
13+
MODE_QIO = 0,
14+
MODE_QOUT = 1,
15+
MODE_DIO = 2,
16+
MODE_DOUT = 15,
17+
} mode : 8;
18+
enum
19+
{
20+
SPEED_40MHZ = 0,
21+
SPEED_26MHZ = 1,
22+
SPEED_20MHZ = 2,
23+
SPEED_80MHZ = 15,
24+
} speed : 4;
25+
enum
26+
{
27+
SIZE_4MBIT = 0,
28+
SIZE_2MBIT = 1,
29+
SIZE_8MBIT = 2,
30+
SIZE_16MBIT = 3,
31+
SIZE_32MBIT = 4,
32+
} size : 4;
33+
} flashHeader;
34+
35+
struct __attribute__((packed))
36+
{
37+
uint8_t useSecondImageInfo;
38+
uint8_t unknown1;
39+
uint8_t unknown2;
40+
uint8_t unknown3;
41+
} fwInfo;
42+
43+
struct __attribute__((packed))
44+
{
45+
uint8_t activeImageNumber;
46+
uint8_t unknown1;
47+
uint8_t unknown2;
48+
uint8_t unknown3;
49+
uint8_t unknown4;
50+
uint8_t unknown5;
51+
uint8_t unknown6;
52+
uint8_t unknown7;
53+
} imageInfo;
54+
55+
ets_printf("\n2nd boot version : 1.1\n");
56+
SPIRead(0, &flashHeader, sizeof(flashHeader));
57+
ets_printf(" SPI Speed : ");
58+
switch (spiInfo.speed)
59+
{
60+
case SPEED_40MHZ: ets_printf("40MHz\n"); break;
61+
case SPEED_26MHZ: ets_printf("26.7MHz\n"); break;
62+
case SPEED_20MHZ: ets_printf("20MHz\n"); break;
63+
case SPEED_80MHZ: ets_printf("80MHz\n"); break;
64+
}
65+
ets_printf(" SPI Mode : ");
66+
switch (spiInfo.mode)
67+
{
68+
case MODE_QIO: ets_printf("QIO\n"); break;
69+
case MODE_QOUT: ets_printf("QOUT\n"); break;
70+
case MODE_DIO: ets_printf("DIO\n"); break;
71+
case MODE_DOUT: ets_printf("DOUT\n"); break;
72+
}
73+
ets_printf(" SPI Flash Size : ");
74+
int offset;
75+
switch (spiInfo.size)
76+
{
77+
case SIZE_2MBIT: ets_printf("2Mbit\n"); offset = 60; break;
78+
case SIZE_4MBIT: ets_printf("4Mbit\n"); offset = 124; break;
79+
case SIZE_8MBIT: ets_printf("8Mbit\n"); offset = 252; break;
80+
case SIZE_16MBIT: ets_printf("16Mbit\n"); offset = 508; break;
81+
case SIZE_32MBIT: ets_printf("32Mbit\n"); offset = 1020; break;
82+
default: ets_printf("1\n\n"); offset = 124; break;
83+
}
84+
85+
spiRead((offset + 3) * PAGESIZE, &fwInfo, sizeof(fwInfo));
86+
if (!fwInfo.useSecondImageInfo) spiRead((offset + 1) * PAGESIZE, &imageInfo, sizeof(imageInfo));
87+
else spiRead((offset + 2) * PAGESIZE, &imageInfo, sizeof(imageInfo));
88+
89+
ets_memcpy(0x40108000, 0x3ffe8010, 0x304);
90+
ets_printf("jump to run user");
91+
if (imageInfo.activeImageNumber == 255) imageInfo.activeImageNumber = 0;
92+
int useImage = imageInfo.activeImageNumber & 0xf;
93+
switch (useImage)
94+
{
95+
case 0:
96+
ets_printf("1\n\n");
97+
0x4010800c(0x100);
98+
break;
99+
case 1:
100+
ets_printf("2\n\n");
101+
if (offset == 508 || offset == 1020) offset = 252;
102+
0x4010800c((((offset + 4) >> 1) << 12) + 0x1000);
103+
break;
104+
default:
105+
ets_printf("error user bin flag, flag = %x\n", useImage);
106+
break;
107+
}
108+
}

0 commit comments

Comments
 (0)
0