使用 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 表示正在发送,这是一个瞬态状态。

    • 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 为空。