Ver Fonte

添加AP模式和混杂模式的支持

zyh há 6 anos atrás
pai
commit
503de8b60c
3 ficheiros alterados com 51 adições e 14 exclusões
  1. 15 5
      example/rw007_stm32_port.c
  2. 4 2
      inc/spi_wifi_rw007.h
  3. 32 7
      src/spi_wifi_rw007.c

+ 15 - 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,28 @@ 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 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)

+ 4 - 2
inc/spi_wifi_rw007.h

@@ -53,8 +53,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 +152,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;
 

+ 32 - 7
src/spi_wifi_rw007.c

@@ -34,7 +34,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 +151,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 +170,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 +244,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 +339,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)
@@ -451,13 +468,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)