使用 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 為空。