You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Buildroot+BusyBox的RPi3上驱动3.5寸TFT LCD?

问题:无Buildroot源码时,树莓派3 Buildroot+BusyBox系统驱动3.5寸TFT LCD

我正尝试在搭载Buildroot+BusyBox系统的树莓派3 Model B v1.2(2015款)上驱动3.5寸TFT LCD,但相关LCD配置脚本均基于Debian发行版,且无法获取该设备的Buildroot配置源码。目前仅能通过chroot和qemu-user-static(ARM)操作文件系统、编辑文件及运行程序。

已修改部分配置文件,计划采用Buildroot手册中“Dynamic using devmpfs+mdev”的/dev管理方案,同时梳理出系统启动流程:

  1. PCB上电(ARM11处于禁用状态)
  2. SoC GPU将第一阶段引导程序bootcode.bin加载到L2缓存并执行
  3. bootcode.bin初始化SDRAM,将第二阶段引导程序start.elf加载到外部RAM并执行
  4. start.elf根据config.txt配置硬件,加载内核镜像kernel.img,从cmdline.txt读取内核命令行参数
  5. 初始化Linux,调用busybox init
  6. 读取/etc/inittab,进而读取/etc/mdev.conf
  7. 启动/etc/init.d/rcS

系统未安装X11,目标至少实现TTY显示。已将/etc/inittab中getty配置从串口ttyACM0改为tty1。


补充信息

/etc/os-release输出

/ # cat /etc/os-release
NAME=Buildroot
VERSION=2018.08-gd14bfd8be1
ID=buildroot
VERSION_ID=2018.08
PRETTY_NAME="Buildroot 2018.08"
/ #

/etc/inittab内容

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts /dev/shm
::sysinit:/bin/mount -a
::sysinit:/sbin/swapon -a
null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
tty1::respawn:/sbin/getty -L  tty1 0 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r 

chroot操作步骤(qemu-user-static + binfmt_misc)

  1. 挂载SD卡上的目标根文件系统
  2. 挂载临时文件系统及调试追踪子系统,脚本如下:
up() {
# mount device with udisksctl (udev)
udisksctl mount -b "$device"

# on target rootfs, bind mount local host rootfs
# pseudo-filesystems in the chroot target rootfs
for f in 'dev' 'dev/pts' 'proc' 'sys' 'run'; do
   sudo mount --bind "/$f" "/run/media/$USER/$uuid/$f";
done

# bind mount debug and trace pseudo-filesystems
sudo mount -t tracefs tracefs "/run/media/$USER/$uuid/sys/kernel/tracing/"
sudo mount -t debugfs debufs "/run/media/$USER/$uuid/sys/kernel/debug/"
}

down() {

# unmount the bind mount debug and trace pseudo-filesystems in reverse order
sudo umount "/run/media/$USER/$uuid/sys/kernel/debug/"
sudo umount "/run/media/$USER/$uuid/sys/kernel/tracing/"

# unmount remaining pseudo-filesystems in reverse order
for f in 'run' 'sys' 'proc' 'dev/pts' 'dev'; do
    sudo umount "/run/media/$USER/$uuid/$f";
done

# umount device with udisksctl (udev)
udisksctl unmount -b "$device"
}
  1. 将/bin/qemu-arm-static复制到目标根文件系统的/bin/目录
  2. 进入目标根文件系统执行sudo chroot . /bin/sh
  3. 执行# source /etc/profile

解决方案

针对无Buildroot源码、Debian脚本不适用的场景,可按以下步骤实现TTY显示:

1. 确认LCD对应的内核驱动模块

先明确这款3.5寸TFT LCD的芯片型号(如ILI9488、HX8357等),找到匹配的Linux内核驱动模块:

  • 挂载SD卡的boot分区,查看config.txt中是否有LCD相关的设备树overlay配置(类似dtoverlay=waveshare35a),若有直接启用;
  • 若无对应overlay,通过chroot进入系统后,执行lsmod查看已加载模块,或find /lib/modules/$(uname -r)/ -name "*lcd*.ko"查找驱动文件,确认当前内核是否包含该驱动。

2. 配置boot分区的硬件参数

树莓派GPU负责初始化显示硬件,需在config.txt中添加正确配置:

  • 设置LCD分辨率:framebuffer_width=480、framebuffer_height=320(根据实际屏幕参数调整);
  • 启用对应设备树overlay(内核支持的情况下):dtoverlay=xxx-lcd;
  • 设置显示方向:display_rotate=0(0为正常,1/2/3对应旋转90/180/270度);
  • 禁用默认HDMI显示(若仅用LCD):hdmi_ignore_hotplug=1。

3. 调整内核命令行参数(cmdline.txt)

确保内核启动时将控制台输出定向到LCD对应的TTY:

  • 在cmdline.txt中添加或保留console=tty1(配合inittab中的tty1 getty配置),同时可保留console=ttyAMA0,115200用于串口调试;
  • 添加fbcon=map:10(若LCD为第二个帧缓冲设备),强制控制台输出到LCD对应的帧缓冲。

4. 验证帧缓冲设备

系统启动后,通过串口或chroot检查帧缓冲状态:

  • 执行cat /dev/zero > /dev/fb0,若LCD屏幕变黑,说明帧缓冲设备正常工作;
  • 执行fbset查看帧缓冲的分辨率、色深等参数,若与LCD不匹配,需调整config.txt参数或加载正确驱动模块。

5. 确保mdev正确管理帧缓冲设备

由于使用mdev管理/dev设备,需在/etc/mdev.conf中添加帧缓冲设备规则:

  • 添加fb[0-9]:root:root:660,确保设备节点权限正确;
  • 重启系统后,检查/dev/fb*是否自动创建。

6. 调试与排错

若TTY仍不显示,可通过以下方式排查:

  • 查看内核日志:dmesg | grep -E "fb|lcd",检查驱动加载是否成功、是否有错误信息;
  • 检查getty进程:ps aux | grep getty,确认tty1的getty进程正常运行;
  • 手动启动getty:/sbin/getty -L tty1 0 vt100,查看是否有报错;
  • 使用fbgrab(系统已安装的话)抓取帧缓冲内容,确认控制台输出是否渲染到帧缓冲。

内容的提问来源于stack exchange,提问作者deomorxsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:17:07