summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-07-07 12:07:49 +0800
committersakumisu <[email protected]>2024-07-07 12:10:17 +0800
commit4f3a3f496e6bd6b14a473a15435fd7f7fbf9d826 (patch)
treec4a32c163ceb8d194dcbc0ca74b7900ebdab9d24
parente4b56cee898db47bf884bfcaf265601f6d3491aa (diff)
feat(wifi/bl616): add bl616 usbwifi
-rw-r--r--README.md2
-rw-r--r--README_zh.md2
-rw-r--r--cherryusb.cmake4
-rw-r--r--class/vendor/wifi/README.md6
-rw-r--r--platform/none/usbh_lwip.c105
5 files changed, 116 insertions, 3 deletions
diff --git a/README.md b/README.md
index 10ed83a8..1c9b57d1 100644
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@ CherryUSB Host Stack has the following functions:
- Support USB Audio CLASS (UAC1.0)
- Support Remote NDIS (RNDIS)
- Support USB Bluetooth class (support nimble and zephyr bluetooth stack, support **CLASS:0xE0** or vendor class like cdc acm)
-- Support Vendor class
+- Support Vendor class (serial, net, wifi)
- Support USB modeswitch
- Support multi host with the same USB IP
diff --git a/README_zh.md b/README_zh.md
index cce81939..9f0a9fce 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -99,7 +99,7 @@ CherryUSB Host 协议栈当前实现以下功能:
- Support USB Audio CLASS (UAC1.0)
- 支持 Remote NDIS (RNDIS)
- 支持 USB Bluetooth (支持 nimble and zephyr bluetooth 协议栈,支持 **CLASS: 0xE0** 或者厂家自定义类,类似于 cdc acm 功能)
-- 支持 Vendor 类 class
+- 支持 Vendor 类 class (serial, net, wifi)
- 支持 USB modeswitch
- 支持相同 USB IP 的多主机
diff --git a/cherryusb.cmake b/cherryusb.cmake
index d8451d21..644d8003 100644
--- a/cherryusb.cmake
+++ b/cherryusb.cmake
@@ -38,6 +38,7 @@ ${CMAKE_CURRENT_LIST_DIR}/class/wireless
${CMAKE_CURRENT_LIST_DIR}/class/midi
${CMAKE_CURRENT_LIST_DIR}/class/vendor/net
${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial
+${CMAKE_CURRENT_LIST_DIR}/class/vendor/wifi
)
if(CONFIG_CHERRYUSB_DEVICE)
@@ -209,6 +210,9 @@ if(CONFIG_CHERRYUSB_HOST)
if(CONFIG_CHERRYUSB_HOST_PL2303)
list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_pl2303.c)
endif()
+ if(CONFIG_CHERRYUSB_HOST_BL616)
+ list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/wifi/usbh_bl616.c)
+ endif()
if(DEFINED CONFIG_CHERRYUSB_HOST_HCD)
if("${CONFIG_CHERRYUSB_HOST_HCD}" STREQUAL "ehci_bouffalo")
diff --git a/class/vendor/wifi/README.md b/class/vendor/wifi/README.md
new file mode 100644
index 00000000..18384f65
--- /dev/null
+++ b/class/vendor/wifi/README.md
@@ -0,0 +1,6 @@
+# BL616 USB WIFI
+
+Usbwifi firmware please contact bouffalolab. You can purchase a module in the following ways:
+
+- https://iot.mi.com/moduleBrowser.html
+- https://docs.ai-thinker.com/ai_m61 \ No newline at end of file
diff --git a/platform/none/usbh_lwip.c b/platform/none/usbh_lwip.c
index aaf67b0e..ea26f747 100644
--- a/platform/none/usbh_lwip.c
+++ b/platform/none/usbh_lwip.c
@@ -36,6 +36,7 @@
#define CONFIG_USBHOST_PLATFORM_CDC_NCM
#define CONFIG_USBHOST_PLATFORM_ASIX
#define CONFIG_USBHOST_PLATFORM_RTL8152
+// #define CONFIG_USBHOST_PLATFORM_BL616
ip_addr_t g_ipaddr;
ip_addr_t g_netmask;
@@ -84,18 +85,24 @@ TimerHandle_t dhcp_handle;
static void dhcp_timeout(TimerHandle_t xTimer)
{
struct netif *netif = (struct netif *)pvTimerGetTimerID(xTimer);
+#if LWIP_DHCP
struct dhcp *dhcp;
-
+#endif
if (netif_is_up(netif)) {
+#if LWIP_DHCP
dhcp = netif_dhcp_data(netif);
if (dhcp && (dhcp->state == DHCP_STATE_BOUND)) {
+#endif
USB_LOG_INFO("IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr));
USB_LOG_INFO("IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask));
USB_LOG_INFO("IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw));
xTimerStop(xTimer, 0);
+#if LWIP_DHCP
}
+#endif
+ } else {
}
}
@@ -529,3 +536,99 @@ void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class)
netif_remove(netif);
}
#endif
+
+#ifdef CONFIG_USBHOST_PLATFORM_BL616
+#include "usbh_bl616.h"
+
+struct netif g_bl616_netif;
+static err_t usbh_bl616_linkoutput(struct netif *netif, struct pbuf *p)
+{
+ int ret;
+
+ usbh_lwip_eth_output_common(p, usbh_bl616_get_eth_txbuf());
+ ret = usbh_bl616_eth_output(p->tot_len);
+ if (ret < 0) {
+ return ERR_BUF;
+ } else {
+ return ERR_OK;
+ }
+}
+
+void usbh_bl616_eth_input(uint8_t *buf, uint32_t buflen)
+{
+ usbh_lwip_eth_input_common(&g_bl616_netif, buf, buflen);
+}
+
+static err_t usbh_bl616_if_init(struct netif *netif)
+{
+ LWIP_ASSERT("netif != NULL", (netif != NULL));
+
+ netif->mtu = 1500;
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
+ netif->state = NULL;
+ netif->name[0] = 'E';
+ netif->name[1] = 'X';
+ netif->output = etharp_output;
+ netif->linkoutput = usbh_bl616_linkoutput;
+ return ERR_OK;
+}
+
+void usbh_bl616_sta_connect_callback(void)
+{
+}
+
+void usbh_bl616_sta_disconnect_callback(void)
+{
+ struct netif *netif = &g_bl616_netif;
+
+ netif_set_down(netif);
+}
+void usbh_bl616_sta_update_ip(uint8_t ip4_addr[4], uint8_t ip4_mask[4], uint8_t ip4_gw[4])
+{
+ struct netif *netif = &g_bl616_netif;
+
+ IP4_ADDR(&netif->ip_addr, ip4_addr[0], ip4_addr[1], ip4_addr[2], ip4_addr[3]);
+ IP4_ADDR(&netif->netmask, ip4_mask[0], ip4_mask[1], ip4_mask[2], ip4_mask[3]);
+ IP4_ADDR(&netif->gw, ip4_gw[0], ip4_gw[1], ip4_gw[2], ip4_gw[3]);
+
+ netif_set_up(netif);
+}
+void usbh_bl616_run(struct usbh_bl616 *bl616_class)
+{
+ struct netif *netif = &g_bl616_netif;
+
+ netif->hwaddr_len = 6;
+ memcpy(netif->hwaddr, bl616_class->sta_mac, 6);
+
+ IP4_ADDR(&g_ipaddr, 0, 0, 0, 0);
+ IP4_ADDR(&g_netmask, 0, 0, 0, 0);
+ IP4_ADDR(&g_gateway, 0, 0, 0, 0);
+
+ netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_bl616_if_init, tcpip_input);
+ netif_set_down(netif);
+ netif_set_default(netif);
+
+ dhcp_handle = xTimerCreate((const char *)"dhcp", (TickType_t)200, (UBaseType_t)pdTRUE, (void *const)netif, (TimerCallbackFunction_t)dhcp_timeout);
+ if (dhcp_handle == NULL) {
+ USB_LOG_ERR("timer creation failed! \r\n");
+ while (1) {
+ }
+ }
+ xTimerStart(dhcp_handle, 0);
+
+ usb_osal_thread_create("usbh_bl616", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bl616_rx_thread, NULL);
+}
+
+void usbh_bl616_stop(struct usbh_bl616 *bl616_class)
+{
+ struct netif *netif = &g_bl616_netif;
+
+ netif_set_down(netif);
+ netif_remove(netif);
+}
+
+// #include "shell.h"
+
+// CSH_CMD_EXPORT(wifi_sta_connect, );
+// CSH_CMD_EXPORT(wifi_scan, );
+#endif \ No newline at end of file