Skip to content

Commit 8d1902f

Browse files
committed
Changes for firmware compression
Use cyw43_get_firmware_funcs to load BT firmware. Update configuration to enable compression
1 parent faca83f commit 8d1902f

File tree

5 files changed

+95
-43
lines changed

5 files changed

+95
-43
lines changed

src/rp2_common/pico_cyw43_driver/CMakeLists.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ elseif (NOT EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE})
1515
message(WARNING "PICO_CYW43_DRIVER_PATH specified but content not present.")
1616
endif()
1717

18+
if (NOT DEFINED PICO_CYW43_DRIVER_USES_UZLIB)
19+
set(PICO_CYW43_DRIVER_USES_UZLIB 1)
20+
endif()
21+
1822
if (EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE})
1923
message("cyw43-driver available at ${PICO_CYW43_DRIVER_PATH}")
2024

@@ -29,6 +33,7 @@ if (EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE})
2933
${PICO_CYW43_DRIVER_PATH}/src/cyw43_stats.c
3034
${PICO_CYW43_DRIVER_PATH}/src/cyw43_lwip.c
3135
${PICO_CYW43_DRIVER_PATH}/src/cyw43_ctrl.c
36+
${PICO_CYW43_DRIVER_PATH}/src/cyw43_gz_read.c
3237
)
3338
target_include_directories(cyw43_driver_headers INTERFACE
3439
${PICO_CYW43_DRIVER_PATH}/src
@@ -55,7 +60,12 @@ if (EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE})
5560
hardware_dma
5661
hardware_exception
5762
)
58-
63+
# MP has its own uzlib driver that's used for firmware decompression
64+
if (PICO_CYW43_DRIVER_USES_UZLIB)
65+
pico_mirrored_target_link_libraries(cyw43_driver_picow INTERFACE
66+
pico_uzlib
67+
)
68+
endif()
5969
# Note: This is used by MP, so check for issues when making changes
6070
# e.g. Don't add new depenedences
6171
pico_add_library(pico_btstack_hci_transport_cyw43 NOFLAG)

src/rp2_common/pico_cyw43_driver/cybt_shared_bus/cybt_shared_bus.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
#include "cyw43_ll.h"
1414
#include "cyw43_config.h"
1515
#include "cybt_shared_bus_driver.h"
16-
17-
#include "cyw43_btfw_43439.h"
16+
#include "cyw43_firmware_defs.h"
1817

1918
#if CYW43_USE_HEX_BTFW
2019
extern const char brcm_patch_version[];
@@ -134,14 +133,24 @@ int cyw43_btbus_init(cyw43_ll_t *self) {
134133
fw_data_len = brcm_patch_ram_length;
135134
fw_data_buf = brcm_patchram_buf;
136135
#else
137-
fw_data_len = cyw43_btfw_43439_len;
138-
fw_data_buf = cyw43_btfw_43439;
136+
const cyw43_firmware_details_t *firmware_details = cyw43_get_firmware_funcs()->firmware_details();
137+
fw_data_len = firmware_details->bt_fw_len;
138+
fw_data_buf = firmware_details->bt_fw_addr;
139+
if (cyw43_get_firmware_funcs()->start_bt_fw && cyw43_get_firmware_funcs()->start_bt_fw(firmware_details) != 0) {
140+
assert(false);
141+
return CYW43_EIO;
142+
}
139143
#endif
140144
ret = cybt_fw_download(fw_data_buf,
141145
fw_data_len,
142146
p_write_buf,
143-
p_hex_buf
144-
);
147+
p_hex_buf);
148+
149+
#if !CYW43_USE_HEX_BTFW
150+
if (cyw43_get_firmware_funcs()->end) {
151+
cyw43_get_firmware_funcs()->end();
152+
}
153+
#endif
145154

146155
cybt_debug("cybt_fw_download_finish\n");
147156
cybt_fw_download_finish(p_write_buf, p_hex_buf);

src/rp2_common/pico_cyw43_driver/cybt_shared_bus/cybt_shared_bus_driver.c

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "cyw43_ll.h"
1313
#include "cybt_shared_bus_driver.h"
14+
#include "cyw43_firmware_defs.h"
1415

1516
// Bluetooth register corruption occurs if both wifi and bluetooth are fully utilised.
1617
#define CYBT_CORRUPTION_TEST 1
@@ -111,7 +112,6 @@ cybt_fw_membuf_info_t buf_info;
111112

112113
typedef struct cybt_fw_cb
113114
{
114-
const uint8_t *p_fw_mem_start;
115115
uint32_t fw_len;
116116
const uint8_t *p_next_line_start;
117117
} cybt_fw_cb_t;
@@ -261,21 +261,37 @@ static uint32_t cybt_fw_get_data(cybt_fw_cb_t *p_btfw_cb,
261261
}
262262
#else
263263

