mtk_wlan_driver_code_analyse_wiphy_vendor_command-程序员宅基地

1.    kernel_modules/connectivity/wlan/gen4m/os/linux/gl_init.c


mtk_wcn_wlan_gen2_init-> initWlan();


initWlan(); ---------------wifi driver start !


#if DBG  //defult closed; you can open it when you want to debug wifi log .


kalInitIOBuffer(); ----SDIO buf  alloc


procInitFs(); ---dbglevel_ops(debug module and debug level)
          --- proc_txdone_ops ("ARP", "DNS", "TCP", "UDP", "EAPOL", "DHCP", "ICMP")
          --- auto_per_ops  (Performance Configure)
          --- country_ops// diff country support diff channel
 
重点关注一下国家码country_ops,此信息跟选择的工作频段 TX power 等有关。


Two Special country code:
COUNTRY_CODE_FF    enable open for all channel for Certification
COUNTRY_CODE_FE    disable open for all channel for Certification
static ssize_t procCountryWrite(struct file *file, const char __user *buffer,size_t count, loff_t *data);
 wlanoidSetCountryCode WLAN_STATUS wlanoidSetCountryCode(IN P_ADAPTER_T prAdapter,
              IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
 pucCountry = pvSetBuffer; 
 prAdapter->rWifiVar.rConnSettings.u2CountryCodeBakup = prAdapter->rWifiVar.rConnSettings.u2CountryCode;
(set country code complete)


     *  For example: 2.4GHz, 1~13, 20MHz ==> regulation class = 81
     *               2.4GHz, 1~13, SCA   ==> regulation class = 83
     *               2.4GHz, 1~13, SCB   ==> regulation class = 84


Force to re-search
rlmDomainSendCmd(prAdapter, TRUE); 
    1 .rlmDomainSendDomainInfoCmd(prAdapter, fgIsOid);
    2. rlmDomainSendPwrLimitCmd(prAdapter);
    3. rlmDomainSendPassiveScanInfoCmd(prAdapter, fgIsOid);


    rlmDomainSendDomainInfoCmd(prAdapter, fgIsOid);
rlmDomainGetDomainInfo(prAdapter); 
//defined three mothed to get country code:
1. by given table idx 2. by customized  3. by country code


    rlmDomainSendPwrLimitCmd(prAdapter); //TX power limit
WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitDefault[u2DefaultTableIndex].aucCountryCode[0],&prCmd->u2CountryCode); // Corresponding country TX power limit allocation
MAX_TX_POWER                    63
MIN_TX_POWER                    -64


rlmDomainBuildCmdByDefaultTable(prCmd, u2DefaultTableIndex); //default table information
rlmDomainBuildCmdByConfigTable(prAdapter, prCmd); // configuration table information


    rlmDomainSendPassiveScanInfoCmd(prAdapter, fgIsOid); //Set passive scan channel info to chip


createWirelessDevice();
/* <1.1> Create wireless_dev */
    prWdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
/* <1.2> Create wiphy */
prWiphy = wiphy_new(&mtk_wlan_ops, sizeof(GLUE_INFO_T));
/* <1.3> configure wireless_dev & wiphy */
...
/* <1.4> wowlan support */
prWiphy->wowlan = &mtk_wlan_wowlan_support;
    /* <1.5> Use wireless extension to replace IOCTL */
prWiphy->wext = &wext_handler_def;


/* <2> allocate and register net_device */
prNetDev = alloc_netdev_mq(sizeof(P_GLUE_INFO_T), NIC_INF_NAME, NET_NAME_PREDICTABLE,
                   ether_setup, CFG_MAX_TXQ_NUM);
prNetDev->netdev_ops = &wlan_netdev_ops;
/* <2.1> co-relate with wireless_dev bi-directionally */
prNetDev->ieee80211_ptr = prWdev;
    prWdev->netdev = prNetDev;
/* <2.2> co-relate net device & device tree */
SET_NETDEV_DEV(prNetDev, wiphy_dev(prWiphy));
/* <2.3> register net_device */
register_netdev(prWdev->netdev)



createWirelessDevice  -> /* <1.2> Create wiphy */
                    phy = wiphy_new(&mtk_wlan_ops, sizeof(GLUE_INFO_T));  Start 
