UART 傳輸

FDomain 可透過實體序列埠 (UART) 執行,讓開發人員與沒有有效網路或 USB 連線的 Fuchsia 裝置互動及偵錯。

總覽

UART 傳輸會透過非同步序列線 (例如 Linux 上的 /dev/ttyUSB0) 執行 FDomain 通訊協定,該線路會連接到 Fuchsia 目標裝置的序列控制台通訊埠 (在 /dev/class/serial/ 下公開)。

通訊會使用 ResendSP 滑動視窗框架通訊協定,以高線路速率 (預設為 1,000,000 波特) 運作,透過核對和、確認和工作階段追蹤,在裝置重新啟動時提供可靠的雙向傳遞。

必要條件

主機序列埠權限

在 Linux 主機上,存取 TTY 字元裝置 (例如 /dev/ttyUSB0) 需要 dialout 群組的成員資格:

sudo usermod -a -G dialout $USER

您必須登出再重新登入 (或執行 newgrp dialout),群組成員資格才會生效。

在 ffx 中啟用 UART 目標探索

根據預設,ffx 目標探索會監控 mDNS 和 USB 探索串流。如要啟用 UartWatcher 子系統來監控使用中的 UART 連線,並在 ffx target list 中列出這些連線,請將 connectivity.enable_uart 設為 true:

ffx config set connectivity.enable_uart true

目標硬體設定

在實體硬體平台 (例如使用 DesignWare 8250/APB UART 控制器的電路板) 上,高速序列速率 (1,000,000 鮑率) 會使用除數鎖存分數 (DLF) 暫存器進行校正,盡可能減少位元計時錯誤。

由於單一通訊埠目標會在核心控制台和使用者空間服務之間共用實體序列線,因此如要透過 UART 啟用 ffx,必須透過核心指令列引數 (例如在 local/BUILD.gn 開發人員覆寫中),將序列埠擁有權移交給使用者空間 FDomain UART 驅動程式庫程式 (fdomain-uart-driver):

  • dev.fdomain.uart=true:啟用目標端 fdomain-uart-driver 元件,探索並繫結至 /dev/class/serial/ 中的序列埠。
  • dev.fdomain.uart.baud=1000000:設定目標序列埠鮑率。
  • kernel.serial=none:停用 Zircon 核心序列控制台,避免核心偵錯輸出與二進位 ResendSP 影格衝突。
  • console.shell=false:停用使用者空間互動式序列控制台殼層 (console.cm)。

連線管理

網路或 USB 介面支援自動背景列舉,但序列埠是共用的實體資源,沒有標準匯流排探索機制。ffx uart 工具提供明確的子指令,可管理連線生命週期,並確保主機工具之間互斥。

連線至目標

如要建立與實體裝置的 UART 連線,請按照下列步驟操作:

ffx -t /dev/ttyUSB0 uart connect

(您也可以加入 uart: 前置字元,例如 ffx -t uart:/dev/ttyUSB0 uart connect)。

ffx uart connect 預設為 1,000,000 baud。如果開發板設定需要,您可以指定自訂鮑率:

ffx -t /dev/ttyUSB0 uart connect --baud 115200

連線時: 1. 這項工具會取得序列裝置的專屬檔案鎖定 (flock),防止其他程序同時存取。2. 這會將 TTY 設定為原始模式,並使用 8 個資料位元、1 個停止位元、無同位檢查 (8N1) 和指定的鮑率。3. 它會產生 ffx-uart-driver 背景 Daemon,以多工處理 FDomain 流量。4. 連線中繼資料會記錄在 ffx 共用資料目錄 (ffx_uart/) 下。

透過 UART 執行指令

連線後,您可以使用 uart: 位址前置字元,執行任何以 UART 裝置為目標的標準 ffx 指令:

ffx -t uart:/dev/ttyUSB0 target echo
ffx -t uart:/dev/ttyUSB0 log

探測連線健康狀態

如要確認實體序列埠是否能正常回應,並與目標的 FDomain UART 服務通訊,請按照下列步驟操作:

ffx -t /dev/ttyUSB0 uart probe

probe 指令會執行下列檢查: * 如果背景驅動程式庫已啟用,則會驗證驅動程式庫程式程序健康狀態,並回報目前狀態。* 如果沒有任何驅動程式庫處於啟用狀態,則會暫時開啟通訊埠、與目標執行通訊協定交涉信號交換、測量封包往返時間 (RTT),並回報服務是否回應。

列出有效連線

如要查看所有運作中的 UART 驅動程式庫例項和相關聯裝置,請按照下列步驟操作:

ffx uart list

輸出內容範例:

TARGET                         PID      BAUD     PROTOCOL   STATUS
/dev/ttyUSB0                   12345    1000000  ResendSP Connected

