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