wmt_chrdev_wifi.c :

#define WIFI_DEV_MAJOR 153  <--->对应init.rc中创建的设备节点 /xxx/mediatek/custom/jrdsh75_cu_jb/factory/init.rc
static int WIFI_major = WIFI_DEV_MAJOR;  
WIFI_init()
dev_t dev = MKDEV(WIFI_major, 0);
-->cdev_init  (&WIFI_cdev, &WIFI_fops)-->struct file_operations WIFI_fops = {
    .open = WIFI_open,
    .release = WIFI_close,
    .write = WIFI_write,
};
-->WIFI_open()
-->WIFI_close()
-->WIFI_write()

上层开wifi调用驱动
mtk_wifi.c:
-->wifi_set_power(int enable)
-->halDoCommand("load wifi");//调用驱动
。。。。。
HaldController.cpp
-->int HaldController::loadDriver(const char *ifname)
{
            ALOGD("Start load wifi driver.");
            /*load wifi driver*/
            sDriverCtrl->load(NETWORK_IFACE_WIFI);
           /*turn on wifi power*/
             powerOn();
            /*set flag*/
            isWifiActive = true;
            return 0;
}
-->powerOn()
{
  setPower(1);
}
-->void HaldController::setPower(int enable) 
{
373    const char buffer = (enable ? '1' : '0');
374
375    fd = open(WIFI_POWER_PATH, O_WRONLY); //打开节点?? #define WIFI_POWER_PATH     "/dev/wmtWifi"
376    if (fd < 0) {
377        ALOGE("Open \"%s\" failed", WIFI_POWER_PATH);
378        goto out;
379    }
380     sz = write(fd, &buffer, 1);
381    if (sz < 0) {
382        ALOGE("Set \"%s\" [%c] failed", WIFI_POWER_PATH, buffer);
383        goto out;
384    }

}
//节点创建 init.rc
 mknod /dev/wmtWifi c 153 0  <---> 对应wmt_chrdev_wifi.c #define WIFI_DEV_MAJOR 153
因此上层从 
fd = open(WIFI_POWER_PATH, O_WRONLY);执行到wmt_chrdev_wifi.c 中open 
sz = write(fd, &buffer, 1); 执行到wmt_chrdev_wifi.c 中write

Settings.java(mWifiEnabler)-->WifiEnabler.java(mWifiManager)-->WifiManager.java(mservices)-->IWifiManager.aidl-->WifiService.java( mWifiStateMachine.setWifiEnabled(enable);
)-->WifiStateMachine.java({
    public void setWifiEnabled(boolean enable) {
        mLastEnableUid.set(Binder.getCallingUid());
        if (enable) {
            /* Argument is the state that is entered prior to load */
            sendMessage(obtainMessage(CMD_LOAD_DRIVER, WIFI_STATE_ENABLING, 0));//加载驱动
            sendMessage(CMD_START_SUPPLICANT);//用于数据通信
        } else {
            sendMessage(CMD_STOP_SUPPLICANT);
            /* Argument is the state that is entered upon success */
            sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_DISABLED, 0));
        }
    }

})-->WifiNative.java(mwifinative.loadDriver())-->android_net_wifi_wifi.cpp(android_net_wifi_loadDriver())-->mtk_wifi.c(wifi_load_driver())??(有木有已经和上面接轨了!!)

芯片上电
wmt_ctrl.c -->wmt_ctrl_hw_pwr_on(P_WMT_CTRL_DATA pWmtCtrlData)<wmt_plat_pwr_ctrl(FUNC_ON)> --wmt_plat_alps.c-->INT32 wmt_plat_pwr_ctrl (   ENUM_FUNC_STATE state    )--<    case FUNC_ON:
        // TODO:[ChangeFeature][George] always output this or by request throuth /proc or sysfs?
        wmt_plat_dump_pin_conf();
        ret = mtk_wcn_cmb_hw_pwr_on();
