summaryrefslogtreecommitdiffstatshomepage
path: root/esp8266
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-08-14 16:25:17 +1000
committerDamien George <damien.p.george@gmail.com>2017-08-14 16:25:17 +1000
commit76b564ca4701460a2ad72ef26076c2e339ada506 (patch)
treed054854ace1a9b1fd2832a47e5d4cbe4724f6d48 /esp8266
parenta7f5c64d2157356ff4457d32c662403cea0ddcb7 (diff)
parent5a1d63fc14dae788f705403a43c2d8639b7dd9cd (diff)
downloadmicropython-76b564ca4701460a2ad72ef26076c2e339ada506.tar.gz
micropython-76b564ca4701460a2ad72ef26076c2e339ada506.zip
Merge tag 'v1.8.6' into parse-bytecode
ESP8266 port uses SDK 2.0, has more heap, has support for 512k devices This release brings some code size reductions to the core as well as more tests and improved coverage which is now at 94.3%. The time.ticks_diff(a, b) function has changed: the order of the arguments has been swapped so that it behaves like "a - b", and it can now return a negative number if "a" came before "b" (modulo the period of the ticks functions). For the ESP8266 port the Espressif SDK has been updated to 2.0.0, the heap has been increased from 28k to 36k, and there is support for 512k devices via "make 512k". upip is included by default as frozen bytecode. The network module now allows access-point reconnection without WiFi credentials, and exposes configuration for the station DHCP hostname. The DS18B20 driver now handles negative temperatures, and NeoPixel and APA102 drivers handle 4 bytes-per-pixel LEDs. For the CC3200 port there is now support for loading of precompiled .mpy files and threading now works properly with interrupts. A detailed list of changes follows. py core: - py.mk: automatically add frozen.c to source list if FROZEN_DIR is defined - be more specific with MP_DECLARE_CONST_FUN_OBJ macros - specialise builtin funcs to use separate type for fixed arg count - {modbuiltins,obj}: use MP_PYTHON_PRINTER where possible - modbuiltins: add builtin "slice", pointing to existing slice type - add "delattr" builtin, conditional on MICROPY_CPYTHON_COMPAT - sequence: fix reverse slicing of lists - fix null pointer dereference in mpz.c, fix missing va_end in warning.c - remove asserts that are always true in emitbc.c - fix wrong assumption that m_renew will not move if shrinking - change config default so m_malloc0 uses memset if GC not enabled - add MICROPY_FLOAT_CONST macro for defining float constants - move frozen bytecode Makefile rules from ports to common mk files - strip leading dirs from frozen mpy files, so any path can be used extmod: - vfs_fat_file: check fatfs f_sync() and f_close() returns for errors - vfs_fat_file: make file.close() a no-op if file already closed - utime_mphal: ticks_diff(): switch arg order, return signed value - utime_mphal: add MP_THREAD_GIL_EXIT/ENTER warppers for sleep functions - utime_mphal: implement ticks_add(), add to all maintained ports - utime_mphal: allow ticks functions period be configurable by a port lib: - utils/pyhelp.c: use mp_printf() instead of printf() - utils/pyexec: add mp_hal_set_interrupt_char() prototype - libm: move Thumb-specific sqrtf function to separate file drivers: - add "from micropython import const" when const is used tools: - upgrade upip to 1.1.4: fix error on unix when installing to non-existing absolute path - pip-micropython: remove deprecated wrapper tool - check_code_size.sh: code size validation script for CI - replace upip tarball with just source file, to make its inclusion as frozen modules in multiple ports less magic tests: - extmod/vfs_fat: improve VFS test coverage - basics/builtin_slice: add test for "slice" builtin name - basics: add test for builtin "delattr" - extmod/vfs_fat_fsusermount: improve fsusermount test coverage - extmod/vfs_fat_oldproto: test old block device protocol - basics/gc1: garbage collector threshold() coverage - extmod/uhashlib_sha1: coverage for SHA1 algorithm - extmod/uhashlib_sha256: rename sha256.py test - btree1: fix out of memory error running on esp8266 - extmod/ticks_diff: test for new semantics of ticks_diff() - extmod/framebuf1: test framebuffer pixel clear, and text function minimal port: - Makefile: split rule for firmware.bin generation unix port: - Makefile: remove references to deprecated pip-micropython - modtime: use ticks_diff() implementation from extmod/utime_mphal.c - mphalport.h: add warning of mp_hal_delay_ms() implementation - modtime: switch ticks/sleep_ms/us() to utime_mphal - fix symbol references for x86 Mac - replace upip tarball with just source file windows port: - enable utime_mphal following unix, define mp_hal_ticks_* - fix utime_mphal compilation for msvc - implement mp_hal_ticks_cpu in terms of QueryPerformanceCounter qemu-arm port: - exclude ticks_diff test for qemu-arm port - exclude extmod/vfs_fat_fileio.py test - exclude new vfs_fat tests - enable software floating point support, and float tests stmhal port: - modutime: refactor to use extmod's version of ticks_cpu - refactor pin usage to use mp_hal_pin API - led: refactor LED to use mp_hal_pin_output() init function - Makefile: use standard rules for frozen module generation - modutime: consistently convert to MP_ROM_QSTR/MP_ROM_PTR - enable SD power save (disable CLK on idle) cc3200 port: - use mp_raise_XXX helper functions to reduce code size - mods/pybspi: allow "write" arg of read/readinto to be positional - enable loading of precompiled .mpy files - fix thread mutex's so threading works with interrupts teensy port: - update to provide new mp_hal_pin_XXX functions following stmhal esp8266 port: - Makefile: use latest esptool.py flash size auto-detection - esp_init_data: auto-initialize system params with vendor SDK 2.0.0 - esp8266.ld: move help.o to iROM - esp8266.ld: move modmachine.o to iROM - esp8266.ld: move main.o to iROM - add MP_FASTCODE modifier to put a function to iRAM - main: mark nlr_jump_fail() as MP_FASTCODE - modules/webrepl: enforce only one concurrent WebREPL connection - etshal.h: add few more ESP8266 vendor lib prototypes - modesp: add flash_user_start() function - add support for building firmware version for 512K modules - scripts: make neopixel/apa102 handle 4bpp LEDs with common code - modutime: consistently convert to MP_ROM_QSTR/MP_ROM_PTR - modnetwork: config(): fix copy-paste error in setting "mac" - scripts/port_diag: add descriptions for esf_buf types - modnetwork.c: allows AP reconnection without WiFi credentials - main: bump heap size to 36K - etshal.h: add prototypes for SPIRead/SPIWrite/SPIEraseSector - etshal.h: adjust size of MD5_CTX structure - modules: fix negative temperature in ds18x20 driver - rename "machine" module implementation to use contemporary naming - rework webrepl_setup to run over wired REPL - espneopixel.c: solve glitching LED issues with cpu at 80MHz - include upip as a standard frozen bytecode module - update docs for esptool 1.2.1/SDK 2.0 (--flash_size=detect) - modnetwork.c: expose configuration for station DHCP hostname zephyr port: - implement utime module - use board/SoC values for startup banner based on Zephyr config - initial implementation of machine.Pin - zephyr_getchar: update for recent Zephyr refactor of console hooks - support time -> utime module "weaklink" - README: update for the current featureset, add more info - mpconfigport.h: move less important params to the bottom - Makefile: allow to adjust heap size from make command line - Makefile: update comments to the current state of affairs - Makefile: allow to override Zephyr config from make command line - Makefile: add minimal port - Makefile: add -fomit-frame-pointer to reduce code size - mphalport.h: update for new "unified" kernal API (sleep functions) docs: - machine.SPI: bring up to date with Hardware API, make vendor-neutral - machine.SPI: improve descriptions of xfer methods - library/builtins: add docs for delattr and slice - library/network: reword intro paragraph - library/network: typo fixes, consistent acronym capitalization - library/index: update TOCs so builtins sorted before modules - utime: document ticks_cpu() in more detail - utime: describe new semantics of ticks_diff() (signed ring arithmetics) - utime: add docs for ticks_add(), improvements for other ticks_*() - esp8266: update for new WebREPL setup procedure - */quickref.rst: use new semantics of ticks_diff() - library/machine.Pin: update Pin docs to align with new HW API travis: - integrate tools/check_code_size.sh - minimal: Use CROSS=1, for binary size check examples: - http_server_simplistic: add "not suitable for real use" note - hwapi: example showing best practices for HW API usage in apps - hwapi: add hwconfig for DragonBoard 410c
Diffstat (limited to 'esp8266')
-rw-r--r--esp8266/Makefile61
-rw-r--r--esp8266/README.md9
-rw-r--r--esp8266/esp8266.ld24
-rw-r--r--esp8266/esp8266_512k.ld303
-rw-r--r--esp8266/esp_init_data.c77
-rw-r--r--esp8266/esp_mphal.h2
-rw-r--r--esp8266/espneopixel.c2
-rw-r--r--esp8266/esponewire.c2
-rw-r--r--esp8266/etshal.h10
-rw-r--r--esp8266/fatfs_port.c2
-rw-r--r--esp8266/intr.c2
-rw-r--r--esp8266/machine_adc.c (renamed from esp8266/modpybadc.c)0
-rw-r--r--esp8266/machine_hspi.c (renamed from esp8266/modpybhspi.c)0
-rw-r--r--esp8266/machine_pin.c (renamed from esp8266/modpybpin.c)2
-rw-r--r--esp8266/machine_pwm.c (renamed from esp8266/modpybpwm.c)2
-rw-r--r--esp8266/machine_rtc.c (renamed from esp8266/modpybrtc.c)2
-rw-r--r--esp8266/machine_spi.c (renamed from esp8266/modpybspi.c)0
-rw-r--r--esp8266/machine_uart.c (renamed from esp8266/modpybuart.c)2
-rw-r--r--esp8266/machine_wdt.c (renamed from esp8266/modmachinewdt.c)0
-rw-r--r--esp8266/main.c4
-rw-r--r--esp8266/modesp.c9
-rw-r--r--esp8266/modmachine.c3
-rw-r--r--esp8266/modmachine.h (renamed from esp8266/modpyb.h)9
-rw-r--r--esp8266/modnetwork.c34
-rw-r--r--esp8266/modonewire.c2
-rw-r--r--esp8266/modpyb.c4
-rw-r--r--esp8266/modpybrtc.h34
-rw-r--r--esp8266/modules/ds18x20.py7
-rw-r--r--esp8266/modules/flashbdev.py2
-rw-r--r--esp8266/modules/onewire.py1
l---------esp8266/modules/upip.py1
l---------esp8266/modules/upip_utarfile.py1
-rw-r--r--esp8266/modules/webrepl.py14
-rw-r--r--esp8266/modules/webrepl_setup.py166
-rw-r--r--esp8266/modutime.c28
-rw-r--r--esp8266/mpconfigport.h2
-rw-r--r--esp8266/mpconfigport_512k.h19
-rw-r--r--esp8266/scripts/apa102.py27
-rw-r--r--esp8266/scripts/neopixel.py27
-rw-r--r--esp8266/scripts/port_diag.py4
40 files changed, 665 insertions, 235 deletions
diff --git a/esp8266/Makefile b/esp8266/Makefile
index 65a513afd6..b2191353a2 100644
--- a/esp8266/Makefile
+++ b/esp8266/Makefile
@@ -5,20 +5,19 @@ 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
+FROZEN_MPY_DIR = modules
+
# include py core make definitions
include ../py/py.mk
-MPY_CROSS = ../mpy-cross/mpy-cross
-MPY_TOOL = ../tools/mpy-tool.py
-
-FROZEN_DIR = scripts
-FROZEN_MPY_DIR = modules
PORT ?= /dev/ttyACM0
BAUD ?= 115200
FLASH_MODE ?= qio
-FLASH_SIZE ?= 8m
+FLASH_SIZE ?= detect
CROSS_COMPILE = xtensa-lx106-elf-
ESP_SDK = $(shell $(CC) -print-sysroot)/usr
@@ -44,7 +43,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)
@@ -65,6 +65,7 @@ SRC_C = \
main.c \
help.c \
esp_mphal.c \
+ esp_init_data.c \
gccollect.c \
lexerstr32.c \
uart.c \
@@ -74,22 +75,21 @@ SRC_C = \
espapa102.c \
intr.c \
modpyb.c \
- modpybpin.c \
- modpybpwm.c \
- modpybrtc.c \
- modpybadc.c \
- modpybuart.c \
- modmachinewdt.c \
- modpybspi.c \
- modpybhspi.c \
+ modmachine.c \
+ machine_pin.c \
+ machine_pwm.c \
+ machine_rtc.c \
+ machine_adc.c \
+ machine_uart.c \
+ machine_wdt.c \
+ machine_spi.c \
+ machine_hspi.c \
modesp.c \
modnetwork.c \
modutime.c \
moduos.c \
- modmachine.c \
modonewire.c \
ets_alt_task.c \
- $(BUILD)/frozen.c \
fatfs_port.c \
axtls_helpers.c \
hspi.c \
@@ -130,10 +130,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 \
)
@@ -141,9 +145,6 @@ DRIVERS_SRC_C = $(addprefix drivers/,\
SRC_S = \
gchelper.s \
-FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py')
-FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy))
-
OBJ =
OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
@@ -152,7 +153,6 @@ 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))
-OBJ += $(BUILD)/$(BUILD)/frozen_mpy.o
#OBJ += $(BUILD)/pins_$(BOARD).o
# List of sources for qstr extraction
@@ -175,23 +175,11 @@ $(BUILD)/uart.o: $(CONFVARS_FILE)
FROZEN_EXTRA_DEPS = $(CONFVARS_FILE)
-# to build .mpy files from .py files
-$(BUILD)/$(FROZEN_MPY_DIR)/%.mpy: $(FROZEN_MPY_DIR)/%.py
- @$(ECHO) "MPY $<"
- $(Q)$(MKDIR) -p $(dir $@)
- $(Q)$(MPY_CROSS) -o $@ -s $(^:$(FROZEN_MPY_DIR)/%=%) $^
-
-# to build frozen_mpy.c from all .mpy files
-$(BUILD)/frozen_mpy.c: $(FROZEN_MPY_MPY_FILES) $(BUILD)/genhdr/qstrdefs.generated.h
- @$(ECHO) "Creating $@"
- $(Q)$(PYTHON) $(MPY_TOOL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $(FROZEN_MPY_MPY_FILES) > $@
-
.PHONY: deploy
deploy: $(BUILD)/firmware-combined.bin
$(ECHO) "Writing $< to the board"
$(Q)esptool.py --port $(PORT) --baud $(BAUD) write_flash --verify --flash_size=$(FLASH_SIZE) --flash_mode=$(FLASH_MODE) 0 $<
- #$(Q)esptool.py --port $(PORT) --baud $(BAUD) write_flash --flash_size=8m 0 $(BUILD)/firmware.elf-0x00000.bin 0x9000 $(BUILD)/firmware.elf-0x0[1-f]000.bin
reset:
echo -e "\r\nimport machine; machine.reset()\r\n" >$(PORT)
@@ -206,6 +194,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/README.md b/esp8266/README.md
index c998b7ad18..54591fcc13 100644
--- a/esp8266/README.md
+++ b/esp8266/README.md
@@ -70,13 +70,14 @@ $ make deploy
```
This will use the `esptool.py` script to download the images. You must have
your ESP module in the bootloader mode, and connected to a serial port on your PC.
-The default serial port is `/dev/ttyACM0`, flash mode is `qio` and flash size is `8m`.
-To specify other values, use, eg:
+The default serial port is `/dev/ttyACM0`, flash mode is `qio` and flash size is
+`detect` (auto-detect based on Flash ID). To specify other values, use, eg (note
+that flash size is in megabits):
```bash
-$ make PORT=/dev/ttyUSB0 FLASH_MODE=qio FLASH_SIZE=8m deploy
+$ make PORT=/dev/ttyUSB0 FLASH_MODE=qio FLASH_SIZE=32m deploy
```
-The image produced is `firmware-combined.bin`, to be flashed at 0x00000.
+The image produced is `build/firmware-combined.bin`, to be flashed at 0x00000.
First start
-----------
diff --git a/esp8266/esp8266.ld b/esp8266/esp8266.ld
index c726790d38..20b259dff2 100644
--- a/esp8266/esp8266.ld
+++ b/esp8266/esp8266.ld
@@ -20,7 +20,7 @@ PHDRS
irom0_0_phdr PT_LOAD;
}
-ENTRY(call_user_start)
+ENTRY(firmware_start)
EXTERN(_DebugExceptionVector)
EXTERN(_DoubleExceptionVector)
EXTERN(_KernelExceptionVector)
@@ -130,20 +130,23 @@ SECTIONS
*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*)
+ *machine_pin.o(.literal*, .text*)
+ *machine_pwm.o(.literal*, .text*)
+ *machine_rtc.o(.literal*, .text*)
+ *machine_adc.o(.literal*, .text*)
+ *machine_uart.o(.literal*, .text*)
*modpybi2c.o(.literal*, .text*)
- *modmachinewdt.o(.literal*, .text*)
- *modpybspi.o(.literal*, .text*)
- *modpybhspi.o(.literal*, .text*)
+ *modmachine.o(.literal*, .text*)
+ *machine_wdt.o(.literal*, .text*)
+ *machine_spi.o(.literal*, .text*)
+ *machine_hspi.o(.literal*, .text*)
*hspi.o(.literal*, .text*)
*modesp.o(.literal* .text*)
*modnetwork.o(.literal* .text*)
@@ -199,7 +202,8 @@ SECTIONS
*(.entry.text)
*(.init.literal)
*(.init)
- *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.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)
diff --git a/esp8266/esp8266_512k.ld b/esp8266/esp8266_512k.ld
new file mode 100644
index 0000000000..781cbb985c
--- /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*)
+ *machine_pin.o(.literal*, .text*)
+ *machine_pwm.o(.literal*, .text*)
+ *machine_rtc.o(.literal*, .text*)
+ *machine_adc.o(.literal*, .text*)
+ *machine_uart.o(.literal*, .text*)
+ *modpybi2c.o(.literal*, .text*)
+ *modmachine.o(.literal*, .text*)
+ *machine_wdt.o(.literal*, .text*)
+ *machine_spi.o(.literal*, .text*)
+ *machine_hspi.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/esp_init_data.c b/esp8266/esp_init_data.c
new file mode 100644
index 0000000000..b14de573a7
--- /dev/null
+++ b/esp8266/esp_init_data.c
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016 Paul Sokolovsky
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdio.h>
+#include "ets_sys.h"
+#include "etshal.h"
+#include "esp_mphal.h"
+#include "user_interface.h"
+#include "extmod/misc.h"
+
+NORETURN void call_user_start(void);
+void ets_printf(const char *fmt, ...);
+extern char flashchip;
+
+static const uint8_t default_init_data[] __attribute__((aligned(4))) = {
+0x05, 0x00, 0x04, 0x02, 0x05, 0x05, 0x05, 0x02, 0x05, 0x00, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05,
+0x04, 0xfe, 0xfd, 0xff, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe1, 0x0a, 0xff, 0xff, 0xf8, 0x00,
+0xf8, 0xf8, 0x52, 0x4e, 0x4a, 0x44, 0x40, 0x38, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05,
+0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xe1, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x93, 0x43, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+void firmware_start(void) {
+ // For SDK 1.5.2, either address has shifted and not mirrored in
+ // eagle.rom.addr.v6.ld, or extra initial member was added.
+ SpiFlashChip *flash = (SpiFlashChip*)(&flashchip + 4);
+
+ char buf[128];
+ SPIRead(flash->chip_size - 4 * 0x1000, buf, sizeof(buf));
+ /*for (int i = 0; i < sizeof(buf); i++) {
+ static char hexf[] = "%x ";
+ ets_printf(hexf, buf[i]);
+ }*/
+
+ bool inited = false;
+ for (int i = 0; i < sizeof(buf); i++) {
+ if (buf[i] != 0xff) {
+ inited = true;
+ break;
+ }
+ }
+
+ if (!inited) {
+ static char msg[] = "Writing init data\n";
+ ets_printf(msg);
+ SPIRead((uint32_t)&default_init_data - 0x40200000, buf, sizeof(buf));
+ SPIWrite(flash->chip_size - 4 * 0x1000, buf, sizeof(buf));
+ }
+
+ asm("j call_user_start");
+}
diff --git a/esp8266/esp_mphal.h b/esp8266/esp_mphal.h
index 7a71c0f032..1622667f93 100644
--- a/esp8266/esp_mphal.h
+++ b/esp8266/esp_mphal.h
@@ -75,7 +75,7 @@ void ets_event_poll(void);
// C-level pin HAL
#include "etshal.h"
#include "gpio.h"
-#include "esp8266/modpyb.h"
+#include "esp8266/modmachine.h"
#define mp_hal_pin_obj_t uint32_t
#define mp_hal_get_pin_obj(o) mp_obj_get_pin(o)
void mp_hal_pin_input(mp_hal_pin_obj_t pin);
diff --git a/esp8266/espneopixel.c b/esp8266/espneopixel.c
index 27c7731064..6c76591865 100644
--- a/esp8266/espneopixel.c
+++ b/esp8266/espneopixel.c
@@ -33,7 +33,7 @@ void /*ICACHE_RAM_ATTR*/ esp_neopixel_write(uint8_t pin, uint8_t *pixels, uint32
#ifdef NEO_KHZ400
if(is800KHz) {
#endif
- time0 = fcpu / 2500000; // 0.4us
+ time0 = fcpu / 2857143; // 0.35us
time1 = fcpu / 1250000; // 0.8us
period = fcpu / 800000; // 1.25us per bit
#ifdef NEO_KHZ400
diff --git a/esp8266/esponewire.c b/esp8266/esponewire.c
index 797ec0bd22..22bb45b158 100644
--- a/esp8266/esponewire.c
+++ b/esp8266/esponewire.c
@@ -28,7 +28,7 @@
#include "etshal.h"
#include "user_interface.h"
-#include "modpyb.h"
+#include "modmachine.h"
#include "esponewire.h"
#define TIMING_RESET1 (0)
diff --git a/esp8266/etshal.h b/esp8266/etshal.h
index e7326a43ba..90af63ba2d 100644
--- a/esp8266/etshal.h
+++ b/esp8266/etshal.h
@@ -24,7 +24,9 @@ extern void ets_wdt_disable(void);
extern void wdt_feed(void);
// Opaque structure
-typedef char MD5_CTX[64];
+#ifndef MD5_CTX
+typedef char MD5_CTX[88];
+#endif
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context, const void *data, unsigned int len);
@@ -32,6 +34,12 @@ void MD5Final(unsigned char digest[16], MD5_CTX *context);
// These prototypes are for recent SDKs with "malloc tracking"
void *pvPortMalloc(unsigned sz, const char *fname, int line);
+void *pvPortZalloc(unsigned sz, const char *fname, int line);
+void *pvPortRealloc(void *p, unsigned sz, const char *fname, int line);
void vPortFree(void *p, const char *fname, int line);
+uint32_t SPIRead(uint32_t offset, void *buf, uint32_t len);
+uint32_t SPIWrite(uint32_t offset, const void *buf, uint32_t len);
+uint32_t SPIEraseSector(int sector);
+
#endif // _INCLUDED_ETSHAL_H_
diff --git a/esp8266/fatfs_port.c b/esp8266/fatfs_port.c
index b87906f789..9c84f04e45 100644
--- a/esp8266/fatfs_port.c
+++ b/esp8266/fatfs_port.c
@@ -27,7 +27,7 @@
#include "py/obj.h"
#include "lib/fatfs/ff.h"
#include "timeutils.h"
-#include "modpybrtc.h"
+#include "modmachine.h"
DWORD get_fattime(void) {
diff --git a/esp8266/intr.c b/esp8266/intr.c
index 62da4a721a..456d6cb046 100644
--- a/esp8266/intr.c
+++ b/esp8266/intr.c
@@ -27,7 +27,7 @@
#include "etshal.h"
#include "ets_alt_task.h"
-#include "modpyb.h"
+#include "modmachine.h"
// this is in a separate file so it can go in iRAM
void pin_intr_handler_iram(void *arg) {
diff --git a/esp8266/modpybadc.c b/esp8266/machine_adc.c
index 26b28c50b2..26b28c50b2 100644
--- a/esp8266/modpybadc.c
+++ b/esp8266/machine_adc.c
diff --git a/esp8266/modpybhspi.c b/esp8266/machine_hspi.c
index 10a090269f..10a090269f 100644
--- a/esp8266/modpybhspi.c
+++ b/esp8266/machine_hspi.c
diff --git a/esp8266/modpybpin.c b/esp8266/machine_pin.c
index 8916da64f6..205c58aaee 100644
--- a/esp8266/modpybpin.c
+++ b/esp8266/machine_pin.c
@@ -37,7 +37,7 @@
#include "py/runtime.h"
#include "py/gc.h"
#include "py/mphal.h"
-#include "modpyb.h"
+#include "modmachine.h"
#define GET_TRIGGER(phys_port) \
GPIO_PIN_INT_TYPE_GET(GPIO_REG_READ(GPIO_PIN_ADDR(phys_port)))
diff --git a/esp8266/modpybpwm.c b/esp8266/machine_pwm.c
index 871e4c3dd7..5d30f09656 100644
--- a/esp8266/modpybpwm.c
+++ b/esp8266/machine_pwm.c
@@ -31,7 +31,7 @@
#include "py/nlr.h"
#include "py/runtime.h"
-#include "modpyb.h"
+#include "modmachine.h"
typedef struct _pyb_pwm_obj_t {
mp_obj_base_t base;
diff --git a/esp8266/modpybrtc.c b/esp8266/machine_rtc.c
index d69fc47a8e..54eeea6f6e 100644
--- a/esp8266/modpybrtc.c
+++ b/esp8266/machine_rtc.c
@@ -32,7 +32,7 @@
#include "py/runtime.h"
#include "timeutils.h"
#include "user_interface.h"
-#include "modpyb.h"
+#include "modmachine.h"
typedef struct _pyb_rtc_obj_t {
mp_obj_base_t base;
diff --git a/esp8266/modpybspi.c b/esp8266/machine_spi.c
index e974547111..e974547111 100644
--- a/esp8266/modpybspi.c
+++ b/esp8266/machine_spi.c
diff --git a/esp8266/modpybuart.c b/esp8266/machine_uart.c
index 25320fa1e7..80e10d1310 100644
--- a/esp8266/modpybuart.c
+++ b/esp8266/machine_uart.c
@@ -34,7 +34,7 @@
#include "py/runtime.h"
#include "py/stream.h"
#include "py/mperrno.h"
-#include "modpyb.h"
+#include "modmachine.h"
// UartDev is defined and initialized in rom code.
extern UartDevice UartDev;
diff --git a/esp8266/modmachinewdt.c b/esp8266/machine_wdt.c
index 6dc4c0d18c..6dc4c0d18c 100644
--- a/esp8266/modmachinewdt.c
+++ b/esp8266/machine_wdt.c
diff --git a/esp8266/main.c b/esp8266/main.c
index c938dcb30b..a2e747d211 100644
--- a/esp8266/main.c
+++ b/esp8266/main.c
@@ -39,7 +39,7 @@
#include "gccollect.h"
#include "user_interface.h"
-STATIC char heap[28 * 1024];
+STATIC char heap[36 * 1024];
STATIC void mp_reset(void) {
mp_stack_set_top((void*)0x40000000);
@@ -141,7 +141,7 @@ mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args, mp_map_t *kwargs) {
}
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);
-void nlr_jump_fail(void *val) {
+void MP_FASTCODE(nlr_jump_fail)(void *val) {
printf("NLR jump failed\n");
for (;;) {
}
diff --git a/esp8266/modesp.c b/esp8266/modesp.c
index 515319c9e0..207422b67d 100644
--- a/esp8266/modesp.c
+++ b/esp8266/modesp.c
@@ -45,8 +45,7 @@
#include "mem.h"
#include "espneopixel.h"
#include "espapa102.h"
-#include "modpyb.h"
-#include "modpybrtc.h"
+#include "modmachine.h"
#define MODESP_ESPCONN (0)
@@ -629,6 +628,11 @@ STATIC mp_obj_t esp_flash_size(void) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_flash_size_obj, esp_flash_size);
+STATIC mp_obj_t esp_flash_user_start(void) {
+ return MP_OBJ_NEW_SMALL_INT(0x90000);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_flash_user_start_obj, esp_flash_user_start);
+
STATIC mp_obj_t esp_check_fw(void) {
MD5_CTX ctx;
uint32_t *sz_p = (uint32_t*)0x40208ffc;
@@ -706,6 +710,7 @@ STATIC const mp_map_elem_t esp_module_globals_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_flash_write), (mp_obj_t)&esp_flash_write_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_flash_erase), (mp_obj_t)&esp_flash_erase_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_flash_size), (mp_obj_t)&esp_flash_size_obj },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_flash_user_start), (mp_obj_t)&esp_flash_user_start_obj },
#if MODESP_ESPCONN
{ MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&esp_socket_type },
{ MP_OBJ_NEW_QSTR(MP_QSTR_getaddrinfo), (mp_obj_t)&esp_getaddrinfo_obj },
diff --git a/esp8266/modmachine.c b/esp8266/modmachine.c
index 0ab3c122b7..29a72f7e4a 100644
--- a/esp8266/modmachine.c
+++ b/esp8266/modmachine.c
@@ -33,8 +33,7 @@
#include "extmod/machine_mem.h"
#include "extmod/machine_pulse.h"
#include "extmod/machine_i2c.h"
-#include "modpyb.h"
-#include "modpybrtc.h"
+#include "modmachine.h"
#include "xtirq.h"
#include "os_type.h"
diff --git a/esp8266/modpyb.h b/esp8266/modmachine.h
index 45d0bb8cfd..df7953ecb6 100644
--- a/esp8266/modpyb.h
+++ b/esp8266/modmachine.h
@@ -13,7 +13,7 @@ extern const mp_obj_type_t pyb_spi_type;
extern const mp_obj_type_t pyb_hspi_type;
extern const mp_obj_type_t machine_spi_type;
-MP_DECLARE_CONST_FUN_OBJ(pyb_info_obj);
+MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_info_obj);
typedef struct _pyb_pin_obj_t {
mp_obj_base_t base;
@@ -33,4 +33,11 @@ pyb_pin_obj_t *mp_obj_get_pin_obj(mp_obj_t pin_in);
int pin_get(uint pin);
void pin_set(uint pin, int value);
+extern uint32_t pyb_rtc_alarm0_wake;
+extern uint64_t pyb_rtc_alarm0_expiry;
+
+void pyb_rtc_set_us_since_2000(uint64_t nowus);
+uint64_t pyb_rtc_get_us_since_2000();
+void rtc_prepare_deepsleep(uint64_t sleep_us);
+
#endif // __MICROPY_INCLUDED_ESP8266_MODPYB_H__
diff --git a/esp8266/modnetwork.c b/esp8266/modnetwork.c
index 86bf27ca66..1d8a02bc9b 100644
--- a/esp8266/modnetwork.c
+++ b/esp8266/modnetwork.c
@@ -100,17 +100,23 @@ STATIC mp_obj_t esp_connect(mp_uint_t n_args, const mp_obj_t *args) {
mp_uint_t len;
const char *p;
- p = mp_obj_str_get_data(args[1], &len);
- memcpy(config.ssid, p, len);
- p = mp_obj_str_get_data(args[2], &len);
- memcpy(config.password, p, len);
+ if (n_args > 1) {
+ p = mp_obj_str_get_data(args[1], &len);
+ memcpy(config.ssid, p, len);
+ if (n_args > 2) {
+ p = mp_obj_str_get_data(args[2], &len);
+ } else {
+ p = "";
+ }
+ memcpy(config.password, p, len);
- error_check(wifi_station_set_config(&config), "Cannot set STA config");
+ error_check(wifi_station_set_config(&config), "Cannot set STA config");
+ }
error_check(wifi_station_connect(), "Cannot connect to AP");
return mp_const_none;
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_connect_obj, 3, 7, esp_connect);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_connect_obj, 1, 7, esp_connect);
STATIC mp_obj_t esp_disconnect(mp_obj_t self_in) {
require_if(self_in, STATION_IF);
@@ -295,7 +301,7 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
switch ((uintptr_t)kwargs->table[i].key) {
case QS(MP_QSTR_mac): {
mp_buffer_info_t bufinfo;
- mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
+ mp_get_buffer_raise(kwargs->table[i].value, &bufinfo, MP_BUFFER_READ);
if (bufinfo.len != 6) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
"invalid buffer length"));
@@ -336,6 +342,14 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
cfg.ap.channel = mp_obj_get_int(kwargs->table[i].value);
break;
}
+ case QS(MP_QSTR_dhcp_hostname): {
+ req_if = STATION_IF;
+ if (self->if_id == STATION_IF) {
+ const char *s = mp_obj_str_get_str(kwargs->table[i].value);
+ wifi_station_set_hostname((char*)s);
+ }
+ break;
+ }
default:
goto unknown;
}
@@ -389,6 +403,12 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
req_if = SOFTAP_IF;
val = MP_OBJ_NEW_SMALL_INT(cfg.ap.channel);
break;
+ case QS(MP_QSTR_dhcp_hostname): {
+ req_if = STATION_IF;
+ char* s = wifi_station_get_hostname();
+ val = mp_obj_new_str(s, strlen(s), false);
+ break;
+ }
default:
goto unknown;
}
diff --git a/esp8266/modonewire.c b/esp8266/modonewire.c
index 0d8958ceee..1bf7722409 100644
--- a/esp8266/modonewire.c
+++ b/esp8266/modonewire.c
@@ -29,7 +29,7 @@
#include "py/obj.h"
#include "py/mphal.h"
-#include "modpyb.h"
+#include "modmachine.h"
#include "esponewire.h"
STATIC mp_obj_t onewire_timings(mp_obj_t timings_in) {
diff --git a/esp8266/modpyb.c b/esp8266/modpyb.c
index ba53e71b37..9fe8039bc6 100644
--- a/esp8266/modpyb.c
+++ b/esp8266/modpyb.c
@@ -28,12 +28,12 @@
#include "py/gc.h"
#include "gccollect.h"
-#include "modpyb.h"
+#include "modmachine.h"
// The pyb module no longer exists since all functionality now appears
// elsewhere, in more standard places (eg time, machine modules). The
// only remaining function is pyb.info() which has been moved to the
-// esp module, pending deletion/renaming/moving elsewher.
+// esp module, pending deletion/renaming/moving elsewhere.
STATIC mp_obj_t pyb_info(mp_uint_t n_args, const mp_obj_t *args) {
// print info about memory
diff --git a/esp8266/modpybrtc.h b/esp8266/modpybrtc.h
deleted file mode 100644
index 5b9d9fc766..0000000000
--- a/esp8266/modpybrtc.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * This file is part of the Micro Python project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 Josef Gajdusek
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-extern uint32_t pyb_rtc_alarm0_wake;
-extern uint64_t pyb_rtc_alarm0_expiry;
-
-void pyb_rtc_set_us_since_2000(uint64_t nowus);
-
-uint64_t pyb_rtc_get_us_since_2000();
-
-void rtc_prepare_deepsleep(uint64_t sleep_us);
diff --git a/esp8266/modules/ds18x20.py b/esp8266/modules/ds18x20.py
index eb22e2ae30..bf06094835 100644
--- a/esp8266/modules/ds18x20.py
+++ b/esp8266/modules/ds18x20.py
@@ -1,6 +1,8 @@
# DS18x20 temperature sensor driver for MicroPython.
# MIT license; Copyright (c) 2016 Damien P. George
+from micropython import const
+
_CONVERT = const(0x44)
_RD_SCRATCH = const(0xbe)
_WR_SCRATCH = const(0x4e)
@@ -43,4 +45,7 @@ class DS18X20:
t = buf[0] >> 1
return t - 0.25 + (buf[7] - buf[6]) / buf[7]
else:
- return (buf[1] << 8 | buf[0]) / 16
+ t = buf[1] << 8 | buf[0]
+ if t & 0x8000: # sign bit set
+ t = -((t ^ 0xffff) + 1)
+ return t / 16
diff --git a/esp8266/modules/flashbdev.py b/esp8266/modules/flashbdev.py
index 98b0208fb6..e879895fb0 100644
--- a/esp8266/modules/flashbdev.py
+++ b/esp8266/modules/flashbdev.py
@@ -3,7 +3,7 @@ import esp
class FlashBdev:
SEC_SIZE = 4096
- START_SEC = 0x90000 // SEC_SIZE
+ START_SEC = esp.flash_user_start() // SEC_SIZE
NUM_BLK = 0x6b
def __init__(self, blocks=NUM_BLK):
diff --git a/esp8266/modules/onewire.py b/esp8266/modules/onewire.py
index 06b216a57a..83318d1a47 100644
--- a/esp8266/modules/onewire.py
+++ b/esp8266/modules/onewire.py
@@ -1,6 +1,7 @@
# 1-Wire driver for MicroPython on ESP8266
# MIT license; Copyright (c) 2016 Damien P. George
+from micropython import const
import _onewire as _ow
class OneWireError(Exception):
diff --git a/esp8266/modules/upip.py b/esp8266/modules/upip.py
new file mode 120000
index 0000000000..20d52a4ab7
--- /dev/null
+++ b/esp8266/modules/upip.py
@@ -0,0 +1 @@
+../../tools/upip.py \ No newline at end of file
diff --git a/esp8266/modules/upip_utarfile.py b/esp8266/modules/upip_utarfile.py
new file mode 120000
index 0000000000..1498862916
--- /dev/null
+++ b/esp8266/modules/upip_utarfile.py
@@ -0,0 +1 @@
+../../tools/upip_utarfile.py \ No newline at end of file
diff --git a/esp8266/modules/webrepl.py b/esp8266/modules/webrepl.py
index da3e70c595..5a76e9b26d 100644
--- a/esp8266/modules/webrepl.py
+++ b/esp8266/modules/webrepl.py
@@ -31,6 +31,10 @@ def setup_conn(port, accept_handler):
def accept_conn(listen_sock):
global client_s
cl, remote_addr = listen_sock.accept()
+ if uos.dupterm():
+ print("\nConcurrent WebREPL connection from", remote_addr, "rejected")
+ cl.close()
+ return
print("\nWebREPL connection from:", remote_addr)
client_s = cl
websocket_helper.server_handshake(cl)
@@ -55,18 +59,16 @@ def start(port=8266, password=None):
stop()
if password is None:
try:
- import port_config
- _webrepl.password(port_config.WEBREPL_PASS)
+ import webrepl_cfg
+ _webrepl.password(webrepl_cfg.PASS)
setup_conn(port, accept_conn)
print("Started webrepl in normal mode")
except:
- import webrepl_setup
- setup_conn(port, webrepl_setup.handle_conn)
- print("Started webrepl in setup mode")
+ print("WebREPL is not configured, run 'import webrepl_setup'")
else:
_webrepl.password(password)
setup_conn(port, accept_conn)
- print("Started webrepl in normal mode")
+ print("Started webrepl in manual override mode")
def start_foreground(port=8266):
diff --git a/esp8266/modules/webrepl_setup.py b/esp8266/modules/webrepl_setup.py
index d0bf8465d5..d91600e6ec 100644
--- a/esp8266/modules/webrepl_setup.py
+++ b/esp8266/modules/webrepl_setup.py
@@ -1,83 +1,111 @@
import sys
-import socket
-import time
+#import uos as os
+import os
+import machine
-from websocket import *
-import websocket_helper
+RC = "./boot.py"
+CONFIG = "./webrepl_cfg.py"
-
-def setup_server():
- s = socket.socket()
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- ai = socket.getaddrinfo("0.0.0.0", 8266)
- addr = ai[0][4]
-
- s.bind(addr)
- s.listen(1)
- return s
-
-def getpass(stream, prompt):
- stream.write(prompt)
- passwd = b""
+def input_choice(prompt, choices):
while 1:
- c = stream.read(1)
- if c in (b"\r", b"\n"):
- stream.write("\r\n")
- return passwd
- passwd += c
- stream.write("*")
-
-def handle_conn(listen_sock):
- cl, remote_addr = listen_sock.accept()
-
- print("""
-
-First-time WebREPL connection has been received. WebREPL initial setup
-will now start over this connection. During setup, UART REPL will be
-non-responsive. After setup finishes, the board will be rebooted. In
-case of error during setup, current session will continue.
-
-If you receive this message unexpectedly, it may mean that your WebREPL
-connection is being hacked (power off board if unsure).
-""")
-
- websocket_helper.server_handshake(cl)
- ws = websocket(cl)
-
- ws.write("""\
-Welcome to MicroPython WebREPL!\r
-\r
-This is the first time you connect to WebREPL, so please set a password\r
-to use for the following WebREPL sessions. Once you enter the password\r
-twice, your board will reboot with WebREPL running in active mode. On\r
-some boards, you may need to press reset button or reconnect power.\r
-\r
-""")
+ resp = input(prompt)
+ if resp in choices:
+ return resp
+def getpass(prompt):
+ return input(prompt)
+
+def input_pass():
while 1:
- passwd1 = getpass(ws, "New password: ")
+ passwd1 = getpass("New password: ")
if len(passwd1) < 4:
- ws.write("Password too short\r\n")
+ print("Password too short")
continue
elif len(passwd1) > 9:
- ws.write("Password too long\r\n")
+ print("Password too long")
continue
- passwd2 = getpass(ws, "Confirm password: ")
+ passwd2 = getpass("Confirm password: ")
if passwd1 == passwd2:
- break
- ws.write("Passwords do not match\r\n")
-
- with open("port_config.py", "w") as f:
- f.write("WEBREPL_PASS = %r\n" % passwd1.decode("ascii"))
+ return passwd1
+ print("Passwords do not match")
- ws.write("Password successfully set, restarting...\r\n")
- cl.close()
- time.sleep(2)
- import machine
- machine.reset()
+def exists(fname):
+ try:
+ with open(fname):
+ pass
+ return True
+ except OSError:
+ return False
-def test():
- s = setup_server()
- handle_conn(s)
+def copy_stream(s_in, s_out):
+ buf = bytearray(64)
+ while 1:
+ sz = s_in.readinto(buf)
+ s_out.write(buf, sz)
+
+
+def get_daemon_status():
+ with open(RC) as f:
+ for l in f:
+ if "webrepl" in l:
+ if l.startswith("#"):
+ return False
+ return True
+ return None
+
+def add_daemon():
+ with open(RC) as old_f, open(RC + ".tmp", "w") as new_f:
+ new_f.write("import webrepl\nwebrepl.start()\n")
+ copy_stream(old_f, new_f)
+
+def change_daemon(action):
+ LINES = ("import webrepl", "webrepl.start()")
+ with open(RC) as old_f, open(RC + ".tmp", "w") as new_f:
+ for l in old_f:
+ for patt in LINES:
+ if patt in l:
+ if action and l.startswith("#"):
+ l = l[1:]
+ elif not action and not l.startswith("#"):
+ l = "#" + l
+ new_f.write(l)
+ # FatFs rename() is not POSIX compliant, will raise OSError if
+ # dest file exists.
+ os.remove(RC)
+ os.rename(RC + ".tmp", RC)
+
+
+def main():
+ status = get_daemon_status()
+
+ print("WebREPL daemon auto-start status:", "enabled" if status else "disabled")
+ print("\nWould you like to (E)nable or (D)isable it running on boot?")
+ print("(Empty line to quit)")
+ resp = input("> ").upper()
+
+ if resp == "E":
+ if exists(CONFIG):
+ resp2 = input_choice("Would you like to change WebREPL password? (y/n) ", ("y", "n", ""))
+ else:
+ print("To enable WebREPL, you must set password for it")
+ resp2 = "y"
+
+ if resp2 == "y":
+ passwd = input_pass()
+ with open(CONFIG, "w") as f:
+ f.write("PASS = %r\n" % passwd)
+
+
+ if resp not in ("D", "E") or (resp == "D" and not status) or (resp == "E" and status):
+ print("No further action required")
+ sys.exit()
+
+ change_daemon(resp == "E")
+
+ print("Changes will be activated after reboot")
+ resp = input_choice("Would you like to reboot now? (y/n) ", ("y", "n", ""))
+ if resp == "y":
+ machine.reset()
+
+main()
diff --git a/esp8266/modutime.c b/esp8266/modutime.c
index abfe069cc3..2adb6c563b 100644
--- a/esp8266/modutime.c
+++ b/esp8266/modutime.c
@@ -34,8 +34,7 @@
#include "py/runtime.h"
#include "py/mphal.h"
#include "py/smallint.h"
-#include "modpyb.h"
-#include "modpybrtc.h"
+#include "modmachine.h"
#include "timeutils.h"
#include "user_interface.h"
#include "extmod/utime_mphal.h"
@@ -108,19 +107,20 @@ STATIC mp_obj_t time_time(void) {
}
MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time);
-STATIC const mp_map_elem_t time_module_globals_table[] = {
- { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_utime) },
+STATIC const mp_rom_map_elem_t time_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) },
- { MP_OBJ_NEW_QSTR(MP_QSTR_localtime), (mp_obj_t)&time_localtime_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_mktime), (mp_obj_t)&time_mktime_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t)&mp_utime_sleep_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_sleep_ms), (mp_obj_t)&mp_utime_sleep_ms_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_sleep_us), (mp_obj_t)&mp_utime_sleep_us_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_ticks_ms), (mp_obj_t)&mp_utime_ticks_ms_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_ticks_us), (mp_obj_t)&mp_utime_ticks_us_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_ticks_cpu), (mp_obj_t)&mp_utime_ticks_cpu_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_ticks_diff), (mp_obj_t)&mp_utime_ticks_diff_obj },
- { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_time_obj },
+ { MP_ROM_QSTR(MP_QSTR_localtime), MP_ROM_PTR(&time_localtime_obj) },
+ { MP_ROM_QSTR(MP_QSTR_mktime), MP_ROM_PTR(&time_mktime_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&mp_utime_ticks_ms_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ticks_us), MP_ROM_PTR(&mp_utime_ticks_us_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ticks_cpu), MP_ROM_PTR(&mp_utime_ticks_cpu_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ticks_add), MP_ROM_PTR(&mp_utime_ticks_add_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj) },
+ { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) },
};
STATIC MP_DEFINE_CONST_DICT(time_module_globals, time_module_globals_table);
diff --git a/esp8266/mpconfigport.h b/esp8266/mpconfigport.h
index 201057f128..602b3e9c81 100644
--- a/esp8266/mpconfigport.h
+++ b/esp8266/mpconfigport.h
@@ -182,4 +182,6 @@ extern const struct _mp_obj_module_t onewire_module;
#define MICROPY_HW_MCU_NAME "ESP8266"
#define MICROPY_PY_SYS_PLATFORM "esp8266"
+#define MP_FASTCODE(n) __attribute__((section(".iram0.text." #n))) n
+
#define _assert(expr) ((expr) ? (void)0 : __assert_func(__FILE__, __LINE__, __func__, #expr))
diff --git a/esp8266/mpconfigport_512k.h b/esp8266/mpconfigport_512k.h
new file mode 100644
index 0000000000..f0de6035f1
--- /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)
diff --git a/esp8266/scripts/apa102.py b/esp8266/scripts/apa102.py
index 126448cc20..41b7c0485c 100644
--- a/esp8266/scripts/apa102.py
+++ b/esp8266/scripts/apa102.py
@@ -2,27 +2,16 @@
# MIT license; Copyright (c) 2016 Robert Foss, Daniel Busch
from esp import apa102_write
+from neopixel import NeoPixel
-class APA102:
- def __init__(self, clock_pin, data_pin, n):
- self.clock_pin = clock_pin
- self.data_pin = data_pin
- self.n = n
- self.buf = bytearray(n * 4)
-
- self.clock_pin.init(clock_pin.OUT)
- self.data_pin.init(data_pin.OUT)
- def __setitem__(self, index, val):
- r, g, b, brightness = val
- self.buf[index * 4] = r
- self.buf[index * 4 + 1] = g
- self.buf[index * 4 + 2] = b
- self.buf[index * 4 + 3] = brightness
+class APA102(NeoPixel):
+ ORDER = (0, 1, 2, 3)
- def __getitem__(self, index):
- i = index * 4
- return self.buf[i], self.buf[i + 1], self.buf[i + 2], self.buf[i + 3]
+ def __init__(self, clock_pin, data_pin, n, bpp=4):
+ super().__init__(data_pin, n, bpp)
+ self.clock_pin = clock_pin
+ self.clock_pin.init(clock_pin.OUT)
def write(self):
- apa102_write(self.clock_pin, self.data_pin, self.buf)
+ apa102_write(self.clock_pin, self.pin, self.buf)
diff --git a/esp8266/scripts/neopixel.py b/esp8266/scripts/neopixel.py
index 8aa0348680..b13424d7d8 100644
--- a/esp8266/scripts/neopixel.py
+++ b/esp8266/scripts/neopixel.py
@@ -3,29 +3,30 @@
from esp import neopixel_write
+
class NeoPixel:
- def __init__(self, pin, n):
+ ORDER = (1, 0, 2, 3)
+
+ def __init__(self, pin, n, bpp=3):
self.pin = pin
self.n = n
- self.buf = bytearray(n * 3)
+ self.bpp = bpp
+ self.buf = bytearray(n * bpp)
self.pin.init(pin.OUT)
def __setitem__(self, index, val):
- r, g, b = val
- self.buf[index * 3] = g
- self.buf[index * 3 + 1] = r
- self.buf[index * 3 + 2] = b
+ offset = index * self.bpp
+ for i in range(self.bpp):
+ self.buf[offset + self.ORDER[i]] = val[i]
def __getitem__(self, index):
- i = index * 3
- return self.buf[i + 1], self.buf[i], self.buf[i + 2]
+ offset = index * self.bpp
+ return tuple(self.buf[offset + self.ORDER[i]]
+ for i in range(self.bpp))
def fill(self, color):
- r, g, b = color
- for i in range(len(self.buf) / 3):
- self.buf[i * 3] = g
- self.buf[i * 3 + 1] = r
- self.buf[i * 3 + 2] = b
+ for i in range(self.n):
+ self[i] = color
def write(self):
neopixel_write(self.pin, self.buf, True)
diff --git a/esp8266/scripts/port_diag.py b/esp8266/scripts/port_diag.py
index f2abd8066d..ef8800355a 100644
--- a/esp8266/scripts/port_diag.py
+++ b/esp8266/scripts/port_diag.py
@@ -24,8 +24,8 @@ def main():
print("STA ifconfig:", network.WLAN(network.STA_IF).ifconfig())
print("AP ifconfig:", network.WLAN(network.AP_IF).ifconfig())
print("Free WiFi driver buffers of type:")
- for i in range(5):
- print("%d: %d" % (i, esp.esf_free_bufs(i)))
+ for i, comm in enumerate(("1,2 TX", "4 Mngmt TX(len: 0x41-0x100)", "5 Mngmt TX (len: 0-0x40)", "7", "8 RX")):
+ print("%d: %d (%s)" % (i, esp.esf_free_bufs(i), comm))
print("lwIP PCBs:")
lwip.print_pcbs()