如何在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管理方案,同时梳理出系统启动流程:
- PCB上电(ARM11处于禁用状态)
- SoC GPU将第一阶段引导程序bootcode.bin加载到L2缓存并执行
- bootcode.bin初始化SDRAM,将第二阶段引导程序start.elf加载到外部RAM并执行
- start.elf根据config.txt配置硬件,加载内核镜像kernel.img,从cmdline.txt读取内核命令行参数
- 初始化Linux,调用busybox init
- 读取/etc/inittab,进而读取/etc/mdev.conf
- 启动/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)
- 挂载SD卡上的目标根文件系统
- 挂载临时文件系统及调试追踪子系统,脚本如下:
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" }
- 将/bin/qemu-arm-static复制到目标根文件系统的/bin/目录
- 进入目标根文件系统执行
sudo chroot . /bin/sh - 执行
# 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
相关产品推荐
相关产品推荐

