[翱捷]功能机 Wifi
硬件原理上支持WIFI_SCAN。
参考手表方案,
1、3603芯片自带的wifi scan功能,是利用modem在空闲(Idle)时,才能实际去执行搜索wifi热点的功能,如果手机在搜网(基站)、正在打电话、正在进行数据通信,wifi scan搜索不到热点的概率会比较大。
 2、上面已经给出了wifi scan的工作原理和参数说明,其中作用比较大的时快速释放rrc连接(AT*FASTDORM),能快速回到idle状态(这是通信协议层相关的东西),这个操作不影响lwip socket相关接口的使用。
 3、如果在每次AT*WIFICTRL启动前执行了AT*FASTDORM,对wifi scan定位功能还是不理想,建议从应用逻辑上去调整优化,比如:
       1)本次搜索不到wifi热点,马上再启动一次搜索指令,不用等到下一个周期启动搜索,也就是特定的情况下让wifi scan积极一点。
       2)避开网络数据传输的密集时段,这个主要针对客户自己应用程序优化,比如,你有一个实时上服务器的task程序在跑,在启动wifi scan时在这个task加判断先不要与服务器交互数据。
wifi scan相关at命令可以参考附件文档。
 
 注意:
         PS业务跟wifi scan业务是冲突的。默认情况下是PS业务优先。打电话或者收发网络数据时进行wifi scan可能会失败。
 
         下面两种情况下SW wifi都可以。
             1 只插单卡,无论插在simA还是simB都可以。
             2 双卡单待模式(主卡CFUN1,副卡CFUN4/CFUN0)
                  
             双卡双待版本,同时插双卡是不行的。可能会有各种打电话发短信等的问题。
 
         wifiscan需要在idle态下才能发起。如果不是idle态可以AT*FASTDORM后,再发起wifiscan。可以在每次WiFi scan之前先下指令AT*FASTDORM。
 
 wifiscan相关接口如下,代码是开源的,具体信息见相关接口的定义。可以在callback里获取wifi信息。
         UINT32 CMID_NwCfgWifiScan(NW_WIFI_SCAN_CTRL_CB cb, UINT8 scan_round,
             UINT8 max_hotspot_number, UINT8 timeout_second, UINT8 scan_priority)
             
         UINT32 CMID_NwCtrlWifiScan(NW_WIFI_SCAN_CTRL_CB cb, UINT8 option)
 
 测试参考代码,
 
         +++ b/evb/src/hal/modem/nw.c
         @@ -2827,6 +2893,32 @@ void CMID_NwRspWifiCellInfo(RIL_WIFI_CELL_INFO* pWifiCellInfo)
                 UI_FREE(pWifiCellInfo);
          }
 
         +void wifiscan_cb(NW_WIFI_CELL_INFO_T *CellInfo)^M
         +{^M
         +       int i;^M
         +^M
         +       if (CellInfo == NULL)^M
         +               return;^M
         +^M
         +       raw_uart_log("wifi scan result count %d\n", CellInfo->count);^M
         +^M
         +       for (i=0; i<CellInfo->count; i++)^M
         +               raw_uart_log("host %d mac: %x:%x:%x:%x:%x:%x, rssi %d\n", i, ^M
         +               CellInfo->item[i].mac[0], CellInfo->item[i].mac[1],^M
         +               CellInfo->item[i].mac[2], CellInfo->item[i].mac[3],^M
         +               CellInfo->item[i].mac[4], CellInfo->item[i].mac[5],^M
         +               CellInfo->item[i].rssi);^M
         +^M
         +       return;^M
         +}^M
         +^M
         +void wifiscan_test(void)^M
         +{^M
         +       raw_uart_log("wifiscan_test start...\n");^M
         +       CMID_NwCfgWifiScan(wifiscan_cb, 3, 5, 20, 0);^M
         +^M
         +       return;^M
         +}^M
          /*
          ** Config scan parameters and start WIFI scan.
          ** Asynchronous operation interface. 
 
         +++ b/evb/src/gui/mgapollo/apps/launcher/src/Standby.cpp
         @@ -112,6 +112,7 @@ extern void volteCallNoticeStandbyHandler(void);
          #ifdef CONFIG_BUILD_TTS_TARGET
          extern "C" int TTS_SynthText(char * pcData,    unsigned int nSize);
          #endif
         +extern "C" void wifiscan_test(void);
 
          const NGInt _week_days_strs[] = {
              SS_SUN,
         @@ -1821,6 +1822,7 @@ NGBool Standby::onKey(NGInt keyCode, KeyEvent* event)
          #ifndef __MMI_WHITE_THEME__
                      menubar->setBkColor(Color::RT_C105);
          #endif
         +                       wifiscan_test();//------------------------------------这里是在桌面按下*键时调用测试接口函数
                      Intent intent(CallApp::START_BY_DIAL, "*", 0);
                      EntryCall(&intent);
                      return DISPATCH_STOP_MSG;  
 
         打印log如下,
 
         MMI:wifiscan_test start...
         MMI:<4>[RILADP]I:CMID_NwWifiCtrlReq <option>=2 [<3> <5> <20> <0>] 
         MMI:<4>[RILADP]I:CMID_NwWifiCtrlReq sim_id =0 
         MMI:=>[AT cmd][SS1]AT*WIFICTRL=2,3,5,20,0
         MMI:<=[AT cmd][SS1]OK
 
         [15:43:29.031]收←◆MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "7C1E0688A630",-71, 1
 
         [15:43:29.077]收←◆MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=0 mac: 7c 1e 06 88 a6 30
         MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "7C1E0688A631",-75, 2
         MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=1 mac: 7c 1e 06 88 a6 31
         MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "7C1E0687AA70",-76, 6
         MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=2 mac: 7c 1e 06 87 aa 70
         MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "8840337FD04C",-81, 2
         MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=3 mac: 88 40 33 7f d0 4c
         MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: ,0, 0
 
         [15:43:29.123]收←◆MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo *WIFICTRL: unsolicited is done
         MMI:wifi scan result count 4
         MMI:host 0 mac: 7c:1e:6:88:a6:30, rssi -71
         MMI:host 1 mac: 7c:1e:6:88:a6:31, rssi -75
         MMI:host 2 mac: 7c:1e:6:87:aa:70, rssi -76
         MMI:host 3 mac: 88:40:33:7f:d0:4c, rssi -81
Q:AT*WIFICTRL的使用说明
 A:
 AT*WIFICTRL=0 //stop; 
 AT*WIFICTRL=1 //start;
 0/1:采用缺省参数,缺省3轮,最大30个WiFi热点,最大25s超时;
   每轮WIFI scan需要的时间片为120ms*14(channel)=1.68s, 但真正的时间要多一些overhead(周期性paging,measurement处理),
   以及WiFi scan模块向modem申请时间片(gap),modem分配时去掉的一些不合适时间(平均在1/2个paging cycle);
   但如果热点多的情况下,每轮底层找到10个热点就会提前返回了,不会用满分配的gap;
 AT*WIFICTRL=2,<scanRound>,<bssidNum>,<timeout>,<priority> 
 AT*WIFICTRL=2,3,10,25,1 
 2: AT命令参数选项,考虑后面参数; 
  3: 表示总共搜三轮才结束WiFi 搜索,范围: 1~3;最大3轮; 
  10:表示总共搜到多少个WiFi 热点就结束WiFi搜网,范围是4~30;(早期有版本为4~10) 
     小于4的值或者大于30的值,会改成了30。 
  25:底层WiFi搜索超时timer,单位秒,即多长时间之内没有完成WiFi搜索,超时结束。 
     这个值范围是1~25,不在这个范围,会认为无效,使用默认值25.
     就是AT*WIFICTRL=2 带的参数不符合预期范围,就采用AT*WIFICTRL=1的默认值。
  1: 表示数据业务相对WiFi Scan的优先级,参数为0~1; 
    0,表示数据业务优先级高于WiFi Scan优先级,在WiFi Scan搜索期间,上下行数据业务会打断WiFi scan,
    1,表示数据业务优先级低于WiFi Scan优先级,在WiFi Scan搜索期间,会屏蔽上下行数据业务。
 
 BTW, WIFI SCAN异常很多是跟设备处在connected mode,即wifi scan跟空口连接冲突;因此在做wifi scan时,建议上层判断是否有业务数据在传输(空口在连接态下);
 如果在连接态,而需要做wifi scan,参考local release说明,释放rrc 连接,回到idle再发起wifi scan;
 上层逻辑请客户酌情考虑,即wifi scan跟数据业务冲突时优先哪个。
 
 BTW2,有如下几种情况上报:
   1,三轮完成后,才上报;
   (每轮gap时间需要最多120ms*14,实际分配的可能多;
   针对option=1采用default配置的情况, 如果热点多的情况下,每轮底层找到10个热点就会提前返回了,不会用满分配的gap,这样有些channel也没有scan,同时目前底层不同轮次间,不排除相同热点情况;
   对于option=2的情况,底层没有10个热点提前返回的限制;)  
   2,没到三轮,但是已经搜到30(早期有版本为10)个热点
   3,没到三轮,但是time out(25s,早期有版本为20s),或者快到了,不够支持再做一轮的时间,也要上报(无论是否搜到);
   这种情况就属于rrc 不批准做或者批准的不足够我们做三轮
   4,上层发起stop wifi 搜索,我们将最近的结果上报。
   5,类似4,如果被modem打断(其他高优先级业务,主动发数据,接收寻呼要建链等),会将当前的结果上报;
