[節(jié)選] 樹(shù)莓派官方使用手冊(cè)UART篇
本篇節(jié)選自?Configuration 和 Config.txt 這兩篇樹(shù)莓派官方文檔上面有關(guān)UART使用說(shuō)明的段落,并且按照自己的學(xué)習(xí)思路調(diào)整了一下前后知識(shí)點(diǎn)的展示順序,翻譯內(nèi)容僅供參考。

以下內(nèi)容節(jié)選自:https://www.raspberrypi.com/documentation/computers/configuration.html
使用命令行
如果你無(wú)法正常訪問(wèn)圖形化用戶(hù)界面用來(lái)設(shè)置樹(shù)莓派上的無(wú)線網(wǎng),那么這種辦法就比較合適,尤其是當(dāng)你沒(méi)有屏幕或有線以太網(wǎng)絡(luò)時(shí)使用串口終端線纜連接的情況。無(wú)需額外的軟件,因?yàn)槟阈枰乃泄ぞ叨家寻跇?shù)莓派的系統(tǒng)中了。
使用 raspi-config
raspi-config 最初是由? Alex Bradbury 編寫(xiě)的樹(shù)莓派配置工具。想要開(kāi)啟配置工具,請(qǐng)?jiān)诿钚兄休斎胍韵旅睿?/p>
其中 sudo 是必要的,因?yàn)樽鳛?pi 用戶(hù)你將會(huì)修改那些不屬于你的文件。
注意:如果你正在使用的是樹(shù)莓派桌面,那么你可以使用首選項(xiàng)菜單中的圖形化配置應(yīng)用來(lái)配置你的樹(shù)莓派。
隨后你應(yīng)該會(huì)看到一個(gè)藍(lán)底帶選項(xiàng)的灰框界面:

