高通 8x26 android sensor 初始化

初始化从adsp_proc/Sensors/dsps/src/common/sns_pd.c的main函数开始
0. main()
  1. coremain_main()//看不到函数原型
  1. sns_init()  //主线
    2. sns_profiling_init() //电源初始化
    2. sns_init_once()//主线
      3. 用for循环依次执行宏SNS_INIT_FUNCTIONS定义的函数:
      sns_init_dsps,           // 初始化DSPS services
      sns_em_init,             //初始化Event Manager
      sns_smgr_init,           //主线,starts smgr task
      sns_sam_init,            //Creates the SAM task and internal databases.
      sns_scm_init,            //Creates the SCM task and internal databases.
      sns_debug_init,          //Creates the debug task
      smgr_qmi_ping_client_start//?貌似是创建与主芯片通信线程

1. sns_smgr_task()//sns_smgr_init创建此task
  2.跳过各种初始化,直接进入main loop的while(1)循环中:
  sns_smgr_process_msg()按顺序smgr_ssi_devinfo[],先处理注册表数据的devinfo,把设备和驱动对应起来,存储到smgr_sensor_cfg中,按顺序smgr_ssi_devinfo[]
    3. sns_smgr_process_reg_data()
      4. sns_smgr_process_reg_devinfo()
        5. sns_smgr_parse_reg_devinfo_resp()//只处理一类sensor
      6. 一类sensor最多可兼容6种芯片,循环6次:
            如果支持probe,就使用probe函数检测,如果检测到设备就调用:
        7. sns_smgr_populate_cfg_from_devinfo(),退出循环,返回。
            如果不支持probe,就假设已经连接,直接调用:
        7. sns_smgr_populate_cfg_from_devinfo(),退出循环,返回。//??不理解,这样只会填充第一个此类型的sensor的配置,又不知道对不对。

        5. 处理完smgr_ssi_devinfo[]中最后一个设备后调用:
        for(3){
    5. sns_smgr_populate_ssi_cfg_from_smgr_cfg()//将全局结构smgr_sensor_cfg拷贝到一个临时变量中
        5. sns_smgr_update_reg_data()
      6. sns_smgr_send_req(smgr_reg_cl_user_handle)
        5. sns_hw_update_ssi_reg_items()//初始化GPIO,I2C
          如果是SSI:初始化sns_smgr_hw_gpio_cfg和sns_smgr_hw
      6.最后一个smgr_ssi_cfg初始化后:
      sns_hw_init_i2c_bus_config()
      SMGR_BIT_SET(sns_smgr.flags, SMGR_FLAGS_HW_INIT_B);
      如果是SNS_REG_GROUP_SSI_GPIO_CFG_V02:初始化sns_smgr_hw_gpio_cfg
          6. sns_smgr_req_reg_data(SNS_SMGR_REG_ITEM_TYPE_GROUP)
    }
      5. sns_smgr_req_reg_data

前面已将SMGR_FLAGS_HW_INIT_B置true,回到sns_smgr_task()的while(1)执行:
1. sns_smgr_dd_init()//初始化所有sensor

你可能感兴趣的:(驱动开发)