泰山派 RK3566 点亮 ST7789 SPI 屏幕
实验目标
在泰山派 RK3566 V10 开发板上,通过 Linux 6.1.141 内核的 FBTFT 驱动点亮 ST7789 240×240 SPI 屏幕。
完成标准:
- 内核启用 ST7789V 对应驱动。
- 设备树注册 SPI 屏幕和控制 GPIO。
- 系统生成
/dev/fb0,并能通过命令向屏幕写入像素数据。 - 背光控制和 LCD 显示分别检查。
实验环境
| 项目 | 实际配置 |
|---|---|
| 开发板 | 立创泰山派 RK3566 V10 |
| 内核版本 | Linux 6.1.141 |
| SDK 根目录 | tspi_sdk/ |
| 内核源码目录 | kernel-6.1/ |
| 设备树源文件 | kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts |
| SPI 屏幕 | ST7789,240×240(具体模组型号未确认) |
| SPI 控制器 | SPI3_M1 |
| 显示驱动 | fb_st7789v(FBTFT) |
| Framebuffer | /dev/fb0 |
| 背光控制 | PWM8,GPIO3_B1 |
实验步骤
1. 确认开发板、内核和 SDK 配置
先在开发板终端确认板型与内核版本:
cat /proc/device-tree/model
uname -r
cat /proc/fb本次确认:
lckfb tspi V10 Board
6.1.141在电脑的 SDK 根目录执行:
grep -E '^(RK_KERNEL_CFG|RK_KERNEL_CFG_FRAGMENTS|RK_KERNEL_DTS_NAME)=' output/.config本次已确认 SDK 使用的基础内核配置为:
RK_KERNEL_CFG="rockchip_linux_defconfig"DTS 文件应以 SDK 实际选择的 RK_KERNEL_DTS_NAME 为准。本次使用的文件是:
kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts如果命令显示的 DTS 名称与此不同,先找到实际被构建的 DTS,不要改错文件。
2. 在 menuconfig 中启用内核选项
进入内核源码目录:
cd kernel-6.1
make ARCH=arm64 menuconfig在菜单中找到并启用下列配置。建议编译进内核,配置值为 y,避免还需要手动加载模块。
| 配置项 | menuconfig 位置 |
|---|---|
CONFIG_FB | Device Drivers → Graphics support → Frame buffer Devices → Support for frame buffer devices |
CONFIG_STAGING | Device Drivers → Staging drivers |
CONFIG_FB_TFT | Device Drivers → Staging drivers → Support for small TFT LCD display modules |
CONFIG_FB_TFT_ST7789V | Device Drivers → Staging drivers → Support for small TFT LCD display modules → FB driver for the ST7789V LCD Controller |
CONFIG_BACKLIGHT_PWM | Device Drivers → Graphics support → Backlight & LCD device support → Lowlevel Backlight controls → Generic PWM based Backlight Driver |
CONFIG_PWM_ROCKCHIP | Device Drivers → Pulse-Width Modulation (PWM) Support → Rockchip PWM support |
如果菜单里找不到某个选项:
- 在
menuconfig中按/。 - 输入配置名,例如
FB_TFT_ST7789V,按 Enter。 - 查看搜索结果中的
Location和Depends on,按提示进入对应菜单。 - 先启用依赖项
FB、STAGING、FB_TFT,再检查 ST7789V 选项。
保存退出后,在 kernel-6.1/ 目录检查:
grep -E '^(CONFIG_(FB|STAGING|FB_TFT|FB_TFT_ST7789V|BACKLIGHT_PWM|PWM_ROCKCHIP)=)' .config预期结果:
CONFIG_FB=y
CONFIG_STAGING=y
CONFIG_FB_TFT=y
CONFIG_FB_TFT_ST7789V=y
CONFIG_BACKLIGHT_PWM=y
CONFIG_PWM_ROCKCHIP=y相关 Kconfig 文件位置,方便直接核对:
| 配置项 | 内核源码中的 Kconfig |
|---|---|
CONFIG_FB | drivers/video/fbdev/Kconfig |
CONFIG_STAGING | drivers/staging/Kconfig |
CONFIG_FB_TFT、CONFIG_FB_TFT_ST7789V | drivers/staging/fbtft/Kconfig |
CONFIG_BACKLIGHT_PWM | drivers/video/backlight/Kconfig |
CONFIG_PWM_ROCKCHIP | drivers/pwm/Kconfig |
3. 保存内核配置,避免下次构建被覆盖
只修改 kernel-6.1/.config 不一定能保留修改,因为 SDK 构建时可能会根据 defconfig 重新生成它。
本次 SDK 的基础配置是 rockchip_linux_defconfig。先在 kernel-6.1/ 目录执行:
make ARCH=arm64 savedefconfig该命令会在当前内核源码目录生成精简配置文件 defconfig。先检查 ST7789 选项是否保留:
grep -E 'CONFIG_(FB_TFT_ST7789V|FB_TFT|BACKLIGHT_PWM|PWM_ROCKCHIP)' defconfig备份原始配置,再比较差异:
cp arch/arm64/configs/rockchip_linux_defconfig \
arch/arm64/configs/rockchip_linux_defconfig.st7789.bak
diff -u arch/arm64/configs/rockchip_linux_defconfig defconfig确认生成的 defconfig 来自刚才配置过的 .config,且包含所需的 ST7789 驱动设置后,更新 SDK 当前使用的基础配置:
cp defconfig arch/arm64/configs/rockchip_linux_defconfig注意: 如果第 1 步查到 RK_KERNEL_CFG_FRAGMENTS 有非空值,说明 SDK 还使用了配置片段。此时先查明该片段的实际文件和覆盖规则,不要直接覆盖基础 defconfig;应把配置加到实际使用的片段中。
完成后返回 SDK 根目录:
cd ..4. 修改设备树,添加 ST7789
先备份本次使用的 DTS:
cp kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts \
kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts.st7789.bak在该文件中启用 SPI3,并添加 ST7789 设备。下面是本次使用的关键节点:
&spi3 {
status = "okay";
pinctrl-names = "default", "high_speed";
pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>;
pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>;
#address-cells = <1>;
#size-cells = <0>;
st7789: display@0 {
compatible = "sitronix,st7789v";
reg = <0>;
status = "okay";
spi-max-frequency = <8000000>;
width = <240>;
height = <240>;
buswidth = <8>;
regwidth = <8>;
fps = <20>;
rotate = <0>;
dc-gpios = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&st7789_ctrl_pins>;
};
};同时添加 DC 和 RESET 的 GPIO pinctrl:
&pinctrl {
st7789 {
st7789_ctrl_pins: st7789-ctrl-pins {
rockchip,pins =
<3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>,
<3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
};引脚对应关系:
| 屏幕信号 | RK3566 引脚 | 说明 |
|---|---|---|
| SCLK / CLK | GPIO4_C2 | SPI 时钟 |
| SDA / MOSI | GPIO4_C3 | SPI 数据输入到屏幕;不是 I²C SDA |
| CS | GPIO4_C6 | SPI 片选 |
| DC / RS | GPIO3_C2 | 命令/数据选择 |
| RESET / RES | GPIO3_B0 | 屏幕复位,低有效 |
| BLK 调光 | GPIO3_B1 | PWM8_M0,控制背光驱动电路 |
注意事项:
- 不要同时保留
spi_test@0和display@0两个reg = <0>的 SPI 子设备;它们会占用同一个 SPI 片选地址。 - FPC 的 Pin 1 方向必须按屏幕排线触点方向、连接器 Pin 1 标记和实际接线核对,不能只按排线外观判断。
- 上电前检查 IOVCC、VDD、GND 及 GPIO 电平是否符合屏幕规格。
5. 配置 PWM8 背光
&pwm8 {
status = "okay";
pinctrl-names = "active";
pinctrl-0 = <&pwm8m0_pins>;
};在设备树根节点中添加背光节点:
/ {
st7789_backlight: st7789-backlight {
compatible = "pwm-backlight";
pwms = <&pwm8 0 50000 0>;
brightness-levels = <0 16 32 64 128 192 255>;
default-brightness-level = <6>;
power-supply = <&vcc3v3_sys>;
status = "okay";
};
};说明:
50000ns是 PWM 周期,对应 20kHz。default-brightness-level = <6>对应brightness-levels中的第 7 档。vcc3v3_sys必须存在于当前板级 DTS 中;本次 SDK 在tspi-rk3566-core-v10.dtsi中定义了该节点。- PWM 信号应连接背光驱动电路,不要把 PWM GPIO 直接当作背光 LED 的供电输出。
6. 单独编译内核和设备树
在 SDK 根目录执行:
./build.sh kernel编译后检查内核配置是否仍然启用:
grep -E '^(CONFIG_(FB|STAGING|FB_TFT|FB_TFT_ST7789V|BACKLIGHT_PWM|PWM_ROCKCHIP)=)' \
kernel-6.1/.config查找本次设备树生成的 DTB:
find kernel-6.1 output -name 'tspi-rk3566-user-v10-linux.dtb' 2>/dev/null./build.sh kernel 是编译步骤,不代表新内核和 DTB 已经写入开发板。需要按当前 SDK 的启动介质和烧录流程,把新内核及对应 DTB 更新到开发板实际启动使用的位置;不要只更新内核而遗漏设备树。
8. 在开发板上确认驱动已加载
启动后执行:
ls /sys/class/spi_master/
ls /sys/bus/spi/devices/
cat /proc/fb
ls -l /dev/fb*
dmesg | grep -Ei 'st7789|fbtft|spi3'本次实际看到 SPI 设备:
spi3
spi3.0Framebuffer 列表:
0 fb_st7789v关键日志:
graphics fb0: fb_st7789v frame buffer,
240x240, 112 KiB video memory,
fps=20, spi3.0 at 8 MHz检查 SPI 设备绑定的驱动:
readlink -f /sys/bus/spi/devices/spi3.0/driver这里的 /dev/fb0 是 ST7789。
9. 用命令向 SPI 屏幕写入测试画面
先检查 framebuffer 分辨率和像素位数:
cat /sys/class/graphics/fb0/virtual_size
cat /sys/class/graphics/fb0/bits_per_pixel下面命令假设输出为 240,240 和 16,即每像素 16 bit(RGB565),单帧大小为:
240 × 240 × 2 = 115200 字节显示白色:
head -c 115200 /dev/zero | tr '\000' '\377' > /dev/fb0显示黑色:
dd if=/dev/zero of=/dev/fb0 bs=115200 count=1写入随机像素数据:
dd if=/dev/urandom of=/dev/fb0 bs=115200 count=1预期现象:
- 白色命令执行后,屏幕变白。
- 黑色命令执行后,屏幕变黑。
- 随机数据命令执行后,屏幕出现随机彩色噪点。
随机数据仅用于验证写入链路,不是稳定的测试图案。如果 bits_per_pixel 不是 16,或分辨率不同,不要直接使用上述 115200 字节的长度。
10. 检查背光控制
先查看实际注册的背光设备:
ls -l /sys/class/backlight/
cat /sys/kernel/debug/pwm
cat /sys/kernel/debug/devices_deferred如果 /sys/class/backlight/ 下出现 st7789-backlight,可以执行:
echo 0 > /sys/class/backlight/st7789-backlight/bl_power
echo 6 > /sys/class/backlight/st7789-backlight/brightness关闭背光亮度:
echo 0 > /sys/class/backlight/st7789-backlight/brightness如果实际目录名不是 st7789-backlight,先使用 ls 输出中的真实名称;不要误操作 MIPI 屏幕的背光设备。
若 /sys/kernel/debug/devices_deferred 中仍出现类似:
st7789-backlight platform: supplier fe6f0000.pwm not ready说明背光设备仍在等待 PWM 供应端,继续检查 PWM8 的 pinctrl 状态和实际加载的设备树。背光亮起本身不能证明 ST7789 已收到初始化命令。
预期与实际
| 检查项 | 预期现象或判定条件 | 实际观察 | 当前状态 |
|---|---|---|---|
| 内核驱动 | CONFIG_FB_TFT_ST7789V=y | 已在 .config 中确认 | 通过 |
| SPI 设备 | 存在 spi3.0 | 已看到 spi3.0 | 通过 |
| Framebuffer | /proc/fb 中出现 fb_st7789v | 已看到 0 fb_st7789v | 通过 |
| 分辨率 | 240×240 | 驱动日志报告 240×240 | 通过 |
| SPI 显示 | 屏幕正常显示 | 正常 | 通过 |
| 背光 PWM | PWM 与背光设备均正常注册 | 已注册 | 需按当前启动结果复查 |
数据记录
| 指标 | 单位 | 测试条件或测量方法 | 实测值 | 备注 |
|---|---|---|---|---|
| 屏幕分辨率 | 像素 | 驱动启动日志 | 240×240 | 已确认 |
| SPI 时钟 | MHz | 驱动启动日志 | 8 | DTS 配置值 |
| 配置帧率 | FPS | DTS 的 fps 属性 | 20 | 配置值,不代表实测稳定帧率 |
| 单帧像素数据 | 字节 | 240×240×16 bit | 115200 | 假设 RGB565、无额外行填充 |
结论
泰山派 RK3566 V10 的 Linux 6.1.141 可以使用 FBTFT 的 fb_st7789v 驱动注册 ST7789 SPI 屏幕,并创建 /dev/fb0。实际操作的关键步骤是:
- 启用
CONFIG_FB_TFT_ST7789V等内核配置,并保存到 SDK 实际使用的 defconfig 或配置片段。 - 在实际被编译的 DTS 中启用 SPI3,配置 ST7789、DC 和 RESET GPIO。
- 配置 PWM8 背光。
- 编译后同时更新内核和对应 DTB。
- 用
/dev/fb0写入黑、白和随机像素数据。 b
