diff --git a/docs/reference/filesystem.rst b/docs/reference/filesystem.rst index cd86009287..9e7e6212dc 100644 --- a/docs/reference/filesystem.rst +++ b/docs/reference/filesystem.rst @@ -178,7 +178,8 @@ Board FAT littlefs v1 littlefs v2 ==================== ===== =========== =========== pyboard 1.0, 1.1, D Yes No Yes Other STM32 Yes No No -ESP8266 Yes No No +ESP8266 (1M) No No Yes +ESP8266 (2M+) Yes No Yes ESP32 Yes No Yes ==================== ===== =========== =========== diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile index 989e8a62f3..60eb7c0803 100644 --- a/ports/esp8266/Makefile +++ b/ports/esp8266/Makefile @@ -22,7 +22,6 @@ QSTR_GLOBAL_DEPENDENCIES = $(BOARD_DIR)/mpconfigboard.h MICROPY_PY_USSL = 1 MICROPY_SSL_AXTLS = 1 AXTLS_DEFS_EXTRA = -Dabort=abort_ -DRT_MAX_PLAIN_LENGTH=1024 -DRT_EXTRA=4096 -MICROPY_PY_BTREE ?= 1 BTREE_DEFS_EXTRA = -DDEFPSIZE=1024 -DMINCACHE=3 FROZEN_MANIFEST ?= boards/manifest.py @@ -60,7 +59,7 @@ CFLAGS_XTENSA = -fsingle-precision-constant -Wdouble-promotion \ CFLAGS = $(INC) -Wall -Wpointer-arith -Werror -std=gnu99 -nostdlib -DUART_OS=$(UART_OS) \ $(CFLAGS_XTENSA) $(CFLAGS_MOD) $(COPT) $(CFLAGS_EXTRA) -I$(BOARD_DIR) -LD_FILES ?= boards/esp8266.ld +LD_FILES ?= boards/esp8266_2m.ld LDFLAGS = -nostdlib -T $(LD_FILES) -Map=$(@:.elf=.map) --cref LIBS = -L$(ESP_SDK)/lib -lmain -ljson -llwip_open -lpp -lnet80211 -lwpa -lphy -lnet80211 $(LDFLAGS_MOD) diff --git a/ports/esp8266/boards/GENERIC/mpconfigboard.mk b/ports/esp8266/boards/GENERIC/mpconfigboard.mk index 820f073d98..2ecfb6d343 100644 --- a/ports/esp8266/boards/GENERIC/mpconfigboard.mk +++ b/ports/esp8266/boards/GENERIC/mpconfigboard.mk @@ -1,3 +1,7 @@ +LD_FILES = boards/esp8266_2m.ld + +MICROPY_PY_BTREE = 1 MICROPY_VFS_FAT = 1 +MICROPY_VFS_LFS2 = 1 FROZEN_MANIFEST ?= $(BOARD_DIR)/manifest.py diff --git a/ports/esp8266/boards/GENERIC_1M/mpconfigboard.h b/ports/esp8266/boards/GENERIC_1M/mpconfigboard.h new file mode 100644 index 0000000000..ed50729936 --- /dev/null +++ b/ports/esp8266/boards/GENERIC_1M/mpconfigboard.h @@ -0,0 +1,20 @@ +#define MICROPY_HW_BOARD_NAME "ESP module (1M)" +#define MICROPY_HW_MCU_NAME "ESP8266" + +#define MICROPY_PERSISTENT_CODE_LOAD (1) +#define MICROPY_EMIT_XTENSA (1) +#define MICROPY_EMIT_INLINE_XTENSA (1) + +#define MICROPY_DEBUG_PRINTERS (1) +#define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_NORMAL) + +#define MICROPY_READER_VFS (MICROPY_VFS) +#define MICROPY_VFS (1) + +#define MICROPY_PY_BUILTINS_SLICE_ATTRS (1) +#define MICROPY_PY_ALL_SPECIAL_METHODS (1) +#define MICROPY_PY_IO_FILEIO (1) +#define MICROPY_PY_SYS_STDIO_BUFFER (1) +#define MICROPY_PY_URE_SUB (1) +#define MICROPY_PY_UCRYPTOLIB (1) +#define MICROPY_PY_FRAMEBUF (1) diff --git a/ports/esp8266/boards/GENERIC_1M/mpconfigboard.mk b/ports/esp8266/boards/GENERIC_1M/mpconfigboard.mk new file mode 100644 index 0000000000..7399790e71 --- /dev/null +++ b/ports/esp8266/boards/GENERIC_1M/mpconfigboard.mk @@ -0,0 +1,4 @@ +LD_FILES = boards/esp8266_1m.ld + +MICROPY_PY_BTREE = 1 +MICROPY_VFS_LFS2 = 1 diff --git a/ports/esp8266/boards/GENERIC_512K/mpconfigboard.mk b/ports/esp8266/boards/GENERIC_512K/mpconfigboard.mk index 32fd4e0077..a7566f9f19 100644 --- a/ports/esp8266/boards/GENERIC_512K/mpconfigboard.mk +++ b/ports/esp8266/boards/GENERIC_512K/mpconfigboard.mk @@ -1,3 +1 @@ -MICROPY_PY_BTREE = 0 -MICROPY_VFS_FAT = 0 LD_FILES = boards/esp8266_512k.ld diff --git a/ports/esp8266/boards/esp8266.ld b/ports/esp8266/boards/esp8266.ld deleted file mode 100644 index 745edaadbb..0000000000 --- a/ports/esp8266/boards/esp8266.ld +++ /dev/null @@ -1,12 +0,0 @@ -/* GNU linker script for ESP8266 */ - -MEMORY -{ - dport0_0_seg : org = 0x3ff00000, len = 0x10 - dram0_0_seg : org = 0x3ffe8000, len = 0x14000 - iram1_0_seg : org = 0x40100000, len = 0x8000 - irom0_0_seg : org = 0x40209000, len = 0x8f000 -} - -/* define common sections and symbols */ -INCLUDE boards/esp8266_common.ld diff --git a/ports/esp8266/boards/esp8266_1m.ld b/ports/esp8266/boards/esp8266_1m.ld new file mode 100644 index 0000000000..94bc6a229a --- /dev/null +++ b/ports/esp8266/boards/esp8266_1m.ld @@ -0,0 +1,19 @@ +/* GNU linker script for ESP8266 with 1M flash + + Flash layout: + 0x40200000 36k header + iram/dram init + 0x40209000 572k firmware (irom0) + 0x40298000 396k filesystem + 0x402fb000 20k SDK parameters +*/ + +MEMORY +{ + dport0_0_seg : org = 0x3ff00000, len = 16 + dram0_0_seg : org = 0x3ffe8000, len = 80K + iram1_0_seg : org = 0x40100000, len = 32K + irom0_0_seg : org = 0x40209000, len = 572K +} + +/* define common sections and symbols */ +INCLUDE boards/esp8266_common.ld diff --git a/ports/esp8266/boards/esp8266_2m.ld b/ports/esp8266/boards/esp8266_2m.ld new file mode 100644 index 0000000000..b5813ce0fb --- /dev/null +++ b/ports/esp8266/boards/esp8266_2m.ld @@ -0,0 +1,18 @@ +/* GNU linker script for ESP8266 with 2M or more flash + + Flash layout: + 0x40200000 36k header + iram/dram init + 0x40209000 988k firmware (irom0) + 0x40300000 1M+ filesystem (not memory mapped) +*/ + +MEMORY +{ + dport0_0_seg : org = 0x3ff00000, len = 16 + dram0_0_seg : org = 0x3ffe8000, len = 80K + iram1_0_seg : org = 0x40100000, len = 32K + irom0_0_seg : org = 0x40209000, len = 1M - 36K +} + +/* define common sections and symbols */ +INCLUDE boards/esp8266_common.ld diff --git a/ports/esp8266/boards/esp8266_512k.ld b/ports/esp8266/boards/esp8266_512k.ld index 8690447813..c4cc798499 100644 --- a/ports/esp8266/boards/esp8266_512k.ld +++ b/ports/esp8266/boards/esp8266_512k.ld @@ -1,11 +1,17 @@ -/* GNU linker script for ESP8266 */ +/* GNU linker script for ESP8266 with 512K flash + + Flash layout: + 0x40200000 36k header + iram/dram init + 0x40209000 456k firmware (irom0) + 0x4027b000 20k SDK parameters +*/ MEMORY { - dport0_0_seg : org = 0x3ff00000, len = 0x10 - dram0_0_seg : org = 0x3ffe8000, len = 0x14000 - iram1_0_seg : org = 0x40100000, len = 0x8000 - irom0_0_seg : org = 0x40209000, len = 0x72000 + dport0_0_seg : org = 0x3ff00000, len = 16 + dram0_0_seg : org = 0x3ffe8000, len = 80K + iram1_0_seg : org = 0x40100000, len = 32K + irom0_0_seg : org = 0x40209000, len = 512K - 36K - 20K } /* define common sections and symbols */ diff --git a/ports/esp8266/modules/flashbdev.py b/ports/esp8266/modules/flashbdev.py index 404cf36665..652fe9a4ba 100644 --- a/ports/esp8266/modules/flashbdev.py +++ b/ports/esp8266/modules/flashbdev.py @@ -2,26 +2,23 @@ import esp class FlashBdev: - SEC_SIZE = 4096 - RESERVED_SECS = 1 - START_SEC = esp.flash_user_start() // SEC_SIZE + RESERVED_SECS - NUM_BLK = 0x6B - RESERVED_SECS - def __init__(self, blocks=NUM_BLK): + def __init__(self, start_sec, blocks): + self.start_sec = start_sec self.blocks = blocks def readblocks(self, n, buf, off=0): # print("readblocks(%s, %x(%d), %d)" % (n, id(buf), len(buf), off)) - esp.flash_read((n + self.START_SEC) * self.SEC_SIZE + off, buf) + esp.flash_read((n + self.start_sec) * self.SEC_SIZE + off, buf) def writeblocks(self, n, buf, off=None): # print("writeblocks(%s, %x(%d), %d)" % (n, id(buf), len(buf), off)) # assert len(buf) <= self.SEC_SIZE, len(buf) if off is None: - esp.flash_erase(n + self.START_SEC) + esp.flash_erase(n + self.start_sec) off = 0 - esp.flash_write((n + self.START_SEC) * self.SEC_SIZE + off, buf) + esp.flash_write((n + self.start_sec) * self.SEC_SIZE + off, buf) def ioctl(self, op, arg): # print("ioctl(%d, %r)" % (op, arg)) @@ -30,7 +27,7 @@ class FlashBdev: if op == 5: # MP_BLOCKDEV_IOCTL_BLOCK_SIZE return self.SEC_SIZE if op == 6: # MP_BLOCKDEV_IOCTL_BLOCK_ERASE - esp.flash_erase(arg + self.START_SEC) + esp.flash_erase(arg + self.start_sec) return 0 @@ -38,5 +35,8 @@ size = esp.flash_size() if size < 1024 * 1024: bdev = None else: + start_sec = esp.flash_user_start() // FlashBdev.SEC_SIZE + if start_sec < 256: + start_sec += 1 # Reserve space for native code # 20K at the flash end is reserved for SDK params storage - bdev = FlashBdev((size - 20480) // FlashBdev.SEC_SIZE - FlashBdev.START_SEC) + bdev = FlashBdev(start_sec, (size - 20480) // FlashBdev.SEC_SIZE - start_sec) diff --git a/ports/esp8266/modules/inisetup.py b/ports/esp8266/modules/inisetup.py index 1bbc3d0dbb..79576e9d62 100644 --- a/ports/esp8266/modules/inisetup.py +++ b/ports/esp8266/modules/inisetup.py @@ -45,8 +45,8 @@ def setup(): check_bootsec() print("Performing initial setup") wifi() - uos.VfsFat.mkfs(bdev) - vfs = uos.VfsFat(bdev) + uos.VfsLfs2.mkfs(bdev) + vfs = uos.VfsLfs2(bdev) uos.mount(vfs, "/") with open("boot.py", "w") as f: f.write(