没错,还是关于树莓派的文章。今天整串口的时候发现,ttl 板子连到 GPIO 14 和 15 上没有输出,但内核参数已经有了 console=ttyAMA0
相关的设置,这就令人不解了。
于是去 raspberrypi.org
上找了一下关于串口的资料。
在 https://www.raspberrypi.org/documentation/configuration/uart.md
这里可以看到树莓派的 SoC 有两个内建的 UART, 一个叫做 PL011
, 一个叫做 mini UART
。
在 Linux 中,PL011
的串口是 /dev/ttyAMA0
设备, 而 mini UART
则是 /dev/ttyS0
设备。
同时有 wifi与蓝牙模块的设备上,比如 pi 3 和 zero,PL011
即 ttyAMA0
默认是和蓝牙模块连接着的,在这种情况下,ttyS0
则是默认被禁用状态的,在 /dev
下是不会出现 ttyS0
设备的,并且板子上的 GPIO 14 和 15 实际上应该算是空置状态的。
ttyS0
禁用的原因是,mini UART
的波特率是和 VPU 有关系的,由于动态频率的原因,波特率也会随着变化的,因此默认情况下这个 UART
实际上是没什么多大用处的。
而在没有蓝牙的设备上,ttyS0
则会出现在 /dev
设备上,但 GPIO 14 和 15 是连接到 ttyS0
还是 ttyAMA0
上由于手上没有设备,暂时无法确定。不过根据文档推算应该是 ttyAMA0
连接到了 14 和 15 接口上。
回到开头的问题上,由于我用的是给树莓派1代用的系统,我们知道1代是没有蓝牙的,因此一代的 ttyAMA0
是连接到 14 和 15上的,这样配置 console
参数并没有问题,然而这个镜像用在 zero 上就有问题了。ttyS0
默认关闭,ttyAMA0
又是连接了蓝牙。那么有什么办法解决呢?
在文档里面还提到了一个 enable_uart
参数,通过在 /boot/config.txt
里设置这个参数为1, 我们可以启用 ttyS0
串口, 并且将这个串口连接到 GPIO 上. 并且将内核参数 console
改到 ttyS0
上. 但这样做将会导致CPU核心被限制, 无法进行动态睿频. 这显然不是我们想要的结果.
继续往下翻可以看到, 我们还可以通过加载不同的 device tree 来改变蓝牙和串口的功能. 提供了两张解决方案.
pi3-disable-bt:
在这种方案下, 将完全禁用板载的蓝牙功能, 作为回报, ttyAMA0
将会被释放出来, 并且会连接到 GPIO 14 和 15上
pi3-miniuart-bt:
这种方案则是将蓝牙连接到 mini UART
上, 同时释放 ttyAMA0
, 并且会把 ttyAMA0
连接到 GPIO 14 和 15上.
似乎看起来既能让 CPU 不被限制频率, 还能有蓝牙, 还能有串口的方案就只有 pi3-miniuart-bt
了. 通过添加 dtoverlay=pi3-miniuart-bt
到 config.txt
里面就可以启用这个功能了.