Преглед изворни кода

Merge pull request #5 from lymzzyh/master

修复 pass长度错误
Bernard Xiong пре 6 година
родитељ
комит
66a3c4424e
3 измењених фајлова са 66 додато и 19 уклоњено
  1. 26 5
      example/rw007_stm32_port.c
  2. 5 5
      inc/spi_wifi_rw007.h
  3. 35 9
      src/spi_wifi_rw007.c

+ 26 - 5
example/rw007_stm32_port.c

@@ -9,6 +9,8 @@
 #define RW007_AT_MODE   3
 #define RW007_SPI_MODE  1
 
+#define RW007_WORKING_STATION_MODE
+
 extern void spi_wifi_isr(int vector);
 
 static void set_rw007_mode(int mode)
@@ -35,20 +37,39 @@ static void set_rw007_mode(int mode)
 
 int wifi_spi_device_init(void)
 {
+    char sn_version[32];
     set_rw007_mode(RW007_SPI_MODE);
     stm32_spi_bus_attach_device(RW007_CS_PIN, RW007_SPI_BUS_NAME, "wspi");
     rt_hw_wifi_init("wspi");
+#ifdef RW007_WORKING_STATION_MODE
     rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
+#else
+    rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
+#endif
+    
+    rw007_sn_get(sn_version);
+    rt_kprintf("\nrw007  sn: [%s]\n", sn_version);
+    rw007_version_get(sn_version);
+    rt_kprintf("rw007 ver: [%s]\n\n", sn_version);
+    return 0;
 }
 INIT_APP_EXPORT(wifi_spi_device_init);
-    
+
+static int rw007_update(void)
+{
+    rt_device_t device = rt_device_find(RW007_SPI_BUS_NAME);
+    struct stm32_spi *hspi = (struct stm32_spi *)device->user_data;
+    __HAL_SPI_DISABLE((SPI_HandleTypeDef *)hspi);
+    HAL_SPI_MspDeInit((SPI_HandleTypeDef *)hspi);
+    set_rw007_mode(RW007_AT_MODE);
+    return 0;
+}
+MSH_CMD_EXPORT(rw007_update, rw007_update);
+
 static void int_wifi_irq(void * p)
 {
     ((void)p);
-    if(rt_pin_read(RW007_INT_BUSY_PIN))
-    {
-        spi_wifi_isr(0);
-    }
+    spi_wifi_isr(0);
 }
 
 void spi_wifi_hw_init(void)

+ 5 - 5
inc/spi_wifi_rw007.h

@@ -14,9 +14,7 @@
 
 #include <stdint.h>
 #include "lwipopts.h"
-#include <lwip/icmp.h>
-#include <netif/etharp.h>
-#include <netif/ethernetif.h>
+#include <rtdevice.h>
 
 // little-endian
 struct spi_cmd_request
@@ -53,8 +51,8 @@ struct spi_response
 typedef enum
 {
     data_type_sta_eth_data = 0,
-    data_type_ap_eth_data = 0,
-    data_type_promisc_data = 0,
+    data_type_ap_eth_data,
+    data_type_promisc_data,
     data_type_cmd,
     data_type_resp,
     data_type_cb,
@@ -152,6 +150,8 @@ typedef enum
     RW00x_CMD_GET_CHANNEL,
     RW00x_CMD_SET_COUNTRY,
     RW00x_CMD_GET_COUNTRY,
+    RW00x_CMD_AP_MAC_GET,
+    RW00x_CMD_AP_MAC_SET,
     RW00x_CMD_MAX_NUM
 }RW00x_CMD;
 

+ 35 - 9
src/spi_wifi_rw007.c

@@ -12,8 +12,7 @@
  * 2019-02-25     zyh          porting rw007 to wlan 
  */
 #include <rtthread.h>
-#include <rtdevice.h>
-
+#include <string.h>
 
 #ifndef RW007_LOG_LEVEL
 #define RW007_LOG_LEVEL DBG_LOG
