关于树莓派Zero的串口

没错,还是关于树莓派的文章。今天整串口的时候发现,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,PL011ttyAMA0 默认是和蓝牙模块连接着的,在这种情况下,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-btconfig.txt 里面就可以启用这个功能了.

发表评论

电子邮件地址不会被公开。 必填项已用*标注