pico-cyw43-arch
将 CYW43 驱动(用于 Pico W 无线功能)和 lwIP(用于 TCP/IP 协议栈)集成到 SDK 中的架构层。访问 Pico W 板载 LED 也需要此模块。
详细描述
底层 cyw43_driver 和 lwIP 协议栈都需要定期维护,并且对于是否可以从多个核心/线程调用有所限制。
pico_cyw43_arch 尝试将这些复杂性抽象为几种行为模式:
-
'poll' - 非多核/IRQ 安全,需要用户在主循环中定期调用
cyw43_arch_poll。 -
'thread_safe_background' - 多核/线程/任务安全,驱动和 TCP/IP 协议栈的维护在后台自动处理。
-
'freertos' - 多核/线程/任务安全,使用独立的 FreeRTOS 任务处理 lwIP 和驱动工作。
目前 lwIP 是唯一支持的 TCP/IP 协议栈,但 pico_cyw43_arch 的设计旨在未来独立于特定的 TCP/IP 协议栈(以及可能的蓝牙协议栈)。因此,lwIP 的集成在基础(pico_cyw43_arch)库中根据 cyw43_driver 使用的 #define CYW43_LWIP 来处理。
自 Raspberry Pi Pico SDK 1.5.0 版起,pico_cyw43_arch 库不再直接实现各种行为抽象,这项工作现在由更通用的 pico_async_context 库负责。pico_cyw43_arch 的用户可见行为因此没有改变,但 pico_cyw43_arch 现在只是一个薄封装,负责创建适当的 async_context 并简单调用以添加 lwIP 或 cyw43_driver 支持。您可以自由地执行上下文创建和添加 lwIP、cyw43_driver 或任何其他未来协议/驱动支持到您的 async_context`,但目前 pico_cyw43_arch 仍提供一些 cyw43_ 专用(即 Pico W)API,用于连接管理、锁定和 GPIO 交互。
连接管理 API 在未来版本中至少可能会移至更通用的库。锁定方法现在由其 pico_async_context 等价方法支持,这些方法可互换使用(详见 cyw43_arch_lwip_begin、cyw43_arch_lwip_end 和 cyw43_arch_lwip_check)。
有关创建自己的 async_context 并添加 cyw43_driver 和 lwIP 支持的示例,请参阅源文件 cyw43_arch_poll.c、cyw43_arch_threadsafe_background.c 和 cyw43_arch_freertos.c。
虽然您可以直接使用 pico_cyw43_arch 库并自行指定 CYW43_LWIP(和其他定义),但构建系统还提供了几个其他库,它们为您聚合了定义和其他依赖项:
- pico_cyw43_arch_lwip_poll - 使用 RAW lwIP API(
NO_SYS=1模式),不进行后台处理或多核/线程安全保证。
用户必须在主循环中定期调用 cyw43_arch_poll。
此封装库:
-
设置
CYW43_LWIP=1 以在 pico_cyw43_arch 和cyw43_driver` 中启用 lwIP 支持。 -
设置
PICO_CYW43_ARCH_POLL=1以选择轮询行为。 -
添加
pico_lwip作为依赖项以引入 lwIP。 -
pico_cyw43_arch_lwip_threadsafe_background - 使用 RAW lwIP API(
NO_SYS=1 模式),具有多核/线程安全性,并在后台自动维护 cyw43_driver和 lwIP。
对 cyw43_driver 高级 API([cyw43.h])的调用可以从任一核心或 lwIP 回调中进行,但对 lwIP(非线程安全)的调用(除 lwIP 回调中的调用外)必须用 cyw43_arch_lwip_begin 和 cyw43_arch_lwip_end` 括起来。在 lwIP 回调中括起来也可以,只是不必要。
lwIP 回调在(低优先级)IRQ 上下文中发生(类似于告警回调),与其他代码交互时需要小心。
此封装库:
-
设置
CYW43_LWIP=1 以在 pico_cyw43_arch 和cyw43_driver` 中启用 lwIP 支持。 -
设置
PICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1以选择线程安全/非轮询行为。 -
添加 pico_lwip 作为依赖项以引入 lwIP。
此库也可以在 RP2040 的 FreeRTOS 移植版本下以 NO_SYS=1 模式的 lwIP 使用(允许您从任意任务调用 cyw43_driver API,以及从 lwIP 回调或任何任务(如果用 cyw43_arch_lwip_begin 和 cyw43_arch_lwip_end括起来的调用)调用 lwIP。同样,在 lwIP 回调中执行操作时应谨慎,因为在 IRQ 上下文中不能调用大多数 FreeRTOS API。除非有充分理由,否则应使用pico_cyw43_arch_lwip_sys_freertos 提供的完整 FreeRTOS 集成(NO_SYS=0)。
- pico_cyw43_arch_lwip_sys_freertos - 在 OS(
NO_SYS=0)模式下使用完整 lwIP API(包括阻塞套接字),具有多核/任务/线程安全性,并自动维护 cyw43_driver和 lwIP 协议栈。
此封装库:
-
设置
CYW43_LWIP=1 以在 pico_cyw43_arch 和cyw43_driver` 中启用 lwIP 支持。 -
设置
PICO_CYW43_ARCH_FREERTOS=1以选择 NO_SYS=0 的 lwip/FreeRTOS 集成。 -
设置
LWIP_PROVIDE_ERRNO=1以提供无 OS 编译所需的错误码。 -
添加
pico_lwip作为依赖项以引入 lwIP。 -
从 lwip-contrib 添加 lwIP/FreeRTOS 代码(在 lwIP 的 contrib 目录中)。
对 cyw43_driver 高级 API([cyw43.h])的调用可以从任意任务或 lwIP 回调中进行,但不能从 IRQ 中进行。对 lwIP RAW API(非线程安全)的调用必须用 cyw43_arch_lwip_begin 和 cyw43_arch_lwip_end` 括起来。在 lwIP 回调中括起来也可以,只是不必要。
此封装库要求您自行将 FreeRTOS 功能链接到应用程序。
- pico_cyw43_arch_none - 如果不需要 TCP/IP 协议栈,但希望使用板载 LED。
此封装库:
- 设置
CYW43_LWIP=0 以在 pico_cyw43_arch 和cyw43_driver` 中禁用 lwIP 支持。
模块
cyw43_driver
Pico W 无线驱动。
宏
#define cyw43_arch_lwip_check(void) cyw43_thread_lock_check()
函数
int cyw43_arch_init (void): 初始化 CYW43 架构。int cyw43_arch_init_with_country (uint32_t country): 初始化 CYW43 架构,用于特定国家/地区。void cyw43_arch_deinit (void): 反初始化 CYW43 架构。async_context_t * cyw43_arch_async_context (void)<br/> 返回 cyw43_arch 代码当前使用的 async_context。
void cyw43_arch_set_async_context (async_context_t *context)<br/> 设置 cyw43_arch_init 要使用的 async_context。
async_context_t * cyw43_arch_init_default_async_context (void)<br/> 为当前 cyw43_arch 类型初始化默认的 async_context。
void cyw43_arch_poll (void): 执行cyw43_driver` 或 TCP/IP 协议栈所需的任何处理。void cyw43_arch_wait_for_work_until (absolute_time_t until): 休眠直到有 cyw43_driver 工作需要处理。uint32_t cyw43_arch_get_country_code (void): 返回用于初始化 cyw43_arch 的国家代码。void cyw43_arch_enable_sta_mode (void): 启用 Wi-Fi STA(站点)模式。void cyw43_arch_disable_sta_mode (void): 禁用 Wi-Fi STA(站点)模式。void cyw43_arch_enable_ap_mode (const char **ssid, const char **password, uint32_t auth)
启用 Wi-Fi AP(接入点)模式。void cyw43_arch_disable_ap_mode (void): 禁用 Wi-Fi AP(接入点)模式。int cyw43_arch_wifi_connect_blocking (const char **ssid, const char **pw, uint32_t auth)
尝试连接到无线接入点,阻塞直到加入网络或检测到失败。
int cyw43_arch_wifi_connect_bssid_blocking (const char **ssid, const uint8_t **bssid, const char *pw, uint32_t auth)
尝试连接到由 SSID 和 BSSID 指定的无线接入点,阻塞直到加入网络或检测到失败。
int cyw43_arch_wifi_connect_timeout_ms (const char **ssid, const char **pw, uint32_t auth, uint32_t timeout)
尝试连接到无线接入点,阻塞直到加入网络、检测到失败或超时。
int cyw43_arch_wifi_connect_bssid_timeout_ms (const char **ssid, const uint8_t **bssid, const char *pw, uint32_t auth, uint32_t timeout)
尝试连接到由 SSID 和 BSSID 指定的无线接入点,阻塞直到加入网络、检测到失败或超时。
int cyw43_arch_wifi_connect_async (const char **ssid, const char **pw, uint32_t auth)
开始尝试连接到无线接入点。
int cyw43_arch_wifi_connect_bssid_async (const char **ssid, const uint8_t **bssid, const char *pw, uint32_t auth)
开始尝试连接到由 SSID 和 BSSID 指定的无线接入点。
void cyw43_arch_gpio_put (uint wl_gpio, bool value): 将无线芯片上的 GPIO 引脚设置为指定值。bool cyw43_arch_gpio_get (uint wl_gpio): 读取无线芯片上 GPIO 引脚的值。static void cyw43_arch_lwip_begin (void): 获取调用 lwIP 所需的锁。static void cyw43_arch_lwip_end (void): 释放调用 lwIP 所需的锁。static int cyw43_arch_lwip_protect (int(**func)(void **param), void *param)
以持有锁的方式调用函数。
宏定义文档
cyw43_arch_lwip_check
#define cyw43_arch_lwip_check(void) cyw43_thread_lock_check()
检查调用者是否持有调用 lwIP 所需的锁。
lwIP API 非线程安全。应用 cyw43_arch_lwip_begin 和此方法将 lwIP API 的调用括起来。注意,从 lwIP 回调中回调 lwIP API 时,这些调用不是必须的(但无害)。
如果不满足上述条件(即调用 lwIP API 不安全),此方法将在调试模式下断言。
自 SDK 1.5.0 版起,等同于在与 cyw43_arch 和 lwIP 关联的 async_context 上调用 async_context_lock_check。
参见
cyw43_arch_lwip_begin
cyw43_arch_lwip_protect
cyw43_arch_async_context
函数文档
cyw43_arch_async_context
async_context_t * cyw43_arch_async_context (void)
返回 cyw43_arch 代码当前使用的 async_context。
返回值
async_context。
cyw43_arch_deinit
void cyw43_arch_deinit (void)
反初始化 CYW43 架构。
此方法反初始化 cyw43_driver 代码并反初始化 lwIP 协议栈(如果在构建时启用)。注意,此方法应始终从与 cyw43_arch_init 相同的核心(或 RTOS 任务,取决于环境)调用。
此外,如果 cyw43_arch 使用其自己的 async_context 实例,则该实例也会被反初始化。
cyw43_arch_disable_ap_mode
void cyw43_arch_disable_ap_mode (void)
禁用 Wi-Fi AP(接入点)模式。
禁用接入点模式下的 Wi-Fi。
cyw43_arch_disable_sta_mode
void cyw43_arch_disable_sta_mode (void)
禁用 Wi-Fi STA(站点)模式。
禁用站点模式下的 Wi-Fi,断开所有活动连接。您应随后通过调用 cyw43_wifi_link_status 检查状态。
cyw43_arch_enable_ap_mode
void cyw43_arch_enable_ap_mode (const char ** ssid, const char ** password, uint32_t auth)
启用 Wi-Fi AP(接入点)模式。
在接入点模式下启用 Wi-Fi,使其他 Wi-Fi 客户端可以连接到此设备。
参数
ssid: 接入点名称password: 使用的密码,无密码时传 NULL。auth: 启用密码时使用的授权类型。值为 [CYW43_AUTH_WPA_TKIP_PSK]、[CYW43_AUTH_WPA2_AES_PSK] 或 [CYW43_AUTH_WPA2_MIXED_PSK](参见 [CYW43_AUTH_])。
cyw43_arch_enable_sta_mode
void cyw43_arch_enable_sta_mode (void)
启用 Wi-Fi STA(站点)模式。
在站点模式下启用 Wi-Fi,使其可以连接到其他 Wi-Fi 接入点。
cyw43_arch_get_country_code
uint32_t cyw43_arch_get_country_code (void)
返回用于初始化 cyw43_arch 的国家代码。
返回值
国家代码(参见 [CYW43_COUNTRY_])
cyw43_arch_gpio_get
bool cyw43_arch_gpio_get (uint wl_gpio)
读取无线芯片上 GPIO 引脚的值。
此方法不检查设置 GPIO 时的错误。如果希望检查错误,可改用底层 cyw43_gpio_get。
参数
wl_gpio: 无线芯片上的 GPIO 编号
返回值
GPIO 为高电平时返回 true,否则返回 false
cyw43_arch_gpio_put
void cyw43_arch_gpio_put (uint wl_gpio, bool value)
将无线芯片上的 GPIO 引脚设置为指定值。
此方法不检查设置 GPIO 时的错误。如果希望检查错误,可改用底层 cyw43_gpio_set。
参数
wl_gpio: 无线芯片上的 GPIO 编号value: true 设置 GPIO 为高,false 清除为低。