RK3399 camera驅動開發

tt7643066發表於2019-09-20
camera驅動開發

Android camera驅動開發

概述

目前板子上有兩路mipi rx,可以接雙攝像頭。

DTS配置

1、Enabled  isp

  1. & isp0  {
        status  =   "okay" ;
    };
    & isp1  {
        status  =   "okay" ;
    };
    & isp0_mmu  {
        status  =   "okay" ;
    };
    & isp1_mmu  {
        status  =   "okay" ;
    };

2、Enabled mipi對應的i2c

  1. & i2c1  {
        status  =   "okay" ;
    };

camera驅動(預設為OV9750)

1、android 驅動程式碼路徑

hardware/rockchip/camera/SiliconImage/isi/drv/OV9750_A

2、編譯生成的libisp_isi_drv_OV9750_A.so 放置於/vendor/lib/hw

3、cp hardware/rockchip/camera/SiliconImage/isi/drv/OV9750_A/calib/ OV9750_A.xml  /vendor/etc/

4、cp hardware/rockchip/camera/Config/cam_board_rk3399.xml /vendor/etc/cam_board.xml

xml 配置

1、根據電路圖為camera上電,並配置rst,pdn,以下按mipi0配置電壓以及相關gpio,I2C通道(1),mipi phy 通道(0),IO 電壓 1.8v、CORE電壓1.8v、模擬電壓:3.2v,具體請看電路圖、以及OV9750 datasheet。

Linux camera驅動開發

概述

RK3399Pro toybrick  開發板分別帶有兩個MIPI,一個DVP攝像頭介面,MIPI支援最高4K拍照,並支援 1080P 30fps以上影片錄製。此外,開發板還支援 USB 攝像頭。

本文以  OV9750  攝像頭為例,講解在該開發板上的配置過程。

配置原理

由以下電路圖可知,兩路MIPI攝像頭連線的是不同的ISP和I2C通道。

MIPI0 :使用 ISP0 I2C1 ,還需配置 MIPI_MCLK0 MIPI_PDN MIPI_RST

MIPI1 :使用 ISP1 I2C2 ,還需配置 MIPI_MCLK_T2 JMIPI_PDN2 JMIPI_RST2


DTS配置

配置isp節點

  1. cif_isp0 :  cif_isp@ff910000  {
                compatible  =   "rockchip,rk3399-cif-isp" ;
                rockchip , grf  =   <& grf >;
                reg  =   < 0x0   0xff910000   0x0   0x4000 >,   < 0x0   0xff968000   0x0   0x8000 >;
                reg - names  =   "register" ,   "dsihost-register" ;
                clocks  =
                     <& cru ACLK_ISP0_NOC >,   <& cru ACLK_ISP0_WRAPPER >,
                     <& cru HCLK_ISP0_NOC >,   <& cru HCLK_ISP0_WRAPPER >,
                     <& cru SCLK_ISP0 >,   <& cru SCLK_DPHY_RX0_CFG >,
                     <& cru SCLK_CIF_OUT >,   <& cru SCLK_CIF_OUT >,
                     <& cru SCLK_MIPIDPHY_REF >;
                clock - names  =
                     "aclk_isp0_noc" ,   "aclk_isp0_wrapper" ,
                     "hclk_isp0_noc" ,   "hclk_isp0_wrapper" ,
                     "clk_isp0" ,   "pclk_dphyrx" ,
                     "clk_cif_out" ,   "clk_cif_pll" ,
                     "pclk_dphy_ref" ;
                interrupts  =   < GIC_SPI  43  IRQ_TYPE_LEVEL_HIGH  0 >;
                interrupt - names  =   "cif_isp10_irq" ;
                power - domains  =   <& power RK3399_PD_ISP0 >;
                rockchip , isp , iommu - enable  =   < 1 >;
                iommus  =   <& isp0_mmu >;
                status  =   "disabled" ;
                       };
    & isp0  {
       status  =   "okay" ;
            };
     
    & isp0_mmu  {
        status  =   "okay" ;
                };
    & cif_isp0 {
    rockchip , camera - modules - attached = <& camera0 >;
      status = "okay" ;
    };

