user版本如何打开uart,让android log从串口kernel log输出

本文档介绍了如何在Android User版本中启用UART,包括修改LK配置、开启UART控制台以及通过串口捕获Kernel和上层LOG。针对可能出现的问题,如UART卡死、数据流控制和回显等进行了分析,并提供了解决方案,如关闭数据流控制、后台运行logcat以及将logcat重定向到kmsg。

user版本打开uart

  1. 如何在user版本中使用串口(uart)

    bootable/bootloader/lk/app/mt_boot/mt_boot.c

    582 #ifdef USER_BUILD                
    583         sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=1");
    584 #else
    585         sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=0 ddebug_query=\"file *mediatek* +p ; file *gpu* =_\"");
    586 #endif

    将上面的printk.disable_uart=1改成printk.disable_uart=0,然后重新编译lk, download lk 即可;或者直接download eng版本的lk。

  2. 如何开启Uart 的控制台(console/sh)
    system/core/rootdir/init.rc

    515 service console /system/bin/sh
    516     class core
    517     console
    518     disabled
    519     user shell
    520     seclabel u:r:shell:s0
    521 
    522 on property:ro.debuggable=1
    523     start console

    注释掉on property:ro.debuggable=1,然后重新编译bootimage 即可。

  3. 如何在Uart 上抓取上层LOG
    Uart 上进行输入,实际就是开启了一个sh 对接起来,所以绝对不能在uart 上输入一个长命令(不可中断),否则uart 将被卡住,不能再输入。
    抓取上层log, 我们通常需要使用logcat, 但logcat 是不可中断的,将导致uart 不能再输入。
    处理的方法即将logcat 转入后台执行,如下操作即可:

    Main log: logcat -v time &
    Radio log: logcat -v time -b radio &
    Event log: logcat -v time -b events &

    如果想关闭上层log, 直接ps 查阅前面开启的logcat process pid, 然后kill -9 pid 杀掉即可。
    注意一定要带“&”,否则将block 住uart输入

让android log从串口kernel log输出

分析无法开机问题,如串口RX/TX连接正常,可正常输入,请参考上面第3点。
如确认RX/TX连接正常,但不能输入,则可能是下面原因导致:

  1. 数据流控制是否正确,一般需关闭,下面为RS232的三种流控制模式介绍:
    DTR/DSR:硬件上要有对应接口,软件上实现对应协议,才能实现此流控制。具体实现起来,一般好像是和RTS/CTS一直搭配使用。

    RTS/CTS:硬件上要有对应接口,软件上实现对应协议,才能实现此流控制。一般常见的也就是这种。但是很多开发板用secureCRT连接开发板的时候,往往都是在Uboot阶段,那时候还没有实现对应的RTS/CTS的流控制,所以此处需要取消此选择,否则,secureCRT就会去一直检测对应的RTS(Request To Send)pin脚,发现一直是无效,所以就一直没有接受到数据,就“卡”在那了。同样,你要输入数据,就是secureCRT要发送数据,所以其先发了个RTS给开发板,然后就一直检测自己的CTS是否有效,直到自己的CTS有效后,才能发送数据,而此处由于开发板上的驱动没有实现RTS/CTS,所以secureCRT就一直检测CTS,就“卡”死了,即你无法输入数据。

    XON/XOFF:软件上实现的流控制,硬件上无需像上面的RTS/CTS或DTR/DSR那样要增加对应的引脚。但是由于XON/XOFF分别对应的两个二进制的值,所以如果本身传输数据中包括该值,那么此软件的流控制就失效了。现在好像也很少用此种流控制了。

  2. 是否打开回显

串口分析kernel log正常但adb连不上时,并且串口只能输出时,希望让android log也从串口输出,可以尝试此方法,以下是一个验证过的示例。
原理上就是根据kernel log能够从串口输出,只要将logcat重定向到kmsg即可实现,因此各个平台的原理是一样的应该通用。(但须注意这样打印虽然能够有android log从串口输出,但串口输出量过大可能会出现丢log的情况)
system/core/rootdir/init.rc中添加:

