提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、什么是mipi接口?
- 二、摄像头是如何把数据给到RK3568,又是如何处理
- 硬件连接关系图:
- 图像数据的来龙去脉
- 代码路径
- 三、如何移植
- 修改设备树:
- 总结
前言
本节内容介绍如何在RK3568中通过MIPI接口使用ov5695
一、什么是mipi接口?
MIPI(Mobile Industry Processor Interface)
是2003年由ARM, Nokia, ST ,TI等公司成立的一个联盟
目的:
是把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性
MIPI联盟下面有不同的WorkGroup,分别定义了一系列的手机内部接口标准,比如:
摄像头接口CSI
(DisplaySerialInterface)、
显示接口DSI
(DisplayCommandSet)、
射频接口DigRF
、
麦克风/喇叭接口SLIMbus
等
可以看出无论是CSI还是DSI还是其他都是mipi接口
其优点是:更低功耗、更高数据传输率和更小的PCB占位空间,并且专门为移动设备进行的优化,因而更适合手机和智能平板的连接。
本次我们是使用摄像头,所以使用的是mipi接口下的CSI接口。
信号
MIPI CSI2一般会有1对I2C通信引脚,1对MIPI差分时钟引脚和1~4对MIPI差分数据信号引脚,如图所示:
名称解释
DATA 1+ / DATA 1- MIPI 协议组包生成的差分模拟数据信号第二组
DATA 2+ / DATA 2- MIPI 协议组包生成的差分模拟数据信号第一组
CLOCK+ / CLOCK- MIPI 协议组包生成的差分模拟时钟信号
SDA I2C 数据信号线
SCL I2C 时钟信号线
如果还不清楚的话看我们硬件原理图:
下面是瑞芯微的mipi
对于RK356X平台而言,仅有一个标准物理mipi csi2 dphy,可以工作在两个模式:full mode 和split mode,拆分为csi2_dphy0/csi2_dphy1/csi2_dphy2三个逻辑dphy(参见rk3568.dtsi),特性如下:
Full mode
仅使用csi2_dphy0,csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用;
data lane最大4 lanes;
最大速率2.5Gbps/lane;
Split mode
仅使用csi2_dphy1和csi2_dphy2, 与csi2_dphy0互斥,不可同时使用;
csi2_dphy1和csi2_dphy2可同时使用;
csi2_dphy1和csi2_dphy2各自的data lane最大是2 lanes;
csi2_dphy1对应物理dphy的lane0/lane1;
csi2_dphy2对应物理dphy的lane2/lane3;
最大速率2.5Gbps/lane
二、摄像头是如何把数据给到RK3568,又是如何处理
硬件连接关系图:
可以看出mipi接口就是用来传输图像数据,而i2c接口使用来控制摄像头的寄存器的
比如要进行图像数据捕获的时候就需要通过i2c对Sensor的寄存器进行配置
图像数据的来龙去脉
在瑞芯微的开发手册中也解释了,如下:
从上面两个图可以看出,摄像头采集到数据之后通过mipi接口把数据给到RK3568,RK3568接收到数据之后又给到isp(图像处理传感器)
从这里也可以看出,要想使用这个摄像头,就需要处理好这三部分:摄像头的驱动(比如操作相关寄存器)、mipi接口、ISP
移植过程这些都不用我们手动编写,因为瑞芯微已经帮我们做好了,代码路径如下:
代码路径
和硬件相关的驱动有3部分,分别为Sensor相关的,MIPI相关,ISP相关的。
Sensor: drivers\media\i2c\ov13850.c
MIPI相关:drivers\phy\rockchip\phy-rockchip-mipi-rx.c
ISP相关:drivers\media\platform\rockchip\isp1\rkisp1.c
如果瑞芯微没有你的摄像头的驱动的话你要找摄像头的厂家提供过来
三、如何移植
修改设备树:
我们已经知道Camera有3部分的驱动,分别是描述Sensor
、MIPI
相关、ISP
相关的,所以在dts
中也有描述这3部分的:
sensor部分:
由于我们摄像头是挂载在i2c2上面,所以我们需要再i2c2上面添加我们的ov5695的相关信息,包括:挂载的地址
、时钟
、引脚
:mipi的引脚
(由于mipi的引脚是专用的,所以我们不需要使用pinctrl配置),如下:
i2c2的引脚
在rk3568-pinctrl.dtsi
:
其他引脚
:
pinctrl-0 = <&cif_clk>;//cif pinctrl
reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>; //MIPI_CAM0_RST_L_GPIO3_D4
pwdn-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>; //pwoer dowm MIPI_CAM0_PDN_L_GPIO3_D5
对应于下图:
还有对接mipi的节点
具体如下:
&i2c2 {
status = "okay";
pinctrl-0 = <&i2c2m1_xfer>;
ov5695: ov5695@36 {
status = "okay";
compatible = "ovti,ov5695";
reg = <0x36>; //sensor I2C设备地址,7位
clocks = <&cru CLK_CIF_OUT>; //sensor clickin配置
clock-names = "xvclk";
power-domains = <&power RK3568_PD_VI>;
pinctrl-names = "default";
pinctrl-0 = <&cif_clk>;//CIF_CLKOUT引脚 pinctrl
reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>; //MIPI_CAM0_RST_L_GPIO3_D4
pwdn-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>; //pwoer dowm MIPI_CAM0_PDN_L_GPIO3_D5
rockchip,camera-module-index = <0>;//不能一样就行
rockchip,camera-module-facing = "back";//后置摄像头
rockchip,camera-module-name = "TongJu";//名字
rockchip,camera-module-lens-name = "CHT842-MD";
port {
ov5695_out: endpoint {
//mipi dphy端的port名
remote-endpoint = <&mipi_in_ucam2>;
// mipi lane数,1lane为 <1>, 4lane为 <1 2 3 4>
data-lanes = <1 2>;
};
};
};
};
mipi部分:
这部分瑞芯微有提供设备树参考文档Documentation/devicetree/bindings/media/rockchip-mipi-dphy.txt
,如下:
具体内容如下:
主要是这个port节点,该节点的第一个端口显示了这个mipi-dphy中连接的传感器(比如摄像头),第二个端口连接isp节点
具体修改如下:
&csi2_dphy0 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
//第一个端口显示了这个mipi-dphy中连接的传感器。
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_in_ucam0: endpoint@1 {
reg = <1>;
remote-endpoint = <&ucam_out0>;
data-lanes = <1 2 3 4>;
};
mipi_in_ucam1: endpoint@2 {
reg = <2>;
remote-endpoint = <&gc8034_out>;
data-lanes = <1 2 3 4>;
};
//这部分连接sensor
mipi_in_ucam2: endpoint@3 {
reg = <3>;
// sensor端的 port名
remote-endpoint = <&ov5695_out>;
// mipi lane数,1lane为 <1>, 4lane为 <1 2 3 4>
data-lanes = <1 2>;
};
};
//第二个端口连接isp节点。
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
//这部分连接isp
csidphy_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&isp0_in>;
};
};
};
};
isp部分:
这部分瑞芯微有提供设备树参考文档Documentation/devicetree/bindings/media/rockchip-isp1.txtt
,如下:
具体内容如下:
该功能就是用来对接mipi的数据然后进行处理
具体修改如下:
&rkisp_vir0 {
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
//对接mipi
isp0_in: endpoint@0 {
reg = <0>;
remote-endpoint = <&csidphy_out>;
};
};
};
依据瑞芯微手册上讲到,如下;
所以还需要使能csi2_dphy_hw
&csi2_dphy_hw {
status = "okay";
};
修改完成之后编译烧录即可。如果不清楚如何编译烧录的点击这里
总结
好了,如果按照上面步骤修改之后那么你肯定能够编译烧录成功,下节我们来验证和讲解里面的驱动,喜欢就收藏吧!!