>----mtk_wcn_cmb_hw_6628.c-->(mtk_wcn_cmb_hw_pwr_on (VOID)--->找到wifi的管脚中断WIFI_EINT(GPIO15)及外部中断号WIFI_EINT_NUM(18)
)

/XXX/mediatek/custom/jrdsh75_cu_jb/kernel/core/src/board.c -->中断请求
-->通过中断号WIFI_EINT_NUM(18)-->mtk_wcn_cmb_sdio_eint_num=CUST_EINT_WIFI_NUM=18
static void mtk_wcn_cmb_sdio_request_eirq(sdio_irq_handler_t irq_handler, void *data)
{
    mtk_wcn_sdio_irq_flag_set (0);
    mtk_wcn_cmb_sdio_eirq_data    = data;
    mtk_wcn_cmb_sdio_eirq_handler = irq_handler;
    mt65xx_eint_set_sens(mtk_wcn_cmb_sdio_eint_num, CUST_EINT_WIFI_SENSITIVE); /*CUST_EINT_WIFI_NUM */
    mt65xx_eint_set_hw_debounce(mtk_wcn_cmb_sdio_eint_num, CUST_EINT_WIFI_DEBOUNCE_CN); /*CUST_EINT_WIFI_NUM */
    mt_set_gpio_pull_enable(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_ENABLE);
    mt_set_gpio_pull_select(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_UP);
    mt65xx_eint_registration(mtk_wcn_cmb_sdio_eint_num/*CUST_EINT_WIFI_NUM */,
        CUST_EINT_WIFI_DEBOUNCE_EN,
        CUST_EINT_WIFI_POLARITY,
        mtk_wcn_cmb_sdio_eirq_handler_stub,
        0);
    mt65xx_eint_mask(mtk_wcn_cmb_sdio_eint_num);/*CUST_EINT_WIFI_NUM */

}
-->  .request_sdio_eirq = mtk_wcn_cmb_sdio_request_eirq,
再找request_sdio_eirq相关中断请求----->找到sd.c
  if (hw->request_sdio_eirq) /* set to combo_sdio_request_eirq() for WIFI */
        hw->request_sdio_eirq(msdc_eirq_sdio, (void*)host); /* msdc_eirq_sdio() will be called when EIRQ */
-->找到msdc_eirq_sdio------------->中断处理函数
/* msdc_eirq_sdio() will be called when EIRQ(for WIFI) */
static void msdc_eirq_sdio(void *data)
{
    struct msdc_host *host = (struct msdc_host *)data;

N_MSG(INT, "SDIO EINT");
    mmc_signal_sdio_irq(host->mmc);
}

Gl_init.c-->启动gl_kal.c的tx_thread线程,当这个线程启动后就等待中断处理网络数据的发送与接收。<----->网络驱动函数
sdio.c  ------->static void mtk_sdio_interrupt(struct sdio_func *func)-->wake_up_interruptible(&prGlueInfo->waitq);就会去调用
gl_kal.c --->int tx_thread(void *data)-->ret = wait_event_interruptible(prGlueInfo->waitq,(prGlueInfo->u4Flag != 0));
wlan_lib.c---->wlanTxPendingPackets (
    IN      P_ADAPTER_T prAdapter,
    IN OUT  PBOOLEAN    pfgHwAccess
    )