使用上下鍵在可用的選項(xiàng)之間移動(dòng)高亮選擇框。按下向右鍵將會(huì)跳出選項(xiàng)菜單并把焦點(diǎn)落在 <Select> 和 <Finish> 按鈕上。按下向左鍵則回到選項(xiàng)中。此外,你也可以使用 tab 鍵在上述選項(xiàng)之間來(lái)回切換。
總之,raspi-config 工具旨在為大部分常見(jiàn)的配置提供(便捷的)修改功能,這可能會(huì)自動(dòng)編輯 /boot/config.txt 以及眾多標(biāo)準(zhǔn) Linux 配置文件。部分選項(xiàng)需要重啟后生效。如果你修改了當(dāng)中的任何一個(gè),當(dāng)你選中按下 <Finish> 按鈕后 raspi-config 則會(huì)詢(xún)問(wèn)你是否立即重啟樹(shù)莓派。
注意:在長(zhǎng)列表選項(xiàng)中(像是時(shí)區(qū)城市列表),你也可以鍵入字母以跳轉(zhuǎn)到列表中對(duì)應(yīng)的選項(xiàng)上,例如,輸入 L 則會(huì)跳轉(zhuǎn)到離 London 有兩選項(xiàng)之遙的 Lisbon,借助字母表將節(jié)省你從頭至尾上下滾動(dòng)的時(shí)間。
選項(xiàng)列表
Interfacing Options
在這個(gè)子菜單中有下列選項(xiàng)可被啟用或禁用:Camera,SSH,VNC,SPI,I2C,Serial,1-wire 以及 Remote GPIO
Serial
啟用/禁用在串口連接上登錄 shell 和打印內(nèi)核信息。
內(nèi)核命令行
Linux 內(nèi)核在啟動(dòng)時(shí)接受一條由參數(shù)構(gòu)成的命令行。在樹(shù)莓派中,這條命令行被定義在 boot 分區(qū)下一個(gè)名為 cmdline.txt 的文件里面,這是一個(gè)可被任意的文本編輯器(例如 Nano)編輯的、簡(jiǎn)單的文本文件。
注意:必須使用 sudo 編輯 boot 分區(qū)中的任何內(nèi)容,并且 cmdline.txt 里面的所有參數(shù)必須在同一行。
啟動(dòng)時(shí)被傳入內(nèi)核的命令行內(nèi)容可使用 cat /proc/cmdline 進(jìn)行查看,由于固件可能會(huì)在內(nèi)核啟動(dòng)之前修改其中的某些內(nèi)容,因此無(wú)法與 cmdline.txt 完全一致。
命令行選項(xiàng)
有許多內(nèi)核命令行參數(shù),其中的一些是由內(nèi)核定義,其他的則是由內(nèi)核可能用到的代碼定義。
標(biāo)準(zhǔn)項(xiàng)
console:定義了串口中斷,通常有(以下)兩條內(nèi)容:
root:定義了根文件系統(tǒng)的位置,例如 root=/dev/mmcblk0p2 表示多媒體存儲(chǔ)卡的 0 號(hào)區(qū)塊?2 號(hào)分區(qū)
rootfstype:定義了 rootfs 所使用的文件系統(tǒng)類(lèi)型,例如 rootfstype=ext4
quiet:設(shè)置默認(rèn)的內(nèi)核日志級(jí)別為 KERN_WARNING,會(huì)在啟動(dòng)時(shí)抑制除非常嚴(yán)重的日志消息以外所有內(nèi)容的輸出。
配置通用異步收發(fā)器(UART)
在樹(shù)莓派上有 PL011 和 miniUART 這兩種類(lèi)型的 UART 可被使用。PL011 是全功能的、廣泛兼容 16550 的 UART,而 miniUART 只包含更少的功能集。
樹(shù)莓派上的所有 UART 耐受電壓僅為 3.3V,如果(直接)接入到 5V 的電路系統(tǒng)中可能會(huì)被燒壞,可以用一個(gè)適配器連接到 5V 電路系統(tǒng)。除此以外,也可以使用第三方的低功耗 USB 轉(zhuǎn) 3.3V 串口適配器。
樹(shù)莓派 Zero,1,2 ,3
樹(shù)莓派 Zero,1,2,3 型號(hào)各自含有如下的 2 個(gè) UART:
樹(shù)莓派 4 以及 400 系列
樹(shù)莓派 4B 和 400 擁有額外的 4 個(gè) PL011 串口,默認(rèn)是被禁用的:
CM1,CM3,CM3+ 以及 CM4
第一代通用計(jì)算模塊(CM1),與 CM3 和 CM3+ 各自擁有 2 個(gè) UART,而 CM4 則擁有上述的 6 個(gè) UART。
在所有型號(hào)的計(jì)算模塊中,UART 默認(rèn)是被禁用且可以使用設(shè)備樹(shù) overlay 被精確地啟用。你也可以指定使用哪個(gè) GPIO 針腳,例如:
主串口(Primary UART)
在樹(shù)莓派上,其中一個(gè) UART 被選擇呈現(xiàn)在 GPIO 14(傳輸)和 GPIO 15(接收)針腳上,這個(gè)就是主串口。默認(rèn)情況下,這也會(huì)作為在上面顯示 Linux 終端的 UART,注意 GPIO 14 對(duì)應(yīng)著 GPIO 排頭的 8 號(hào)物理針腳,而 GPIO 15 對(duì)應(yīng) 10 號(hào)物理針腳。
輔助串口(Secondary UART)
輔助串口通常不會(huì)被呈現(xiàn)在 GPIO 控制器上。在那些含有這類(lèi)控制器的設(shè)備型號(hào)上,默認(rèn)情況是被連接到集成了無(wú)線網(wǎng)/藍(lán)牙控制器的藍(lán)牙模塊一側(cè)。
主串口與輔助串口
以下總結(jié)了前兩個(gè) UART 的分配情況:
解釋示例:Raspberry Pi 4 系列型號(hào)產(chǎn)品的主串口對(duì)應(yīng) miniUART;輔助串口對(duì)應(yīng) UART0(PL011)被用藍(lán)牙模塊。其他項(xiàng)目依此類(lèi)推。
注意:mini UART 默認(rèn)是被禁用的,無(wú)論是被設(shè)計(jì)成主串口還是輔助串口。
Raspberry Pi OS 中的 Linux 設(shè)備文件:
注意:/dev/serial0 和 /dev/serial1 分別是指向 /dev/ttyS0 或 /dev/ttyAMA0 設(shè)備的符號(hào)連接。
Mini-UART 與 CPU 核心頻率
為了使用? mini UART,你需要配置樹(shù)莓派使用一個(gè)固定的 VPU 核心時(shí)鐘頻率。這是因?yàn)?mini UART 的時(shí)鐘是與 VPU 的核心時(shí)鐘相關(guān)聯(lián)的,因此當(dāng)核心時(shí)鐘頻率發(fā)生改變時(shí),UART 的波特率也會(huì)隨之改變??梢韵?config.txt 中添加 enable_uart 和 core_freq 設(shè)置以改變 mini UART 的行為。以下總結(jié)了可能的組合形式:
enable_uart 標(biāo)志的默認(rèn)狀態(tài)取決于主串口是哪種類(lèi)型的 UART:
禁用 Linux 串口終端
默認(rèn)情況下,主串口會(huì)被分配作為 Linux 終端,如果你希望將主串口用作其他的用途,你必須先重新配置一下系統(tǒng),這一步可以用 raspi-config 來(lái)完成:
1. 開(kāi)啟 raspi-config:sudo raspi-config
2. 選中選項(xiàng)3:Interface Options
3. 選中選項(xiàng)P6:Serial Port
4. 在提示 Would you like a login shell to be accessible over serial? 的時(shí)候選擇 "No"
5. 在提示 Would you like the serial port hardware to be enabled? 的時(shí)候選擇 "Yes"
6. 退出 raspi-config 然后重啟樹(shù)莓派讓修改生效。
啟用 Linux Early Console
盡管 Linux 內(nèi)核在啟動(dòng)過(guò)程中相對(duì)較早地就開(kāi)啟了 UART,但仍然會(huì)晚于部分基礎(chǔ)設(shè)備的臨界位被設(shè)置的時(shí)間,此時(shí)如果不能獲取到內(nèi)核日志,那么在這些早期階段產(chǎn)生的錯(cuò)誤就很難被診斷。為了能讓其中一個(gè) UART 啟用 earlycon 支持功能,請(qǐng)?zhí)砑酉铝羞x項(xiàng)中的一個(gè)到 cmdline.txt 文件,具體內(nèi)容取決于主串口是何種類(lèi)型:
對(duì)于 Raspberry Pi 4,400 以及 Compute Module 4:
對(duì)于 Raspberry Pi 2,Pi 3 以及 Compute Module 3:
對(duì)于 Raspberry Pi 1,Pi Zero 以及 Compute Module 1:
波特率默認(rèn)是 115200 bps
注意:選錯(cuò) Early Console 可能會(huì)導(dǎo)致樹(shù)莓派啟動(dòng)失敗。
UART 與設(shè)備樹(shù)
許多 UART 設(shè)備樹(shù)的 overlay 定義可以在 https://github.com/raspberrypi/linux?上面找到,其中兩個(gè)最有用的 overlay 莫過(guò)于 disable-bt 和 miniuart-bt
disable-bt 會(huì)禁用藍(lán)牙設(shè)備并且讓 first PL011 (UART0) 作為主串口。同時(shí)你也必須禁用掉初始化藍(lán)牙解調(diào)器的系統(tǒng)服務(wù),以確保徹底不會(huì)連上 UART,使用 sudo systemctl disable hciuart 即可。
miniuart-bt 會(huì)將藍(lán)牙功能切換為使用 mini UART,并且 讓 first PL011 (UART0) 作為主串口。請(qǐng)注意這可能會(huì)降低最大可用的波特率(參考下方的 mini UART 限制說(shuō)明)。同時(shí)你也必須用 force_turbo=1 或 core_freq=250 將 VPU 的核心時(shí)鐘設(shè)為固定頻率。
uart2,uart3,uart4 和 uart5 這四個(gè) overlays 可以被用來(lái)啟用樹(shù)莓派4型號(hào)設(shè)備上額外的 4 個(gè) UART。在目錄中另有特殊的 UART overlay,請(qǐng)參考 /boot/overlays/README 以獲取設(shè)備樹(shù) overlay 的詳細(xì)內(nèi)容,或者執(zhí)行 dtoverlay -h overlay-name 用以獲取描述和使用幫助。
你可以向 config.txt 文件中添加一行配置用來(lái)啟用一個(gè)設(shè)備樹(shù) overlay,請(qǐng)注意 overlay.dts 的文件名部分已被移除。例如:
PL011 與 mini-UART
PL011 UART 和 mini-UART 之間存在著一些差異:
mini-UART 擁有更小的 FIFO,并且缺少對(duì)流控制的支持,這導(dǎo)致在更高的波特率條件下更有可能會(huì)丟失字符。相比 PL011 在功能上也會(huì)有所缺失,主要是因?yàn)槠渥陨淼牟ㄌ芈蕰?huì)受到 VPU 的時(shí)鐘速度的影響。
與 PL011 相比 mini UART 最顯著的缺點(diǎn)是:
1. 沒(méi)有中斷檢測(cè)
2. 沒(méi)有數(shù)據(jù)幀錯(cuò)誤檢測(cè)
3. 沒(méi)有校驗(yàn)位
4. 沒(méi)有接收超時(shí)中斷
但無(wú)論是 mini UART 還是 PL011 在 BCM2835 上的實(shí)現(xiàn)都不支持 DCD,DSR,DTR 或者 RI 信號(hào)。
有關(guān) mini UART 的更多資料可以在 https://datasheets.raspberrypi.com/bcm2835/bcm2835-peripherals.pdf 上面找到。

