How to snoop I2C bus communications
I2C bus snooping
Viewing the I2C communications being done can be useful in finding errors. The data transferred by the system over the I2C bus can be snooped using the kernel's FTRACE
.
The following settings should be enabled in the kernel in order to access the I2C logs (these are enabled by default in Jetpacks):
CONFIG_FTRACE CONFIG_ENABLE_DEFAULT_TRACERS
To enable the i2c tracing, use the following command:
echo 1 >/sys/kernel/debug/tracing/events/i2c/enable
Note: by default, this will trace the traffic through all I2C buses on the system. To filter for a desired I2C bus use:
echo adapter_nr==<N> >/sys/kernel/debug/tracing/events/i2c/filter
Where <N> is the desired I2C bus number.
The trace output can be viewed by using:
cat /sys/kernel/debug/tracing/trace
This will look something like:
... i2c_write: i2c-5 #0 a=044 f=0000 l=2 [02-14] ... i2c_read: i2c-5 #1 a=044 f=0001 l=4 ... i2c_reply: i2c-5 #1 a=044 f=0001 l=4 [33-00-00-00] ... i2c_result: i2c-5 n=2 ret=2
Where the components of the logs are:
- i2c-<adapter-nr>
- #<message-array-index>
- a=<addr>
- f=<flags>
- l=<datalen>
- n=<message-array-size>
- ret=<result>
- [<data-transferred>]