| Copyright (C) ST-Ericsson AB 2010 | |
| Author: Sjur Brendeland/ sjur.brandeland@stericsson.com | |
| License terms: GNU General Public License (GPL) version 2 | |
| --------------------------------------------------------- | |
| === 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. |