[RK3399][Android7.1] Camera HAL初始化流程
阿新 • • 發佈:2019-02-11
Platform: rk3399
OS: Android 7.1
Kernel: v4.4.83
camera_get_number_of_cameras -> //camera service會在開機的時候從HAL層獲取camera number.
camera_board_profiles::getInstance -> //解析camera board檔案
createInstance ->
new camera_board_profiles //建立一個物件用於儲存檔案中的引數
fopen(RK_BOARD_XML_PATH, "r" ); //板子上是/system/etc/cam_board.xml,程式碼中是hardware/rockchip/camera/Config/cam_board_rk3399.xml
fread //讀取xml
XML_SetElementHandler -> //核心解析在於StartElementHandler()這函式回撥
new rk_cam_total_info //每建立一個代表一個device,後面會看到代表sensor的結構體:rk_sensor_info,不要弄混淆
nCamDev2 = profiles->mDevieVector.size //表示當前xml中一共配置了幾個sensor
nDVnum2 = profiles->mCurDevice->mSoftInfo.mDV_vector.size //當前device支援的dv config總數
camera_board_profiles::LoadSensor(profiles); ->
fopen(dst_file, "r"); //刷機後第一次起來/data/media_profiles_tmp.xml是不存在的,需要建立,因此會註冊所有board xml中配置的sensor
OpenAndRegistALLSensor ->
OpenAndRegistOneSensor -> //依次註冊
dlopen //嘗試開啟system/lib/hw/下有沒有libisp_isi_drv_XXX.so,XXX為sensor name,比如這裡是OV13850
dlsym //載入so中對應的symbol,名為"IsiCamDrvConfig",定義在OV13850_MIPI.c,結構為struct IsiCamDrvConfig_s,如果要自己新增sensor,結構一定要按照它這樣寫。
pIsiCamDrvConfig->pfIsiGetSensorIss ->
OV13850_IsiGetSensorIss OV13850_MIPI.c //填充isi sensor描述符結構體
pIsiCamDrvConfig->pfIsiGetSensorI2cInfo ->
OV13850_IsiGetSensorI2cInfo //獲取sensor對應的i2c資訊
RegisterSensorDevice //嘗試註冊sensor為i2c裝置,這裡正式要和kernel driver通訊了。
open //mCamsysDevPath是從board xml檔案中的SensorHostDevID解析出來的,表示isp裝置"/dev/camsys_marvin",而且用isp0還是isp1由phyIndex屬性值決定
ioctl(camsys_fd, CAMSYS_VERCHK, &(pCamInfo->mCamsysVersion)); //檢查版本
ioctl(camsys_fd, CAMSYS_REGISTER_DEVIO, &extdev); //註冊dev到kernel中
rk_sensor_pwrseq //上電
ioctl(camsys_fd, CAMSYS_I2CWR, &i2cinfo); //執行reset操作
access(pLoadSensorInfo->mSensorXmlFile, R_OK) //如果raw格式的sensor,那麼還要找到對應的calibration檔案
pcalidb->CreateCalibDb //建立Calibration資料庫
if(cam_cnt<CAMERAS_SUPPORT_MAX) //這個判斷表示系統支援兩個mipi csi口,如果前面已經有兩個了csi sensor識別到了,那麼下面的流程就不走了,因為csi不走v4l2,目前只看到uvc走v4l2,cif驅動沒編譯進去。
open(cam_path, O_RDONLY); //這裡開始操作v4l2裝置 "/dev/video"
ioctl //查詢sensor能力,cmd: VIDIOC_QUERYCAP
camera_board_profiles::ProduceNewXml //根據已經註冊的sensor資訊建立對應的profile檔案,位於/data/camera/media_profiles.xml