From b38220bcf6861394fa2986655c6c2124b3a35cf4 Mon Sep 17 00:00:00 2001 From: Peter Harper Date: Thu, 6 Oct 2022 15:34:36 +0100 Subject: [PATCH] src: Firmware compression. Refactor the driver to call wifi_fw_funcs to get functions to load firmware data. If CYW43_DECOMPRESS_FIRMWARE is true it will load gzip compressed firmware using uzlib. The driver calls cyw43_wifi_firmware_details to get details of the firmware. Fixes #4 --- firmware/43439A0-7.95.49.00.combined.gz | Bin 0 -> 141051 bytes firmware/wifi_firmware.h | 146 +++++++++++ firmware/wifi_firmware_43439.h | 104 ++++++++ src/cyw43_decompress_firmware.c | 107 ++++++++ src/cyw43_decompress_firmware.h | 66 +++++ src/cyw43_ll.c | 309 +++++++++++++++--------- 6 files changed, 621 insertions(+), 111 deletions(-) create mode 100644 firmware/43439A0-7.95.49.00.combined.gz create mode 100644 firmware/wifi_firmware.h create mode 100644 firmware/wifi_firmware_43439.h create mode 100644 src/cyw43_decompress_firmware.c create mode 100644 src/cyw43_decompress_firmware.h diff --git a/firmware/43439A0-7.95.49.00.combined.gz b/firmware/43439A0-7.95.49.00.combined.gz new file mode 100644 index 0000000000000000000000000000000000000000..7a326f72c4a9318c8b3b1855b8feb17a6e4f4ff5 GIT binary patch literal 141051 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 DMhv!8 literal 0 HcmV?d00001 diff --git a/firmware/wifi_firmware.h b/firmware/wifi_firmware.h new file mode 100644 index 0000000..d0944c6 --- /dev/null +++ b/firmware/wifi_firmware.h @@ -0,0 +1,146 @@ +/* + * This file is part of the cyw43-driver + * + * Copyright (C) 2019-2022 George Robotics Pty Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Any redistribution, use, or modification in source or binary form is done + * solely for personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY THE LICENSOR AND COPYRIGHT OWNER "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE LICENSOR OR COPYRIGHT OWNER BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software is also available for use with certain devices under different + * terms, as set out in the top level LICENSE file. For commercial licensing + * options please email contact@georgerobotics.com.au. + */ + +#ifndef WIFI_FIRMWARE_H +#define WIFI_FIRMWARE_H + +#if CYW43_DECOMPRESS_FIRMWARE +#include "cyw43_decompress_firmware.h" +#endif + +/*! + * \brief Structure to store wifi firmware details + */ +//!\{ +typedef struct cyw43_wifi_firmware_details { + size_t raw_size; ///< size in bytes of the firmware binary + const uint8_t *raw_data; ///< pointer to the firmware binary + size_t fw_size; ///< Size of the firmware in bytes + size_t clm_size; ///< Size of the clm in bytes + const uint8_t *fw_addr; ///< Pointer to the firmware in the binary + const uint8_t *clm_addr; ///< Pointer to the clm in the binary + size_t wifi_nvram_len; ///< Size of nvram data + const uint8_t *wifi_nvram_data; ///< Pointer to nvram data +} cyw43_wifi_firmware_details_t; +//!\} + +/*! + * \brief Structure to hold function pointers for loading firmware + */ +//!\{ +typedef struct cyw43_wifi_firmware_funcs { + int (*start)(const cyw43_wifi_firmware_details_t *fw_details); ///< start firmware loading + const uint8_t* (*get_fw_source)(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len); ///< get fw data + const uint8_t* (*get_nvram_source)(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len); ///< get nvram data + int (*get_clm)(uint8_t *dst, const uint8_t *src, uint32_t len); ///< get clm data + void (*end)(void); ///< end firmware loading +} cyw43_wifi_firmware_funcs_t; +//!\} + +/*! + * \brief get firmware data from flash + * + * Loads firmware data from flash and returns a pointer to it + * + * \param addr Address of firmware data required + * \param sz_in Amount of firmware data required in bytes + * \param buffer Temporary buffer that can be used to load and return firmware data + * \param buffer_len Length of temporary buffer in bytes + * \return Requested firmware data + */ +const uint8_t *wifi_firmware_get_source_storage(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len); + +/*! + * \brief get firmware data embedded in the elf file binary + * + * Loads firmware data from the elf file and returns a pointer to it + * + * \param addr Address of firmware data required + * \param sz_in Amount of firmware data required in bytes + * \param buffer Temporary buffer that can be used to load and return firmware data + * \param buffer_len Length of temporary buffer in bytes + * \return Requested firmware data + */ +const uint8_t *wifi_firmware_get_source_embedded(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len); + +/*! + * \brief get clm data embedded in the elf file binary + * + * Loads clm data from the elf file binary and returns a pointer to it + * + * \param dst Destination of clm data + * \param src Source address of the clm data + * \param len Amount of data required in bytes + * \return >=0 on success or <0 on error + */ +int wifi_firmware_get_clm_embedded(uint8_t *dst, const uint8_t *src, uint32_t len); + +#if CYW43_DECOMPRESS_FIRMWARE +/*! + * \brief Start firmware decompression process + * + * Prepares and allocates resources needed to decompress firmware + * + * \param fw_details Details of the firmware + * \see cyw43_wifi_firmware_details_t + * \return >=0 on success or <0 on error + */ +int wifi_firmware_start_decompress(const cyw43_wifi_firmware_details_t* fw_details); + +/*! + * \brief get and decompress firmware data embedded in the elf file binary + * + * Loads firmware data from the elf file, decompressed it and returns a pointer to it + * + * \param addr Address of firmware data required + * \param sz_in Amount of firmware data required in bytes + * \param buffer Temporary buffer that can be used to load and return firmware data + * \param buffer_len Length of temporary buffer in bytes + * \return Requested firmware data + */ +const uint8_t *wifi_firmware_get_source_decompress(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len); + +/*! + * \brief get and decompress clm data embedded in the elf file binary + * + * Loads clm data from flash, decompresses it and returns a pointer to it + * + * \param dst Destination of clm data + * \param src Source address of the clm data + * \param len Amount of data required in bytes + * \return >=0 on success or <0 on error + */ +int wifi_firmware_get_clm_decompress(uint8_t *dst, const uint8_t *src, uint32_t len); +#endif + +#endif diff --git a/firmware/wifi_firmware_43439.h b/firmware/wifi_firmware_43439.h new file mode 100644 index 0000000..a4cca6b --- /dev/null +++ b/firmware/wifi_firmware_43439.h @@ -0,0 +1,104 @@ +/* + * This file is part of the cyw43-driver + * + * Copyright (C) 2019-2022 George Robotics Pty Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Any redistribution, use, or modification in source or binary form is done + * solely for personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY THE LICENSOR AND COPYRIGHT OWNER "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE LICENSOR OR COPYRIGHT OWNER BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software is also available for use with certain devices under different + * terms, as set out in the top level LICENSE file. For commercial licensing + * options please email contact@georgerobotics.com.au. + */ + +#ifndef WIFI_FIRMWARE_43439_H +#define WIFI_FIRMWARE_43439_H + +#include CYW43_WIFI_NVRAM_INCLUDE_FILE +#include "wifi_firmware.h" + +#if CYW43_USE_SPI +#define CYW43_FW_LEN (224190) // 43439A0.bin +#define CYW43_CLM_LEN (984) // 43439_raspberrypi_picow_v5_220624.clm_blob + +extern const uint8_t fw_43439A0_7_95_49_00_combined_start[]; +extern const uint8_t fw_43439A0_7_95_49_00_combined_end[]; +#define CYW43_FIRMWARE_START fw_43439A0_7_95_49_00_combined_start +#define CYW43_FIRMWARE_END fw_43439A0_7_95_49_00_combined_end + +#elif !CYW43_USE_SPI +#define CYW43_FW_LEN (383110) // 7.45.98.50 +extern const uint8_t fw_4343WA1_7_45_98_50_start[]; +extern const uint8_t fw_4343WA1_7_45_98_50_end[]; +#define CYW43_CLM_LEN (7222) +#define CYW43_FIRMWARE_START fw_4343WA1_7_45_98_50_start +#define CYW43_FIRMWARE_END fw_4343WA1_7_45_98_50_end +#endif + +/*! + * \brief Get the firmware binary details + * + * This method returns the details of the firmware binary + * + * \param fw_details Structure to be filled with firmware details + * \see cyw43_wifi_firmware_details_t + */ +static inline void cyw43_wifi_firmware_details(cyw43_wifi_firmware_details_t *fw_details) { + fw_details->raw_size = CYW43_FIRMWARE_END - CYW43_FIRMWARE_START; + fw_details->raw_data = CYW43_FIRMWARE_START; + fw_details->fw_size = CYW43_FW_LEN; + fw_details->clm_size = CYW43_CLM_LEN, + fw_details->fw_addr = CYW43_FIRMWARE_START; + fw_details->clm_addr = CYW43_FIRMWARE_START + ((CYW43_FW_LEN + 511) & ~511); + fw_details->wifi_nvram_len = (sizeof(wifi_nvram_4343) + 63) & ~63; + fw_details->wifi_nvram_data = wifi_nvram_4343; +} + +/*! + * \brief Get the functions used to load firmware + * + * This method returns pointers to functions that load firmware + * + * \return structure that contains functions that load firmware + * \see cyw43_wifi_firmware_funcs_t + */ +static inline const cyw43_wifi_firmware_funcs_t *wifi_fw_funcs(void) { + static const cyw43_wifi_firmware_funcs_t funcs = { + #if CYW43_DECOMPRESS_FIRMWARE + .start = wifi_firmware_start_decompress, + .get_fw_source = wifi_firmware_get_source_decompress, + .get_nvram_source = wifi_firmware_get_source_embedded, // not compressed + .get_clm = wifi_firmware_get_clm_decompress, + .end = cyw43_decompress_firmware_end, + #else + .start = NULL, + .get_fw_source = wifi_firmware_get_source_embedded, + .get_nvram_source = wifi_firmware_get_source_embedded, + .get_clm = wifi_firmware_get_clm_embedded, + .end = NULL, + #endif + }; + return &funcs; +} + +#endif \ No newline at end of file diff --git a/src/cyw43_decompress_firmware.c b/src/cyw43_decompress_firmware.c new file mode 100644 index 0000000..0f65d2a --- /dev/null +++ b/src/cyw43_decompress_firmware.c @@ -0,0 +1,107 @@ +/* + * This file is part of the cyw43-driver + * + * Copyright (C) 2019-2022 George Robotics Pty Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Any redistribution, use, or modification in source or binary form is done + * solely for personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY THE LICENSOR AND COPYRIGHT OWNER "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE LICENSOR OR COPYRIGHT OWNER BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software is also available for use with certain devices under different + * terms, as set out in the top level LICENSE file. For commercial licensing + * options please email contact@georgerobotics.com.au. + */ + +#include +#include + +#include "pico/stdlib.h" +#include "uzlib.h" + +#define DICT_SIZE 32767 +typedef struct uzlib_data { + uint8_t dict[DICT_SIZE]; // todo: use smaller dictionary? + struct uzlib_uncomp state; + size_t amount_left; +} uzlib_data_t; +static uzlib_data_t *uzlib; + +#define CYW43_DECOMPRESS_ERR_NO_MEM -1 +#define CYW43_DECOMPRESS_ERR_BAD_HEADER -2 +#define CYW43_DECOMPRESS_ERR_NO_MORE -3 +#define CYW43_DECOMPRESS_ERR_DECOMPRESS -4 + +size_t cyw43_decompress_firmware_start(const uint8_t *raw_data, size_t raw_size) +{ + uzlib_init(); + + uzlib = malloc(sizeof(*uzlib)); + assert(uzlib); + if (!uzlib) { + return CYW43_DECOMPRESS_ERR_NO_MEM; + } + + uzlib->amount_left = raw_data[raw_size - 1]; + uzlib->amount_left = 256 * uzlib->amount_left + raw_data[raw_size - 2]; + uzlib->amount_left = 256 * uzlib->amount_left + raw_data[raw_size - 3]; + uzlib->amount_left = 256 * uzlib->amount_left + raw_data[raw_size - 4]; + + uzlib_uncompress_init(&uzlib->state, uzlib->dict, sizeof(uzlib->dict)); + + uzlib->state.source = raw_data; + uzlib->state.source_limit = raw_data + raw_size - 4; + uzlib->state.source_read_cb = NULL; + + int res = uzlib_gzip_parse_header(&uzlib->state); + assert(res == TINF_OK); + if (res != TINF_OK) { + return CYW43_DECOMPRESS_ERR_BAD_HEADER; + } + + return uzlib->amount_left; +} + +int cyw43_decompress_firmware_next(uint8_t *buffer, size_t len) +{ + assert(uzlib->amount_left > 0); + if (uzlib->amount_left <= 0) { + return CYW43_DECOMPRESS_ERR_NO_MORE; + } + const size_t chunk_len = uzlib->amount_left < len ? uzlib->amount_left : len; + uzlib->state.dest = buffer; + uzlib->state.dest_limit = uzlib->state.dest + chunk_len; + int res = uzlib_uncompress_chksum(&uzlib->state); + assert(res == TINF_OK); + if (res != TINF_OK) { + return CYW43_DECOMPRESS_ERR_DECOMPRESS; + } + uzlib->amount_left -= chunk_len; + return chunk_len; +} + +void cyw43_decompress_firmware_end(void) +{ + if (uzlib) { + free(uzlib); + uzlib = NULL; + } +} diff --git a/src/cyw43_decompress_firmware.h b/src/cyw43_decompress_firmware.h new file mode 100644 index 0000000..b587cea --- /dev/null +++ b/src/cyw43_decompress_firmware.h @@ -0,0 +1,66 @@ +/* + * This file is part of the cyw43-driver + * + * Copyright (C) 2019-2022 George Robotics Pty Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Any redistribution, use, or modification in source or binary form is done + * solely for personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY THE LICENSOR AND COPYRIGHT OWNER "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE LICENSOR OR COPYRIGHT OWNER BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software is also available for use with certain devices under different + * terms, as set out in the top level LICENSE file. For commercial licensing + * options please email contact@georgerobotics.com.au. + */ + +#ifndef WIFI_FIRMWARE_COMPRESSION_H +#define WIFI_FIRMWARE_COMPRESSION_H + +/*! + * \brief Start decompressing firmware + * + * This method prepares for decompressing firmware. + * + * \param raw_data The compressed firmware data + * \param raw_size The size in bytes of the compressed firmware data + * \return >0 on success, the uncompressed data size in bytes or <0 on error + */ +size_t cyw43_decompress_firmware_start(const uint8_t *raw_data, size_t raw_size); + +/*! + * \brief Get the next block of firmware + * + * This method returns the next block of firmware. + * + * \param buffer Buffer to fill with firmware data + * \param len Requested size of firmware data + * \return The amount of data returned in the buffer or <0 on error + */ +int cyw43_decompress_firmware_next(uint8_t *buffer, size_t len); + +/*! + * \brief Finish decompressing firmware + * + * This method frees any resources used for decompressing firmware. + */ +void cyw43_decompress_firmware_end(void); + +#endif \ No newline at end of file diff --git a/src/cyw43_ll.c b/src/cyw43_ll.c index befe3fe..62589eb 100644 --- a/src/cyw43_ll.c +++ b/src/cyw43_ll.c @@ -42,7 +42,6 @@ #include "cyw43_internal.h" #include "cyw43_stats.h" -#include CYW43_WIFI_NVRAM_INCLUDE_FILE #include CYW43_WIFI_FIRMWARE_INCLUDE_FILE #define CLEAR_SDIO_INT 0 @@ -69,7 +68,6 @@ extern bool enable_spi_packet_dumping; #define USE_KSO (1) #define CYW43_RAM_SIZE (512 * 1024) -#define CYW43_CLM_ADDR (fw_data + ALIGN_UINT(CYW43_FW_LEN, 512)) #define VERIFY_FIRMWARE_DOWNLOAD (0) #define ALIGN_UINT(val, align) (((val) + (align) - 1) & ~((align) - 1)) @@ -98,9 +96,9 @@ static inline void cyw43_put_le32(uint8_t *buf, uint32_t x) { #if VERIFY_FIRMWARE_DOWNLOAD static void cyw43_xxd(size_t len, const uint8_t *buf) { for (int i = 0; i < len; ++i) { - CWY43_PRINTF(" %02x", buf[i]); + CYW43_PRINTF(" %02x", buf[i]); } - CWY43_PRINTF("\n"); + CYW43_PRINTF("\n"); } #endif @@ -274,6 +272,61 @@ void cyw43_ll_deinit(cyw43_ll_t *self_in) { #endif } +/*******************************************************************************/ +// Firmware loading stuff + +// load from flash (todo: untested) +const uint8_t *wifi_firmware_get_source_storage(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len) { + assert(sz_in <= buffer_len && (sz_in % CYW43_FLASH_BLOCK_SIZE) == 0); + storage_read_blocks(buffer, (uintptr_t )addr / CYW43_FLASH_BLOCK_SIZE, sz_in / CYW43_FLASH_BLOCK_SIZE); + return buffer; +} + +// load from data in the elf +const uint8_t *wifi_firmware_get_source_embedded(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len) { + (void)sz_in; + (void)buffer; + (void)buffer_len; + return addr; +} + +// Get clm data embedded in elf +int wifi_firmware_get_clm_embedded(uint8_t *dst, const uint8_t *src, uint32_t len) { + memcpy(dst, src, len); + return 0; +} + +#if CYW43_DECOMPRESS_FIRMWARE +// Start firmware decompression process from compressed binary in elf +int wifi_firmware_start_decompress(const cyw43_wifi_firmware_details_t* fw_details) { + size_t result = cyw43_decompress_firmware_start(fw_details->raw_data, fw_details->raw_size); + if (result < 0) { + CYW43_PRINTF("Error parsing header: %d\n", result); + return (int)result; + } + assert(result == (ALIGN_UINT(fw_details->fw_size, 512) + fw_details->clm_size)); + #ifndef NDEBUG + CYW43_PRINTF("Firmware compressed %u%%\n", fw_details->raw_size * 100 / result); + #endif + return 0; +} + +// Stream from binary compressed in elf +const uint8_t *wifi_firmware_get_source_decompress(const uint8_t *addr, size_t sz_in, uint8_t *buffer, size_t buffer_len) { + assert(sz_in <= buffer_len); + (void)addr; + size_t sz_out = cyw43_decompress_firmware_next(buffer, sz_in); + assert(sz_out >= 0 && sz_out == sz_in); + return buffer; +} + +// get clm data from binary compressed in elf +int wifi_firmware_get_clm_decompress(uint8_t *dst, const uint8_t *src, uint32_t len) { + (void)src; + return cyw43_decompress_firmware_next(dst, len); +} +#endif // !CYW43_DECOMPRESS_FIRMWARE + /*******************************************************************************/ // low level read/write @@ -345,124 +398,119 @@ static void cyw43_write_backplane(cyw43_int_t *self, uint32_t addr, size_t size, #define MAX_BLOCK_SIZE 16384 #endif -static int cyw43_download_resource(cyw43_int_t *self, uint32_t addr, size_t raw_len, int from_storage, uintptr_t source) { - // round up len to simplify download - size_t len = (raw_len + 255) & ~255; - - CYW43_VDEBUG("writing %lu bytes to 0x%lx\n", (uint32_t)len, (uint32_t)addr); - - uint32_t block_size = MAX_BLOCK_SIZE; - if (from_storage) { - // reused the spid_buf to copy the data (must be larger than 512 storage block size) - block_size = sizeof(self->spid_buf); - CYW43_DEBUG("data comes from external storage via buffer of size %u\n", (uint)block_size); - } - - if (addr == 0) { - // check that firmware is actually there - - // get the last bit of the firmware - const uint8_t *b; - uint32_t fw_end; - if (from_storage) { - // get the last aligned-1024 bytes - uint32_t last_bl = (raw_len - 1) / CYW43_FLASH_BLOCK_SIZE; - storage_read_blocks(self->spid_buf, source + last_bl - 1, 2); - fw_end = raw_len - (last_bl - 1) * CYW43_FLASH_BLOCK_SIZE; - b = self->spid_buf; - } else { - // get the last 800 bytes - fw_end = 800; - b = (const uint8_t *)source + raw_len - fw_end; - } - - // get length of trailer - fw_end -= 16; // skip DVID trailer - uint32_t trail_len = b[fw_end - 2] | b[fw_end - 1] << 8; - int found = -1; - if (trail_len < 500 && b[fw_end - 3] == '\0') { - for (int i = 80; i < (int)trail_len; ++i) { - if (strncmp((const char *)&b[fw_end - 3 - i], "Version: ", 9) == 0) { - found = i; - break; - } - } - } - - if (found == -1) { - CYW43_WARN("could not find valid firmware\n"); - return CYW43_FAIL_FAST_CHECK(-CYW43_EIO); - } - - // print wifi firmware version info - CYW43_DEBUG("%s\n", &b[fw_end - 3 - found]); - } - - #if VERIFY_FIRMWARE_DOWNLOAD - uint32_t t_start = cyw43_hal_ticks_us(); - #endif - - for (size_t offset = 0; offset < len; offset += block_size) { - CYW43_EVENT_POLL_HOOK; - - size_t sz = block_size; +// Write firmware to cyw43 +static int cyw43_firmware_write(cyw43_int_t *self, uint32_t dest_addr, size_t len, const uint8_t *src) { + for (size_t offset = 0; offset < len; offset += MAX_BLOCK_SIZE) { + size_t sz = MAX_BLOCK_SIZE; if (offset + sz > len) { sz = len - offset; } - uint32_t dest_addr = addr + offset; assert(((dest_addr & BACKPLANE_ADDR_MASK) + sz) <= (BACKPLANE_ADDR_MASK + 1)); cyw43_set_backplane_window(self, dest_addr); - const uint8_t *src; - if (from_storage) { - storage_read_blocks(self->spid_buf, source + offset / CYW43_FLASH_BLOCK_SIZE, block_size / CYW43_FLASH_BLOCK_SIZE); - src = self->spid_buf; - } else { - src = (const uint8_t *)source + offset; - } - int ret = cyw43_write_bytes(self, BACKPLANE_FUNCTION, dest_addr & BACKPLANE_ADDR_MASK, sz, src); + int ret = cyw43_write_bytes(self, BACKPLANE_FUNCTION, dest_addr & BACKPLANE_ADDR_MASK, sz, src + offset); if (ret != 0) { - + assert(false); return CYW43_FAIL_FAST_CHECK(ret); } + dest_addr += sz; } + return 0; +} - #if VERIFY_FIRMWARE_DOWNLOAD - uint32_t t_end = cyw43_hal_ticks_us(); - uint32_t dt = t_end - t_start; - CYW43_VDEBUG("done dnload; dt = %u us; speed = %u kbytes/sec\n", (uint)dt, (uint)(len * 1000 / dt)); - #endif - - #if VERIFY_FIRMWARE_DOWNLOAD +#if VERIFY_FIRMWARE_DOWNLOAD +static bool verify_firmware(cyw43_int_t *self, size_t len, const uint8_t *source) { // Verification of 380k takes about 40ms using a 512-byte transfer size const size_t verify_block_size = MAX_BLOCK_SIZE; // so we can verify against storage uint8_t buf[verify_block_size]; - t_start = cyw43_hal_ticks_us(); + uint32_t t_start = cyw43_hal_ticks_us(); for (size_t offset = 0; offset < len; offset += verify_block_size) { size_t sz = verify_block_size; if (offset + sz > len) { sz = len - offset; } - uint32_t dest_addr = addr + offset; + uint32_t dest_addr = offset; assert(((dest_addr & BACKPLANE_ADDR_MASK) + sz) <= (BACKPLANE_ADDR_MASK + 1)); cyw43_set_backplane_window(self, dest_addr); cyw43_read_bytes(self, BACKPLANE_FUNCTION, dest_addr & BACKPLANE_ADDR_MASK, sz, buf); - const uint8_t *src; - if (from_storage) { - storage_read_blocks(self->spid_buf, source + offset / CYW43_FLASH_BLOCK_SIZE, verify_block_size / CYW43_FLASH_BLOCK_SIZE); - src = self->spid_buf; - } else { - src = (const uint8_t *)source + offset; - } + const uint8_t *src = wifi_fw_funcs()->get_fw_source(source + offset, sz, self->spid_buf, sizeof(self->spid_buf)); if (memcmp(buf, src, sz) != 0) { CYW43_WARN("fail verify at address 0x%08x:\n", (uint)dest_addr); cyw43_xxd(sz, src); cyw43_xxd(sz, buf); - return CYW43_FAIL_FAST_CHECK(-CYW43_EIO); + return false; } } - t_end = cyw43_hal_ticks_us(); - dt = t_end - t_start; + uint32_t dt = cyw43_hal_ticks_us() - t_start; CYW43_DEBUG("done verify; dt = %u us; speed = %u kbytes/sec\n", (uint)dt, (uint)(len * 1000 / dt)); + return true; + } +#endif + + +static int cyw43_download_firmware(cyw43_int_t *self, cyw43_wifi_firmware_details_t *fw_details) { + // round up len to simplify download + size_t len = (fw_details->fw_size + 255) & ~255; + + CYW43_VDEBUG("download %lu firmware bytes\n", (uint32_t)len); + + uint32_t t_start = cyw43_hal_ticks_us(); + uint8_t check_buffer[800]; // for saving the end of the firmware + size_t check_done = 0; + size_t check_pos = fw_details->fw_size - sizeof(check_buffer); + + for (size_t offset = 0; offset < len; offset += sizeof(self->spid_buf)) { + CYW43_EVENT_POLL_HOOK; + size_t sz = sizeof(self->spid_buf); + if (offset + sz > len) { + sz = len - offset; + } + + // Load a block of firmware data + const uint8_t *src = wifi_fw_funcs()->get_fw_source(fw_details->fw_addr + offset, sz, self->spid_buf, sizeof(self->spid_buf)); + + // Save the end of the firmware + if (offset + sz > check_pos && check_done < sizeof(check_buffer)) { + const size_t check_offset = offset < check_pos ? check_pos - offset : 0; + const size_t check_sz = MIN(sizeof(check_buffer) - check_done, sz - check_offset); + memcpy(check_buffer + check_done, src + check_offset, check_sz); + check_done += check_sz; + check_pos += check_sz; + } + int ret = cyw43_firmware_write(self, offset, sz, src); + if (ret < 0) return ret; + } + + // check that firmware looks correct by checking we can find version info + size_t fw_end = sizeof(check_buffer) - 16; // skip DVID trailer + + // get length of trailer + size_t trail_len = check_buffer[fw_end - 2] | check_buffer[fw_end - 1] << 8; + + // Search for version + int found = -1; + if (trail_len < 500 && check_buffer[fw_end - 3] == '\0') { + for (int i = 80; i < (int)trail_len; ++i) { + if (strncmp((const char *)&check_buffer[fw_end - 3 - i], "Version: ", 9) == 0) { + found = i; + break; + } + } + } + + if (found == -1) { + CYW43_WARN("could not find valid firmware\n"); + return CYW43_FAIL_FAST_CHECK(-CYW43_EIO); + } + + // print wifi firmware version info + CYW43_DEBUG("%s\n", &check_buffer[fw_end - 3 - found]); + + #if CYW43_VERBOSE_DEBUG + uint32_t t_end = cyw43_hal_ticks_us(); + uint32_t dt = t_end - t_start; + CYW43_VDEBUG("done dnload; dt = %u us; speed = %u kbytes/sec\n", (uint)dt, (uint)(len * 1000 / dt)); + #else + (void)t_start; #endif return 0; @@ -1376,8 +1424,12 @@ static void cyw43_clm_load(cyw43_int_t *self, const uint8_t *clm_ptr, size_t clm *(uint32_t *)(buf + 12) = len; *(uint32_t *)(buf + 16) = 0; #pragma GCC diagnostic pop - memcpy(buf + 20, clm_ptr + off, len); + // new4 + int err = wifi_fw_funcs()->get_clm(buf + 20, clm_ptr + off, len); + if (err < 0) { + panic("Failed to get clm"); + } CYW43_VDEBUG("clm data send %lu/%zu\n", off + len, clm_len); // Send data aligned to 8 bytes; padding comes from junk at end of buf @@ -1391,7 +1443,7 @@ static void cyw43_clm_load(cyw43_int_t *self, const uint8_t *clm_ptr, size_t clm #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" if (*(uint32_t *)buf != 0) { - CYW43_WARN("CLM load failed"); + CYW43_WARN("CLM load failed\n"); } #pragma GCC diagnostic pop CYW43_VDEBUG("clm data load ok\n"); @@ -1425,6 +1477,7 @@ static void cyw43_write_iovar_n(cyw43_int_t *self, const char *var, size_t len, int cyw43_ll_bus_init(cyw43_ll_t *self_in, const uint8_t *mac) { cyw43_int_t *self = (void *)self_in; + int exit_status = 0; self->startup_t0 = cyw43_hal_ticks_us(); @@ -1620,19 +1673,47 @@ int cyw43_ll_bus_init(cyw43_ll_t *self_in, const uint8_t *mac) { cyw43_write_backplane(self, SOCSRAM_BANKX_INDEX, 4, 0x3); cyw43_write_backplane(self, SOCSRAM_BANKX_PDA, 4, 0); - // Take firmware from the address space - cyw43_download_resource(self, 0x00000000, CYW43_FW_LEN, 0, fw_data); - /* - // Take firmware from storage block device - cyw43_download_resource(self, 0x00000000, CYW43_FW_LEN, 1, 0x100 + 0x1000); - */ + cyw43_wifi_firmware_details_t fw_details; + cyw43_wifi_firmware_details(&fw_details); - size_t wifi_nvram_len = ALIGN_UINT(sizeof(wifi_nvram_4343), 64); - const uint8_t *wifi_nvram_data = wifi_nvram_4343; - cyw43_download_resource(self, CYW43_RAM_SIZE - 4 - wifi_nvram_len, wifi_nvram_len, 0, (uintptr_t)wifi_nvram_data); - uint32_t sz = ((~(wifi_nvram_len / 4) & 0xffff) << 16) | (wifi_nvram_len / 4); - cyw43_write_backplane(self, CYW43_RAM_SIZE - 4, 4, sz); + // start firmware download + if (wifi_fw_funcs()->start && wifi_fw_funcs()->start(&fw_details) != 0) { + assert(false); + return CYW43_EIO; + } + + // download firmware + if (cyw43_download_firmware(self, &fw_details) != 0) { + assert(false); + return CYW43_EIO; + } + #if VERIFY_FIRMWARE_DOWNLOAD + // restart firmware download + if (wifi_fw_funcs()->end) { + wifi_fw_funcs()->end(); + } + if (wifi_fw_funcs()->start && wifi_fw_funcs()->start(&fw_details) != 0) { + assert(false); + return CYW43_EIO; + } + if (!verify_firmware(self, (fw_details.fw_size + 255) & ~255, fw_details.fw_addr)) { + return CYW43_FAIL_FAST_CHECK(-CYW43_EIO); + } + #endif + + // load nvram + const uint8_t *nvram_source = wifi_fw_funcs()->get_nvram_source(fw_details.wifi_nvram_data, + fw_details.wifi_nvram_len, self->spid_buf, sizeof(self->spid_buf)); + if (!nvram_source) { + assert(false); + return CYW43_EIO; + } + cyw43_firmware_write(self, CYW43_RAM_SIZE - 4 - fw_details.wifi_nvram_len, fw_details.wifi_nvram_len, nvram_source); + uint32_t nvram_sz = ((~(fw_details.wifi_nvram_len / 4) & 0xffff) << 16) | (fw_details.wifi_nvram_len / 4); + cyw43_write_backplane(self, CYW43_RAM_SIZE - 4, 4, nvram_sz); + + // Start wifi reset_device_core(self, CORE_WLAN_ARM, false); device_core_is_up(self, CORE_WLAN_ARM); @@ -1645,7 +1726,8 @@ int cyw43_ll_bus_init(cyw43_ll_t *self_in, const uint8_t *mac) { cyw43_delay_ms(1); } CYW43_WARN("HT not ready\n"); - return -CYW43_EIO; + exit_status = -CYW43_EIO; + goto finish; ht_ready: @@ -1684,7 +1766,8 @@ int cyw43_ll_bus_init(cyw43_ll_t *self_in, const uint8_t *mac) { cyw43_delay_ms(1); } CYW43_WARN("F2 not ready\n"); - return -CYW43_EIO; + exit_status = -CYW43_EIO; + goto finish; f2_ready: @@ -1739,7 +1822,7 @@ int cyw43_ll_bus_init(cyw43_ll_t *self_in, const uint8_t *mac) { // Load the CLM data; it sits just after main firmware CYW43_VDEBUG("cyw43_clm_load start\n"); - cyw43_clm_load(self, (const uint8_t *)CYW43_CLM_ADDR, CYW43_CLM_LEN); + cyw43_clm_load(self, (const uint8_t *)fw_details.clm_addr, fw_details.clm_size); CYW43_VDEBUG("cyw43_clm_load done\n"); cyw43_write_iovar_u32(self, "bus:txglom", 0, WWD_STA_INTERFACE); // tx glomming off @@ -1768,7 +1851,11 @@ int cyw43_ll_bus_init(cyw43_ll_t *self_in, const uint8_t *mac) { cyw43_write_iovar_n(self, "cur_etheraddr", 6, mac, WWD_STA_INTERFACE); } - return 0; +finish: + if (wifi_fw_funcs()->end) { + wifi_fw_funcs()->end(); + } + return exit_status; } /*******************************************************************************/