static struct cfg80211_ops mtk_wlan_ops = {
    .suspend = mtk_cfg80211_suspend,
    .resume    = mtk_cfg80211_resume,
    .change_virtual_intf = mtk_cfg80211_change_iface,
//wlanoidSetInfrastructureMode   1. Infrastructure Client (Non-AP STA) = AP + STA  2. Ad-Hoc IBSS = STA+ STA
    .add_key = mtk_cfg80211_add_key,
    // mtk_cfg80211_add_key -> wlanoidSetAddKey -> _wlanoidSetAddKey (wlan_oid.c) 
    According to the different prNewKey-> u4KeyLength, select the encryption method. 
    /* rKey.u4KeyIndex |= BIT(31);//Enable BIT 31 will make tx use bc key id,should use pairwise key id 0 */
    .get_key = mtk_cfg80211_get_key,
    .del_key = mtk_cfg80211_del_key,
    .set_default_key = mtk_cfg80211_set_default_key,
    .set_default_mgmt_key = mtk_cfg80211_set_default_mgmt_key,
    .get_station = mtk_cfg80211_get_station,  
    //This routine is responsible for getting station information such as RSSI
    /* 1. check BSSID */
    UNEQUAL_MAC_ADDR(arBssid, mac)
    /* 2. fill TX rate */
    wlanoidQueryLinkSpeed
    /* 3. fill RSSI */
    wlanoidQueryRssi   
    Contradictory point:
    rRssi = (PARAM_RSSI) prAdapter->rLinkQuality.cRssi;    /* ranged from (-128 ~ 30) in unit of dBm */
    #define PARAM_WHQL_RSSI_MAX_DBM                 (-10)
#define PARAM_WHQL_RSSI_MIN_DBM                 (-200)
    