MTK wifi 驱动相关相关推荐

  1. openwrt配置内核驱动_为斐讯K2P编译OpenWRT LEDE,并启用mtk闭源wifi驱动及H3C认证

    写在最前:只有A1/A2版的K2P才能照本文编译固件并刷入,B1/B2版切莫作死. 一.简述 写在最前,只有A1/A2版本的K2P能照本文编译固件并刷入,B1版本切莫作死.虽然斐讯迟早翻车 现在已经翻 ...

  2. 【硬件和驱动相关】wifi设备没有工作 ubuntu18.0.4 无线网卡 intel 6 AX200

    关联博客: [硬件和驱动]如何查看linux的驱动有没有装好 --声卡无声音,有驱动为例子,网卡wifi驱动相关 [硬件]搭建自己的深度学习服务器 or 高性能电脑--从0到1装机指南 环境:linu ...

  3. 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑

    Openwrt系统,路由或者IOT网关方面,市面上能供个人或者小团队甚至小企业 ,可玩性高的也就MT76xx系列路由芯片了,其中很大一部分原因主要在于MTK的WIFI驱动管控不是很严格,相对较容易获取 ...

  4. 【转】openwrt15.05使用mt7620官方wifi驱动及apcli

    网上关于在openwrt上使用mt7620的官方wifi驱动的文章已经,但在亲自实践中总是有些不足,本文记录下调试过程,供有需要的人参考. 1.驱动版本 mtk是有提供官方的openwrt版本的,网上 ...

  5. MTK 驱动(69)---MTK平台 电池驱动相关

    MTK平台 电池驱动相关 MTK平台 电池驱动 一.相关代码路径(mt6755/Android6.0) alps/kernel-3.18/drivers/misc/mediatek/include/m ...

  6. MTK Wlan驱动功能

    目录 驱动文件分析 内核层 WifiStateMachine.java 层 驱动文件分析 最近查一下MTK Wifi的一个Mac Address功能,结果查找代码,竟然在kernel下 找不到代码,真 ...

  7. wifi linux 驱动分析,Linux 下wifi 驱动开发(二)—— WiFi模块浅析

    一.什么是wifi 模块百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE8 ...

  8. hi3516配置wifi_HISI 3516A移植mt7601u的wifi驱动

    第一步:下载驱动 mt7601u的wifi驱动有两部分:STA和AP. 下载地址如下: 第二步:将驱动或模块编译进内核 1.解压驱动代码并copy到\osdrv\opensource\kernel\l ...

  9. Linux 下wifi 驱动开发(二)—— WiFi模块浅析

    一.什么是wifi 模块 百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE ...

最新文章

  1. 如何选择正确的标签?
  2. 为什么我的电脑上安装不上python-python安装不上
  3. C语言ftell()函数(返回文件当前位置)(返回给定流 stream 的当前文件位置)
  4. RabbitMQ 消息确认机制confirm代码编写
  5. 2.1.决策树和随机森林
  6. overflow-x理解_前端系列学习笔记
  7. 25大技术主题向您发出最后一次约【惠】邀请
  8. 深度学习attention原理_深度学习Anchor Boxes原理与实战技术
  9. php easysms,二次开发-如何在PHPEMS-发送短信验证码(以easy-sms为例)
  10. 微信小程序盲盒-可对接微信支付
  11. 鸿蒙系统下滑线怎么设置,微信下划线昵称教程来了,快来试试!
  12. python机械臂怎么控制_Python编程语言趣味学,EV3工业机械臂上线
  13. Java基础-标识符
  14. 莫兰迪配色RGB对照表
  15. 论文阅读《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》
  16. Python基础:第25课——使用类和实例
  17. nRF keil工程错误相关
  18. mysql程序选项有两种通用形式:长选项和短选项_MySQL程序概述
  19. 电商项目——商品规格管理
  20. Lottie- 让Android动画实现更简单

热门文章

  1. 双极权电阻网络串联电阻阻值推导
  2. Seata Saga 模式快速入门和最佳实践
  3. 聚焦安卓热:中国为何如此热衷安卓
  4. 程序员被空姐骗到香港做传销!(当事人讲述完整详细版)
  5. 计算机硬件基础-CPU
  6. CentOS7 linux ifconfig 没有ens33网卡 连不上网
  7. 一起做激光反光板(一)-EKF定位公式推导
  8. 负和、零和与正和(博弈论的诡计)
  9. Matlab软件使用讲解(5),Matlab数学工程计算2023a中文版下载安装教程
  10. ceph 版本升级_Ceph V10.2.0 Jewel正式版本发布