目標探索

啟用 connectivity.enable_uart 且 UART 背景驅動程式庫處於啟用狀態時,ffx 會自動探索目標:

ffx target list

輸出內容範例:

NAME                      SERIAL          TYPE           STATE      ADDRS/IP              MANUAL    RCS
fuchsia-54b7-e1d8-7af6    1234567890ab    minimal.x64    Product    [uart:/dev/ttyUSB0]   N         Y

ffx 會監控 ffx-uart-driver 寫入的連線中繼資料,被動探索 UART 目標。驅動程式庫會在連線時取得目標的節點名稱和序號,並儲存在中繼資料中,讓探索功能可以立即偵測及列舉連結裝置,而不會爭用實體序列埠。如果同一部裝置也透過 USB 或網路連線,ffx 會比對硬體序號,將位址合併到單一目標項目下。

監控狀態和指標

如要檢查有效連線的即時傳輸統計資料,請按照下列步驟操作:

ffx -t /dev/ttyUSB0 uart status

這會查詢驅動程式庫 Daemon 的本機控制通訊端和中繼資料,回報作業詳細資料,包括: * 目標路徑、16 個字元的目標 ID、Daemon PID 和驅動程式庫程式記錄檔路徑。* 發現目標節點名稱和硬體序號。 * 連線狀態、設定的鮑率和使用中的通訊協定 (ResendSP)。 * 預估來回延遲時間 (Estimated RTT)、重新傳輸次數、CRC 核對和錯誤、連線中斷和交握失敗。* 上次讀取/寫入活動時間戳記、傳出佇列長度、停滯偵測警告,以及目標 (Last Target Error) 回報的最新管道錯誤。

正在中斷連線

如要終止背景驅動程式庫並釋放序列裝置鎖定,請按照下列步驟操作:

ffx -t /dev/ttyUSB0 uart disconnect

釋出連線後,序列裝置就能用於其他用途,例如互動式偵錯控制台或韌體刷機。

重新連線

如要使用儲存的中繼資料重新啟動背景驅動程式庫 (例如在傳輸線中斷連線或暫時性主機問題後):

ffx -t /dev/ttyUSB0 uart connect --reconnect

架構和框架

+-------------------------------------------------------------+
|                        Host Machine                         |
|                                                             |
|   +------------+        +-------------------------------+   |
|   |  ffx CLI   | <----> | ffx-uart-driver (Daemon)      |   |
|   +------------+ (UNIX  +-------------------------------+   |
|                  Socket)                |                   |
|                                         | (ResendSP Frames) |
|                                         v                   |
|                              [/dev/ttyUSB0] (flock)         |
+-------------------------------------------------------------+
                                          |
                                          | Physical Serial Cable
                                          | (1,000,000 Baud, 8N1)
                                          v
+-------------------------------------------------------------+
|                       Target Hardware                       |
|                                                             |
|                [/dev/class/serial/<instance>]               |
|                                 |                           |
|                                 v                           |
|               +-----------------------------------+         |
|               | fdomain-uart-driver -> RCS        |         |
|               +-----------------------------------+         |
+-------------------------------------------------------------+

ResendSP 框架通訊協定

UART 傳輸使用 ResendSP 框架通訊協定,透過原始位元組導向的序列連結串流資料: * 滑動視窗 Go-Back-N:支援最多 32 個傳輸中框架的管線傳輸,盡可能提高本機序列纜線和高延遲橋接連結的頻寬使用率。* 流量控制和背壓:累積確認和個別管道流量控制可防止嵌入式目標上的緩衝區溢位。* 完整性核對和:13 位元組框架標頭上的 8 位元標頭核對和 (HdrChk,CRC-8 多項式 0x07) 和框架酬載上的 32 位元 IEEE 802.3 CRC (CRC-32),可偵測因電線雜訊造成的傳輸錯誤。* 重新啟動偵測:在通道 0 握手期間協商的工作階段符記,可讓主機和目標偵測重設,並自動重新同步串流狀態,無須重新啟動對等互連。

疑難排解

  • Permission Denied opening /dev/ttyUSB0:請確認您的使用者帳戶位於 dialout 群組 (id $USER),並驗證裝置權限。
  • 裝置忙碌中 (EWOULDBLOCK / EAGAIN,connect):其他程序獨占 TTY 裝置。確認通訊埠上沒有開啟其他序列終端機程式 (例如 minicom、screen、picocom)。
  • connect 或 probe 期間發生信號交換逾時:請確認實體 TX/RX 線路接線正確、Bootloader UART 多工器和時鐘已設為 1,000,000 波特,且目標已使用 dev.fdomain.uart=true、kernel.serial=none 和 console.shell=false 啟動。