2016-11-03 15:50:59 -07:00
# Select the board to build for: if not given on the command line,
# then default to PYBV10.
BOARD ?= feather_huzzah
i f e q ( $( wildcard boards /$ ( BOARD ) /.) , )
$( error Invalid BOARD specified )
e n d i f
# If the build directory is not given, make it reflect the board name.
2016-11-30 15:08:34 -08:00
BUILD ?= build
i n c l u d e . . / p y / m k e n v . m k
2016-11-03 15:50:59 -07:00
2014-11-27 20:30:33 +00:00
# qstr definitions (must come before including py.mk)
QSTR_DEFS = qstrdefsport.h #$(BUILD)/pins_qstr.h
2016-04-28 00:46:51 +03:00
MICROPY_PY_USSL = 1
2016-07-13 01:59:41 +03:00
MICROPY_SSL_AXTLS = 1
2016-10-25 00:37:33 +03:00
MICROPY_FATFS = 1
2016-07-31 02:39:59 +03:00
MICROPY_PY_BTREE = 1
2016-04-28 00:46:51 +03:00
2016-10-21 01:08:43 +03:00
FROZEN_DIR = scripts
FROZEN_MPY_DIR = modules
2014-11-27 20:30:33 +00:00
# include py core make definitions
i n c l u d e . . / p y / p y . m k
2017-01-02 19:29:41 +03:00
FWBIN = $( BUILD) /firmware-combined.bin
2015-12-22 10:44:08 +00:00
PORT ?= /dev/ttyACM0
2015-12-30 18:37:58 +00:00
BAUD ?= 115200
2016-09-26 22:22:39 +02:00
FLASH_MODE ?= qio
2016-10-18 00:06:59 +03:00
FLASH_SIZE ?= detect
2014-11-27 20:30:33 +00:00
CROSS_COMPILE = xtensa-lx106-elf-
2014-11-28 18:05:25 +00:00
ESP_SDK = $( shell $( CC) -print-sysroot) /usr
2014-11-27 20:30:33 +00:00
2015-10-19 18:22:16 +03:00
INC += -I.
2014-12-29 01:02:19 +00:00
INC += -I..
2014-11-27 20:30:33 +00:00
INC += -I../stmhal
2015-01-12 04:21:58 +02:00
INC += -I../lib/mp-readline
2015-05-02 21:24:25 +02:00
INC += -I../lib/netutils
2015-05-11 21:11:37 +02:00
INC += -I../lib/timeutils
2014-11-27 20:30:33 +00:00
INC += -I$( BUILD)
INC += -I$( ESP_SDK) /include
2016-03-29 21:10:10 +03:00
# UART for "os" messages. 0 is normal UART as used by MicroPython REPL,
2016-05-27 00:44:05 +03:00
# 1 is debug UART (tx only), -1 to disable.
2016-03-29 21:10:10 +03:00
UART_OS = 0
2015-05-13 15:39:25 +02:00
2014-11-27 20:30:33 +00:00
CFLAGS_XTENSA = -fsingle-precision-constant -Wdouble-promotion \
-D__ets__ -DICACHE_FLASH \
-fno-inline-functions \
2016-04-27 00:35:13 +03:00
-Wl,-EL -mlongcalls -mtext-section-literals -mforce-l32 \
2016-03-08 10:29:05 +07:00
-DLWIP_OPEN_SRC
2014-11-27 20:30:33 +00:00
2015-05-13 15:39:25 +02:00
CFLAGS = $( INC) -Wall -Wpointer-arith -Werror -ansi -std= gnu99 -nostdlib -DUART_OS= $( UART_OS) \
2016-04-28 00:44:52 +03:00
$( CFLAGS_XTENSA) $( CFLAGS_MOD) $( COPT) $( CFLAGS_EXTRA)
2014-11-27 20:30:33 +00:00
2016-10-25 00:37:33 +03:00
LDSCRIPT = esp8266.ld
LDFLAGS = -nostdlib -T $( LDSCRIPT) -Map= $( @:.elf= .map) --cref
2016-04-28 00:44:52 +03:00
LIBS = -L$( ESP_SDK) /lib -lmain -ljson -llwip_open -lpp -lnet80211 -lwpa -lphy -lnet80211 $( LDFLAGS_MOD)
2014-11-27 20:30:33 +00:00
LIBGCC_FILE_NAME = $( shell $( CC) $( CFLAGS) -print-libgcc-file-name)
2014-11-28 14:58:25 +00:00
LIBS += -L$( dir $( LIBGCC_FILE_NAME) ) -lgcc
2014-11-27 20:30:33 +00:00
# Debugging/Optimization
i f e q ( $( DEBUG ) , 1 )
CFLAGS += -g
COPT = -O0
e l s e
CFLAGS += -fdata-sections -ffunction-sections
2016-04-27 00:35:13 +03:00
COPT += -Os -DNDEBUG
2014-11-27 20:30:33 +00:00
LDFLAGS += --gc-sections
e n d i f
SRC_C = \
2014-11-28 14:58:25 +00:00
strtoll.c \
2014-11-27 20:30:33 +00:00
main.c \
2016-04-29 00:17:11 +03:00
help.c \
2014-11-27 20:30:33 +00:00
esp_mphal.c \
2016-10-18 15:18:07 +03:00
esp_init_data.c \
2014-11-27 20:30:33 +00:00
gccollect.c \
2016-03-17 23:06:47 +08:00
lexerstr32.c \
2014-11-27 20:30:33 +00:00
uart.c \
2016-03-02 13:37:27 +00:00
esppwm.c \
2016-04-14 12:33:54 +01:00
esponewire.c \
2016-02-11 13:19:11 +00:00
espneopixel.c \
2016-03-28 01:58:14 +02:00
espapa102.c \
2016-04-14 11:15:43 +01:00
intr.c \
2014-11-27 20:30:33 +00:00
modpyb.c \
2016-11-06 01:30:19 +03:00
modmachine.c \
machine_pin.c \
machine_pwm.c \
machine_rtc.c \
machine_adc.c \
machine_uart.c \
machine_wdt.c \
machine_hspi.c \
2015-01-23 00:34:16 +02:00
modesp.c \
2015-06-12 17:16:52 +03:00
modnetwork.c \
2015-05-11 21:11:37 +02:00
modutime.c \
2015-05-18 18:35:25 +02:00
moduos.c \
2015-12-29 00:20:34 +00:00
modonewire.c \
2016-03-11 09:43:39 +07:00
ets_alt_task.c \
2016-04-16 12:47:17 +01:00
fatfs_port.c \
2016-04-27 13:45:44 +03:00
axtls_helpers.c \
2016-06-07 21:40:56 +02:00
hspi.c \
2016-11-03 15:50:59 -07:00
boards/$( BOARD) /pins.c \
2016-07-31 02:39:59 +03:00
$( SRC_MOD)
2014-11-27 20:30:33 +00:00
2016-11-03 15:50:59 -07:00
SRC_COMMON_HAL = \
microcontroller/__init__.c \
microcontroller/Pin.c \
nativeio/__init__.c \
nativeio/AnalogIn.c \
nativeio/AnalogOut.c \
nativeio/DigitalInOut.c \
nativeio/I2C.c \
2017-03-13 21:55:11 +01:00
nativeio/PulseIn.c \
2017-03-10 19:17:54 +01:00
nativeio/PulseOut.c \
2016-11-03 15:50:59 -07:00
nativeio/PWMOut.c \
nativeio/SPI.c \
2016-12-06 18:39:18 -08:00
nativeio/TouchIn.c \
2016-12-19 17:32:40 -08:00
nativeio/UART.c \
2016-11-03 15:50:59 -07:00
neopixel_write/__init__.c \
time/__init__.c \
board/__init__.c
SRC_COMMON_HAL_EXPANDED = $( addprefix shared-bindings/, $( SRC_COMMON_HAL) ) \
$( addprefix common-hal/, $( SRC_COMMON_HAL) )
SRC_SHARED_MODULE = \
bitbangio/__init__.c \
bitbangio/I2C.c \
bitbangio/SPI.c \
SRC_SHARED_MODULE_EXPANDED = $( addprefix shared-bindings/, $( SRC_SHARED_MODULE) ) \
$( addprefix shared-module/, $( SRC_SHARED_MODULE) )
2014-11-27 20:30:33 +00:00
STM_SRC_C = $( addprefix stmhal/,\
2015-02-13 15:04:53 +00:00
pybstdio.c \
2016-04-15 00:08:39 +03:00
input.c \
2015-01-12 04:21:58 +02:00
)
2016-01-01 16:12:39 +00:00
EXTMOD_SRC_C = $( addprefix extmod/,\
2016-04-16 12:47:17 +01:00
modlwip.c \
2016-01-01 16:12:39 +00:00
)
2015-01-12 04:21:58 +02:00
LIB_SRC_C = $( addprefix lib/,\
2015-04-05 21:44:20 +03:00
libc/string0.c \
2015-12-18 21:07:58 +00:00
libm/math.c \
libm/fmodf.c \
libm/roundf.c \
libm/ef_sqrt.c \
2015-12-18 21:43:01 +00:00
libm/kf_rem_pio2.c \
libm/kf_sin.c \
libm/kf_cos.c \
libm/kf_tan.c \
libm/ef_rem_pio2.c \
libm/sf_sin.c \
libm/sf_cos.c \
libm/sf_tan.c \
libm/sf_frexp.c \
libm/sf_modf.c \
libm/sf_ldexp.c \
libm/asinfacosf.c \
libm/atanf.c \
libm/atan2f.c \
2015-01-12 04:21:58 +02:00
mp-readline/readline.c \
2015-05-02 21:24:25 +02:00
netutils/netutils.c \
2015-05-11 21:11:37 +02:00
timeutils/timeutils.c \
2017-02-19 16:11:33 +01:00
utils/context_manager_helpers.c \
2015-10-31 19:35:10 +03:00
utils/pyexec.c \
2016-04-29 00:17:11 +03:00
utils/pyhelp.c \
2016-09-29 10:13:17 -07:00
utils/interrupt_char.c \
2014-11-27 20:30:33 +00:00
)
2016-10-25 00:37:33 +03:00
i f e q ( $( MICROPY_FATFS ) , 1 )
LIB_SRC_C += \
lib/fatfs/ff.c \
lib/fatfs/option/ccsbcs.c
e n d i f
2016-05-26 17:11:43 +01:00
DRIVERS_SRC_C = $( addprefix drivers/,\
dht/dht.c \
)
2014-11-27 20:30:33 +00:00
SRC_S = \
gchelper.s \
OBJ =
OBJ += $( PY_O)
OBJ += $( addprefix $( BUILD) /, $( SRC_C:.c= .o) )
OBJ += $( addprefix $( BUILD) /, $( SRC_S:.s= .o) )
2016-11-03 15:50:59 -07:00
OBJ += $( addprefix $( BUILD) /, $( SRC_COMMON_HAL_EXPANDED:.c= .o) )
OBJ += $( addprefix $( BUILD) /, $( SRC_SHARED_MODULE_EXPANDED:.c= .o) )
2014-11-27 20:30:33 +00:00
OBJ += $( addprefix $( BUILD) /, $( STM_SRC_C:.c= .o) )
2016-01-01 16:12:39 +00:00
OBJ += $( addprefix $( BUILD) /, $( EXTMOD_SRC_C:.c= .o) )
2015-01-12 04:21:58 +02:00
OBJ += $( addprefix $( BUILD) /, $( LIB_SRC_C:.c= .o) )
2016-05-26 17:11:43 +01:00
OBJ += $( addprefix $( BUILD) /, $( DRIVERS_SRC_C:.c= .o) )
2014-11-27 20:30:33 +00:00
#OBJ += $(BUILD)/pins_$(BOARD).o
2016-04-16 12:47:17 +01:00
# List of sources for qstr extraction
2016-11-03 15:50:59 -07:00
SRC_QSTR += $( SRC_C) $( SRC_COMMON_HAL_EXPANDED) $( SRC_SHARED_MODULE_EXPANDED) $( STM_SRC_C) $( EXTMOD_SRC_C) $( DRIVERS_SRC_C)
2016-04-16 12:47:17 +01:00
# Append any auto-generated sources that are needed by sources listed in SRC_QSTR
SRC_QSTR_AUTO_DEPS +=
2017-01-02 19:29:41 +03:00
all : $( BUILD ) /libaxtls .a $( FWBIN )
2014-11-27 20:30:33 +00:00
2015-05-13 15:39:25 +02:00
CONFVARS_FILE = $( BUILD) /confvars
2015-05-06 00:19:26 +02:00
2015-05-13 15:39:25 +02:00
i f e q ( $( wildcard $ ( CONFVARS_FILE ) ) , )
2015-05-06 00:19:26 +02:00
$( shell $ ( MKDIR ) -p $ ( BUILD ) )
2016-09-17 20:24:28 +03:00
$( shell echo $ ( FROZEN_DIR ) $ ( UART_OS ) > $ ( CONFVARS_FILE ) )
e l s e i f n e q ( $( shell cat $ ( CONFVARS_FILE ) ) , $( FROZEN_DIR ) $( UART_OS ) )
$( shell echo $ ( FROZEN_DIR ) $ ( UART_OS ) > $ ( CONFVARS_FILE ) )
2015-05-06 00:19:26 +02:00
e n d i f
2015-05-13 15:39:25 +02:00
$(BUILD)/uart.o : $( CONFVARS_FILE )
2016-09-17 20:57:43 +03:00
FROZEN_EXTRA_DEPS = $( CONFVARS_FILE)
2015-05-06 00:19:26 +02:00
2014-11-27 20:30:33 +00:00
.PHONY : deploy
deploy : $( BUILD ) /firmware -combined .bin
$( ECHO) " Writing $< to the board "
2016-09-26 22:22:39 +02:00
$( Q) esptool.py --port $( PORT) --baud $( BAUD) write_flash --verify --flash_size= $( FLASH_SIZE) --flash_mode= $( FLASH_MODE) 0 $<
2014-11-27 20:30:33 +00:00
2016-12-15 00:34:40 +11:00
erase :
$( ECHO) "Erase flash"
$( Q) esptool.py --port $( PORT) --baud $( BAUD) erase_flash
2015-01-31 00:51:12 +02:00
reset :
2016-04-28 12:23:55 +01:00
echo -e "\r\nimport machine; machine.reset()\r\n" >$( PORT)
2015-01-31 00:51:12 +02:00
2017-01-02 19:29:41 +03:00
$(FWBIN) : $( BUILD ) /firmware .elf
2014-11-27 20:30:33 +00:00
$( ECHO) " Create $@ "
2016-11-28 19:47:59 -08:00
$( Q) python2 $( shell which esptool.py) elf2image $^
2016-12-14 17:44:05 +03:00
$( Q) $( PYTHON) makeimg.py $( BUILD) /firmware.elf-0x00000.bin $( BUILD) /firmware.elf-0x[ 0-5] [ 1-f] 000.bin $@
2014-11-27 20:30:33 +00:00
$(BUILD)/firmware.elf : $( OBJ )
2017-02-24 15:59:59 +01:00
$( STEPECHO) " LINK $@ "
2015-10-24 02:26:10 +03:00
$( Q) $( LD) $( LDFLAGS) -o $@ $^ $( LIBS)
2014-11-27 20:30:33 +00:00
$( Q) $( SIZE) $@
2016-10-25 00:37:33 +03:00
512k :
$( MAKE) LDSCRIPT = esp8266_512k.ld CFLAGS_EXTRA = '-DMP_CONFIGFILE="<mpconfigport_512k.h>"' MICROPY_FATFS = 0 MICROPY_PY_BTREE = 0
2016-12-14 17:44:05 +03:00
ota :
2016-12-20 23:23:45 +03:00
rm -f $( BUILD) /firmware.elf $( BUILD) /firmware.elf*.bin
2017-01-04 10:36:28 +03:00
$( MAKE) LDSCRIPT = esp8266_ota.ld FWBIN = $( BUILD) /firmware-ota.bin
2016-12-14 17:44:05 +03:00
2014-11-27 20:30:33 +00:00
#MAKE_PINS = boards/make-pins.py
#BOARD_PINS = boards/$(BOARD)/pins.csv
#AF_FILE = boards/stm32f4xx_af.csv
#PREFIX_FILE = boards/stm32f4xx_prefix.c
#GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
#GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
#GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
#GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
#GEN_PINS_AF_PY = $(BUILD)/pins_af.py
# Making OBJ use an order-only depenedency on the generated pins.h file
# has the side effect of making the pins.h file before we actually compile
# any of the objects. The normal dependency generation will deal with the
# case when pins.h is modified. But when it doesn't exist, we don't know
# which source files might need it.
#$(OBJ): | $(HEADER_BUILD)/pins.h
# Use a pattern rule here so that make will only call make-pins.py once to make
# both pins_$(BOARD).c and pins.h
#$(BUILD)/%_$(BOARD).c $(HEADER_BUILD)/%.h $(HEADER_BUILD)/%_af_const.h $(BUILD)/%_qstr.h: boards/$(BOARD)/%.csv $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
# $(ECHO) "Create $@"
# $(Q)$(PYTHON) $(MAKE_PINS) --board $(BOARD_PINS) --af $(AF_FILE) --prefix $(PREFIX_FILE) --hdr $(GEN_PINS_HDR) --qstr $(GEN_PINS_QSTR) --af-const $(GEN_PINS_AF_CONST) --af-py $(GEN_PINS_AF_PY) > $(GEN_PINS_SRC)
#
#$(BUILD)/pins_$(BOARD).o: $(BUILD)/pins_$(BOARD).c
# $(call compile_c)
i n c l u d e . . / p y / m k r u l e s . m k
2016-04-27 00:35:13 +03:00
2016-07-16 04:53:33 +03:00
axtls : $( BUILD ) /libaxtls .a
$(BUILD)/libaxtls.a :
2016-04-27 00:35:13 +03:00
cd ../lib/axtls; cp config/upyconfig config/.config
cd ../lib/axtls; make oldconfig -B
cd ../lib/axtls; make clean
2017-02-24 15:59:59 +01:00
cd ../lib/axtls; make all CC = " $( Q) $( CC) " LD = " $( Q) $( LD) " AR = " $( Q) $( AR) " CFLAGS_EXTRA = " $( CFLAGS_XTENSA) -Dabort=abort_ -DRT_MAX_PLAIN_LENGTH=1024 -DRT_EXTRA=3072 "
2016-07-16 04:53:33 +03:00
cp ../lib/axtls/_stage/libaxtls.a $@