@@ -34,7 +33,6 @@ static struct rt_event spi_wifi_data_event;
 
 static rt_err_t spi_wifi_transfer(struct rw007_spi *dev)
 {
-    struct pbuf *p = RT_NULL;
     struct spi_cmd_request cmd;
     struct spi_response resp;
 
@@ -152,6 +150,10 @@ static rt_err_t spi_wifi_transfer(struct rw007_spi *dev)
             {
                 rt_wlan_dev_report_data(wifi_ap.wlan, (void *)data_packet->buffer, data_packet->data_len);
             }
+            else if (data_packet->data_type == data_type_promisc_data)
+            {
+                rt_wlan_dev_promisc_handler(wifi_sta.wlan, (void *)data_packet->buffer, data_packet->data_len);
+            }
             else if(data_packet->data_type == data_type_cb)
             {
                 struct rw00x_resp * resp = (struct rw00x_resp *)data_packet->buffer;
@@ -167,7 +169,15 @@ static rt_err_t spi_wifi_transfer(struct rw007_spi *dev)
                 }
                 else
                 {
-                    rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, resp->cmd, RT_NULL);
+                    if(resp->cmd == RT_WLAN_DEV_EVT_AP_START || resp->cmd == RT_WLAN_DEV_EVT_AP_STOP || 
+                       resp->cmd == RT_WLAN_DEV_EVT_AP_ASSOCIATED || resp->cmd == RT_WLAN_DEV_EVT_AP_DISASSOCIATED)
+                    {
+                        rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, (rt_wlan_dev_event_t)resp->cmd, RT_NULL);
+                    }
+                    else
+                    {
+                        rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, (rt_wlan_dev_event_t)resp->cmd, RT_NULL);
+                    }
                 }
             }
             else if (data_packet->data_type == data_type_resp)
@@ -233,9 +243,9 @@ rt_inline struct rw007_wifi *wifi_get_dev_by_wlan(struct rt_wlan_device *wlan)
     {
         return &wifi_sta;
     }
-    if (wlan == RT_NULL)
+    if (wlan == wifi_ap.wlan)
     {
-        return RT_NULL;
+        return &wifi_ap;
     }
     return RT_NULL;
 }
@@ -328,7 +338,13 @@ rt_err_t rw007_version_get(char version[16])
 
 static rt_err_t wlan_init(struct rt_wlan_device *wlan)
 {
-    return spi_set_data(wlan, RW00x_CMD_INIT, RT_NULL, 0); 
+    static int inited = 0;
+    if(!inited)
+    {
+        inited = 1;
+        return spi_set_data(wlan, RW00x_CMD_INIT, RT_NULL, 0);
+    }
+    return RT_EOK;
 }
 
 static rt_err_t wlan_mode(struct rt_wlan_device *wlan, rt_wlan_mode_t mode)
@@ -353,6 +369,7 @@ static rt_err_t wlan_join(struct rt_wlan_device *wlan, struct rt_sta_info *sta_i
     value.info.ssid = sta_info->ssid;
     rt_memcpy(value.info.bssid, sta_info->bssid, 6);
     strncpy(value.passwd, (const char *)&sta_info->key.val[0], sta_info->key.len);
+    value.passwd[sta_info->key.len] = '\0';
     return spi_set_data(wlan, RW00x_CMD_JOIN, &value, sizeof(value));
 }
 
@@ -367,6 +384,7 @@ static rt_err_t wlan_softap(struct rt_wlan_device *wlan, struct rt_ap_info *ap_i
     value.info.rssi = 0;
     value.info.ssid = ap_info->ssid;
     strncpy(value.passwd, (const char *)&ap_info->key.val[0], ap_info->key.len);
+    value.passwd[ap_info->key.len] = '\0';
     return spi_set_data(wlan, RW00x_CMD_SOFTAP, &value, sizeof(value));
 }
 
@@ -449,13 +467,21 @@ static rt_country_code_t wlan_get_country(struct rt_wlan_device *wlan)
 
 static rt_err_t wlan_set_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
 {
-    return spi_set_data(wlan, RW00x_CMD_MAC_SET, mac, 6);
+    if(wlan == wifi_sta.wlan)
+    {
+        return spi_set_data(wlan, RW00x_CMD_MAC_SET, mac, 6);
+    }
+    return spi_set_data(wlan, RW00x_CMD_AP_MAC_SET, mac, 6);
 }
 
 static rt_err_t wlan_get_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
 {
     rt_uint32_t size_of_data;
-    return spi_get_data(wlan, RW00x_CMD_MAC_GET, mac, &size_of_data);
+    if(wlan == wifi_sta.wlan)
+    {
+        return spi_get_data(wlan, RW00x_CMD_MAC_GET, mac, &size_of_data);
+    }
+    return spi_get_data(wlan, RW00x_CMD_AP_MAC_GET, mac, &size_of_data);
 }
 
 static int wlan_send(struct rt_wlan_device *wlan, void *buff, int len)