嵌入式Linux串口输入问题排查与解决全记录
适用环境:ARM Cortex-A7(i.MX6UL),NFS根文件系统,U-Boot引导,Ubuntu 20.04基础系统
问题现象:串口能正常显示内核及系统日志,但键盘输入无响应(按回车无效,无法输入命令或登录)
一、问题描述
- 硬件连接正常,串口调试工具(如PuTTY)可看到启动信息。
- 启动过程中,键盘按键无任何反应,无法进入U-Boot命令行或Linux登录提示。
- 最终系统停留在
#或/bin/sh: can't access tty; job control turned off等错误提示,无法交互。
二、环境信息
| 项目 | 详情 |
|---|---|
| 开发板 | 正点原子 i.MX6UL(Alientek) |
| CPU | ARM Cortex-A7 |
| 串口设备 | ttymxc0 |
| 引导程序 | U-Boot |
| 内核 | Linux 4.1.15 |
| 根文件系统 | NFS挂载(Ubuntu 20.04.5 LTS base系统) |
| 串口工具 | PuTTY / minicom(波特率115200,8N1) |
三、排查过程
1. 初步判断硬件层
- 检查串口线序:确认GND、TX、RX连接正确,无松动。
- 主机串口工具设置:将流控(Flow Control)设为None,关闭硬件/软件流控。
- U-Boot阶段测试:上电后迅速按任意键,进入U-Boot命令行,发现可以正常输入→ 说明硬件连接和串口驱动在引导阶段正常,问题出在Linux内核或用户态。
2. 定位内核层面
- 观察内核启动参数
console=ttymxc0,115200,怀疑内核串口驱动默认启用硬件流控(RTS/CTS),而开发板未连接相应引脚,导致内核忽略输入。 - 修改U-Boot的bootargs,增加
n8标志强制关闭流控:
重启后,发现串口输入略有改善,但最终仍无法正常登录(进入setenv bootargsconsole=ttymxc0,115200n8...(其余参数不变)#救援模式)。
3. 用户态服务排查
- 系统启动后未出现
login:,而是直接进入/bin/sh,说明init进程未正确启动getty。 - 查看进程:
ps显示存在agetty进程,但无法交互,怀疑多个进程争用串口设备。 - 尝试手动运行
exec /sbin/agetty -L ttymxc0 115200 vt100,成功出现login:且输入正常,证明硬件和内核驱动无问题,根因锁定在系统初始化配置。
4. 系统初始化方案选择
- 当前系统为精简Ubuntu base,无systemd,init为BusyBox默认(或未配置)。
- 解决方案:
- 方案A:使用BusyBox init并配置
/etc/inittab。 - 方案B:安装systemd并配置
serial-getty@.service覆盖文件。 - 方案C:直接修改内核
init=参数,但仅作为临时测试。
- 方案A:使用BusyBox init并配置
四、最终解决方案(综合)
1. 修复U-Boot启动参数(永久)
# 在U-Boot中执行setenv bootargsconsole=ttymxc0,115200n8root=/dev/nfsnfsroot=192.168.0.128:/home/xx/xx/linux/nfs/ubuntu_rootfs,proto=tcp rwip=192.168.0.55:192.168.0.128:192.168.0.1:255.255.255.0::eth0:off saveenv2. 使用BusyBox init管理串口(轻量级方案)
在宿主机上为NFS根文件系统添加BusyBox并配置inittab:
# 宿主机操作cd/home/xx/xx/linux/nfs/ubuntu_rootfs# 下载BusyBox二进制sudowget-Obin/busybox http://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-armv7lsudochmod+x bin/busybox# 创建init符号链接sudoln-sf/bin/busybox sbin/init# 创建/etc/inittabsudoteeetc/inittab<<EOF ::sysinit:/etc/init.d/rcS ttymxc0::respawn:/sbin/agetty -L ttymxc0 115200 vt100 ::ctrlaltdel:/sbin/reboot ::shutdown:/sbin/swapoff -a EOF3. 屏蔽可能导致启动卡住的服务(如e2scrub)
在宿主机上屏蔽相关服务(如已安装systemd):
cd/home/xx/xx/linux/nfs/ubuntu_rootfsln-sf/dev/null etc/systemd/system/e2scrub_reap.serviceln-sf/dev/null etc/systemd/system/e2scrub_all.service4. 修复APT时间问题(如需安装软件)
系统时间不正确会导致apt更新失败,临时忽略时间验证:
echo'Acquire::Check-Valid-Until "false";'>/etc/apt/apt.conf.d/99ignore-timeaptupdateaptinstall需要的软件5. 主机名修正(可选)
以root身份执行:
echo"ubuntu-imx">/etc/hostnamesed-i'/^127.0.0.1/s/$/ ubuntu-imx/'/etc/hostshostnameubuntu-imx五、验证结果
- 重启开发板后,内核日志正常打印,最终出现
login:提示。 - 键盘输入完全正常,可以输入用户名(如
root)并登录。 - 进入系统后,所有命令可执行,串口交互流畅。
六、总结与建议
根本原因
- 内核串口驱动因默认启用硬件流控,而硬件未连接对应引脚,导致输入被忽略。
- 用户态init(如systemd或BusyBox)未正确配置getty,无法在串口上创建登录会话。
关键经验
- 添加
n8到console参数是解决嵌入式串口输入失效的最常用方法。 - 在U-Boot阶段测试输入能快速区分是硬件还是软件问题。
- 精简系统缺乏init或getty配置时,BusyBox init是最轻量可靠的方案。
- 时间同步问题可能影响apt操作,可通过忽略时间验证临时解决。
后续优化
- 设置硬件时钟(RTC)或启用NTP以保持时间正确。
- 若需完整Linux环境,可安装systemd或sysvinit并配置相应服务。
- 添加用户、设置密码,增强系统安全性。
文档版本:1.0
适用平台:正点原子 i.MX6UL / NFS启动 / Ubuntu 20.04