xref: /nrf52832-nimble/rt-thread/components/drivers/spi/spi_wifi_rw009.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2014-07-31     aozima       the first version
9*10465441SEvalZero  * 2014-09-18     aozima       update command & response.
10*10465441SEvalZero  * 2017-07-28     armink       fix auto reconnect feature
11*10465441SEvalZero  */
12*10465441SEvalZero 
13*10465441SEvalZero #include <rtthread.h>
14*10465441SEvalZero #include <drivers/spi.h>
15*10465441SEvalZero 
16*10465441SEvalZero #include <netif/ethernetif.h>
17*10465441SEvalZero #include <netif/etharp.h>
18*10465441SEvalZero #include <lwip/icmp.h>
19*10465441SEvalZero #include "lwipopts.h"
20*10465441SEvalZero 
21*10465441SEvalZero #define WIFI_DEBUG_ON
22*10465441SEvalZero // #define ETH_RX_DUMP
23*10465441SEvalZero // #define ETH_TX_DUMP
24*10465441SEvalZero 
25*10465441SEvalZero #ifdef WIFI_DEBUG_ON
26*10465441SEvalZero #define WIFI_DEBUG         rt_kprintf("[RW009] ");rt_kprintf
27*10465441SEvalZero //#define SPI_DEBUG         rt_kprintf("[SPI] ");rt_kprintf
28*10465441SEvalZero #define SPI_DEBUG(...)
29*10465441SEvalZero #else
30*10465441SEvalZero #define WIFI_DEBUG(...)
31*10465441SEvalZero #define SPI_DEBUG(...)
32*10465441SEvalZero #endif /* #ifdef WIFI_DEBUG_ON */
33*10465441SEvalZero 
34*10465441SEvalZero /********************************* RW009 **************************************/
35*10465441SEvalZero #include "spi_wifi_rw009.h"
36*10465441SEvalZero 
37*10465441SEvalZero /* tools */
38*10465441SEvalZero #define node_entry(node, type, member) \
39*10465441SEvalZero     ((type *)((char *)(node) - (unsigned long)(&((type *)0)->member)))
40*10465441SEvalZero #define member_offset(type, member) \
41*10465441SEvalZero     ((unsigned long)(&((type *)0)->member))
42*10465441SEvalZero 
43*10465441SEvalZero #define MAX_SPI_PACKET_SIZE     (member_offset(struct spi_data_packet, buffer) + SPI_MAX_DATA_LEN)
44*10465441SEvalZero #define MAX_SPI_BUFFER_SIZE     (sizeof(struct spi_response) + MAX_SPI_PACKET_SIZE)
45*10465441SEvalZero #define MAX_ADDR_LEN 6
46*10465441SEvalZero 
47*10465441SEvalZero struct rw009_wifi
48*10465441SEvalZero {
49*10465441SEvalZero     /* inherit from ethernet device */
50*10465441SEvalZero     struct eth_device parent;
51*10465441SEvalZero 
52*10465441SEvalZero     struct rt_spi_device *rt_spi_device;
53*10465441SEvalZero 
54*10465441SEvalZero     /* interface address info. */
55*10465441SEvalZero     rt_uint8_t  dev_addr[MAX_ADDR_LEN];         /* hw address   */
56*10465441SEvalZero     rt_uint8_t  active;
57*10465441SEvalZero 
58*10465441SEvalZero     struct rt_mempool spi_tx_mp;
59*10465441SEvalZero     struct rt_mempool spi_rx_mp;
60*10465441SEvalZero 
61*10465441SEvalZero     struct rt_mailbox spi_tx_mb;
62*10465441SEvalZero     struct rt_mailbox eth_rx_mb;
63*10465441SEvalZero 
64*10465441SEvalZero     int spi_tx_mb_pool[SPI_TX_POOL_SIZE + 1];
65*10465441SEvalZero     int eth_rx_mb_pool[SPI_RX_POOL_SIZE + 1];
66*10465441SEvalZero 
67*10465441SEvalZero     int rw009_cmd_mb_pool[3];
68*10465441SEvalZero     struct rt_mailbox rw009_cmd_mb;
69*10465441SEvalZero     uint32_t last_cmd;
70*10465441SEvalZero 
71*10465441SEvalZero     ALIGN(4)
72*10465441SEvalZero     rt_uint8_t spi_tx_mempool[(sizeof(struct spi_data_packet) + 4) * SPI_TX_POOL_SIZE];
73*10465441SEvalZero     ALIGN(4)
74*10465441SEvalZero     rt_uint8_t spi_rx_mempool[(sizeof(struct spi_data_packet) + 4) * SPI_RX_POOL_SIZE];
75*10465441SEvalZero 
76*10465441SEvalZero     ALIGN(4)
77*10465441SEvalZero     uint8_t spi_hw_rx_buffer[MAX_SPI_BUFFER_SIZE];
78*10465441SEvalZero 
79*10465441SEvalZero     /* status for RW009 */
80*10465441SEvalZero     rw009_ap_info ap_info;  /* AP info for conn. */
81*10465441SEvalZero     rw009_ap_info *ap_scan; /* AP list for SCAN. */
82*10465441SEvalZero     uint32_t ap_scan_count;
83*10465441SEvalZero };
84*10465441SEvalZero static struct rw009_wifi rw009_wifi_device;
85*10465441SEvalZero static struct rt_event spi_wifi_data_event;
86*10465441SEvalZero 
resp_handler(struct rw009_wifi * wifi_device,struct rw009_resp * resp)87*10465441SEvalZero static void resp_handler(struct rw009_wifi *wifi_device, struct rw009_resp *resp)
88*10465441SEvalZero {
89*10465441SEvalZero     struct rw009_resp *resp_return = RT_NULL;
90*10465441SEvalZero 
91*10465441SEvalZero     switch (resp->cmd)
92*10465441SEvalZero     {
93*10465441SEvalZero     case RW009_CMD_INIT:
94*10465441SEvalZero         WIFI_DEBUG("resp_handler RW009_CMD_INIT\n");
95*10465441SEvalZero         resp_return = (struct rw009_resp *)rt_malloc(member_offset(struct rw009_resp, resp) + sizeof(rw009_resp_init)); //TODO:
96*10465441SEvalZero         if(resp_return == RT_NULL) break;
97*10465441SEvalZero         memcpy(resp_return, resp, member_offset(struct rw009_resp, resp) + sizeof(rw009_resp_init));
98*10465441SEvalZero 
99*10465441SEvalZero         WIFI_DEBUG("sn:%-*.*s\n", sizeof(resp->resp.init.sn), sizeof(resp->resp.init.sn), resp->resp.init.sn);
100*10465441SEvalZero         WIFI_DEBUG("version:%-*.*s\n", sizeof(resp->resp.init.version), sizeof(resp->resp.init.version), resp->resp.init.version);
101*10465441SEvalZero 
102*10465441SEvalZero         rt_memcpy(wifi_device->dev_addr, resp->resp.init.mac, 6);
103*10465441SEvalZero         break;
104*10465441SEvalZero 
105*10465441SEvalZero     case RW009_CMD_SCAN:
106*10465441SEvalZero         if( resp->len == sizeof(rw009_ap_info) )
107*10465441SEvalZero         {
108*10465441SEvalZero             rw009_ap_info *ap_scan = rt_realloc(wifi_device->ap_scan, sizeof(rw009_ap_info) * (wifi_device->ap_scan_count + 1) );
109*10465441SEvalZero             if(ap_scan != RT_NULL)
110*10465441SEvalZero             {
111*10465441SEvalZero                 memcpy( &ap_scan[wifi_device->ap_scan_count], &resp->resp.ap_info, sizeof(rw009_ap_info) );
112*10465441SEvalZero 
113*10465441SEvalZero                 //dump
114*10465441SEvalZero                 if(1)
115*10465441SEvalZero                 {
116*10465441SEvalZero #ifdef WIFI_DEBUG_ON
117*10465441SEvalZero                     rw009_ap_info *ap_info = &resp->resp.ap_info;
118*10465441SEvalZero                     WIFI_DEBUG("SCAN SSID:%-32.32s\n", ap_info->ssid);
119*10465441SEvalZero                     WIFI_DEBUG("SCAN BSSID:%02X-%02X-%02X-%02X-%02X-%02X\n",
120*10465441SEvalZero                                ap_info->bssid[0],
121*10465441SEvalZero                                ap_info->bssid[1],
122*10465441SEvalZero                                ap_info->bssid[2],
123*10465441SEvalZero                                ap_info->bssid[3],
124*10465441SEvalZero                                ap_info->bssid[4],
125*10465441SEvalZero                                ap_info->bssid[5]);
126*10465441SEvalZero                     WIFI_DEBUG("SCAN rssi:%ddBm\n", ap_info->rssi);
127*10465441SEvalZero                     WIFI_DEBUG("SCAN rate:%dMbps\n", ap_info->max_data_rate/1000);
128*10465441SEvalZero                     WIFI_DEBUG("SCAN channel:%d\n", ap_info->channel);
129*10465441SEvalZero                     WIFI_DEBUG("SCAN security:%08X\n\n", ap_info->security);
130*10465441SEvalZero #endif /* WIFI_DEBUG_ON */
131*10465441SEvalZero                 }
132*10465441SEvalZero 
133*10465441SEvalZero                 wifi_device->ap_scan_count++;
134*10465441SEvalZero                 wifi_device->ap_scan = ap_scan;
135*10465441SEvalZero             }
136*10465441SEvalZero 
137*10465441SEvalZero             return; /* wait for next ap */
138*10465441SEvalZero         }
139*10465441SEvalZero         break;
140*10465441SEvalZero     case RW009_CMD_JOIN:
141*10465441SEvalZero     case RW009_CMD_EASY_JOIN:
142*10465441SEvalZero         WIFI_DEBUG("resp_handler RW009_CMD_EASY_JOIN\n");
143*10465441SEvalZero         resp_return = (struct rw009_resp *)rt_malloc(member_offset(struct rw009_resp, resp) + sizeof(rw009_resp_join)); //TODO:
144*10465441SEvalZero         if(resp_return == RT_NULL) break;
145*10465441SEvalZero         memcpy(resp_return, resp, member_offset(struct rw009_resp, resp) + sizeof(rw009_resp_join));
146*10465441SEvalZero 
147*10465441SEvalZero         if( resp->result == 0 )
148*10465441SEvalZero         {
149*10465441SEvalZero             memcpy(&wifi_device->ap_info, &resp_return->resp.ap_info, sizeof(rw009_resp_join));
150*10465441SEvalZero             wifi_device->active = 1;
151*10465441SEvalZero             eth_device_linkchange(&wifi_device->parent, RT_TRUE);
152*10465441SEvalZero         }
153*10465441SEvalZero         else
154*10465441SEvalZero         {
155*10465441SEvalZero             wifi_device->active = 1;
156*10465441SEvalZero             eth_device_linkchange(&wifi_device->parent, RT_FALSE);
157*10465441SEvalZero             WIFI_DEBUG("RW009_CMD_EASY_JOIN result: %d\n", resp->result );
158*10465441SEvalZero         }
159*10465441SEvalZero 
160*10465441SEvalZero         //dupm
161*10465441SEvalZero         if(1)
162*10465441SEvalZero         {
163*10465441SEvalZero #ifdef WIFI_DEBUG_ON
164*10465441SEvalZero             rw009_ap_info *ap_info = &resp->resp.ap_info;
165*10465441SEvalZero             WIFI_DEBUG("JOIN SSID:%-32.32s\n", ap_info->ssid);
166*10465441SEvalZero             WIFI_DEBUG("JOIN BSSID:%02X-%02X-%02X-%02X-%02X-%02X\n",
167*10465441SEvalZero                        ap_info->bssid[0],
168*10465441SEvalZero                        ap_info->bssid[1],
169*10465441SEvalZero                        ap_info->bssid[2],
170*10465441SEvalZero                        ap_info->bssid[3],
171*10465441SEvalZero                        ap_info->bssid[4],
172*10465441SEvalZero                        ap_info->bssid[5]);
173*10465441SEvalZero             WIFI_DEBUG("JOIN rssi:%ddBm\n", ap_info->rssi);
174*10465441SEvalZero             WIFI_DEBUG("JOIN rate:%dMbps\n", ap_info->max_data_rate/1000);
175*10465441SEvalZero             WIFI_DEBUG("JOIN channel:%d\n", ap_info->channel);
176*10465441SEvalZero             WIFI_DEBUG("JOIN security:%08X\n\n", ap_info->security);
177*10465441SEvalZero #endif /* WIFI_DEBUG_ON */
178*10465441SEvalZero         }
179*10465441SEvalZero         break;
180*10465441SEvalZero 
181*10465441SEvalZero     case RW009_CMD_RSSI:
182*10465441SEvalZero         // TODO: client RSSI.
183*10465441SEvalZero     {
184*10465441SEvalZero         rw009_ap_info *ap_info = &resp->resp.ap_info;
185*10465441SEvalZero         wifi_device->ap_info.rssi = ap_info->rssi;
186*10465441SEvalZero         WIFI_DEBUG("current RSSI: %d\n", wifi_device->ap_info.rssi);
187*10465441SEvalZero     }
188*10465441SEvalZero     break;
189*10465441SEvalZero 
190*10465441SEvalZero     case RW009_CMD_SOFTAP:
191*10465441SEvalZero     {
192*10465441SEvalZero         if( resp->result == 0 )
193*10465441SEvalZero         {
194*10465441SEvalZero             ;
195*10465441SEvalZero             wifi_device->active = 1;
196*10465441SEvalZero             eth_device_linkchange(&wifi_device->parent, RT_TRUE);
197*10465441SEvalZero         }
198*10465441SEvalZero         else
199*10465441SEvalZero         {
200*10465441SEvalZero             WIFI_DEBUG("RW009_CMD_EASY_JOIN result: %d\n", resp->result );
201*10465441SEvalZero         }
202*10465441SEvalZero 
203*10465441SEvalZero     }
204*10465441SEvalZero     break;
205*10465441SEvalZero 
206*10465441SEvalZero     default:
207*10465441SEvalZero         WIFI_DEBUG("resp_handler %d\n", resp->cmd);
208*10465441SEvalZero         break;
209*10465441SEvalZero     }
210*10465441SEvalZero 
211*10465441SEvalZero 
212*10465441SEvalZero     if(resp->cmd == wifi_device->last_cmd)
213*10465441SEvalZero     {
214*10465441SEvalZero         rt_mb_send(&wifi_device->rw009_cmd_mb, (rt_uint32_t)resp_return);
215*10465441SEvalZero         return;
216*10465441SEvalZero     }
217*10465441SEvalZero     else
218*10465441SEvalZero     {
219*10465441SEvalZero         rt_free(resp_return);
220*10465441SEvalZero     }
221*10465441SEvalZero }
222*10465441SEvalZero 
rw009_cmd(struct rw009_wifi * wifi_device,uint32_t cmd,void * args)223*10465441SEvalZero static rt_err_t rw009_cmd(struct rw009_wifi *wifi_device, uint32_t cmd, void *args)
224*10465441SEvalZero {
225*10465441SEvalZero     rt_err_t result = RT_EOK;
226*10465441SEvalZero     rt_int32_t timeout = RW009_CMD_TIMEOUT;
227*10465441SEvalZero 
228*10465441SEvalZero     struct spi_data_packet *data_packet;
229*10465441SEvalZero     struct rw009_cmd *wifi_cmd = RT_NULL;
230*10465441SEvalZero     struct rw009_resp *resp = RT_NULL;
231*10465441SEvalZero 
232*10465441SEvalZero     wifi_device->last_cmd = cmd;
233*10465441SEvalZero 
234*10465441SEvalZero     data_packet = (struct spi_data_packet *)rt_mp_alloc(&wifi_device->spi_tx_mp, RT_WAITING_FOREVER);
235*10465441SEvalZero     wifi_cmd = (struct rw009_cmd *)data_packet->buffer;
236*10465441SEvalZero 
237*10465441SEvalZero     wifi_cmd->cmd = cmd;
238*10465441SEvalZero     wifi_cmd->len = 0;
239*10465441SEvalZero 
240*10465441SEvalZero     if( cmd == RW009_CMD_INIT )
241*10465441SEvalZero     {
242*10465441SEvalZero         wifi_cmd->len = sizeof(rw009_cmd_init);
243*10465441SEvalZero     }
244*10465441SEvalZero     else if( cmd == RW009_CMD_SCAN )
245*10465441SEvalZero     {
246*10465441SEvalZero         wifi_cmd->len = 0;
247*10465441SEvalZero         timeout += RT_TICK_PER_SECOND*10;
248*10465441SEvalZero 
249*10465441SEvalZero         if(wifi_device->ap_scan)
250*10465441SEvalZero         {
251*10465441SEvalZero             rt_free(wifi_device->ap_scan);
252*10465441SEvalZero             wifi_device->ap_scan = RT_NULL;
253*10465441SEvalZero             wifi_device->ap_scan_count = 0;
254*10465441SEvalZero         }
255*10465441SEvalZero     }
256*10465441SEvalZero     else if( cmd == RW009_CMD_JOIN )
257*10465441SEvalZero     {
258*10465441SEvalZero         wifi_cmd->len = sizeof(rw009_cmd_join);
259*10465441SEvalZero     }
260*10465441SEvalZero     else if( cmd == RW009_CMD_EASY_JOIN )
261*10465441SEvalZero     {
262*10465441SEvalZero         wifi_cmd->len = sizeof(rw009_cmd_easy_join);
263*10465441SEvalZero         timeout += RT_TICK_PER_SECOND*5;
264*10465441SEvalZero     }
265*10465441SEvalZero     else if( cmd == RW009_CMD_RSSI )
266*10465441SEvalZero     {
267*10465441SEvalZero         wifi_cmd->len = sizeof(rw009_cmd_rssi);
268*10465441SEvalZero     }
269*10465441SEvalZero     else if( cmd == RW009_CMD_SOFTAP )
270*10465441SEvalZero     {
271*10465441SEvalZero         wifi_cmd->len = sizeof(rw009_cmd_softap);
272*10465441SEvalZero     }
273*10465441SEvalZero     else
274*10465441SEvalZero     {
275*10465441SEvalZero         WIFI_DEBUG("unkown RW009 CMD %d\n", cmd);
276*10465441SEvalZero         result = -RT_ENOSYS;
277*10465441SEvalZero         rt_mp_free(data_packet);
278*10465441SEvalZero         data_packet = RT_NULL;
279*10465441SEvalZero     }
280*10465441SEvalZero 
281*10465441SEvalZero     if(data_packet == RT_NULL)
282*10465441SEvalZero     {
283*10465441SEvalZero         goto _exit;
284*10465441SEvalZero     }
285*10465441SEvalZero 
286*10465441SEvalZero     if(wifi_cmd->len)
287*10465441SEvalZero         memcpy(&wifi_cmd->params, args, wifi_cmd->len);
288*10465441SEvalZero 
289*10465441SEvalZero     data_packet->data_type = data_type_cmd;
290*10465441SEvalZero     data_packet->data_len = member_offset(struct rw009_cmd, params) + wifi_cmd->len;
291*10465441SEvalZero 
292*10465441SEvalZero     rt_mb_send(&wifi_device->spi_tx_mb, (rt_uint32_t)data_packet);
293*10465441SEvalZero     rt_event_send(&spi_wifi_data_event, 1);
294*10465441SEvalZero 
295*10465441SEvalZero     result = rt_mb_recv(&wifi_device->rw009_cmd_mb,
296*10465441SEvalZero                         (rt_uint32_t *)&resp,
297*10465441SEvalZero                         timeout);
298*10465441SEvalZero 
299*10465441SEvalZero     if ( result != RT_EOK )
300*10465441SEvalZero     {
301*10465441SEvalZero         WIFI_DEBUG("CMD %d error, resultL %d\n", cmd, result );
302*10465441SEvalZero     }
303*10465441SEvalZero 
304*10465441SEvalZero     if(resp != RT_NULL)
305*10465441SEvalZero         result = resp->result;
306*10465441SEvalZero 
307*10465441SEvalZero _exit:
308*10465441SEvalZero     wifi_device->last_cmd = 0;
309*10465441SEvalZero     if(resp) rt_free(resp);
310*10465441SEvalZero     return result;
311*10465441SEvalZero }
312*10465441SEvalZero 
spi_wifi_transfer(struct rw009_wifi * dev)313*10465441SEvalZero static rt_err_t spi_wifi_transfer(struct rw009_wifi *dev)
314*10465441SEvalZero {
315*10465441SEvalZero     struct pbuf *p = RT_NULL;
316*10465441SEvalZero     struct spi_cmd_request cmd;
317*10465441SEvalZero     struct spi_response resp;
318*10465441SEvalZero 
319*10465441SEvalZero     rt_err_t result;
320*10465441SEvalZero     const struct spi_data_packet *data_packet = RT_NULL;
321*10465441SEvalZero 
322*10465441SEvalZero     struct rw009_wifi *wifi_device = (struct rw009_wifi *)dev;
323*10465441SEvalZero     struct rt_spi_device *rt_spi_device = wifi_device->rt_spi_device;
324*10465441SEvalZero 
325*10465441SEvalZero     spi_wifi_int_cmd(0);
326*10465441SEvalZero     while (spi_wifi_is_busy());
327*10465441SEvalZero     SPI_DEBUG("sequence start!\n");
328*10465441SEvalZero 
329*10465441SEvalZero     memset(&cmd, 0, sizeof(struct spi_cmd_request));
330*10465441SEvalZero     cmd.magic1 = CMD_MAGIC1;
331*10465441SEvalZero     cmd.magic2 = CMD_MAGIC2;
332*10465441SEvalZero 
333*10465441SEvalZero     cmd.flag |= CMD_FLAG_MRDY;
334*10465441SEvalZero 
335*10465441SEvalZero     result = rt_mb_recv(&wifi_device->spi_tx_mb,
336*10465441SEvalZero                         (rt_uint32_t *)&data_packet,
337*10465441SEvalZero                         0);
338*10465441SEvalZero     if ((result == RT_EOK) && (data_packet != RT_NULL) && (data_packet->data_len > 0))
339*10465441SEvalZero     {
340*10465441SEvalZero         cmd.M2S_len = data_packet->data_len + member_offset(struct spi_data_packet, buffer);
341*10465441SEvalZero         //SPI_DEBUG("cmd.M2S_len = %d\n", cmd.M2S_len);
342*10465441SEvalZero     }
343*10465441SEvalZero 
344*10465441SEvalZero     rt_spi_send(rt_spi_device, &cmd, sizeof(cmd));
345*10465441SEvalZero     while (spi_wifi_is_busy());
346*10465441SEvalZero 
347*10465441SEvalZero     {
348*10465441SEvalZero         struct rt_spi_message message;
349*10465441SEvalZero         uint32_t max_data_len = 0;
350*10465441SEvalZero 
351*10465441SEvalZero         /* setup message */
352*10465441SEvalZero         message.send_buf = RT_NULL;
353*10465441SEvalZero         message.recv_buf = &resp;
354*10465441SEvalZero         message.length = sizeof(resp);
355*10465441SEvalZero         message.cs_take = 1;
356*10465441SEvalZero         message.cs_release = 0;
357*10465441SEvalZero 
358*10465441SEvalZero         rt_spi_take_bus(rt_spi_device);
359*10465441SEvalZero 
360*10465441SEvalZero         /* transfer message */
361*10465441SEvalZero         rt_spi_device->bus->ops->xfer(rt_spi_device, &message);
362*10465441SEvalZero 
363*10465441SEvalZero         if ((resp.magic1 != RESP_MAGIC1) || (resp.magic2 != RESP_MAGIC2))
364*10465441SEvalZero         {
365*10465441SEvalZero             SPI_DEBUG("bad resp magic, abort!\n");
366*10465441SEvalZero             goto _bad_resp_magic;
367*10465441SEvalZero         }
368*10465441SEvalZero 
369*10465441SEvalZero         if (resp.flag & RESP_FLAG_SRDY)
370*10465441SEvalZero         {
371*10465441SEvalZero             SPI_DEBUG("RESP_FLAG_SRDY\n");
372*10465441SEvalZero             max_data_len = cmd.M2S_len;
373*10465441SEvalZero         }
374*10465441SEvalZero 
375*10465441SEvalZero         if (resp.S2M_len)
376*10465441SEvalZero         {
377*10465441SEvalZero             SPI_DEBUG("resp.S2M_len: %d\n", resp.S2M_len);
378*10465441SEvalZero             if (resp.S2M_len > MAX_SPI_PACKET_SIZE)
379*10465441SEvalZero             {
380*10465441SEvalZero                 SPI_DEBUG("resp.S2M_len %d > %d(MAX_SPI_PACKET_SIZE), drop!\n", resp.S2M_len, MAX_SPI_PACKET_SIZE);
381*10465441SEvalZero                 resp.S2M_len = 0;//drop
382*10465441SEvalZero             }
383*10465441SEvalZero 
384*10465441SEvalZero             if (resp.S2M_len > max_data_len)
385*10465441SEvalZero                 max_data_len = resp.S2M_len;
386*10465441SEvalZero         }
387*10465441SEvalZero 
388*10465441SEvalZero         if (max_data_len == 0)
389*10465441SEvalZero         {
390*10465441SEvalZero             SPI_DEBUG("no rx or tx data!\n");
391*10465441SEvalZero         }
392*10465441SEvalZero 
393*10465441SEvalZero         //SPI_DEBUG("max_data_len = %d\n", max_data_len);
394*10465441SEvalZero 
395*10465441SEvalZero _bad_resp_magic:
396*10465441SEvalZero         /* setup message */
397*10465441SEvalZero         message.send_buf = data_packet;//&tx_buffer;
398*10465441SEvalZero         message.recv_buf = wifi_device->spi_hw_rx_buffer;//&rx_buffer;
399*10465441SEvalZero         message.length = max_data_len;
400*10465441SEvalZero         message.cs_take = 0;
401*10465441SEvalZero         message.cs_release = 1;
402*10465441SEvalZero 
403*10465441SEvalZero         /* transfer message */
404*10465441SEvalZero         rt_spi_device->bus->ops->xfer(rt_spi_device, &message);
405*10465441SEvalZero 
406*10465441SEvalZero         rt_spi_release_bus(rt_spi_device);
407*10465441SEvalZero 
408*10465441SEvalZero         if (cmd.M2S_len && (resp.flag & RESP_FLAG_SRDY))
409*10465441SEvalZero         {
410*10465441SEvalZero             rt_mp_free((void *)data_packet);
411*10465441SEvalZero         }
412*10465441SEvalZero 
413*10465441SEvalZero         if ((resp.S2M_len) && (resp.S2M_len <= MAX_SPI_PACKET_SIZE))
414*10465441SEvalZero         {
415*10465441SEvalZero             data_packet = (struct spi_data_packet *)wifi_device->spi_hw_rx_buffer;
416*10465441SEvalZero             if (data_packet->data_type == data_type_eth_data)
417*10465441SEvalZero             {
418*10465441SEvalZero 
419*10465441SEvalZero                 if (wifi_device->active)
420*10465441SEvalZero                 {
421*10465441SEvalZero                     p = pbuf_alloc(PBUF_LINK, data_packet->data_len, PBUF_RAM);
422*10465441SEvalZero                     pbuf_take(p, (rt_uint8_t *)data_packet->buffer, data_packet->data_len);
423*10465441SEvalZero 
424*10465441SEvalZero                     rt_mb_send(&wifi_device->eth_rx_mb, (rt_uint32_t)p);
425*10465441SEvalZero                     eth_device_ready((struct eth_device *)dev);
426*10465441SEvalZero                 }
427*10465441SEvalZero                 else
428*10465441SEvalZero                 {
429*10465441SEvalZero                     SPI_DEBUG("!active, RX drop.\n");
430*10465441SEvalZero                 }
431*10465441SEvalZero             }
432*10465441SEvalZero             else if (data_packet->data_type == data_type_resp)
433*10465441SEvalZero             {
434*10465441SEvalZero                 SPI_DEBUG("data_type_resp\n");
435*10465441SEvalZero                 resp_handler(dev, (struct rw009_resp *)data_packet->buffer);
436*10465441SEvalZero             }
437*10465441SEvalZero             else
438*10465441SEvalZero             {
439*10465441SEvalZero                 SPI_DEBUG("data_type: %d, %dbyte\n",
440*10465441SEvalZero                           data_packet->data_type,
441*10465441SEvalZero                           data_packet->data_len);
442*10465441SEvalZero             }
443*10465441SEvalZero         }
444*10465441SEvalZero     }
445*10465441SEvalZero     spi_wifi_int_cmd(1);
446*10465441SEvalZero 
447*10465441SEvalZero     SPI_DEBUG("sequence finish!\n\n");
448*10465441SEvalZero 
449*10465441SEvalZero     if ((cmd.M2S_len == 0) && (resp.S2M_len == 0))
450*10465441SEvalZero     {
451*10465441SEvalZero         return -RT_ERROR;
452*10465441SEvalZero     }
453*10465441SEvalZero 
454*10465441SEvalZero     return RT_EOK;
455*10465441SEvalZero }
456*10465441SEvalZero 
457*10465441SEvalZero #if defined(ETH_RX_DUMP) ||  defined(ETH_TX_DUMP)
packet_dump(const char * msg,const struct pbuf * p)458*10465441SEvalZero static void packet_dump(const char *msg, const struct pbuf *p)
459*10465441SEvalZero {
460*10465441SEvalZero     const struct pbuf* q;
461*10465441SEvalZero     rt_uint32_t i,j;
462*10465441SEvalZero     rt_uint8_t *ptr = p->payload;
463*10465441SEvalZero 
464*10465441SEvalZero     rt_kprintf("%s %d byte\n", msg, p->tot_len);
465*10465441SEvalZero 
466*10465441SEvalZero     i=0;
467*10465441SEvalZero     for(q=p; q != RT_NULL; q= q->next)
468*10465441SEvalZero     {
469*10465441SEvalZero         ptr = q->payload;
470*10465441SEvalZero 
471*10465441SEvalZero         for(j=0; j<q->len; j++)
472*10465441SEvalZero         {
473*10465441SEvalZero             if( (i%8) == 0 )
474*10465441SEvalZero             {
475*10465441SEvalZero                 rt_kprintf("  ");
476*10465441SEvalZero             }
477*10465441SEvalZero             if( (i%16) == 0 )
478*10465441SEvalZero             {
479*10465441SEvalZero                 rt_kprintf("\r\n");
480*10465441SEvalZero             }
481*10465441SEvalZero             rt_kprintf("%02x ",*ptr);
482*10465441SEvalZero 
483*10465441SEvalZero             i++;
484*10465441SEvalZero             ptr++;
485*10465441SEvalZero         }
486*10465441SEvalZero     }
487*10465441SEvalZero     rt_kprintf("\n\n");
488*10465441SEvalZero }
489*10465441SEvalZero #endif /* dump */
490*10465441SEvalZero 
491*10465441SEvalZero /********************************* RT-Thread Ethernet interface begin **************************************/
rw009_wifi_init(rt_device_t dev)492*10465441SEvalZero static rt_err_t rw009_wifi_init(rt_device_t dev)
493*10465441SEvalZero {
494*10465441SEvalZero     return RT_EOK;
495*10465441SEvalZero }
496*10465441SEvalZero 
rw009_wifi_open(rt_device_t dev,rt_uint16_t oflag)497*10465441SEvalZero static rt_err_t rw009_wifi_open(rt_device_t dev, rt_uint16_t oflag)
498*10465441SEvalZero {
499*10465441SEvalZero     return RT_EOK;
500*10465441SEvalZero }
501*10465441SEvalZero 
rw009_wifi_close(rt_device_t dev)502*10465441SEvalZero static rt_err_t rw009_wifi_close(rt_device_t dev)
503*10465441SEvalZero {
504*10465441SEvalZero     return RT_EOK;
505*10465441SEvalZero }
506*10465441SEvalZero 
rw009_wifi_read(rt_device_t dev,rt_off_t pos,void * buffer,rt_size_t size)507*10465441SEvalZero static rt_size_t rw009_wifi_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
508*10465441SEvalZero {
509*10465441SEvalZero     rt_set_errno(-RT_ENOSYS);
510*10465441SEvalZero     return 0;
511*10465441SEvalZero }
512*10465441SEvalZero 
rw009_wifi_write(rt_device_t dev,rt_off_t pos,const void * buffer,rt_size_t size)513*10465441SEvalZero static rt_size_t rw009_wifi_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
514*10465441SEvalZero {
515*10465441SEvalZero     rt_set_errno(-RT_ENOSYS);
516*10465441SEvalZero     return 0;
517*10465441SEvalZero }
518*10465441SEvalZero 
rw009_wifi_control(rt_device_t dev,int cmd,void * args)519*10465441SEvalZero static rt_err_t rw009_wifi_control(rt_device_t dev, int cmd, void *args)
520*10465441SEvalZero {
521*10465441SEvalZero     struct rw009_wifi *wifi_device = (struct rw009_wifi *)dev;
522*10465441SEvalZero     rt_err_t result = RT_EOK;
523*10465441SEvalZero 
524*10465441SEvalZero     if (cmd == NIOCTL_GADDR)
525*10465441SEvalZero     {
526*10465441SEvalZero         memcpy(args, wifi_device->dev_addr, 6);
527*10465441SEvalZero     }
528*10465441SEvalZero     else
529*10465441SEvalZero     {
530*10465441SEvalZero         result = rw009_cmd(wifi_device, cmd, args);
531*10465441SEvalZero     }
532*10465441SEvalZero 
533*10465441SEvalZero     return result;
534*10465441SEvalZero }
535*10465441SEvalZero 
536*10465441SEvalZero /* transmit packet. */
rw009_wifi_tx(rt_device_t dev,struct pbuf * p)537*10465441SEvalZero rt_err_t rw009_wifi_tx(rt_device_t dev, struct pbuf *p)
538*10465441SEvalZero {
539*10465441SEvalZero     rt_err_t result = RT_EOK;
540*10465441SEvalZero     struct spi_data_packet *data_packet;
541*10465441SEvalZero     struct rw009_wifi *wifi_device = (struct rw009_wifi *)dev;
542*10465441SEvalZero 
543*10465441SEvalZero     if (!wifi_device->active)
544*10465441SEvalZero     {
545*10465441SEvalZero         WIFI_DEBUG("!active, TX drop!\n");
546*10465441SEvalZero         return RT_EOK;
547*10465441SEvalZero     }
548*10465441SEvalZero 
549*10465441SEvalZero     /* get free tx buffer */
550*10465441SEvalZero     data_packet = (struct spi_data_packet *)rt_mp_alloc(&wifi_device->spi_tx_mp, RT_WAITING_FOREVER);
551*10465441SEvalZero     if (data_packet != RT_NULL)
552*10465441SEvalZero     {
553*10465441SEvalZero         data_packet->data_type = data_type_eth_data;
554*10465441SEvalZero         data_packet->data_len = p->tot_len;
555*10465441SEvalZero 
556*10465441SEvalZero         pbuf_copy_partial(p, data_packet->buffer, data_packet->data_len, 0);
557*10465441SEvalZero 
558*10465441SEvalZero         rt_mb_send(&wifi_device->spi_tx_mb, (rt_uint32_t)data_packet);
559*10465441SEvalZero         rt_event_send(&spi_wifi_data_event, 1);
560*10465441SEvalZero     }
561*10465441SEvalZero     else
562*10465441SEvalZero         return -RT_ERROR;
563*10465441SEvalZero 
564*10465441SEvalZero #ifdef ETH_TX_DUMP
565*10465441SEvalZero     packet_dump("TX dump", p);
566*10465441SEvalZero #endif /* ETH_TX_DUMP */
567*10465441SEvalZero 
568*10465441SEvalZero     /* Return SUCCESS */
569*10465441SEvalZero     return result;
570*10465441SEvalZero }
571*10465441SEvalZero 
572*10465441SEvalZero /* reception packet. */
rw009_wifi_rx(rt_device_t dev)573*10465441SEvalZero struct pbuf *rw009_wifi_rx(rt_device_t dev)
574*10465441SEvalZero {
575*10465441SEvalZero     struct pbuf *p = RT_NULL;
576*10465441SEvalZero     struct rw009_wifi *wifi_device = (struct rw009_wifi *)dev;
577*10465441SEvalZero 
578*10465441SEvalZero     if (rt_mb_recv(&wifi_device->eth_rx_mb, (rt_uint32_t *)&p, 0) != RT_EOK)
579*10465441SEvalZero     {
580*10465441SEvalZero         return RT_NULL;
581*10465441SEvalZero     }
582*10465441SEvalZero 
583*10465441SEvalZero #ifdef ETH_RX_DUMP
584*10465441SEvalZero     if(p)
585*10465441SEvalZero         packet_dump("RX dump", p);
586*10465441SEvalZero #endif /* ETH_RX_DUMP */
587*10465441SEvalZero 
588*10465441SEvalZero     return p;
589*10465441SEvalZero }
590*10465441SEvalZero /********************************* RT-Thread Ethernet interface end **************************************/
591*10465441SEvalZero 
spi_wifi_data_thread_entry(void * parameter)592*10465441SEvalZero static void spi_wifi_data_thread_entry(void *parameter)
593*10465441SEvalZero {
594*10465441SEvalZero     rt_uint32_t e;
595*10465441SEvalZero     rt_err_t result;
596*10465441SEvalZero 
597*10465441SEvalZero     while (1)
598*10465441SEvalZero     {
599*10465441SEvalZero         /* receive first event */
600*10465441SEvalZero         if (rt_event_recv(&spi_wifi_data_event,
601*10465441SEvalZero                           1,
602*10465441SEvalZero                           RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
603*10465441SEvalZero                           RT_WAITING_FOREVER,
604*10465441SEvalZero                           &e) != RT_EOK)
605*10465441SEvalZero         {
606*10465441SEvalZero             continue;
607*10465441SEvalZero         }
608*10465441SEvalZero 
609*10465441SEvalZero         result = spi_wifi_transfer(&rw009_wifi_device);
610*10465441SEvalZero 
611*10465441SEvalZero         if (result == RT_EOK)
612*10465441SEvalZero         {
613*10465441SEvalZero             rt_event_send(&spi_wifi_data_event, 1);
614*10465441SEvalZero         }
615*10465441SEvalZero     }
616*10465441SEvalZero }
617*10465441SEvalZero 
618*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
619*10465441SEvalZero const static struct rt_device_ops rw009_ops =
620*10465441SEvalZero {
621*10465441SEvalZero     rw009_wifi_init,
622*10465441SEvalZero     rw009_wifi_open,
623*10465441SEvalZero     rw009_wifi_close,
624*10465441SEvalZero     rw009_wifi_read,
625*10465441SEvalZero     rw009_wifi_write,
626*10465441SEvalZero     rw009_wifi_control
627*10465441SEvalZero };
628*10465441SEvalZero #endif
629*10465441SEvalZero 
rt_hw_wifi_init(const char * spi_device_name,wifi_mode_t mode)630*10465441SEvalZero rt_err_t rt_hw_wifi_init(const char *spi_device_name, wifi_mode_t mode)
631*10465441SEvalZero {
632*10465441SEvalZero     /* align and struct size check. */
633*10465441SEvalZero     RT_ASSERT( (SPI_MAX_DATA_LEN & 0x03) == 0);
634*10465441SEvalZero     RT_ASSERT( sizeof(struct rw009_resp) <= SPI_MAX_DATA_LEN);
635*10465441SEvalZero 
636*10465441SEvalZero     memset(&rw009_wifi_device, 0, sizeof(struct rw009_wifi));
637*10465441SEvalZero 
638*10465441SEvalZero     rw009_wifi_device.rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name);
639*10465441SEvalZero 
640*10465441SEvalZero     if (rw009_wifi_device.rt_spi_device == RT_NULL)
641*10465441SEvalZero     {
642*10465441SEvalZero         SPI_DEBUG("spi device %s not found!\r\n", spi_device_name);
643*10465441SEvalZero         return -RT_ENOSYS;
644*10465441SEvalZero     }
645*10465441SEvalZero 
646*10465441SEvalZero     /* config spi */
647*10465441SEvalZero     {
648*10465441SEvalZero         struct rt_spi_configuration cfg;
649*10465441SEvalZero         cfg.data_width = 8;
650*10465441SEvalZero         cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0. */
651*10465441SEvalZero         cfg.max_hz = 15 * 1000000; /* 10M */
652*10465441SEvalZero         rt_spi_configure(rw009_wifi_device.rt_spi_device, &cfg);
653*10465441SEvalZero     }
654*10465441SEvalZero 
655*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
656*10465441SEvalZero     rw009_wifi_device.parent.parent.ops        = &rw009_ops;
657*10465441SEvalZero #else
658*10465441SEvalZero     rw009_wifi_device.parent.parent.init       = rw009_wifi_init;
659*10465441SEvalZero     rw009_wifi_device.parent.parent.open       = rw009_wifi_open;
660*10465441SEvalZero     rw009_wifi_device.parent.parent.close      = rw009_wifi_close;
661*10465441SEvalZero     rw009_wifi_device.parent.parent.read       = rw009_wifi_read;
662*10465441SEvalZero     rw009_wifi_device.parent.parent.write      = rw009_wifi_write;
663*10465441SEvalZero     rw009_wifi_device.parent.parent.control    = rw009_wifi_control;
664*10465441SEvalZero #endif
665*10465441SEvalZero     rw009_wifi_device.parent.parent.user_data  = RT_NULL;
666*10465441SEvalZero 
667*10465441SEvalZero     rw009_wifi_device.parent.eth_rx     = rw009_wifi_rx;
668*10465441SEvalZero     rw009_wifi_device.parent.eth_tx     = rw009_wifi_tx;
669*10465441SEvalZero 
670*10465441SEvalZero     rt_mp_init(&rw009_wifi_device.spi_tx_mp,
671*10465441SEvalZero                "spi_tx",
672*10465441SEvalZero                &rw009_wifi_device.spi_tx_mempool[0],
673*10465441SEvalZero                sizeof(rw009_wifi_device.spi_tx_mempool),
674*10465441SEvalZero                sizeof(struct spi_data_packet));
675*10465441SEvalZero 
676*10465441SEvalZero     rt_mp_init(&rw009_wifi_device.spi_rx_mp,
677*10465441SEvalZero                "spi_rx",
678*10465441SEvalZero                &rw009_wifi_device.spi_rx_mempool[0],
679*10465441SEvalZero                sizeof(rw009_wifi_device.spi_rx_mempool),
680*10465441SEvalZero                sizeof(struct spi_data_packet));
681*10465441SEvalZero 
682*10465441SEvalZero     rt_mb_init(&rw009_wifi_device.spi_tx_mb,
683*10465441SEvalZero                "spi_tx",
684*10465441SEvalZero                &rw009_wifi_device.spi_tx_mb_pool[0],
685*10465441SEvalZero                SPI_TX_POOL_SIZE,
686*10465441SEvalZero                RT_IPC_FLAG_PRIO);
687*10465441SEvalZero 
688*10465441SEvalZero     rt_mb_init(&rw009_wifi_device.eth_rx_mb,
689*10465441SEvalZero                "eth_rx",
690*10465441SEvalZero                &rw009_wifi_device.eth_rx_mb_pool[0],
691*10465441SEvalZero                SPI_TX_POOL_SIZE,
692*10465441SEvalZero                RT_IPC_FLAG_PRIO);
693*10465441SEvalZero 
694*10465441SEvalZero     rt_mb_init(&rw009_wifi_device.rw009_cmd_mb,
695*10465441SEvalZero                "wifi_cmd",
696*10465441SEvalZero                &rw009_wifi_device.rw009_cmd_mb_pool[0],
697*10465441SEvalZero                sizeof(rw009_wifi_device.rw009_cmd_mb_pool) / 4,
698*10465441SEvalZero                RT_IPC_FLAG_PRIO);
699*10465441SEvalZero     rt_event_init(&spi_wifi_data_event, "wifi", RT_IPC_FLAG_FIFO);
700*10465441SEvalZero 
701*10465441SEvalZero     spi_wifi_hw_init();
702*10465441SEvalZero 
703*10465441SEvalZero     {
704*10465441SEvalZero         rt_thread_t tid;
705*10465441SEvalZero 
706*10465441SEvalZero 
707*10465441SEvalZero         tid = rt_thread_create("wifi",
708*10465441SEvalZero                                spi_wifi_data_thread_entry,
709*10465441SEvalZero                                RT_NULL,
710*10465441SEvalZero                                2048,
711*10465441SEvalZero                                RT_THREAD_PRIORITY_MAX - 2,
712*10465441SEvalZero                                20);
713*10465441SEvalZero 
714*10465441SEvalZero         if (tid != RT_NULL)
715*10465441SEvalZero             rt_thread_startup(tid);
716*10465441SEvalZero     }
717*10465441SEvalZero 
718*10465441SEvalZero     /* init: get mac address */
719*10465441SEvalZero     {
720*10465441SEvalZero         rw009_cmd_init init;
721*10465441SEvalZero         init.mode = mode;
722*10465441SEvalZero         WIFI_DEBUG("wifi_control RW009_CMD_INIT\n");
723*10465441SEvalZero         rw009_wifi_control((rt_device_t)&rw009_wifi_device,
724*10465441SEvalZero                            RW009_CMD_INIT,
725*10465441SEvalZero                            (void *)&init); // 0: firmware, 1: STA, 2:AP
726*10465441SEvalZero 
727*10465441SEvalZero     }
728*10465441SEvalZero 
729*10465441SEvalZero     /* register eth device */
730*10465441SEvalZero     eth_device_init(&(rw009_wifi_device.parent), "w0");
731*10465441SEvalZero     eth_device_linkchange(&rw009_wifi_device.parent, RT_FALSE);
732*10465441SEvalZero 
733*10465441SEvalZero     return RT_EOK;
734*10465441SEvalZero }
735*10465441SEvalZero 
spi_wifi_isr(int vector)736*10465441SEvalZero void spi_wifi_isr(int vector)
737*10465441SEvalZero {
738*10465441SEvalZero     /* enter interrupt */
739*10465441SEvalZero     rt_interrupt_enter();
740*10465441SEvalZero 
741*10465441SEvalZero     SPI_DEBUG("spi_wifi_isr\n");
742*10465441SEvalZero     rt_event_send(&spi_wifi_data_event, 1);
743*10465441SEvalZero 
744*10465441SEvalZero     /* leave interrupt */
745*10465441SEvalZero     rt_interrupt_leave();
746*10465441SEvalZero }
747*10465441SEvalZero 
748*10465441SEvalZero /********************************* RW009 tools **************************************/
rw009_join(const char * SSID,const char * passwd)749*10465441SEvalZero rt_err_t rw009_join(const char * SSID, const char * passwd)
750*10465441SEvalZero {
751*10465441SEvalZero     rt_err_t result;
752*10465441SEvalZero     rt_device_t wifi_device;
753*10465441SEvalZero     rw009_cmd_easy_join easy_join;
754*10465441SEvalZero 
755*10465441SEvalZero     wifi_device = rt_device_find("w0");
756*10465441SEvalZero     if(wifi_device == RT_NULL)
757*10465441SEvalZero         return -RT_ENOSYS;
758*10465441SEvalZero 
759*10465441SEvalZero     strncpy( easy_join.ssid, SSID, sizeof(easy_join.ssid) );
760*10465441SEvalZero     strncpy( easy_join.passwd, passwd, sizeof(easy_join.passwd) );
761*10465441SEvalZero 
762*10465441SEvalZero     result = rt_device_control(wifi_device,
763*10465441SEvalZero                                RW009_CMD_EASY_JOIN,
764*10465441SEvalZero                                (void *)&easy_join);
765*10465441SEvalZero 
766*10465441SEvalZero     return result;
767*10465441SEvalZero }
768*10465441SEvalZero 
rw009_softap(const char * SSID,const char * passwd,uint32_t security,uint32_t channel)769*10465441SEvalZero rt_err_t rw009_softap(const char * SSID, const char * passwd,uint32_t security,uint32_t channel)
770*10465441SEvalZero {
771*10465441SEvalZero     rt_err_t result;
772*10465441SEvalZero     rt_device_t wifi_device;
773*10465441SEvalZero     rw009_cmd_softap softap;
774*10465441SEvalZero 
775*10465441SEvalZero     wifi_device = rt_device_find("w0");
776*10465441SEvalZero     if(wifi_device == RT_NULL)
777*10465441SEvalZero         return -RT_ENOSYS;
778*10465441SEvalZero 
779*10465441SEvalZero     strncpy( softap.ssid, SSID, sizeof(softap.ssid) );
780*10465441SEvalZero     strncpy( softap.passwd, passwd, sizeof(softap.passwd) );
781*10465441SEvalZero 
782*10465441SEvalZero     softap.security = security;
783*10465441SEvalZero     softap.channel = channel;
784*10465441SEvalZero     result = rt_device_control(wifi_device,
785*10465441SEvalZero                                RW009_CMD_SOFTAP,
786*10465441SEvalZero                                (void *)&softap);
787*10465441SEvalZero 
788*10465441SEvalZero     return result;
789*10465441SEvalZero }
790*10465441SEvalZero 
rw009_rssi(void)791*10465441SEvalZero int32_t rw009_rssi(void)
792*10465441SEvalZero {
793*10465441SEvalZero     rt_err_t result;
794*10465441SEvalZero     struct rw009_wifi * wifi_device;
795*10465441SEvalZero 
796*10465441SEvalZero     wifi_device = (struct rw009_wifi *)rt_device_find("w0");
797*10465441SEvalZero 
798*10465441SEvalZero     if(wifi_device == RT_NULL)
799*10465441SEvalZero         return 0;
800*10465441SEvalZero 
801*10465441SEvalZero     if(wifi_device->active == 0)
802*10465441SEvalZero         return 0;
803*10465441SEvalZero 
804*10465441SEvalZero     // SCAN
805*10465441SEvalZero     result = rt_device_control((rt_device_t)wifi_device,
806*10465441SEvalZero                                RW009_CMD_RSSI,
807*10465441SEvalZero                                RT_NULL);
808*10465441SEvalZero 
809*10465441SEvalZero     if(result == RT_EOK)
810*10465441SEvalZero     {
811*10465441SEvalZero         return wifi_device->ap_info.rssi;
812*10465441SEvalZero     }
813*10465441SEvalZero 
814*10465441SEvalZero     return 0;
815*10465441SEvalZero }
816*10465441SEvalZero 
817*10465441SEvalZero #ifdef RT_USING_FINSH
818*10465441SEvalZero #include <finsh.h>
819*10465441SEvalZero 
rw009_scan(void)820*10465441SEvalZero static rt_err_t rw009_scan(void)
821*10465441SEvalZero {
822*10465441SEvalZero     rt_err_t result;
823*10465441SEvalZero     struct rw009_wifi * wifi_device;
824*10465441SEvalZero 
825*10465441SEvalZero     wifi_device = (struct rw009_wifi *)rt_device_find("w0");
826*10465441SEvalZero 
827*10465441SEvalZero     rt_kprintf("\nCMD RW009_CMD_SCAN \n");
828*10465441SEvalZero     result = rt_device_control((rt_device_t)wifi_device,
829*10465441SEvalZero                                RW009_CMD_SCAN,
830*10465441SEvalZero                                RT_NULL);
831*10465441SEvalZero 
832*10465441SEvalZero     rt_kprintf("CMD RW009_CMD_SCAN result:%d\n", result);
833*10465441SEvalZero 
834*10465441SEvalZero     if(result == RT_EOK)
835*10465441SEvalZero     {
836*10465441SEvalZero         uint32_t i;
837*10465441SEvalZero         rw009_ap_info *ap_info;
838*10465441SEvalZero 
839*10465441SEvalZero         for(i=0; i<wifi_device->ap_scan_count; i++)
840*10465441SEvalZero         {
841*10465441SEvalZero             ap_info = &wifi_device->ap_scan[i];
842*10465441SEvalZero             rt_kprintf("AP #%02d SSID: %-32.32s\n", i, ap_info->ssid );
843*10465441SEvalZero         }
844*10465441SEvalZero     }
845*10465441SEvalZero 
846*10465441SEvalZero     return result;
847*10465441SEvalZero }
848*10465441SEvalZero FINSH_FUNCTION_EXPORT(rw009_scan, SACN and list AP.);
849*10465441SEvalZero FINSH_FUNCTION_EXPORT(rw009_join, RW009 join to AP.);
850*10465441SEvalZero FINSH_FUNCTION_EXPORT(rw009_rssi, get RW009 current AP rssi.);
851*10465441SEvalZero 
852*10465441SEvalZero #endif // RT_USING_FINSH
853