转:BCM 中的WIFI分析情况

来源:互联网 发布:mac动态桌面壁纸 编辑:程序博客网 时间:2024/05/21 08:50

一:加载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

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. dhd_module_init(void)  
  2. {  
  3.     int error = 0;  
  4.   
  5.     DHD_TRACE(("%s: Enter\n", __FUNCTION__));  
  6.   
  7.     wl_android_init(); <span style="font-size:12px;color:#3333ff;">//初始化dhd_msg_level |= DHD_ERROR_VAL,给iface_name赋值为wlan</span>  
  8.   
  9.     do {  
  10.         sema_init(&dhd_chipup_sem, 0);  
  11.         dhd_bus_reg_sdio_notify(&dhd_chipup_sem); <span style="color:#3333ff;">//注册sdio driver,支持如下图wifi列表,sdio驱动获取wifi列表的设备后调用                                                                    //dummy_probe() --> up(</span><span style="color: rgb(51, 51, 255); font-family: Arial, Helvetica, sans-serif;">dhd_chipup_sem</span><span style="color: rgb(51, 51, 255); font-family: Arial, Helvetica, sans-serif;">);</span><span style="color:#3333ff;">  
  12. </span>     dhd_customer_gpio_wlan_ctrl(WLAN_POWER_ON);  
  13.                   
  14.         if (down_timeout(&dhd_chipup_sem,        <span style="color:#3333ff;">//2000ms超时等待<span style="font-family: Arial, Helvetica, sans-serif;">dhd_chipup_sem</span></span>  
  15.             msecs_to_jiffies(POWERUP_WAIT_MS)) == 0) {  
  16.             dhd_bus_unreg_sdio_notify();  
  17.             chip_up = 1;  
  18.             break;  
  19.         }  
  20.         DHD_ERROR(("\nfailed to power up wifi chip, retry again (%d left) **\n\n",  
  21.             retry+1));  
  22.         dhd_bus_unreg_sdio_notify();  
  23.         dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF);  
  24.     } while (retry-- > 0);  
  25.   
  26.     if (!chip_up) {  
  27.         DHD_ERROR(("\nfailed to power up wifi chip, max retry reached, exits **\n\n"));  
  28.         return -ENODEV;  
  29.     }  
  30.   
  31.     sema_init(&dhd_registration_sem, 0);  
  32.   
  33.     error = dhd_bus_register();     <span style="color:#3333ff;">//详细分析看<三>,注册dhd_sdio驱动,最终会调用到dhd_net_attach();</span>  
  34.   
  35.     if (!error)  
  36.         printf("\n%s\n", dhd_version);  
  37.     else {  
  38.         DHD_ERROR(("%s: sdio_register_driver failed\n", __FUNCTION__));  
  39.         goto fail_1;  
  40.     }  
  41.   
  42.     /* 
  43.      * Wait till MMC sdio_register_driver callback called and made driver attach. 
  44.      * It's needed to make sync up exit from dhd insmod  and 
  45.      * Kernel MMC sdio device callback registration 
  46.      */  
  47.     if ((down_timeout(&dhd_registration_sem,  <span style="color:#3333ff;">//函数dhd_net_attach() --> up(&dhd_registration_sem);</span>  
  48.         msecs_to_jiffies(DHD_REGISTRATION_TIMEOUT)) != 0) ||  
  49.         (dhd_registration_check != TRUE)) {  
  50.         error = -ENODEV;  
  51.         DHD_ERROR(("%s: sdio_register_driver timeout or error \n", __FUNCTION__));  
  52.         goto fail_2;  
  53.     }  
  54.   
  55.     wl_android_post_init();  
  56.   
  57.   
  58.     return error;  
  59.   
  60. fail_2:  
  61.     dhd_bus_unregister();  
  62.   
  63. fail_1:  
  64.   
  65.     /* Call customer gpio to turn off power with WL_REG_ON signal */  
  66.     dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF);  
  67.   
  68.     return error;  
  69. }  

三:dhd_bus_register(void)分析


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

0 0