| .. SPDX-License-Identifier: GPL-2.0 |
| .. include:: <isonum.txt> |
| |
| |
| ================ |
| Using Linux CAIF |
| ================ |
| |
| |
| :Copyright: |copy| ST-Ericsson AB 2010 |
| |
| :Author: Sjur Brendeland/ sjur.brandeland@stericsson.com |
| |
| Start |
| ===== |
| |
| If you have compiled CAIF for modules do:: |
| |
| $modprobe crc_ccitt |
| $modprobe caif |
| $modprobe caif_socket |
| $modprobe chnl_net |
| |
| |
| Preparing the setup with a STE modem |
| ==================================== |
| |
| If you are working on integration of CAIF you should make sure |
| that the kernel is built with module support. |
| |
| There are some things that need to be tweaked to get the host TTY correctly |
| set up to talk to the modem. |
| Since the CAIF stack is running in the kernel and we want to use the existing |
| TTY, we are installing our physical serial driver as a line discipline above |
| the TTY device. |
| |
| To achieve this we need to install the N_CAIF ldisc from user space. |
| The benefit is that we can hook up to any TTY. |
| |
| The use of Start-of-frame-extension (STX) must also be set as |
| module parameter "ser_use_stx". |
| |
| Normally Frame Checksum is always used on UART, but this is also provided as a |
| module parameter "ser_use_fcs". |
| |
| :: |
| |
| $ modprobe caif_serial ser_ttyname=/dev/ttyS0 ser_use_stx=yes |
| $ ifconfig caif_ttyS0 up |
| |
| PLEASE NOTE: |
| There is a limitation in Android shell. |
| It only accepts one argument to insmod/modprobe! |
| |
| Trouble shooting |
| ================ |
| |
| There are debugfs parameters provided for serial communication. |
| /sys/kernel/debug/caif_serial/<tty-name>/ |
| |
| * ser_state: Prints the bit-mask status where |
| |
| - 0x02 means SENDING, this is a transient state. |
| - 0x10 means FLOW_OFF_SENT, i.e. the previous frame has not been sent |
| and is blocking further send operation. Flow OFF has been propagated |
| to all CAIF Channels using this TTY. |
| |
| * tty_status: Prints the bit-mask tty status information |
| |
| - 0x01 - tty->warned is on. |
| - 0x02 - tty->low_latency is on. |
| - 0x04 - tty->packed is on. |
| - 0x08 - tty->flow_stopped is on. |
| - 0x10 - tty->hw_stopped is on. |
| - 0x20 - tty->stopped is on. |
| |
| * last_tx_msg: Binary blob Prints the last transmitted frame. |
| |
| This can be printed with:: |
| |
| $od --format=x1 /sys/kernel/debug/caif_serial/<tty>/last_rx_msg. |
| |
| The first two tx messages sent look like this. Note: The initial |
| byte 02 is start of frame extension (STX) used for re-syncing |
| upon errors. |
| |
| - Enumeration:: |
| |
| 0000000 02 05 00 00 03 01 d2 02 |
| | | | | | | |
| STX(1) | | | | |
| Length(2)| | | |
| Control Channel(1) |
| Command:Enumeration(1) |
| Link-ID(1) |
| Checksum(2) |
| |
| - Channel Setup:: |
| |
| 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: Prints the last transmitted frame. |
| |
| The RX messages for LinkSetup look almost identical but they have the |
| bit 0x20 set in the command bit, and Channel Setup has added one byte |
| before Checksum containing Channel ID. |
| |
| NOTE: |
| Several CAIF Messages might be concatenated. The maximum debug |
| buffer size is 128 bytes. |
| |
| Error Scenarios |
| =============== |
| |
| - last_tx_msg contains channel setup message and last_rx_msg is empty -> |
| The host seems to be able to send over the UART, at least the CAIF ldisc get |
| notified that sending is completed. |
| |
| - last_tx_msg contains enumeration message and last_rx_msg is empty -> |
| The host is not able to send the message from UART, the tty has not been |
| able to complete the transmit operation. |
| |
| - if /sys/kernel/debug/caif_serial/<tty>/tty_status is non-zero there |
| might be problems transmitting over UART. |
| |
| E.g. host and modem wiring is not correct you will typically see |
| tty_status = 0x10 (hw_stopped) and ser_state = 0x10 (FLOW_OFF_SENT). |
| |
| You will probably see the enumeration message in last_tx_message |
| and empty last_rx_message. |