RK3576作为瑞芯微新一代高性能处理器,在工业控制、边缘计算和多媒体终端领域应用广泛。最近在调试一块基于RK3576的开发板时,发现默认设备树并未适配我们使用的7寸MIPI-DSI屏幕和调试串口。这直接导致系统启动后无法显示控制台信息,给开发调试带来极大不便。
设备树(Device Tree)作为嵌入式Linux系统中描述硬件拓扑结构的重要机制,其正确配置直接关系到外设能否被内核正确识别和驱动。本次修改涉及两个关键部分:
RK3576平台采用标准Linux设备树架构,主要涉及以下文件:
code复制arch/arm64/boot/dts/rockchip/
├── rk3576.dtsi # SoC级定义
├── rk3576-xxx.dtsi # 核心板级定义
└── rk3576-xxx-xxx.dts # 具体板级定义
关键修改原则:
RK3576显示流水线包含以下关键组件:
code复制VOP --> DSI Controller --> MIPI PHY --> LCD Panel
↑
Display Timing Generator
需要在设备树中完整描述:
首先需要从屏幕规格书中提取以下核心参数:
典型参数示例:
c复制panel-init-sequence = [
05 78 01 11
05 32 01 29
...
];
在板级dts文件中添加以下节点:
c复制&dsi0 {
status = "okay";
panel@0 {
compatible = "panel-dsi-custom";
reg = <0>;
backlight = <&backlight>;
/* 物理尺寸 */
width-mm = <94>;
height-mm = <151>;
/* 时序配置 */
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <71000000>;
hactive = <800>;
vactive = <1280>;
hfront-porch = <40>;
hsync-len = <10>;
hback-porch = <40>;
vfront-porch = <20>;
vsync-len = <2>;
vback-porch = <20>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
};
};
大多数MIPI屏幕需要PWM控制背光:
c复制backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm1 0 25000 0>; // PWM1, 25kHz
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <6>;
};
RK3576开发板通常通过UART2作为调试控制台,但需要注意:
c复制&uart2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart2m0_xfer>;
uart-has-rtscts;
};
对于需要控制电平转换芯片的情况:
c复制&uart2 {
en-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
};
使用RK提供的工具链编译设备树:
bash复制make ARCH=arm64 dtbs -j$(nproc)
bash复制dmesg | grep -i dsi
cat /sys/kernel/debug/dri/0/summary
bash复制stty -F /dev/ttyS2
echo "test" > /dev/ttyS2
bash复制cat /sys/kernel/debug/dri/0/state
RK3576支持双屏异显,需要在设备树中配置多个VOP:
c复制&vop {
assigned-clocks = <&cru PLL_VPLL>;
assigned-clock-rates = <800000000>;
};
&vop_mmu {
status = "okay";
};
通过设备树配置屏幕休眠参数:
c复制panel@0 {
power-supply = <&vcc_lcd>;
sleep-delay = <1000>; // ms
hpd-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
};
对于带触摸功能的屏幕,需要额外配置I2C接口:
c复制&i2c1 {
status = "okay";
touchscreen@5d {
compatible = "goodix,gt911";
reg = <0x5d>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PA5 IRQ_TYPE_EDGE_FALLING>;
};
};
在实际调试过程中,我发现RK平台的DSI控制器对时序要求较为严格,当出现花屏问题时,可以尝试以下措施:
对于工业级应用,建议在设备树中添加硬件看门狗配置,提高系统可靠性:
c复制&watchdog {
status = "okay";
timeout-sec = <10>;
};