chmod 0660 /proc/kmsg
###############################################################
# redirect logs(LOGE, LOGI...) to linux console
###############################################################
service logcat /system/bin/logcat -f /dev/kmsg *:D
 class main
 user root
 group log
### SSH 终端显示的 CPU 日志信息为什么不通过 UART 接口输出? 在 Linux 系统中,SSH 终端所显示的 CPU 日志信息通常来源于内核或用户空间的日志服务(如 `rsyslog` 或 `journald`)。这些日志信息的输出路径由日志服务配置决定,并非默认输出UART 接口。因此,即使通过 SSH 登录系统并查看日志,这些信息也不会自动通过 UART 接口传输[^1]。 #### 1. 日志服务的输出路径配置 默认情况下,系统日志服务(如 `rsyslog`)将日志信息输出到文件(如 `/var/log/syslog` 或 `/var/log/messages`),而非串口设备。如果希望日志信息同步输出UART 接口,需要在 `/etc/rsyslog.conf` 或其配置文件中添加特定规则,例如: ```bash # 将 auth 类型的日志输出串口 auth.* /dev/ttyS0 ``` 此配置可将特定类型的日志写入 UART 设备(如 `/dev/ttyS0`),从而在串口终端中查看相关信息。若未配置此类规则,则日志信息不会自动通过 UART 接口输出[^1]。 #### 2. UART 接口作为控制台的配置 若 UART 接口未被配置为系统控制台,内核日志(如通过 `dmesg` 查看的信息)也不会自动输出串口。可以通过在内核启动参数中添加 `console=ttyS0,115200` 来启用 UART 作为控制台输出接口。例如,在 `/boot/grub/grub.cfg` 或 U-Boot 环境变量中添加: ```bash kernel /vmlinuz-5.15.0 root=/dev/mmcblk0p2 console=ttyS0,115200 ``` 这样,系统启动时的内核日志将通过 UART 输出,SSH 终端中执行 `dmesg` 时看到的日志信息也将同步显示在串口终端上。 #### 3. 用户空间日志与终端行为的差异 SSH 终端中查看的日志信息(如通过 `journalctl` 或 `tail -f /var/log/syslog`)属于用户空间行为,与 UART 接口无直接关联。这些日志由日志服务收集并显示,若未显式配置转发到串口设备,则不会通过 UART 输出。此外,用户执行命令时的输入输出(如 `top` 或 `htop` 显示的 CPU 使用情况)属于伪终端(PTY)I/O 流,与 `rsyslog` 处理的日志类型不同,因此也不会自动通过 UART 接口传输。 #### 4. 实现 UART 接口同步日志的可行方案 若需实现 SSH 终端查看的 CPU 日志信息同步输出UART 接口,可以采取以下方式: - **配置 `rsyslog` 将日志转发到串口设备**:在 `/etc/rsyslog.conf` 中添加规则,将特定日志类型(如 `kern.*` 或 `user.*`)写入 `/dev/ttyS0`。 - **启用 UART 作为系统控制台**:修改内核启动参数,添加 `console=ttyS0,115200`,确保内核日志输出串口。 - **使用 `script` 或 `ttylog` 工具记录终端行为**:结合 `script -f /dev/ttyS0` 命令,将当前终端的输入输出实时写入串口设备。 - **使用 `socat` 实现伪终端与串口之间的双向通信**:例如,通过以下命令将伪终端与 UART 接口连接: ```bash socat PTY,link=/tmp/vtty0,raw,echo=0 FILE:/dev/ttyS0,b115200,raw,echo=0 ``` 该命令将创建一个虚拟终端 `/tmp/vtty0`,并通过 `socat` 将其与 UART 接口连接,实现双向数据传输。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值