转自:http://blog.csdn.net/fenzhi1988/article/details/44809779

调试驱动之前,首先先看看驱动代码,了解代码大致工作流程,再根据硬件配置驱动,比如硬件上面没有

中断脚,就不要在驱动里面配置中断方式。

bcmdhd驱动代码分析:

一. dhd_linux.c
dhd_module_init为驱动模块初始化函数。
初始化函数调用dhd_linux_platdev.c中dhd_wifi_platform_register_drv查找设备,注册驱动等。
 

二.   dhd_linux_platdev.c
        cfg_multichip=FALSE,所以dhd_wifi_platform_register_drv直接调用wifi_ctrlfunc_register_drv。

wifi_ctrlfunc_register_drv中先调用bus_find_device寻找平台设备,如果寻找到,接下来就会调用
platform_driver_register来注册平台设备驱动。注册完,就会调用平台驱动的probe函数进行驱动后
续初始化,但是这两个平台设备都没有注册。
        初始化wifi_adapter_info_t,把这个adapter传递给全局变量dhd_wifi_platdata,供其他函数使用。
使用dhd_wlan_control全局变量初始化adapter中的wifi_plat_data成员,而dhd_wlan_control全局变量
在下面调用dhd_gpio.c中的bcm_wlan_set_plat_data()初始化,dhd_wlan_control全局变量保存
set_power/set_carddetect/mem_prealloc这些底层控制接口。
       最后调用dhd_wifi_platform_load()->dhd_wifi_platform_load_sdio()
     dhd_wifi_platform_load_sdio()中,开始进行sdio设备枚举,adapter只有一个。尝试3次枚举,dhd_bus_reg_sdio_notify()
注册一个 dummy_sdmmc 驱动,其probe函数释放一个信号量,再调用wifi_platform_set_power()。
wifi_platform_set_power()函数调用adapter成员wifi_plat_data中的set_power开启模块电源,set_power已
经初始化为dhd_gpio.c的bcm_wlan_set_power(),bcm_wlan_set_power()只是设置引脚电平。
wifi_platform_set_power()函数调用成功,调用wifi_platform_bus_enumerate(adapter, TRUE);这个函
数调用adapter成员wifi_plat_data中的set_carddetect,真正调用的是dhd_gpio.c的bcm_wlan_set_carddetect()

三.    linux-3.4\drivers\net\wireless\bcmdhd\dhd_gpio.c
bcm_wlan_set_carddetect()调用sunxi_mci_rescan_card(sdc_id, 1);

四.   linux-3.4\drivers\mmc\host\sunxi-mci.c
sunxi_mci_rescan_card()函数软设置指定host的sdio卡可见,再调用mmc_detect_change()触发mmc探测历程。
如果发现总线上有设备,会调用上面的dummy驱动的probe函数释放信号量,在dhd_wifi_platform_load_sdio()中
等待的信号量就会成功唤醒,并跳出循环。

五.    linux-3.4\drivers\net\wireless\bcmdhd\dhd_linux_platdev.c
dhd_wifi_platform_load_sdio()跳出循环之后,继续调用dhd_bus_register()->bcmsdh_register()->bcmsdh_register_client_driver()
->sdio_register_driver()
sdio_register_driver()注册名为bcmsdh_sdmmc的驱动,此驱动注册注册完成,即进入bcmsdh_sdmmc_probe()。最后调用
sdioh_probe()进行真正的驱动初始化。sdioh_probe()->bcmsdh_probe()->drvinfo.probe()
drvinfo在bcmsdh_register()初始化。bcmsdh_register()调用处为dhd_bus_register()函数,设置为dhd_sdio变量,所以
drvinfo.probe()调用的是dhdsdio_probe()函数。

六.    linux-3.4\drivers\net\wireless\bcmdhd\dhd_sdio.c
dhdsdio_probe()函数继续深入初始化。这个函数里面有个变量dhd_download_fw_on_driverload,决定函数初始化流程,需要
修改为TRUE。

后面的代码越来越接近真正网络注册,基本上,到这里都比较正常,驱动差不多就可以顺利加载了,至于加载后出错的问题,很大原因是驱动没有

配置好,一般调试成熟的驱动代码或是其他代码的时候,首先要怀疑自己是不是正确的进行了配置。

驱动要加载固件,需要文件系统,所以驱动最好是做成ko。
硬件上,模块没有中断脚,所以需要设置为poll方式。
linux-3.4\drivers\net\wireless\bcmdhd\dhd_linux.c中修改dhd_poll,dhd_intr

开始调试

* 没有在系统配置文件里面声明sdio1有效,导致驱动不执行sdio相关probe函数
 在sys_config.fex声明sdio1有效。
* wifi_pm模块初始化太迟导致wifi模块不能正确获取电源相关操作资源。
 在wifi模块初始化之前直接调用wifi_pm模块初始化函数进行初始化。
* 修改module_num为8,在wifi_pm.c的函数wifi_pm_power里面case 7:后面增加case 8:
* module_pm模块初始化太迟,导致wifi模块不能正确获取电源相关操作资源。
 使用fs_initcall_sync提前初始化。
