zoukankan      html  css  js  c++  java
  • 树莓派CM4 wifi频繁断开连接

    CM4核心板上自带的wifi模块连接上华为/小米的路由器5G热点以后,会频繁断开连接,断开连接前使用 iw dev 查看wifi信息如下:

    phy#0
            Unnamed/non-netdev interface
                    wdev 0x2
                    addr de:a6:32:fe:d2:**
                    type P2P-device
                    txpower 31.00 dBm
            Interface wlan0
                    ifindex 6
                    wdev 0x1
                    addr dc:a6:32:fe:d2:**
                    ssid HUAWEI-***_HiLink_5G
                    type managed
                    channel 153 (5765 MHz),  80 MHz, center1: 5775 MHz
                    txpower 31.00 dBm

    使用 iw event 命令监控原因,在断开连接时看到如下信息:

      wlan0 (phy #0): scan finished: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5700 5720 5745 5765 5785 5805 5825, ""
      wlan0 (phy #0): connected to 24:da:33:4c:11:22
      phy #0: regulatory domain change: set to CN by a country IE request on phy0  //wifi连接上时的log

    wlan0 (phy #0): disconnected (local request) reason: 3: Deauthenticated because sending station is leaving (or has left) the IBSS or ESS //过了一会wifi断开连接时的log
    wlan0 (phy #0): scan started
    wlan0 (phy #0): scan finished: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472 5745 5765 5785 5805 5825, ""
    wlan0 (phy #0): connected to 24:da:33:4c:11:22

    断开连接后会重新连接上,这时再用 iw dev 查看wifi信息如下:

    phy#0
            Unnamed/non-netdev interface
                    wdev 0x2
                    addr de:a6:32:fe:d2:**
                    type P2P-device
                    txpower 31.00 dBm
            Interface wlan0
                    ifindex 6
                    wdev 0x1
                    addr dc:a6:32:fe:d2:**
                    ssid HUAWEI-**_HiLink_5G
                    type managed
                    channel 153 (5765 MHz),  40 MHz, center1: 5755 MHz
                    txpower 31.00 dBm

    这时会发线wifi模块工作再40MHz频宽上,这是为什么呢?通过 iw event 的信息来看,可疑点也只有“phy #0: regulatory domain change: set to CN by a country IE request on phy0”这句话了,因为在wpa_supplicant的配置文件中我设置了 country=US ,但是通过 iw reg get 查看发现国家码确实被改成CN了。为什么国家码会被改成CN呢?

    通过查阅资料得到,如果路由器本身使能了 ieee80211d=1 ,那么wifi模块的驱动会通过country IE 重新获取国家码,那么中国这边获取的国家码为CN,然后就把国家码设置到wifi模块上了。

    为了验证上述查找资料得到的信息,本人特地找了另一个arm开发板,打开arm开发板的AP功能,并在hostapd的配置文件里加上 country_code=CN 和 ieee80211d=1 两项,CM4 wifi模块连接arm开发板的热点之前,先 iw reg get 确保CM4系统里的国家码为US,如果不是US的话, iw reg set US 设为US。然后在CM4 wifi连接上arm开发板的热点时,在CM4所在的系统上可以看到 iw event 的日志中出现了“phy #0: regulatory domain change: set to CN by a country IE request on phy0”。

    这一切也都很正常,但是问题在于树莓派核心板上wifi模块在国家码设置为CN的时候,不支持80MHz频宽和36、40、44、48等5G信道,所以会断开重新连接AP,因为我们wifi连接工具wpa_supplicant的配置文件设置的国家码为US,所以wifi模块连接上AP以后如果还是工作在80MHz信道宽度,会又重复上面断开连接的情况。如果wifi模块连接上AP以后工作在40MHz频宽(如上面所示),那么可以稳定工作在40MHz频宽,不会再断开连接。

    至于为什么有时候断开连接又重新连接在80MHz频宽(设置的US国家码生效),有时候断开连接后重新连接在40MHz频宽(设置的CN国家码生效),可能是重新连接时wpa_cli 执行了reconfigure命令,原因暂不追究,我们来想办法避免重复断开连接的情况。

    解决方法1:

    国家码做成可配置,不同的区域设置不同的国家码。

    即在wpa_supplicant的配置文件里加上 country=CN 。

    优点:

    在中国使用的话,国家码设为CN以后,对于149~165信道的5G AP来说,wifi模块连接上以后工作在40MHz频宽上,稳定,不会掉线。

    缺点:

    不能支持36~48信道的5G AP,由于36~48信道在很多年之前在中国已经开放了,越来越多的路由器是支持36~48信道的,缺点很明显。令外如果有些AP不支持40MHz频宽的话(只支持5G AP 只支持80MHz频宽),也是连接不上的。

    解决方法2:

    更改wifi驱动,通过模块参数可设置强制wifi模块只工作在US国家码下,从而既让wifi模块支持80MHz频宽的5G信道, 又支持36~48等5G信道。

    修改 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c 文件, 如下:

    1. 添加模块参数 regulatory_domain_force_us:

    static int regulatory_domain_force_us = 0; 
    module_param(regulatory_domain_force_us, int, S_IRUGO);
    MODULE_PARM_DESC(regulatory_domain_force_us, "force set regulatory domain to US.");

    2. 修改 static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, struct regulatory_request *req) 函数:

     1 static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
     2                     struct regulatory_request *req)
     3 {
     4     struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
     5     struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
     6     struct brcmf_pub *drvr = cfg->pub;
     7     struct brcmf_fil_country_le ccreq;
     8     char *alpha2;
     9     s32 err; 
    10     int i;
    11     char reg_code[3] = "US";
    12 
    13     err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq));
    14     if (err) {
    15         bphy_err(drvr, "Country code iovar returned err = %d\n", err);
    16         return;
    17     }    
    18 
    19     /* The country code gets set to "00" by default at boot - substitute
    20      * any saved ccode from the nvram file unless there is a valid code
    21      * already set.
    22      */
    23     if (regulatory_domain_force_us)
    24         alpha2 = reg_code;
    25     else 
    26         alpha2 = req->alpha2;
    27     
    28     if (alpha2[0] == '0' && alpha2[1] == '0') {
    29         extern char saved_ccode[2];
    30 
    31         if ((isupper(ccreq.country_abbrev[0]) &&
    32              isupper(ccreq.country_abbrev[1])) ||
    33             !saved_ccode[0])
    34             return;
    35         alpha2 = saved_ccode;
    36         pr_debug("brcmfmac: substituting saved ccode %c%c\n",

    第11,23,24,25,26行为添加的内容,重新编译驱动并替换原有驱动。并在系统里添加/etc/modprobe.d/brcmfmac.conf文件,内容如下:

    options brcmfmac regulatory_domain_force_us=1

    这样在wifi驱动brcmfmac.ko加载的时候会自动传入模块参数 regulatory_domain_force_us=1,强制指定国家码为US。可通过 cat /sys/module/brcmfmac/parameters/regulatory_domain_force_us 查看 regulatory_domain_force_us 的值。

    优点:

    wifi模块既能支持36~48信道的AP,又能解决wifi模块工作在80MHz频宽频繁掉线的问题。

    注意:

      此修改只是强制让wifi模块本身固定工作在US国家码下,即使系统层面通过 iw reg set CN 把国家码设为CN,wifi驱动设置的却为US,从而提高wifi模块的兼容性,系统里通过 iw reg get 得到的信息并不一定等于wifi模块实际工作的信息。

     

    本文来自博客园,作者:王楼小子,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/15720811.html

  • 相关阅读:
    strcpy的实现
    使用Highcharts生成柱状图
    使用Highcharts结合PHP与Mysql生成饼状图
    shopnc 学习笔记
    php中关于mysqli和mysql区别的一些知识点分析
    jquery捕获enter键 按enter键执行提交
    php在IE浏览器中保存SESSION
    ShopNC 商城系统开发经验分享第五篇: 缓存设计
    ShopNC 商城系统开发经验分享第二篇:ShopNC商城系统初步分析
    SHOPEX于SHOP++比较哪款更适合做二次开发,为什么?
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/15720811.html
Copyright © 2011-2022 走看看