文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何进行RK3399 camera驱动开发

2023-06-05 00:44

关注

如何进行RK3399 camera驱动开发,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Android camera驱动开发

概述

目前板子上有两路mipi rx,可以接双摄像头。

DTS配置

Enabled  isp

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

Enabled mipi对应的i2c

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

camera驱动(默认为OV9750)

android 驱动代码路径

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

编译生成的libisp_isi_drv_OV9750_A.so 放置于/vendor/lib/hw

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

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

xml 配置

根据电路图为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

如何进行RK3399 camera驱动开发

如何进行RK3399 camera驱动开发

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";   
             
        camera0: camera-module@10 {
           status = "okay";
           compatible = "omnivision,ov9750-v4l2-i2c-subdev";
           reg = <0x10>;             
           device_type = "v4l2-i2c-subdev";    
           clocks = <&cru SCLK_CIF_OUT>;     
           clock-names = "clk_cif_out";      
     
           pinctrl-names = "default";       
           pinctrl-0 = <&cam_default_pins>;      
     
           rockchip,pd-gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_LOW>;  
           rockchip,rst-gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>; 
     
           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-h = "80";         //模组水平可视角度配置
           rockchip,camera-module-fov-v = "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   //模块版本信息

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