龙空技术网

uboot传递console究竟怎么填?ttyX傻傻分不清

程序员写个解 156

前言:

当前看官们对“重写console”大概比较看重,大家都想要学习一些“重写console”的相关知识。那么小编在网摘上网罗了一些对于“重写console””的相关内容,希望兄弟们能喜欢,小伙伴们快快来了解一下吧!

uboot传递console究竟怎么填?ttyS0、ttyAMA0、ttySAC0傻傻分不清

个人认为:所有ttyXXX都是同一个东西,是为了避免linux识别错误而特意区分。

什么是tty?相信 StackExchange 的回答能解决你的疑惑——“What is the exact difference between a ‘terminal’, a ‘shell’, a ‘tty’ and a ‘console’?”

1. 为什么说是防止出错

历史科普不是本文想说的,本文主要回答:为什么uboot填写bootargs时console有这么多tty类型。似乎每遇到一种芯片都有独特的TTY设备。

考虑到linux的设备节点命名规则不难发现,同类型的设备有同样的前缀,后面以数字区分,如:/dev/sda1、/dev/sdb1、/dev/fb0、/dev/fb1。设备的序号根据添加顺序而定,platform_device和platform_driver同时match后则生成一个设备。

那么考虑这种情况:若所有tty串口都以ttyS为前缀 。板卡有4个串口,匹配设备和驱动时没把 调试串口 写在 第一行 ,那ttyS0就不是printk的默认输出设备。

就算4个串口匹配时调试串口写在第一行,还得考虑其他驱动呢,比如某个变态的USB转串口驱动也命名为ttyS0,而且上电前USB设备就插在板卡上,好嘞,系统启动后看不到任何信息。

于是有个取巧的方式,给4个串口中的调试串口取一个独一无二的名称 tty-I-am-special,板卡串口驱动复制一份,将 struct console 的name重命名为“tty-I-am-special”,那么无论设备和驱动如何匹配,调试串口就叫做 /dev/tty-I-am-special0。其他3个串口谁是谁,管他呢,反正最后加入文件系统后 __ls /dev/tty*__ 都能查询到。

console=tty-I-am-special0

2. 例子:如何确定填写内容

下面的例子源于iMX28处理器,调试串口叫DUART,应该填写 setenv bootargs ‘console=ttyAMA0,115200n1’。怎么判断的?

首先检查设备树对调试串口的描述,调试串口节点duart

接着查询哪个驱动的名称可能匹配“arm,pl011”或“arm,primecell”,很好,找到一个匹配的.c源文件,别高兴太早,再确认该文件确实被编译到内核。

最后确认该驱动里的tty全称是什么。

最后顺便看看其他驱动五花八门的tty命名。

标签: #重写console