获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中:
【RK3576】Android 14 驱动开发实战指南
简介
RK3576支持摄像头相关功能:
MIPI DCPHY CSI RX:一路 4Lane DPHY 或者一路 3Trios MIPI CPHY 信号输入,通过 80pin 座子接入。
MIPI DPHY CSI RX:两路 4Lane DPHY 信号输入,均支持可拆分成 2x2Lane,通过 80pin 座子接入。
硬件接口
驱动开发
【RK3576】【Kernel 6.1】Camera驱动目录说明:
Linux Kernel-6.1:|
|-- arch/arm64/boot/dts/rockchip //DTS 配置文件
|-- drivers/phy/rockchip/
|-- phy-rockchip-mipi-rx.c //mipi dphy 驱动
|-- drivers/media
|-- platform/rockchip/isp1 rkisp1 isp 驱动
|-- i2c/
|-- ov13850.c //CIS(cmos image sensor)驱动
|-- vm149c.c //VCM driver ic 驱动
|-- spi/ rk1608 //ap driver 驱动
|-- rk1608.c //注册 rk1608 spi 设备
|-- rk1608_dev.c //注册/dev/rk_preisp misc 设备
|-- rk1608_dphy.c //注册 v4l2 media 节点,与 rk1608 和 AP 端交互
DTS配置
RK3576 平台的 Camera Interface (CIF) 设备树配置,分成好几个部分,分别为Sensor → DPHY0 → MIPI CSI2 → RKCIF → ISP → VPSS。
传感器部分dts配置
imx415: imx415@1a {
compatible = "sony,imx415"; // 驱动匹配
reg = <0x1a>; // I2C从地址
clocks = <&cru 56>; // 传感器时钟源
pinctrl-names = "default";
pinctrl-0 = <&cam_clk0m0_clk0>; //管脚复用
power-domains = <&power 15>; // 电源域控制
avdd-supply = <&vcc_mipidcphy0>; // 模拟电压
port {
imx415_out0: endpoint {
remote-endpoint = <&mipi_in_ucam0>; // 与DPHY绑定
data-lanes = <1 2 3 4>; // 通道映射
}
}
}
DPHY部分dts配置(数据采集)
配置MIPI CSI-2 DPHY0物理层接口,用于连接多个摄像头传感器。5路摄像头通过MIPI CSI-2 DPHY0输入
&csi2_dcphy0 {
status = "okay"; // 启用物理层接口
ports {
port@0 { // 传感器输入端口
endpoint@1 { // IMX415 传感器
data-lanes = <1 2 3 4>; // 4通道MIPI
}
... // 其他5个传感器端点
}
port@1 { // 输出到协议层
csidcphy0_out: endpoint@0 {
remote-endpoint = <&mipi0_csi2_input>;
}
}
}
}
MIPI CSI部分dts配置(协议处理)
MIPI CSI-2协议层控制器,处理来自DPHY的数据流。MIPI CSI2控制器MIPI协议解析与数据包重组(实现 CSI-2 协议到 V4L2 标准的转换)。
ports {
port@0 {
mipi0_csi2_input: endpoint@1 {
remote-endpoint = <&csidcphy0_out>; // 接收物理层数据
}
}
port@1 {
mipi0_csi2_output: endpoint@0 {
remote-endpoint = <&cif_mipi_in0>; // 输出到CIF
}
}
}
RKCIF部分dts配置(图像处理)
启用摄像头接口核心。原始数据接收和格式转换。
rkcif: rkcif@27c10000 {
compatible = "rockchip,rk3576-cif"; //用于绑定 RK3576 的 CIF 驱动
reg = <0x0 0x27c10000 0x0 0x800>;
reg-names = "cif_regs";
interrupts = <0 318 4>;
interrupt-names = "cif-intr";
clocks = <&cru 366>, <&cru 367>, <&cru 365>,
<&cru 385>, <&cru 386>,
<&cru 387>, <&cru 388>,
<&cru 389>;
clock-names = "aclk_cif", "hclk_cif", "dclk_cif",
"i0clk_cif", "i1clk_cif",
"i2clk_cif", "i3clk_cif",
"i4clk_cif"; //配置了 8 组时钟,涵盖总线时钟和摄像头输入时钟
resets = <&cru 855>, <&cru 856>, <&cru 854>,
<&cru 945>, <&cru 946>,
<&cru 947>, <&cru 948>,
<&cru 949>;
reset-names = "rst_cif_a", "rst_cif_h", "rst_cif_d",
"rst_cif_iclk0", "rst_cif_iclk1", "rst_cif_iclk2",
"rst_cif_iclk3", "rst_cif_iclk4";
assigned-clocks = <&cru 365>;
assigned-clock-rates = <600000000>;
power-domains = <&power 15>;
rockchip,grf = <&ioc_grf>;
iommus = <&rkcif_mmu>; //IOMMU 设备:绑定rkcif_mmu
用于内存地址转换
status = "disabled";
};rkcif_mipi_lvds: rkcif-mipi-lvds {
compatible = "rockchip,rkcif-mipi-lvds";
rockchip,hw = <&rkcif>;
iommus = <&rkcif_mmu>;
status = "disabled";
};
&rkcif_mipi_lvds {
port {
cif_mipi_in0: endpoint {
remote-endpoint = <&mipi0_csi2_output>; // 接收CSI2数据
}
}
}
ISP部分dts配置(图像处理)
启用ISP(图像信号处理器)核心。执行HDR、3A(自动对焦/曝光/白平衡)等处理。
&rkisp_vir0 {
port {
isp_vir0: endpoint@0 {
remote-endpoint = <&mipi_lvds_sditf>; // 接收CIF数据
}
}
}
VPSS部分dts配置(图像处理)
启用VPSS(用于缩放、去噪等后处理)。后处理优化(如缩放、锐化)。
&rkvpss_vir0 {
status = "okay"; // 启用视频后处理
}