support 1MB boards

- add make flags FLASH_1MB and NO_FOTA
- add SPI1 labels to ESP8266
- fix some compiler warnings
This commit is contained in:
MaBecker 2020-02-10 10:19:13 +01:00
parent 624d6f2c70
commit 2d50160436
15 changed files with 99 additions and 45 deletions

View File

@ -75,6 +75,8 @@
Ensure it's possible to get a solid background when using 4x6 font
Bangle.js: Add Bangle.showLauncher
Add append optimisation for string '+', and don't append to flat/native/etc strings (fix #1746)
ESP8266_4MB: add optional build flag FLASH_1MB for ESP8255 & ESP01s with 1MB flash
ESP8266: add optional build flag NO_FOTA to remove flash over the air functionality
2v04 : Allow \1..\9 escape codes in RegExp
ESP8266: reading storage is not working for boot from user2 (fix #1507)

View File

@ -519,8 +519,13 @@ ifeq ($(USE_NET),1)
INCLUDE += -I$(ROOT)/libs/network/esp8266
SOURCES += \
libs/network/esp8266/network_esp8266.c\
libs/network/esp8266/pktbuf.c\
libs/network/esp8266/ota.c
libs/network/esp8266/pktbuf.c
endif
ifndef NO_FOTA
SOURCES += libs/network/esp8266/ota.c
else
DEFINES += -DNO_FOTA
endif
ifdef USE_TELNET

View File

@ -125,9 +125,9 @@ def get_pins():
{ "name":"PD9", "sortingname":"D09", "port":"D", "num":"9", "functions":{}, "csv":{} },
{ "name":"PD10", "sortingname":"D10", "port":"D", "num":"10", "functions":{}, "csv":{} },
{ "name":"PD11", "sortingname":"D11", "port":"D", "num":"11", "functions":{}, "csv":{} },
{ "name":"PD12", "sortingname":"D12", "port":"D", "num":"12", "functions":{}, "csv":{} },
{ "name":"PD13", "sortingname":"D13", "port":"D", "num":"13", "functions":{}, "csv":{} },
{ "name":"PD14", "sortingname":"D14", "port":"D", "num":"14", "functions":{}, "csv":{} },
{ "name":"PD12", "sortingname":"D12", "port":"D", "num":"12", "functions":{"SPI1_MISO":0}, "csv":{} },
{ "name":"PD13", "sortingname":"D13", "port":"D", "num":"13", "functions":{"SPI1_MOSI":0}, "csv":{} },
{ "name":"PD14", "sortingname":"D14", "port":"D", "num":"14", "functions":{"SPI1_SCK":0}, "csv":{} },
{ "name":"PD15", "sortingname":"D15", "port":"D", "num":"15", "functions":{}, "csv":{} },
{ "name":"PD16", "sortingname":"D16", "port":"D", "num":"16", "functions":{}, "csv":{} },
{ "name":"PA0", "sortingname":"A00", "port":"A", "num":"17", "functions":{ "ADC1_IN0":0 }, "csv":{} }

View File

@ -14,6 +14,7 @@ OPTIMIZEFLAGS+=-Os -std=gnu11 -fgnu89-inline -Wl,--allow-multiple-definition
endif
ET_FM ?= qio # Valid values are keep, qio, qout, dio, dout
ifdef FLASH_4MB
ESP_FLASH_MAX ?= 831488 # max bin file: 940KB
ESP_FLASH_SIZE ?= 6 # 6->4MB (1024KB+1024KB)
@ -23,6 +24,7 @@ ET_FS ?= 4MB-c1 # 32Mbit (4MB) flash size in esptool flash comma
ET_FF ?= 80m # 80Mhz flash speed in esptool flash command
ET_BLANK ?= 0x3FE000 # where to flash blank.bin
ET_DEFAULTS ?= 0x3FC000 # where to flash esp_init_data_default.bin to default SDK settings
CFLAGS += -mforce-l32
else ifdef 2MB
ESP_FLASH_MAX ?= 479232 # max bin file: 468KB
ESP_FLASH_SIZE ?= 3 # 3->2MB (512KB+512KB)
@ -46,34 +48,43 @@ ESP_FLASH_MAX ?= 479232 # max bin file: 468KB
ESP_FLASH_SIZE ?= 0 # 0->512KB
ESP_FLASH_MODE ?= 0 # 0->QIO
ESP_FLASH_FREQ_DIV ?= 0 # 0->40Mhz
ET_FS ?= 4m # 4Mbit (512KB) flash size in esptool flash command
ET_FS ?= 512KB # 4Mbit (512KB) flash size in esptool flash command
ET_FF ?= 40m # 40Mhz flash speed in esptool flash command
ET_BLANK ?= 0x7E000 # where to flash blank.bin
ET_DEFAULTS ?= 0x7C000 # where to flash esp_init_data_default.bin to default SDK settings
endif
FLASH_BAUD ?= 115200 # The flash baud rate
ifdef FLASH_1MB
ESP_FLASH_MAX = 831488 # max bin file: 812KB
ESP_FLASH_SIZE = 2 # 2->1MB (1024)
ESP_FLASH_MODE = 0 # 0->QIO, 2->DIO
ESP_FLASH_FREQ_DIV = 15 # 15->80Mhz
ET_FS = 1MB # 8Mbit (1MB) flash size in esptool flash command
ET_FF = 80m # 80Mhz flash speed in esptool flash command
ET_FM = dout # Valid values are keep, qio, qout, dio, dout
ET_BLANK = 0xFE000 # where to flash blank.bin
ET_DEFAULTS = 0xFC000 # where to flash esp_init_data_default.bin to default SDK settings
DEFINES += -DFLASH_1MB
CFLAGS += -mforce-l32
endif
FLASH_BAUD ?= 115200 # The flash baud rate
# move os_printf strings into flash to save RAM space
DEFINES += -DUSE_OPTIMIZE_PRINTF
DEFINES += -D__ETS__ -DICACHE_FLASH -DXTENSA -DUSE_US_TIMER
LIBS += -lc -lgcc -lhal -lphy -lpp -lnet80211 -llwip_536 -lwpa -lmain -lpwm -lcrypto
CFLAGS+= -fno-builtin \
LIBS += -lc -lgcc -lhal -lphy -lpp -lnet80211 -llwip_536 -lwpa -lmain -lpwm -lcrypto
CFLAGS += -fno-builtin \
-Wno-maybe-uninitialized -Wno-old-style-declaration -Wno-conversion -Wno-unused-variable \
-Wno-unused-parameter -Wno-ignored-qualifiers -Wno-discarded-qualifiers -Wno-float-conversion \
-Wno-unused-parameter -Wno-ignored-qualifiers \
-Wno-parentheses -Wno-type-limits -Wno-unused-function -Wno-unused-value \
-Wl,EL -Wl,--gc-sections -nostdlib -mlongcalls -mtext-section-literals \
-fno-guess-branch-probability -freorder-blocks-and-partition -fno-cse-follow-jumps \
-fno-tree-fre -fno-ipa-sra -fno-signed-zeros -fno-trapping-math -fassociative-math \
-fno-caller-saves -fno-move-loop-invariants -fno-tree-tail-merge -fno-tree-copy-prop
# only use mfore-l32 if 4MB board for now
ifdef FLASH_4MB
CFLAGS += -mforce-l32
endif
#
# The Root of the ESP8266_SDK distributed by Espressif
# This must be supplied as a Make environment variable.
ifndef ESP8266_SDK_ROOT

View File

@ -19,18 +19,23 @@ USER2_BIN = espruino_esp8266_user2.bin
USER1_ELF = espruino_esp8266_user1.elf
USER2_ELF = espruino_esp8266_user2.elf
PARTIAL = espruino_esp8266_partial.o
ifdef FLASH_4MB
ESP_COMBINED_SIZE = 4096
ESP_FLASH_ADDONS = $(ET_DEFAULTS) $(INIT_DATA) $(ET_BLANK) $(BLANK)
LD_SCRIPT1 = ./targets/esp8266/eagle.app.v6.new.2048.ld
LD_SCRIPT2 = ./targets/esp8266/eagle.app.v6.new.2048.ld
LD_RENAME = --rename-section .text=.irom.text --rename-section .literal=.irom.literal
else
ESP_COMBINED_SIZE = 512
LD_SCRIPT1 = ./targets/esp8266/eagle.app.v6.new.1024.app1.ld
LD_SCRIPT2 = ./targets/esp8266/eagle.app.v6.new.1024.app2.ld
LD_RENAME = --rename-section .text=.irom.text --rename-section .literal=.irom.literal
endif
ifdef FLASH_1MB
ESP_COMBINED_SIZE = 1024
endif
LD_RENAME = --rename-section .text=.irom.text --rename-section .literal=.irom.literal
ESP_COMBINED = $(PROJ_NAME)_combined_$(ESP_COMBINED_SIZE).bin
APPGEN_TOOL = $(ESP8266_SDK_ROOT)/tools/gen_appbin.py
BOOTLOADER = $(ESP8266_SDK_ROOT)/bin/boot_v1.6.bin

View File

@ -76,7 +76,7 @@ htmlFile = open('functions.html', 'w')
def html(s): htmlFile.write(s+"\n");
def htmlify(d,current):
d = markdown.markdown(d, extensions=['urlize'])
d = markdown.markdown(d, extensions=['markdown_include.include'])
# replace <code> with newlines with pre
idx = d.find("<code>")
end = d.find("</code>", idx)

View File

@ -272,7 +272,7 @@ int jshGetCharToTransmit(
IOEventFlags device // The device being looked at for a transmission.
) {
if (DEVICE_HAS_DEVICE_STATE(device)) {
JshSerialDeviceState *deviceState = &jshSerialDeviceStates[TO_SERIAL_DEVICE_STATE(device)];
JshSerialDeviceState *deviceState = (JshSerialDeviceState*) &jshSerialDeviceStates[TO_SERIAL_DEVICE_STATE(device)];
if ((*deviceState)&SDS_XOFF_PENDING) {
(*deviceState) = ((*deviceState)&(~SDS_XOFF_PENDING)) | SDS_XOFF_SENT;
return 19/*XOFF*/;
@ -675,7 +675,7 @@ void jshSetFlowControlXON(IOEventFlags device, bool hostShouldTransmit) {
if (!hostShouldTransmit)
jshSerialFlowControlWasSet = true;
int devIdx = TO_SERIAL_DEVICE_STATE(device);
JshSerialDeviceState *deviceState = &jshSerialDeviceStates[devIdx];
JshSerialDeviceState *deviceState = (JshSerialDeviceState*) &jshSerialDeviceStates[devIdx];
if ((*deviceState) & SDS_FLOW_CONTROL_XON_XOFF) {
if (hostShouldTransmit) {
if (((*deviceState)&(SDS_XOFF_SENT|SDS_XON_PENDING)) == SDS_XOFF_SENT) {
@ -719,7 +719,7 @@ JsVar *jshGetDeviceObject(IOEventFlags device) {
void jshSetFlowControlEnabled(IOEventFlags device, bool software, Pin pinCTS) {
if (DEVICE_HAS_DEVICE_STATE(device)) {
int devIdx = TO_SERIAL_DEVICE_STATE(device);
JshSerialDeviceState *deviceState = &jshSerialDeviceStates[devIdx];
JshSerialDeviceState *deviceState = (JshSerialDeviceState*) &jshSerialDeviceStates[devIdx];
if (software)
(*deviceState) |= SDS_FLOW_CONTROL_XON_XOFF;
else
@ -758,7 +758,7 @@ Pin jshGetEventDataPin(IOEventFlags channel) {
void jshSetErrorHandlingEnabled(IOEventFlags device, bool errorHandling) {
if (DEVICE_HAS_DEVICE_STATE(device)) {
int devIdx = TO_SERIAL_DEVICE_STATE(device);
JshSerialDeviceState *deviceState = &jshSerialDeviceStates[devIdx];
JshSerialDeviceState *deviceState = (JshSerialDeviceState*) &jshSerialDeviceStates[devIdx];
if (errorHandling)
(*deviceState) |= SDS_ERROR_HANDLING;
else
@ -769,7 +769,7 @@ void jshSetErrorHandlingEnabled(IOEventFlags device, bool errorHandling) {
bool jshGetErrorHandlingEnabled(IOEventFlags device) {
if (DEVICE_HAS_DEVICE_STATE(device)) {
int devIdx = TO_SERIAL_DEVICE_STATE(device);
JshSerialDeviceState *deviceState = &jshSerialDeviceStates[devIdx];
JshSerialDeviceState *deviceState = (JshSerialDeviceState*) &jshSerialDeviceStates[devIdx];
return (SDS_ERROR_HANDLING & *deviceState)!=0;
} else
return false;

View File

@ -499,8 +499,8 @@ JsVar *jsfReadFile(JsfFileName name, int offset, int length) {
if (offset<0) offset=0;
uint32_t fileLen = jsfGetFileSize(&header);
if (length<=0) length=fileLen;
if (offset>fileLen) offset=fileLen;
if (offset+length>fileLen) length=fileLen-offset;
if ((unsigned) offset>fileLen) offset=fileLen;
if ((unsigned) offset+length>fileLen) length=fileLen-offset;
if (length<=0) return jsvNewFromEmptyString();
// now increment address by offset
addr += offset;
@ -655,9 +655,9 @@ int jsfLoadFromFlash_readcb(uint32_t *cbdata) {
jsfcbData *data = (jsfcbData*)cbdata;
if (data->address >= data->endAddress) return -1; // at end
if (data->byteCount==0 || data->bufferCnt>=data->byteCount) {
if ( (unsigned) data->byteCount==0 || data->bufferCnt>= (unsigned) data->byteCount) {
data->byteCount = data->endAddress - data->address;
if (data->byteCount > sizeof(data->buffer))
if ( (unsigned) data->byteCount > sizeof(data->buffer))
data->byteCount = sizeof(data->buffer);
jshFlashRead(data->buffer, data->address, data->byteCount);
data->bufferCnt = 0;

View File

@ -3865,7 +3865,7 @@ void jsvDefragment() {
JsVarRef defragVars[DEFRAGVARS];
memset(defragVars, 0, sizeof(defragVars));
int defragVarIdx = 0;
for (int i=0;i<jsvGetMemoryTotal();i++) {
for (unsigned int i=0;i<jsvGetMemoryTotal();i++) {
JsVarRef vr = i+1;
JsVar *v = _jsvGetAddressOf(vr);
if ((v->flags&JSV_VARTYPEMASK)!=JSV_UNUSED) {
@ -3895,7 +3895,7 @@ void jsvDefragment() {
*defragTo = *defragFrom;
defragFrom->flags = JSV_UNUSED;
// find references!
for (int i=0;i<jsvGetMemoryTotal();i++) {
for ( unsigned int i=0;i<jsvGetMemoryTotal();i++) {
JsVarRef vr = i+1;
JsVar *v = _jsvGetAddressOf(vr);
if ((v->flags&JSV_VARTYPEMASK)!=JSV_UNUSED) {

View File

@ -1125,7 +1125,7 @@ Show fragmentation.
*/
void jswrap_e_dumpFragmentation() {
int l = 0;
for (int i=0;i<jsvGetMemoryTotal();i++) {
for ( unsigned i=0;i<jsvGetMemoryTotal();i++) {
JsVar *v = _jsvGetAddressOf(i+1);
if ((v->flags&JSV_VARTYPEMASK)==JSV_UNUSED) {
jsiConsolePrint(" ");
@ -1161,7 +1161,7 @@ to visualise where memory is used.
void jswrap_e_dumpVariables() {
int l = 0;
jsiConsolePrintf("ref,size,name,links...\n");
for (int i=0;i<jsvGetMemoryTotal();i++) {
for ( unsigned i=0;i<jsvGetMemoryTotal();i++) {
JsVarRef ref = i+1;
JsVar *v = _jsvGetAddressOf(ref);
if ((v->flags&JSV_VARTYPEMASK)==JSV_UNUSED) continue;

View File

@ -353,14 +353,14 @@ JsVar *jswrap_storage_open(JsVar *name, JsVar *modeVar) {
char buf[64];
bool foundEnd = false;
while (!foundEnd) {
int l = STORAGEFILE_CHUNKSIZE-offset;
unsigned int l = STORAGEFILE_CHUNKSIZE-offset;
if (l<=0) {
foundEnd = true;
break;
}
if (l>sizeof(buf)) l=sizeof(buf);
if ( l>sizeof(buf)) l=sizeof(buf);
jshFlashRead(buf, addr+offset, l);
for (int i=0;i<l;i++) {
for (unsigned int i=0;i<l;i++) {
if (buf[i]==(char)255) {
l = i;
foundEnd = true;
@ -480,11 +480,11 @@ JsVar *jswrap_storagefile_read_internal(JsVar *f, int len) {
return result;
}
}
int l = len;
unsigned int l = len;
if (l>sizeof(buf)) l=sizeof(buf);
if (l>remaining) l=remaining;
if (l> (unsigned) remaining) l=remaining;
jshFlashRead(buf, addr+offset, l);
for (int i=0;i<l;i++) {
for (unsigned int i=0;i<l;i++) {
if (buf[i]==(char)255) {
// end of file!
l = i;
@ -597,7 +597,7 @@ void jswrap_storagefile_write(JsVar *f, JsVar *_data) {
jsvUnLock(data);
return;
}
if (len<remaining) {
if (len< (unsigned) remaining) {
DBG("Write Append Chunk\n");
// Great, it all fits in
jswrap_flash_write(data, addr+offset);

View File

@ -43,3 +43,16 @@ esptool.py --port [/dev/ttyUSB0|COM1] --baud 460800 write_flash \
0x0000 "boot_v1.6.bin" 0x1000 espruino_esp8266_user1.bin \
0x3FC000 esp_init_data_default.bin 0x3FE000 blank.bin
Special hints for a broken device after flashing
------------------------------------------------
newer ESP01 like ESP01s have 1MB flash size
try different --flash_mode values like dio or dout
try to use a combined file to flash like
espruino_..._combined_512.bin or
espruino_..._combined_4096.bin

View File

@ -1411,6 +1411,8 @@ JsVar *jshFlashGetFree() {
if (!jsFreeFlash) return 0;
uint32_t map = system_get_flash_size_map();
extern uint16_t espFlashKB; // in user_main,c
if ( map == 6 ) {
addFlashArea(jsFreeFlash, 0x200000, 0x100000);
addFlashArea(jsFreeFlash, 0x300000, 0x40000);
@ -1419,9 +1421,11 @@ JsVar *jshFlashGetFree() {
addFlashArea(jsFreeFlash, 0x3C0000, 0x40000-0x5000);
return jsFreeFlash;
}
// there is no flash for running on 1MB flash without FOTA
if ( map == 2 && espFlashKB == 1024 && strcmp(PC_BOARD_ID, "ESP8266_4MB") == 0)
return jsFreeFlash;
// need 1MB of flash to have more space...
extern uint16_t espFlashKB; // in user_main,c
if (espFlashKB > 512) {
addFlashArea(jsFreeFlash, 0x80000, 0x1000);
if (espFlashKB > 1024) {

View File

@ -236,7 +236,13 @@ JsVar *jswrap_ESP8266_getState() {
uint32_t map = system_get_flash_size_map();
extern char *flash_maps[]; // in user_main.c
extern uint16_t flash_kb[]; // in user_main.c
jsvObjectSetChildAndUnLock(esp8266State, "flashMap", jsvNewFromString(flash_maps[map]));
extern char *flash_maps_alt[]; // in user_main.c
jsvObjectSetChildAndUnLock(esp8266State, "flashMap", jsvNewFromString(
// ( map == 2 && flash_kb[map] == 1024 && is4MB ? flash_maps_alt[map] : flash_maps[map] )));
( map == 2 && flash_kb[map] == 1024 && strcmp(PC_BOARD_ID, "ESP8266_4MB") == 0) ? flash_maps_alt[map] : flash_maps[map] ));
// ( map == 2 && flash_kb[map] == 1024 ? flash_maps_alt[map] : flash_maps[map] )));
jsvObjectSetChildAndUnLock(esp8266State, "flashKB", jsvNewFromInteger(flash_kb[map]));
uint32_t fid = spi_flash_get_id();

View File

@ -27,7 +27,6 @@ typedef long long int64_t;
#include <jsinteractive.h>
#include <jswrap_esp8266_network.h>
#include <jswrap_esp8266.h>
#include <ota.h>
#include <log.h>
#include "ESP8266_board.h"
@ -90,6 +89,10 @@ char *flash_maps[] = { // used in jswrap_ESP8266_network.c
"512KB:256/256", "256KB", "1MB:512/512", "2MB:512/512", "4MB:512/512",
"2MB:1024/1024", "4MB:1024/1024"
};
char *flash_maps_alt[] = { // used in jswrap_ESP8266_network.c
"512KB:256/256", "256KB", "1MB:1024", "2MB:1024", "4MB:512/512",
"2MB:1024/1024", "4MB:1024/1024"
};
uint16_t flash_kb[] = { // used in jswrap_ESP8266_network.c
512, 256, 1024, 2048, 4096, 2048, 4096,
};
@ -122,8 +125,9 @@ void jshPrintBanner() {
os_printf("Espruino "JS_VERSION"\nFlash map %s, manuf 0x%lx chip 0x%lx\n",
flash_maps[map], (long unsigned int) (fid & 0xff), (long unsigned int)chip);
jsiConsolePrintf(
"Flash map %s, manuf 0x%x chip 0x%x\n",
flash_maps[map], fid & 0xff, chip);
"Flash map %s, manuf 0x%x chip 0x%x\n",
(( map == 2 && flash_kb[map] == 1024 && strcmp(PC_BOARD_ID, "ESP8266_4MB") == 0) ? flash_maps_alt[map] : flash_maps[map]),
fid & 0xff, chip);
if ((chip == 0x4013 && map != 0) || (chip == 0x4016 && map != 4 && map != 6)) {
jsiConsolePrint("WARNING: *** Your flash chip does not match your flash map ***\n");
}
@ -238,7 +242,11 @@ static void mainLoop() {
*/
static void initDone() {
os_printf("> initDone\n");
#ifndef NO_FOTA
#include <ota.h>
otaInit(88);
#endif
#ifdef DEBUG
extern void gdbstub_init();