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