使用 Linux CAIF¶
- 版權:
© ST-Ericsson AB 2010
- 作者:
Sjur Brendeland/ sjur.brandeland@stericsson.com
開始¶
如果您已為模組編譯 CAIF,請執行以下操作
$modprobe crc_ccitt
$modprobe caif
$modprobe caif_socket
$modprobe chnl_net
準備使用 STE 調變解調器的設定¶
如果您正在進行 CAIF 的整合工作,應確保核心已構建為支援模組。
有一些事情需要調整,才能正確設定主機 TTY 以與調變解調器通訊。 由於 CAIF 堆疊在核心中執行,並且我們想要使用現有的 TTY,因此我們將物理序列驅動程式安裝為 TTY 裝置上方的線路規程。
為了實現這一點,我們需要從使用者空間安裝 N_CAIF ldisc。 這樣做的好處是我們可以連線到任何 TTY。
幀起始擴充套件 (STX) 的使用也必須設定為模組引數 “ser_use_stx”。
通常,幀校驗和始終在 UART 上使用,但這也作為模組引數 “ser_use_fcs” 提供。
$ modprobe caif_serial ser_ttyname=/dev/ttyS0 ser_use_stx=yes
$ ifconfig caif_ttyS0 up
- 請注意
Android shell 中存在一個限制。 它只接受 insmod/modprobe 的一個引數!
故障排除¶
為序列通訊提供了一些 debugfs 引數。 /sys/kernel/debug/caif_serial/<tty-name>/
ser_state:列印位掩碼狀態,其中
0x02 表示 SENDING,這是一個瞬態狀態。
0x10 表示 FLOW_OFF_SENT,即之前的幀尚未傳送,並阻止進一步的傳送操作。 Flow OFF 已傳播到所有使用此 TTY 的 CAIF 通道。
tty_status:列印位掩碼 tty 狀態資訊
0x01 - tty->warned 開啟。
0x04 - tty->packed 開啟。
0x08 - tty->flow.tco_stopped 開啟。
0x10 - tty->hw_stopped 開啟。
0x20 - tty->flow.stopped 開啟。
last_tx_msg:二進位制 blob 列印最後傳送的幀。
可以使用以下命令列印:
$od --format=x1 /sys/kernel/debug/caif_serial/<tty>/last_rx_msg.
傳送的前兩條 tx 訊息如下所示。 注意:初始位元組 02 是幀起始擴充套件 (STX),用於在發生錯誤時重新同步。
列舉
0000000 02 05 00 00 03 01 d2 02 | | | | | | STX(1) | | | | Length(2)| | | Control Channel(1) Command:Enumeration(1) Link-ID(1) Checksum(2)通道設定
0000000 02 07 00 00 00 21 a1 00 48 df | | | | | | | | STX(1) | | | | | | Length(2)| | | | | Control Channel(1) Command:Channel Setup(1) Channel Type(1) Priority and Link-ID(1) Endpoint(1) Checksum(2)
last_rx_msg:列印最後傳送的幀。
LinkSetup 的 RX 訊息看起來幾乎相同,但它們在命令位中設定了位 0x20,並且通道設定在校驗和之前添加了一個位元組,其中包含通道 ID。
- 注意
可以連線多個 CAIF 訊息。 最大除錯緩衝區大小為 128 位元組。
錯誤場景¶
last_tx_msg 包含通道設定訊息,而 last_rx_msg 為空 -> 主機似乎能夠透過 UART 傳送,至少 CAIF ldisc 會收到傳送完成的通知。
last_tx_msg 包含列舉訊息,而 last_rx_msg 為空 -> 主機無法從 UART 傳送訊息,tty 無法完成傳送操作。
如果 /sys/kernel/debug/caif_serial/<tty>/tty_status 為非零,則可能存在透過 UART 傳輸的問題。
例如,如果主機和調變解調器的佈線不正確,您通常會看到 tty_status = 0x10 (hw_stopped) 和 ser_state = 0x10 (FLOW_OFF_SENT)。
您可能會在 last_tx_message 中看到列舉訊息,而 last_rx_message 為空。