summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2020-03-26 22:35:32 +1100
committerDamien George <damien.p.george@gmail.com>2020-04-04 16:30:36 +1100
commite0905e85a7ad2961aa9192f6130565860e531ad3 (patch)
treeaad6619782953e08b395f292852ebb8bd80ab0e6
parentdf156b18e517f9267bf8e4e206aa383a6e356508 (diff)
esp8266: Change from FAT to littlefs v2 as default filesystem.
This commit changes the esp8266 boards to use littlefs v2 as the filesystem, rather than FAT. Since the esp8266 doesn't expose the filesystem to the PC over USB there's no strong reason to keep it as FAT. Littlefs is smaller in code size, is more efficient in use of flash to store data, is resilient over power failure, and using it saves about 4k of heap RAM, which can now be used for other things. This is a backwards incompatible change because all existing esp8266 boards will need to update their filesystem after installing new firmware (eg backup old files, install firmware, restore files to new filesystem). As part of this commit the memory layout of the default board (GENERIC) has changed. It now allocates all 1M of memory-mapped flash to the firmware, so the filesystem area starts at the 2M point. This is done to allow more frozen bytecode to be stored in the 1M of memory-mapped flash. This requires an esp8266 module with 2M or more of flash to work, so a new board called GENERIC_1M is added which has the old memory-mapping (but still changed to use littlefs for the filesystem). In summary there are now 3 esp8266 board definitions: - GENERIC_512K: for 512k modules, doesn't have a filesystem. - GENERIC_1M: for 1M modules, 572k for firmware+frozen code, 396k for filesystem (littlefs). - GENERIC: for 2M (or greater) modules, 968k for firmware+frozen code, 1M+ for filesystem (littlefs), FAT driver also included in firmware for use on, eg, external SD cards.
-rw-r--r--docs/reference/filesystem.rst3
-rw-r--r--ports/esp8266/Makefile3
-rw-r--r--ports/esp8266/boards/GENERIC/mpconfigboard.mk4
-rw-r--r--ports/esp8266/boards/GENERIC_1M/mpconfigboard.h20
-rw-r--r--ports/esp8266/boards/GENERIC_1M/mpconfigboard.mk4
-rw-r--r--ports/esp8266/boards/GENERIC_512K/mpconfigboard.mk2
-rw-r--r--ports/esp8266/boards/esp8266.ld12
-rw-r--r--ports/esp8266/boards/esp8266_1m.ld19
-rw-r--r--ports/esp8266/boards/esp8266_2m.ld18
-rw-r--r--ports/esp8266/boards/esp8266_512k.ld16
-rw-r--r--ports/esp8266/modules/flashbdev.py20
-rw-r--r--ports/esp8266/modules/inisetup.py4
12 files changed, 91 insertions, 34 deletions
diff --git a/docs/reference/filesystem.rst b/docs/reference/filesystem.rst
index cd8600928..9e7e6212d 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 989e8a62f..60eb7c080 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 820f073d9..2ecfb6d34 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 000000000..ed5072993
--- /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 000000000..7399790e7
--- /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 32fd4e007..a7566f9f1 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 745edaadb..000000000
--- 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 000000000..94bc6a229
--- /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 000000000..b5813ce0f
--- /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 869044781..c4cc79849 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 404cf3666..652fe9a4b 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 1bbc3d0db..79576e9d6 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(