From 78d82386d1361ae1e402730229e51190b12a266c Mon Sep 17 00:00:00 2001 From: Jan Pochyla Date: Mon, 6 Mar 2017 17:33:42 +0100 Subject: [PATCH] trezorhal: adjust to new structure --- Makefile | 12 +- Makefile.firmware | 456 ++++++++++++++++++ micropython/extmod/modtrezormsg/touch.h | 9 +- .../{trezorhal => extmod/modutime}/modutime.c | 2 - micropython/{trezorhal => firmware}/main.c | 8 +- .../{trezorhal => firmware}/mpconfigboard.h | 0 .../{trezorhal => firmware}/mpconfigport.h | 67 ++- .../{trezorhal => firmware}/mphalport.h | 0 micropython/trezorhal/Makefile | 175 ------- micropython/trezorhal/qstrdefsport.h | 1 - micropython/trezorhal/stm32_it.c | 11 +- src/trezor/config.py | 4 +- src/trezor/config_mock.py | 7 + src/trezor/log.py | 8 +- 14 files changed, 543 insertions(+), 217 deletions(-) create mode 100644 Makefile.firmware rename micropython/{trezorhal => extmod/modutime}/modutime.c (98%) rename micropython/{trezorhal => firmware}/main.c (97%) rename micropython/{trezorhal => firmware}/mpconfigboard.h (100%) rename micropython/{trezorhal => firmware}/mpconfigport.h (76%) rename micropython/{trezorhal => firmware}/mphalport.h (100%) delete mode 100644 micropython/trezorhal/Makefile delete mode 100644 micropython/trezorhal/qstrdefsport.h diff --git a/Makefile b/Makefile index 9261bae0..a62b7745 100644 --- a/Makefile +++ b/Makefile @@ -3,9 +3,9 @@ JOBS=4 MAKE=make -j $(JOBS) -TREZORHAL_BUILD_DIR=micropython/trezorhal/build +TREZORHAL_BUILD_DIR=micropython/firmware/build -TREZORHAL_PORT_OPTS=FROZEN_MPY_DIR=../../../src +TREZORHAL_PORT_OPTS=FROZEN_MPY_DIR=src UNIX_PORT_OPTS=MICROPY_FORCE_32BIT=1 MICROPY_PY_BTREE=0 MICROPY_PY_TERMIOS=0 MICROPY_PY_FFI=0 MICROPY_PY_USSL=0 MICROPY_SSL_AXTLS=0 CROSS_PORT_OPTS=MICROPY_FORCE_32BIT=1 @@ -13,7 +13,7 @@ help: ## show this help @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {printf "\033[36mmake %-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) vendor: ## update git submodules - git submodule update --init + # git submodule update --init res: ## update resources ./tools/res_collect @@ -21,10 +21,10 @@ res: ## update resources build: build_trezorhal build_unix build_cross ## build trezorhal, unix and mpy-cross micropython ports build_trezorhal: vendor res build_cross ## build trezorhal port with frozen modules - $(MAKE) -C vendor/micropython/trezorhal $(TREZORHAL_PORT_OPTS) + $(MAKE) -f Makefile.firmware $(TREZORHAL_PORT_OPTS) build_trezorhal_debug: vendor res build_cross ## build trezorhal port with frozen modules and debug symbols - $(MAKE) -C vendor/micropython/trezorhal $(TREZORHAL_PORT_OPTS) DEBUG=1 + $(MAKE) -f Makefile.firmware $(TREZORHAL_PORT_OPTS) DEBUG=1 build_unix: vendor ## build unix port $(MAKE) -C vendor/micropython/unix $(UNIX_PORT_OPTS) @@ -44,7 +44,7 @@ emu: ## run emulator clean: clean_trezorhal clean_unix clean_cross ## clean all builds clean_trezorhal: ## clean trezorhal build - $(MAKE) -C vendor/micropython/trezorhal clean $(TREZORHAL_PORT_OPTS) + $(MAKE) -f Makefile.firmware clean $(TREZORHAL_PORT_OPTS) clean_unix: ## clean unix build $(MAKE) -C vendor/micropython/unix clean $(UNIX_PORT_OPTS) diff --git a/Makefile.firmware b/Makefile.firmware new file mode 100644 index 00000000..c89b3d27 --- /dev/null +++ b/Makefile.firmware @@ -0,0 +1,456 @@ +# directory containing scripts to be frozen as bytecode +FROZEN_MPY_DIR ?= src + +# target directory +BUILD ?= micropython/firmware/build + +# include py core make definitions +include vendor/micropython/py/mkenv.mk + +MAKE_FROZEN = vendor/micropython/tools/make-frozen.py +MPY_CROSS = vendor/micropython/mpy-cross/mpy-cross +MPY_TOOL = vendor/micropython/tools/mpy-tool.py + +# sources +# ===================================== + +SRCDIR_MP = vendor/micropython +SRCDIR_FW = micropython + +BUILD_MP = $(BUILD)/$(SRCDIR_MP) +BUILD_FW = $(BUILD)/$(SRCDIR_FW) +BUILD_HDR = $(BUILD)/genhdr + +MICROPY_PY_TREZORCONFIG = 1 +MICROPY_PY_TREZORCRYPTO = 1 +MICROPY_PY_TREZORDEBUG = 1 +MICROPY_PY_TREZORMSG = 1 +MICROPY_PY_TREZORUI = 1 +MICROPY_PY_TREZORUTILS = 1 +MICROPY_PY_UTIME = 1 + +# OBJ micropython/extmod/modtrezorconfig +ifeq ($(MICROPY_PY_TREZORCONFIG),1) +OBJ_MOD += \ + $(BUILD_FW)/extmod/modtrezorconfig/modtrezorconfig.o \ + $(BUILD_FW)/extmod/modtrezorconfig/norcow.o +endif + +# OBJ micropython/extmod/modtrezorcrypto +ifeq ($(MICROPY_PY_TREZORCRYPTO),1) +CFLAGS_MOD += \ + -I$(SRCDIR_FW)/extmod/modtrezorcrypto/trezor-crypto \ + -I$(SRCDIR_FW)/extmod/modtrezorcrypto/trezor-crypto/curve25519-donna \ + -I$(SRCDIR_FW)/extmod/modtrezorcrypto/trezor-crypto/ed25519-donna \ + -DED25519_CUSTOMRANDOM=1 \ + -DED25519_CUSTOMHASH=1 \ + -DED25519_NO_INLINE_ASM \ + -DED25519_FORCE_32BIT=1 \ + -DAES_128 \ + -DAES_192 \ + -DUSE_KECCAK=1 \ + -Wno-sequence-point +OBJ_MOD += \ + $(BUILD_FW)/extmod/modtrezorcrypto/modtrezorcrypto.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/rand.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/ssss.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/address.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/aescrypt.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/aeskey.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/aes_modes.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/aestab.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/base58.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/bignum.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/bip32.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/bip39.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/blake2s.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/curve25519-donna/curve25519.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/curves.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/ecdsa.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/ed25519-donna/ed25519.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/hmac.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/nist256p1.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/pbkdf2.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/ripemd160.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/secp256k1.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/sha2.o \ + $(BUILD_FW)/extmod/modtrezorcrypto/trezor-crypto/sha3.o +endif + +# OBJ micropython/extmod/modtrezordebug +ifeq ($(MICROPY_PY_TREZORDEBUG),1) +OBJ_MOD += $(BUILD_FW)/extmod/modtrezordebug/modtrezordebug.o +endif + +# OBJ micropython/extmod/modtrezormsg +ifeq ($(MICROPY_PY_TREZORMSG),1) +OBJ_MOD += $(BUILD_FW)/extmod/modtrezormsg/modtrezormsg.o +endif + +# OBJ micropython/extmod/modtrezorui +ifeq ($(MICROPY_PY_TREZORUI),1) +CFLAGS_MOD += -DQR_MAX_VERSION=0 +OBJ_MOD += \ + $(BUILD_FW)/extmod/modtrezorui/display.o \ + $(BUILD_FW)/extmod/modtrezorui/inflate.o \ + $(BUILD_FW)/extmod/modtrezorui/font_bitmap.o \ + $(BUILD_FW)/extmod/modtrezorui/font_roboto_bold_20.o \ + $(BUILD_FW)/extmod/modtrezorui/font_roboto_regular_20.o \ + $(BUILD_FW)/extmod/modtrezorui/font_robotomono_regular_20.o \ + $(BUILD_FW)/extmod/modtrezorui/modtrezorui.o \ + $(BUILD_FW)/extmod/modtrezorui/trezor-qrenc/qr_encode.o +endif + +# OBJ micropython/extmod/modtrezorutils +ifeq ($(MICROPY_PY_TREZORUTILS),1) +OBJ_MOD += $(BUILD_FW)/extmod/modtrezorutils/modtrezorutils.o +endif + +# OBJ micropython/extmod/modutime +ifeq ($(MICROPY_PY_UTIME),1) +OBJ_MOD += $(BUILD_FW)/extmod/modutime/modutime.o +SRC_QSTR += $(SRCDIR_FW)/extmod/modutime/modutime.c +endif + +# OBJ vendor/micropython +OBJ_MP += $(addprefix $(BUILD_MP)/,\ + \ + extmod/modubinascii.o \ + extmod/moductypes.o \ + extmod/moduheapq.o \ + extmod/modutimeq.o \ + extmod/moduzlib.o \ + extmod/utime_mphal.o \ + \ + lib/embed/abort_.o \ + lib/libc/string0.o \ + lib/libc/string0.o \ + lib/libm/acoshf.o \ + lib/libm/asinfacosf.o \ + lib/libm/asinhf.o \ + lib/libm/atan2f.o \ + lib/libm/atanf.o \ + lib/libm/atanhf.o \ + lib/libm/ef_rem_pio2.o \ + lib/libm/erf_lgamma.o \ + lib/libm/fmodf.o \ + lib/libm/kf_cos.o \ + lib/libm/kf_rem_pio2.o \ + lib/libm/kf_sin.o \ + lib/libm/kf_tan.o \ + lib/libm/log1pf.o \ + lib/libm/math.o \ + lib/libm/roundf.o \ + lib/libm/sf_cos.o \ + lib/libm/sf_erf.o \ + lib/libm/sf_frexp.o \ + lib/libm/sf_ldexp.o \ + lib/libm/sf_modf.o \ + lib/libm/sf_sin.o \ + lib/libm/sf_tan.o \ + lib/libm/thumb_vfp_sqrtf.o \ + lib/libm/wf_lgamma.o \ + lib/libm/wf_tgamma.o \ + lib/utils/interrupt_char.o \ + lib/utils/printf.o \ + lib/utils/pyexec.o \ + lib/utils/stdout_helpers.o \ + \ + py/argcheck.o \ + py/asmarm.o \ + py/asmbase.o \ + py/asmthumb.o \ + py/asmx64.o \ + py/asmx86.o \ + py/asmxtensa.o \ + py/bc.o \ + py/binary.o \ + py/builtinevex.o \ + py/builtinhelp.o \ + py/builtinimport.o \ + py/compile.o \ + py/emitbc.o \ + py/emitcommon.o \ + py/emitglue.o \ + py/emitinlinethumb.o \ + py/emitinlinextensa.o \ + py/formatfloat.o \ + py/frozenmod.o \ + py/gc.o \ + py/lexer.o \ + py/malloc.o \ + py/map.o \ + py/modarray.o \ + py/modbuiltins.o \ + py/modcmath.o \ + py/modcollections.o \ + py/modgc.o \ + py/modio.o \ + py/modmath.o \ + py/modmicropython.o \ + py/modstruct.o \ + py/modsys.o \ + py/modthread.o \ + py/moduerrno.o \ + py/mpprint.o \ + py/mpstate.o \ + py/mpz.o \ + py/nativeglue.o \ + py/nlrsetjmp.o \ + py/nlrthumb.o \ + py/nlrx64.o \ + py/nlrx86.o \ + py/nlrxtensa.o \ + py/obj.o \ + py/objarray.o \ + py/objattrtuple.o \ + py/objbool.o \ + py/objboundmeth.o \ + py/objcell.o \ + py/objclosure.o \ + py/objcomplex.o \ + py/objdict.o \ + py/objenumerate.o \ + py/objexcept.o \ + py/objfilter.o \ + py/objfloat.o \ + py/objfun.o \ + py/objgenerator.o \ + py/objgetitemiter.o \ + py/objint_longlong.o \ + py/objint_mpz.o \ + py/objint.o \ + py/objlist.o \ + py/objmap.o \ + py/objmodule.o \ + py/objnamedtuple.o \ + py/objnone.o \ + py/objobject.o \ + py/objpolyiter.o \ + py/objproperty.o \ + py/objrange.o \ + py/objreversed.o \ + py/objset.o \ + py/objsingleton.o \ + py/objslice.o \ + py/objstr.o \ + py/objstringio.o \ + py/objstrunicode.o \ + py/objtuple.o \ + py/objtype.o \ + py/objzip.o \ + py/opmethods.o \ + py/parse.o \ + py/parsenum.o \ + py/parsenumbase.o \ + py/persistentcode.o \ + py/qstr.o \ + py/reader.o \ + py/repl.o \ + py/runtime_utils.o \ + py/runtime.o \ + py/scope.o \ + py/sequence.o \ + py/showbc.o \ + py/smallint.o \ + py/stackctrl.o \ + py/stream.o \ + py/unicode.o \ + py/vm.o \ + py/vstr.o \ + py/warning.o \ + \ + stmhal/hal/f4/src/stm32f4xx_hal_adc_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_adc.o \ + stmhal/hal/f4/src/stm32f4xx_hal_can.o \ + stmhal/hal/f4/src/stm32f4xx_hal_cortex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_dac_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_dac.o \ + stmhal/hal/f4/src/stm32f4xx_hal_dma.o \ + stmhal/hal/f4/src/stm32f4xx_hal_flash_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_flash.o \ + stmhal/hal/f4/src/stm32f4xx_hal_gpio.o \ + stmhal/hal/f4/src/stm32f4xx_hal_i2c.o \ + stmhal/hal/f4/src/stm32f4xx_hal_pcd_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_pcd.o \ + stmhal/hal/f4/src/stm32f4xx_hal_pwr_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_pwr.o \ + stmhal/hal/f4/src/stm32f4xx_hal_rcc_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_rcc.o \ + stmhal/hal/f4/src/stm32f4xx_hal_rng.o \ + stmhal/hal/f4/src/stm32f4xx_hal_rtc_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_rtc.o \ + stmhal/hal/f4/src/stm32f4xx_hal_sd.o \ + stmhal/hal/f4/src/stm32f4xx_hal_spi.o \ + stmhal/hal/f4/src/stm32f4xx_hal_tim_ex.o \ + stmhal/hal/f4/src/stm32f4xx_hal_tim.o \ + stmhal/hal/f4/src/stm32f4xx_hal_uart.o \ + stmhal/hal/f4/src/stm32f4xx_hal.o \ + stmhal/hal/f4/src/stm32f4xx_ll_sdmmc.o \ + stmhal/hal/f4/src/stm32f4xx_ll_usb.o \ + \ + stmhal/gccollect.o \ + stmhal/gchelper.o \ + stmhal/pendsv.o \ + stmhal/startup_stm32.o \ + stmhal/system_stm32.o \ + stmhal/systick.o \ + \ + stmhal/usbd_cdc_interface.o \ + stmhal/usbd_conf.o \ + stmhal/usbd_desc.o \ + stmhal/usbd_hid_interface.o \ + \ + stmhal/usbdev/class/src/usbd_cdc_msc_hid.o \ + stmhal/usbdev/class/src/usbd_msc_bot.o \ + stmhal/usbdev/class/src/usbd_msc_data.o \ + stmhal/usbdev/class/src/usbd_msc_scsi.o \ + stmhal/usbdev/core/src/usbd_core.o \ + stmhal/usbdev/core/src/usbd_ctlreq.o \ + stmhal/usbdev/core/src/usbd_ioreq.o \ + ) + +# OBJ micropython/ +OBJ_FW += $(addprefix $(BUILD_FW)/, \ + firmware/main.o \ + trezorhal/stm32_it.o \ + trezorhal/stm32f4xx_hal_sram.o \ + trezorhal/stm32f4xx_ll_fsmc.o \ + ) + +# make a list of all the .py files that need compiling and freezing +FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py' | $(SED) -e 's=^$(FROZEN_MPY_DIR)/==') +FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/frozen_mpy/,$(FROZEN_MPY_PY_FILES:.py=.mpy)) + +OBJ = $(OBJ_MOD) $(OBJ_MP) $(OBJ_FW) $(BUILD)/frozen_mpy.o +SRC_MP = $(patsubst $(BUILD_MP)%.o, $(SRCDIR_MP)%.c, $(OBJ_MP)) +SRC_FW = $(patsubst $(BUILD_FW)%.o, $(SRCDIR_FW)%.c, $(OBJ_FW)) +SRC_MOD = $(patsubst $(BUILD_FW)%.o, $(SRCDIR_FW)%.c, $(OBJ_MOD)) + +# comp flags +# ===================================== + +CROSS_COMPILE = arm-none-eabi- + +INC += -I. +INC += -Imicropython/firmware +INC += -Imicropython/trezorhal +INC += -Ivendor/micropython +INC += -Ivendor/micropython/stmhal +INC += -Ivendor/micropython/stmhal/cmsis +INC += -Ivendor/micropython/stmhal/hal/f4/inc +INC += -Ivendor/micropython/stmhal/usbdev/core/inc +INC += -Ivendor/micropython/stmhal/usbdev/class/inc +INC += -Ivendor/micropython/lib/cmsis/inc +INC += -I$(BUILD) + +ifeq ($(DEBUG), 1) +CFLAGS += -O0 -ggdb +else +CFLAGS += -Os -DNDEBUG +endif + +CFLAGS += $(INC) $(CFLAGS_MOD) $(CFLAGS_EXTRA) +CFLAGS += -std=gnu99 -nostdlib -Wall -Werror -Wdouble-promotion -Wpointer-arith +CFLAGS += -mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant + +CFLAGS += -DSTM32F405xx -DMCU_SERIES_F4 +CFLAGS += -DSTM32_HAL_H='' + +CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool +CFLAGS += -DMICROPY_MODULE_FROZEN_MPY + +LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) + +LDFLAGS = -nostdlib -T micropython/trezorhal/trezorv2.ld -Map=$@.map --cref + +# remove uncalled code from the final image +CFLAGS += -fdata-sections -ffunction-sections +LDFLAGS += --gc-sections + +# QSTR file locations +QSTR_DEFS = $(SRCDIR_MP)/py/qstrdefs.h +QSTR_DEFS_COLLECTED = $(BUILD_HDR)/qstrdefs.collected.h + +# SRC files for QSTR extraction +SRC_QSTR_IGNORE = $(addprefix $(SRCDIR_MP)/py/, \ + nlr% emitnx86% emitnx64% emitnthumb% emitnarm% emitnxtensa%) +SRC_QSTR += $(SRC_MOD) +SRC_QSTR += $(filter $(SRCDIR_MP)/lib/%,$(SRC_MP)) +SRC_QSTR += $(filter $(SRCDIR_MP)/extmod/%,$(SRC_MP)) +# SRC_QSTR += $(filter $(SRCDIR_MP)/stmhal/%,$(filter-out %/gchelper.o,$(SRC_MP))) +SRC_QSTR += $(filter-out $(SRC_QSTR_IGNORE),$(filter $(SRCDIR_MP)/py/%,$(SRC_MP))) + +# extra cpp CFLAGS for QSTR extraction +QSTR_GEN_EXTRA_CFLAGS += -DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB -DN_ARM -DN_XTENSA + +# comp rules +# ===================================== + +all: $(BUILD)/firmware.bin + +$(BUILD)/firmware.elf: $(OBJ) + $(ECHO) "LINK $@" + $(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS) + $(Q)$(SIZE) $@ + +$(BUILD)/firmware.bin: $(BUILD)/firmware.elf + $(Q)$(OBJCOPY) -O binary -j .flash -j .data $^ $(BUILD)/firmware.bin + +$(BUILD)/%.o: %.S + $(ECHO) "CC $<" + $(Q)$(CC) $(CFLAGS) -c -o $@ $< + +$(BUILD)/%.o: %.s + $(ECHO) "AS $<" + $(Q)$(AS) -o $@ $< + +$(BUILD)/%.o: %.c + $(ECHO) "CC $<" + $(Q)$(CC) $(CFLAGS) -c -MD -o $@ $< + +OBJ_DIRS = $(sort $(dir $(OBJ))) +$(OBJ): | $(OBJ_DIRS) +$(OBJ_DIRS) $(BUILD_HDR): + $(MKDIR) -p $@ + +$(OBJ): | $(BUILD_HDR)/qstrdefs.generated.h $(BUILD_HDR)/mpversion.h + +$(BUILD_HDR)/qstr.i.last: $(SRC_QSTR) | $(BUILD_HDR)/mpversion.h + $(ECHO) "GEN $@" + $(Q)$(CPP) $(QSTR_GEN_EXTRA_CFLAGS) $(CFLAGS) $^ >$(BUILD_HDR)/qstr.i.last; \ + +$(BUILD_HDR)/qstr.split: $(BUILD_HDR)/qstr.i.last + $(ECHO) "GEN $@" + $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split $(BUILD_HDR)/qstr.i.last $(BUILD_HDR)/qstr $(QSTR_DEFS_COLLECTED) + $(Q)touch $@ + +$(QSTR_DEFS_COLLECTED): $(BUILD_HDR)/qstr.split + $(ECHO) "GEN $@" + $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py cat $(BUILD_HDR)/qstr.i.last $(BUILD_HDR)/qstr $(QSTR_DEFS_COLLECTED) + +$(BUILD_HDR)/qstrdefs.generated.h: $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(SRCDIR_FW)/firmware/mpconfigport.h | $(BUILD_HDR) + $(ECHO) "GEN $@" + $(Q)cat $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) \ + | $(SED) 's/^Q(.*)/"&"/' \ + | $(CPP) $(CFLAGS) - \ + | $(SED) 's/^"\(Q(.*)\)"/\1/' \ + > $(BUILD_HDR)/qstrdefs.preprocessed.h + $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(BUILD_HDR)/qstrdefs.preprocessed.h > $@ + +$(BUILD_HDR)/mpversion.h: | $(BUILD_HDR) + $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@ + +$(BUILD)/frozen_mpy/%.mpy: $(FROZEN_MPY_DIR)/%.py + @$(ECHO) "MPY $<" + $(Q)$(MKDIR) -p $(dir $@) + $(Q)$(MPY_CROSS) -o $@ -s $(^:$(FROZEN_MPY_DIR)/%=%) $^ + +$(BUILD)/frozen_mpy.c: $(FROZEN_MPY_MPY_FILES) $(BUILD)/genhdr/qstrdefs.generated.h + @$(ECHO) "Creating $@" + $(Q)PYTHONPATH=$(SRCDIR_MP)/py $(PYTHON) $(MPY_TOOL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $(FROZEN_MPY_MPY_FILES) > $@ + +clean: + $(RM) -rf $(BUILD) + +.PHONY: all clean diff --git a/micropython/extmod/modtrezormsg/touch.h b/micropython/extmod/modtrezormsg/touch.h index 3acdea20..08255f8a 100644 --- a/micropython/extmod/modtrezormsg/touch.h +++ b/micropython/extmod/modtrezormsg/touch.h @@ -1,10 +1,11 @@ -extern I2C_HandleTypeDef I2CHandle1; extern void i2c_init(I2C_HandleTypeDef *i2c); extern HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); +static I2C_HandleTypeDef touch_i2c_handle; + void touch_init(void) { - I2C_InitTypeDef *init = &(I2CHandle1.Init); + I2C_InitTypeDef *init = &(touch_i2c_handle.Init); init->OwnAddress1 = 0xFE; // master init->ClockSpeed = 400000; init->DutyCycle = I2C_DUTYCYCLE_16_9; @@ -13,13 +14,13 @@ void touch_init(void) init->GeneralCallMode = I2C_GENERALCALL_DISABLED; init->NoStretchMode = I2C_NOSTRETCH_DISABLED; init->OwnAddress2 = 0; - i2c_init(&I2CHandle1); + i2c_init(&touch_i2c_handle); } uint32_t touch_read(void) { static uint8_t data[16], old_data[16]; - if (HAL_OK != HAL_I2C_Master_Receive(&I2CHandle1, 56 << 1, data, 16, 1)) { + if (HAL_OK != HAL_I2C_Master_Receive(&touch_i2c_handle, 56 << 1, data, 16, 1)) { return 0; // read failure } if (0 == memcmp(data, old_data, 16)) { diff --git a/micropython/trezorhal/modutime.c b/micropython/extmod/modutime/modutime.c similarity index 98% rename from micropython/trezorhal/modutime.c rename to micropython/extmod/modutime/modutime.c index 41635c44..277bd4f7 100644 --- a/micropython/trezorhal/modutime.c +++ b/micropython/extmod/modutime/modutime.c @@ -24,8 +24,6 @@ * THE SOFTWARE. */ -#include -#include #include STM32_HAL_H #include "py/nlr.h" diff --git a/micropython/trezorhal/main.c b/micropython/firmware/main.c similarity index 97% rename from micropython/trezorhal/main.c rename to micropython/firmware/main.c index 68ce67ae..2b817c22 100644 --- a/micropython/trezorhal/main.c +++ b/micropython/firmware/main.c @@ -152,7 +152,7 @@ void usb_init(void) { // I2C -I2C_HandleTypeDef *I2CHandle1; +I2C_HandleTypeDef *i2c_handle = 0; void i2c_init(I2C_HandleTypeDef *i2c) { @@ -177,7 +177,7 @@ void i2c_init(I2C_HandleTypeDef *i2c) { } // Enable IRQs - I2CHandle1 = i2c; + i2c_handle = i2c; HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); } @@ -234,6 +234,10 @@ void mp_hal_stdout_tx_strn(const char *str, size_t len) { USBD_CDC_TxAlways((const uint8_t*)str, len); } +int mp_reader_new_file(mp_reader_t *reader, const char *filename) { + return 2; // assume error was "file not found" +} + // Time bool mp_hal_ticks_cpu_enabled; diff --git a/micropython/trezorhal/mpconfigboard.h b/micropython/firmware/mpconfigboard.h similarity index 100% rename from micropython/trezorhal/mpconfigboard.h rename to micropython/firmware/mpconfigboard.h diff --git a/micropython/trezorhal/mpconfigport.h b/micropython/firmware/mpconfigport.h similarity index 76% rename from micropython/trezorhal/mpconfigport.h rename to micropython/firmware/mpconfigport.h index 62c5b6b0..14064f9a 100644 --- a/micropython/trezorhal/mpconfigport.h +++ b/micropython/firmware/mpconfigport.h @@ -1,8 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2013-2015 Damien P. George + * + * 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 #include #include #include +#include "mpconfigboard.h" + +#define MICROPY_DEBUG_PRINTERS (1) + // Memory allocation policies #define MICROPY_ALLOC_PATH_MAX (128) @@ -12,13 +42,12 @@ #define MICROPY_EMIT_INLINE_THUMB (0) // Compiler configuration -#define MICROPY_ENABLE_COMPILER (1) #define MICROPY_COMP_MODULE_CONST (1) -#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1) #define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (1) // Optimisations #define MICROPY_OPT_COMPUTED_GOTO (1) +#define MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE (0) #define MICROPY_OPT_MPZ_BITWISE (1) // Python internal features @@ -37,12 +66,10 @@ #define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) #define MICROPY_STREAMS_NON_BLOCK (1) #define MICROPY_MODULE_WEAK_LINKS (1) -#define MICROPY_MODULE_FROZEN_MPY (1) #define MICROPY_CAN_OVERRIDE_BUILTINS (1) #define MICROPY_USE_INTERNAL_ERRNO (1) #define MICROPY_VFS (0) #define MICROPY_VFS_FAT (0) -#define MICROPY_QSTR_EXTRA_POOL mp_qstr_frozen_const_pool // Control over Python builtins #define MICROPY_PY_FUNCTION_ATTRS (1) @@ -91,16 +118,6 @@ #include STM32_HAL_H -static inline void enable_irq(uint32_t state) { - __set_PRIMASK(state); -} - -static inline uint32_t disable_irq(void) { - uint32_t st = __get_PRIMASK(); - __disable_irq(); - return st; -} - #define BYTES_PER_WORD (4) #define MP_HAL_UNIQUE_ID_ADDRESS (0x1fff7a10) #define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1)) @@ -117,6 +134,21 @@ typedef unsigned mp_uint_t; // must be pointer size typedef long mp_off_t; #define MP_SSIZE_MAX INT_MAX + +static inline void enable_irq(mp_uint_t state) { + __set_PRIMASK(state); +} + +static inline mp_uint_t disable_irq(void) { + mp_uint_t state = __get_PRIMASK(); + __disable_irq(); + return state; +} + +#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq() +#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state) +#define MICROPY_EVENT_POLL_HOOK __WFI(); + #define MICROPY_MIN_USE_CORTEX_CPU (1) #define MICROPY_MIN_USE_STM32_MCU (1) #define MICROPY_HW_BOARD_NAME "TREZORv2" @@ -124,7 +156,8 @@ typedef long mp_off_t; #define MICROPY_PY_SYS_PLATFORM "trezor" #define MP_STATE_PORT MP_STATE_VM -#define MICROPY_PORT_ROOT_POINTERS const char *readline_hist[8]; +#define MICROPY_PORT_ROOT_POINTERS +#define USE_DEVICE_MODE extern const struct _mp_obj_module_t mp_module_utime; extern const struct _mp_obj_module_t mp_module_TrezorConfig; @@ -148,6 +181,10 @@ extern const struct _mp_obj_module_t mp_module_TrezorUtils; #define MICROPY_PORT_BUILTINS \ { MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj }, +#define malloc(n) m_malloc(n) +#define free(p) m_free(p) +#define realloc(p, n) m_realloc(p, n) + // Timing functions #include "stmhal/systick.h" diff --git a/micropython/trezorhal/mphalport.h b/micropython/firmware/mphalport.h similarity index 100% rename from micropython/trezorhal/mphalport.h rename to micropython/firmware/mphalport.h diff --git a/micropython/trezorhal/Makefile b/micropython/trezorhal/Makefile deleted file mode 100644 index 6f847e87..00000000 --- a/micropython/trezorhal/Makefile +++ /dev/null @@ -1,175 +0,0 @@ -# include default settings -include ../py/mkenv.mk - -# qstr definitions target, used in py.mk -QSTR_DEFS = qstrdefsport.h - -# directory containing scripts to be frozen as bytecode -FROZEN_MPY_DIR ?= modules - -# enable external modules, used in py.mk -MICROPY_PY_TREZORCONFIG = 1 -MICROPY_PY_TREZORCRYPTO = 1 -MICROPY_PY_TREZORDEBUG = 1 -MICROPY_PY_TREZORMSG = 1 -MICROPY_PY_TREZORUI = 1 -MICROPY_PY_TREZORUTILS = 1 - -# include py core make definitions -include ../py/py.mk - -CROSS_COMPILE = arm-none-eabi- - -INC += -I. -INC += -I.. -INC += -I../stmhal -INC += -I../stmhal/cmsis -INC += -I../stmhal/hal/f4/inc -INC += -I../stmhal/usbdev/core/inc -INC += -I../stmhal/usbdev/class/inc -INC += -I../lib/cmsis/inc -INC += -I../lib/mp-readline -INC += -I$(BUILD) - -ifeq ($(DEBUG), 1) -COPT = -O0 -ggdb -else -COPT = -Os -DNDEBUG -endif - -CFLAGS += $(INC) $(COPT) $(CFLAGS_MOD) $(CFLAGS_EXTRA) -CFLAGS += -std=gnu99 -nostdlib -Wall -Werror -Wdouble-promotion -Wpointer-arith -CFLAGS += -mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant - -CFLAGS += -DSTM32F405xx -DMCU_SERIES_F4 -CFLAGS += -DSTM32_HAL_H='' - -LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) - -LDFLAGS = -nostdlib -T trezorv2.ld -Map=$@.map --cref - -# remove uncalled code from the final image -CFLAGS += -fdata-sections -ffunction-sections -LDFLAGS += --gc-sections - -SRC_LIB = $(addprefix lib/,\ - libc/string0.c \ - libm/math.c \ - libm/thumb_vfp_sqrtf.c \ - libm/asinfacosf.c \ - libm/atanf.c \ - libm/atan2f.c \ - libm/fmodf.c \ - libm/roundf.c \ - libm/log1pf.c \ - libm/acoshf.c \ - libm/asinhf.c \ - libm/atanhf.c \ - libm/kf_rem_pio2.c \ - libm/kf_sin.c \ - libm/kf_cos.c \ - libm/kf_tan.c \ - libm/ef_rem_pio2.c \ - libm/erf_lgamma.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/sf_erf.c \ - libm/wf_lgamma.c \ - libm/wf_tgamma.c \ - libc/string0.c \ - mp-readline/readline.c \ - utils/stdout_helpers.c \ - utils/pyexec.c \ - ) - -SRC_HAL = $(addprefix stmhal/hal/f4/src/stm32f4xx_,\ - hal.c \ - hal_adc.c \ - hal_adc_ex.c \ - hal_can.c \ - hal_cortex.c \ - hal_dac.c \ - hal_dac_ex.c \ - hal_dma.c \ - hal_flash.c \ - hal_flash_ex.c \ - hal_gpio.c \ - hal_i2c.c \ - hal_pcd.c \ - hal_pcd_ex.c \ - hal_pwr.c \ - hal_pwr_ex.c \ - hal_rcc.c \ - hal_rcc_ex.c \ - hal_rng.c \ - hal_rtc.c \ - hal_rtc_ex.c \ - hal_sd.c \ - hal_spi.c \ - hal_sram.c \ - hal_tim.c \ - hal_tim_ex.c \ - hal_uart.c \ - ll_fsmc.c \ - ll_sdmmc.c \ - ll_usb.c \ - ) - -SRC_USBDEV = $(addprefix stmhal/usbdev/,\ - core/src/usbd_core.c \ - core/src/usbd_ctlreq.c \ - core/src/usbd_ioreq.c \ - class/src/usbd_cdc_msc_hid.c \ - class/src/usbd_msc_bot.c \ - class/src/usbd_msc_scsi.c \ - class/src/usbd_msc_data.c \ - ) - -SRC_C = \ - main.c \ - stm32_it.c \ - modutime.c \ - lib/utils/stdout_helpers.c \ - lib/utils/pyexec.c \ - lib/libc/string0.c \ - lib/mp-readline/readline.c \ - stmhal/pendsv.c \ - stmhal/systick.c \ - stmhal/gccollect.c \ - stmhal/system_stm32.c \ - stmhal/usbd_conf.c \ - stmhal/usbd_desc.c \ - stmhal/usbd_cdc_interface.c \ - stmhal/usbd_hid_interface.c \ - $(BUILD)/frozen_mpy.c - -SRC_QSTR += modutime.c - -SRC_O = \ - stmhal/startup_stm32.o \ - stmhal/gchelper.o \ - -OBJ = \ - $(PY_O) \ - $(addprefix $(BUILD)/, $(SRC_O)) \ - $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) \ - $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o)) \ - $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o)) \ - $(addprefix $(BUILD)/, $(SRC_USBDEV:.c=.o)) \ - $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) - -all: $(BUILD)/firmware.bin - -$(BUILD)/firmware.elf: $(OBJ) - $(ECHO) "LINK $@" - $(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS) - $(Q)$(SIZE) $@ - -$(BUILD)/firmware.bin: $(BUILD)/firmware.elf - $(Q)$(OBJCOPY) -O binary -j .flash -j .data $^ $(BUILD)/firmware.bin - -include ../py/mkrules.mk diff --git a/micropython/trezorhal/qstrdefsport.h b/micropython/trezorhal/qstrdefsport.h deleted file mode 100644 index 3ba89706..00000000 --- a/micropython/trezorhal/qstrdefsport.h +++ /dev/null @@ -1 +0,0 @@ -// qstrs specific to this port diff --git a/micropython/trezorhal/stm32_it.c b/micropython/trezorhal/stm32_it.c index 3d8106b1..fb2ae5d2 100644 --- a/micropython/trezorhal/stm32_it.c +++ b/micropython/trezorhal/stm32_it.c @@ -736,19 +736,20 @@ void FLASH_IRQHandler(void) { // } // #endif // MICROPY_HW_ENABLE_CAN -#if defined(MICROPY_HW_I2C1_SCL) - extern I2C_HandleTypeDef *i2c_handle; void I2C1_EV_IRQHandler(void) { IRQ_ENTER(I2C1_EV_IRQn); - HAL_I2C_EV_IRQHandler(i2c_handle); + if (i2c_handle) { + HAL_I2C_EV_IRQHandler(i2c_handle); + } IRQ_EXIT(I2C1_EV_IRQn); } void I2C1_ER_IRQHandler(void) { IRQ_ENTER(I2C1_ER_IRQn); - HAL_I2C_ER_IRQHandler(i2c_handle); + if (i2c_handle) { + HAL_I2C_ER_IRQHandler(i2c_handle); + } IRQ_EXIT(I2C1_ER_IRQn); } -#endif // defined(MICROPY_HW_I2C1_SCL) diff --git a/src/trezor/config.py b/src/trezor/config.py index 313b64bf..0d69e094 100644 --- a/src/trezor/config.py +++ b/src/trezor/config.py @@ -1,8 +1,8 @@ import sys -if sys.platform in ('trezor', 'pyboard'): # stmhal +if sys.platform == 'trezor': from .config_mock import Config - _config = Config('/sd/trezor.config') + _config = Config(None) else: from TrezorConfig import Config _config = Config() diff --git a/src/trezor/config_mock.py b/src/trezor/config_mock.py index a2f25210..15e83b2a 100644 --- a/src/trezor/config_mock.py +++ b/src/trezor/config_mock.py @@ -8,6 +8,11 @@ class Config: def __init__(self, filename): self._data = {} self._file = filename + self._load() + + def _load(self): + if not self._file: + return try: with open(self._file, 'rb') as f: while True: @@ -21,6 +26,8 @@ class Config: pass def _save(self): + if not self._file: + return with open(self._file, 'wb') as f: for k, v in self._data.items(): f.write(ustruct.pack('