This change primarily adds additional debug logging and statistics counters. It also includes the ability to change the small-packet size, which was previously hard-coded to a value of 5. The default value for the small-packet size has been increased to 32, which improves performance. We also now do a better job of tracking flow control and slave liveliness.
SPI/HDLC Adaptor
spi-hdlc-adapter is an adapter tool for using a SPI interface as if
it were an HDLC-lite encoded bidirectional asynchronous serial stream.
It uses the SPI protocol outlined in Appendix A.2 of the Spinel
protocol document.
Syntax
spi-hdlc-adapter [options] <spi-device-path>
Options
--stdio: Usestdinandstdoutfor HDLC input/output. Useful when directly started by the program that will be using it.--pty: Create a pseudo terminal for HDLC input/output. The path of the newly-created PTY will be written tostdout, followed by a newline.--raw: Do not encode/decode packets using HDLC. Instead, write whole, raw frames to the specified input and output FDs. This is useful for emulating a serial port, or when datagram-based sockets are supplied forstdinandstdout(when used with--stdio).--mtu=[MTU]: Specify the MTU. Currently only used in raw mode. Default and maximum value is 2043. Must be greater than zero.--gpio-int[=gpio-path]: Specify a path to the Linux sysfs-exported GPIO directory for theI̅N̅T̅pin. If not specified,spi-hdlc-adapterwill fall back to polling, which is inefficient.--gpio-reset[=gpio-path]: Specify a path to the Linux sysfs-exported GPIO directory for theR̅E̅S̅pin.--spi-mode[=mode]: Specify the SPI mode to use (0-3). Default value is0.--spi-speed[=hertz]: Specify the SPI speed in hertz. Default value is1000000(1MHz).--spi-cs-delay[=usec]: Specify the delay after C̅S̅ assertion, in microseconds. Default is 20µs. Note that this may need to be set to zero for spi-hdlc-adapter to work with some SPI drivers.--spi-align-allowance[=n]: Specify the the maximum number of 0xFF bytes to clip from start of MISO frame. This makes this tool usable with SPI slaves which have buggy SPI blocks that prepend up to three 0xFF bytes to the start of MISO frame. Default value is0. Maximum value is6. This must be set to4for chips in the SiLabs EM35x family.--spi-small-packet=[n]: Specify the smallest packet we can receive in a single SPI transaction. Packets sent by the slave which are smaller than or equal to this size will require only a single SPI transaction to be successfully transmitted. Increasing this value will (up to a point) decrease latency for smaller packets at the expense of overall bandwidth. Default value is 32. The minimum value is 0. The maximum value is 2043.--verbose: Increase debug verbosity.--help: Print out usage information tostdoutand exit.
spi-device-path is a required argument since it indicates which SPI
device to use. An example path might be /dev/spidev1.0.
The GPIO paths are to the top-level directory for that GPIO. They must
be already be exported before spi-hdlc-adapter can use them.
Behavior
If an MCU reset is detected by the reset bit being set on a SPI frame,
the special vendor-specific HDLC-lite symbol 0xF8 is emitted. If
--gpio-reset is specified, the HDLC client can trigger an MCU reset
by sending the symbols 0x7E 0x13 0x11 0x7E or by sending SIGUSR1.
When started, spi-hdlc-adapter will configure the following
properties on the GPIOs:
- Set
I̅N̅T̅/directiontoin. - Set
I̅N̅T̅/edgetofalling. - Set
R̅E̅S̅/directiontohigh.
When resetting the slave device, spi-hdlc performs the following
procedure:
- Set
R̅E̅S̅/directiontolow. - Sleep for 30ms.
- Set
R̅E̅S̅/directiontohigh.
Statistics
Some simple usage statistics are printed out to syslog at exit and
whenever the SIGUSR1 signal is received. The easiest way to send
that signal to spi-hdlc-adapter is like this:
# killall -sigusr1 spi-hdlc-adapter
At which point you will see something like this in the syslogs:
spi-hdlc-adapter[18408]: INFO: sSlaveResetCount=16
spi-hdlc-adapter[18408]: INFO: sSpiFrameCount=2673
spi-hdlc-adapter[18408]: INFO: sSpiValidFrameCount=2668
spi-hdlc-adapter[18408]: INFO: sSpiDuplexFrameCount=3
spi-hdlc-adapter[18408]: INFO: sSpiUnresponsiveFrameCount=5
spi-hdlc-adapter[18408]: INFO: sSpiGarbageFrameCount=0
spi-hdlc-adapter[18408]: INFO: sHdlcTxFrameCount=1454
spi-hdlc-adapter[18408]: INFO: sHdlcTxFrameByteCount=2908
spi-hdlc-adapter[18408]: INFO: sHdlcRxFrameCount=884
spi-hdlc-adapter[18408]: INFO: sHdlcRxFrameByteCount=3875
spi-hdlc-adapter[18408]: INFO: sHdlcRxBadCrcCount=0
Sending SIGUSR2 will clear the counters.