Blog:
嵌入式 Arm 在 Linux 下更改调试串口
简介
在基于嵌入式 Arm 开发产品的时候,有时候由于 Arm 处理器 UART 数量的限制,我们需要将系统默认的调试串口打印信息关闭或者转移到其他串口上面去,本文即演示更改 U-Boot 和Linux kernel 调试串口的过程示例。
本文所演示的平台来自于 Toradex Apalis iMX6 Arm 嵌入式平台,这是一个基于NXP iMX6 Arm 处理器,支持双核/四核 Cortex-A9。
准备
a). Apalis iMX6 Arm 核心版配合Ixora载板,分别连接默认调试串口 UART1 和准备要转移的调试串口 UART3 到开发主机方便调试,Apalis iMX6 UART 序号说明请参考这里。
b). Apalis iMX6 系统使用官方预编译 Linux BSP V2.7 版本,如何下载更新请参考这里。
c). 如果只是想关闭默认串口的打印信息,可以参考这里的说明,本文就不赘述。
U-Boot 源代码更改编译
a). 为了将 U-Boot console 从 UART1 转换至 UART3,需要修改 U-Boot 源代码。
b). 根据这里的说明配置好编译所需要的 toolchain,并下载对应 U-Boot 源代码到 Ubuntu 开发主机。
c). 因为针对 Apalis iMX6 U-Boot 的源代码 V2.7 和 V2.8 版本都是基于2016.11-toradex 分支,因此这里为了将源代码锁定为 V2.7 版本需要通过下面命令指定 tag 并创建新的操作分支。
$ cd u-boot-toradex
$ git checkout Colibri-iMX6_LXDE-Image_2.7b4-20171005
$ git checkout –b imx6_v2.7 Colibri-iMX6_LXDE-Image_2.7b4-20171005
d). 修改源代码,具体请参考下面两个 patch 文件
./ apalis_imx6.h – https://github.com/simonqin09/Apalis_iMX6_Console_Switch/blob/master/apalis_imx6.h.patch
./ apalis_imx6.c – https://github.com/simonqin09/Apalis_iMX6_Console_Switch/blob/master/apalis_imx6.c.patch
apalis_imx6.h 头文件中修改 Console 环境变量的默认值是为了后续配合 Linux kernel console 的修改,其他修改都是为了 U-Boot console 的修改。
e). 重新编译源代码$ make apalis_imx6_defconfig
$ make -j3 2>&1 | tee build.log
f). 将新编译生成的 U-Boot 相关文件 SPL 和 u-boot.img 替换之前更新Linux BSP image 所制作的 SD 卡里面的相关文件。$ cd /media/username/… (SD卡挂载路径)
$ cd apalis_imx6
$ mv SPL SPL.bak
$ mv u-boot.imx-spl u-boot.imx-spl.bak
$ cp …/ u-boot-toradex /SPL .
$ cp …/ u-boot-toradex /u-boot.img u-boot.imx-spl
更新 U-Boot 以及修改 Linux 文件系统
a). 在通过 SD 卡更新新的 U-Boot 之前,先进入 Apalis iMX6 Linux 文件系统进行如下配置修改。$ cd /etc/systemd/system/getty.target.wants
$ cp serial-getty@ttymxc0.service serial-getty@ttymxc3.service
$ systemctl disable serial-getty@ttymxc0.service
$ reboot
b). 重启后通过默认调试串口 UART1 进入 U-Boot,连接 SD 卡到 Apalis iMX6,执行下面命令进行 U-Boot 更新# run setupdate
# run update_uboot
c). 更新完成后,再次重启,此时 U-Boot console 已经切换到新的 UART3 串口上面了,再次进入 U-Boot,执行下面命令载入默认的环境变量。# env default –a
# saveenv
d). 此时重启后,U-Boot console和 Linux kernel console 就都全部切换到新的 UART3 串口上面了,完成了本次示例。