264+
static void cybt_fw_get_bytes(uint8_t *dst, const uint8_t **addr, uint8_t count) {
265+
#if CYW43_USE_HEX_BTFW
266+
memcpy(dst, *addr, count);
267+
#else
268+
const uint8_t *data = cyw43_get_firmware_funcs()->get_bt_fw(*addr, count, dst, count);
269+
if (data != dst) {
270+
memcpy(dst, data, count);
271+
}
272+
#endif
273+
*addr += count;
274+
}
275+
264276
static uint32_t cybt_fw_get_data(cybt_fw_cb_t *p_btfw_cb, hex_file_data_t *hfd) {
265277
uint32_t abs_base_addr32 = 0;
266278
while (true) {
267279
// 4 byte header
268-
uint8_t num_bytes = *(p_btfw_cb->p_next_line_start)++;
269-
uint16_t addr = *(p_btfw_cb->p_next_line_start)++ << 8;
270-
addr |= *(p_btfw_cb->p_next_line_start)++;
271-
uint8_t type = *(p_btfw_cb->p_next_line_start)++;
280+
uint8_t num_bytes;
281+
cybt_fw_get_bytes(&num_bytes, &p_btfw_cb->p_next_line_start, 1);
282+
283+
uint16_t addr;
284+
cybt_fw_get_bytes((uint8_t*)&addr, &p_btfw_cb->p_next_line_start, 2);
285+
addr = (((addr >> 8) & 0xff) | ((addr & 0xff) << 8));
286+
287+
uint8_t type;
288+
cybt_fw_get_bytes(&type, &p_btfw_cb->p_next_line_start, 1);
272289

273290
// No data?
274291
if (num_bytes == 0) break;
275292

276293
// Copy the data
277-
memcpy(hfd->p_ds, p_btfw_cb->p_next_line_start, num_bytes);
278-
p_btfw_cb->p_next_line_start += num_bytes;
294+
cybt_fw_get_bytes(hfd->p_ds, &p_btfw_cb->p_next_line_start, num_bytes);
279295

280296
// Adjust address based on type
281297
if (type == BTFW_HEX_LINE_TYPE_EXTENDED_ADDRESS) {
@@ -324,13 +340,16 @@ cybt_result_t cybt_fw_download(const uint8_t *p_bt_firmware,
324340

325341
// BT firmware starts with length of version string including a null terminator
326342
#if !CYW43_USE_HEX_BTFW
327-
uint8_t version_len = *p_bt_firmware;
328-
assert(*(p_bt_firmware + version_len) == 0);
343+
uint8_t version_len;
344+
cybt_fw_get_bytes(&version_len, &p_bt_firmware, 1);
345+
cybt_fw_get_bytes(p_hex_buf, &p_bt_firmware, version_len);
346+
assert(*(p_hex_buf + version_len - 1) == 0);
329347
#ifndef NDEBUG
330-
cybt_printf("BT FW download, version = %s\n", p_bt_firmware + 1);
348+
cybt_printf("BT FW download, version = %s\n", p_hex_buf);
331349
#endif
332-
p_bt_firmware += version_len + 1; // skip over version
333-
p_bt_firmware += 1; // skip over record count
350+
uint8_t record_count;
351+
cybt_fw_get_bytes(&record_count, &p_bt_firmware, 1);
352+
(void)record_count;
334353
#endif
335354

336355
p_mem_ptr = p_write_buf;
@@ -340,7 +359,6 @@ cybt_result_t cybt_fw_download(const uint8_t *p_bt_firmware,
340359

341360
hfd.p_ds = p_hex_buf;
342361

343-
btfw_cb.p_fw_mem_start = p_bt_firmware;
344362
btfw_cb.fw_len = bt_firmware_len;
345363
btfw_cb.p_next_line_start = p_bt_firmware;
346364

@@ -395,7 +413,6 @@ cybt_result_t cybt_fw_download(const uint8_t *p_bt_firmware,
395413
write_data_len - first_write_len);
396414
}
397415
}
398-
399416
return CYBT_SUCCESS;
400417
}
401418

src/rp2_common/pico_cyw43_driver/include/cyw43_configport.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "pico.h"
1313
#include "hardware/gpio.h"
1414
#include "pico/time.h"
15+
#include "hardware/flash.h"
1516

1617
#ifdef __cplusplus
1718
extern "C" {
@@ -62,18 +63,39 @@ extern "C" {
6263
#define CYW43_SPI_PIO 1
6364
#endif
6465

66+
// Compress firmware by default
67+
#ifndef CYW43_ENABLE_FIRMWARE_COMPRESSION
68+
#define CYW43_ENABLE_FIRMWARE_COMPRESSION 1
69+
#endif
70+
6571
#ifndef CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE
6672
#if CYW43_ENABLE_BLUETOOTH
73+
#if CYW43_ENABLE_FIRMWARE_COMPRESSION
74+
#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "wb43439A0_7_95_49_00_combined.gz.h"
75+
#else
6776
#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "wb43439A0_7_95_49_00_combined.h"
77+
#endif
78+
#else
79+
#if CYW43_ENABLE_FIRMWARE_COMPRESSION
80+
#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "w43439A0_7_95_49_00_combined.gz.h"
6881
#else
6982
#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "w43439A0_7_95_49_00_combined.h"
7083
#endif
7184
#endif
85+
#endif
7286

7387
#ifndef CYW43_WIFI_NVRAM_INCLUDE_FILE
7488
#define CYW43_WIFI_NVRAM_INCLUDE_FILE "wifi_nvram_43439.h"
7589
#endif
7690

91+
#ifndef CYW43_BT_FIRMWARE_INCLUDE_FILE
92+
#if CYW43_ENABLE_FIRMWARE_COMPRESSION
93+
#define CYW43_BT_FIRMWARE_INCLUDE_FILE "cyw43_btfw_43439.gz.h"
94+
#else
95+
#define CYW43_BT_FIRMWARE_INCLUDE_FILE "cyw43_btfw_43439.h"
96+
#endif
97+
#endif
98+
7799
// Note, these are negated, because cyw43_driver negates them before returning!
78100
#define CYW43_EPERM (-PICO_ERROR_NOT_PERMITTED) // Operation not permitted
79101
#define CYW43_EIO (-PICO_ERROR_IO) // I/O error
@@ -170,4 +192,4 @@ void cyw43_post_poll_hook(void);
170192
#endif
171193

172194

173-
#endif
195+
#endif

src/rp2_common/pico_uzlib/CMakeLists.txt

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,33 @@
1-
set(UZLIB_TEST_PATH "src/tinflate.c")
2-
if (NOT PICO_UZLIB_PATH)
3-
set(PICO_UZLIB_PATH ${PROJECT_SOURCE_DIR}/lib/uzlib)
1+
set(UZLIB_TEST_PATH "tinflate.c")
2+
if (NOT PICO_UZLIB_SRC_PATH)
3+
set(PICO_UZLIB_SRC_PATH ${PROJECT_SOURCE_DIR}/lib/uzlib/src)
44
endif()
5-
if (NOT EXISTS ${PICO_UZLIB_PATH}/${UZLIB_TEST_PATH})
5+
if (NOT EXISTS ${PICO_UZLIB_SRC_PATH}/${UZLIB_TEST_PATH})
66
message(WARNING "uzlib content not present.")
77
endif()
88

9-
if (EXISTS ${PICO_UZLIB_PATH}/${UZLIB_TEST_PATH})
10-
message("uzlib available at ${PICO_UZLIB_PATH}")
9+
if (EXISTS ${PICO_UZLIB_SRC_PATH}/${UZLIB_TEST_PATH})
10+
message("uzlib source available at ${PICO_UZLIB_SRC_PATH}")
1111

1212
pico_register_common_scope_var(PICO_UZLIB_PATH)
1313

14-
add_library(pico_uzlib INTERFACE)
14+
pico_add_library(pico_uzlib)
1515
target_sources(pico_uzlib INTERFACE
16-
${PICO_UZLIB_PATH}/src/tinflate.c
17-
${PICO_UZLIB_PATH}/src/tinfgzip.c
18-
${PICO_UZLIB_PATH}/src/tinfzlib.c
19-
${PICO_UZLIB_PATH}/src/adler32.c
20-
${PICO_UZLIB_PATH}/src/crc32.c
21-
${PICO_UZLIB_PATH}/src/defl_static.c
16+
${PICO_UZLIB_SRC_PATH}/tinflate.c
17+
${PICO_UZLIB_SRC_PATH}/tinfgzip.c
18+
${PICO_UZLIB_SRC_PATH}/tinfzlib.c
19+
${PICO_UZLIB_SRC_PATH}/adler32.c
20+
${PICO_UZLIB_SRC_PATH}/crc32.c
2221
)
23-
target_include_directories(pico_uzlib INTERFACE
24-
${PICO_UZLIB_PATH}/src
22+
target_include_directories(pico_uzlib_headers INTERFACE
23+
${PICO_UZLIB_SRC_PATH}
2524
)
2625

2726
pico_promote_common_scope_vars()
2827

2928
function(suppress_uzlib_warnings)
3029
set_source_files_properties(
31-
${PICO_UZLIB_PATH}/src/defl_static.c
32-
PROPERTIES
33-
COMPILE_OPTIONS "-Wno-redundant-decls"
34-
)
35-
set_source_files_properties(
36-
${PICO_UZLIB_PATH}/src/tinflate.c
30+
${PICO_UZLIB_SRC_PATH}/tinflate.c
3731
PROPERTIES
3832
COMPILE_OPTIONS "-Wno-sign-compare"
3933
)

0 commit comments

Comments
 (0)