* 去掉wifi驱动Mafile中的-DOOB_INTR_ONLY

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4835821.html,如需转载请自行联系原作者

在全志平台调试博通的wifi驱动(类似ap6212)【转】相关推荐

  1. 博通蓝牙驱动linux,基于Android8.1的博通bcm89342蓝牙驱动的驱动移植记录-Go语言中文社区...

    说明 本文档是基于Android 8.1版本的一款博通蓝牙的驱动移植全过程记录.本驱动是通过/dev/ttyS2和蓝牙进行通信.因为较android以前的版本有很大变化尤其是上层关于蓝牙协议栈的部分, ...

  2. 基于Android8.1的博通bcm89342蓝牙驱动的驱动移植记录

    基于Android8.1的博通蓝牙BCM89342的驱动移植记录 说明 一 .软硬件平台 二.蓝牙移植流程 2.1 kernel 对蓝牙的驱动支持配置 2.2 kernel层编写蓝牙电源管理(bt r ...

  3. 全志平台boot框架中增加设备驱动过程分析

    全志平台boot框架中增加设备驱动过程分析 在boot启动阶段,大家都知道他的主要目的就是引导uboot,uboot在引导内核,从而让整个系统运作起来.全志的boot阶段,对应平板这一块,它会驱动LC ...

  4. android wifi驱动_OTT盒子WiFi方案首选:博通2T2R WiFi模块

    IT6356 WiFi模组简介 WiFi/BT/FM 3合1模块: 此模块为 2.4G + 5G 双频道,支持802.11a/b/g/n/AC,支持蓝牙 4.0:2T2R 双天线. 具有以下优势: 1 ...

  5. nexus5 博通芯片WIFI详解 (3)

    1        WLAN驱动结构介绍 1.1      SDIO驱动 在drivers/mmc下面是mmc卡,SD卡和SDIO卡驱动部分,其中包括host驱动,card驱动和core部分,由于网络接 ...

  6. nexus5 博通芯片WIFI详解 (1)

    1        WLAN技术 WLAN是英文WirelessLAN的缩写,就是无线局域网的意思.无线以太网技术是一种基于无线传输的局域网技术,与有线网络技术相比,具有灵活.建网迅速.个人化等特点.将 ...

  7. nexus5 博通芯片WIFI详解 (4)

    1        IOCTL的调用逻辑 之所以要分析这个,是因为上层wpa_supplicant和WIFI驱动打交道的方式,多半是通过ioctl的方式进行的,所以看看它的调用逻辑(这里只列出其主要的调 ...

  8. nexus5 博通芯片WIFI详解 (2)

    1        Wifi模块解析和启动流程 1.1      框架分析 WIFI整体框架如图所示: 首先,用户程序使用WifiManager类来管理Wifi模块,它能够获得Wifi模块的状态,配置和 ...

  9. linux博通2070蓝牙驱动,Broadcom博通BCM 2070/20702系列蓝牙设备驱动怎么样

    20 楼 华军网友 :2017-06-22 发表 之前听同学说这里有Broadcom博通BCM 2070/20702系列蓝牙设备驱动12.0.1.305版下载,还真有,我找Broadcom博通BCM ...

  10. 全志D1-H芯片 如何移植 rtl8821cu wifi 驱动到 Linux-5.4内核?

    问题背景 移植 Linux-4.9 或之前的内核版本下的 wifi 驱动到 Linux-5.4 内核版本时会出现编译和运行错误, 该 FAQ 主要用于帮助开发人员解决驱动移植出现的问题. 问题分析 移 ...

最新文章

  1. LaTeX 表格旋转的设置
  2. R语言 (温度 随时间变化)
  3. Reboot分享第三期(已结束)
  4. FreeBSD中3D加速功能的启用
  5. C# 代码优化 性能优化【转】
  6. Mac入门--Apache/Php/Mysql的开启关闭
  7. VML编程之------oval圆rect矩型《VML极道教程》原著:沐缘华
  8. AirPods耳机mac端管理工具:AirBuddy
  9. 英语六级翻译训练:教育专题
  10. 白话SOA:面向服务+组件+架构
  11. java集合的相互转化(map,set,list,array)
  12. WCF中加密数据信息
  13. 使用trashcan恢复linux下误删的文件
  14. 如何把pdf文件变小一点
  15. 王者荣耀与英雄联盟:如何解决玩家骂人的问题?
  16. 拓嘉启远电商:为什么拼多多商品会掉资源位
  17. MySQL数据库存储过程
  18. tv球赛节目预告链结
  19. cef异常处理_cef js异常
  20. IDEA 创建package包

热门文章

  1. iPXE部署Ubuntu无盘系统
  2. gg 修改器游戏被保护_2.游戏so防封的制作思路
  3. acdsee免费版跳过注册账户_加快Win 10启动速度,直接跳过锁屏登录界面
  4. Java调用Gdal写Esri ShapeFile文件工具类
  5. 搜狗输入法PC版 v10.5.0.4726 去广告精简版
  6. 博主个人用的duilib版本
  7. Excel数据透视表教程小结
  8. 使用insightface进行人脸识别批量下载图片
  9. 最小生成树——贪心算法
  10. 安全测试之sql注入