1. 程式人生 > >[RK3399][Android7.1] Camera HAL初始化流程

[RK3399][Android7.1] Camera HAL初始化流程

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