qcom camera代碼probe流程

參看博客:

       Android camera架構:

                  https://blog.csdn.net/weijory/article/details/54614112?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase       

Android Camera MSM HAL:

                   https://www.cnblogs.com/klcf0220/p/8425126.html

也寫一篇博客,根據網上看的和自己看的代碼,也總結一下流程。
主要是從vendor下sensor_init.c中probe到kernel層上電probe檢測的流程。

module_sensor_init()                                            //module_sensor.c
        |
        |
 //創建mct, camera引擎
        ---> s_module = mct_module_create(name)  

 //初始化sensor module control structure               
        ---> module_sensor_ctrl_t        *module_ctrl

//probe sensor
        ---> sensor_init_probe(module_ctrl)     
       
//其他的subdev,比如actuator, eeprom, flash, cis, ois
        --->module_sensor_find_other_subdev(module_ctrl);

//然後是執行mct_list_traverse,分別初始化
                module_sensors_subinit, 
                port_sensor_create,
                module_sensor_init_eeprom, 
                module_sensor_init_chromatix

然後看一下sensor_init_probe:

1.枚舉/dev/media*, 然後用ioctl打開,獲得mdev_info, 比較是不是msm_config,不是就結束

2.sd_fd = open(subdev_name, O_RDWR);                          //獲得文件描述符

3.ret = sensor_init_eebin_probe(module_ctrl, sd_fd);        //eebin相關,暫時不太瞭解 

4.ret = sensor_init_eebin_probe(module_ctrl, sd_fd);        //解析camera xml配置文件

 然後看下sensor_init_xml_probe:

這個函數用來解析vendor下msm8953_camera.xml, 然後進行sensor probe:
步驟:
    1.獲得xml路徑
    2.檢查根節點CameraModuleConfig個數,判斷有幾個camera
    3.for循環判斷是否已經probe,沒有就進行sensor_probe()

-----------
其中第一步中:
    先檢查路徑 CONFIG_XML_PATH + CONFIG_XML = “/data/misc/camera/camera_config.xml”
    然後判斷系統屬性persist.camera.csidtg.enable是否設置,爲1就檢查
    CONFIG_XML_SYSTEM_PATH + CONFIG_XML = "/system/etc/camera/camera_config.xml"

這個是out下最終生成的xml

然後看下sensor_probe:

1.調用sensor_load_libbrary()            //加載libmmcamera_ov7251.so這類庫文件
                                   //這個函數調用的dlsy打開庫,返回符號地址,通過地址調用方法

2.從返回的地址獲得上電時序power_setting_array

3.然後是malloc申請空間這些,主要目的是把xml裏的信息,複製到變量slave_info中
                        //struct msm_camera_sensor_slave_info slave_info

4.把slave_info傳到kernel層,通過ioctl(fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg)的方式
                        //這裏slave_info是cfg的成員
                        //對應kernel:
                        //傳入的命令碼是VIDIOC_MSM_SENSOR_INIT_CFG
                        //cfg.cfgtype = CFG_SINIT_PROBE;

5.執行完ioctl, 通過返回的cfg.probed_info.session_id在這一層判斷是否probe成功

然後根據VIDIOC_MSM_SENSOR_INIT_CFG這命令碼看下kernel層:

對應的是:
        driver/media/platform/msm/camera_v2/sensor/msm_sensor_init.c +117
	            case VIDIOC_MSM_SENSOR_INIT_CFG:

//上面cfg傳到這裏成了arg
//
static int32_t msm_sensor_driver_cmd(struct msm_sensor_init_t *s_init,void *arg)

這個函數中判斷了上面的cfg->cfgtype, 然後就執行了kernel底層的硬件probe

 72     switch (cfg->cfgtype) {
 73     case CFG_SINIT_PROBE:
 74         mutex_lock(&s_init->imutex);
 75         s_init->module_init_status = 0;
 76         rc = msm_sensor_driver_probe(cfg->cfg.setting,
 77                                             &cfg->probed_info,
 78                                                     cfg->entity_name);


最後執行到msm_sensor_driver_probe()
這個函數裏面做的一些事情,主要是把user層的camera信息複製到kerner層的結構體中

比如把上下電時序複製到msm_sensor_ctrl_t->sensordata->power_info中,
然後執行真正的上電檢測
           rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);

然後Create /dev/videoX node;

然後下電    s_ctrl->func_tbl->sensor_power_down(s_ctrl);


-------------------- --------------- 流程完 ---------------------------------------

補充一下上電函數

.sensor_power_up = msm_sensor_power_up
.sensor_power_down = msm_sensor_power_down
.sensor_match_id = msm_sensor_match_id,


//順便一提,匹配id是在上電最後做的,在上電函數中

msm_sensor_power_up()
        |
        |
        ---msm_camera_tz_i2c_power_up(sensor_i2c_client)
        |
        ---msm_camera_power_up(power_info, s_ctrl->sensor_device_type,sensor_i2c_client);
        |
        ---rc = msm_sensor_check_id(s_ctrl);
        

//msm_camera_power_up最終是通過pinctrl函數pinctrl_lookup_state檢測pin腳狀態來判斷是否成功。






-----------------------------完,當前看代碼理解是這樣,可能有偏差---------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章