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 
53 
64 #define CYW43_TRACE_ASYNC_EV (0x0001)
66 #define CYW43_TRACE_ETH_TX (0x0002)
67 #define CYW43_TRACE_ETH_RX (0x0004)
68 #define CYW43_TRACE_ETH_FULL (0x0008)
69 #define CYW43_TRACE_MAC (0x0010)
70 
79 #define CYW43_LINK_DOWN (0)
81 #define CYW43_LINK_JOIN (1)
82 #define CYW43_LINK_NOIP (2)
83 #define CYW43_LINK_UP (3)
84 #define CYW43_LINK_FAIL (-1)
85 #define CYW43_LINK_NONET (-2)
86 #define CYW43_LINK_BADAUTH (-3)
87 
89 typedef struct _cyw43_t {
90  cyw43_ll_t cyw43_ll;
91 
92  uint8_t itf_state;
93  uint32_t trace_flags;
94 
95  // State for async events
96  volatile uint32_t wifi_scan_state;
97  uint32_t wifi_join_state;
98  void *wifi_scan_env;
99  int (*wifi_scan_cb)(void *, const cyw43_ev_scan_result_t *);
100 
101  bool initted;
102  // Pending things to do
103  bool pend_disassoc;
104  bool pend_rejoin;
105  bool pend_rejoin_wpa;
106 
107  // AP settings
108  uint32_t ap_auth;
109  uint8_t ap_channel;
110  uint8_t ap_ssid_len;
111  uint8_t ap_key_len;
112  uint8_t ap_ssid[32];
113  uint8_t ap_key[64];
114 
115  #if CYW43_LWIP
116  // lwIP data
117  struct netif netif[2];
118  #if LWIP_IPV4
119  struct dhcp dhcp_client;
120  #endif
121  #endif
122 
123  #if CYW43_NETUTILS
124  dhcp_server_t dhcp_server;
125  #endif
126 
127  // mac from otp (or from cyw43_hal_generate_laa_mac if not set)
128  uint8_t mac[6];
129 
130  #if CYW43_ENABLE_BLUETOOTH
131  bool bt_loaded;
132  #endif
133 } cyw43_t;
134 
135 extern cyw43_t cyw43_state;
136 extern void (*cyw43_poll)(void);
137 extern uint32_t cyw43_sleep;
138 
146 void cyw43_init(cyw43_t *self);
147 
155 void cyw43_deinit(cyw43_t *self);
156 
169 int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface);
170 
183 int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf);
184 
200 int cyw43_wifi_pm(cyw43_t *self, uint32_t pm);
201 
218 int cyw43_wifi_get_pm(cyw43_t *self, uint32_t *pm);
219 
240 int cyw43_wifi_link_status(cyw43_t *self, int itf);
241 
257 void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up, uint32_t country);
258 
269 int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6]);
270 
282 int cyw43_wifi_update_multicast_filter(cyw43_t *self, uint8_t *addr, bool add);
283 
297 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 *));
298 
307 static inline bool cyw43_wifi_scan_active(cyw43_t *self) {
308  return self->wifi_scan_state == 1;
309 }
310 
330 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);
331 
341 int cyw43_wifi_leave(cyw43_t *self, int itf);
342 
353 int cyw43_wifi_get_rssi(cyw43_t *self, int32_t *rssi);
354 
362 int cyw43_wifi_get_bssid(cyw43_t *self, uint8_t bssid[6]);
363 
373 static inline void cyw43_wifi_ap_get_ssid(cyw43_t *self, size_t *len, const uint8_t **buf) {
374  *len = self->ap_ssid_len;
375  *buf = self->ap_ssid;
376 }
377 
386 static inline uint32_t cyw43_wifi_ap_get_auth(cyw43_t *self) {
387  return self->ap_auth;
388 }
389 
398 static inline void cyw43_wifi_ap_set_channel(cyw43_t *self, uint32_t channel) {
399  self->ap_channel = (uint8_t) channel;
400 }
401 
411 static inline void cyw43_wifi_ap_set_ssid(cyw43_t *self, size_t len, const uint8_t *buf) {
412  self->ap_ssid_len = (uint8_t) MIN(len, sizeof(self->ap_ssid));
413  memcpy(self->ap_ssid, buf, self->ap_ssid_len);
414 }
415 
425 static inline void cyw43_wifi_ap_set_password(cyw43_t *self, size_t len, const uint8_t *buf) {
426  self->ap_key_len = (uint8_t) MIN(len, sizeof(self->ap_key));
427  memcpy(self->ap_key, buf, self->ap_key_len);
428 }
429 
445 static inline void cyw43_wifi_ap_set_auth(cyw43_t *self, uint32_t auth) {
446  self->ap_auth = auth;
447 }
448 
458 void cyw43_wifi_ap_get_max_stas(cyw43_t *self, int *max_stas);
459 
472 void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs);
473 
482 static inline bool cyw43_is_initialized(cyw43_t *self) {
483  return self->initted;
484 }
485 
495 void cyw43_cb_tcpip_init(cyw43_t *self, int itf);
496 
506 void cyw43_cb_tcpip_deinit(cyw43_t *self, int itf);
507 
518 void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf);
519 
529 void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf);
530 
551 int cyw43_tcpip_link_status(cyw43_t *self, int itf);
552 
553 #if CYW43_GPIO
554 
565 int cyw43_gpio_set(cyw43_t *self, int gpio, bool val);
566 
578 int cyw43_gpio_get(cyw43_t *self, int gpio, bool *val);
579 #endif
580 
603 static 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) {
604  return li_assoc << 20 | // listen interval sent to ap
605  li_dtim_period << 16 |
606  li_beacon_period << 12 |
607  (pm2_sleep_ret_ms / 10) << 4 | // cyw43_ll_wifi_pm multiplies this by 10
608  pm_mode; // CYW43_PM2_POWERSAVE_MODE etc
609 }
610 
614 #define CYW43_DEFAULT_PM cyw43_pm_value(CYW43_PM2_POWERSAVE_MODE, 200, 1, 1, 10)
615 
619 #define CYW43_AGGRESSIVE_PM cyw43_pm_value(CYW43_PM2_POWERSAVE_MODE, 2000, 1, 1, 10)
620 
624 #define CYW43_PERFORMANCE_PM cyw43_pm_value(CYW43_PM2_POWERSAVE_MODE, 20, 1, 1, 1)
625 
626 #if CYW43_ENABLE_BLUETOOTH
627 
632 int cyw43_bluetooth_hci_init(void);
633 
642 int cyw43_bluetooth_hci_read(uint8_t *buf, uint32_t max_size, uint32_t *len);
643 
651 int cyw43_bluetooth_hci_write(uint8_t *buf, size_t len);
652 
656 void cyw43_bluetooth_hci_process(void);
657 #endif
658 
660 
661 #endif // CYW43_INCLUDED_CYW43_H
int cyw43_tcpip_link_status(cyw43_t *self, int itf)
Get the link status.
Definition: cyw43_lwip.c:283
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:620
wifi scan options passed to cyw43_wifi_scan
Definition: cyw43_ll.h:243
static void cyw43_wifi_ap_set_auth(cyw43_t *self, uint32_t auth)
Set the security authorisation used in AP mode.
Definition: cyw43.h:445
static uint32_t cyw43_wifi_ap_get_auth(cyw43_t *self)
Get the security authorisation used in AP mode.
Definition: cyw43.h:386
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:373
Definition: cyw43.h:89
Definition: cyw43_ll.h:261
void cyw43_init(cyw43_t *self)
Initialize the driver.
Definition: cyw43_ctrl.c:91
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:275
Low Level CYW43 driver interface.
static bool cyw43_is_initialized(cyw43_t *self)
Determines if the cyw43 driver been initialised.
Definition: cyw43.h:482
Structure to return wifi scan results.
Definition: cyw43_ll.h:211
void cyw43_cb_tcpip_init(cyw43_t *self, int itf)
Initialise the IP stack.
Definition: cyw43_lwip.c:169
static void cyw43_wifi_ap_set_channel(cyw43_t *self, uint32_t channel)
Set the the channel for the access point.
Definition: cyw43.h:398
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:425
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:450
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:572
void cyw43_cb_tcpip_deinit(cyw43_t *self, int itf)
Deinitialise the IP stack.
Definition: cyw43_lwip.c:233
void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up, uint32_t country)
Set up and initialise wifi.
Definition: cyw43_ctrl.c:545
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:411
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:436
void cyw43_deinit(cyw43_t *self)
Shut the driver down.
Definition: cyw43_ctrl.c:122
int cyw43_wifi_pm(cyw43_t *self, uint32_t pm)
Set the wifi power management mode.
Definition: cyw43_ctrl.c:486
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:531
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:702
int cyw43_wifi_leave(cyw43_t *self, int itf)
Dissassociate from a wifi network.
Definition: cyw43_ctrl.c:651
static bool cyw43_wifi_scan_active(cyw43_t *self)
Determine if a wifi scan is in progress.
Definition: cyw43.h:307
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:279
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:603
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:698
int cyw43_wifi_get_rssi(cyw43_t *self, int32_t *rssi)
Get the signal strength (RSSI) of the wifi network.
Definition: cyw43_ctrl.c:657
int cyw43_wifi_link_status(cyw43_t *self, int itf)
Get the wifi link status.
Definition: cyw43_ctrl.c:598
int cyw43_wifi_get_bssid(cyw43_t *self, uint8_t bssid[6])
Get the BSSID of the connected wifi network.
Definition: cyw43_ctrl.c:664
int cyw43_wifi_get_pm(cyw43_t *self, uint32_t *pm)
Get the wifi power management mode.
Definition: cyw43_ctrl.c:507
int cyw43_wifi_update_multicast_filter(cyw43_t *self, uint8_t *addr, bool add)
Add/remove multicast group address.
Definition: cyw43_ctrl.c:538
#define MIN(a, b)
Macro to return the minimum of two comparable values.
Definition: platform.h:262