ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Linux系统搭建】嵌入式Linux串口输入问题排查与解决全记录

【Linux系统搭建】嵌入式Linux串口输入问题排查与解决全记录

嵌入式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)
CPUARM 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=参数,但仅作为临时测试。

四、最终解决方案(综合)

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 saveenv

2. 使用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 EOF

3. 屏蔽可能导致启动卡住的服务(如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.service

4. 修复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,无法在串口上创建登录会话。

关键经验

  1. 添加n8到console参数是解决嵌入式串口输入失效的最常用方法。
  2. 在U-Boot阶段测试输入能快速区分是硬件还是软件问题。
  3. 精简系统缺乏init或getty配置时,BusyBox init是最轻量可靠的方案。
  4. 时间同步问题可能影响apt操作,可通过忽略时间验证临时解决。

后续优化

  • 设置硬件时钟(RTC)或启用NTP以保持时间正确。
  • 若需完整Linux环境,可安装systemd或sysvinit并配置相应服务。
  • 添加用户、设置密码,增强系统安全性。

文档版本:1.0
适用平台:正点原子 i.MX6UL / NFS启动 / Ubuntu 20.04

返回列表