RK3588 适配imx464 摄像头

RK3588 适配imx464 摄像头 毛巾卷 2024-01-03 07:50:42 1750

前言

总结一下自己最近在RK3588 上适配imx464的经验。

简介

imx464在rk3588上面适配还是比较简单,不需要花费太多的时间,因为驱动已经有了,也有可以参考的设备树借鉴,再加上官方的文档rk3588_docs-main\Common\CAMERA\ISP3X\Rockchip_Driver_Guide_VI_CN_v1.1.1.pdf和已经有调试好的imx464的isp文件,我这边主要是根据硬件这边提供的板子还是摄像头板子做了一些调整,适配了一下,花了两天的时间实现能够正常取图使用,后面想调一调isp玩一下的,但拿到软件后苦于没有资料和技术支持发现搞不动就放弃了,点到即止了则。

硬件

RK3588 + imx464,使用的接口是 dphy1线上的mipi,mipi为4lane的。

软件

驱动

官方的SDK里面是有imx464的驱动的,在这个路径下kernel/drivers/media/i2c/imx464.c,我们只需要在menuconfig里面去开启即可,编译后烧录到板子中,在启动日志里面就能看到imx464的信息了,但是还不能用,因为还没有配置硬件。

设备树

设备树的话参考官方的文档还有sdk里面现有的设备树。

这张图是《Rockchip_Driver_Guide_VI_CN_v1.1.1.pdf》里面有的,大家可以参考里面,我这里要配置的是mipi camera4这一条路,我使用dphy1的full mode模式,4线,所以就是选择这一条,具体要配置哪一条通道是根据自己的硬件来决定的,文档里面有详细说明。

首先是配置i2c,我是挂载在了i2c5m0上,然后imx464的iic地址是0x1a(不算读写位)。
camera4 -> csi2_dphy4

&i2c5 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&i2c5m0_xfer>;

    /* */
    imx464: imx464@1a {
        compatible = "sony,imx464"; //名称
        reg = <0x1a>;   //i2c地址
        status = "okay";

        clocks = <&cru CLK_MIPI_CAMARAOUT_M4>;  //MIPI_CAMERA4_CLK_M1,时钟配置
        clock-names = "xvclk";
        pinctrl-names = "default";
        pinctrl-0 = <&mipim1_camera4_clk>;    //要根据自己实际的情况来

        // avdd-supply = <&vcc_mipicsi1>;

        power-domains = <&power RK3588_PD_VI>;
        pwdn-gpios= <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>;
        reset-gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>;

        //匹配的是external\camera_engine_rkaiq\iqfiles\isp3x下面的iq文件
        //imx464_CMK-OT1980-PX1_SHG102.json
        //默认厂家提供的文件系统里面也已经放置了这个文件 /etc/iqfiles/imx464_CMK-OT1980-PX1_SHG102.json
        rockchip,camera-module-index = <0>;                    
        rockchip,camera-module-facing = "back";            //前置或后置
        rockchip,camera-module-name = "CMK-OT1980-PX1";    
        rockchip,camera-module-lens-name = "SHG102";
        // ir-cut = <&cam_ircut0>; //可以配置ir-cut的引脚,我的是自己控制gpio的,没有集成瑞芯微的这一套,想用瑞芯微那一套去控制的就需要按照规则去配置gpio和加载驱动

        port {
            imx464_out: endpoint {
                remote-endpoint = <&csidphy3_in>;//参考那个流程图链接到下一个目标,out->in
                data-lanes = <1 2 3 4>;//4lane
            };
        };
    };
};

csi2_dphy4 -> mipi4_csi2

// 使用dphy1的full mode模式,4线
// 当dphy1_hw使用full mode时,链路需要按照csi2_dphy4这条链路来配置,但是节点名称
// csi2_dphy4需要修改为csi2_dphy3,软件上是通过phy的序号来区分phy使用的模式。
&csi2_dphy1_hw {
    status = "okay";
};

&csi2_dphy3 {
    status = "okay";
    ports {
        #address-cells = <1>;
        #size-cells = <0>;
        port@0 {
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;
            csidphy3_in: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&imx464_out>;
                data-lanes = <1 2 3 4>;
            };
        };

        port@1 {
            reg = <1>;
            #address-cells = <1>;
            #size-cells = <0>;
            csidphy3_out: endpoint@0 {
                reg = <0>;
                remote-endpoint = <&mipi4_csi2_input>;
            };
        };
    };
};

mipi4_csi2 -> rkcif_mipi_lvds4

&mipi4_csi2 {
    status = "okay";

    ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@0 {
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;

            mipi4_csi2_input: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&csidphy3_out>;
            };
        };

        port@1 {
            reg = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            mipi4_csi2_output: endpoint@0 {
                reg = <0>;
                remote-endpoint = <&cif_mipi_in4>;
            };
        };
    };
};

rkcif_mipi_lvds4 -> rkcif_mipi_lvds4_sditf

&rkcif {
    status = "okay";
};

&rkcif_mipi_lvds4 {
    status = "okay";

    port {
        cif_mipi_in4: endpoint {
            remote-endpoint = <&mipi4_csi2_output>;
        };
    };
};

&rkcif_mipi_lvds4_sditf {
    status = "okay";

    port {
        mipi_lvds4_sditf: endpoint {
            remote-endpoint = <&isp1_vir1>;
        };
    };
};

&rkcif_mmu {
    status = "okay";
};

rkcif_mipi_lvds4_sditf -> rkisp1_vir1

&rkisp1 {
    status = "okay";
    /* the max input w h and fps of mulit sensor */
    //max-input = <2688 1520 30>;多摄sensor分辨率不一样,需要配置
};

&isp1_mmu {
    status = "okay";
};

&rkisp1_vir1 {
    status = "okay";
    port {
        #address-cells = <1>;
        #size-cells = <0>;
        isp1_vir1: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&mipi_lvds4_sditf>;
        };
    };
};

设备树配置到这里就可以了,编译烧录启动,就成功在/dev/下对应的video设备了,通过gst命令测试可以正常出图,好了,收工。

sudo gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=1920,height=1080, framerate=30/1 ! mpph264enc ! filesink location=test.h264

结尾

虽然正常出图了,但是还是有点小问题media-ctl用不了,不知道为啥,希望有大神可以指点一下,有什么问题也欢迎大家帮我指正。

参考链接和文档:

https://zhuanlan.zhihu.com/p/634169058
《Rockchip_Driver_Guide_VI_CN_v1.1.1.pdf》

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 3 3 评论 打赏
评论
1个
内容存在敏感词
手气红包
  • 李卓凡 2024-04-15 22:51:39
    回复
    不错的
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
毛巾卷
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区