Merge remote-tracking branch 'micropython/master' into dev-6.0
This commit is contained in:
commit
4a25708536
@ -30,7 +30,7 @@ vary from platform to platform.
|
|||||||
The class implements the block protocol defined by :class:`uos.AbstractBlockDev`.
|
The class implements the block protocol defined by :class:`uos.AbstractBlockDev`.
|
||||||
This allows the mounting of an SD card to be as simple as::
|
This allows the mounting of an SD card to be as simple as::
|
||||||
|
|
||||||
uos.mount(storage.SDCard(), "/sd")
|
uos.mount(machine.SDCard(), "/sd")
|
||||||
|
|
||||||
The constrcutor takes the following paramters:
|
The constrcutor takes the following paramters:
|
||||||
|
|
||||||
|
|||||||
193
extmod/extmod.mk
Normal file
193
extmod/extmod.mk
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
# This makefile fragment provides rules to build 3rd-party components for extmod modules
|
||||||
|
|
||||||
|
# this sets the config file for FatFs
|
||||||
|
CFLAGS_MOD += -DFFCONF_H=\"lib/oofatfs/ffconf.h\"
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# ussl
|
||||||
|
|
||||||
|
ifeq ($(MICROPY_PY_USSL),1)
|
||||||
|
CFLAGS_MOD += -DMICROPY_PY_USSL=1
|
||||||
|
ifeq ($(MICROPY_SSL_AXTLS),1)
|
||||||
|
CFLAGS_MOD += -DMICROPY_SSL_AXTLS=1 -I$(TOP)/lib/axtls/ssl -I$(TOP)/lib/axtls/crypto -I$(TOP)/extmod/axtls-include
|
||||||
|
AXTLS_DIR = lib/axtls
|
||||||
|
$(BUILD)/$(AXTLS_DIR)/%.o: CFLAGS += -Wno-all -Wno-unused-parameter -Wno-uninitialized -Wno-sign-compare -Wno-old-style-definition $(AXTLS_DEFS_EXTRA)
|
||||||
|
SRC_MOD += $(addprefix $(AXTLS_DIR)/,\
|
||||||
|
ssl/asn1.c \
|
||||||
|
ssl/loader.c \
|
||||||
|
ssl/tls1.c \
|
||||||
|
ssl/tls1_svr.c \
|
||||||
|
ssl/tls1_clnt.c \
|
||||||
|
ssl/x509.c \
|
||||||
|
crypto/aes.c \
|
||||||
|
crypto/bigint.c \
|
||||||
|
crypto/crypto_misc.c \
|
||||||
|
crypto/hmac.c \
|
||||||
|
crypto/md5.c \
|
||||||
|
crypto/rsa.c \
|
||||||
|
crypto/sha1.c \
|
||||||
|
)
|
||||||
|
else ifeq ($(MICROPY_SSL_MBEDTLS),1)
|
||||||
|
MBEDTLS_DIR = lib/mbedtls
|
||||||
|
CFLAGS_MOD += -DMICROPY_SSL_MBEDTLS=1 -I$(TOP)/$(MBEDTLS_DIR)/include
|
||||||
|
SRC_MOD += $(addprefix $(MBEDTLS_DIR)/library/,\
|
||||||
|
aes.c \
|
||||||
|
aesni.c \
|
||||||
|
arc4.c \
|
||||||
|
asn1parse.c \
|
||||||
|
asn1write.c \
|
||||||
|
base64.c \
|
||||||
|
bignum.c \
|
||||||
|
blowfish.c \
|
||||||
|
camellia.c \
|
||||||
|
ccm.c \
|
||||||
|
certs.c \
|
||||||
|
chacha20.c \
|
||||||
|
chachapoly.c \
|
||||||
|
cipher.c \
|
||||||
|
cipher_wrap.c \
|
||||||
|
cmac.c \
|
||||||
|
ctr_drbg.c \
|
||||||
|
debug.c \
|
||||||
|
des.c \
|
||||||
|
dhm.c \
|
||||||
|
ecdh.c \
|
||||||
|
ecdsa.c \
|
||||||
|
ecjpake.c \
|
||||||
|
ecp.c \
|
||||||
|
ecp_curves.c \
|
||||||
|
entropy.c \
|
||||||
|
entropy_poll.c \
|
||||||
|
error.c \
|
||||||
|
gcm.c \
|
||||||
|
havege.c \
|
||||||
|
hmac_drbg.c \
|
||||||
|
md2.c \
|
||||||
|
md4.c \
|
||||||
|
md5.c \
|
||||||
|
md.c \
|
||||||
|
md_wrap.c \
|
||||||
|
oid.c \
|
||||||
|
padlock.c \
|
||||||
|
pem.c \
|
||||||
|
pk.c \
|
||||||
|
pkcs11.c \
|
||||||
|
pkcs12.c \
|
||||||
|
pkcs5.c \
|
||||||
|
pkparse.c \
|
||||||
|
pk_wrap.c \
|
||||||
|
pkwrite.c \
|
||||||
|
platform.c \
|
||||||
|
platform_util.c \
|
||||||
|
poly1305.c \
|
||||||
|
ripemd160.c \
|
||||||
|
rsa.c \
|
||||||
|
rsa_internal.c \
|
||||||
|
sha1.c \
|
||||||
|
sha256.c \
|
||||||
|
sha512.c \
|
||||||
|
ssl_cache.c \
|
||||||
|
ssl_ciphersuites.c \
|
||||||
|
ssl_cli.c \
|
||||||
|
ssl_cookie.c \
|
||||||
|
ssl_srv.c \
|
||||||
|
ssl_ticket.c \
|
||||||
|
ssl_tls.c \
|
||||||
|
timing.c \
|
||||||
|
x509.c \
|
||||||
|
x509_create.c \
|
||||||
|
x509_crl.c \
|
||||||
|
x509_crt.c \
|
||||||
|
x509_csr.c \
|
||||||
|
x509write_crt.c \
|
||||||
|
x509write_csr.c \
|
||||||
|
xtea.c \
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# lwip
|
||||||
|
|
||||||
|
ifeq ($(MICROPY_PY_LWIP),1)
|
||||||
|
# A port should add an include path where lwipopts.h can be found (eg extmod/lwip-include)
|
||||||
|
LWIP_DIR = lib/lwip/src
|
||||||
|
INC += -I$(TOP)/$(LWIP_DIR)/include
|
||||||
|
CFLAGS_MOD += -DMICROPY_PY_LWIP=1
|
||||||
|
$(BUILD)/$(LWIP_DIR)/core/ipv4/dhcp.o: CFLAGS_MOD += -Wno-address
|
||||||
|
SRC_MOD += extmod/modlwip.c lib/netutils/netutils.c
|
||||||
|
SRC_MOD += $(addprefix $(LWIP_DIR)/,\
|
||||||
|
apps/mdns/mdns.c \
|
||||||
|
core/def.c \
|
||||||
|
core/dns.c \
|
||||||
|
core/inet_chksum.c \
|
||||||
|
core/init.c \
|
||||||
|
core/ip.c \
|
||||||
|
core/mem.c \
|
||||||
|
core/memp.c \
|
||||||
|
core/netif.c \
|
||||||
|
core/pbuf.c \
|
||||||
|
core/raw.c \
|
||||||
|
core/stats.c \
|
||||||
|
core/sys.c \
|
||||||
|
core/tcp.c \
|
||||||
|
core/tcp_in.c \
|
||||||
|
core/tcp_out.c \
|
||||||
|
core/timeouts.c \
|
||||||
|
core/udp.c \
|
||||||
|
core/ipv4/autoip.c \
|
||||||
|
core/ipv4/dhcp.c \
|
||||||
|
core/ipv4/etharp.c \
|
||||||
|
core/ipv4/icmp.c \
|
||||||
|
core/ipv4/igmp.c \
|
||||||
|
core/ipv4/ip4_addr.c \
|
||||||
|
core/ipv4/ip4.c \
|
||||||
|
core/ipv4/ip4_frag.c \
|
||||||
|
core/ipv6/dhcp6.c \
|
||||||
|
core/ipv6/ethip6.c \
|
||||||
|
core/ipv6/icmp6.c \
|
||||||
|
core/ipv6/inet6.c \
|
||||||
|
core/ipv6/ip6_addr.c \
|
||||||
|
core/ipv6/ip6.c \
|
||||||
|
core/ipv6/ip6_frag.c \
|
||||||
|
core/ipv6/mld6.c \
|
||||||
|
core/ipv6/nd6.c \
|
||||||
|
netif/ethernet.c \
|
||||||
|
)
|
||||||
|
ifeq ($(MICROPY_PY_LWIP_SLIP),1)
|
||||||
|
CFLAGS_MOD += -DMICROPY_PY_LWIP_SLIP=1
|
||||||
|
SRC_MOD += $(LWIP_DIR)/netif/slipif.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# btree
|
||||||
|
|
||||||
|
ifeq ($(MICROPY_PY_BTREE),1)
|
||||||
|
BTREE_DIR = lib/berkeley-db-1.xx
|
||||||
|
BTREE_DEFS = -D__DBINTERFACE_PRIVATE=1 -Dmpool_error=printf -Dabort=abort_ "-Dvirt_fd_t=void*" $(BTREE_DEFS_EXTRA)
|
||||||
|
INC += -I$(TOP)/$(BTREE_DIR)/PORT/include
|
||||||
|
SRC_MOD += extmod/modbtree.c
|
||||||
|
SRC_MOD += $(addprefix $(BTREE_DIR)/,\
|
||||||
|
btree/bt_close.c \
|
||||||
|
btree/bt_conv.c \
|
||||||
|
btree/bt_debug.c \
|
||||||
|
btree/bt_delete.c \
|
||||||
|
btree/bt_get.c \
|
||||||
|
btree/bt_open.c \
|
||||||
|
btree/bt_overflow.c \
|
||||||
|
btree/bt_page.c \
|
||||||
|
btree/bt_put.c \
|
||||||
|
btree/bt_search.c \
|
||||||
|
btree/bt_seq.c \
|
||||||
|
btree/bt_split.c \
|
||||||
|
btree/bt_utils.c \
|
||||||
|
mpool/mpool.c \
|
||||||
|
)
|
||||||
|
CFLAGS_MOD += -DMICROPY_PY_BTREE=1
|
||||||
|
# we need to suppress certain warnings to get berkeley-db to compile cleanly
|
||||||
|
# and we have separate BTREE_DEFS so the definitions don't interfere with other source code
|
||||||
|
$(BUILD)/$(BTREE_DIR)/%.o: CFLAGS += -Wno-old-style-definition -Wno-sign-compare -Wno-unused-parameter $(BTREE_DEFS)
|
||||||
|
$(BUILD)/extmod/modbtree.o: CFLAGS += $(BTREE_DEFS)
|
||||||
|
endif
|
||||||
|
|
||||||
@ -334,7 +334,7 @@ STATIC mp_obj_t mod_ssl_wrap_socket(size_t n_args, const mp_obj_t *pos_args, mp_
|
|||||||
{ MP_QSTR_key, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
{ MP_QSTR_key, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
{ MP_QSTR_cert, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
{ MP_QSTR_cert, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
{ MP_QSTR_server_side, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
{ MP_QSTR_server_side, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
||||||
{ MP_QSTR_server_hostname, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
{ MP_QSTR_server_hostname, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_const_none_obj)} },
|
||||||
{ MP_QSTR_do_handshake, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
|
{ MP_QSTR_do_handshake, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
1
lib/mbedtls
Submodule
1
lib/mbedtls
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 3f8d78411a26e833db18d9fbde0e2f0baeda87f0
|
||||||
@ -28,7 +28,7 @@ SDKCONFIG ?= boards/sdkconfig
|
|||||||
SDKCONFIG_H = $(BUILD)/sdkconfig.h
|
SDKCONFIG_H = $(BUILD)/sdkconfig.h
|
||||||
|
|
||||||
# the git hash of the currently supported ESP IDF version
|
# the git hash of the currently supported ESP IDF version
|
||||||
ESPIDF_SUPHASH := 5c88c5996dbde6208e3bec05abc21ff6cd822d26
|
ESPIDF_SUPHASH := 6b3da6b1882f3b72e904cc90be67e9c4e3f369a9
|
||||||
|
|
||||||
# paths to ESP IDF and its components
|
# paths to ESP IDF and its components
|
||||||
ifeq ($(ESPIDF),)
|
ifeq ($(ESPIDF),)
|
||||||
@ -79,7 +79,10 @@ INC_ESPCOMP += -I$(ESPCOMP)/driver/include
|
|||||||
INC_ESPCOMP += -I$(ESPCOMP)/driver/include/driver
|
INC_ESPCOMP += -I$(ESPCOMP)/driver/include/driver
|
||||||
INC_ESPCOMP += -I$(ESPCOMP)/nghttp/port/include
|
INC_ESPCOMP += -I$(ESPCOMP)/nghttp/port/include
|
||||||
INC_ESPCOMP += -I$(ESPCOMP)/nghttp/nghttp2/lib/includes
|
INC_ESPCOMP += -I$(ESPCOMP)/nghttp/nghttp2/lib/includes
|
||||||
|
INC_ESPCOMP += -I$(ESPCOMP)/efuse/include
|
||||||
|
INC_ESPCOMP += -I$(ESPCOMP)/efuse/esp32/include
|
||||||
INC_ESPCOMP += -I$(ESPCOMP)/esp32/include
|
INC_ESPCOMP += -I$(ESPCOMP)/esp32/include
|
||||||
|
INC_ESPCOMP += -I$(ESPCOMP)/espcoredump/include
|
||||||
INC_ESPCOMP += -I$(ESPCOMP)/soc/include
|
INC_ESPCOMP += -I$(ESPCOMP)/soc/include
|
||||||
INC_ESPCOMP += -I$(ESPCOMP)/soc/esp32/include
|
INC_ESPCOMP += -I$(ESPCOMP)/soc/esp32/include
|
||||||
INC_ESPCOMP += -I$(ESPCOMP)/ethernet/include
|
INC_ESPCOMP += -I$(ESPCOMP)/ethernet/include
|
||||||
@ -135,7 +138,7 @@ LDFLAGS += -u call_user_start_cpu0 -u uxTopUsedPriority -u ld_include_panic_high
|
|||||||
LDFLAGS += -u __cxa_guard_dummy # so that implementation of static guards is taken from cxx_guards.o instead of libstdc++.a
|
LDFLAGS += -u __cxa_guard_dummy # so that implementation of static guards is taken from cxx_guards.o instead of libstdc++.a
|
||||||
LDFLAGS += -L$(ESPCOMP)/esp32/ld
|
LDFLAGS += -L$(ESPCOMP)/esp32/ld
|
||||||
LDFLAGS += -T $(BUILD)/esp32_out.ld
|
LDFLAGS += -T $(BUILD)/esp32_out.ld
|
||||||
LDFLAGS += -T $(BUILD)/esp32.common.ld
|
LDFLAGS += -T $(BUILD)/esp32.project.ld
|
||||||
LDFLAGS += -T esp32.rom.ld
|
LDFLAGS += -T esp32.rom.ld
|
||||||
LDFLAGS += -T esp32.rom.libgcc.ld
|
LDFLAGS += -T esp32.rom.libgcc.ld
|
||||||
LDFLAGS += -T esp32.peripherals.ld
|
LDFLAGS += -T esp32.peripherals.ld
|
||||||
@ -277,6 +280,12 @@ ESPIDF_DRIVER_O = $(addprefix $(ESPCOMP)/driver/,\
|
|||||||
rtc_module.o \
|
rtc_module.o \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ESPIDF_EFUSE_O = $(addprefix $(ESPCOMP)/efuse/,\
|
||||||
|
esp32/esp_efuse_table.o \
|
||||||
|
src/esp_efuse_api.o \
|
||||||
|
src/esp_efuse_utility.o \
|
||||||
|
)
|
||||||
|
|
||||||
$(BUILD)/$(ESPCOMP)/esp32/dport_access.o: CFLAGS += -Wno-array-bounds
|
$(BUILD)/$(ESPCOMP)/esp32/dport_access.o: CFLAGS += -Wno-array-bounds
|
||||||
ESPIDF_ESP32_O = $(addprefix $(ESPCOMP)/esp32/,\
|
ESPIDF_ESP32_O = $(addprefix $(ESPCOMP)/esp32/,\
|
||||||
brownout.o \
|
brownout.o \
|
||||||
@ -284,6 +293,7 @@ ESPIDF_ESP32_O = $(addprefix $(ESPCOMP)/esp32/,\
|
|||||||
coexist.o \
|
coexist.o \
|
||||||
dbg_stubs.o \
|
dbg_stubs.o \
|
||||||
dport_panic_highint_hdl.o \
|
dport_panic_highint_hdl.o \
|
||||||
|
esp_adapter.o \
|
||||||
esp_err_to_name.o \
|
esp_err_to_name.o \
|
||||||
esp_himem.o \
|
esp_himem.o \
|
||||||
panic.o \
|
panic.o \
|
||||||
@ -299,7 +309,6 @@ ESPIDF_ESP32_O = $(addprefix $(ESPCOMP)/esp32/,\
|
|||||||
task_wdt.o \
|
task_wdt.o \
|
||||||
cache_err_int.o \
|
cache_err_int.o \
|
||||||
clk.o \
|
clk.o \
|
||||||
core_dump.o \
|
|
||||||
cpu_start.o \
|
cpu_start.o \
|
||||||
gdbstub.o \
|
gdbstub.o \
|
||||||
crosscore_int.o \
|
crosscore_int.o \
|
||||||
@ -318,7 +327,6 @@ ESPIDF_ESP32_O = $(addprefix $(ESPCOMP)/esp32/,\
|
|||||||
intr_alloc.o \
|
intr_alloc.o \
|
||||||
dport_access.o \
|
dport_access.o \
|
||||||
wifi_init.o \
|
wifi_init.o \
|
||||||
wifi_os_adapter.o \
|
|
||||||
sleep_modes.o \
|
sleep_modes.o \
|
||||||
spiram.o \
|
spiram.o \
|
||||||
spiram_psram.o \
|
spiram_psram.o \
|
||||||
@ -693,6 +701,7 @@ ESPIDF_SDMMC_O = $(addprefix $(ESPCOMP)/sdmmc/,\
|
|||||||
OBJ_ESPIDF =
|
OBJ_ESPIDF =
|
||||||
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_NEWLIB_O))
|
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_NEWLIB_O))
|
||||||
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_DRIVER_O))
|
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_DRIVER_O))
|
||||||
|
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_EFUSE_O))
|
||||||
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_ESP32_O))
|
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_ESP32_O))
|
||||||
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_ESP_RINGBUF_O))
|
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_ESP_RINGBUF_O))
|
||||||
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_HEAP_O))
|
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_HEAP_O))
|
||||||
@ -724,6 +733,7 @@ $(OBJ_ESPIDF): $(SDKCONFIG_H)
|
|||||||
|
|
||||||
LIB_ESPIDF =
|
LIB_ESPIDF =
|
||||||
LIB_ESPIDF += driver
|
LIB_ESPIDF += driver
|
||||||
|
LIB_ESPIDF += efuse
|
||||||
LIB_ESPIDF += esp32
|
LIB_ESPIDF += esp32
|
||||||
LIB_ESPIDF += esp_ringbuf
|
LIB_ESPIDF += esp_ringbuf
|
||||||
LIB_ESPIDF += heap
|
LIB_ESPIDF += heap
|
||||||
@ -765,6 +775,7 @@ $(BUILD_ESPIDF_LIB)/$(1)/lib$(1).a: $(addprefix $$(BUILD)/,$(2))
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call gen_espidf_lib_rule,driver,$(ESPIDF_DRIVER_O)))
|
$(eval $(call gen_espidf_lib_rule,driver,$(ESPIDF_DRIVER_O)))
|
||||||
|
$(eval $(call gen_espidf_lib_rule,efuse,$(ESPIDF_EFUSE_O)))
|
||||||
$(eval $(call gen_espidf_lib_rule,esp32,$(ESPIDF_ESP32_O)))
|
$(eval $(call gen_espidf_lib_rule,esp32,$(ESPIDF_ESP32_O)))
|
||||||
$(eval $(call gen_espidf_lib_rule,esp_ringbuf,$(ESPIDF_ESP_RINGBUF_O)))
|
$(eval $(call gen_espidf_lib_rule,esp_ringbuf,$(ESPIDF_ESP_RINGBUF_O)))
|
||||||
$(eval $(call gen_espidf_lib_rule,heap,$(ESPIDF_HEAP_O)))
|
$(eval $(call gen_espidf_lib_rule,heap,$(ESPIDF_HEAP_O)))
|
||||||
@ -812,7 +823,7 @@ $(eval $(foreach lib,$(LIB_ESPIDF),$(eval $(call gen_sections_info_rule,$(BUILD_
|
|||||||
$(LDGEN_SECTION_INFOS): $(LDGEN_SECTIONS_INFO) $(ESPIDF)/make/ldgen.mk
|
$(LDGEN_SECTION_INFOS): $(LDGEN_SECTIONS_INFO) $(ESPIDF)/make/ldgen.mk
|
||||||
$(Q)printf "$(foreach info,$(LDGEN_SECTIONS_INFO),$(info)\n)" > $@
|
$(Q)printf "$(foreach info,$(LDGEN_SECTIONS_INFO),$(info)\n)" > $@
|
||||||
|
|
||||||
$(BUILD)/esp32.common.ld: $(ESPCOMP)/esp32/ld/esp32.common.ld.in $(LDGEN_FRAGMENTS) $(SDKCONFIG) $(LDGEN_SECTION_INFOS)
|
$(BUILD)/esp32.project.ld: $(ESPCOMP)/esp32/ld/esp32.project.ld.in $(LDGEN_FRAGMENTS) $(SDKCONFIG) $(LDGEN_SECTION_INFOS)
|
||||||
$(ECHO) "GEN $@"
|
$(ECHO) "GEN $@"
|
||||||
$(Q)$(PYTHON) $(ESPIDF)/tools/ldgen/ldgen.py \
|
$(Q)$(PYTHON) $(ESPIDF)/tools/ldgen/ldgen.py \
|
||||||
--input $< \
|
--input $< \
|
||||||
@ -872,7 +883,7 @@ $(BUILD)/application.bin: $(BUILD)/application.elf
|
|||||||
$(ECHO) "Create $@"
|
$(ECHO) "Create $@"
|
||||||
$(Q)$(ESPTOOL) --chip esp32 elf2image --flash_mode $(FLASH_MODE) --flash_freq $(FLASH_FREQ) --flash_size $(FLASH_SIZE) $<
|
$(Q)$(ESPTOOL) --chip esp32 elf2image --flash_mode $(FLASH_MODE) --flash_freq $(FLASH_FREQ) --flash_size $(FLASH_SIZE) $<
|
||||||
|
|
||||||
$(BUILD)/application.elf: $(OBJ) $(LIB) $(BUILD)/esp32_out.ld $(BUILD)/esp32.common.ld
|
$(BUILD)/application.elf: $(OBJ) $(LIB) $(BUILD)/esp32_out.ld $(BUILD)/esp32.project.ld
|
||||||
$(ECHO) "LINK $@"
|
$(ECHO) "LINK $@"
|
||||||
$(Q)$(LD) $(LDFLAGS) -o $@ $(APP_LD_ARGS)
|
$(Q)$(LD) $(LDFLAGS) -o $@ $(APP_LD_ARGS)
|
||||||
$(Q)$(SIZE) $@
|
$(Q)$(SIZE) $@
|
||||||
@ -899,7 +910,7 @@ $(BUILD)/%.o: %.cpp
|
|||||||
BOOTLOADER_LIB_DIR = $(BUILD)/bootloader
|
BOOTLOADER_LIB_DIR = $(BUILD)/bootloader
|
||||||
BOOTLOADER_LIB_ALL =
|
BOOTLOADER_LIB_ALL =
|
||||||
|
|
||||||
$(BUILD)/bootloader/$(ESPCOMP)/%.o: CFLAGS += -DBOOTLOADER_BUILD=1 -I$(ESPCOMP)/bootloader_support/include_priv -I$(ESPCOMP)/bootloader_support/include -I$(ESPCOMP)/micro-ecc/micro-ecc -I$(ESPCOMP)/esp32 -Wno-error=format
|
$(BUILD)/bootloader/$(ESPCOMP)/%.o: CFLAGS += -DBOOTLOADER_BUILD=1 -I$(ESPCOMP)/bootloader_support/include_priv -I$(ESPCOMP)/bootloader_support/include -I$(ESPCOMP)/micro-ecc/micro-ecc -I$(ESPCOMP)/efuse/include -I$(ESPCOMP)/esp32 -Wno-error=format
|
||||||
|
|
||||||
# libbootloader_support.a
|
# libbootloader_support.a
|
||||||
BOOTLOADER_LIB_ALL += bootloader_support
|
BOOTLOADER_LIB_ALL += bootloader_support
|
||||||
@ -911,7 +922,6 @@ BOOTLOADER_LIB_BOOTLOADER_SUPPORT_OBJ = $(addprefix $(BUILD)/bootloader/$(ESPCOM
|
|||||||
bootloader_support/src/bootloader_random.o \
|
bootloader_support/src/bootloader_random.o \
|
||||||
bootloader_support/src/bootloader_sha.o \
|
bootloader_support/src/bootloader_sha.o \
|
||||||
bootloader_support/src/bootloader_utility.o \
|
bootloader_support/src/bootloader_utility.o \
|
||||||
bootloader_support/src/efuse.o \
|
|
||||||
bootloader_support/src/flash_qio_mode.o \
|
bootloader_support/src/flash_qio_mode.o \
|
||||||
bootloader_support/src/secure_boot_signatures.o \
|
bootloader_support/src/secure_boot_signatures.o \
|
||||||
bootloader_support/src/secure_boot.o \
|
bootloader_support/src/secure_boot.o \
|
||||||
|
|||||||
@ -37,9 +37,9 @@ git hash of this version can be found by running `make` without a configured
|
|||||||
The binary toolchain (binutils, gcc, etc.) can be installed using the following
|
The binary toolchain (binutils, gcc, etc.) can be installed using the following
|
||||||
guides:
|
guides:
|
||||||
|
|
||||||
* [Linux installation](https://esp-idf.readthedocs.io/en/latest/get-started/linux-setup.html)
|
* [Linux installation](https://docs.espressif.com/projects/esp-idf/en/stable/get-started/linux-setup.html)
|
||||||
* [MacOS installation](https://esp-idf.readthedocs.io/en/latest/get-started/macos-setup.html)
|
* [MacOS installation](https://docs.espressif.com/projects/esp-idf/en/stable/get-started/macos-setup.html)
|
||||||
* [Windows installation](https://esp-idf.readthedocs.io/en/latest/get-started/windows-setup.html)
|
* [Windows installation](https://docs.espressif.com/projects/esp-idf/en/stable/get-started/windows-setup.html)
|
||||||
|
|
||||||
If you are on a Windows machine then the
|
If you are on a Windows machine then the
|
||||||
[Windows Subsystem for Linux](https://msdn.microsoft.com/en-au/commandline/wsl/install_guide)
|
[Windows Subsystem for Linux](https://msdn.microsoft.com/en-au/commandline/wsl/install_guide)
|
||||||
|
|||||||
@ -203,7 +203,6 @@ STATIC mp_obj_t machine_sdcard_make_new(const mp_obj_type_t *type, size_t n_args
|
|||||||
|
|
||||||
if (is_spi) {
|
if (is_spi) {
|
||||||
self->host.slot = slot_num ? HSPI_HOST : VSPI_HOST;
|
self->host.slot = slot_num ? HSPI_HOST : VSPI_HOST;
|
||||||
slot_num -= 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_printf(" Calling host.init()");
|
DEBUG_printf(" Calling host.init()");
|
||||||
|
|||||||
@ -301,7 +301,7 @@ void uart_task_handler(os_event_t *evt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int c, ret = 0;
|
int c, ret = 0;
|
||||||
while ((c = ringbuf_get(&input_buf)) >= 0) {
|
while ((c = ringbuf_get(&stdin_ringbuf)) >= 0) {
|
||||||
if (c == mp_interrupt_char) {
|
if (c == mp_interrupt_char) {
|
||||||
mp_keyboard_interrupt();
|
mp_keyboard_interrupt();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -222,7 +222,7 @@ SRC_C = \
|
|||||||
usbd_desc.c \
|
usbd_desc.c \
|
||||||
usbd_cdc_interface.c \
|
usbd_cdc_interface.c \
|
||||||
usbd_hid_interface.c \
|
usbd_hid_interface.c \
|
||||||
usbd_msc_storage.c \
|
usbd_msc_interface.c \
|
||||||
mphalport.c \
|
mphalport.c \
|
||||||
mpthreadport.c \
|
mpthreadport.c \
|
||||||
irq.c \
|
irq.c \
|
||||||
@ -349,7 +349,6 @@ SRC_USBDEV = $(addprefix $(USBDEV_DIR)/,\
|
|||||||
class/src/usbd_cdc_msc_hid.c \
|
class/src/usbd_cdc_msc_hid.c \
|
||||||
class/src/usbd_msc_bot.c \
|
class/src/usbd_msc_bot.c \
|
||||||
class/src/usbd_msc_scsi.c \
|
class/src/usbd_msc_scsi.c \
|
||||||
class/src/usbd_msc_data.c \
|
|
||||||
)
|
)
|
||||||
|
|
||||||
ifeq ($(MICROPY_PY_NETWORK_CYW43),1)
|
ifeq ($(MICROPY_PY_NETWORK_CYW43),1)
|
||||||
@ -396,6 +395,11 @@ SRC_MOD += $(addprefix $(CC3000_DIR)/src/,\
|
|||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(MICROPY_SSL_MBEDTLS),1)
|
||||||
|
CFLAGS_MOD += -DMBEDTLS_CONFIG_FILE='"mbedtls/mbedtls_config.h"'
|
||||||
|
SRC_MOD += mbedtls/mbedtls_port.c
|
||||||
|
endif
|
||||||
|
|
||||||
OBJ =
|
OBJ =
|
||||||
OBJ += $(PY_O)
|
OBJ += $(PY_O)
|
||||||
OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o))
|
OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o))
|
||||||
|
|||||||
@ -29,16 +29,16 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K;
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = _ram_end - 16K; /* 16k stack */
|
_heap_end = _sstack;
|
||||||
|
|
||||||
ENTRY(Reset_Handler)
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
|
|||||||
@ -12,3 +12,5 @@ TEXT1_SECTIONS = .text_ext
|
|||||||
# MicroPython settings
|
# MicroPython settings
|
||||||
MICROPY_PY_LWIP = 1
|
MICROPY_PY_LWIP = 1
|
||||||
MICROPY_PY_NETWORK_CYW43 = 1
|
MICROPY_PY_NETWORK_CYW43 = 1
|
||||||
|
MICROPY_PY_USSL = 1
|
||||||
|
MICROPY_SSL_MBEDTLS = 1
|
||||||
|
|||||||
@ -12,3 +12,5 @@ TEXT1_SECTIONS = .text_ext
|
|||||||
# MicroPython settings
|
# MicroPython settings
|
||||||
MICROPY_PY_LWIP = 1
|
MICROPY_PY_LWIP = 1
|
||||||
MICROPY_PY_NETWORK_CYW43 = 1
|
MICROPY_PY_NETWORK_CYW43 = 1
|
||||||
|
MICROPY_PY_USSL = 1
|
||||||
|
MICROPY_SSL_MBEDTLS = 1
|
||||||
|
|||||||
@ -28,16 +28,16 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 24K;
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = _ram_end - 24K; /* 24k stack */
|
_heap_end = _sstack;
|
||||||
|
|
||||||
ENTRY(Reset_Handler)
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
|
|||||||
@ -9,3 +9,5 @@ TEXT0_ADDR = 0x08008000
|
|||||||
# MicroPython settings
|
# MicroPython settings
|
||||||
MICROPY_PY_LWIP = 1
|
MICROPY_PY_LWIP = 1
|
||||||
MICROPY_PY_NETWORK_CYW43 = 1
|
MICROPY_PY_NETWORK_CYW43 = 1
|
||||||
|
MICROPY_PY_USSL = 1
|
||||||
|
MICROPY_SSL_MBEDTLS = 1
|
||||||
|
|||||||
@ -27,14 +27,16 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack */
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 32K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20078000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|
||||||
ENTRY(Reset_Handler)
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
|
|||||||
@ -14,13 +14,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 6K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20006800; /* room for a 6k stack */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -14,15 +14,15 @@ MEMORY
|
|||||||
|
|
||||||
/* produce a link error if there is not this amount of RAM for these sections */
|
/* produce a link error if there is not this amount of RAM for these sections */
|
||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K; /* tunable */
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K;
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20014000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -16,13 +16,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20014000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -17,13 +17,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2001c000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -16,13 +16,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2001c000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -19,13 +19,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = _ram_end - 16K; /* 240K, tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -19,13 +19,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = _ram_end - 16K; /* 240K, tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -17,13 +17,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2002c000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -18,11 +18,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* top end of the stack */
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2002c000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -15,13 +15,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 32K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20038000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
GNU linker script for STM32F405
|
GNU linker script for STM32F746
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Specify the memory areas */
|
/* Specify the memory areas */
|
||||||
@ -17,13 +17,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2004c000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -18,13 +18,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 32K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20078000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -17,13 +17,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 32K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20078000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -17,13 +17,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define tho top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2407C000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -15,13 +15,13 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define the top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 6K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2000A800; /* room for a 6k stack */
|
_heap_end = _sstack;
|
||||||
|
|||||||
@ -18,10 +18,10 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define the top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_fs_cache_start = ORIGIN(FS_CACHE);
|
_ram_fs_cache_start = ORIGIN(FS_CACHE);
|
||||||
@ -29,7 +29,7 @@ _ram_fs_cache_end = ORIGIN(FS_CACHE) + LENGTH(FS_CACHE);
|
|||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20014000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|
||||||
_flash_fs_start = ORIGIN(FLASH_FS);
|
_flash_fs_start = ORIGIN(FLASH_FS);
|
||||||
_flash_fs_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
|
_flash_fs_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
|
||||||
|
|||||||
@ -18,10 +18,10 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define the top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_sstack = _estack - 16K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_fs_cache_start = ORIGIN(FS_CACHE);
|
_ram_fs_cache_start = ORIGIN(FS_CACHE);
|
||||||
@ -29,7 +29,7 @@ _ram_fs_cache_end = ORIGIN(FS_CACHE) + LENGTH(FS_CACHE);
|
|||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x20014000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|
||||||
_flash_fs_start = ORIGIN(FLASH_FS);
|
_flash_fs_start = ORIGIN(FLASH_FS);
|
||||||
_flash_fs_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
|
_flash_fs_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
|
||||||
|
|||||||
@ -18,10 +18,10 @@ MEMORY
|
|||||||
_minimum_stack_size = 2K;
|
_minimum_stack_size = 2K;
|
||||||
_minimum_heap_size = 16K;
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* Define the top end of the stack. The stack is full descending so begins just
|
/* Define the stack. The stack is full descending so begins just above last byte
|
||||||
above last byte of RAM. Note that EABI requires the stack to be 8-byte
|
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
|
||||||
aligned for a call. */
|
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM) + LENGTH(SRAM2);
|
_estack = ORIGIN(RAM) + LENGTH(RAM) + LENGTH(SRAM2);
|
||||||
|
_sstack = _estack - 206K; /* tunable */
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector */
|
||||||
_ram_fs_cache_start = ORIGIN(FS_CACHE);
|
_ram_fs_cache_start = ORIGIN(FS_CACHE);
|
||||||
@ -29,7 +29,7 @@ _ram_fs_cache_end = ORIGIN(FS_CACHE) + LENGTH(FS_CACHE);
|
|||||||
_ram_start = ORIGIN(RAM);
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM) + LENGTH(SRAM2);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM) + LENGTH(SRAM2);
|
||||||
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
_heap_start = _ebss; /* heap starts just after statically allocated memory */
|
||||||
_heap_end = 0x2001C000; /* tunable */
|
_heap_end = _sstack;
|
||||||
|
|
||||||
_flash_fs_start = ORIGIN(FLASH_FS);
|
_flash_fs_start = ORIGIN(FLASH_FS);
|
||||||
_flash_fs_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
|
_flash_fs_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
|
||||||
|
|||||||
@ -37,6 +37,7 @@ extern uint32_t _sbss;
|
|||||||
extern uint32_t _ebss;
|
extern uint32_t _ebss;
|
||||||
extern uint32_t _heap_start;
|
extern uint32_t _heap_start;
|
||||||
extern uint32_t _heap_end;
|
extern uint32_t _heap_end;
|
||||||
|
extern uint32_t _sstack;
|
||||||
extern uint32_t _estack;
|
extern uint32_t _estack;
|
||||||
extern uint32_t _ram_end;
|
extern uint32_t _ram_end;
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,11 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// This protection is not needed, instead we execute all lwIP code at PendSV priority
|
||||||
|
#define SYS_ARCH_DECL_PROTECT(lev) do { } while (0)
|
||||||
|
#define SYS_ARCH_PROTECT(lev) do { } while (0)
|
||||||
|
#define SYS_ARCH_UNPROTECT(lev) do { } while (0)
|
||||||
|
|
||||||
#define NO_SYS 1
|
#define NO_SYS 1
|
||||||
#define SYS_LIGHTWEIGHT_PROT 1
|
#define SYS_LIGHTWEIGHT_PROT 1
|
||||||
#define MEM_ALIGNMENT 4
|
#define MEM_ALIGNMENT 4
|
||||||
@ -20,10 +25,17 @@
|
|||||||
#define LWIP_IPV6 0
|
#define LWIP_IPV6 0
|
||||||
#define LWIP_DHCP 1
|
#define LWIP_DHCP 1
|
||||||
#define LWIP_DHCP_CHECK_LINK_UP 1
|
#define LWIP_DHCP_CHECK_LINK_UP 1
|
||||||
|
#define DHCP_DOES_ARP_CHECK 0 // to speed DHCP up
|
||||||
#define LWIP_DNS 1
|
#define LWIP_DNS 1
|
||||||
|
#define LWIP_DNS_SUPPORT_MDNS_QUERIES 1
|
||||||
|
#define LWIP_MDNS_RESPONDER 1
|
||||||
#define LWIP_IGMP 1
|
#define LWIP_IGMP 1
|
||||||
|
|
||||||
|
#define LWIP_NUM_NETIF_CLIENT_DATA 1 // mDNS responder requires 1
|
||||||
|
#define MEMP_NUM_UDP_PCB 5 // mDNS responder requires 1
|
||||||
|
|
||||||
#define SO_REUSE 1
|
#define SO_REUSE 1
|
||||||
|
#define TCP_LISTEN_BACKLOG 1
|
||||||
|
|
||||||
extern uint32_t rng_get(void);
|
extern uint32_t rng_get(void);
|
||||||
#define LWIP_RAND() rng_get()
|
#define LWIP_RAND() rng_get()
|
||||||
|
|||||||
@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
#if MICROPY_PY_LWIP
|
#if MICROPY_PY_LWIP
|
||||||
#include "lwip/init.h"
|
#include "lwip/init.h"
|
||||||
|
#include "lwip/apps/mdns.h"
|
||||||
#include "drivers/cyw43/cyw43.h"
|
#include "drivers/cyw43/cyw43.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -479,6 +480,9 @@ void stm32_main(uint32_t reset_mode) {
|
|||||||
// because the system timeout list (next_timeout) is only ever reset by BSS clearing.
|
// because the system timeout list (next_timeout) is only ever reset by BSS clearing.
|
||||||
// So for now we only init the lwIP stack once on power-up.
|
// So for now we only init the lwIP stack once on power-up.
|
||||||
lwip_init();
|
lwip_init();
|
||||||
|
#if LWIP_MDNS_RESPONDER
|
||||||
|
mdns_resp_init();
|
||||||
|
#endif
|
||||||
systick_enable_dispatch(SYSTICK_DISPATCH_LWIP, mod_network_lwip_poll_wrapper);
|
systick_enable_dispatch(SYSTICK_DISPATCH_LWIP, mod_network_lwip_poll_wrapper);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -532,7 +536,7 @@ soft_reset:
|
|||||||
// to recover from limit hit. (Limit is measured in bytes.)
|
// to recover from limit hit. (Limit is measured in bytes.)
|
||||||
// Note: stack control relies on main thread being initialised above
|
// Note: stack control relies on main thread being initialised above
|
||||||
mp_stack_set_top(&_estack);
|
mp_stack_set_top(&_estack);
|
||||||
mp_stack_set_limit((char*)&_estack - (char*)&_heap_end - 1024);
|
mp_stack_set_limit((char*)&_estack - (char*)&_sstack - 1024);
|
||||||
|
|
||||||
// GC init
|
// GC init
|
||||||
gc_init(MICROPY_HEAP_START, MICROPY_HEAP_END);
|
gc_init(MICROPY_HEAP_START, MICROPY_HEAP_END);
|
||||||
@ -641,7 +645,7 @@ soft_reset:
|
|||||||
#if MICROPY_HW_ENABLE_USB
|
#if MICROPY_HW_ENABLE_USB
|
||||||
// init USB device to default setting if it was not already configured
|
// init USB device to default setting if it was not already configured
|
||||||
if (!(pyb_usb_flags & PYB_USB_FLAG_USB_MODE_CALLED)) {
|
if (!(pyb_usb_flags & PYB_USB_FLAG_USB_MODE_CALLED)) {
|
||||||
pyb_usb_dev_init(USBD_VID, USBD_PID_CDC_MSC, USBD_MODE_CDC_MSC, NULL);
|
pyb_usb_dev_init(USBD_VID, USBD_PID_CDC_MSC, USBD_MODE_CDC_MSC, 0, NULL, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
93
ports/stm32/mbedtls/mbedtls_config.h
Normal file
93
ports/stm32/mbedtls/mbedtls_config.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2018-2019 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.
|
||||||
|
*/
|
||||||
|
#ifndef MICROPY_INCLUDED_MBEDTLS_CONFIG_H
|
||||||
|
#define MICROPY_INCLUDED_MBEDTLS_CONFIG_H
|
||||||
|
|
||||||
|
// Set mbedtls configuration
|
||||||
|
#define MBEDTLS_PLATFORM_MEMORY
|
||||||
|
#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
|
||||||
|
#define MBEDTLS_DEPRECATED_REMOVED
|
||||||
|
#define MBEDTLS_ENTROPY_HARDWARE_ALT
|
||||||
|
#define MBEDTLS_AES_ROM_TABLES
|
||||||
|
#define MBEDTLS_CIPHER_MODE_CBC
|
||||||
|
#define MBEDTLS_ECP_DP_SECP192R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP224R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP384R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP521R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP192K1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP224K1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_SECP256K1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_BP256R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_BP384R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_BP512R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_DP_CURVE25519_ENABLED
|
||||||
|
#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
|
||||||
|
#define MBEDTLS_NO_PLATFORM_ENTROPY
|
||||||
|
#define MBEDTLS_PKCS1_V15
|
||||||
|
#define MBEDTLS_SHA256_SMALLER
|
||||||
|
#define MBEDTLS_SSL_PROTO_TLS1
|
||||||
|
#define MBEDTLS_SSL_PROTO_TLS1_1
|
||||||
|
#define MBEDTLS_SSL_PROTO_TLS1_2
|
||||||
|
#define MBEDTLS_SSL_SERVER_NAME_INDICATION
|
||||||
|
|
||||||
|
// Enable mbedtls modules
|
||||||
|
#define MBEDTLS_AES_C
|
||||||
|
#define MBEDTLS_ASN1_PARSE_C
|
||||||
|
#define MBEDTLS_BIGNUM_C
|
||||||
|
#define MBEDTLS_CIPHER_C
|
||||||
|
#define MBEDTLS_CTR_DRBG_C
|
||||||
|
//#define MBEDTLS_ECP_C
|
||||||
|
#define MBEDTLS_ENTROPY_C
|
||||||
|
#define MBEDTLS_MD_C
|
||||||
|
#define MBEDTLS_MD5_C
|
||||||
|
#define MBEDTLS_OID_C
|
||||||
|
#define MBEDTLS_PKCS5_C
|
||||||
|
#define MBEDTLS_PK_C
|
||||||
|
#define MBEDTLS_PK_PARSE_C
|
||||||
|
#define MBEDTLS_PLATFORM_C
|
||||||
|
#define MBEDTLS_RSA_C
|
||||||
|
#define MBEDTLS_SHA1_C
|
||||||
|
#define MBEDTLS_SHA256_C
|
||||||
|
#define MBEDTLS_SHA512_C
|
||||||
|
#define MBEDTLS_SSL_CLI_C
|
||||||
|
#define MBEDTLS_SSL_SRV_C
|
||||||
|
#define MBEDTLS_SSL_TLS_C
|
||||||
|
#define MBEDTLS_X509_CRT_PARSE_C
|
||||||
|
#define MBEDTLS_X509_USE_C
|
||||||
|
|
||||||
|
// Memory allocation hooks
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
void *m_calloc_mbedtls(size_t nmemb, size_t size);
|
||||||
|
void m_free_mbedtls(void *ptr);
|
||||||
|
#define MBEDTLS_PLATFORM_STD_CALLOC m_calloc_mbedtls
|
||||||
|
#define MBEDTLS_PLATFORM_STD_FREE m_free_mbedtls
|
||||||
|
#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf
|
||||||
|
|
||||||
|
#include "mbedtls/check_config.h"
|
||||||
|
|
||||||
|
#endif /* MICROPY_INCLUDED_MBEDTLS_CONFIG_H */
|
||||||
96
ports/stm32/mbedtls/mbedtls_port.c
Normal file
96
ports/stm32/mbedtls/mbedtls_port.c
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 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 "py/runtime.h"
|
||||||
|
#include "py/gc.h"
|
||||||
|
#include "rng.h"
|
||||||
|
#include "mbedtls_config.h"
|
||||||
|
|
||||||
|
#define DEBUG (0)
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
static size_t count_links(uint32_t *nb) {
|
||||||
|
void **p = MP_STATE_PORT(mbedtls_memory);
|
||||||
|
size_t n = 0;
|
||||||
|
*nb = 0;
|
||||||
|
while (p != NULL) {
|
||||||
|
++n;
|
||||||
|
*nb += gc_nbytes(p);
|
||||||
|
p = (void**)p[1];
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *m_calloc_mbedtls(size_t nmemb, size_t size) {
|
||||||
|
void **ptr = m_malloc0(nmemb * size + 2 * sizeof(uintptr_t));
|
||||||
|
#if DEBUG
|
||||||
|
uint32_t nb;
|
||||||
|
size_t n = count_links(&nb);
|
||||||
|
printf("mbed_alloc(%u, %u) -> (%u;%u) %p\n", nmemb, size, n, (uint)nb, ptr);
|
||||||
|
#endif
|
||||||
|
if (MP_STATE_PORT(mbedtls_memory) != NULL) {
|
||||||
|
MP_STATE_PORT(mbedtls_memory)[0] = ptr;
|
||||||
|
}
|
||||||
|
ptr[0] = NULL;
|
||||||
|
ptr[1] = MP_STATE_PORT(mbedtls_memory);
|
||||||
|
MP_STATE_PORT(mbedtls_memory) = ptr;
|
||||||
|
return &ptr[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void m_free_mbedtls(void *ptr_in) {
|
||||||
|
void **ptr = &((void**)ptr_in)[-2];
|
||||||
|
#if DEBUG
|
||||||
|
uint32_t nb;
|
||||||
|
size_t n = count_links(&nb);
|
||||||
|
printf("mbed_free(%p, [%p, %p], nbytes=%u, links=%u;%u)\n", ptr, ptr[0], ptr[1], gc_nbytes(ptr), n, (uint)nb);
|
||||||
|
#endif
|
||||||
|
if (ptr[1] != NULL) {
|
||||||
|
((void**)ptr[1])[0] = ptr[0];
|
||||||
|
}
|
||||||
|
if (ptr[0] != NULL) {
|
||||||
|
((void**)ptr[0])[1] = ptr[1];
|
||||||
|
} else {
|
||||||
|
MP_STATE_PORT(mbedtls_memory) = ptr[1];
|
||||||
|
}
|
||||||
|
m_free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mbedtls_hardware_poll(void *data, unsigned char *output, size_t len, size_t *olen) {
|
||||||
|
uint32_t val;
|
||||||
|
int n = 0;
|
||||||
|
*olen = len;
|
||||||
|
while (len--) {
|
||||||
|
if (!n) {
|
||||||
|
val = rng_get();
|
||||||
|
n = 4;
|
||||||
|
}
|
||||||
|
*output++ = val;
|
||||||
|
val >>= 8;
|
||||||
|
--n;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -174,6 +174,7 @@ STATIC mp_obj_t machine_info(size_t n_args, const mp_obj_t *args) {
|
|||||||
printf("_edata=%p\n", &_edata);
|
printf("_edata=%p\n", &_edata);
|
||||||
printf("_sbss=%p\n", &_sbss);
|
printf("_sbss=%p\n", &_sbss);
|
||||||
printf("_ebss=%p\n", &_ebss);
|
printf("_ebss=%p\n", &_ebss);
|
||||||
|
printf("_sstack=%p\n", &_sstack);
|
||||||
printf("_estack=%p\n", &_estack);
|
printf("_estack=%p\n", &_estack);
|
||||||
printf("_ram_start=%p\n", &_ram_start);
|
printf("_ram_start=%p\n", &_ram_start);
|
||||||
printf("_heap_start=%p\n", &_heap_start);
|
printf("_heap_start=%p\n", &_heap_start);
|
||||||
|
|||||||
@ -44,6 +44,7 @@
|
|||||||
#include "lwip/timeouts.h"
|
#include "lwip/timeouts.h"
|
||||||
#include "lwip/dns.h"
|
#include "lwip/dns.h"
|
||||||
#include "lwip/dhcp.h"
|
#include "lwip/dhcp.h"
|
||||||
|
#include "lwip/apps/mdns.h"
|
||||||
#include "extmod/network_cyw43.h"
|
#include "extmod/network_cyw43.h"
|
||||||
#include "drivers/cyw43/cyw43.h"
|
#include "drivers/cyw43/cyw43.h"
|
||||||
|
|
||||||
@ -188,6 +189,10 @@ mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_o
|
|||||||
mp_hal_delay_ms(100);
|
mp_hal_delay_ms(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LWIP_MDNS_RESPONDER
|
||||||
|
mdns_resp_netif_settings_changed(netif);
|
||||||
|
#endif
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
} else {
|
} else {
|
||||||
// Release and stop any existing DHCP
|
// Release and stop any existing DHCP
|
||||||
@ -202,6 +207,9 @@ mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_o
|
|||||||
ip_addr_t dns;
|
ip_addr_t dns;
|
||||||
netutils_parse_ipv4_addr(items[3], (uint8_t*)&dns, NETUTILS_BIG);
|
netutils_parse_ipv4_addr(items[3], (uint8_t*)&dns, NETUTILS_BIG);
|
||||||
dns_setserver(0, &dns);
|
dns_setserver(0, &dns);
|
||||||
|
#if LWIP_MDNS_RESPONDER
|
||||||
|
mdns_resp_netif_settings_changed(netif);
|
||||||
|
#endif
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -224,6 +224,12 @@ extern const struct _mp_obj_module_t mp_module_onewire;
|
|||||||
#define SOCKET_BUILTIN_MODULE_WEAK_LINKS
|
#define SOCKET_BUILTIN_MODULE_WEAK_LINKS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MICROPY_PY_USSL
|
||||||
|
#define SSL_BUILTIN_MODULE_WEAK_LINKS { MP_ROM_QSTR(MP_QSTR_ssl), MP_ROM_PTR(&mp_module_ussl) },
|
||||||
|
#else
|
||||||
|
#define SSL_BUILTIN_MODULE_WEAK_LINKS
|
||||||
|
#endif
|
||||||
|
|
||||||
#if MICROPY_PY_NETWORK
|
#if MICROPY_PY_NETWORK
|
||||||
#define NETWORK_BUILTIN_MODULE { MP_ROM_QSTR(MP_QSTR_network), MP_ROM_PTR(&mp_module_network) },
|
#define NETWORK_BUILTIN_MODULE { MP_ROM_QSTR(MP_QSTR_network), MP_ROM_PTR(&mp_module_network) },
|
||||||
#else
|
#else
|
||||||
@ -254,6 +260,7 @@ extern const struct _mp_obj_module_t mp_module_onewire;
|
|||||||
{ MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&mp_module_utime) }, \
|
{ MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&mp_module_utime) }, \
|
||||||
{ MP_ROM_QSTR(MP_QSTR_select), MP_ROM_PTR(&mp_module_uselect) }, \
|
{ MP_ROM_QSTR(MP_QSTR_select), MP_ROM_PTR(&mp_module_uselect) }, \
|
||||||
SOCKET_BUILTIN_MODULE_WEAK_LINKS \
|
SOCKET_BUILTIN_MODULE_WEAK_LINKS \
|
||||||
|
SSL_BUILTIN_MODULE_WEAK_LINKS \
|
||||||
{ MP_ROM_QSTR(MP_QSTR_struct), MP_ROM_PTR(&mp_module_ustruct) }, \
|
{ MP_ROM_QSTR(MP_QSTR_struct), MP_ROM_PTR(&mp_module_ustruct) }, \
|
||||||
{ MP_ROM_QSTR(MP_QSTR_machine), MP_ROM_PTR(&machine_module) }, \
|
{ MP_ROM_QSTR(MP_QSTR_machine), MP_ROM_PTR(&machine_module) }, \
|
||||||
{ MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_module_uerrno) }, \
|
{ MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_module_uerrno) }, \
|
||||||
@ -267,6 +274,12 @@ extern const struct _mp_obj_module_t mp_module_onewire;
|
|||||||
|
|
||||||
#define MP_STATE_PORT MP_STATE_VM
|
#define MP_STATE_PORT MP_STATE_VM
|
||||||
|
|
||||||
|
#if MICROPY_SSL_MBEDTLS
|
||||||
|
#define MICROPY_PORT_ROOT_POINTER_MBEDTLS void **mbedtls_memory;
|
||||||
|
#else
|
||||||
|
#define MICROPY_PORT_ROOT_POINTER_MBEDTLS
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MICROPY_PORT_ROOT_POINTERS \
|
#define MICROPY_PORT_ROOT_POINTERS \
|
||||||
const char *readline_hist[8]; \
|
const char *readline_hist[8]; \
|
||||||
\
|
\
|
||||||
@ -295,6 +308,8 @@ extern const struct _mp_obj_module_t mp_module_onewire;
|
|||||||
\
|
\
|
||||||
/* list of registered NICs */ \
|
/* list of registered NICs */ \
|
||||||
mp_obj_list_t mod_network_nic_list; \
|
mp_obj_list_t mod_network_nic_list; \
|
||||||
|
\
|
||||||
|
MICROPY_PORT_ROOT_POINTER_MBEDTLS
|
||||||
|
|
||||||
// type definitions for the specific machine
|
// type definitions for the specific machine
|
||||||
|
|
||||||
|
|||||||
@ -70,8 +70,8 @@ void pyb_thread_init(pyb_thread_t *thread) {
|
|||||||
thread->sp = NULL; // will be set when this thread switches out
|
thread->sp = NULL; // will be set when this thread switches out
|
||||||
thread->local_state = 0; // will be set by mp_thread_init
|
thread->local_state = 0; // will be set by mp_thread_init
|
||||||
thread->arg = NULL;
|
thread->arg = NULL;
|
||||||
thread->stack = &_heap_end;
|
thread->stack = &_sstack;
|
||||||
thread->stack_len = ((uint32_t)&_estack - (uint32_t)&_heap_end) / sizeof(uint32_t);
|
thread->stack_len = ((uint32_t)&_estack - (uint32_t)&_sstack) / sizeof(uint32_t);
|
||||||
thread->all_next = NULL;
|
thread->all_next = NULL;
|
||||||
thread->run_prev = thread;
|
thread->run_prev = thread;
|
||||||
thread->run_next = thread;
|
thread->run_next = thread;
|
||||||
|
|||||||
@ -181,7 +181,7 @@ void HardFault_C_Handler(ExceptionRegisters_t *regs) {
|
|||||||
if ((void*)&_ram_start <= (void*)regs && (void*)regs < (void*)&_ram_end) {
|
if ((void*)&_ram_start <= (void*)regs && (void*)regs < (void*)&_ram_end) {
|
||||||
mp_hal_stdout_tx_str("Stack:\r\n");
|
mp_hal_stdout_tx_str("Stack:\r\n");
|
||||||
uint32_t *stack_top = &_estack;
|
uint32_t *stack_top = &_estack;
|
||||||
if ((void*)regs < (void*)&_heap_end) {
|
if ((void*)regs < (void*)&_sstack) {
|
||||||
// stack not in static stack area so limit the amount we print
|
// stack not in static stack area so limit the amount we print
|
||||||
stack_top = (uint32_t*)regs + 32;
|
stack_top = (uint32_t*)regs + 32;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,7 +31,7 @@
|
|||||||
#include "usbd_desc.h"
|
#include "usbd_desc.h"
|
||||||
#include "usbd_cdc_msc_hid.h"
|
#include "usbd_cdc_msc_hid.h"
|
||||||
#include "usbd_cdc_interface.h"
|
#include "usbd_cdc_interface.h"
|
||||||
#include "usbd_msc_storage.h"
|
#include "usbd_msc_interface.h"
|
||||||
#include "usbd_hid_interface.h"
|
#include "usbd_hid_interface.h"
|
||||||
|
|
||||||
#include "py/objstr.h"
|
#include "py/objstr.h"
|
||||||
@ -40,6 +40,8 @@
|
|||||||
#include "py/mperrno.h"
|
#include "py/mperrno.h"
|
||||||
#include "py/mphal.h"
|
#include "py/mphal.h"
|
||||||
#include "bufhelper.h"
|
#include "bufhelper.h"
|
||||||
|
#include "storage.h"
|
||||||
|
#include "sdcard.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
|
||||||
#if MICROPY_HW_ENABLE_USB
|
#if MICROPY_HW_ENABLE_USB
|
||||||
@ -118,7 +120,7 @@ void pyb_usb_init0(void) {
|
|||||||
pyb_usb_vcp_init0();
|
pyb_usb_vcp_init0();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, uint8_t mode, USBD_HID_ModeInfoTypeDef *hid_info) {
|
bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, uint8_t mode, size_t msc_n, const void *msc_unit, USBD_HID_ModeInfoTypeDef *hid_info) {
|
||||||
usb_device_t *usb_dev = &usb_device;
|
usb_device_t *usb_dev = &usb_device;
|
||||||
if (!usb_dev->enabled) {
|
if (!usb_dev->enabled) {
|
||||||
// only init USB once in the device's power-lifetime
|
// only init USB once in the device's power-lifetime
|
||||||
@ -143,16 +145,24 @@ bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, uint8_t mode, USBD_HID_ModeInf
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Configure the MSC interface
|
||||||
|
const void *msc_unit_default[1];
|
||||||
|
if (msc_n == 0) {
|
||||||
|
msc_n = 1;
|
||||||
|
msc_unit = msc_unit_default;
|
||||||
switch (pyb_usb_storage_medium) {
|
switch (pyb_usb_storage_medium) {
|
||||||
#if MICROPY_HW_ENABLE_SDCARD
|
#if MICROPY_HW_ENABLE_SDCARD
|
||||||
case PYB_USB_STORAGE_MEDIUM_SDCARD:
|
case PYB_USB_STORAGE_MEDIUM_SDCARD:
|
||||||
USBD_MSC_RegisterStorage(&usb_dev->usbd_cdc_msc_hid_state, (USBD_StorageTypeDef*)&USBD_SDCARD_STORAGE_fops);
|
msc_unit_default[0] = &pyb_sdcard_type;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
USBD_MSC_RegisterStorage(&usb_dev->usbd_cdc_msc_hid_state, (USBD_StorageTypeDef*)&USBD_FLASH_STORAGE_fops);
|
msc_unit_default[0] = &pyb_flash_type;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
usbd_msc_init_lu(msc_n, msc_unit);
|
||||||
|
USBD_MSC_RegisterStorage(&usb_dev->usbd_cdc_msc_hid_state, (USBD_StorageTypeDef*)&usbd_msc_fops);
|
||||||
|
|
||||||
// start the USB device
|
// start the USB device
|
||||||
USBD_LL_Init(usbd, (mode & USBD_MODE_HIGH_SPEED) != 0);
|
USBD_LL_Init(usbd, (mode & USBD_MODE_HIGH_SPEED) != 0);
|
||||||
@ -220,10 +230,12 @@ usbd_cdc_itf_t *usb_vcp_get(int idx) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
enum { ARG_mode, ARG_vid, ARG_pid, ARG_msc, ARG_hid, ARG_high_speed };
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_mode, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_const_none_obj)} },
|
{ MP_QSTR_mode, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_const_none_obj)} },
|
||||||
{ MP_QSTR_vid, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = USBD_VID} },
|
{ MP_QSTR_vid, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = USBD_VID} },
|
||||||
{ MP_QSTR_pid, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
|
{ MP_QSTR_pid, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
|
||||||
|
{ MP_QSTR_msc, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_const_empty_tuple_obj)} },
|
||||||
{ MP_QSTR_hid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&pyb_usb_hid_mouse_obj)} },
|
{ MP_QSTR_hid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&pyb_usb_hid_mouse_obj)} },
|
||||||
#if USBD_SUPPORT_HS_MODE
|
#if USBD_SUPPORT_HS_MODE
|
||||||
{ MP_QSTR_high_speed, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
{ MP_QSTR_high_speed, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
||||||
@ -263,14 +275,14 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
|
|||||||
pyb_usb_flags |= PYB_USB_FLAG_USB_MODE_CALLED;
|
pyb_usb_flags |= PYB_USB_FLAG_USB_MODE_CALLED;
|
||||||
|
|
||||||
// check if user wants to disable the USB
|
// check if user wants to disable the USB
|
||||||
if (args[0].u_obj == mp_const_none) {
|
if (args[ARG_mode].u_obj == mp_const_none) {
|
||||||
// disable usb
|
// disable usb
|
||||||
pyb_usb_dev_deinit();
|
pyb_usb_dev_deinit();
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get mode string
|
// get mode string
|
||||||
const char *mode_str = mp_obj_str_get_str(args[0].u_obj);
|
const char *mode_str = mp_obj_str_get_str(args[ARG_mode].u_obj);
|
||||||
|
|
||||||
#if defined(USE_HOST_MODE)
|
#if defined(USE_HOST_MODE)
|
||||||
|
|
||||||
@ -289,50 +301,50 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
|
|||||||
// get the VID, PID and USB mode
|
// get the VID, PID and USB mode
|
||||||
// note: PID=-1 means select PID based on mode
|
// note: PID=-1 means select PID based on mode
|
||||||
// note: we support CDC as a synonym for VCP for backward compatibility
|
// note: we support CDC as a synonym for VCP for backward compatibility
|
||||||
uint16_t vid = args[1].u_int;
|
uint16_t vid = args[ARG_vid].u_int;
|
||||||
uint16_t pid = args[2].u_int;
|
uint16_t pid = args[ARG_pid].u_int;
|
||||||
uint8_t mode;
|
uint8_t mode;
|
||||||
if (strcmp(mode_str, "CDC+MSC") == 0 || strcmp(mode_str, "VCP+MSC") == 0) {
|
if (strcmp(mode_str, "CDC+MSC") == 0 || strcmp(mode_str, "VCP+MSC") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC_MSC;
|
pid = USBD_PID_CDC_MSC;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC_MSC;
|
mode = USBD_MODE_CDC_MSC;
|
||||||
#if MICROPY_HW_USB_CDC_NUM >= 2
|
#if MICROPY_HW_USB_CDC_NUM >= 2
|
||||||
} else if (strcmp(mode_str, "VCP+VCP") == 0) {
|
} else if (strcmp(mode_str, "VCP+VCP") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC2;
|
pid = USBD_PID_CDC2;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC2;
|
mode = USBD_MODE_CDC2;
|
||||||
} else if (strcmp(mode_str, "VCP+VCP+MSC") == 0) {
|
} else if (strcmp(mode_str, "VCP+VCP+MSC") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC2_MSC;
|
pid = USBD_PID_CDC2_MSC;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC2_MSC;
|
mode = USBD_MODE_CDC2_MSC;
|
||||||
#endif
|
#endif
|
||||||
#if MICROPY_HW_USB_CDC_NUM >= 3
|
#if MICROPY_HW_USB_CDC_NUM >= 3
|
||||||
} else if (strcmp(mode_str, "3xVCP") == 0) {
|
} else if (strcmp(mode_str, "3xVCP") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC3;
|
pid = USBD_PID_CDC3;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC3;
|
mode = USBD_MODE_CDC3;
|
||||||
} else if (strcmp(mode_str, "3xVCP+MSC") == 0) {
|
} else if (strcmp(mode_str, "3xVCP+MSC") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC3_MSC;
|
pid = USBD_PID_CDC3_MSC;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC3_MSC;
|
mode = USBD_MODE_CDC3_MSC;
|
||||||
#endif
|
#endif
|
||||||
} else if (strcmp(mode_str, "CDC+HID") == 0 || strcmp(mode_str, "VCP+HID") == 0) {
|
} else if (strcmp(mode_str, "CDC+HID") == 0 || strcmp(mode_str, "VCP+HID") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC_HID;
|
pid = USBD_PID_CDC_HID;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC_HID;
|
mode = USBD_MODE_CDC_HID;
|
||||||
} else if (strcmp(mode_str, "CDC") == 0 || strcmp(mode_str, "VCP") == 0) {
|
} else if (strcmp(mode_str, "CDC") == 0 || strcmp(mode_str, "VCP") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_CDC;
|
pid = USBD_PID_CDC;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_CDC;
|
mode = USBD_MODE_CDC;
|
||||||
} else if (strcmp(mode_str, "MSC") == 0) {
|
} else if (strcmp(mode_str, "MSC") == 0) {
|
||||||
if (args[2].u_int == -1) {
|
if (pid == -1) {
|
||||||
pid = USBD_PID_MSC;
|
pid = USBD_PID_MSC;
|
||||||
}
|
}
|
||||||
mode = USBD_MODE_MSC;
|
mode = USBD_MODE_MSC;
|
||||||
@ -340,11 +352,37 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
|
|||||||
goto bad_mode;
|
goto bad_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get MSC logical units
|
||||||
|
size_t msc_n = 0;
|
||||||
|
const void *msc_unit[USBD_MSC_MAX_LUN];
|
||||||
|
if (mode & USBD_MODE_IFACE_MSC) {
|
||||||
|
mp_obj_t *items;
|
||||||
|
mp_obj_get_array(args[ARG_msc].u_obj, &msc_n, &items);
|
||||||
|
if (msc_n > USBD_MSC_MAX_LUN) {
|
||||||
|
mp_raise_ValueError("too many logical units");
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < msc_n; ++i) {
|
||||||
|
mp_obj_type_t *type = mp_obj_get_type(items[i]);
|
||||||
|
if (type == &pyb_flash_type
|
||||||
|
#if MICROPY_HW_ENABLE_SDCARD
|
||||||
|
|| type == &pyb_sdcard_type
|
||||||
|
#endif
|
||||||
|
#if MICROPY_HW_ENABLE_MMCARD
|
||||||
|
|| type == &pyb_mmcard_type
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
msc_unit[i] = type;
|
||||||
|
} else {
|
||||||
|
mp_raise_ValueError("unsupported logical unit");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get hid info if user selected such a mode
|
// get hid info if user selected such a mode
|
||||||
USBD_HID_ModeInfoTypeDef hid_info;
|
USBD_HID_ModeInfoTypeDef hid_info;
|
||||||
if (mode & USBD_MODE_IFACE_HID) {
|
if (mode & USBD_MODE_IFACE_HID) {
|
||||||
mp_obj_t *items;
|
mp_obj_t *items;
|
||||||
mp_obj_get_array_fixed_n(args[3].u_obj, 5, &items);
|
mp_obj_get_array_fixed_n(args[ARG_hid].u_obj, 5, &items);
|
||||||
hid_info.subclass = mp_obj_get_int(items[0]);
|
hid_info.subclass = mp_obj_get_int(items[0]);
|
||||||
hid_info.protocol = mp_obj_get_int(items[1]);
|
hid_info.protocol = mp_obj_get_int(items[1]);
|
||||||
hid_info.max_packet_len = mp_obj_get_int(items[2]);
|
hid_info.max_packet_len = mp_obj_get_int(items[2]);
|
||||||
@ -359,13 +397,13 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if USBD_SUPPORT_HS_MODE
|
#if USBD_SUPPORT_HS_MODE
|
||||||
if (args[4].u_bool) {
|
if (args[ARG_high_speed].u_bool) {
|
||||||
mode |= USBD_MODE_HIGH_SPEED;
|
mode |= USBD_MODE_HIGH_SPEED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// init the USB device
|
// init the USB device
|
||||||
if (!pyb_usb_dev_init(vid, pid, mode, &hid_info)) {
|
if (!pyb_usb_dev_init(vid, pid, mode, msc_n, msc_unit, &hid_info)) {
|
||||||
goto bad_mode;
|
goto bad_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -66,7 +66,7 @@ MP_DECLARE_CONST_FUN_OBJ_0(pyb_have_cdc_obj); // deprecated
|
|||||||
MP_DECLARE_CONST_FUN_OBJ_1(pyb_hid_send_report_obj); // deprecated
|
MP_DECLARE_CONST_FUN_OBJ_1(pyb_hid_send_report_obj); // deprecated
|
||||||
|
|
||||||
void pyb_usb_init0(void);
|
void pyb_usb_init0(void);
|
||||||
bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, uint8_t mode, USBD_HID_ModeInfoTypeDef *hid_info);
|
bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, uint8_t mode, size_t msc_n, const void *msc_unit, USBD_HID_ModeInfoTypeDef *hid_info);
|
||||||
void pyb_usb_dev_deinit(void);
|
void pyb_usb_dev_deinit(void);
|
||||||
bool usb_vcp_is_enabled(void);
|
bool usb_vcp_is_enabled(void);
|
||||||
int usb_vcp_recv_byte(uint8_t *c); // if a byte is available, return 1 and put the byte in *c, else return 0
|
int usb_vcp_recv_byte(uint8_t *c); // if a byte is available, return 1 and put the byte in *c, else return 0
|
||||||
|
|||||||
344
ports/stm32/usbd_msc_interface.c
Normal file
344
ports/stm32/usbd_msc_interface.c
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2019 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 <stdint.h>
|
||||||
|
|
||||||
|
#include "usbd_cdc_msc_hid.h"
|
||||||
|
#include "usbd_msc_interface.h"
|
||||||
|
|
||||||
|
#include "extmod/vfs.h"
|
||||||
|
#include "storage.h"
|
||||||
|
#include "sdcard.h"
|
||||||
|
|
||||||
|
// This flag is needed to support removal of the medium, so that the USB drive
|
||||||
|
// can be unmounted and won't be remounted automatically.
|
||||||
|
#define FLAGS_STARTED (0x01)
|
||||||
|
|
||||||
|
#define FLAGS_READONLY (0x02)
|
||||||
|
|
||||||
|
STATIC const void *usbd_msc_lu_data[USBD_MSC_MAX_LUN];
|
||||||
|
STATIC uint8_t usbd_msc_lu_num;
|
||||||
|
STATIC uint16_t usbd_msc_lu_flags;
|
||||||
|
|
||||||
|
static inline void lu_flag_set(uint8_t lun, uint8_t flag) {
|
||||||
|
usbd_msc_lu_flags |= flag << (lun * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void lu_flag_clr(uint8_t lun, uint8_t flag) {
|
||||||
|
usbd_msc_lu_flags &= ~(flag << (lun * 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool lu_flag_is_set(uint8_t lun, uint8_t flag) {
|
||||||
|
return usbd_msc_lu_flags & (flag << (lun * 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sent in response to MODE SENSE(6) command
|
||||||
|
const uint8_t USBD_MSC_Mode_Sense6_Data[4] = {
|
||||||
|
0x03, // mode data length
|
||||||
|
0x00, // medium type
|
||||||
|
0x00, // bit 7: write protect
|
||||||
|
0x00, // block descriptor length
|
||||||
|
};
|
||||||
|
|
||||||
|
// Sent in response to MODE SENSE(10) command
|
||||||
|
const uint8_t USBD_MSC_Mode_Sense10_Data[8] = {
|
||||||
|
0x00, 0x06, // mode data length
|
||||||
|
0x00, // medium type
|
||||||
|
0x00, // bit 7: write protect
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00, 0x00, // block descriptor length
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC const uint8_t usbd_msc_vpd00[6] = {
|
||||||
|
0x00, // peripheral qualifier; peripheral device type
|
||||||
|
0x00, // page code
|
||||||
|
0x00, // reserved
|
||||||
|
2, // page length (additional bytes beyond this entry)
|
||||||
|
0x00, // page 0x00 supported
|
||||||
|
0x83, // page 0x83 supported
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC const uint8_t usbd_msc_vpd83[4] = {
|
||||||
|
0x00, // peripheral qualifier; peripheral device type
|
||||||
|
0x83, // page code
|
||||||
|
0x00, 0x00, // page length (additional bytes beyond this entry)
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC const int8_t usbd_msc_inquiry_data[36] = {
|
||||||
|
0x00, // peripheral qualifier; peripheral device type
|
||||||
|
0x80, // 0x00 for a fixed drive, 0x80 for a removable drive
|
||||||
|
0x02, // version
|
||||||
|
0x02, // response data format
|
||||||
|
(STANDARD_INQUIRY_DATA_LEN - 5), // additional length
|
||||||
|
0x00, // various flags
|
||||||
|
0x00, // various flags
|
||||||
|
0x00, // various flags
|
||||||
|
'M', 'i', 'c', 'r', 'o', 'P', 'y', ' ', // Manufacturer : 8 bytes
|
||||||
|
'p', 'y', 'b', 'o', 'a', 'r', 'd', ' ', // Product : 16 Bytes
|
||||||
|
'F', 'l', 'a', 's', 'h', ' ', ' ', ' ',
|
||||||
|
'1', '.', '0' ,'0', // Version : 4 Bytes
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set the logical units that will be exposed over MSC
|
||||||
|
void usbd_msc_init_lu(size_t lu_n, const void *lu_data) {
|
||||||
|
usbd_msc_lu_num = MIN(lu_n, USBD_MSC_MAX_LUN);
|
||||||
|
memcpy(usbd_msc_lu_data, lu_data, sizeof(void*) * usbd_msc_lu_num);
|
||||||
|
usbd_msc_lu_flags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to perform an ioctl on a logical unit
|
||||||
|
STATIC int lu_ioctl(uint8_t lun, int op, uint32_t *data) {
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
const void *lu = usbd_msc_lu_data[lun];
|
||||||
|
|
||||||
|
if (lu == &pyb_flash_type) {
|
||||||
|
switch (op) {
|
||||||
|
case BP_IOCTL_INIT:
|
||||||
|
storage_init();
|
||||||
|
*data = 0;
|
||||||
|
return 0;
|
||||||
|
case BP_IOCTL_SYNC:
|
||||||
|
storage_flush();
|
||||||
|
return 0;
|
||||||
|
case BP_IOCTL_SEC_SIZE:
|
||||||
|
*data = storage_get_block_size();
|
||||||
|
return 0;
|
||||||
|
case BP_IOCTL_SEC_COUNT:
|
||||||
|
*data = storage_get_block_count();
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#if MICROPY_HW_ENABLE_SDCARD
|
||||||
|
} else if (lu == &pyb_sdcard_type
|
||||||
|
#if MICROPY_HW_ENABLE_MMCARD
|
||||||
|
|| lu == &pyb_mmcard_type
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
switch (op) {
|
||||||
|
case BP_IOCTL_INIT:
|
||||||
|
if (!sdcard_power_on()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*data = 0;
|
||||||
|
return 0;
|
||||||
|
case BP_IOCTL_SYNC:
|
||||||
|
return 0;
|
||||||
|
case BP_IOCTL_SEC_SIZE:
|
||||||
|
*data = SDCARD_BLOCK_SIZE;
|
||||||
|
return 0;
|
||||||
|
case BP_IOCTL_SEC_COUNT:
|
||||||
|
*data = sdcard_get_capacity_in_bytes() / (uint64_t)SDCARD_BLOCK_SIZE;
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialise all logical units (it's only ever called once, with lun_in=0)
|
||||||
|
STATIC int8_t usbd_msc_Init(uint8_t lun_in) {
|
||||||
|
if (lun_in != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (int lun = 0; lun < usbd_msc_lu_num; ++lun) {
|
||||||
|
uint32_t data = 0;
|
||||||
|
int res = lu_ioctl(lun, BP_IOCTL_INIT, &data);
|
||||||
|
if (res != 0) {
|
||||||
|
lu_flag_clr(lun, FLAGS_STARTED);
|
||||||
|
} else {
|
||||||
|
lu_flag_set(lun, FLAGS_STARTED);
|
||||||
|
if (data) {
|
||||||
|
lu_flag_set(lun, FLAGS_READONLY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process SCSI INQUIRY command for the logical unit
|
||||||
|
STATIC int usbd_msc_Inquiry(uint8_t lun, const uint8_t *params, uint8_t *data_out) {
|
||||||
|
if (params[1] & 1) {
|
||||||
|
// EVPD set - return vital product data parameters
|
||||||
|
uint8_t page_code = params[2];
|
||||||
|
switch (page_code) {
|
||||||
|
case 0x00: // Supported VPD pages
|
||||||
|
memcpy(data_out, usbd_msc_vpd00, sizeof(usbd_msc_vpd00));
|
||||||
|
return sizeof(usbd_msc_vpd00);
|
||||||
|
case 0x83: // Device identification
|
||||||
|
memcpy(data_out, usbd_msc_vpd83, sizeof(usbd_msc_vpd83));
|
||||||
|
return sizeof(usbd_msc_vpd83);
|
||||||
|
default: // Unsupported
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A standard inquiry
|
||||||
|
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t alloc_len = params[3] << 8 | params[4];
|
||||||
|
int len = MIN(sizeof(usbd_msc_inquiry_data), alloc_len);
|
||||||
|
memcpy(data_out, usbd_msc_inquiry_data, len);
|
||||||
|
|
||||||
|
#if MICROPY_HW_ENABLE_SDCARD
|
||||||
|
const void *lu = usbd_msc_lu_data[lun];
|
||||||
|
if (len == sizeof(usbd_msc_inquiry_data)) {
|
||||||
|
if (lu == &pyb_sdcard_type) {
|
||||||
|
memcpy(data_out + 24, "SDCard", sizeof("SDCard") - 1);
|
||||||
|
}
|
||||||
|
#if MICROPY_HW_ENABLE_MMCARD
|
||||||
|
else if (lu == &pyb_mmcard_type) {
|
||||||
|
memcpy(data_out + 24, "MMCard", sizeof("MMCard") - 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get storage capacity of a logical unit
|
||||||
|
STATIC int8_t usbd_msc_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size) {
|
||||||
|
uint32_t block_size_u32 = 0;
|
||||||
|
int res = lu_ioctl(lun, BP_IOCTL_SEC_SIZE, &block_size_u32);
|
||||||
|
if (res != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*block_size = block_size_u32;
|
||||||
|
return lu_ioctl(lun, BP_IOCTL_SEC_COUNT, block_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if a logical unit is ready
|
||||||
|
STATIC int8_t usbd_msc_IsReady(uint8_t lun) {
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return lu_flag_is_set(lun, FLAGS_STARTED) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if a logical unit is write protected
|
||||||
|
STATIC int8_t usbd_msc_IsWriteProtected(uint8_t lun) {
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return lu_flag_is_set(lun, FLAGS_READONLY) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start or stop a logical unit
|
||||||
|
STATIC int8_t usbd_msc_StartStopUnit(uint8_t lun, uint8_t started) {
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (started) {
|
||||||
|
lu_flag_set(lun, FLAGS_STARTED);
|
||||||
|
} else {
|
||||||
|
lu_flag_clr(lun, FLAGS_STARTED);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare a logical unit for possible removal
|
||||||
|
STATIC int8_t usbd_msc_PreventAllowMediumRemoval(uint8_t lun, uint8_t param) {
|
||||||
|
uint32_t dummy;
|
||||||
|
// Sync the logical unit so the device can be unplugged/turned off
|
||||||
|
return lu_ioctl(lun, BP_IOCTL_SYNC, &dummy);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read data from a logical unit
|
||||||
|
STATIC int8_t usbd_msc_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
const void *lu = usbd_msc_lu_data[lun];
|
||||||
|
|
||||||
|
if (lu == &pyb_flash_type) {
|
||||||
|
storage_read_blocks(buf, blk_addr, blk_len);
|
||||||
|
return 0;
|
||||||
|
#if MICROPY_HW_ENABLE_SDCARD
|
||||||
|
} else if (lu == &pyb_sdcard_type
|
||||||
|
#if MICROPY_HW_ENABLE_MMCARD
|
||||||
|
|| lu == &pyb_mmcard_type
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
if (sdcard_read_blocks(buf, blk_addr, blk_len) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write data to a logical unit
|
||||||
|
STATIC int8_t usbd_msc_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
|
||||||
|
if (lun >= usbd_msc_lu_num) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
const void *lu = usbd_msc_lu_data[lun];
|
||||||
|
|
||||||
|
if (lu == &pyb_flash_type) {
|
||||||
|
storage_write_blocks(buf, blk_addr, blk_len);
|
||||||
|
return 0;
|
||||||
|
#if MICROPY_HW_ENABLE_SDCARD
|
||||||
|
} else if (lu == &pyb_sdcard_type
|
||||||
|
#if MICROPY_HW_ENABLE_MMCARD
|
||||||
|
|| lu == &pyb_mmcard_type
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
if (sdcard_write_blocks(buf, blk_addr, blk_len) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the number of attached logical units
|
||||||
|
STATIC int8_t usbd_msc_GetMaxLun(void) {
|
||||||
|
return usbd_msc_lu_num - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Table of operations for the SCSI layer to call
|
||||||
|
const USBD_StorageTypeDef usbd_msc_fops = {
|
||||||
|
usbd_msc_Init,
|
||||||
|
usbd_msc_Inquiry,
|
||||||
|
usbd_msc_GetCapacity,
|
||||||
|
usbd_msc_IsReady,
|
||||||
|
usbd_msc_IsWriteProtected,
|
||||||
|
usbd_msc_StartStopUnit,
|
||||||
|
usbd_msc_PreventAllowMediumRemoval,
|
||||||
|
usbd_msc_Read,
|
||||||
|
usbd_msc_Write,
|
||||||
|
usbd_msc_GetMaxLun,
|
||||||
|
};
|
||||||
@ -23,10 +23,13 @@
|
|||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#ifndef MICROPY_INCLUDED_STM32_USBD_MSC_STORAGE_H
|
#ifndef MICROPY_INCLUDED_STM32_USBD_MSC_INTERFACE_H
|
||||||
#define MICROPY_INCLUDED_STM32_USBD_MSC_STORAGE_H
|
#define MICROPY_INCLUDED_STM32_USBD_MSC_INTERFACE_H
|
||||||
|
|
||||||
extern const USBD_StorageTypeDef USBD_FLASH_STORAGE_fops;
|
#define USBD_MSC_MAX_LUN (2)
|
||||||
extern const USBD_StorageTypeDef USBD_SDCARD_STORAGE_fops;
|
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_STM32_USBD_MSC_STORAGE_H
|
extern const USBD_StorageTypeDef usbd_msc_fops;
|
||||||
|
|
||||||
|
void usbd_msc_init_lu(size_t lu_n, const void *lu_data);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_STM32_USBD_MSC_INTERFACE_H
|
||||||
@ -1,306 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_storage_msd.c
|
|
||||||
* @author MCD application Team
|
|
||||||
* @version V1.1.0
|
|
||||||
* @date 19-March-2012
|
|
||||||
* @brief This file provides the disk operations functions.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
|
|
||||||
*
|
|
||||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
||||||
* You may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.st.com/software_license_agreement_liberty_v2
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* Heavily modified by dpgeorge for MicroPython.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "usbd_cdc_msc_hid.h"
|
|
||||||
#include "usbd_msc_storage.h"
|
|
||||||
|
|
||||||
#include "py/mpstate.h"
|
|
||||||
#include "storage.h"
|
|
||||||
#include "sdcard.h"
|
|
||||||
|
|
||||||
// These are needed to support removal of the medium, so that the USB drive
|
|
||||||
// can be unmounted, and won't be remounted automatically.
|
|
||||||
static uint8_t flash_started = 0;
|
|
||||||
|
|
||||||
#if MICROPY_HW_ENABLE_SDCARD
|
|
||||||
static uint8_t sdcard_started = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
// Callback functions for when the internal flash is the mass storage device
|
|
||||||
|
|
||||||
static const int8_t FLASH_STORAGE_Inquirydata[] = { // 36 bytes
|
|
||||||
// LUN 0
|
|
||||||
0x00,
|
|
||||||
0x80, // 0x00 for a fixed drive, 0x80 for a removable drive
|
|
||||||
0x02,
|
|
||||||
0x02,
|
|
||||||
(STANDARD_INQUIRY_DATA_LEN - 5),
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
'u', 'P', 'y', ' ', ' ', ' ', ' ', ' ', // Manufacturer : 8 bytes
|
|
||||||
'm', 'i', 'c', 'r', 'o', 'S', 'D', ' ', // Product : 16 Bytes
|
|
||||||
'F', 'l', 'a', 's', 'h', ' ', ' ', ' ',
|
|
||||||
'1', '.', '0' ,'0', // Version : 4 Bytes
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize the storage medium
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_Init(uint8_t lun) {
|
|
||||||
storage_init();
|
|
||||||
flash_started = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief return medium capacity and block size
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @param block_num : number of physical block
|
|
||||||
* @param block_size : size of a physical block
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size) {
|
|
||||||
*block_size = storage_get_block_size();
|
|
||||||
*block_num = storage_get_block_count();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief check whether the medium is ready
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_IsReady(uint8_t lun) {
|
|
||||||
if (flash_started) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief check whether the medium is write-protected
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_IsWriteProtected(uint8_t lun) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the lun
|
|
||||||
int8_t FLASH_STORAGE_StartStopUnit(uint8_t lun, uint8_t started) {
|
|
||||||
flash_started = started;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t FLASH_STORAGE_PreventAllowMediumRemoval(uint8_t lun, uint8_t param) {
|
|
||||||
// sync the flash so that the cache is cleared and the device can be unplugged/turned off
|
|
||||||
storage_flush();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read data from the medium
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @param buf : Pointer to the buffer to save data
|
|
||||||
* @param blk_addr : address of 1st block to be read
|
|
||||||
* @param blk_len : nmber of blocks to be read
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
|
|
||||||
storage_read_blocks(buf, blk_addr, blk_len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Write data to the medium
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @param buf : Pointer to the buffer to write from
|
|
||||||
* @param blk_addr : address of 1st block to be written
|
|
||||||
* @param blk_len : nmber of blocks to be read
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_Write (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
|
|
||||||
storage_write_blocks(buf, blk_addr, blk_len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Return number of supported logical unit
|
|
||||||
* @param None
|
|
||||||
* @retval number of logical unit
|
|
||||||
*/
|
|
||||||
int8_t FLASH_STORAGE_GetMaxLun(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const USBD_StorageTypeDef USBD_FLASH_STORAGE_fops = {
|
|
||||||
FLASH_STORAGE_Init,
|
|
||||||
FLASH_STORAGE_GetCapacity,
|
|
||||||
FLASH_STORAGE_IsReady,
|
|
||||||
FLASH_STORAGE_IsWriteProtected,
|
|
||||||
FLASH_STORAGE_StartStopUnit,
|
|
||||||
FLASH_STORAGE_PreventAllowMediumRemoval,
|
|
||||||
FLASH_STORAGE_Read,
|
|
||||||
FLASH_STORAGE_Write,
|
|
||||||
FLASH_STORAGE_GetMaxLun,
|
|
||||||
(int8_t *)FLASH_STORAGE_Inquirydata,
|
|
||||||
};
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
// Callback functions for when the SD card is the mass storage device
|
|
||||||
|
|
||||||
#if MICROPY_HW_ENABLE_SDCARD
|
|
||||||
|
|
||||||
static const int8_t SDCARD_STORAGE_Inquirydata[] = { // 36 bytes
|
|
||||||
// LUN 0
|
|
||||||
0x00,
|
|
||||||
0x80, // 0x00 for a fixed drive, 0x80 for a removable drive
|
|
||||||
0x02,
|
|
||||||
0x02,
|
|
||||||
(STANDARD_INQUIRY_DATA_LEN - 5),
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
'u', 'P', 'y', ' ', ' ', ' ', ' ', ' ', // Manufacturer : 8 bytes
|
|
||||||
'm', 'i', 'c', 'r', 'o', 'S', 'D', ' ', // Product : 16 Bytes
|
|
||||||
'S', 'D', ' ', 'c', 'a', 'r', 'd', ' ',
|
|
||||||
'1', '.', '0' ,'0', // Version : 4 Bytes
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize the storage medium
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_Init(uint8_t lun) {
|
|
||||||
if (!sdcard_power_on()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
sdcard_started = 1;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief return medium capacity and block size
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @param block_num : number of physical block
|
|
||||||
* @param block_size : size of a physical block
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size) {
|
|
||||||
*block_size = SDCARD_BLOCK_SIZE;
|
|
||||||
*block_num = sdcard_get_capacity_in_bytes() / SDCARD_BLOCK_SIZE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief check whether the medium is ready
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_IsReady(uint8_t lun) {
|
|
||||||
if (sdcard_started) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief check whether the medium is write-protected
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_IsWriteProtected(uint8_t lun) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the lun
|
|
||||||
int8_t SDCARD_STORAGE_StartStopUnit(uint8_t lun, uint8_t started) {
|
|
||||||
sdcard_started = started;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t SDCARD_STORAGE_PreventAllowMediumRemoval(uint8_t lun, uint8_t param) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read data from the medium
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @param buf : Pointer to the buffer to save data
|
|
||||||
* @param blk_addr : address of 1st block to be read
|
|
||||||
* @param blk_len : nmber of blocks to be read
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
|
|
||||||
if (sdcard_read_blocks(buf, blk_addr, blk_len) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Write data to the medium
|
|
||||||
* @param lun : logical unit number
|
|
||||||
* @param buf : Pointer to the buffer to write from
|
|
||||||
* @param blk_addr : address of 1st block to be written
|
|
||||||
* @param blk_len : nmber of blocks to be read
|
|
||||||
* @retval Status
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
|
|
||||||
if (sdcard_write_blocks(buf, blk_addr, blk_len) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Return number of supported logical unit
|
|
||||||
* @param None
|
|
||||||
* @retval number of logical unit
|
|
||||||
*/
|
|
||||||
int8_t SDCARD_STORAGE_GetMaxLun(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const USBD_StorageTypeDef USBD_SDCARD_STORAGE_fops = {
|
|
||||||
SDCARD_STORAGE_Init,
|
|
||||||
SDCARD_STORAGE_GetCapacity,
|
|
||||||
SDCARD_STORAGE_IsReady,
|
|
||||||
SDCARD_STORAGE_IsWriteProtected,
|
|
||||||
SDCARD_STORAGE_StartStopUnit,
|
|
||||||
SDCARD_STORAGE_PreventAllowMediumRemoval,
|
|
||||||
SDCARD_STORAGE_Read,
|
|
||||||
SDCARD_STORAGE_Write,
|
|
||||||
SDCARD_STORAGE_GetMaxLun,
|
|
||||||
(int8_t *)SDCARD_STORAGE_Inquirydata,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MICROPY_HW_ENABLE_SDCARD
|
|
||||||
@ -61,6 +61,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct _USBD_STORAGE {
|
typedef struct _USBD_STORAGE {
|
||||||
int8_t (* Init) (uint8_t lun);
|
int8_t (* Init) (uint8_t lun);
|
||||||
|
int (* Inquiry) (uint8_t lun, const uint8_t *params, uint8_t *data_out);
|
||||||
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
|
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
|
||||||
int8_t (* IsReady) (uint8_t lun);
|
int8_t (* IsReady) (uint8_t lun);
|
||||||
int8_t (* IsWriteProtected) (uint8_t lun);
|
int8_t (* IsWriteProtected) (uint8_t lun);
|
||||||
@ -69,7 +70,6 @@ typedef struct _USBD_STORAGE {
|
|||||||
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
||||||
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
||||||
int8_t (* GetMaxLun)(void);
|
int8_t (* GetMaxLun)(void);
|
||||||
int8_t *pInquiry;
|
|
||||||
} USBD_StorageTypeDef;
|
} USBD_StorageTypeDef;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -131,6 +131,9 @@ typedef struct _usbd_cdc_msc_hid_state_t {
|
|||||||
usbd_hid_state_t *hid;
|
usbd_hid_state_t *hid;
|
||||||
} usbd_cdc_msc_hid_state_t;
|
} usbd_cdc_msc_hid_state_t;
|
||||||
|
|
||||||
|
extern const uint8_t USBD_MSC_Mode_Sense6_Data[4];
|
||||||
|
extern const uint8_t USBD_MSC_Mode_Sense10_Data[8];
|
||||||
|
|
||||||
#define USBD_HID_MOUSE_MAX_PACKET (4)
|
#define USBD_HID_MOUSE_MAX_PACKET (4)
|
||||||
#define USBD_HID_MOUSE_REPORT_DESC_SIZE (74)
|
#define USBD_HID_MOUSE_REPORT_DESC_SIZE (74)
|
||||||
|
|
||||||
|
|||||||
@ -1,104 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_data.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 18-February-2014
|
|
||||||
* @brief header for the usbd_msc_data.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2>
|
|
||||||
*
|
|
||||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
||||||
* You may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.st.com/software_license_agreement_liberty_v2
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef _USBD_MSC_DATA_H_
|
|
||||||
#define _USBD_MSC_DATA_H_
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_INFO
|
|
||||||
* @brief general defines for the usb device library file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_INFO_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define MODE_SENSE6_LEN 8
|
|
||||||
#define MODE_SENSE10_LEN 8
|
|
||||||
#define LENGTH_INQUIRY_PAGE00 7
|
|
||||||
#define LENGTH_FORMAT_CAPACITIES 20
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern const uint8_t MSC_Page00_Inquiry_Data[];
|
|
||||||
extern const uint8_t MSC_Mode_Sense6_data[];
|
|
||||||
extern const uint8_t MSC_Mode_Sense10_data[] ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* _USBD_MSC_DATA_H_ */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@ -1,134 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_data.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V2.0.0
|
|
||||||
* @date 18-February-2014
|
|
||||||
* @brief This file provides all the vital inquiry pages and sense data.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2>
|
|
||||||
*
|
|
||||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
||||||
* You may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.st.com/software_license_agreement_liberty_v2
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_data.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA
|
|
||||||
* @brief Mass storage info/data module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Mass storage Page 0 Inquiry Data */
|
|
||||||
const uint8_t MSC_Page00_Inquiry_Data[] = {//7
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
(LENGTH_INQUIRY_PAGE00 - 4),
|
|
||||||
0x00,
|
|
||||||
0x80,
|
|
||||||
0x83
|
|
||||||
};
|
|
||||||
/* USB Mass storage sense 6 Data */
|
|
||||||
const uint8_t MSC_Mode_Sense6_data[] = {
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
/* USB Mass storage sense 10 Data */
|
|
||||||
const uint8_t MSC_Mode_Sense10_data[] = {
|
|
||||||
0x00,
|
|
||||||
0x06,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@ -28,7 +28,6 @@
|
|||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
#include "usbd_msc_bot.h"
|
#include "usbd_msc_bot.h"
|
||||||
#include "usbd_msc_scsi.h"
|
#include "usbd_msc_scsi.h"
|
||||||
#include "usbd_msc_data.h"
|
|
||||||
#include "usbd_cdc_msc_hid.h"
|
#include "usbd_cdc_msc_hid.h"
|
||||||
|
|
||||||
|
|
||||||
@ -225,33 +224,15 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|||||||
*/
|
*/
|
||||||
static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
||||||
{
|
{
|
||||||
uint8_t* pPage;
|
|
||||||
uint16_t len;
|
|
||||||
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
||||||
|
|
||||||
if (params[1] & 0x01)/*Evpd is set*/
|
int res = hmsc->bdev_ops->Inquiry(lun, params, hmsc->bot_data);
|
||||||
|
if (res < 0)
|
||||||
{
|
{
|
||||||
pPage = (uint8_t *)MSC_Page00_Inquiry_Data;
|
SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_CDB);
|
||||||
len = LENGTH_INQUIRY_PAGE00;
|
return -1;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
pPage = (uint8_t *)&hmsc->bdev_ops->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN];
|
|
||||||
len = pPage[4] + 5;
|
|
||||||
|
|
||||||
if (params[4] <= len)
|
|
||||||
{
|
|
||||||
len = params[4];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hmsc->bot_data_length = len;
|
|
||||||
|
|
||||||
while (len)
|
|
||||||
{
|
|
||||||
len--;
|
|
||||||
hmsc->bot_data[len] = pPage[len];
|
|
||||||
}
|
}
|
||||||
|
hmsc->bot_data_length = res;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,13 +327,13 @@ static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, ui
|
|||||||
static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
||||||
{
|
{
|
||||||
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
||||||
uint16_t len = 8 ;
|
uint16_t len = sizeof(USBD_MSC_Mode_Sense6_Data);
|
||||||
hmsc->bot_data_length = len;
|
hmsc->bot_data_length = len;
|
||||||
|
|
||||||
while (len)
|
while (len)
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
hmsc->bot_data[len] = MSC_Mode_Sense6_data[len];
|
hmsc->bot_data[len] = USBD_MSC_Mode_Sense6_Data[len];
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -366,7 +347,7 @@ static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *
|
|||||||
*/
|
*/
|
||||||
static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
||||||
{
|
{
|
||||||
uint16_t len = 8;
|
uint16_t len = sizeof(USBD_MSC_Mode_Sense10_Data);
|
||||||
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
||||||
|
|
||||||
hmsc->bot_data_length = len;
|
hmsc->bot_data_length = len;
|
||||||
@ -374,7 +355,7 @@ static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|||||||
while (len)
|
while (len)
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
hmsc->bot_data[len] = MSC_Mode_Sense10_data[len];
|
hmsc->bot_data[len] = USBD_MSC_Mode_Sense10_Data[len];
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,13 +25,11 @@ MICROPY_PY_FFI = 1
|
|||||||
|
|
||||||
# ussl module requires one of the TLS libraries below
|
# ussl module requires one of the TLS libraries below
|
||||||
MICROPY_PY_USSL = 1
|
MICROPY_PY_USSL = 1
|
||||||
# axTLS has minimal size and fully integrated with MicroPython, but
|
# axTLS has minimal size but implements only a subset of modern TLS
|
||||||
# implements only a subset of modern TLS functionality, so may have
|
# functionality, so may have problems with some servers.
|
||||||
# problems with some servers.
|
|
||||||
MICROPY_SSL_AXTLS = 1
|
MICROPY_SSL_AXTLS = 1
|
||||||
# mbedTLS is more up to date and complete implementation, but also
|
# mbedTLS is more up to date and complete implementation, but also
|
||||||
# more bloated. Configuring and building of mbedTLS should be done
|
# more bloated.
|
||||||
# outside of MicroPython, it can just link with mbedTLS library.
|
|
||||||
MICROPY_SSL_MBEDTLS = 0
|
MICROPY_SSL_MBEDTLS = 0
|
||||||
|
|
||||||
# jni module requires JVM/JNI
|
# jni module requires JVM/JNI
|
||||||
|
|||||||
7
py/nlr.h
7
py/nlr.h
@ -54,7 +54,14 @@
|
|||||||
#endif
|
#endif
|
||||||
#elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__)
|
#elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__)
|
||||||
#define MICROPY_NLR_THUMB (1)
|
#define MICROPY_NLR_THUMB (1)
|
||||||
|
#if defined(__SOFTFP__)
|
||||||
#define MICROPY_NLR_NUM_REGS (10)
|
#define MICROPY_NLR_NUM_REGS (10)
|
||||||
|
#else
|
||||||
|
// With hardware FP registers s16-s31 are callee save so in principle
|
||||||
|
// should be saved and restored by the NLR code. gcc only uses s16-s21
|
||||||
|
// so only save/restore those as an optimisation.
|
||||||
|
#define MICROPY_NLR_NUM_REGS (10 + 6)
|
||||||
|
#endif
|
||||||
#elif defined(__xtensa__)
|
#elif defined(__xtensa__)
|
||||||
#define MICROPY_NLR_XTENSA (1)
|
#define MICROPY_NLR_XTENSA (1)
|
||||||
#define MICROPY_NLR_NUM_REGS (10)
|
#define MICROPY_NLR_NUM_REGS (10)
|
||||||
|
|||||||
@ -63,6 +63,11 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
|
|||||||
"str r10, [r0, #36] \n" // store r10 into nlr_buf
|
"str r10, [r0, #36] \n" // store r10 into nlr_buf
|
||||||
"str r11, [r0, #40] \n" // store r11 into nlr_buf
|
"str r11, [r0, #40] \n" // store r11 into nlr_buf
|
||||||
"str r13, [r0, #44] \n" // store r13=sp into nlr_buf
|
"str r13, [r0, #44] \n" // store r13=sp into nlr_buf
|
||||||
|
#if MICROPY_NLR_NUM_REGS == 16
|
||||||
|
"vstr d8, [r0, #48] \n" // store s16-s17 into nlr_buf
|
||||||
|
"vstr d9, [r0, #56] \n" // store s18-s19 into nlr_buf
|
||||||
|
"vstr d10, [r0, #64] \n" // store s20-s21 into nlr_buf
|
||||||
|
#endif
|
||||||
"str lr, [r0, #8] \n" // store lr into nlr_buf
|
"str lr, [r0, #8] \n" // store lr into nlr_buf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -116,6 +121,11 @@ NORETURN void nlr_jump(void *val) {
|
|||||||
"ldr r10, [r0, #36] \n" // load r10 from nlr_buf
|
"ldr r10, [r0, #36] \n" // load r10 from nlr_buf
|
||||||
"ldr r11, [r0, #40] \n" // load r11 from nlr_buf
|
"ldr r11, [r0, #40] \n" // load r11 from nlr_buf
|
||||||
"ldr r13, [r0, #44] \n" // load r13=sp from nlr_buf
|
"ldr r13, [r0, #44] \n" // load r13=sp from nlr_buf
|
||||||
|
#if MICROPY_NLR_NUM_REGS == 16
|
||||||
|
"vldr d8, [r0, #48] \n" // load s16-s17 from nlr_buf
|
||||||
|
"vldr d9, [r0, #56] \n" // load s18-s19 from nlr_buf
|
||||||
|
"vldr d10, [r0, #64] \n" // load s20-s21 from nlr_buf
|
||||||
|
#endif
|
||||||
"ldr lr, [r0, #8] \n" // load lr from nlr_buf
|
"ldr lr, [r0, #8] \n" // load lr from nlr_buf
|
||||||
#endif
|
#endif
|
||||||
"movs r0, #1 \n" // return 1, non-local return
|
"movs r0, #1 \n" // return 1, non-local return
|
||||||
|
|||||||
2
py/obj.c
2
py/obj.c
@ -113,7 +113,7 @@ bool mp_obj_is_true(mp_obj_t arg) {
|
|||||||
} else if (arg == mp_const_none) {
|
} else if (arg == mp_const_none) {
|
||||||
return 0;
|
return 0;
|
||||||
} else if (mp_obj_is_small_int(arg)) {
|
} else if (mp_obj_is_small_int(arg)) {
|
||||||
if (MP_OBJ_SMALL_INT_VALUE(arg) == 0) {
|
if (arg == MP_OBJ_NEW_SMALL_INT(0)) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
3
py/py.mk
3
py/py.mk
@ -405,3 +405,6 @@ $(PY_BUILD)/vm.o: CFLAGS += $(CSUPEROPT)
|
|||||||
# http://hg.python.org/cpython/file/b127046831e2/Python/ceval.c#l828
|
# http://hg.python.org/cpython/file/b127046831e2/Python/ceval.c#l828
|
||||||
# http://www.emulators.com/docs/nx25_nostradamus.htm
|
# http://www.emulators.com/docs/nx25_nostradamus.htm
|
||||||
#-fno-crossjumping
|
#-fno-crossjumping
|
||||||
|
|
||||||
|
# Include rules for extmod related code
|
||||||
|
include $(TOP)/extmod/extmod.mk
|
||||||
|
|||||||
@ -481,6 +481,7 @@ class RawCodeNative(RawCode):
|
|||||||
if kind == 0:
|
if kind == 0:
|
||||||
# Generic 16-bit link
|
# Generic 16-bit link
|
||||||
print(' %s & 0xff, %s >> 8,' % (qst, qst))
|
print(' %s & 0xff, %s >> 8,' % (qst, qst))
|
||||||
|
return 2
|
||||||
else:
|
else:
|
||||||
# Architecture-specific link
|
# Architecture-specific link
|
||||||
is_obj = kind == 2
|
is_obj = kind == 2
|
||||||
@ -488,14 +489,17 @@ class RawCodeNative(RawCode):
|
|||||||
qst = '((uintptr_t)MP_OBJ_NEW_QSTR(%s))' % qst
|
qst = '((uintptr_t)MP_OBJ_NEW_QSTR(%s))' % qst
|
||||||
if config.native_arch in (MP_NATIVE_ARCH_X86, MP_NATIVE_ARCH_X64):
|
if config.native_arch in (MP_NATIVE_ARCH_X86, MP_NATIVE_ARCH_X64):
|
||||||
print(' %s & 0xff, %s >> 8, 0, 0,' % (qst, qst))
|
print(' %s & 0xff, %s >> 8, 0, 0,' % (qst, qst))
|
||||||
|
return 4
|
||||||
elif MP_NATIVE_ARCH_ARMV6M <= config.native_arch <= MP_NATIVE_ARCH_ARMV7EMDP:
|
elif MP_NATIVE_ARCH_ARMV6M <= config.native_arch <= MP_NATIVE_ARCH_ARMV7EMDP:
|
||||||
if is_obj:
|
if is_obj:
|
||||||
# qstr object, movw and movt
|
# qstr object, movw and movt
|
||||||
self._asm_thumb_rewrite_mov(pc, qst)
|
self._asm_thumb_rewrite_mov(pc, qst)
|
||||||
self._asm_thumb_rewrite_mov(pc + 4, '(%s >> 16)' % qst)
|
self._asm_thumb_rewrite_mov(pc + 4, '(%s >> 16)' % qst)
|
||||||
|
return 8
|
||||||
else:
|
else:
|
||||||
# qstr number, movw instruction
|
# qstr number, movw instruction
|
||||||
self._asm_thumb_rewrite_mov(pc, qst)
|
self._asm_thumb_rewrite_mov(pc, qst)
|
||||||
|
return 4
|
||||||
else:
|
else:
|
||||||
assert 0
|
assert 0
|
||||||
|
|
||||||
@ -523,8 +527,7 @@ class RawCodeNative(RawCode):
|
|||||||
# link qstr
|
# link qstr
|
||||||
qi_off, qi_kind, qi_val = self.qstr_links[qi]
|
qi_off, qi_kind, qi_val = self.qstr_links[qi]
|
||||||
qst = global_qstrs[qi_val].qstr_id
|
qst = global_qstrs[qi_val].qstr_id
|
||||||
self._link_qstr(i, qi_kind, qst)
|
i += self._link_qstr(i, qi_kind, qst)
|
||||||
i += 4
|
|
||||||
qi += 1
|
qi += 1
|
||||||
else:
|
else:
|
||||||
# copy machine code (max 16 bytes)
|
# copy machine code (max 16 bytes)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user