Skip to content

Commit 31df719

Browse files
alex310110wsakernel
authored andcommitted
Documentation: i2c: Add doc for I2C sysfs
This doc helps Linux users navigate through I2C sysfs and learn the system I2C topology. Signed-off-by: Alex Qiu <[email protected]> Reviewed-by: Guenter Roeck <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent b64210f commit 31df719

File tree

1 file changed

+395
-0
lines changed

1 file changed

+395
-0
lines changed

Documentation/i2c/i2c-sysfs.rst

Lines changed: 395 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,395 @@
1+
.. SPDX-License-Identifier: GPL-2.0
2+
3+
===============
4+
Linux I2C Sysfs
5+
===============
6+
7+
Overview
8+
========
9+
10+
I2C topology can be complex because of the existence of I2C MUX
11+
(I2C Multiplexer). The Linux
12+
kernel abstracts the MUX channels into logical I2C bus numbers. However, there
13+
is a gap of knowledge to map from the I2C bus physical number and MUX topology
14+
to logical I2C bus number. This doc is aimed to fill in this gap, so the
15+
audience (hardware engineers and new software developers for example) can learn
16+
the concept of logical I2C buses in the kernel, by knowing the physical I2C
17+
topology and navigating through the I2C sysfs in Linux shell. This knowledge is
18+
useful and essential to use ``i2c-tools`` for the purpose of development and
19+
debugging.
20+
21+
Target audience
22+
---------------
23+
24+
People who need to use Linux shell to interact with I2C subsystem on a system
25+
which the Linux is running on.
26+
27+
Prerequisites
28+
-------------
29+
30+
1. Knowledge of general Linux shell file system commands and operations.
31+
32+
2. General knowledge of I2C, I2C MUX and I2C topology.
33+
34+
Location of I2C Sysfs
35+
=====================
36+
37+
Typically, the Linux Sysfs filesystem is mounted at the ``/sys`` directory,
38+
so you can find the I2C Sysfs under ``/sys/bus/i2c/devices``
39+
where you can directly ``cd`` to it.
40+
There is a list of symbolic links under that directory. The links that
41+
start with ``i2c-`` are I2C buses, which may be either physical or logical. The
42+
other links that begin with numbers and end with numbers are I2C devices, where
43+
the first number is I2C bus number, and the second number is I2C address.
44+
45+
Google Pixel 3 phone for example::
46+
47+
blueline:/sys/bus/i2c/devices $ ls
48+
0-0008 0-0061 1-0028 3-0043 4-0036 4-0041 i2c-1 i2c-3
49+
0-000c 0-0066 2-0049 4-000b 4-0040 i2c-0 i2c-2 i2c-4
50+
51+
``i2c-2`` is an I2C bus whose number is 2, and ``2-0049`` is an I2C device
52+
on bus 2 address 0x49 bound with a kernel driver.
53+
54+
Terminologies
55+
=============
56+
57+
First, let us define a couple of terminologies to avoid confusions in the later
58+
sections.
59+
60+
(Physical) I2C Bus Controller
61+
-----------------------------
62+
63+
The hardware system that the Linux kernel is running on may have multiple
64+
physical I2C bus controllers. The controllers are hardware and physical, and the
65+
system may define multiple registers in the memory space to manipulate the
66+
controllers. Linux kernel has I2C bus drivers under source directory
67+
``drivers/i2c/busses`` to translate kernel I2C API into register
68+
operations for different systems. This terminology is not limited to Linux
69+
kernel only.
70+
71+
I2C Bus Physical Number
72+
-----------------------
73+
74+
For each physical I2C bus controller, the system vendor may assign a physical
75+
number to each controller. For example, the first I2C bus controller which has
76+
the lowest register addresses may be called ``I2C-0``.
77+
78+
Logical I2C Bus
79+
---------------
80+
81+
Every I2C bus number you see in Linux I2C Sysfs is a logical I2C bus with a
82+
number assigned. This is similar to the fact that software code is usually
83+
written upon virtual memory space, instead of physical memory space.
84+
85+
Each logical I2C bus may be an abstraction of a physical I2C bus controller, or
86+
an abstraction of a channel behind an I2C MUX. In case it is an abstraction of a
87+
MUX channel, whenever we access an I2C device via a such logical bus, the kernel
88+
will switch the I2C MUX for you to the proper channel as part of the
89+
abstraction.
90+
91+
Physical I2C Bus
92+
----------------
93+
94+
If the logical I2C bus is a direct abstraction of a physical I2C bus controller,
95+
let us call it a physical I2C bus.
96+
97+
Caveat
98+
------
99+
100+
This may be a confusing part for people who only know about the physical I2C
101+
design of a board. It is actually possible to rename the I2C bus physical number
102+
to a different number in logical I2C bus level in Device Tree Source (DTS) under
103+
section ``aliases``. See
104+
`arch/arm/boot/dts/nuvoton-npcm730-gsj.dts
105+
<../../arch/arm/boot/dts/nuvoton-npcm730-gsj.dts>`_
106+
for an example of DTS file.
107+
108+
Best Practice: **(To kernel software developers)** It is better to keep the I2C
109+
bus physical number the same as their corresponding logical I2C bus number,
110+
instead of renaming or mapping them, so that it may be less confusing to other
111+
users. These physical I2C buses can be served as good starting points for I2C
112+
MUX fanouts. For the following examples, we will assume that the physical I2C
113+
bus has a number same as their I2C bus physical number.
114+
115+
Walk through Logical I2C Bus
116+
============================
117+
118+
For the following content, we will use a more complex I2C topology as an
119+
example. Here is a brief graph for the I2C topology. If you do not understand
120+
this graph at the first glance, do not be afraid to continue reading this doc
121+
and review it when you finish reading.
122+
123+
::
124+
125+
i2c-7 (physical I2C bus controller 7)
126+
`-- 7-0071 (4-channel I2C MUX at 0x71)
127+
|-- i2c-60 (channel-0)
128+
|-- i2c-73 (channel-1)
129+
| |-- 73-0040 (I2C sensor device with hwmon directory)
130+
| |-- 73-0070 (I2C MUX at 0x70, exists in DTS, but failed to probe)
131+
| `-- 73-0072 (8-channel I2C MUX at 0x72)
132+
| |-- i2c-78 (channel-0)
133+
| |-- ... (channel-1...6, i2c-79...i2c-84)
134+
| `-- i2c-85 (channel-7)
135+
|-- i2c-86 (channel-2)
136+
`-- i2c-203 (channel-3)
137+
138+
Distinguish Physical and Logical I2C Bus
139+
----------------------------------------
140+
141+
One simple way to distinguish between a physical I2C bus and a logical I2C bus,
142+
is to read the symbolic link ``device`` under the I2C bus directory by using
143+
command ``ls -l`` or ``readlink``.
144+
145+
An alternative symbolic link to check is ``mux_device``. This link only exists
146+
in logical I2C bus directory which is fanned out from another I2C bus.
147+
Reading this link will also tell you which I2C MUX device created
148+
this logical I2C bus.
149+
150+
If the symbolic link points to a directory ending with ``.i2c``, it should be a
151+
physical I2C bus, directly abstracting a physical I2C bus controller. For
152+
example::
153+
154+
$ readlink /sys/bus/i2c/devices/i2c-7/device
155+
../../f0087000.i2c
156+
$ ls /sys/bus/i2c/devices/i2c-7/mux_device
157+
ls: /sys/bus/i2c/devices/i2c-7/mux_device: No such file or directory
158+
159+
In this case, ``i2c-7`` is a physical I2C bus, so it does not have the symbolic
160+
link ``mux_device`` under its directory. And if the kernel software developer
161+
follows the common practice by not renaming physical I2C buses, this should also
162+
mean the physical I2C bus controller 7 of the system.
163+
164+
On the other hand, if the symbolic link points to another I2C bus, the I2C bus
165+
presented by the current directory has to be a logical bus. The I2C bus pointed
166+
by the link is the parent bus which may be either a physical I2C bus or a
167+
logical one. In this case, the I2C bus presented by the current directory
168+
abstracts an I2C MUX channel under the parent bus.
169+
170+
For example::
171+
172+
$ readlink /sys/bus/i2c/devices/i2c-73/device
173+
../../i2c-7
174+
$ readlink /sys/bus/i2c/devices/i2c-73/mux_device
175+
../7-0071
176+
177+
``i2c-73`` is a logical bus fanout by an I2C MUX under ``i2c-7``
178+
whose I2C address is 0x71.
179+
Whenever we access an I2C device with bus 73, the kernel will always
180+
switch the I2C MUX addressed 0x71 to the proper channel for you as part of the
181+
abstraction.
182+
183+
Finding out Logical I2C Bus Number
184+
----------------------------------
185+
186+
In this section, we will describe how to find out the logical I2C bus number
187+
representing certain I2C MUX channels based on the knowledge of physical
188+
hardware I2C topology.
189+
190+
In this example, we have a system which has a physical I2C bus 7 and not renamed
191+
in DTS. There is a 4-channel MUX at address 0x71 on that bus. There is another
192+
8-channel MUX at address 0x72 behind the channel 1 of the 0x71 MUX. Let us
193+
navigate through Sysfs and find out the logical I2C bus number of the channel 3
194+
of the 0x72 MUX.
195+
196+
First of all, let us go to the directory of ``i2c-7``::
197+
198+
~$ cd /sys/bus/i2c/devices/i2c-7
199+
/sys/bus/i2c/devices/i2c-7$ ls
200+
7-0071 i2c-60 name subsystem
201+
delete_device i2c-73 new_device uevent
202+
device i2c-86 of_node
203+
i2c-203 i2c-dev power
204+
205+
There, we see the 0x71 MUX as ``7-0071``. Go inside it::
206+
207+
/sys/bus/i2c/devices/i2c-7$ cd 7-0071/
208+
/sys/bus/i2c/devices/i2c-7/7-0071$ ls -l
209+
channel-0 channel-3 modalias power
210+
channel-1 driver name subsystem
211+
channel-2 idle_state of_node uevent
212+
213+
Read the link ``channel-1`` using ``readlink`` or ``ls -l``::
214+
215+
/sys/bus/i2c/devices/i2c-7/7-0071$ readlink channel-1
216+
../i2c-73
217+
218+
We find out that the channel 1 of 0x71 MUX on ``i2c-7`` is assigned
219+
with a logical I2C bus number of 73.
220+
Let us continue the journey to directory ``i2c-73`` in either ways::
221+
222+
# cd to i2c-73 under I2C Sysfs root
223+
/sys/bus/i2c/devices/i2c-7/7-0071$ cd /sys/bus/i2c/devices/i2c-73
224+
/sys/bus/i2c/devices/i2c-73$
225+
226+
# cd the channel symbolic link
227+
/sys/bus/i2c/devices/i2c-7/7-0071$ cd channel-1
228+
/sys/bus/i2c/devices/i2c-7/7-0071/channel-1$
229+
230+
# cd the link content
231+
/sys/bus/i2c/devices/i2c-7/7-0071$ cd ../i2c-73
232+
/sys/bus/i2c/devices/i2c-7/i2c-73$
233+
234+
Either ways, you will end up in the directory of ``i2c-73``. Similar to above,
235+
we can now find the 0x72 MUX and what logical I2C bus numbers
236+
that its channels are assigned::
237+
238+
/sys/bus/i2c/devices/i2c-73$ ls
239+
73-0040 device i2c-83 new_device
240+
73-004e i2c-78 i2c-84 of_node
241+
73-0050 i2c-79 i2c-85 power
242+
73-0070 i2c-80 i2c-dev subsystem
243+
73-0072 i2c-81 mux_device uevent
244+
delete_device i2c-82 name
245+
/sys/bus/i2c/devices/i2c-73$ cd 73-0072
246+
/sys/bus/i2c/devices/i2c-73/73-0072$ ls
247+
channel-0 channel-4 driver of_node
248+
channel-1 channel-5 idle_state power
249+
channel-2 channel-6 modalias subsystem
250+
channel-3 channel-7 name uevent
251+
/sys/bus/i2c/devices/i2c-73/73-0072$ readlink channel-3
252+
../i2c-81
253+
254+
There, we find out the logical I2C bus number of the channel 3 of the 0x72 MUX
255+
is 81. We can later use this number to switch to its own I2C Sysfs directory or
256+
issue ``i2c-tools`` commands.
257+
258+
Tip: Once you understand the I2C topology with MUX, command
259+
`i2cdetect -l
260+
<https://manpages.debian.org/unstable/i2c-tools/i2cdetect.8.en.html>`_
261+
in
262+
`I2C Tools
263+
<https://i2c.wiki.kernel.org/index.php/I2C_Tools>`_
264+
can give you
265+
an overview of the I2C topology easily, if it is available on your system. For
266+
example::
267+
268+
$ i2cdetect -l | grep -e '\-73' -e _7 | sort -V
269+
i2c-7 i2c npcm_i2c_7 I2C adapter
270+
i2c-73 i2c i2c-7-mux (chan_id 1) I2C adapter
271+
i2c-78 i2c i2c-73-mux (chan_id 0) I2C adapter
272+
i2c-79 i2c i2c-73-mux (chan_id 1) I2C adapter
273+
i2c-80 i2c i2c-73-mux (chan_id 2) I2C adapter
274+
i2c-81 i2c i2c-73-mux (chan_id 3) I2C adapter
275+
i2c-82 i2c i2c-73-mux (chan_id 4) I2C adapter
276+
i2c-83 i2c i2c-73-mux (chan_id 5) I2C adapter
277+
i2c-84 i2c i2c-73-mux (chan_id 6) I2C adapter
278+
i2c-85 i2c i2c-73-mux (chan_id 7) I2C adapter
279+
280+
Pinned Logical I2C Bus Number
281+
-----------------------------
282+
283+
If not specified in DTS, when an I2C MUX driver is applied and the MUX device is
284+
successfully probed, the kernel will assign the MUX channels with a logical bus
285+
number based on the current biggest logical bus number incrementally. For
286+
example, if the system has ``i2c-15`` as the highest logical bus number, and a
287+
4-channel MUX is applied successfully, we will have ``i2c-16`` for the
288+
MUX channel 0, and all the way to ``i2c-19`` for the MUX channel 3.
289+
290+
The kernel software developer is able to pin the fanout MUX channels to a static
291+
logical I2C bus number in the DTS. This doc will not go through the details on
292+
how to implement this in DTS, but we can see an example in:
293+
`arch/arm/boot/dts/aspeed-bmc-facebook-wedge400.dts
294+
<../../arch/arm/boot/dts/aspeed-bmc-facebook-wedge400.dts>`_
295+
296+
In the above example, there is an 8-channel I2C MUX at address 0x70 on physical
297+
I2C bus 2. The channel 2 of the MUX is defined as ``imux18`` in DTS,
298+
and pinned to logical I2C bus number 18 with the line of ``i2c18 = &imux18;``
299+
in section ``aliases``.
300+
301+
Take it further, it is possible to design a logical I2C bus number schema that
302+
can be easily remembered by humans or calculated arithmetically. For example, we
303+
can pin the fanout channels of a MUX on bus 3 to start at 30. So 30 will be the
304+
logical bus number of the channel 0 of the MUX on bus 3, and 37 will be the
305+
logical bus number of the channel 7 of the MUX on bus 3.
306+
307+
I2C Devices
308+
===========
309+
310+
In previous sections, we mostly covered the I2C bus. In this section, let us see
311+
what we can learn from the I2C device directory whose link name is in the format
312+
of ``${bus}-${addr}``. The ``${bus}`` part in the name is a logical I2C bus
313+
decimal number, while the ``${addr}`` part is a hex number of the I2C address
314+
of each device.
315+
316+
I2C Device Directory Content
317+
----------------------------
318+
319+
Inside each I2C device directory, there is a file named ``name``.
320+
This file tells what device name it was used for the kernel driver to
321+
probe this device. Use command ``cat`` to read its content. For example::
322+
323+
/sys/bus/i2c/devices/i2c-73$ cat 73-0040/name
324+
ina230
325+
/sys/bus/i2c/devices/i2c-73$ cat 73-0070/name
326+
pca9546
327+
/sys/bus/i2c/devices/i2c-73$ cat 73-0072/name
328+
pca9547
329+
330+
There is a symbolic link named ``driver`` to tell what Linux kernel driver was
331+
used to probe this device::
332+
333+
/sys/bus/i2c/devices/i2c-73$ readlink -f 73-0040/driver
334+
/sys/bus/i2c/drivers/ina2xx
335+
/sys/bus/i2c/devices/i2c-73$ readlink -f 73-0072/driver
336+
/sys/bus/i2c/drivers/pca954x
337+
338+
But if the link ``driver`` does not exist at the first place,
339+
it may mean that the kernel driver failed to probe this device due to
340+
some errors. The error may be found in ``dmesg``::
341+
342+
/sys/bus/i2c/devices/i2c-73$ ls 73-0070/driver
343+
ls: 73-0070/driver: No such file or directory
344+
/sys/bus/i2c/devices/i2c-73$ dmesg | grep 73-0070
345+
pca954x 73-0070: probe failed
346+
pca954x 73-0070: probe failed
347+
348+
Depending on what the I2C device is and what kernel driver was used to probe the
349+
device, we may have different content in the device directory.
350+
351+
I2C MUX Device
352+
--------------
353+
354+
While you may be already aware of this in previous sections, an I2C MUX device
355+
will have symbolic link ``channel-*`` inside its device directory.
356+
These symbolic links point to their logical I2C bus directories::
357+
358+
/sys/bus/i2c/devices/i2c-73$ ls -l 73-0072/channel-*
359+
lrwxrwxrwx ... 73-0072/channel-0 -> ../i2c-78
360+
lrwxrwxrwx ... 73-0072/channel-1 -> ../i2c-79
361+
lrwxrwxrwx ... 73-0072/channel-2 -> ../i2c-80
362+
lrwxrwxrwx ... 73-0072/channel-3 -> ../i2c-81
363+
lrwxrwxrwx ... 73-0072/channel-4 -> ../i2c-82
364+
lrwxrwxrwx ... 73-0072/channel-5 -> ../i2c-83
365+
lrwxrwxrwx ... 73-0072/channel-6 -> ../i2c-84
366+
lrwxrwxrwx ... 73-0072/channel-7 -> ../i2c-85
367+
368+
I2C Sensor Device / Hwmon
369+
-------------------------
370+
371+
I2C sensor device is also common to see. If they are bound by a kernel hwmon
372+
(Hardware Monitoring) driver successfully, you will see a ``hwmon`` directory
373+
inside the I2C device directory. Keep digging into it, you will find the Hwmon
374+
Sysfs for the I2C sensor device::
375+
376+
/sys/bus/i2c/devices/i2c-73/73-0040/hwmon/hwmon17$ ls
377+
curr1_input in0_lcrit_alarm name subsystem
378+
device in1_crit power uevent
379+
in0_crit in1_crit_alarm power1_crit update_interval
380+
in0_crit_alarm in1_input power1_crit_alarm
381+
in0_input in1_lcrit power1_input
382+
in0_lcrit in1_lcrit_alarm shunt_resistor
383+
384+
For more info on the Hwmon Sysfs, refer to the doc:
385+
386+
`Naming and data format standards for sysfs files
387+
<../hwmon/sysfs-interface.rst>`_
388+
389+
Instantiate I2C Devices in I2C Sysfs
390+
------------------------------------
391+
392+
Refer to the doc:
393+
394+
`How to instantiate I2C devices, Method 4: Instantiate from user-space
395+
<instantiating-devices.rst#method-4-instantiate-from-user-space>`_

0 commit comments

Comments
 (0)