以下內(nèi)容節(jié)選自 https://www.raspberrypi.com/documentation/computers/config_txt.html
init_uart_baud
init_uart_baud 表示 UART 初始波特率,默認(rèn)為 115200
init_uart_clock
init_uart_clock 表示 UART 初始時(shí)鐘頻率,默認(rèn)值為 48000000(48MHz)。請(qǐng)注意這個(gè)時(shí)鐘僅會(huì)作用于 UART0(ttyAMA0),并且最大波特率被限制為時(shí)鐘的 1/16。而在樹(shù)莓派 3 以及 Zero 上面的默認(rèn) UART 是 UART1(ttyS0),且時(shí)鐘是核心 VPU 的時(shí)鐘,至少為 250 MHz。
enable_uart
enable_uart=1(配合 cmdline.txt 當(dāng)中的 console=serial0 參數(shù)使用)請(qǐng)求內(nèi)核創(chuàng)建一個(gè)串口終端,使用 GPIO 14 和 15 進(jìn)行連接。編輯 cmdline.txt 移除命令行中的 quiet 參數(shù)以開(kāi)啟內(nèi)核啟動(dòng)消息。另見(jiàn) uart_2ndstage。
uart_2ndstage
設(shè)置 uart_2ndstage=1 讓第二階段的引導(dǎo)程序(樹(shù)莓派4之前設(shè)備上的 bootcode.bin,或是樹(shù)莓派4 EEPROM 里面的啟動(dòng)代碼)和主固件(start*.elf)輸出診斷信息到 UART0。注意可能會(huì)和藍(lán)牙操作發(fā)生沖突,除非你禁用了藍(lán)牙(dtoverlay=disable-bt)或切換到其他 UART(dtoverlay=miniuart-bt)上面。并且同一時(shí)間如果 UART 上面既有輸入也有輸出,那么數(shù)據(jù)很可能會(huì)丟失輸出也會(huì)受影響。所以這項(xiàng)功能只應(yīng)該被用來(lái)診斷早期啟動(dòng)加載時(shí)的問(wèn)題。

參考資料:
https://www.raspberrypi.com/documentation/computers/configuration.html
https://www.raspberrypi.com/documentation/computers/config_txt.html