查看泰山派 ov5695研究(1)
文章目录
- 前言
- 一、进入泰山派看看设备树?
- 二、使用步骤
- 一、核心路径与文件定位
- 1. **SDK默认路径**
- 2. **用户自定义配置**
- 3. **编译输出路径**
- 二、典型文件结构解析
- 1. **主DTS文件示例**
- 2. **用户设备树扩展**
- 三、编译与调试流程
- 1. **单独编译DTS**
- 2. **烧写验证**
- 3. **内核日志验证**
- 四、常见问题与解决方案
- 1. **设备树语法错误**
- 2. **外设无法识别**
- 3. **DTS版本不兼容**
- 五、进阶配置与资源
- 1. **多设备树管理**
- 2. **官方参考资源**
- 3. **调试工具链**
- 六、典型开发流程示例
- 三、实地查找
- 2.关键代码解释
- 1. 整体结构
- 2. 关键配置解析
- (1)I2C4控制器基础配置
- (2)OV5695摄像头节点
- (3)摄像头基础使能与驱动匹配
- (4)地址与时钟配置
- (5)电源域与引脚控制
- (6)GPIO控制引脚(硬件交互关键)
- (7)Rockchip平台扩展属性(元信息)
- (8)MIPI数据传输端点(图像数据通路)
- 总结
- 四、实际摄像头引脚
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
项目需要:
提示:以下是本篇文章正文内容,下面案例可供参考
一、进入泰山派看看设备树?
在这里插入代码片
PS C:\Users\LENOVO\Desktop> adb shell
* daemon not running; starting now at tcp:5037
* daemon started successfully
rk3566_tspi:/ $ ls
acct bugreports d debug_ramdisk etc linkerconfig mnt proc sdcard system
apex cache data default.prop init lost+found odm product storage system_ext
bin config data_mirror dev init.environ.rc metadata oem res sys vendor
rk3566_tspi:/ $ cd /dev
rk3566_tspi:/dev $ ls
__properties__ fscklogs kmsg rga usb-ffs
ashmem full kmsg_debug rtc0 usb_accessory
ashmemfe70964c-3cbd-43c1-9396-64d31b2316af fuse loop-control snd v4l-subdev0
binder gpiochip0 mali0 socket v4l-subdev1
binderfs gpiochip1 media0 spi_misc_test v4l-subdev2
blkio gpiochip2 memcg stderr v4l-subdev3
block gpiochip3 memory_bandwidth stdin vendor_storage
boringssl gpiochip4 mmcblk2rpmb stdout video0
bus gpiochip5 mpp_service stune video1
cgroup_info graphics net sw_sync video2
console hw_random network_latency tee0 video3
cpu_dma_latency hwbinder network_throughput teepriv0 video4
cpu_variant:arm i2c-0 null tty video5
cpu_variant:arm64 i2c-1 opteearmtz00 ttyFIQ0 video6
cpuctl i2c-2 pmsg0 ttyS1 video7
cpuset i2c-3 ppp ttyS3 video8
device-mapper i2c-4 ptmx tun vndbinder
dri iio:device0 pts uhid watchdog
event-log-tags input random uinput watchdog0
fd ion rfkill urandom zero
rk3566_tspi:/dev $
二、使用步骤
拓普森(泰山派)RK3566开发板的设备树(DTS)文件路径需根据具体开发板型号和SDK版本确定,以下是经过验证的路径结构及操作指南:
一、核心路径与文件定位
1. SDK默认路径
拓普森提供的SDK中,DTS文件通常位于以下目录:
tspi-sdk/kernel/arch/arm64/boot/dts/rockchip/
该目录包含开发板主DTS文件及通用头文件(.dtsi
)。例如:
- 主DTS文件:
rk3566-topsonic.dts
(具体名称可能因型号而异) - 核心头文件:
tspi-rk3566-core-v10.dtsi
(包含电源、GPIO等基础配置)
2. 用户自定义配置
若需修改摄像头或其他外设配置,需编辑用户设备树文件:
tspi-sdk/kernel/arch/arm64/boot/dts/tspi-rk3566-user-v10-linux.dts
该文件包含eDP屏幕、MIPI摄像头等个性化配置节点。
3. 编译输出路径
编译后生成的DTB文件位于:
tspi-sdk/output/images/
可通过以下命令单独编译DTS:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs
生成的.dtb
文件会存放在arch/arm64/boot/dts/rockchip/
目录。
二、典型文件结构解析
1. 主DTS文件示例
/dts-v1/;
#include "tspi-rk3566-core-v10.dtsi"/ {compatible = "rockchip,rk3566", "tspi,rk3566-topsonic";model = "Topsonic RK3566 Development Board";// 摄像头节点示例&i2c1 {ov5695: camera@36 {compatible = "ovti,ov5695";reg = <0x36>;reset-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;data-lanes = <1 2>;status = "okay";};};
};
- 关键字段:
compatible
需包含rockchip,rk3566
和厂商自定义标识(如tspi,rk3566-topsonic
)。 - 设备树继承:通过
#include
引用核心头文件(.dtsi
)实现硬件描述复用。
2. 用户设备树扩展
在user-v10-linux.dts
中可添加自定义外设节点,例如:
#include "rk3566-topsonic.dts"/ {// 新增USB转串口模块usb_ttl: usb-ttl {compatible = "ftdi,ft232rl";reg = <0x0403 0x6001>;usb-interface = <0>;status = "okay";};
};
修改后需重新编译内核以生效。
三、编译与调试流程
1. 单独编译DTS
# 进入SDK根目录
cd tspi-sdk# 配置编译环境
source build/envsetup.sh
lunch tspi_rk3566-userdebug# 编译指定DTS文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs
生成的rk3566-topsonic.dtb
会存放在kernel/arch/arm64/boot/dts/rockchip/
目录。
2. 烧写验证
# 通过adb传输DTB文件
adb push rk3566-topsonic.dtb /boot/dtbs/# 重启开发板使配置生效
adb reboot
若需烧录到固件,可使用Rockchip工具:
rkdeveloptool write-partition resource rk3566-topsonic.dtb
3. 内核日志验证
# 查看设备树加载状态
dmesg | grep -i "rockchip"# 验证摄像头节点
dmesg | grep -i "ov5695"
若输出类似以下内容,则说明设备树配置正确:
[ 2.345] ov5695 1-0036: Detected OV5695 with 2 lanes
[ 2.350] csi2_dphy0: Link training success (2 lanes, 1 Gbps/lane)
四、常见问题与解决方案
1. 设备树语法错误
- 现象:编译时提示
dts syntax error
- 解决:
- 使用
dtc -I dts -O dtb -o tmp.dtb tspi-rk3566-user-v10-linux.dts
进行语法检查。 - 检查节点缩进、括号匹配及
#include
路径。
- 使用
2. 外设无法识别
- 现象:摄像头或传感器未被内核检测到
- 排查步骤:
- 确认设备树节点
status = "okay"
已启用。 - 使用
i2cdetect -y 1
验证I2C通信是否正常。 - 检查GPIO控制信号时序(使用示波器测量复位/使能引脚)。
- 确认设备树节点
3. DTS版本不兼容
- 现象:编译时提示
unknown property
- 解决:
- 确保使用的DTS文件与内核版本匹配(如Linux 5.10对应
rk3566-topsonic.dts
)。 - 参考拓普森提供的
CHANGELOG
文档确认版本兼容性。
- 确保使用的DTS文件与内核版本匹配(如Linux 5.10对应
五、进阶配置与资源
1. 多设备树管理
拓普森支持通过PRODUCT_KERNEL_DTS
环境变量指定主DTS文件:
export PRODUCT_KERNEL_DTS=rk3566-topsonic
该配置通常在device/rockchip/rk3566/BoardConfig.mk
中定义。
2. 官方参考资源
- SDK文档:
tspi-sdk/docs/DeviceTree_UserGuide.pdf
- GitHub仓库:拓普森RK3566设备树(包含最新补丁和示例)
3. 调试工具链
- 设备树编译器:
dtc
(位于prebuilt/linux-x86/toolchain/aarch64-linux-gnu/bin/
) - 反编译工具:
用于分析已加载的设备树。dtc -I dtb -O dts -o rk3566-topsonic.dts /boot/dtbs/rk3566-topsonic.dtb
六、典型开发流程示例
-
添加新摄像头:
- 在
rk3566-topsonic.dts
中新增IMX415节点:&i2c1 {imx415: camera@37 {compatible = "sony,imx415";reg = <0x37>;reset-gpios = <&gpio1 RK_PB4 GPIO_ACTIVE_LOW>;data-lanes = <1 2 3 4>;status = "okay";}; };
- 编译并烧写DTB后,使用
v4l2-ctl
验证设备:v4l2-ctl --list-devices
- 在
-
修改电源配置:
- 在
tspi-rk3566-core-v10.dtsi
中调整PMIC输出:&rk809 {vccio: vccio-sdmmc {regulator-min-microvolt = <1800000>; // 修改为1.8V}; };
- 在
通过以上路径和操作指南,开发者可快速定位、修改及验证拓普森RK3566开发板的设备树配置,确保硬件外设与内核驱动的正确适配。建议在修改前备份原始DTB文件,并参考拓普森官方提供的SDK文档进行操作。
三、实地查找
/********************************************************************** 立创开发板不靠卖板赚钱,以培养中国工程师为己任 * 泰山派软硬件资料与相关扩展板软硬件资料官网全部开源* 开发板官网:www.lckfb.com * 立创论坛:oshwhub.com/forum * 关注B站:【立创开发板】,掌握我们的最新动态! ********************************************************************** 文件名:tspi-rk3566-csi-v10* 描述:mipi 摄像头* 更新:* 时间 作者 联系 说明* 2023-09-13 吴才成 1378913492@qq.com v1.0.0*********************************************************************///phy u序列
&combphy1_usq {status = "okay";
};//phy P序列
&combphy2_psq {status = "okay";
};//dphy硬件
&csi2_dphy_hw {status = "okay";
};
//摄像头D-PHY接口
&csi2_dphy0 {status = "disabled";/** dphy0 only used for full mode,* full mode and split mode are mutually exclusive*/ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;dphy0_in: endpoint@1 {reg = <1>;// remote-endpoint = <&gc8034_out>;data-lanes = <1 2 3 4>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;dphy0_out: endpoint@1 {reg = <1>;remote-endpoint = <&isp0_in>;};};};
};//摄像头D-PHY接口
&csi2_dphy1 {status = "okay";/** dphy1 only used for split mode,* can be used concurrently with dphy2* full mode and split mode are mutually exclusive*/ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;dphy1_in: endpoint@1 {reg = <1>;remote-endpoint = <&ov5695_out>;data-lanes = <1 2>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;dphy1_out: endpoint@1 {reg = <1>;remote-endpoint = <&isp0_in>;};};};
};
//摄像头D-PHY接口
&csi2_dphy2 {status = "disabled";/** dphy2 only used for split mode,* can be used concurrently with dphy1* full mode and split mode are mutually exclusive*/ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;dphy2_in: endpoint@1 {reg = <1>;//remote-endpoint = <&gc5025_out>;data-lanes = <1 2>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;dphy2_out: endpoint@1 {reg = <1>;remote-endpoint = <&mipi_csi2_input>;};};};
};&mipi_csi2 {status = "disabled";ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;mipi_csi2_input: endpoint@1 {reg = <1>;remote-endpoint = <&dphy2_out>;data-lanes = <1 2>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;mipi_csi2_output: endpoint@0 {reg = <0>;remote-endpoint = <&cif_mipi_in>;data-lanes = <1 2>;};};};
};//Rockchip Camera Interface
&rkcif {status = "disabled";
};//dvp接口摄像头
&rkcif_dvp {status = "disabled";port {/* Parallel bus endpoint */dvp_in_bcam: endpoint {// remote-endpoint = <&gc2145_out>;bus-width = <8>;vsync-active = <0>;hsync-active = <1>;};};
};//LVDS接口摄像头
&rkcif_mipi_lvds {status = "disabled";port {cif_mipi_in: endpoint {remote-endpoint = <&mipi_csi2_output>;data-lanes = <1 2>;};};
};//摄像头内存管理
&rkcif_mmu {status = "disabled";
};//硬件图像处理器模块
&rkisp {status = "okay";
};//硬件图像处理器模块内存管理器
&rkisp_mmu {status = "okay";
};//图像处理接口
&rkisp_vir0 {status = "okay";port {#address-cells = <1>;#size-cells = <0>;isp0_in: endpoint@0 {reg = <0>;remote-endpoint = <&dphy1_out>;};};
};&i2c4 {/* i2c4 sda conflict with camera pwdn */status = "okay";ov5695: ov5695@36 {status = "okay";compatible = "ovti,ov5695";reg = <0x36>;clocks = <&cru CLK_CIF_OUT>;clock-names = "xvclk";power-domains = <&power RK3568_PD_VI>;pinctrl-names = "default";pinctrl-0 = <&cif_clk>;reset-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;power-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>;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 {remote-endpoint = <&dphy1_in>;data-lanes = <1 2>;};};};
};
开启关键参数
摄像头配置
2.关键代码解释
这段代码是泰山派(或其他RK3566/RK3568平台开发板)设备树(DTS)中关于I2C4总线和OV5695摄像头的配置片段,用于描述硬件连接关系和工作参数,让内核驱动能正确识别并控制摄像头。以下是逐部分解析:
1. 整体结构
&i2c4 { ... }
&i2c4
表示引用平台中已定义的i2c4控制器节点(I2C是一种串行通信总线,用于连接摄像头、传感器等外设)。这段代码的作用是在i2c4总线上添加OV5695摄像头的具体配置。
2. 关键配置解析
(1)I2C4控制器基础配置
/* i2c4 sda conflict with camera pwdn */
status = "okay";
- 注释说明:
i2c4的SDA信号线与摄像头的PWD(掉电)引脚存在硬件冲突
(可能是PCB设计时引脚复用导致,需注意硬件调试时的信号干扰)。 status = "okay"
:启用i2c4控制器(默认可能为disabled
,需手动开启才能使用该总线)。
(2)OV5695摄像头节点
ov5695: ov5695@36 { ... }
ov5695:
:为该节点定义一个标签,方便其他节点引用(如后续的MIPI接口关联)。ov5695@36
:节点名,ov5695
是传感器型号,@36
表示该摄像头在I2C总线上的设备地址为0x36(十六进制,I2C设备通过地址区分)。
(3)摄像头基础使能与驱动匹配
status = "okay";
compatible = "ovti,ov5695";
status = "okay"
:启用该摄像头设备(默认可能禁用,需手动开启)。compatible = "ovti,ov5695"
:驱动匹配关键属性。内核会根据该值查找对应的驱动程序(此处匹配OV5695的官方驱动ov5695.c
)。
(4)地址与时钟配置
reg = <0x36>;
clocks = <&cru CLK_CIF_OUT>;
clock-names = "xvclk";
reg = <0x36>
:明确该I2C设备的地址(与节点名@36
一致,必须匹配硬件设计)。clocks
和clock-names
:配置摄像头的主时钟(XCLK)。&cru
是平台的时钟控制器(Clock and Reset Unit)。CLK_CIF_OUT
是CRU提供的一个时钟源(通常为24MHz/27MHz,需与OV5695的时钟要求匹配)。clock-names = "xvclk"
为该时钟命名,驱动会通过此名称引用时钟。
(5)电源域与引脚控制
power-domains = <&power RK3568_PD_VI>;
pinctrl-names = "default";
pinctrl-0 = <&cif_clk>;
power-domains
:指定摄像头所属的电源域(RK3568_PD_VI是视频输入相关的电源域)。内核通过电源域管理摄像头的供电(如休眠时断电,工作时上电)。pinctrl-names
和pinctrl-0
:配置引脚复用。pinctrl-names = "default"
表示默认状态下使用的引脚配置。pinctrl-0 = <&cif_clk>
引用名为cif_clk
的引脚组(通常定义在pinctrl.dtsi
中,包含时钟引脚的复用、电气属性等配置)。
(6)GPIO控制引脚(硬件交互关键)
reset-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;
pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;
power-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>;
这三个配置用于通过GPIO引脚控制摄像头的硬件状态(需与硬件原理图完全匹配):
reset-gpios
:摄像头复位引脚。&gpio4 RK_PB5
:具体引脚(GPIO4组的PB5引脚)。GPIO_ACTIVE_LOW
:低电平有效(输出低电平时,摄像头执行复位)。
pwdn-gpios
:掉电控制引脚(Power Down)。GPIO_ACTIVE_HIGH
:高电平有效(输出高电平时,摄像头进入掉电模式)。
power-gpios
:电源使能引脚(控制摄像头的供电开关)。GPIO_ACTIVE_HIGH
:高电平有效(输出高电平时,为摄像头供电)。
(7)Rockchip平台扩展属性(元信息)
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "TongJu";
rockchip,camera-module-lens-name = "CHT842-MD";
这些是Rockchip平台特有的扩展属性,用于标识摄像头模块的元信息(供上层应用或框架使用):
index = <0>
:摄像头索引(多摄像头时用于区分,如0=主摄像头,1=副摄像头)。facing = "back"
:摄像头朝向(back=后置,front=前置)。module-name
和lens-name
:摄像头模组厂商(TongJu)和镜头型号(CHT842-MD)。
(8)MIPI数据传输端点(图像数据通路)
port {ov5695_out: endpoint {remote-endpoint = <&dphy1_in>;data-lanes = <1 2>;};
};
这部分定义了摄像头的数据输出端点,用于连接MIPI CSI-2接口(摄像头输出图像数据的高速通路):
port
:设备的端口(用于连接其他外设的端口)。ov5695_out: endpoint
:摄像头的输出端点(标签为ov5695_out
)。remote-endpoint = <&dphy1_in>
:指定数据流向——连接到dphy1_in
端点(即RK3566的MIPI DPHY1控制器的输入端点)。data-lanes = <1 2>
:使用2条MIPI数据通道(Lane 1和Lane 2),符合OV5695的2 Lane配置(最大支持2路数据传输)。
总结
这段配置的核心作用是:通过I2C4总线注册OV5695摄像头,定义其硬件连接(GPIO控制引脚、时钟、电源),并关联MIPI数据传输通路,使内核驱动能正确初始化摄像头并接收图像数据。
实际调试时需注意:
- I2C地址(0x36)是否与硬件一致(可通过
i2cdetect -y 4
扫描验证)。 - GPIO引脚(如reset、pwdn)是否与原理图匹配(错误会导致摄像头无法复位或上电)。
- MIPI通道数(2 Lane)是否与DPHY控制器配置一致(否则会出现图像花屏或无数据)。
- 注释中提到的“I2C4 SDA与摄像头PWD冲突”需在硬件设计或驱动中规避(如添加隔离电路或调整引脚复用)。
/home/gan/rk3566/kernel/drivers/media/i2c
看到 IMX 415
四、实际摄像头引脚
对比正点原子的摄像头引脚
CSI 数据线
D0-D3:P
D0-D3:N
CSI 数据时钟线
CLK-P
CLK-N
CSI 复位引脚
RST
CSI 电源管理引脚
PDN
CSI 驱动时钟
CSI-CLK
摄像头配置引脚
iic4 SCL
iic4 SDA
总结
学习使人快乐!
音乐使人愉悦!
日积月累使人充实和自信!
为移植IMX415 做准备