一:加载wifi驱动模块

在hardware/libhardware_legacy/wifi/wifi.c调用函数

insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG)

其中

DRIVER_MODULE_PATH = /system/lib/dhd.ko

DRIVER_MODULE_ARG  = "firmware_path=/etc/wifi/40181/fw_bcm40181a2.bin nvram_path=/etc/wifi/40181/nvram.txt"

二:wifi驱动模块运行

wifi驱动入口dhd_module_init(void) ... dhd_linux.c

dhd_module_init(void)
{int error = 0;DHD_TRACE(("%s: Enter\n", __FUNCTION__));wl_android_init(); //初始化dhd_msg_level |= DHD_ERROR_VAL,给iface_name赋值为wlando {sema_init(&dhd_chipup_sem, 0);dhd_bus_reg_sdio_notify(&dhd_chipup_sem);//注册sdio driver,支持如下图wifi列表,sdio驱动获取wifi列表的设备后调用dummy_probe() --> up(dhd_chipup_sem)dhd_customer_gpio_wlan_ctrl(WLAN_POWER_ON);if (down_timeout(&dhd_chipup_sem, //2000ms超时等待msecs_to_jiffies(POWERUP_WAIT_MS)) == 0) {dhd_bus_unreg_sdio_notify();chip_up = 1;break;}DHD_ERROR(("\nfailed to power up wifi chip, retry again (%d left) **\n\n",retry+1));dhd_bus_unreg_sdio_notify();dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF);} while (retry-- > 0);if (!chip_up) {DHD_ERROR(("\nfailed to power up wifi chip, max retry reached, exits **\n\n"));return -ENODEV;}sema_init(&dhd_registration_sem, 0);error = dhd_bus_register();//详细分析看<三>,注册dhd_sdio驱动,最终会调用到dhd_net_attach();if (!error)printf("\n%s\n", dhd_version);else {DHD_ERROR(("%s: sdio_register_driver failed\n", __FUNCTION__));goto fail_1;}/** Wait till MMC sdio_register_driver callback called and made driver attach.* It's needed to make sync up exit from dhd insmod  and* Kernel MMC sdio device callback registration*/if ((down_timeout(&dhd_registration_sem,//函数dhd_net_attach() --> up(&dhd_registration_sem);msecs_to_jiffies(DHD_REGISTRATION_TIMEOUT)) != 0) ||(dhd_registration_check != TRUE)) {error = -ENODEV;DHD_ERROR(("%s: sdio_register_driver timeout or error \n", __FUNCTION__));goto fail_2;}wl_android_post_init();return error;fail_2:dhd_bus_unregister();fail_1:/* Call customer gpio to turn off power with WL_REG_ON signal */dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF);return error;
}

三:dhd_bus_register(void) ... dhd_sdio.c分析

bcmsdh_register(&dhd_sdio)会调用pci_register_driver(&bcmsdh_pci_driver)注册一个pci类型的驱动,如果匹配到bcmsdh_pci_devid就会调用到bcmsdh_pci_probe --> drvinfo.attach --> drvinfo.attach ,最终调用到dhd_sdio->dhdsdio_probe,接下来分析dhdsdio_probe函数

四:dhdsdio_probe() ... dhd_sdio.c分析

dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot,uint16 func, uint bustype, void *regsva, osl_t * osh, void *sdh)
{int ret;dhd_bus_t *bus;/* attach the common module */dhd_common_init(osh);/* attempt to attach to the dongle */if (!(dhdsdio_probe_attach(bus, osh, sdh, regsva, devid))) {DHD_ERROR(("%s: dhdsdio_probe_attach failed\n", __FUNCTION__));goto fail;}/* Attach to the dhd/OS/network interface */ //创建3个线程,分别是dhd_watchdog_thread、dhd_dpc、dhd_sysiocif (!(bus->dhd = dhd_attach(osh, bus, SDPCM_RESERVE))) {DHD_ERROR(("%s: dhd_attach failed\n", __FUNCTION__));goto fail;}/* Allocate buffers */if (!(dhdsdio_probe_malloc(bus, osh, sdh))) {DHD_ERROR(("%s: dhdsdio_probe_malloc failed\n", __FUNCTION__));goto fail;}if (!(dhdsdio_probe_init(bus, osh, sdh))) {DHD_ERROR(("%s: dhdsdio_probe_init failed\n", __FUNCTION__));goto fail;}if (bus->intr) {/* Register interrupt callback, but mask it (not operational yet). */DHD_INTR(("%s: disable SDIO interrupts (not interested yet)\n", __FUNCTION__));bcmsdh_intr_disable(sdh);if ((ret = bcmsdh_intr_reg(sdh, dhdsdio_isr, bus)) != 0) {DHD_ERROR(("%s: FAILED: bcmsdh_intr_reg returned %d\n",__FUNCTION__, ret));goto fail;}DHD_INTR(("%s: registered SDIO interrupt function ok\n", __FUNCTION__));} else {DHD_INFO(("%s: SDIO interrupt function is NOT registered due to polling mode\n",__FUNCTION__));}DHD_INFO(("%s: completed!!\n", __FUNCTION__));//获取wifi MAC地址ret = dhd_custom_get_mac_address(ea_addr.octet);/* if firmware path present try to download and bring up bus */if (dhd_download_fw_on_driverload) {  //更新模组firmware、nvram,其中使用了filp_open、kernel_read、filp_close进行文件系统的操作if ((ret = dhd_bus_start(bus->dhd)) != 0) {DHD_ERROR(("%s: dhd_bus_start failed\n", __FUNCTION__));goto fail;}}/* Ok, have the per-port tell the stack we're open for business */if (dhd_net_attach(bus->dhd, 0) != 0) {DHD_ERROR(("%s: Net attach failed!!\n", __FUNCTION__));goto fail;}return bus;fail:dhdsdio_release(bus, osh);return NULL;
}

