[MTK] 深入了解Logging Tools 之 UART Log

文摘 MediaTek 2020-03-16 阅读:629

UART Log

/proc/kmsg 文件节点映射 Kernel Log Buffer,或者 dmesg dump Kernel Log Buffer 实际都是直接从 Buffer 里面获取 Log。在 Kernel Log 章节有讲过,所有的 Kernel Log 都会一字不漏的全部写入的 Buffer 中,所以通过访问 Log Buffer 的方式获取的 Kernel Log 是最完整的。

在 Kernel Log 章节也有提到 Kernel Log 除了输出到 Buffer 之外,还会将一部分 Log 输出的到 Console。所以通过 UART 也是可以获取 Kernel Log的。(具体输出哪些 Log 取决于设定的 log level。更详细的信息请参考 Kernel Log 章节。)

UART 用于 Logging 是极其广泛的,除了 Linux Kernel 默认将其作为 Console 以外,系统其它的部分,如 bootloader 的 Debug 也和 UART Log 紧密相关。所以 UART Log 对于整个系统的 Debug,尤其是开机和关机流程至关重要。

但是 Phone 或者 Tablet 通常都不会留出直接的 UART 接口,而只是在电路板上面留出 UART 测试点,所以抓取 UART Log 就会相对麻烦一点,首先就要准备 UART cable 以及搭建抓取 UART Log 的环境。

UART Cable

UART Cable 的样子通常如下所示,一头的 USB 插口内部内置了 USB 转 UART 的芯片,可以在 PC 端模拟一个 UART COM 口。而另一头通常为了方便通常做成夹子或者钩子的方式,也可以直接焊接在板子的焊点上面。

但是有一点务必要注意:UART Cable 一定要是 1.8V 标准的,否则会抓不到 UART Log

UART Cable.png

UART Port 配置

抓取 UART Log 的时候应该把 UART Cable 连接到哪一个 UART Port呢?这取决于 Preloader 里面的客制化。

对于 ABS Turnkey 的软件包,UART Port 的配置在下面的两个文件中。(如果以下两个文件同时存在请以 cust_bldr.mak 中的配置为准)

  • alps/mediatek/custom/$PROJECT/preloader/cust_bldr.mak
  • alps/mediatek/custom/$PROJECT/preloader/inc/cust_bldr.h

在 alps/mediatek/custom/$PROJECT/preloader/cust_bldr.mak 文件中可以修改 CFG_UART_LOG 定义,默认是UART1,波特率921600。

-   CFG_LOG_BAUDRATE :=921600
-   CFG_UART_LOG :=UART1

在 alps/mediatek/custom/$PROJECT/preloader/cust_bldr.mak 文件中可以直接修改宏定义。如下所示:

-   #define CFG_LOG_BAUDRATE (921600)
-   #define CFG_UART_LOG         (UART2)

对于 AOSP Turnkey 的软件包,UART Port 的定义在文件 alps/bootable/bootloader/preloader/custom/$PROJECT/cust_bldr.mak 中。

-   CFG_LOG_BAUDRATE :=921600
-   CFG_UART_LOG :=UART1

NOTE:修改 UART Port 的配置之后重新编译 Preloader 即可。

另外一点需要注意的是在 preloader 代码里面配置的 uart port 是从 UART1 开始的,但是 PCB layout 的标号有可能是从 UART0 开始的,要注意两边的对应关系。

UART 测试点

为了搭建环境首先就要根据 PCB Layout 找到正确的 UART 测试点位置,并将 UART RX/TX 以及 GND 信号飞线出来。(至少要飞线出 UART TX 以及 GND 信号。)如下图所示:

UART Port.png

NOTE: 务必保证飞线的 UART 测试点与 Preloader 中配置的 UART Port 是一致的,否则是抓不到 UART Log 的。

硬件环境搭建

首先要使用 UART Cable 将 PC 与 Target (Phone 或者 Tablet 等)连接起来。务必正确连接 UART Cable 和 UART 测试点的 RX/TX,如下图所示:

connection.png

串口终端配置

PC 端抓取 UART Log 需要有相应的软件来配合,硬件环境搭建好之后就需要设置 PC 端的 Log 终端。在设置 Log 终端之前首先要确认 UART Cable 在 PC 端对应的 COM Port 是多少。可以在设备管理器里面查看,如下:

设备管理器.png

常用的串口终端有 HyperTerminal(超级终端),Putty,TeraTerm等等,下面以 Putty 为例简单说明一下相关的配置。

在 PuTTY -> Serial 页面配置 Serial line/Speed (Baudrate)/Data Bits/Stop Bits/Parity/Flow control 参数,其中 Parity 和 Flow Control 都要设置为None。 

putty.png

然后回到 Putty -> Session 页面,勾选 Connection Type 为 Serial,点击 Open 按钮即可抓取 UART Log

Putty_config2.png

如果需要将 UART Log 保存到文件还需要在 PuTTY -> Session -> Logging 页面进行设置,可以选择将所有的 session 输出都保存到指定的 Log 文件。

PuTTY Logging.png

下面的截图是成功抓取 UART Log 的 PuTTY 界面:

putty_log.png

小技巧:如何通过 UART 执行 Linux Native 程序?

  • 此方法仅适用 ENG 版本。
  • 必须同时连接好UART RX/TX。

在 UART 串口终端不断的敲回车键就可以敲出命令提示符,如下,这就相当于在串口终端里面拿到了 Linux 的 shell,在这个 shell 里面可以执行任何 shell 命令,如 top,ps 等等。

putty command line.png

如下图所示就是在 UART Shell 里面执行 top 的结果:

uart_top.png

小技巧:如何通过 UART 抓取 Android Log?

  • 此方法仅适用 ENG 版本。- 必须同时连接好UART RX/TX。

同上,如果执行的 Native 程序是 logcat,那么 Android main log 就可以同时被抓取在 UART 终端上面。如下是执行 "logcat -v time &" 的结果,注意末尾的 & 符号,务必要加上它,不然由于 logcat 会阻塞住 shell,就会导致无法再输入其它任何命令了。

从下图我们可以看出,UART log 和 Android Log 已经被抓在一起了。

putty_logcat.png

NOTE:有时候 Log 比较多,我们输入进去的命令可能会被其他 Log 打断,我们可以不用管它,完整输入完命令之后敲回车键即可。(UART 的输入和输出是分开的,印 Log 并不会影响输入的命令)

UART Log 对分析问题的帮助是很大的,能够弥补其它 Log 工具的不足。但是 UART Port 受到波特率的限制,如果 Log 量比较大就会导致 Log 丢失。

另外由于 UART Log 对 Performance 有影响,如果是 Debug Performance 问题则无法依赖 UART Log



0条评论

© 2020 芯缘异码. Powered by Typecho