Loading...
Searching...
No Matches
cyw43.h
Go to the documentation of this file.
1/*
2 * This file is part of the cyw43-driver
3 *
4 * Copyright (C) 2019-2022 George Robotics Pty Ltd
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * 3. Any redistribution, use, or modification in source or binary form is done
15 * solely for personal benefit and not for any commercial purpose or for
16 * monetary gain.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE LICENSOR AND COPYRIGHT OWNER "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL THE LICENSOR OR COPYRIGHT OWNER BE LIABLE FOR
22 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * This software is also available for use with certain devices under different
30 * terms, as set out in the top level LICENSE file. For commercial licensing
31 * options please email contact@georgerobotics.com.au.
32 */
33
34#ifndef CYW43_INCLUDED_CYW43_H
35#define CYW43_INCLUDED_CYW43_H
36
37#include "cyw43_config.h"
38
39#if CYW43_LWIP
40#include "lwip/netif.h"
41#include "lwip/dhcp.h"
42#endif
43
44#if CYW43_NETUTILS
45#include "shared/netutils/dhcpserver.h"
46#endif
47
48#include "cyw43_ll.h"
49#include <string.h>
50
54
59
66#define CYW43_VERSION_MAJOR 1
67#define CYW43_VERSION_MINOR 1
68#define CYW43_VERSION_MICRO 0
70
76#define CYW43_VERSION (CYW43_VERSION_MAJOR << 16 | CYW43_VERSION_MINOR << 8 | CYW43_VERSION_MICRO)
78
84#define CYW43_TRACE_ASYNC_EV (0x0001)
85#define CYW43_TRACE_ETH_TX (0x0002)
86#define CYW43_TRACE_ETH_RX (0x0004)
87#define CYW43_TRACE_ETH_FULL (0x0008)
88#define CYW43_TRACE_MAC (0x0010)
90
98#define CYW43_LINK_DOWN (0)
99#define CYW43_LINK_JOIN (1)
100#define CYW43_LINK_NOIP (2)
101#define CYW43_LINK_UP (3)
102#define CYW43_LINK_FAIL (-1)
103#define CYW43_LINK_NONET (-2)
104#define CYW43_LINK_BADAUTH (-3)
106
107typedef struct _cyw43_t {
108 cyw43_ll_t cyw43_ll;
109
110 uint8_t itf_state;
111 uint32_t trace_flags;
112
113 // State for async events
114 volatile uint32_t wifi_scan_state;
115 uint32_t wifi_join_state;
116 void *wifi_scan_env;
117 int (*wifi_scan_cb)(void *, const cyw43_ev_scan_result_t *);
118
119 bool initted;
120 // Pending things to do
121 bool pend_disassoc;
122 bool pend_rejoin;
123 bool pend_rejoin_wpa;
124
125 // AP settings
126 uint32_t ap_auth;
127 uint8_t ap_channel;
128 uint8_t ap_ssid_len;
129 uint8_t ap_key_len;
130 uint8_t ap_ssid[32];
131 uint8_t ap_key[64];
132
133 #if CYW43_LWIP
134 // lwIP data
135 struct netif netif[2];
136 #if LWIP_IPV4 && LWIP_DHCP
137 struct dhcp dhcp_client;
138 #endif
139 #endif
140
141 #if CYW43_NETUTILS
142 dhcp_server_t dhcp_server;
143 #endif
144
145 // mac from otp (or from cyw43_hal_generate_laa_mac if not set)
146 uint8_t mac[6];
147
148 #if CYW43_ENABLE_BLUETOOTH
149 bool bt_loaded;
150 #endif
151} cyw43_t;
152
153extern cyw43_t cyw43_state;
154extern void (*cyw43_poll)(void);
155extern uint32_t cyw43_sleep;
156
164void cyw43_init(cyw43_t *self);
165
173void cyw43_deinit(cyw43_t *self);
174
187int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface);
188
201int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf);
202
219int cyw43_wifi_pm(cyw43_t *self, uint32_t pm);
220
238int cyw43_wifi_get_pm(cyw43_t *self, uint32_t *pm);
239
260int cyw43_wifi_link_status(cyw43_t *self, int itf);
261
277void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up, uint32_t country);
278
289int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6]);
290
302int cyw43_wifi_update_multicast_filter(cyw43_t *self, uint8_t *addr, bool add);
303
317int cyw43_wifi_scan(cyw43_t *self, cyw43_wifi_scan_options_t *opts, void *env, int (*result_cb)(void *, const cyw43_ev_scan_result_t *));
318
327static inline bool cyw43_wifi_scan_active(cyw43_t *self) {
328 return self->wifi_scan_state == 1;
329}
330
350int cyw43_wifi_join(cyw43_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel);
351
361int cyw43_wifi_leave(cyw43_t *self, int itf);
362
373int cyw43_wifi_get_rssi(cyw43_t *self, int32_t *rssi);
374
382int cyw43_wifi_get_bssid(cyw43_t *self, uint8_t bssid[6]);
383
393static inline void cyw43_wifi_ap_get_ssid(cyw43_t *self, size_t *len, const uint8_t **buf) {
394 *len = self->ap_ssid_len;
395 *buf = self->ap_ssid;
396}
397
406static inline uint32_t cyw43_wifi_ap_get_auth(cyw43_t *self) {
407 return self->ap_auth;
408}
409
418static inline void cyw43_wifi_ap_set_channel(cyw43_t *self, uint32_t channel) {
419 self->ap_channel = (uint8_t)channel;
420}
421
431static inline void cyw43_wifi_ap_set_ssid(cyw43_t *self, size_t len, const uint8_t *buf) {
432 self->ap_ssid_len = (uint8_t)MIN(len, sizeof(self->ap_ssid));
433 memcpy(self->ap_ssid, buf, self->ap_ssid_len);
434}
435
445static inline void cyw43_wifi_ap_set_password(cyw43_t *self, size_t len, const uint8_t *buf) {
446 self->ap_key_len = (uint8_t)MIN(len, sizeof(self->ap_key));
447 memcpy(self->ap_key, buf, self->ap_key_len);
448}
449
465static inline void cyw43_wifi_ap_set_auth(cyw43_t *self, uint32_t auth) {
466 self->ap_auth = auth;
467}
468
479void cyw43_wifi_ap_get_max_stas(cyw43_t *self, int *max_stas);
480
494void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs);
495
504static inline bool cyw43_is_initialized(cyw43_t *self) {
505 return self->initted;
506}
507
517void cyw43_cb_tcpip_init(cyw43_t *self, int itf);
518
528void cyw43_cb_tcpip_deinit(cyw43_t *self, int itf);
529
540void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf);
541
551void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf);
552
573int cyw43_tcpip_link_status(cyw43_t *self, int itf);
574
575#if CYW43_GPIO
587int cyw43_gpio_set(cyw43_t *self, int gpio, bool val);
588
600int cyw43_gpio_get(cyw43_t *self, int gpio, bool *val);
601#endif
602
626static inline uint32_t cyw43_pm_value(uint8_t pm_mode, uint16_t pm2_sleep_ret_ms, uint8_t li_beacon_period, uint8_t li_dtim_period, uint8_t li_assoc) {
627 return li_assoc << 20 // listen interval sent to ap
628 | li_dtim_period << 16
629 | li_beacon_period << 12
630 | (pm2_sleep_ret_ms / 10) << 4 // cyw43_ll_wifi_pm multiplies this by 10
631 | pm_mode; // CYW43_PM2_POWERSAVE_MODE etc
632}
633
637#define CYW43_DEFAULT_PM (CYW43_PERFORMANCE_PM)
638
642#define CYW43_NONE_PM (cyw43_pm_value(CYW43_NO_POWERSAVE_MODE, 10, 0, 0, 0))
643
647#define CYW43_AGGRESSIVE_PM (cyw43_pm_value(CYW43_PM1_POWERSAVE_MODE, 10, 0, 0, 0))
648
652#define CYW43_PERFORMANCE_PM (cyw43_pm_value(CYW43_PM2_POWERSAVE_MODE, 200, 1, 1, 10))
653
654#if CYW43_ENABLE_BLUETOOTH
655
661int cyw43_bluetooth_hci_init(void);
662
671int cyw43_bluetooth_hci_read(uint8_t *buf, uint32_t max_size, uint32_t *len);
672
680int cyw43_bluetooth_hci_write(uint8_t *buf, size_t len);
681
685void cyw43_bluetooth_hci_process(void);
686
687#endif // CYW43_ENABLE_BLUETOOTH
688
689#if CYW43_ENABLE_BLUETOOTH_OVER_UART
690
698int cyw43_bluetooth_controller_init(void);
699
705int cyw43_bluetooth_controller_deinit(void);
706
712int cyw43_bluetooth_controller_sleep_maybe(void);
713
719bool cyw43_bluetooth_controller_woken(void);
720
726int cyw43_bluetooth_controller_wakeup(void);
727
728#endif // CYW43_ENABLE_BLUETOOTH_OVER_UART
729
731
732#endif // CYW43_INCLUDED_CYW43_H
void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up, uint32_t country)
Set up and initialise wifi.
Definition cyw43_ctrl.c:553
static void cyw43_wifi_ap_set_channel(cyw43_t *self, uint32_t channel)
Set the the channel for the access point.
Definition cyw43.h:418
static uint32_t cyw43_pm_value(uint8_t pm_mode, uint16_t pm2_sleep_ret_ms, uint8_t li_beacon_period, uint8_t li_dtim_period, uint8_t li_assoc)
Return a power management value to pass to cyw43_wifi_pm.
Definition cyw43.h:626
static bool cyw43_wifi_scan_active(cyw43_t *self)
Determine if a wifi scan is in progress.
Definition cyw43.h:327
int cyw43_wifi_scan(cyw43_t *self, cyw43_wifi_scan_options_t *opts, void *env, int(*result_cb)(void *, const cyw43_ev_scan_result_t *))
Perform a wifi scan for wifi networks.
Definition cyw43_ctrl.c:587
void cyw43_deinit(cyw43_t *self)
Shut the driver down.
Definition cyw43_ctrl.c:118
void cyw43_cb_tcpip_init(cyw43_t *self, int itf)
Initialise the IP stack.
Definition cyw43_lwip.c:168
int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6])
Get the mac address of the device.
Definition cyw43_ctrl.c:539
int cyw43_wifi_link_status(cyw43_t *self, int itf)
Get the wifi link status.
Definition cyw43_ctrl.c:613
int cyw43_wifi_join(cyw43_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel)
Connect or join a wifi network.
Definition cyw43_ctrl.c:635
void cyw43_cb_tcpip_deinit(cyw43_t *self, int itf)
Deinitialise the IP stack.
Definition cyw43_lwip.c:246
static void cyw43_wifi_ap_set_auth(cyw43_t *self, uint32_t auth)
Set the security authorisation used in AP mode.
Definition cyw43.h:465
int cyw43_wifi_pm(cyw43_t *self, uint32_t pm)
Set the wifi power management mode.
Definition cyw43_ctrl.c:494
int cyw43_wifi_leave(cyw43_t *self, int itf)
Disassociate from a wifi network.
Definition cyw43_ctrl.c:666
static void cyw43_wifi_ap_set_ssid(cyw43_t *self, size_t len, const uint8_t *buf)
Set the ssid for the access point.
Definition cyw43.h:431
int cyw43_wifi_get_rssi(cyw43_t *self, int32_t *rssi)
Get the signal strength (RSSI) of the wifi network.
Definition cyw43_ctrl.c:672
int cyw43_gpio_get(cyw43_t *self, int gpio, bool *val)
Get the value of the cyw43 gpio.
Definition cyw43_ctrl.c:749
static bool cyw43_is_initialized(cyw43_t *self)
Determines if the cyw43 driver been initialised.
Definition cyw43.h:504
int cyw43_wifi_get_bssid(cyw43_t *self, uint8_t bssid[6])
Get the BSSID of the connected wifi network.
Definition cyw43_ctrl.c:679
static void cyw43_wifi_ap_get_ssid(cyw43_t *self, size_t *len, const uint8_t **buf)
Get the ssid for the access point.
Definition cyw43.h:393
int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf)
Send a raw ethernet packet.
Definition cyw43_ctrl.c:458
int cyw43_wifi_get_pm(cyw43_t *self, uint32_t *pm)
Get the wifi power management mode.
Definition cyw43_ctrl.c:515
void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf)
Notify the IP stack that the link is up.
Definition cyw43_lwip.c:292
void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs)
Get the number of devices (STAs) associated with the wifi access point.
Definition cyw43_ctrl.c:717
int cyw43_wifi_update_multicast_filter(cyw43_t *self, uint8_t *addr, bool add)
Add/remove multicast group address.
Definition cyw43_ctrl.c:546
static void cyw43_wifi_ap_set_password(cyw43_t *self, size_t len, const uint8_t *buf)
Set the password for the wifi access point.
Definition cyw43.h:445
int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface)
Send an ioctl command to cyw43.
Definition cyw43_ctrl.c:444
void cyw43_init(cyw43_t *self)
Initialize the driver.
Definition cyw43_ctrl.c:85
static uint32_t cyw43_wifi_ap_get_auth(cyw43_t *self)
Get the security authorisation used in AP mode.
Definition cyw43.h:406
int cyw43_tcpip_link_status(cyw43_t *self, int itf)
Get the link status.
Definition cyw43_lwip.c:300
int cyw43_gpio_set(cyw43_t *self, int gpio, bool val)
Set the value of the cyw43 gpio.
Definition cyw43_ctrl.c:737
void cyw43_wifi_ap_get_max_stas(cyw43_t *self, int *max_stas)
Get the maximum number of devices (STAs) that can be associated with the wifi access point.
Definition cyw43_ctrl.c:713
void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf)
Notify the IP stack that the link is down.
Definition cyw43_lwip.c:296
struct _cyw43_wifi_scan_options_t cyw43_wifi_scan_options_t
wifi scan options passed to cyw43_wifi_scan
struct _cyw43_ev_scan_result_t cyw43_ev_scan_result_t
Structure to return wifi scan results.
#define MIN(a, b)
Macro to return the minimum of two comparable values.
Definition compiler.h:149
Definition cyw43.h:107