221 lines
4.9 KiB
C
221 lines
4.9 KiB
C
/*
|
|
* Copyright (c) 2024, sakumisu
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef USBH_BL616_H
|
|
#define USBH_BL616_H
|
|
|
|
#define USBWIFI_DATA_TYPE_CMD 0xA55A
|
|
#define USBWIFI_DATA_TYPE_PKT 0x6996
|
|
|
|
#define USB_DATA_FLAG_AP_PKT (1u << 0)
|
|
|
|
typedef enum {
|
|
BFLB_CMD_REBOOT = 0,
|
|
BFLB_CMD_RESET,
|
|
BFLB_CMD_HELLO,
|
|
BFLB_CMD_PING,
|
|
|
|
BFLB_CMD_GET_MAC_ADDR,
|
|
|
|
// Scan
|
|
BFLB_CMD_SCAN,
|
|
BFLB_CMD_SCAN_RESULTS,
|
|
|
|
// STA
|
|
BFLB_CMD_STA_CONNECT,
|
|
BFLB_CMD_STA_DISCONNECT,
|
|
BFLB_CMD_STA_CONNECTED_IND,
|
|
BFLB_CMD_STA_DISCONNECTED_IND,
|
|
BFLB_CMD_STA_IP_UPDATE_IND,
|
|
BFLB_CMD_STA_SET_AUTO_RECONNECT,
|
|
BFLB_CMD_STA_GET_LINK_STATUS,
|
|
|
|
// AP
|
|
BFLB_CMD_AP_START,
|
|
BFLB_CMD_AP_STOP,
|
|
BFLB_CMD_AP_STARTED_IND,
|
|
BFLB_CMD_AP_STOPPED_IND,
|
|
BFLB_CMD_AP_GET_STA_LIST,
|
|
|
|
// Monitor
|
|
BFLB_CMD_MONITOR_START,
|
|
BFLB_CMD_MONITOR_STOP,
|
|
BFLB_CMD_MONITOR_SET_CHANNEL,
|
|
BFLB_CMD_MONITOR_GET_CHANNEL,
|
|
|
|
BFLB_CMD_SET_LPM_MODE,
|
|
|
|
// OTA
|
|
BFLB_CMD_GET_DEV_VERSION,
|
|
BFLB_CMD_OTA,
|
|
|
|
BFLB_CMD_EXT,
|
|
|
|
BFLB_CMD_USER_EXT,
|
|
BFLB_CMD_UNLOAD_DRV,
|
|
|
|
BFLB_CMD_MAX,
|
|
} bflb_cmd_t;
|
|
|
|
typedef enum {
|
|
STATUS_OK,
|
|
STATUS_NOMEM = 128,
|
|
STATUS_INVALID_INPUT,
|
|
STATUS_INVALID_MODE,
|
|
STATUS_ERR_UNSPECIFIED,
|
|
STATUS_NOT_IMPLEMENTED,
|
|
} cmd_status_t;
|
|
|
|
typedef enum {
|
|
RNM_WIFI_AUTH_UNKNOWN = 0,
|
|
RNM_WIFI_AUTH_OPEN,
|
|
RNM_WIFI_AUTH_WEP,
|
|
RNM_WIFI_AUTH_WPA_PSK,
|
|
RNM_WIFI_AUTH_WPA2_PSK,
|
|
RNM_WIFI_AUTH_WPA_WPA2_PSK,
|
|
RNM_WIFI_AUTH_WPA_ENTERPRISE,
|
|
RNM_WIFI_AUTH_WPA3_SAE,
|
|
RNM_WIFI_AUTH_WPA2_PSK_WPA3_SAE,
|
|
RNM_WIFI_AUTH_MAX,
|
|
} rnm_wifi_auth_mode_t;
|
|
|
|
typedef enum {
|
|
RNM_WIFI_CIPHER_UNKNOWN = 0,
|
|
RNM_WIFI_CIPHER_NONE,
|
|
RNM_WIFI_CIPHER_WEP,
|
|
RNM_WIFI_CIPHER_AES,
|
|
RNM_WIFI_CIPHER_TKIP,
|
|
RNM_WIFI_CIPHER_TKIP_AES,
|
|
RNM_WIFI_CIPHER_MAX,
|
|
} rnm_wifi_cipher_t;
|
|
|
|
/* common header */
|
|
typedef struct {
|
|
uint16_t cmd;
|
|
// flag ACK is used by server to indicate a response to client
|
|
#define RNM_MSG_FLAG_ACK (1 << 0)
|
|
// flag TRANSPARENT is never transfered to peer but used locally
|
|
#define RNM_MSG_FLAG_TRANSPARENT (1 << 1)
|
|
// flag ASYNC is used by server to notify client events such as STA_CONNECTED
|
|
#define RNM_MSG_FLAG_ASYNC (1 << 2)
|
|
uint16_t flags;
|
|
uint16_t status;
|
|
uint16_t msg_id;
|
|
uint16_t session_id;
|
|
uint16_t msg_id_replying;
|
|
} rnm_base_msg_t;
|
|
|
|
typedef struct {
|
|
rnm_base_msg_t hdr;
|
|
} rnm_ack_msg_t;
|
|
|
|
typedef struct {
|
|
rnm_base_msg_t hdr;
|
|
uint8_t sta_mac[6];
|
|
uint8_t ap_mac[6];
|
|
} rnm_mac_addr_ind_msg_t;
|
|
|
|
typedef struct {
|
|
rnm_base_msg_t hdr;
|
|
uint16_t ssid_len;
|
|
uint8_t ssid[32];
|
|
uint8_t password[64];
|
|
} rnm_sta_connect_msg_t;
|
|
|
|
typedef struct {
|
|
rnm_base_msg_t hdr;
|
|
uint8_t ip4_addr[4];
|
|
uint8_t ip4_mask[4];
|
|
uint8_t ip4_gw[4];
|
|
uint8_t ip4_dns1[4];
|
|
uint8_t ip4_dns2[4];
|
|
uint8_t gw_mac[6];
|
|
} rnm_sta_ip_update_ind_msg_t;
|
|
|
|
struct bf1b_wifi_scan_record {
|
|
uint8_t bssid[6];
|
|
// TODO use compressed SSID encoding to save room
|
|
uint8_t ssid[32 + 1];
|
|
uint16_t channel;
|
|
int8_t rssi;
|
|
uint8_t auth_mode;
|
|
uint8_t cipher;
|
|
} __PACKED;
|
|
|
|
typedef struct {
|
|
rnm_base_msg_t hdr;
|
|
uint16_t num;
|
|
struct bf1b_wifi_scan_record records[];
|
|
} rnm_scan_ind_msg_t;
|
|
|
|
typedef enum {
|
|
BL_MODE_NONE,
|
|
BL_MODE_STA, // card is STA
|
|
BL_MODE_AP, // card is AP
|
|
BL_MODE_STA_AP, // card is STA&AP
|
|
BL_MODE_SNIFFER, // card is sniffer
|
|
BL_MODE_MAX,
|
|
} bl_wifi_mode_t;
|
|
|
|
typedef struct {
|
|
uint16_t type;
|
|
uint16_t length;
|
|
uint16_t flags;
|
|
uint16_t payload_offset;
|
|
uint32_t rsvd[8];
|
|
uint8_t payload[];
|
|
} __attribute__((aligned(4))) usb_data_t;
|
|
|
|
struct usbh_bl616 {
|
|
struct usbh_hubport *hport;
|
|
struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */
|
|
struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */
|
|
|
|
struct usbh_urb bulkout_urb;
|
|
struct usbh_urb bulkin_urb;
|
|
|
|
uint8_t intf;
|
|
|
|
uint8_t sta_mac[6];
|
|
uint8_t ap_mac[6];
|
|
uint8_t mode;
|
|
bool connect_status;
|
|
|
|
void *user_data;
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
int usbh_bl616_wifi_sta_connect(const char *ssid,
|
|
const int ssid_len,
|
|
const char *password,
|
|
const int pwd_len);
|
|
|
|
int usbh_bl616_wifi_sta_disconnect(void);
|
|
int usbh_bl616_wifi_scan(void);
|
|
|
|
void usbh_bl616_sta_connect_callback(void);
|
|
void usbh_bl616_sta_disconnect_callback(void);
|
|
void usbh_bl616_sta_update_ip(uint8_t ip4_addr[4], uint8_t ip4_mask[4], uint8_t ip4_gw[4]);
|
|
|
|
uint8_t *usbh_bl616_get_eth_txbuf(void);
|
|
int usbh_bl616_eth_output(uint32_t buflen);
|
|
void usbh_bl616_eth_input(uint8_t *buf, uint32_t buflen);
|
|
void usbh_bl616_rx_thread(void *argument);
|
|
|
|
void usbh_bl616_run(struct usbh_bl616 *bl616_class);
|
|
void usbh_bl616_stop(struct usbh_bl616 *bl616_class);
|
|
|
|
int wifi_sta_connect(int argc, char **argv);
|
|
int wifi_scan(int argc, char **argv);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* USBH_BL616_H */
|