BCM wifi分析相关推荐

  1. wifi共享大师电脑版_Wifi分析助手PC版-Wifi分析助手电脑版下载 v7.2.2-

    WIFI分析助手电脑版是一款非常实用的wifi信道分析软件,Wifi分析助手电脑版可以帮助用户分析wifi信道信息,帮助用户挑选优质的wifi信号,提升wifi连接效率,信号稳定,是你工作生活中的好帮 ...

  2. Wifi分析之三:Wifi连接分析

    Wifi连接 具体流程参见以下流程图 具体过程;以后有空我会全部完善,带领大家分析代码

  3. android系统 wifi,Android系统wifi分析-手动连接过程

    1.已保存显示时间较长 16:59:50~16:59:55 原因是,刚好系统保存热点信息里边没有该热点:没有匹配上: 07-16 16:59:51.017 1318 2154 D WifiServic ...

  4. android wifi模块分析

    声明:本文纯属网上资料收集,版权归源作者所有,转载时请标明为转载文章 现在对android平台的wifi模块了解了一段时间,现在做一些简要总结,以便以后查阅和与修正,上正文. [Wifi模块学习流程] ...

  5. 在MAC OS上进行Wi-Fi抓包和空中包分析

    一. 背景        做无线开发的最头疼的就是连得好好的,为什么突然连不上了,想找出原因的时候,除了看当前的log外,剩下的就是现场的空中包.但是抓空中包往往需要专业的工具和软件,目前听的比较多的 ...

  6. 9个高招,让企业WiFi速度飞起来!

    曾几何时,那些有着快速的Wi-Fi无线网络连接企业办公环境的日子已经一去不复返了.在彼时的企业办公环境下,企业为客户和员工提供快速.可靠的无线网络已然是必不可少的了. 对于无线网络而言,恰当的现场实地 ...

  7. wifi 信道_说了这么久的信道和频宽,这回总算能弄明白啦

    转自头条号ZBT科研站 为了让家里各处信号都满格,太多的人进行了思考和折腾.通过多方实验证明,改变信道是改善家庭中wifi信号差问题的办法之一. 因此下面我们来了解一下,拥挤的信道路由器怎么设置才能够 ...

  8. 极酷WIFI深度剖析免费WIFI

    极酷WIFI深度剖析免费WIFI   极酷WIFI分析,在未来几年内,广东居民将可在更多公共场所享受免费WiFi服务.在公共WiFi建设方面,广东除了发挥电信运营商作用外,还正在研究引入第三方机构.鼓 ...

  9. getconnectiontimeoutexception 网络问题排查_家里wifi信号差?给小白的无线排查操作指南...

    家用无线信号排查手册 你是不是发现总会有这样的一些情况,网络突然觉得很慢,或经常连接不到无线信号?一般人在家里遇到这种情况,最简单的办法就是关掉wifi,我用流量还不行么?(土豪--)在这里分享一下排 ...

  10. Android之wifi工作流程

    Android Wifi的工作流程 一.WIFI工作相关部分 Wifi 网卡状态 1.    WIFI_STATE_DISABLED:WIFI网卡不可用 2.    WIFI_STATE_DISABL ...

最新文章

  1. what is success?
  2. 初谈Git(本机克隆项目远程仓库)
  3. gtest 测试java_LangTest
  4. php @touch,touch - [ php中文手册 ] - 在线原生手册 - php中文网
  5. TF使用例子-情感分类
  6. 使用 Redis的SETNX命令实现分布式锁
  7. 不要浪费没有标注的数据!超强文本半监督方法MixText来袭!
  8. 计算机高级职称答辩ppt模板,毕业论文答辩PPT模板优秀 范例 11.ppt
  9. 【】论晚睡晚起的危害
  10. 别人的域名到期后可以抢注吗
  11. python力导向图_力导向 (Force-directed) 布局算法绘图(布点)的简单实现
  12. Neuralizing Regular Expressions for Slot Filling 神经网络转回自动机
  13. 2021高考俄语成绩查询,2021年俄语专业大学排名及分数线【统计表】
  14. 通过Keycloak API理解OAuth2与OpenID Connect
  15. c语言图形学三角形平移,MFC怎么对所画几何图形进行旋转、填充、放缩???(急用)【...
  16. 从翻唱到原创,抖音千万粉丝网红郭聪明是如何养成的?
  17. XAMPP的MySQL配置
  18. 文史 篇一:《万历十五年》--黄仁宇
  19. 太空上新 | 张肇达 张凯惠:嫦娥奔月有了现实版
  20. C#模拟QQ项目源代码

热门文章

  1. Linux运维工程师发展
  2. 应届毕业生年薪50W,你敢相信吗?
  3. 程序员的情怀《从前慢》木心
  4. MacBook不断重启的 5 个原因以及如何解决此问题
  5. 联想官方OEM分区制作
  6. [转] 数学原理浅谈一下《黑客帝国》
  7. 【esxi跑网心云(cdn)软路由拨号】esxi服务器使用ikuai虚拟机拨号并配置家庭路由器上网
  8. 极速下载!利用插件破解百度云限速
  9. matlab编程螺旋oam,一种多模态OAM涡旋电磁波微带阵列天线制造技术
  10. 浅谈python深拷贝和浅拷贝