if (DEFINED ENV{PICO_CYW43_DRIVER_PATH} AND (NOT PICO_CYW43_DRIVER_PATH))
    set(PICO_CYW43_DRIVER_PATH $ENV{PICO_CYW43_DRIVER_PATH})
    message("Using PICO_CYW43_DRIVER_PATH from environment ('${PICO_CYW43_DRIVER_PATH}')")
endif()

set(CYW43_DRIVER_TEST_FILE "src/cyw43.h")

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})
        message(WARNING "cyw43-driver submodule has not been initialized; Pico W wireless support will be unavailable
hint: try 'git submodule update --init' from your SDK directory (${PICO_SDK_PATH}).")
    endif()
elseif (NOT EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE})
    message(WARNING "PICO_CYW43_DRIVER_PATH specified but content not present.")
endif()

if (EXISTS ${PICO_CYW43_DRIVER_PATH}/${CYW43_DRIVER_TEST_FILE})
    message("cyw43-driver available at ${PICO_CYW43_DRIVER_PATH}")

    pico_register_common_scope_var(PICO_CYW43_DRIVER_PATH)

    # base driver without our bus
    add_library(cyw43_driver INTERFACE)
    target_sources(cyw43_driver INTERFACE
            ${PICO_CYW43_DRIVER_PATH}/src/cyw43_ll.c
            ${PICO_CYW43_DRIVER_PATH}/src/cyw43_stats.c
            ${PICO_CYW43_DRIVER_PATH}/src/cyw43_lwip.c
            ${PICO_CYW43_DRIVER_PATH}/src/cyw43_ctrl.c
            )
    target_include_directories(cyw43_driver INTERFACE
            ${PICO_CYW43_DRIVER_PATH}/src
            ${PICO_CYW43_DRIVER_PATH}/firmware
            )

    # pico_cyw43_driver adds async_context integration to cyw43_driver
    add_library(pico_cyw43_driver INTERFACE)
    target_sources(pico_cyw43_driver INTERFACE
            cyw43_driver.c)
    target_include_directories(pico_cyw43_driver INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include)
    target_link_libraries(pico_cyw43_driver INTERFACE cyw43_driver)

    # 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)

    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}
            VERBATIM)

    # cyw43_driver_picow is cyw43_driver plus Pico W specific bus implementation, and Pico W firmware
    add_library(cyw43_driver_picow INTERFACE)
    target_sources(cyw43_driver_picow INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/cyw43_bus_pio_spi.c
            )
    pico_generate_pio_header(cyw43_driver_picow ${CMAKE_CURRENT_LIST_DIR}/cyw43_bus_pio_spi.pio)
    add_dependencies(cyw43_driver_picow INTERFACE cyw43_firmware_package)
    target_link_libraries(cyw43_driver_picow INTERFACE
            ${CYW43_FIRMWARE_OBJ}
            )
    target_link_libraries(cyw43_driver_picow INTERFACE
            cyw43_driver
            hardware_pio
            hardware_dma
            hardware_exception
            )

    pico_promote_common_scope_vars()
endif()