設定CPU MCLK引腳功能

  1. & pinctrl  {
    /* */
         cam_mclk  {
              cam_default_pins :  cam - default - pins  {
                                rockchip , pins  =   < 2   11  RK_FUNC_3  & pcfg_pull_none >;
                                           };
                 };
               };

在i2c上配置camera節點,mipi0 camera連線到i2c1上

  1. & i2c1  {
             status  =   "okay" ;     /* 使能i2c1 */
              /*
             * 一般寫成cameraX:camera-module@ID,其中X為序號,ID為camera的7bit I2C地址
                      * camera0表示節點名,繫結isp節點時,將camera0 attach到isp0
                      */
        camera0 :  camera - module @ 10   {
           status  =   "okay" ;
           compatible  =   "omnivision,ov9750-v4l2-i2c-subdev" ;
           reg  =   < 0x10 >;               /* 7bit I2C地址 */
           device_type  =   "v4l2-i2c-subdev" ;      /* 無需修改 */
           clocks  =   <& cru SCLK_CIF_OUT >;       /* 無需修改,時鐘源選擇 */
           clock - names  =   "clk_cif_out" ;        /* 無需修改,時鐘源名字 */
     
           pinctrl - names  =   "default" ;         /* 無需修改,透過pinctrl配置MCLK引腳 */
           pinctrl - 0   =   <& cam_default_pins >;        /* 無需修改,與上文的pinctrl定義一致 */
     
           rockchip , pd - gpio  =   <& gpio4 RK_PD1 GPIO_ACTIVE_LOW >;    /* PD管腳分配及有效電平 */
           rockchip , rst - gpio  =   <& gpio4 RK_PD2 GPIO_ACTIVE_LOW >;   /* RST管腳分配及有效電平 */
     
           rockchip , camera - module - mclk - name  =   "clk_cif_out" ;     /* 無需修改 */
           rockchip , camera - module - facing  =   "back" ;         //前後置配置
           rockchip , camera - module - name  =   "MDG001" ;         //Camera 模組名稱
           rockchip , camera - module - len - name  =   "NONE" ;        //Camera 模組鏡頭
           rockchip , camera - module - fov - =   "80" ;           //模組水平可視角度配置
           rockchip , camera - module - fov - =   "65" ;           //模組垂直可視角度配置
           rockchip , camera - module - orientation  =   < 0 >;        //模組角度設定
           rockchip , camera - module - iq - flip  =   < 0 >;          //IQ 上下翻轉
           rockchip , camera - module - iq - mirror  =   < 0 >;         //IQ 左右映象
            //以上 2 個屬性控制攝像頭的效果引數映象配置,一般都是設定成 0,但是發現以下現象:拍攝白牆,圖片的上半部偏色與下半部偏色不一致,或者左右半部偏不一致,即可以將這2個屬性置成1。
           rockchip , camera - module - flip  =   < 1 >;
           rockchip , camera - module - mirror  =   < 1 >;
            //以上 2 個屬性控制攝像頭驅動中的映象配置,如果影像旋轉 180 度,可以將這 2 個屬性修改成相反的值即可旋轉 180。
           rockchip , camera - module - defrect0  =   < 1280   960   0   0   1280   960 >;   //根據攝像頭解析度進行設定
     
           rockchip , camera - module - flash - support  =   < 0 >;          //閃光燈支援
           rockchip , camera - module - mipi - dphy - index  =   < 0 >;         //mipi口配置,根據物理連線定義
            as - master  =   < 0 >;
       };
    };

驅動說明

與攝像頭相關的程式碼目錄如下:

  1. drivers / media / i2c / soc_camera / rockchip
    |--  ov9750_v4l2 - i2c - subdev . c     // OV9750驅動
    |--  ov_camera_module . c        // OV系列公共函式
    |--  ov_camera_module . h        //
    |--  rk_camera_mclk . c         // RK Camera MCLK時鐘訊號管理
    |--  rk_camera_mclk . h
    |--  rk_camera_module . c        // RK 系列公共函式
    `-- rk_camera_module_version.h   //模組版本資訊


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69948385/viewspace-2657649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章