diff --git a/src/cyw43_ctrl.c b/src/cyw43_ctrl.c index edec1f3..de03c73 100644 --- a/src/cyw43_ctrl.c +++ b/src/cyw43_ctrl.c @@ -296,13 +296,17 @@ static const char *const cyw43_async_event_name_table[89] = { [CYW43_EV_SET_SSID] = "SET_SSID", [CYW43_EV_JOIN] = "JOIN", [CYW43_EV_AUTH] = "AUTH", + [CYW43_EV_AUTH_IND] = "AUTH_IND", [CYW43_EV_DEAUTH_IND] = "DEAUTH_IND", [CYW43_EV_ASSOC] = "ASSOC", + [CYW43_EV_ASSOC_IND] = "ASSOC_IND", [CYW43_EV_DISASSOC] = "DISASSOC", [CYW43_EV_DISASSOC_IND] = "DISASSOC_IND", [CYW43_EV_LINK] = "LINK", + [CYW43_EV_PROBREQ_MSG] = "PROBREQ_MSG", [CYW43_EV_PSK_SUP] = "PSK_SUP", [CYW43_EV_ESCAN_RESULT] = "ESCAN_RESULT", + [CYW43_EV_P2P_PROBREQ_MSG] = "P2P_PROBREQ_MSG", [CYW43_EV_CSA_COMPLETE_IND] = "CSA_COMPLETE_IND", [CYW43_EV_ASSOC_REQ_IE] = "ASSOC_REQ_IE", [CYW43_EV_ASSOC_RESP_IE] = "ASSOC_RESP_IE", diff --git a/src/cyw43_ll.c b/src/cyw43_ll.c index 604335c..4aeb629 100644 --- a/src/cyw43_ll.c +++ b/src/cyw43_ll.c @@ -54,9 +54,6 @@ #include "cyw43_sdio.h" #endif -#define CYW43_FLASH_BLOCK_SIZE (512) -uint32_t storage_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blocks); - struct pbuf; uint16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, uint16_t len, uint16_t offset); @@ -68,10 +65,6 @@ extern bool enable_spi_packet_dumping; #define CYW43_RAM_SIZE (512 * 1024) -// Include the file containing the WiFi+CLM firmware blob as a C array. -#include CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE - -#define CYW43_CLM_ADDR (fw_data + ALIGN_UINT(CYW43_WIFI_FW_LEN, 512)) #define VERIFY_FIRMWARE_DOWNLOAD (0) #define ALIGN_UINT(val, align) (((val) + (align) - 1) & ~((align) - 1)) @@ -357,58 +350,31 @@ static void cyw43_write_backplane(cyw43_int_t *self, uint32_t addr, size_t size, cyw43_set_backplane_window(self, CHIPCOMMON_BASE_ADDRESS); } -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 = CYW43_BUS_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", (unsigned int)block_size); +static uint32_t storage_get_chunksize() +{ + const uint32_t chunkTag = 0x4b4e4843; // "CHNK" + struct chunk_t { + uint32_t tag; + uint32_t length; + }; + struct chunk_t chunk; + int res = cyw43_storage_read(&chunk, sizeof(chunk)); + if (res != sizeof(chunk)) { + CYW43_WARN("Bad chunk header %d\n", res); + return 0; } + if (chunk.tag != chunkTag) { + CYW43_WARN("Bad chunk tag %08x\n", chunk.tag); + return 0; + } + CYW43_DEBUG("Chunk %u bytes\n", chunk.length); + return chunk.length; +} - 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); - } +static int cyw43_download_resource(cyw43_int_t *self, uint32_t addr, size_t len, int from_storage, uintptr_t source) { + CYW43_VDEBUG("writing %lu bytes to 0x%lx\n", (uint32_t)len, (uint32_t)addr); - // print wifi firmware version info - CYW43_DEBUG("%s\n", &b[fw_end - 3 - found]); - } + const uint32_t block_size = CYW43_BUS_MAX_BLOCK_SIZE; #if VERIFY_FIRMWARE_DOWNLOAD uint32_t t_start = cyw43_hal_ticks_us(); @@ -426,7 +392,7 @@ static int cyw43_download_resource(cyw43_int_t *self, uint32_t addr, size_t raw_ 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); + cyw43_storage_read(self->spid_buf, sz); src = self->spid_buf; } else { src = (const uint8_t *)source + offset; @@ -443,6 +409,10 @@ static int cyw43_download_resource(cyw43_int_t *self, uint32_t addr, size_t raw_ } #if VERIFY_FIRMWARE_DOWNLOAD + if(from_storage) { + cyw43_storage_cleanup(); + storage_get_chunksize(); + } 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", (unsigned int)dt, (unsigned int)(len * 1000 / dt)); @@ -464,7 +434,7 @@ static int cyw43_download_resource(cyw43_int_t *self, uint32_t addr, size_t raw_ 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); + cyw43_storage_read(self->spid_buf, verify_block_size); src = self->spid_buf; } else { src = (const uint8_t *)source + offset; @@ -1372,8 +1342,8 @@ void cyw43_ll_bus_sleep(cyw43_ll_t *self_in, bool can_sleep) { #define CLM_CHUNK_LEN 1024 + 512 #endif -static void cyw43_clm_load(cyw43_int_t *self, const uint8_t *clm_ptr, size_t clm_len) { - // Reuse spid_buf but be careful to start at the right offset in it +static void cyw43_clm_load(cyw43_int_t *self, size_t clm_len) { + // Reuse spid_buf but be careful to start at the right offset in i uint8_t *buf = &self->spid_buf[SDPCM_HEADER_LEN + 16]; const size_t clm_dload_chunk_len = CLM_CHUNK_LEN; @@ -1398,7 +1368,7 @@ 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); + cyw43_storage_read(buf + 20, len); CYW43_VDEBUG("clm data send %lu/%zu\n", off + len, clm_len); @@ -1654,12 +1624,9 @@ alp_set: 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_WIFI_FW_LEN, 0, fw_data); - /* // Take firmware from storage block device - cyw43_download_resource(self, 0x00000000, CYW43_WIFI_FW_LEN, 1, 0x100 + 0x1000); - */ + cyw43_storage_init(); + cyw43_download_resource(self, 0x00000000, storage_get_chunksize(), 1, 0); size_t wifi_nvram_len = ALIGN_UINT(sizeof(wifi_nvram_4343), 64); const uint8_t *wifi_nvram_data = wifi_nvram_4343; @@ -1776,9 +1743,11 @@ f2_ready: // 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, storage_get_chunksize()); CYW43_VDEBUG("cyw43_clm_load done\n"); + cyw43_storage_cleanup(); + cyw43_write_iovar_u32(self, "bus:txglom", 0, WWD_STA_INTERFACE); // tx glomming off cyw43_write_iovar_u32(self, "apsta", 1, WWD_STA_INTERFACE); // apsta on @@ -1882,6 +1851,10 @@ int cyw43_ll_wifi_on(cyw43_ll_t *self_in, uint32_t country) { cyw43_delay_ms(50); #ifndef NDEBUG + // Get and print firmware version + memcpy(buf, "ver\x00", 4); + cyw43_do_ioctl(self, SDPCM_GET, WLC_GET_VAR, 128, buf, WWD_STA_INTERFACE); + CYW43_DEBUG("%s", buf); // Get and print CLM version memcpy(buf, "clmver\x00", 7); cyw43_do_ioctl(self, SDPCM_GET, WLC_GET_VAR, 128, buf, WWD_STA_INTERFACE); @@ -1911,8 +1884,8 @@ int cyw43_ll_wifi_on(cyw43_ll_t *self_in, uint32_t country) { CLR_EV(buf, 19); // roam attempt occurred CLR_EV(buf, 20); // tx fail CLR_EV(buf, 40); // radio - CLR_EV(buf, 44); // probe request CLR_EV(buf, 54); // interface change + CLR_EV(buf, 67); // WAI stations event (whatever that is) CLR_EV(buf, 71); // probe response #undef CLR_EV memcpy(buf, "bsscfg:event_msgs", 18); diff --git a/src/cyw43_ll.h b/src/cyw43_ll.h index 2750238..c281093 100644 --- a/src/cyw43_ll.h +++ b/src/cyw43_ll.h @@ -67,15 +67,19 @@ #define CYW43_EV_SET_SSID (0) #define CYW43_EV_JOIN (1) #define CYW43_EV_AUTH (3) +#define CYW43_EV_AUTH_IND (4) #define CYW43_EV_DEAUTH (5) #define CYW43_EV_DEAUTH_IND (6) #define CYW43_EV_ASSOC (7) +#define CYW43_EV_ASSOC_IND (8) #define CYW43_EV_DISASSOC (11) #define CYW43_EV_DISASSOC_IND (12) #define CYW43_EV_LINK (16) #define CYW43_EV_PRUNE (23) +#define CYW43_EV_PROBREQ_MSG (44) #define CYW43_EV_PSK_SUP (46) #define CYW43_EV_ESCAN_RESULT (69) +#define CYW43_EV_P2P_PROBREQ_MSG (72) #define CYW43_EV_CSA_COMPLETE_IND (80) #define CYW43_EV_ASSOC_REQ_IE (87) #define CYW43_EV_ASSOC_RESP_IE (88) @@ -318,6 +322,11 @@ uint32_t cyw43_ll_read_backplane_reg(cyw43_ll_t *self_in, uint32_t addr); int cyw43_ll_write_backplane_mem(cyw43_ll_t *self_in, uint32_t addr, uint32_t len, const uint8_t *buf); int cyw43_ll_read_backplane_mem(cyw43_ll_t *self_in, uint32_t addr, uint32_t len, uint8_t *buf); +// Sming framework methods for accessing partition storage +int cyw43_storage_init(); +uint32_t cyw43_storage_read(void *dest, uint32_t length); +void cyw43_storage_cleanup(void); + //!\} #endif // CYW43_INCLUDED_CYW43_LL_H