    /* 4. Fill Tx OK and Tx Bad */
    wlanoidQueryStatisticsPL
.change_station = mtk_cfg80211_change_station,
    .add_station = mtk_cfg80211_add_station,
    .del_station = mtk_cfg80211_del_station,
    .scan = mtk_cfg80211_scan,
    #define CFG_SCAN_SSID_MAX_NUM                   (4)
#define CFG_SCAN_SSID_MATCH_MAX_NUM             (16)
#if CFG_MULTI_SSID_SCAN
wlanoidSetBssidListScanAdv
wlanoidGetChannelInfo(prAdapter, prScanRequest->puPartialScanReq);// get channel list
aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, u4IeLength);
{//遍历赋值ssid,此方法多次使用,请以适当的场景赋值为准
            for (i = 0; i < ucSsidNum; i++) {
                COPY_SSID(prAisFsmInfo->arScanSSID[i].aucSsid,
                      prAisFsmInfo->arScanSSID[i].u4SsidLen,
                      prSsid[i].aucSsid, prSsid[i].u4SsidLen);
}


/* start online scan */
wlanClearScanningResult(prAdapter);
aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
{
case AIS_STATE_ONLINE_SCAN:
1、//ssid 赋值(各种扫描方式宏控辅助)
COPY_SSID(prAisFsmInfo->rRoamingSSID.aucSsid,prAisFsmInfo->rRoamingSSID.u4SsidLen,prConnSettings->aucSSID,prConnSettings->ucSSIDLen); 
2、//channel 获取
}


#else
wlanoidSetBssidListScanExt
// The difference between the two cases is: last case did not achieve aisFsmScanRequestAdv(fun :LIST_SCAN) function.
#endif
    .connect = mtk_cfg80211_connect,
1.    wlanoidSetInfrastructureMode 
    {
        /* Verify the new infrastructure mode. */基础架构BSS 网络
    if (eOpMode >= NET_TYPE_NUM) {
        DBGLOG(OID, TRACE, "Invalid mode value %d\n", eOpMode);
        return WLAN_STATUS_INVALID_DATA;
    }


    /* check if possible to switch

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38503885/article/details/103402935

智能推荐

EMC滤波设计-程序员宅基地

文章浏览阅读85次。https://blog.csdn.net/csy17729158342/category_11970648.html 滤波:特定波段频率滤除插入损耗:50欧姆系统下测量,插损越大越好,滤波前的电压比滤波后的电压。共模阻抗100欧姆,差模阻抗50欧姆简单的滤波电路:电感与源负阻抗分压,电感靠近低阻抗;电容分流,靠近高阻抗。由插损来判断滤波电路是否有效,滤波电容放在高阻有效,电感放低阻有效。24V电机驱动,Re超标,红色差模,蓝色共模,电机线圈为感性,认为为高阻态,机壳加接地电容。电机线圈为感性,认为为高阻态

Matlab学习——求解微分方程(组)-程序员宅基地

文章浏览阅读9.1k次,点赞16次,收藏110次。介绍:1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问题,调用格式为 X=dsolve(‘eqn1’,’eqn2’,…)如果没有初始条件,则求出通解,如果有初始条件,则求出特解系统缺省的自变量为 t。2..._"matlab求解微分方程)\"=1+2 y ', y (0)=2, y '(0)= l 的解:2.用循环求解法找出满足∑ i >1000的最小 m 值。"

Java dom4j解析RESTFull风格发布的WebService的xml文件_restfullwebservice发布-程序员宅基地

文章浏览阅读750次。公司项目要求解析出RESTFull风格发布的WebService接口的所有请求方法,参数,参数类型,已经方法是返回类型,想来想去都不知道该怎么办,思来想去然后又研究RESTFull风格WebService的xml文件,发现其实对于Java简单类型的 方法是能在xml文件中体现的,但是对于复杂类型,比如参数是一个对象,或者返回值是一个对象或者List,Map等。这些返回类型在xml文件中的 resp_restfullwebservice发布

Django简单实现从数据库导入数据到前端界面(完整)_python将数据库内容写入前端-程序员宅基地

文章浏览阅读7.8k次,点赞17次,收藏90次。START第一先连接上数据库在项目文件的setting里找到DATABASESENGINE :数据库服务器(这里可以看我另一篇文章)NAME: 数据库的名字USER :连接数据库的用户PASSWORD :连接数据库的用户密码HOST :连接主机的数据库服务器PORT: 连接数据库时使用的端口第二设置数据库模型(models.py)找到你的项目,右键,找到open in terminal在打开的命令行里输入python manage.py inspectdb#输入这段代码是为_python将数据库内容写入前端

Avalonia(11.0.2)+.NET6 打包设置发布包的版本号-程序员宅基地

文章浏览阅读192次。本文是对上一篇打包文章的补充,后台好多人私信我说打包的版本号如何设置,今天出个补充说明。

【LeetCode】反转链表(递归法)-程序员宅基地

文章浏览阅读259次,点赞10次,收藏5次。先整理在这里吧,递归说简单也简单,说难也真难。供参考。

随便推点

Vue3 - 实现动态获取菜单路由和按钮权限控制指令_vue3权限菜单-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏5次。关于动态获取路由已在这里给出方案Vue - vue-admin-template模板项目改造:动态获取菜单路由这里是在此基础上升级成vue3和ts,数据和网络请求是通过mock实现的具体代码请看demo!!!本地权限控制,具体是通过查询用户信息获取用户角色,在路由守卫中通过角色过滤本地配置的路由,把符合角色权限的路由生成一个路由数组动态获取菜单路由其实思路是一样的,只不过路由数组变成从服务器获取,通过查询某个角色的菜单列表,然后在路由守卫中把获取到的菜单数组转成路由数组动态路由实现是参考。_vue3权限菜单

web.xml文件的所有标签都报红_web.xml报红-程序员宅基地

文章浏览阅读5.6k次,点赞9次,收藏20次。突然发现自己的Web项目的web.xml文件的所有标签都报红。 1, 首先打开Project Settings查看当前项目facets中Deployment Desciptors(项目部署)和Web Resouce Directories(web资源目录)没有同步(文件路径不一致或者其中之一没有配置)2,如果我画红的位置,路径一致,web.xml标签仍报红大致是头文件的问题了,就是这两个方面的问题了1,头文件的版本问,2,是idea本身的一些问题(ps: elipse软件也有同样的问题,可_web.xml报红

删除单链表中的倒数第k个结点_删除单链表倒数第k个结点-程序员宅基地

文章浏览阅读2.2k次。 算法思想:定义两个指针,pFast和pSlow,都指向头结点,pFast先后移k-1位,使pFast指向第k个结点,此时pSlow就是相对pFast的倒数第k个结点。然后同时后移,当pFast走到表尾时,pSlow正好指向倒数第k个结点。然后将pSlow指向的结点删除。 删除单链表中的倒数第k个结点,首先要确定倒数第k个结点的位置。//查找指向链表中的倒数第k个结点的指针..._删除单链表倒数第k个结点

《嵌入式 - Lwip开发指南》第4章 移植LWIP(基于RT-Thead系统-以太网+Wifi)_lwip ethernet link down-程序员宅基地

文章浏览阅读1.9k次。开发环境:RT-Thread版本:4.0.3操作系统:Windows10Keil版本:V5.30RT-Thread Studio版本:2.0.1开发板MCU:STM32F746ZGT6U(NUCLEO-F746ZG开发板)前面是通过以太网进行网络连接,本文将讲解Wifi联网。4.1 RW007联网4.1.1 RW007简介RW007 是由上海睿赛德电子科技有限公司开发的高速 WiFi 模块,模块基于 Realtek RTL8710BN(Ameba Z 系列) WIFI SOC,使用 SPI_lwip ethernet link down

VC++使用PreTranslateMessage函数处理点击按钮区域响应事件_vc++ pretranslatemessage-程序员宅基地

文章浏览阅读1.8k次。主要用于贴图1、用图片实现按钮2、按钮控件属性设置为不可视代码如下:BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg){ // TODO: 在此添加专用代码和/或调用基类 if (pMsg-&gt;message == WM_LBUTTONDOWN) { //获取按钮的区域 CRect rect,rc; m_Ok.GetWindowRe..._vc++ pretranslatemessage

粒子群优化BP神经网络初始权值(python实现)_python sklearn 蚁群 优化bp-程序员宅基地

文章浏览阅读1.1w次,点赞38次,收藏237次。粒子群优化BP神经网络初始权值(python实现)网上看了一些资料,但都是用matlab写的,(还要用csdn会员积分下载)自己不太会用matlab,就试着用python写了段小程序实现,数据用的是sklearn中的波士顿房价数据集,神经网络部分是用tensorflow2。(本来想用sklearn,但不知道怎么把网络权值提取出来)思路挺简单的,就是把BP网络误差作为粒子群优化的目标,每个粒子对应网络权重,一轮一轮的迭代。(先是在一篇建模论文里看到了这个想法,虽然好像没啥实用价值)大一,只会捏泥巴,各位_python sklearn 蚁群 优化bp

推荐文章

热门文章

相关标签