diff --git a/.gitmodules b/.gitmodules index 33769145b..5397a52d8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "lib/mbedtls"] path = lib/mbedtls url = https://github.com/Mbed-TLS/mbedtls.git +[submodule "lib/uzlib"] + path = lib/uzlib + url = git@github.com:pfalcon/uzlib.git diff --git a/lib/uzlib b/lib/uzlib new file mode 160000 index 000000000..6d60d651a --- /dev/null +++ b/lib/uzlib @@ -0,0 +1 @@ +Subproject commit 6d60d651a4499a64f2e5b21b4cc08d98cb84b5c1 diff --git a/src/rp2_common/CMakeLists.txt b/src/rp2_common/CMakeLists.txt index ff8df7c6b..f85a75f16 100644 --- a/src/rp2_common/CMakeLists.txt +++ b/src/rp2_common/CMakeLists.txt @@ -62,6 +62,7 @@ if (NOT PICO_BARE_METAL) pico_add_subdirectory(pico_lwip) pico_add_subdirectory(pico_cyw43_arch) pico_add_subdirectory(pico_mbedtls) + pico_add_subdirectory(pico_uzlib) pico_add_subdirectory(pico_stdlib) @@ -79,4 +80,4 @@ set(CMAKE_EXECUTABLE_SUFFIX "${CMAKE_EXECUTABLE_SUFFIX}" PARENT_SCOPE) pico_add_doxygen(${CMAKE_CURRENT_LIST_DIR}) pico_add_doxygen_exclude(${CMAKE_CURRENT_LIST_DIR}/cmsis) -pico_promote_common_scope_vars() \ No newline at end of file +pico_promote_common_scope_vars() diff --git a/src/rp2_common/cyw43_driver/CMakeLists.txt b/src/rp2_common/cyw43_driver/CMakeLists.txt index 8951df400..2a623c0ac 100644 --- a/src/rp2_common/cyw43_driver/CMakeLists.txt +++ b/src/rp2_common/cyw43_driver/CMakeLists.txt @@ -5,6 +5,11 @@ endif() set(CYW43_DRIVER_TEST_FILE "src/cyw43.h") +# Enable/disable streaming / compression of firmware +if (NOT CYW43_DECOMPRESS_FIRMWARE) + set(CYW43_DECOMPRESS_FIRMWARE 1) +endif() + if (NOT PICO_CYW43_DRIVER_PATH) set(PICO_CYW43_DRIVER_PATH ${PICO_SDK_PATH}/lib/cyw43-driver) if (PICO_CYW43_SUPPORTED AND NOT EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE}) @@ -32,34 +37,50 @@ if (EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE}) ${PICO_CYW43_DRIVER_PATH}/src ${PICO_CYW43_DRIVER_PATH}/firmware ) - + if (${CYW43_DECOMPRESS_FIRMWARE}) + target_compile_definitions(cyw43_driver_base INTERFACE + CYW43_DECOMPRESS_FIRMWARE=1 + ) + target_sources(cyw43_driver_base INTERFACE + ${PICO_CYW43_DRIVER_PATH}/src/cyw43_decompress_firmware.c + ) + endif() # Build the driver for cyw43 for pico w # Firmware stuff - set(CYW43_FIRMWARE_BIN 43439A0-7.95.49.00.combined) - string(REGEX REPLACE [\\\.\-] _ CYW43_FIRMWARE_BIN_ ${CYW43_FIRMWARE_BIN}) - string(REGEX MATCH [^_]+_?[^_]*_?[^_]*_?[^_]*_?[^_]* CYW43_FIRMWARE_PRETTY ${CYW43_FIRMWARE_BIN_}) - set(CYW43_FIRMWARE_PRETTY fw_${CYW43_FIRMWARE_PRETTY}) - set(RESOURCE_SECNAME .big_const) - set(RESOURCE_SECFLAGS contents,alloc,load,readonly,data) - set(CYW43_FIRMWARE_OBJ ${CMAKE_CURRENT_BINARY_DIR}/cyw43_resource.o) - + if (NOT CYW43_FIRMWARE_LOC) + set(CYW43_FIRMWARE_LOC ${PICO_CYW43_DRIVER_PATH}/firmware) + endif() + if (NOT CYW43_FIRMWARE_BIN) + set(CYW43_FIRMWARE_BIN "43439A0-7.95.49.00.combined") + set(CYW43_FIRMWARE_NAME "43439A0_7_95_49_00_combined") + set(CYW43_FIRMWARE_SYM ${CYW43_FIRMWARE_NAME}) + if (${CYW43_DECOMPRESS_FIRMWARE}) + set(CYW43_FIRMWARE_BIN "${CYW43_FIRMWARE_BIN}.gz") + set(CYW43_FIRMWARE_SYM "${CYW43_FIRMWARE_SYM}_gz") + endif() + endif() + if (NOT CYW43_FIRMWARE_NAME) + message(FATAL_ERROR "Please define CYW43_FIRMWARE_NAME") + endif() + if (NOT CYW43_FIRMWARE_OBJ) + # cyw43_resource.o contains the WiFi and BT firmware as a binary blob + set(CYW43_FIRMWARE_OBJ ${CMAKE_CURRENT_BINARY_DIR}/cyw43_resource.o) + add_custom_command( + OUTPUT ${CYW43_FIRMWARE_OBJ} + DEPENDS ${CYW43_FIRMWARE_LOC}/${CYW43_FIRMWARE_BIN} + WORKING_DIRECTORY ${CYW43_FIRMWARE_LOC} + COMMAND ${CMAKE_OBJCOPY} -I binary -O elf32-littlearm -B arm + --readonly-text + --rename-section .data=.big_const,contents,alloc,load,readonly,data + --redefine-sym _binary_${CYW43_FIRMWARE_SYM}_start=fw_${CYW43_FIRMWARE_NAME}_start + --redefine-sym _binary_${CYW43_FIRMWARE_SYM}_end=fw_${CYW43_FIRMWARE_NAME}_end + --redefine-sym _binary_${CYW43_FIRMWARE_SYM}_size=fw_${CYW43_FIRMWARE_NAME}_size + ${CYW43_FIRMWARE_BIN} ${CYW43_FIRMWARE_OBJ} + ) + endif() add_custom_target(cyw43_firmware_package DEPENDS ${CYW43_FIRMWARE_OBJ}) - # cyw43_resource.o contains the WiFi and BT firmware as a binary blob - add_custom_command( - OUTPUT ${CYW43_FIRMWARE_OBJ} - DEPENDS ${PICO_CYW43_DRIVER_PATH}/firmware/${CYW43_FIRMWARE_BIN} - WORKING_DIRECTORY ${PICO_CYW43_DRIVER_PATH}/firmware - COMMAND ${CMAKE_OBJCOPY} -I binary -O elf32-littlearm -B arm - --readonly-text - --rename-section .data=${RESOURCE_SECNAME},${RESOURCE_SECFLAGS} - --redefine-sym _binary_${CYW43_FIRMWARE_BIN_}_start=${CYW43_FIRMWARE_PRETTY}_start - --redefine-sym _binary_${CYW43_FIRMWARE_BIN_}_end=${CYW43_FIRMWARE_PRETTY}_end - --redefine-sym _binary_${CYW43_FIRMWARE_BIN_}_size=${CYW43_FIRMWARE_PRETTY}_size - ${CYW43_FIRMWARE_BIN} ${CYW43_FIRMWARE_OBJ} - ) - add_library(cyw43_driver_picow INTERFACE) target_sources(cyw43_driver_picow INTERFACE ${CMAKE_CURRENT_LIST_DIR}/cyw43_bus_pio_spi.c @@ -69,13 +90,16 @@ if (EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE}) target_link_libraries(cyw43_driver_picow INTERFACE ${CYW43_FIRMWARE_OBJ} ) + target_include_directories(cyw43_driver_picow INTERFACE + $(CYW43_FIRMWARE_LOC) # contains a header file with firmware details + ) target_link_libraries(cyw43_driver_picow INTERFACE cyw43_driver_base pico_stdlib hardware_pio hardware_dma hardware_exception + pico_uzlib ) - pico_promote_common_scope_vars() endif() diff --git a/src/rp2_common/cyw43_driver/cyw43_bus_pio_spi.c b/src/rp2_common/cyw43_driver/cyw43_bus_pio_spi.c index 21af77de2..becd65004 100644 --- a/src/rp2_common/cyw43_driver/cyw43_bus_pio_spi.c +++ b/src/rp2_common/cyw43_driver/cyw43_bus_pio_spi.c @@ -477,10 +477,6 @@ int cyw43_write_reg_u8(cyw43_int_t *self, uint32_t fn, uint32_t reg, uint32_t va return _cyw43_write_reg(self, fn, reg, val, 1); } -#if MAX_BLOCK_SIZE > 0x7f8 -#error Block size is wrong for SPI -#endif - // Assumes we're reading into spid_buf int cyw43_read_bytes(cyw43_int_t *self, uint32_t fn, uint32_t addr, size_t len, uint8_t *buf) { assert(fn != BACKPLANE_FUNCTION || (len <= 64 && (addr + len) <= 0x8000)); @@ -535,9 +531,14 @@ int cyw43_write_bytes(cyw43_int_t *self, uint32_t fn, uint32_t addr, size_t len, int res = cyw43_spi_transfer(self, (uint8_t *)&self->spi_header[1], aligned_len + 4, NULL, 0); logic_debug_set(pin_WIFI_TX, 0); return res; + } else if (src > self->spid_buf + sizeof(uint32_t) && src < (self->spid_buf + sizeof(self->spid_buf))) { + assert(src + len <= (self->spid_buf + sizeof(self->spid_buf))); // don't go over the end of the buffer + uint32_t *spi_header = (void*)(self->spid_buf + (src - self->spid_buf) - sizeof(uint32_t)); + *spi_header = make_cmd(true, true, fn, addr, len); + return cyw43_spi_transfer(self, (uint8_t *)spi_header, aligned_len + 4, NULL, 0); } else { // todo: would be nice to get rid of this. Only used for firmware download? - assert(src < self->spid_buf || src >= (self->spid_buf + sizeof(self->spid_buf))); + assert(src < self->spid_buf || src >= (self->spid_buf + sizeof(self->spid_buf))); // check we're not using self->spid_buf self->spi_header[1] = make_cmd(true, true, fn, addr, len); memcpy(self->spid_buf, src, len); return cyw43_spi_transfer(self, (uint8_t *)&self->spi_header[1], aligned_len + 4, NULL, 0); diff --git a/src/rp2_common/pico_lwip/include/arch/cc.h b/src/rp2_common/pico_lwip/include/arch/cc.h index 8194dcb41..b8b76f559 100644 --- a/src/rp2_common/pico_lwip/include/arch/cc.h +++ b/src/rp2_common/pico_lwip/include/arch/cc.h @@ -70,7 +70,7 @@ typedef int sys_prot_t; #endif #ifndef LWIP_PLATFORM_ASSERT -void panic(const char *fmt, ...); +#include "pico/platform.h" #define LWIP_PLATFORM_ASSERT(x) panic(x) #endif diff --git a/src/rp2_common/pico_uzlib/CMakeLists.txt b/src/rp2_common/pico_uzlib/CMakeLists.txt new file mode 100644 index 000000000..4ed67b221 --- /dev/null +++ b/src/rp2_common/pico_uzlib/CMakeLists.txt @@ -0,0 +1,42 @@ +set(UZLIB_TEST_PATH "src/tinflate.c") +if (NOT PICO_UZLIB_PATH) + set(PICO_UZLIB_PATH ${PROJECT_SOURCE_DIR}/lib/uzlib) +endif() +if (NOT EXISTS ${PICO_UZLIB_PATH}/${UZLIB_TEST_PATH}) + message(WARNING "uzlib content not present.") +endif() + +if (EXISTS ${PICO_UZLIB_PATH}/${UZLIB_TEST_PATH}) + message("uzlib available at ${PICO_UZLIB_PATH}") + + pico_register_common_scope_var(PICO_UZLIB_PATH) + + add_library(pico_uzlib INTERFACE) + target_sources(pico_uzlib INTERFACE + ${PICO_UZLIB_PATH}/src/tinflate.c + ${PICO_UZLIB_PATH}/src/tinfgzip.c + ${PICO_UZLIB_PATH}/src/tinfzlib.c + ${PICO_UZLIB_PATH}/src/adler32.c + ${PICO_UZLIB_PATH}/src/crc32.c + ${PICO_UZLIB_PATH}/src/defl_static.c + ) + target_include_directories(pico_uzlib INTERFACE + ${PICO_UZLIB_PATH}/src + ) + + pico_promote_common_scope_vars() + + function(suppress_uzlib_warnings) + set_source_files_properties( + ${PICO_UZLIB_PATH}/src/defl_static.c + PROPERTIES + COMPILE_OPTIONS "-Wno-redundant-decls" + ) + set_source_files_properties( + ${PICO_UZLIB_PATH}/src/tinflate.c + PROPERTIES + COMPILE_OPTIONS "-Wno-sign-compare" + ) + endfunction() + +endif() \ No newline at end of file diff --git a/test/kitchen_sink/CMakeLists.txt b/test/kitchen_sink/CMakeLists.txt index 4c0a60d65..ba3a3e9f6 100644 --- a/test/kitchen_sink/CMakeLists.txt +++ b/test/kitchen_sink/CMakeLists.txt @@ -40,6 +40,7 @@ target_link_libraries(kitchen_sink_libs INTERFACE pico_time pico_unique_id pico_util + pico_uzlib ) add_library(kitchen_sink_options INTERFACE) @@ -152,3 +153,7 @@ if (TARGET pico_cyw43_arch) suppress_mbedtls_warnings() endif() endif() + +if (TARGET pico_uzlib AND COMMAND suppress_uzlib_warnings) + suppress_uzlib_warnings() +endif()