|
| 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