Skip to content

WiFi stack hangs at cyw43_arch_enable_sta_mode() without error when running for RISC-V #3118

Description

@cpg

It appears that the cyw43 driver hard hangs at cyw43_arch_enable_sta_mode() when running on the RISC-V cores. Any ideas/suggestions?

Can I add more debugging detail?

I think I have isolated this issue down to RISC-V vs. Arm (where the same WiFi setup code works) after trying a number of other settings.

I had tried to isolate it to lwip options (background vs. polling), running from flash vs. RAM, SPI, and other things. In the end it appears to be related to RISC-V support.

With cyw43 debug options on, I saw that things would hang with this detail:

...
setting SPI_BUS_CONTROL 0x204b3
write_reg_u32_swap BUS_FUNCTION 0x0=0x204b3
cyw43_read_reg_u32 BUS_FUNCTION 0x0=0x200b3
read SPI_BUS_CONTROL 0x200b3
cyw43_write_reg_u8 BUS_FUNCTION 0x1d=0x10
cyw43_write_reg_u8 BUS_FUNCTION 0x4=0x99
cyw43_write_reg_u16 BUS_FUNCTION 0x6=0xbe
backplane is ready
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000e=0x8
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0x1000e=0x48
ALP is set
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000e=0x0
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000c=0x18
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xb800=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xb800=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0xc408=0x3
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc408=0xd5900003
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0xc800=0x0
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0xc408=0x1
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc408=0xd5900001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u32 BACKPLANE_FUNCTION 0xc010=0x3
cyw43_write_reg_u32 BACKPLANE_FUNCTION 0xc044=0x0

at which point there appears to be a "hard" hang: using the usual VSCode "Run" command would not work on the device until I unplugged it and plug it back setting it into BOOTSEL mode.

When using the same application code and target_link_libraries, I see these messages (and eventually IP address and things seeminly working):

...
setting SPI_BUS_CONTROL 0x204b3
write_reg_u32_swap BUS_FUNCTION 0x0=0x204b3
cyw43_read_reg_u32 BUS_FUNCTION 0x0=0x200b3
read SPI_BUS_CONTROL 0x200b3
cyw43_write_reg_u8 BUS_FUNCTION 0x1d=0x10
cyw43_write_reg_u8 BUS_FUNCTION 0x4=0x99
cyw43_write_reg_u16 BUS_FUNCTION 0x6=0xbe
backplane is ready
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000e=0x8
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0x1000e=0x48
ALP is set
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000e=0x0
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000c=0x18
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xb800=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xb800=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc800=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0xc408=0x3
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc408=0xd5920003
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0xc800=0x0
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0xc408=0x1
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1810
cyw43_read_reg_u8 BACKPLANE_FUNCTION 0xc408=0xd5920001
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
cyw43_write_reg_u32 BACKPLANE_FUNCTION 0xc010=0x3
cyw43_write_reg_u32 BACKPLANE_FUNCTION 0xc044=0x0
Version: 7.95.49 (2271bb6 CY) CRC: b7a28ef3 Date: Mon 2021-11-29 22:50:27 PST Ucode Ver: 1043.2162 FWID 01-c51d9400
writing 224192 bytes to 0x0
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000c=0x0
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x80
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x100
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x180
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x2
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x200
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x280
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x3
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x300
done dnload; dt = 84994 us; speed = 2637 kbytes/sec
writing 744 bytes to 0x7fd14
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x7
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000a=0x780
done dnload; dt = 591 us; speed = 1258 kbytes/sec
cyw43_write_reg_u32 BACKPLANE_FUNCTION 0xfffc=0xff4500ba
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000c=0x18
cyw43_write_reg_u8 BACKPLANE_FUNCTION 0x1000b=0x1800
...

The code is fairly generic/basic:

int main()
{
    int wifi_status = -1;
    uint8_t *ip_address = NULL;

    stdio_init_all();

    sleep_ms(2000);

    press_enter_to_continue();

    // Initialise the Wi-Fi chip
    printf("WiFi HW init\n");
    if (cyw43_arch_init()) {
        printf("WiFi init failed\n");
        wifi_status = -2;
    } else {
        printf("WiFi init OK\n");
        wifi_status = 0;
    }

    // Enable wifi station -- IT HANGS HERE
    cyw43_arch_enable_sta_mode();

    printf("Connecting to WiFi...\n");
    if (cyw43_arch_wifi_connect_timeout_ms(WIFI_SSID, WIFI_PASSWORD, CYW43_AUTH_WPA3_SAE_AES_PSK, 30000)) {
        printf("WiFi: failed to connect.\n");
        wifi_status = -3;
    } else {
        printf("WiFi: Connected.\n");
        // Read the ip address in a human readable way
        ip_address = (uint8_t *)&(cyw43_state.netif[0].ip_addr.addr);
        printf("WiFi: IP address %d.%d.%d.%d\n", ip_address[0], ip_address[1], ip_address[2], ip_address[3]);
        wifi_status = 0;
    }


    while (true) {
        printf("Hello, world!\n");
        if (wifi_status == 0) {
            printf("WiFi is connected.\n");
        } else {
            printf("WiFi is not connected: %d.\n", wifi_status);
        }
        sleep_ms(1000);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions