跳转到正文
实验记录
RK3566✓ 已验证

泰山派 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 配置 ​

先在开发板终端确认板型与内核版本:

开发板终端bash
cat /proc/device-tree/model
uname -r
cat /proc/fb

本次确认:

text
lckfb tspi V10 Board
6.1.141

在电脑的 SDK 根目录执行:

SDK 编译电脑bash
grep -E '^(RK_KERNEL_CFG|RK_KERNEL_CFG_FRAGMENTS|RK_KERNEL_DTS_NAME)=' output/.config

本次已确认 SDK 使用的基础内核配置为:

text
RK_KERNEL_CFG="rockchip_linux_defconfig"

DTS 文件应以 SDK 实际选择的 RK_KERNEL_DTS_NAME 为准。本次使用的文件是:

text
kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts

如果命令显示的 DTS 名称与此不同,先找到实际被构建的 DTS,不要改错文件。

2. 在 menuconfig 中启用内核选项 ​

进入内核源码目录:

SDK 编译电脑bash
cd kernel-6.1
make ARCH=arm64 menuconfig

在菜单中找到并启用下列配置。建议编译进内核,配置值为 y,避免还需要手动加载模块。

配置项menuconfig 位置
CONFIG_FBDevice Drivers → Graphics support → Frame buffer Devices → Support for frame buffer devices
CONFIG_STAGINGDevice Drivers → Staging drivers
CONFIG_FB_TFTDevice Drivers → Staging drivers → Support for small TFT LCD display modules
CONFIG_FB_TFT_ST7789VDevice Drivers → Staging drivers → Support for small TFT LCD display modules → FB driver for the ST7789V LCD Controller
CONFIG_BACKLIGHT_PWMDevice Drivers → Graphics support → Backlight & LCD device support → Lowlevel Backlight controls → Generic PWM based Backlight Driver
CONFIG_PWM_ROCKCHIPDevice Drivers → Pulse-Width Modulation (PWM) Support → Rockchip PWM support

如果菜单里找不到某个选项:

  1. 在 menuconfig 中按 /。
  2. 输入配置名,例如 FB_TFT_ST7789V,按 Enter。
  3. 查看搜索结果中的 Location 和 Depends on,按提示进入对应菜单。
  4. 先启用依赖项 FB、STAGING、FB_TFT,再检查 ST7789V 选项。

保存退出后,在 kernel-6.1/ 目录检查:

SDK 编译电脑bash
grep -E '^(CONFIG_(FB|STAGING|FB_TFT|FB_TFT_ST7789V|BACKLIGHT_PWM|PWM_ROCKCHIP)=)' .config

预期结果:

text
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_FBdrivers/video/fbdev/Kconfig
CONFIG_STAGINGdrivers/staging/Kconfig
CONFIG_FB_TFT、CONFIG_FB_TFT_ST7789Vdrivers/staging/fbtft/Kconfig
CONFIG_BACKLIGHT_PWMdrivers/video/backlight/Kconfig
CONFIG_PWM_ROCKCHIPdrivers/pwm/Kconfig

3. 保存内核配置,避免下次构建被覆盖 ​

只修改 kernel-6.1/.config 不一定能保留修改,因为 SDK 构建时可能会根据 defconfig 重新生成它。

本次 SDK 的基础配置是 rockchip_linux_defconfig。先在 kernel-6.1/ 目录执行:

SDK 编译电脑bash
make ARCH=arm64 savedefconfig

该命令会在当前内核源码目录生成精简配置文件 defconfig。先检查 ST7789 选项是否保留:

SDK 编译电脑bash
grep -E 'CONFIG_(FB_TFT_ST7789V|FB_TFT|BACKLIGHT_PWM|PWM_ROCKCHIP)' defconfig

备份原始配置,再比较差异:

SDK 编译电脑bash
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 当前使用的基础配置:

SDK 编译电脑bash
cp defconfig arch/arm64/configs/rockchip_linux_defconfig

注意: 如果第 1 步查到 RK_KERNEL_CFG_FRAGMENTS 有非空值,说明 SDK 还使用了配置片段。此时先查明该片段的实际文件和覆盖规则,不要直接覆盖基础 defconfig;应把配置加到实际使用的片段中。

完成后返回 SDK 根目录:

SDK 编译电脑bash
cd ..

4. 修改设备树,添加 ST7789 ​

先备份本次使用的 DTS:

SDK 编译电脑bash
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 设备。下面是本次使用的关键节点:

tspi-rk3566-user-v10-linux.dtsdts
&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:

tspi-rk3566-user-v10-linux.dtsdts
&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 / CLKGPIO4_C2SPI 时钟
SDA / MOSIGPIO4_C3SPI 数据输入到屏幕;不是 I²C SDA
CSGPIO4_C6SPI 片选
DC / RSGPIO3_C2命令/数据选择
RESET / RESGPIO3_B0屏幕复位,低有效
BLK 调光GPIO3_B1PWM8_M0,控制背光驱动电路

注意事项:

  • 不要同时保留 spi_test@0 和 display@0 两个 reg = <0> 的 SPI 子设备;它们会占用同一个 SPI 片选地址。
  • FPC 的 Pin 1 方向必须按屏幕排线触点方向、连接器 Pin 1 标记和实际接线核对,不能只按排线外观判断。
  • 上电前检查 IOVCC、VDD、GND 及 GPIO 电平是否符合屏幕规格。

5. 配置 PWM8 背光 ​

tspi-rk3566-user-v10-linux.dtsdts
&pwm8 {
    status = "okay";
    pinctrl-names = "active";
    pinctrl-0 = <&pwm8m0_pins>;
};

在设备树根节点中添加背光节点:

tspi-rk3566-user-v10-linux.dtsdts
/ {
    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 根目录执行:

SDK 编译电脑bash
./build.sh kernel

编译后检查内核配置是否仍然启用:

SDK 编译电脑bash
grep -E '^(CONFIG_(FB|STAGING|FB_TFT|FB_TFT_ST7789V|BACKLIGHT_PWM|PWM_ROCKCHIP)=)' \
    kernel-6.1/.config

查找本次设备树生成的 DTB:

SDK 编译电脑bash
find kernel-6.1 output -name 'tspi-rk3566-user-v10-linux.dtb' 2>/dev/null

./build.sh kernel 是编译步骤,不代表新内核和 DTB 已经写入开发板。需要按当前 SDK 的启动介质和烧录流程,把新内核及对应 DTB 更新到开发板实际启动使用的位置;不要只更新内核而遗漏设备树。

8. 在开发板上确认驱动已加载 ​

启动后执行:

开发板终端bash
ls /sys/class/spi_master/
ls /sys/bus/spi/devices/
cat /proc/fb
ls -l /dev/fb*
dmesg | grep -Ei 'st7789|fbtft|spi3'

本次实际看到 SPI 设备:

text
spi3
spi3.0

Framebuffer 列表:

text
0 fb_st7789v

关键日志:

text
graphics fb0: fb_st7789v frame buffer,
240x240, 112 KiB video memory,
fps=20, spi3.0 at 8 MHz

检查 SPI 设备绑定的驱动:

开发板终端bash
readlink -f /sys/bus/spi/devices/spi3.0/driver

这里的 /dev/fb0 是 ST7789。

9. 用命令向 SPI 屏幕写入测试画面 ​

先检查 framebuffer 分辨率和像素位数:

开发板终端bash
cat /sys/class/graphics/fb0/virtual_size
cat /sys/class/graphics/fb0/bits_per_pixel

下面命令假设输出为 240,240 和 16,即每像素 16 bit(RGB565),单帧大小为:

text
240 × 240 × 2 = 115200 字节

显示白色:

开发板终端bash
head -c 115200 /dev/zero | tr '\000' '\377' > /dev/fb0

显示黑色:

开发板终端bash
dd if=/dev/zero of=/dev/fb0 bs=115200 count=1

写入随机像素数据:

开发板终端bash
dd if=/dev/urandom of=/dev/fb0 bs=115200 count=1

预期现象:

  • 白色命令执行后,屏幕变白。
  • 黑色命令执行后,屏幕变黑。
  • 随机数据命令执行后,屏幕出现随机彩色噪点。

随机数据仅用于验证写入链路,不是稳定的测试图案。如果 bits_per_pixel 不是 16,或分辨率不同,不要直接使用上述 115200 字节的长度。

10. 检查背光控制 ​

先查看实际注册的背光设备:

开发板终端bash
ls -l /sys/class/backlight/
cat /sys/kernel/debug/pwm
cat /sys/kernel/debug/devices_deferred

如果 /sys/class/backlight/ 下出现 st7789-backlight,可以执行:

开发板终端bash
echo 0 > /sys/class/backlight/st7789-backlight/bl_power
echo 6 > /sys/class/backlight/st7789-backlight/brightness

关闭背光亮度:

开发板终端bash
echo 0 > /sys/class/backlight/st7789-backlight/brightness

如果实际目录名不是 st7789-backlight,先使用 ls 输出中的真实名称;不要误操作 MIPI 屏幕的背光设备。

若 /sys/kernel/debug/devices_deferred 中仍出现类似:

text
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 显示屏幕正常显示正常通过
背光 PWMPWM 与背光设备均正常注册已注册需按当前启动结果复查

数据记录 ​

指标单位测试条件或测量方法实测值备注
屏幕分辨率像素驱动启动日志240×240已确认
SPI 时钟MHz驱动启动日志8DTS 配置值
配置帧率FPSDTS 的 fps 属性20配置值,不代表实测稳定帧率
单帧像素数据字节240×240×16 bit115200假设 RGB565、无额外行填充

结论 ​

泰山派 RK3566 V10 的 Linux 6.1.141 可以使用 FBTFT 的 fb_st7789v 驱动注册 ST7789 SPI 屏幕,并创建 /dev/fb0。实际操作的关键步骤是:

  1. 启用 CONFIG_FB_TFT_ST7789V 等内核配置,并保存到 SDK 实际使用的 defconfig 或配置片段。
  2. 在实际被编译的 DTS 中启用 SPI3,配置 ST7789、DC 和 RESET GPIO。
  3. 配置 PWM8 背光。
  4. 编译后同时更新内核和对应 DTB。
  5. 用 /dev/fb0 写入黑、白和随机像素数据。 b

后续 ​