aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Sokolovsky2016-10-25 00:37:33 +0300
committerPaul Sokolovsky2016-10-25 00:43:11 +0300
commit2550d7dfd2e9032474a33d8208868f42680c5863 (patch)
tree611f9fc1eb580428baed759ea3c548846d4d4b42
parentb78144c64d71e8b850a0fd7051bcaa9ee0cce8dd (diff)
esp8266: Add support for building firmware version for 512K modules.
To build, "make 512k". Disabled are FatFs support (no space for filesystem), Python functionality related to files, btree module, and recently enabled features. With all this, there's only one free FlashROM page.
-rw-r--r--esp8266/Makefile17
-rw-r--r--esp8266/esp8266_512k.ld303
-rw-r--r--esp8266/mpconfigport_512k.h19
3 files changed, 336 insertions, 3 deletions
diff --git a/esp8266/Makefile b/esp8266/Makefile
index 96f7f0f5c..245f95b40 100644
--- a/esp8266/Makefile
+++ b/esp8266/Makefile
@@ -5,6 +5,7 @@ QSTR_DEFS = qstrdefsport.h #$(BUILD)/pins_qstr.h
MICROPY_PY_USSL = 1
MICROPY_SSL_AXTLS = 1
+MICROPY_FATFS = 1
MICROPY_PY_BTREE = 1
FROZEN_DIR = scripts
@@ -45,7 +46,8 @@ CFLAGS_XTENSA = -fsingle-precision-constant -Wdouble-promotion \
CFLAGS = $(INC) -Wall -Wpointer-arith -Werror -ansi -std=gnu99 -nostdlib -DUART_OS=$(UART_OS) \
$(CFLAGS_XTENSA) $(CFLAGS_MOD) $(COPT) $(CFLAGS_EXTRA)
-LDFLAGS = -nostdlib -T esp8266.ld -Map=$(@:.elf=.map) --cref
+LDSCRIPT = esp8266.ld
+LDFLAGS = -nostdlib -T $(LDSCRIPT) -Map=$(@:.elf=.map) --cref
LIBS = -L$(ESP_SDK)/lib -lmain -ljson -llwip_open -lpp -lnet80211 -lwpa -lphy -lnet80211 $(LDFLAGS_MOD)
LIBGCC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
@@ -131,10 +133,14 @@ LIB_SRC_C = $(addprefix lib/,\
utils/pyexec.c \
utils/pyhelp.c \
utils/interrupt_char.c \
- fatfs/ff.c \
- fatfs/option/ccsbcs.c \
)
+ifeq ($(MICROPY_FATFS), 1)
+LIB_SRC_C += \
+ lib/fatfs/ff.c \
+ lib/fatfs/option/ccsbcs.c
+endif
+
DRIVERS_SRC_C = $(addprefix drivers/,\
dht/dht.c \
)
@@ -153,7 +159,9 @@ OBJ += $(addprefix $(BUILD)/, $(STM_SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(EXTMOD_SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o))
+ifneq ($(FROZEN_MPY_DIR),)
OBJ += $(BUILD)/$(BUILD)/frozen_mpy.o
+endif
#OBJ += $(BUILD)/pins_$(BOARD).o
# List of sources for qstr extraction
@@ -206,6 +214,9 @@ $(BUILD)/firmware.elf: $(OBJ)
$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
$(Q)$(SIZE) $@
+512k:
+ $(MAKE) LDSCRIPT=esp8266_512k.ld CFLAGS_EXTRA='-DMP_CONFIGFILE="<mpconfigport_512k.h>"' MICROPY_FATFS=0 MICROPY_PY_BTREE=0
+
#MAKE_PINS = boards/make-pins.py
#BOARD_PINS = boards/$(BOARD)/pins.csv
#AF_FILE = boards/stm32f4xx_af.csv
diff --git a/esp8266/esp8266_512k.ld b/esp8266/esp8266_512k.ld
new file mode 100644
index 000000000..611e2c115
--- /dev/null
+++ b/esp8266/esp8266_512k.ld
@@ -0,0 +1,303 @@
+/* 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 = 0x72000
+}
+
+/* define the top of RAM */
+_heap_end = ORIGIN(dram0_0_seg) + LENGTH(dram0_0_seg);
+
+PHDRS
+{
+ dport0_0_phdr PT_LOAD;
+ dram0_0_phdr PT_LOAD;
+ dram0_0_bss_phdr PT_LOAD;
+ iram1_0_phdr PT_LOAD;
+ irom0_0_phdr PT_LOAD;
+}
+
+ENTRY(firmware_start)
+EXTERN(_DebugExceptionVector)
+EXTERN(_DoubleExceptionVector)
+EXTERN(_KernelExceptionVector)
+EXTERN(_NMIExceptionVector)
+EXTERN(_UserExceptionVector)
+
+PROVIDE(_memmap_vecbase_reset = 0x40000000);
+
+/* Various memory-map dependent cache attribute settings: */
+_memmap_cacheattr_wb_base = 0x00000110;
+_memmap_cacheattr_wt_base = 0x00000110;
+_memmap_cacheattr_bp_base = 0x00000220;
+_memmap_cacheattr_unused_mask = 0xFFFFF00F;
+_memmap_cacheattr_wb_trapnull = 0x2222211F;
+_memmap_cacheattr_wba_trapnull = 0x2222211F;
+_memmap_cacheattr_wbna_trapnull = 0x2222211F;
+_memmap_cacheattr_wt_trapnull = 0x2222211F;
+_memmap_cacheattr_bp_trapnull = 0x2222222F;
+_memmap_cacheattr_wb_strict = 0xFFFFF11F;
+_memmap_cacheattr_wt_strict = 0xFFFFF11F;
+_memmap_cacheattr_bp_strict = 0xFFFFF22F;
+_memmap_cacheattr_wb_allvalid = 0x22222112;
+_memmap_cacheattr_wt_allvalid = 0x22222112;
+_memmap_cacheattr_bp_allvalid = 0x22222222;
+PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
+
+SECTIONS
+{
+
+ .dport0.rodata : ALIGN(4)
+ {
+ _dport0_rodata_start = ABSOLUTE(.);
+ *(.dport0.rodata)
+ *(.dport.rodata)
+ _dport0_rodata_end = ABSOLUTE(.);
+ } >dport0_0_seg :dport0_0_phdr
+
+ .dport0.literal : ALIGN(4)
+ {
+ _dport0_literal_start = ABSOLUTE(.);
+ *(.dport0.literal)
+ *(.dport.literal)
+ _dport0_literal_end = ABSOLUTE(.);
+ } >dport0_0_seg :dport0_0_phdr
+
+ .dport0.data : ALIGN(4)
+ {
+ _dport0_data_start = ABSOLUTE(.);
+ *(.dport0.data)
+ *(.dport.data)
+ _dport0_data_end = ABSOLUTE(.);
+ } >dport0_0_seg :dport0_0_phdr
+
+ .irom0.text : ALIGN(4)
+ {
+ _irom0_text_start = ABSOLUTE(.);
+ *(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text)
+
+ /* we put some specific text in this section */
+
+ *py/argcheck.o*(.literal* .text*)
+ *py/asm*.o*(.literal* .text*)
+ *py/bc.o*(.literal* .text*)
+ *py/binary.o*(.literal* .text*)
+ *py/builtin*.o*(.literal* .text*)
+ *py/compile.o*(.literal* .text*)
+ *py/emit*.o*(.literal* .text*)
+ *py/formatfloat.o*(.literal* .text*)
+ *py/frozenmod.o*(.literal* .text*)
+ *py/gc.o*(.literal* .text*)
+ *py/lexer*.o*(.literal* .text*)
+ *py/malloc*.o*(.literal* .text*)
+ *py/map*.o*(.literal* .text*)
+ *py/mod*.o*(.literal* .text*)
+ *py/mpprint.o*(.literal* .text*)
+ *py/mpstate.o*(.literal* .text*)
+ *py/mpz.o*(.literal* .text*)
+ *py/native*.o*(.literal* .text*)
+ *py/nlr*.o*(.literal* .text*)
+ *py/obj*.o*(.literal* .text*)
+ *py/opmethods.o*(.literal* .text*)
+ *py/parse*.o*(.literal* .text*)
+ *py/qstr.o*(.literal* .text*)
+ *py/repl.o*(.literal* .text*)
+ *py/runtime.o*(.literal* .text*)
+ *py/scope.o*(.literal* .text*)
+ *py/sequence.o*(.literal* .text*)
+ *py/showbc.o*(.literal* .text*)
+ *py/smallint.o*(.literal* .text*)
+ *py/stackctrl.o*(.literal* .text*)
+ *py/stream.o*(.literal* .text*)
+ *py/unicode.o*(.literal* .text*)
+ *py/vm.o*(.literal* .text*)
+ *py/vstr.o*(.literal* .text*)
+ *py/warning.o*(.literal* .text*)
+
+ *extmod/*.o*(.literal* .text*)
+
+ *lib/fatfs/*.o*(.literal*, .text*)
+ */libaxtls.a:(.literal*, .text*)
+ *lib/berkeley-db-1.xx/*.o(.literal*, .text*)
+ *lib/libm/*.o*(.literal*, .text*)
+ *lib/mp-readline/*.o(.literal*, .text*)
+ *lib/netutils/*.o*(.literal*, .text*)
+ *lib/timeutils/*.o*(.literal*, .text*)
+ *lib/utils/*.o*(.literal*, .text*)
+
+ *stmhal/pybstdio.o(.literal*, .text*)
+
+ build/main.o(.literal* .text*)
+ *gccollect.o(.literal* .text*)
+ *gchelper.o(.literal* .text*)
+ *help.o(.literal* .text*)
+ *lexerstr32.o(.literal* .text*)
+ *utils.o(.literal* .text*)
+ *modpyb.o(.literal*, .text*)
+ *modpybpin.o(.literal*, .text*)
+ *modpybpwm.o(.literal*, .text*)
+ *modpybrtc.o(.literal*, .text*)
+ *modpybadc.o(.literal*, .text*)
+ *modpybuart.o(.literal*, .text*)
+ *modpybi2c.o(.literal*, .text*)
+ *modmachine.o(.literal*, .text*)
+ *modmachinewdt.o(.literal*, .text*)
+ *modpybspi.o(.literal*, .text*)
+ *modpybhspi.o(.literal*, .text*)
+ *hspi.o(.literal*, .text*)
+ *modesp.o(.literal* .text*)
+ *modnetwork.o(.literal* .text*)
+ *moduos.o(.literal* .text*)
+ *modutime.o(.literal* .text*)
+ *modlwip.o(.literal* .text*)
+ *modsocket.o(.literal* .text*)
+ *modonewire.o(.literal* .text*)
+
+ /* we put as much rodata as possible in this section */
+ /* note that only rodata accessed as a machine word is allowed here */
+ *py/qstr.o(.rodata.const_pool)
+ *.o(.rodata.mp_type_*) /* catches type: mp_obj_type_t */
+ *.o(.rodata.*_locals_dict*) /* catches types: mp_obj_dict_t, mp_map_elem_t */
+ *.o(.rodata.mp_module_*) /* catches types: mp_obj_module_t, mp_obj_dict_t, mp_map_elem_t */
+ */frozen.o(.rodata.mp_frozen_sizes) /* frozen modules */
+ */frozen.o(.rodata.mp_frozen_content) /* frozen modules */
+
+ /* for -mforce-l32 */
+ build/*.o(.rodata*)
+
+ _irom0_text_end = ABSOLUTE(.);
+ } >irom0_0_seg :irom0_0_phdr
+
+ .text : ALIGN(4)
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.UserEnter.text)
+ . = ALIGN(16);
+ *(.DebugExceptionVector.text)
+ . = ALIGN(16);
+ *(.NMIExceptionVector.text)
+ . = ALIGN(16);
+ *(.KernelExceptionVector.text)
+ LONG(0)
+ LONG(0)
+ LONG(0)
+ LONG(0)
+ . = ALIGN(16);
+ *(.UserExceptionVector.text)
+ LONG(0)
+ LONG(0)
+ LONG(0)
+ LONG(0)
+ . = ALIGN(16);
+ *(.DoubleExceptionVector.text)
+ LONG(0)
+ LONG(0)
+ LONG(0)
+ LONG(0)
+ . = ALIGN (16);
+ *(.entry.text)
+ *(.init.literal)
+ *(.init)
+ *(.literal .text .literal.* .text.* .iram0.literal .iram0.text .iram0.text.*.literal .iram0.text.*)
+ *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.fini.literal)
+ *(.fini)
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+ } >iram1_0_seg :iram1_0_phdr
+
+ .lit4 : ALIGN(4)
+ {
+ _lit4_start = ABSOLUTE(.);
+ *(*.lit4)
+ *(.lit4.*)
+ *(.gnu.linkonce.lit4.*)
+ _lit4_end = ABSOLUTE(.);
+ } >iram1_0_seg :iram1_0_phdr
+
+ .data : ALIGN(4)
+ {
+ _data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ *(.jcr)
+ _data_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .rodata : ALIGN(4)
+ {
+ _rodata_start = ABSOLUTE(.);
+ *(.sdk.version)
+ *(.rodata)
+ *(.rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
+ *(.xt_except_table)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ *(.eh_frame)
+ /* C++ constructor and destructor tables, properly ordered: */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* C++ exception handlers table: */
+ __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ . = ALIGN(4); /* this table MUST be 4-byte aligned */
+ _bss_table_start = ABSOLUTE(.);
+ LONG(_bss_start)
+ LONG(_bss_end)
+ _bss_table_end = ABSOLUTE(.);
+ _rodata_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .bss ALIGN(8) (NOLOAD) : ALIGN(4)
+ {
+ . = ALIGN (8);
+ _bss_start = ABSOLUTE(.);
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN (8);
+ _bss_end = ABSOLUTE(.);
+ _heap_start = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_bss_phdr
+}
+
+/* get ROM code address */
+INCLUDE "eagle.rom.addr.v6.ld"
diff --git a/esp8266/mpconfigport_512k.h b/esp8266/mpconfigport_512k.h
new file mode 100644
index 000000000..f0de6035f
--- /dev/null
+++ b/esp8266/mpconfigport_512k.h
@@ -0,0 +1,19 @@
+#include <mpconfigport.h>
+
+#undef MICROPY_FSUSERMOUNT
+#define MICROPY_FSUSERMOUNT (0)
+#undef MICROPY_VFS_FAT
+#define MICROPY_VFS_FAT (0)
+
+#undef MICROPY_PERSISTENT_CODE_LOAD
+#define MICROPY_PERSISTENT_CODE_LOAD (0)
+
+#undef MICROPY_PY_IO_FILEIO
+#define MICROPY_PY_IO_FILEIO (0)
+
+#undef MICROPY_PY_SYS_STDIO_BUFFER
+#define MICROPY_PY_SYS_STDIO_BUFFER (0)
+#undef MICROPY_PY_BUILTINS_SLICE_ATTRS
+#define MICROPY_PY_BUILTINS_SLICE_ATTRS (0)
+#undef MICROPY_PY_ALL_SPECIAL_METHODS
+#define MICROPY_PY_ALL_SPECIAL_METHODS (0)