我正在模拟TI的一个板,它运行ARM-Cortex A15。该板使用UART 8250,默认UART编号为3,地址为0x 48020000。我使用U-boot引导Linux内核并运行qemu:
qemu-system-arm -machine vexpress-a15 -smp 1 -m 1G -kernel u-boot.elf \
-drive file="nandflash.bin",if=mtd,index=0,format=raw \ -chardev file,id=char1,path="${HOME}/serial1.txt",signal=on\ -chardev file,id=char2,path="${HOME}/serial2.txt",signal=on\
-s -S -serial chardev:char1 -serial chardev:char2 -serial stdio
个字符
我可以从U-Boot获取所有消息,从Linux获取内核消息,但来自应用程序的消息不会打印到控制台。当内核运行我的init脚本时,它只打印到/dev/kmsg的消息。举例来说:
#This one below will not print to my console (ttyS2)
echo -n " Mounting /dev/pts : "
#This one will but in the format of kernel message with the timestamp
echo -n " Mounting /dev/pts : " | tee /dev/kmsg
型
这些脚本实际上正在运行,但问题是,我将看到与正常的命令“回声”什么也没有。我想我的串行终端工作得很好。除非,我不会看到不包括内核消息的东西。我在运行init脚本时放入dmesg | grep "tty" | tee /dev/kmsg
并得到:
[ 16.141290] [ 0.000000] Kernel command line: console=ttyO2,9600 rdinit=/sbin/init quiet loglevel=7 log_buf_len=1M
[ 16.141290] [ 0.017880] WARNING: Your 'console=ttyO2' has been replaced by 'ttyS2'
[ 16.141290] [ 3.235689] 48020000.serial: ttyS2 at MMIO 0x48020000 (irq = 45, base_baud = 3000000) is a 8250
[ 16.141290] [ 7.652801] console [ttyS2] enabled
型
我的目标是将“echo without tee /dev/kmsg”的输出打印到我的控制台。我不能用GDB调试,因为当那些init脚本执行时,我看到的唯一事情是CPU转到WFI和NOP。我是新的学习者,所以你的任何建议对我来说都是非常宝贵的。
1条答案
按热度按时间bpzcxfmw1#
我可以想到两种方法来调试它:
首先,内核命令行上的'console= ttyO 2'告诉内核使用该串行端口,但它不一定告诉/sbin/init使用该串行端口(例如用于生成登录提示符)。因此,访客文件系统中可能有一些配置来控制这一点。检查您的客户用户空间进程是否正在尝试将数据发送到内核以转到串行端口。
其次,内核内的打印可能以非中断驱动的方式使用UART,而通过tty层的打印则使用带中断的UART。既然你说这是一个自定义的电路板模型,你应该检查你是否正确地处理了中断(即:它们是否如客户的UART驱动器所期望的那样被连线到中断控制器)。