參看博客:
Android camera架構:
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腳狀態來判斷是否成功。
-----------------------------完,當前看代碼理解是這樣,可能有偏差---------------------------