UART是一種串行、異步、全雙工的通信協定,在嵌入式領域應用的非常廣泛。開發者可以使用序列槽來調試,如擷取開機階段較早的日志。android可以通過adb,不過adb程序啟動較晚,并且擷取不到bootloader階段的資訊。通過序列槽可以強制進入fastboot,也可以擷取上電後的bootloader資訊。在調試階段是最基本的手段,後面再debug kernel會經常用到,這裡記錄下配置的過程。
UART 類型
Raspberry Pi有2種類型的序列槽可供使用:PL011和mini UART。
- PL011 UART為硬體序列槽,是由ARM設計或授權的,具有獨立的時鐘源,可靠性和性能好吞吐量高,通常是建議使用該序列槽通信;
- mini UART和VPU(Video Processing Unit,視訊處理單元)核心頻率有關,當VPU核心頻率變化,UART的波特率也會變化,不是特别穩定。
注:Raspberry Pi 所有序列槽采用的電壓為3.3V,如果用5V可能會損壞。
不同型号Raspberry Pi對應的UART類型有差異:
- Raspberry Pi Zero, 1, 2 and 3
Name | Type |
UART0 | PL011 |
UART1 | mini UART |
- Raspberry Pi 4 and 400
Name | Type |
UART0 | PL011 |
UART1 | mini UART |
UART2 | PL011 |
UART3 | PL011 |
UART4 | PL011 |
UART5 | PL011 |
注:The Raspberry Pi 4B和400有額外新增4個PL011序列槽,預設是關閉的
Primary UART和Secondary UART
Primary UART:為Pi的主序列槽,連接配接到硬體引腳上:GPIO14->TXD0; GPIO15->RXD0。
Secondary UART:為Pi的輔助序列槽,不存在于GPIO連接配接器上,通常被藍牙控制器使用。
注;GPIO引腳上使用的一定是主序列槽,主序列槽和UART類型對應關系和Pi的型号有關系。
不同型号的Pi的對應關系:
Model | first PL011 | mini UART |
Raspberry Pi Zero | primary | secondary |
Raspberry Pi Zero W / Raspberry Pi Zero 2 W | secondary (Bluetooth) | primary |
Raspberry Pi 1 | primary | secondary |
Raspberry Pi 2 | primary | secondary |
Raspberry Pi 3 | secondary (Bluetooth) | primary |
Compute Module 3 & 3+ | primary | secondary |
Raspberry Pi 4 | secondary (Bluetooth) | primary |
上表可以看出Raspberry Pi 4上primary為mini UART(預設關閉),而secondary為PL011,被藍牙使用。如果想要使用GPIO接序列槽闆(USB轉TTL)進行通信或調試,必須打開primary。可以檢視/dev/裝置确認:ls -l /dev/
UART初始化狀态
打開primary序列槽步驟:
- sudo raspi-config
- 選擇:3 - Interface Options.
- 選擇:P6 - Serial Port.
- At the prompt Would you like a login shell to be accessible over serial? 選擇: 'No'
- At the prompt Would you like the serial port hardware to be enabled? 選擇: 'Yes'
硬序列槽serial0
/dev/下2個序列槽裝置
mini UART由于時鐘源采用的是VPU的(依據2023-02-04官方文檔解釋),是以并不是固定的,這樣會導緻UART波特率也會變化。修改參數做如下解釋:
- 如果primary UART對應的是mini UART,打開後即配置了參數enable_uart=1,那VPU的時鐘預設就固定為了250MHZ,不需要特殊設定其他參數。
- 如果secondary UART對應的是mini UART,需要在/boot/config.txt設定core_freq=250來固定時鐘頻率。
UART接線
如果想要PC和Raspberry Pi進行序列槽通信或者debug,需要借助USB轉TTL小闆,這裡采用的CH340G子產品,接線如下,CH340小闆輸入(rx)接Pi的輸出(tx),CH340小闆輸出(tx)接Pi的輸入(rx),CH340小闆地線tx接Pi的地線。供電可以不用接,USB可以供電。
CH340接線
PC端安裝序列槽助手,我這裡使用的是友善序列槽調試助手,
Raspberry Pi端可以通過minicom工具和PC端進行通信,安裝指令:
sudo apt-get install minicom
運作指令,啟動minincom,115200為波特率,ttyS0為對應GPIO pin腳的序列槽裝置,
sudo minicom -D /dev/ttyS0 -b115200
序列槽助手
UART擷取開機日志
linux雖然在啟動階段比較早的啟動了UART,還是需要經過一定的時間,有些kernel啟動異常無法診斷,可以通過以下2步擷取更多的log資訊,如start.elf debug資訊:
1、在/boot/cmdline.txt設定earlycon參數來擷取更早階段的資訊,添加以下資訊,針對不同的PI型号設定:
注:如果型号和參數不對應,可能會導緻Raspberry Pi起不來
- Raspberry Pi 4, 400:
earlycon=uart8250,mmio32,0xfe215040
earlycon=pl011,mmio32,0xfe201000
- Raspberry Pi 2, Pi 3:
earlycon=uart8250,mmio32,0x3f215040
earlycon=pl011,mmio32,0x3f201000
- Raspberry Pi 1, Pi Zero:
earlycon=uart8250,mmio32,0x20215040
earlycon=pl011,mmio32,0x20201000
cmdline.txt
2、在/boot/config.txt中添加uart_2ndstage=1,如下:
config.txt
3、重新開機檢視序列槽助手資訊:
kernel log
primary采用PL011
預設serial0為primary,serial1為secondary。而如果對序列槽通信性能有要求,需要更穩定,可以把serial0設定為PL011。Raspberry Pi 4B的PL011預設是被藍牙使用,需要關閉,通過修改/boot/config.txt,,添加:dtoverlay=disable-bt或者dtoverlay=miniuart-bt。
注:上面的方式是官網給出的,文檔有時效性(2023-02-04)。另外網上很多使用的是dtoverlay=pi3-miniuart-bt,嘗試了下也是可以的,可能依據的是老文檔。
關閉藍牙
serial0修改後
打開UART2/3/4/5
The Raspberry Pi 4B預設有6個序列槽,其中沒有打開,新手也可以直接通過打開其他的序列槽使用,就不用以上操作那麼麻煩了。檢視序列槽資訊:dtoverlay -a|grep uart
uart資訊
檢視uart的GPIO資訊,如檢視uart3:dtoverlay -h uart3
uart3
在/boot/config.txt中打開uart2/3/4/5:
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
對應關系如下,用minicom測試時注意修改dev
UART | DEV | TX | RX |
UART2 | ttyAMA1 | GPIO0 | GPIO1 |
UART3 | ttyAMA2 | GPIO4 | GPIO5 |
UART4 | ttyAMA3 | GPIO8 | GPIO9 |
UART5 | ttyAMA4 | GPIO12 | GPIO13 |