# I2C

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

Interintegrated circuit (I2C) is a bidirectional 2-wire bus for an efficient inter‑IC
            control bus developed by Philips in the 1980s. Every device on the bus has its own
            unique address (registered with the I2C general body headed by Philips). The I2C core
            supports a multicontroller mode and 10‑bit target address and 10‑bit extendable address.
            For more information on I2C, see [https://www.i2c-bus.org/fileadmin/ftp/i2c_bus_specification_1995.pdf](https://www.i2c-bus.org/fileadmin/ftp/i2c_bus_specification_1995.pdf).

### I2C communication sequence overview

The communication sequence between the controller and targets in I2C is shown in the
                following figure.

Figure : I2C sequence 
                
                ![](data:image/png;base64,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)

For example, no device can use 1111-0XX listed in the I2C specification and
                high-speed mode with 3.4 MHz clock frequency.

Following are the I2C modes and supported speeds.
- Standard mode: 100 kbps
- Fast mode: 400 kbps
- Fast mode plus: 1 Mbps

The maximum supported bandwidth is 1 MHz.

### I2C data packet format

The controller sends a 7‑bit or 10‑bit address as shown in the following figure.
                Along with the address, a 1‑bit read/write indicating the type of operation is also
                sent. Data is transferred in sequences of 8 bits placed on an SDA line. For every
                byte transferred, the device receiving the data sends back an ACK bit (totaling nine
                clock pulses).
- ACK bit LOW: receives the data and is ready to accept the next byte.
- ACK bit HIGH: receives the data and cannot accept further data. The
                        controller then terminates the transmission with the STOP sequence.

Figure : I2C data packet
                
                <!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

<!-- Generated by Microsoft Visio, SVG Export i2c-data-packet.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="9.44444in" height="3.48603in" viewbox="0 0 680 250.994" xml:space="preserve" color-interpolation-filters="sRGB" class="st7"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st2 { fill: #ffffff; stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st3 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st4 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st5 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st6 { font-size: 1em }
.svg-1 .st7 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<g v:mid="4" v:index="1" v:groupcontext="backgroundPage">	<v:userdefs>		<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>VBackground-1</title>	<v:pageproperties width="9.44444" height="3.48603" v:drawingscale="0.0138889" v:pagescale="0.0138889" v:drawingunits="29" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<g id="shape1-1" v:mid="1" v:groupcontext="shape">		<title>Solid</title>		<v:userdefs>			<v:ud v:nameu="Background" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="msvShapeCategories" v:prompt="" v:val="VT4(DoNotContain)"></v:ud>			<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>		</v:userdefs>		<rect x="0" y="0" width="680" height="250.994" class="st1"></rect>	</g></g><g v:mid="0" v:index="2" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="0.0138889" v:pagescale="0.0138889" v:drawingunits="29" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(18.5,-90.1591)">		<title>Rectangle</title>		<desc>Start</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="21.6394" cy="228.574" width="43.28" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="43.2788" height="44.8409" class="st2"></rect>		<text x="8.97" y="232.17" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Start</text>		</g>	<g id="shape3-6" v:mid="3" v:groupcontext="shape" transform="translate(60.9718,-90.1591)">		<title>Rectangle.2</title>		<desc>7 or 10 bits</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.3406" cy="228.574" width="162.69" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="162.681" height="44.8409" class="st2"></rect>		<text x="51.66" y="232.17" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>7 or 10 bits</text>		</g>	<g id="shape4-9" v:mid="4" v:groupcontext="shape" transform="translate(355.176,-90.1591)">		<title>Rectangle.3</title>		<desc>8 bits</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2723" cy="228.574" width="78.55" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="78.5447" height="44.8409" class="st2"></rect>		<text x="24.93" y="232.17" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>8 bits</text>		</g>	<g id="shape6-12" v:mid="6" v:groupcontext="shape" transform="translate(272.29,36.955) rotate(90)">		<title>Left Brace</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M72.28 250.99 A96.7668 107.138 0 0 1 36.14 186.97 L36.14 -69.11 L0 -69.11 L36.14 -69.11 L36.14 -325.19 A96.7668					 107.138 0 0 1 72.28 -389.21" class="st4"></path>	</g>	<g id="shape7-15" v:mid="7" v:groupcontext="shape" transform="translate(-26.534,208.614) rotate(-90)">		<title>Left Brace.9</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M41 250.99 A54.8912 27.2247 0 0 1 20.5 234.73 L20.5 169.65 L0 169.65 L20.5 169.65 L20.5 104.58 A54.8912 27.2247					 0 0 1 41 88.31" class="st4"></path>	</g>	<g id="shape8-18" v:mid="8" v:groupcontext="shape" transform="translate(303.61,-208.348)">		<title>Sheet.8</title>		<desc>Message</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2723" cy="238.921" width="78.55" height="24.1458"></v:textrect>		<rect x="0" y="226.848" width="78.5447" height="24.1458" class="st5"></rect>		<text x="14.93" y="242.52" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Message</text>		</g>	<g id="shape10-21" v:mid="10" v:groupcontext="shape" transform="translate(618.221,-90.1591)">		<title>Rectangle.10</title>		<desc>Stop</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="21.6394" cy="228.574" width="43.28" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="43.2788" height="44.8409" class="st2"></rect>		<text x="9.3" y="232.17" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Stop</text>		</g>	<g id="shape11-24" v:mid="11" v:groupcontext="shape" transform="translate(223.653,-90.1591)">		<title>Rectangle.11</title>		<desc>Read/write bit</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2723" cy="228.574" width="78.55" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="78.5447" height="44.8409" class="st2"></rect>		<text x="10.59" y="224.97" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Read/write <tspan x="32.94" dy="1.2em" class="st6">bit</tspan></text>		</g>	<g id="shape12-28" v:mid="12" v:groupcontext="shape" transform="translate(302.198,-90.1591)">		<title>Rectangle.12</title>		<desc>ACK/NACK bit</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="26.489" cy="228.574" width="52.98" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="52.978" height="44.8409" class="st2"></rect>		<text x="12.48" y="217.77" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ACK/<tspan x="9.82" dy="1.2em" class="st6">NACK </tspan><tspan x="20.15" dy="1.2em" class="st6">bit</tspan></text>		</g>	<g id="shape13-33" v:mid="13" v:groupcontext="shape" transform="translate(433.72,-90.1591)">		<title>Rectangle.13</title>		<desc>ACK/NACK bit</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="26.489" cy="228.574" width="52.98" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="52.978" height="44.8409" class="st2"></rect>		<text x="12.48" y="217.77" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ACK/<tspan x="9.82" dy="1.2em" class="st6">NACK </tspan><tspan x="20.15" dy="1.2em" class="st6">bit</tspan></text>		</g>	<g id="shape14-38" v:mid="14" v:groupcontext="shape" transform="translate(486.698,-90.1591)">		<title>Rectangle.14</title>		<desc>8 bits</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2723" cy="228.574" width="78.55" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="78.5447" height="44.8409" class="st2"></rect>		<text x="24.93" y="232.17" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>8 bits</text>		</g>	<g id="shape15-41" v:mid="15" v:groupcontext="shape" transform="translate(565.243,-90.1591)">		<title>Rectangle.15</title>		<desc>ACK/NACK bit</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="26.489" cy="228.574" width="52.98" height="44.8409"></v:textrect>		<rect x="0" y="206.153" width="52.978" height="44.8409" class="st2"></rect>		<text x="12.48" y="217.77" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ACK/<tspan x="9.82" dy="1.2em" class="st6">NACK </tspan><tspan x="20.15" dy="1.2em" class="st6">bit</tspan></text>		</g>	<g id="shape16-46" v:mid="16" v:groupcontext="shape" transform="translate(183.923,208.614) rotate(-90)">		<title>Left Brace.16</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M41 250.99 A54.8912 13.1445 0 0 1 20.5 243.14 L20.5 211.72 L0 211.72 L20.5 211.72 L20.5 180.3 A54.8912 13.1445					 0 0 1 41 172.45" class="st4"></path>	</g>	<g id="shape17-49" v:mid="17" v:groupcontext="shape" transform="translate(315.445,208.614) rotate(-90)">		<title>Left Brace.17</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M41 250.99 A54.8912 13.1445 0 0 1 20.5 243.14 L20.5 211.72 L0 211.72 L20.5 211.72 L20.5 180.3 A54.8912 13.1445					 0 0 1 41 172.45" class="st4"></path>	</g>	<g id="shape18-52" v:mid="18" v:groupcontext="shape" transform="translate(88.9022,-18.5)">		<title>Sheet.18</title>		<desc>Address frame</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="52.1997" cy="238.921" width="104.4" height="24.1458"></v:textrect>		<rect x="0" y="226.848" width="104.399" height="24.1458" class="st5"></rect>		<text x="13.18" y="242.52" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Address frame</text>		</g>	<g id="shape19-55" v:mid="19" v:groupcontext="shape" transform="translate(357.568,-18.5)">		<title>Sheet.19</title>		<desc>Data frame 1</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2723" cy="238.921" width="78.55" height="24.1458"></v:textrect>		<rect x="0" y="226.848" width="78.5447" height="24.1458" class="st5"></rect>		<text x="4.59" y="242.52" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Data frame 1</text>		</g>	<g id="shape20-58" v:mid="20" v:groupcontext="shape" transform="translate(489.091,-18.5)">		<title>Sheet.20</title>		<desc>Data frame 2</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2723" cy="238.921" width="78.55" height="24.1458"></v:textrect>		<rect x="0" y="226.848" width="78.5447" height="24.1458" class="st5"></rect>		<text x="4.59" y="242.52" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Data frame 2</text>		</g></g>
</svg>

### I2C sequences

When the SCL is high, the SDA must remain stable and
                    cannot change. Only when the clock line is low can the data line change.
                    However, there are two exceptions: START and STOP sequences.

![](data:image/png;base64,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)

## I2C features

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

This section explains the I2C serial engine transfer modes and the different scenarios
            where each mode is used. The following table lists the transfer modes enabled in the
            various I2C subsystem drivers.

| Subsystem | Transfer mode | Description |
| --- | --- | --- |
| Linux | <ul class="ul" id="i2c-features__ul_xkv_gyg_rcc"><br>                                    <li class="li">FIFO (low speed)</li><br><br>                                    <li class="li">CPU DMA (high speed)</li><br><br>                                    <li class="li">GSI</li><br><br>                                </ul> | <ul class="ul" id="i2c-features__ul_wth_db3_vzb"><br>                                    <li class="li">Supports 100&nbsp;kHz, 400&nbsp;kHz, and 1000&nbsp;kHz bus speeds</li><br><br>                                    <li class="li">Supports 7‑bit target address according to the I2C<br>                                        specification</li><br><br>                                </ul><ul class="ul" id="i2c-features__ul_f5k_q2z_qzb"><br>                                    <li class="li">Supports 100&nbsp;kHz, 400&nbsp;kHz, and 1000&nbsp;kHz bus speeds</li><br><br>                                    <li class="li">Supports 7‑bit target address according to the I2C<br>                                        specification </li><br><br>                                </ul> |
| Boot | FIFO | <ul class="ul" id="i2c-features__ul_wth_db3_vzb"><br>                                    <li class="li">Supports 100&nbsp;kHz, 400&nbsp;kHz, and 1000&nbsp;kHz bus speeds</li><br><br>                                    <li class="li">Supports 7‑bit target address according to the I2C<br>                                        specification</li><br><br>                                </ul><ul class="ul" id="i2c-features__ul_f5k_q2z_qzb"><br>                                    <li class="li">Supports 100&nbsp;kHz, 400&nbsp;kHz, and 1000&nbsp;kHz bus speeds</li><br><br>                                    <li class="li">Supports 7‑bit target address according to the I2C<br>                                        specification </li><br><br>                                </ul> |
| aDSP/TEE/SDC | FIFO | <ul class="ul" id="i2c-features__ul_wth_db3_vzb"><br>                                    <li class="li">Supports 100&nbsp;kHz, 400&nbsp;kHz, and 1000&nbsp;kHz bus speeds</li><br><br>                                    <li class="li">Supports 7‑bit target address according to the I2C<br>                                        specification</li><br><br>                                </ul><ul class="ul" id="i2c-features__ul_f5k_q2z_qzb"><br>                                    <li class="li">Supports 100&nbsp;kHz, 400&nbsp;kHz, and 1000&nbsp;kHz bus speeds</li><br><br>                                    <li class="li">Supports 7‑bit target address according to the I2C<br>                                        specification </li><br><br>                                </ul> |
|  |  |  |
|  |  |  |

## I2C interface

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

This section provides information about the subsystem driver, kernel device tree nodes,
            and related documentation.

Table : I2C interface: Linux

| File type | Description |
| --- | --- |
| Device tree source | <ul class="ul" id="i2c-interface__ul_ysx_dgf_ncc"><br>                                <li class="li">QCS6490 and QCS5430:&nbsp;<a href="https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi')">https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi</a></li><br><br>                                <li class="li">QCS9075:&nbsp;<a href="https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi')">https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi</a></li><br><br>                            </ul> |
| `Pinctrl` settings | <ul class="ul" id="i2c-interface__ul_rxz_v4f_ncc"><br>                                <li class="li">QCS6490 and QCS5430:&nbsp;<a href="https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi')">https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi</a></li><br><br>                                <li class="li">QCS9075:&nbsp;<a href="https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi')">https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi</a></li><br><br>                            </ul> |
| TEE settings | <ul class="ul" id="i2c-interface__ul_bzy_rp3_vdc"><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC_Access.c</span></li><br><br>                            </ul><br>. |

Table : I2C interface: Boot

| File type | Description |
| --- | --- |
| QUP v3 serial engine configuration | <ul class="ul" id="i2c-interface__ul_ytz_sym_rzb"><br>                                <li class="li">QUP v3 serial engine:<br>                                        <span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup_common/&lt;chipset&gt;-qupv3.dtsi</span></li><br><br>                                <li class="li">GPIO configurations:<br>                                        <span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup_common/&lt;chipset&gt;-qupv3-pinctrl.dtsi</span></li><br><br>                            </ul> |
| TEE settings | <ul class="ul" id="i2c-interface__ul_prp_sp3_vdc"><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC_Access.c</span></li><br><br>                            </ul> |

Table : I2C interface: aDSP/SLPI/SDC

| File type | Description |
| --- | --- |
| QUP v3 serial engine configuration | <ul class="ul" id="i2c-interface__ul_qnr_szm_rzb"><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_common/config/&lt;chipset&gt;/adsp/ssc/qup_devcfg.c</span></li><br><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/&lt;chipset&gt;/fw_devcfg.c</span></li><br><br>                                <li class="li"><span class="ph filepath">settings/buses/qup_common/config/&lt;chipset&gt;<br>                                        /adsp/ssc/qup_devcfg.json</span></li><br><br>                            </ul> |
| Firmware configuration settings | <ul class="ul" id="i2c-interface__ul_wpr_p5j_51c"><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/&lt;chipset&gt;/fw_devcfg.c</span></li><br><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/&lt;chipset&gt;/fw_devcfg.xml</span></li><br><br>                            </ul> |

Table : I2C interface: TEE

| File type | Description |
| --- | --- |
| QUP v3 serial engine configuration | <ul class="ul" id="i2c-interface__ul_xr2_vvn_rzb"><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/i2c/qupv3/config/&lt;chipset&gt;/tz/i2c_devcfg_user.h</span></li><br><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/i2c/qupv3/config/&lt;chipset&gt;/tz/i2c_devcfg_user.c</span></li><br><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/i2c/qupv3/config/&lt;chipset&gt;/tz/i2c_devcfg.xml</span></li><br><br>                            </ul> |
| TEE settings | <ul class="ul" id="i2c-interface__ul_sng_tp3_vdc"><br>                                <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC_Access.c</span></li><br><br>                            </ul> |

### I2C APIs

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

I2C APIs for the following subsystems are listed in this section.
- Linux:
    - [https://github.com/torvalds/linux/blob/master/include/linux/i2c.h](https://github.com/torvalds/linux/blob/master/include/linux/i2c.h).
    - [https://github.com/torvalds/linux/blob/master/include/linux/i2c-dev.h](https://github.com/torvalds/linux/blob/master/include/linux/i2c-dev.h).
- Boot: boot\_images/boot/QcomPkg/Include/i2c\_api.h
- aDSP/SDC/SLPI: adsp\_proc/core/api/buses/i2c\_api.h
- TEE: trustzone\_images/core/buses/api/i2c/qupv3/i2c\_api.h

## I2C software

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

This section provides information on the I2C device tree configuration, and documentation
            for the device nodes.

### Linux

For the configuration settings file, see the following DTSI files.
- QCS6490 and QCS5430: [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi)
- QCS9075: [https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi](https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi)

 For more details, see the i2c-geni-qcom.yaml file
                    at [https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/i2c/qcom%2Ci2c-geni-qcom.yaml](https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/i2c/qcom%2Ci2c-geni-qcom.yaml), and the I2C driver at the [https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c](https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c) files.

    i2c1: i2c@984000 {
    compatible = "qcom,geni-i2c";
    reg = <0 0x00984000 0 0x4000>;
    clocks = <&gcc GCC_QUPV3_WRAP0_S1_CLK>;
    clock-names = "se";
    pinctrl-names = "default";
    pinctrl-0 = <&qup_i2c1_data_clk>;
    interrupts = <GIC_SPI 602 IRQ_TYPE_LEVEL_HIGH>;
    #address-cells = <1>;
    #size-cells = <0>;
    interconnects = <&clk_virt MASTER_QUP_CORE_0 0 &clk_virt SLAVE_QUP_CORE_0 0>,	<&gem_noc MASTER_APPSS_PROC 0 &cnoc2 SLAVE_QUP_0 0>,	<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
    interconnect-names = "qup-core", "qup-config",	"qup-memory";
    power-domains = <&rpmhpd SC7280_CX>;
    required-opps = <&rpmhpd_opp_low_svs>;        dmas = <&gpi_dma0 0 1 QCOM_GPI_I2C>,	 <&gpi_dma0 1 1 QCOM_GPI_I2C>;
    dma-names = "tx", "rx";
    status = "disabled";		};Copy to clipboard

For kernel documentation specific to the GPIO `pinctrl`configuration,
                see the following files.
- QCS6490 and QCS5430: [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi)
- QCS9075: [https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi](https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi)
- Documentation/devicetree/bindings/pinctrl/qcom,&lt;chipset&gt;-tlmm.yaml

The corresponding configurations of the QUP v3 serial engine GPIOs are present
                and mapped in the pinctrl.dtsi file.

    qup_i2c1_data_clk: qup-i2c1-data-clk-state {			pins = "gpio4", "gpio5";			function = "qup01";		};Copy to clipboard

In the QUPAC\_Access.c file, ensure that the particular serial
                engine configuration for the specified protocol is for the I2C protocol. TEE
                    build: /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c.
                Modify the required settings or refer to the default settings assigned for the QUP
                v3 serial engine instances. The following sample configuration is enabled by default
                in
                I2C.

    /*   PeriphID,         ProtocolID,               Mode,  NsOwner,       bAllowFifo, bLoad, bModExcl  */
      { QUPV3_0_SE0, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // LT9611 and QPS615 I2C
      { QUPV3_0_SE1, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // APPS I2C - PCIE/ USB Type C
      { QUPV3_0_SE2, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // SMB / LS1 I2C
    
    { QUPV3_1_SE1, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // NFC I2C
     { QUPV3_1_SE2, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // HDMI OUT for
     { QUPV3_1_SE5, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_GSI,  AC_HLOS,            FALSE, TRUE,  FALSE}, // Legacy TouchCopy to clipboard

### Boot

1. Configure I2C in the UEFI. The configuration files can be accessed from the
                    following locations.
    - QUP v3 serial engine:
                                /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/BOOT.MXF.1.0.c1/boot\_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup\_common/&lt;chipset&gt;-qupv3.dtsi
    - TEE settings:
                                /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c

Note: For configuration settings in boot, see [Boot](https://docs.qualcomm.com/doc/80-70017-8/topic/spi.html#spi_software__section_ibv_tfb_r1c).
2. Enable the I2C protocol in UEFI at
                        /QcomPkg/SocPkg/&lt;chipset&gt;/LAA/Core.fdf.

        -#INF QcomPkg/Drivers/I2CDxe/I2CDxe.inf 
        +INF QcomPkg/Drivers/I2CDxe/I2CDxe.inf
        Copy to clipboard
3. The application enables the I2C interface. The application then performs the
                    read and write operation through the I2C interface. For information on I2C
                    function usage, see
                        boot\_images/QcomPkg/QcomTestPkg/I2CApp/I2Ceeprom.c.
4. Add i2c\_open-&gt;i2c\_read/i2c\_write-&gt;i2c\_close sequentially in
                    code.
5. Ensure that the GpiDxe.inf and I2C.efi
                    files are loaded by verifying the device/UEFI bootup logs before you call
                        `I2c_open`.

### aDSP/SDC

Firmware loading with SSC QUP is performed during the bootup sequence of the aDSP
                subsystem. The configuration files are present in the aDSP build at /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/ADSP.HT.5.5.c8/adsp\_proc/core/settings/buses/qup\_fw/config/&lt;chipset&gt;/fw\_devcfg.c
                and /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/ADSP.HT.5.5.c8/adsp\_proc/core/settings/buses/qup\_fw/config/&lt;chipset&gt;/fw\_devcfg.xml.

The following configuration is a sample of SSC QUP SE1, SE2, and SE3 settings loaded
                with the I2C
                firmware.

    se_cfg se1_cfg = { 0x84000, SE_PROTOCOL_I2C,    GSI,     TRUE, TRUE  };
    se_cfg se2_cfg = { 0x88000, SE_PROTOCOL_I2C,    GSI,     TRUE, TRUE  };
    se_cfg se3_cfg = { 0x8C000, SE_PROTOCOL_I2C,    GSI,     FALSE, TRUE  };Copy to clipboard

**GPIO configuration**: Each serial engine in the QUP v3 common driver is
                configured with the default GPIO configuration. The GPIO configuration is picked up
                by the QUP v3 common driver according to the protocol loaded in the serial engine.
                File
                    path: /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/ADSP.HT.5.5.c8/adsp\_proc/core/settings/buses/qup\_common/config/&lt;chipset&gt;/adsp/ssc/qup\_instance\_mapping.c.
                The default GPIO configuration can be overwritten as follows.

    {      .instance_id          =  5 ,         //Instance ID
            .qup              =  QUP_SSC,    //QUP Type
            .se_index         =  4,          //SE ID
            .se_data          =  NULL,       //devcfg_map
            .protocol_io_cfg  =  {
                                    TLMM_MAP(TLMM_GPIO_KEEPER ,TLMM_GPIO_2MA,TLMM_GPIO_KEEPER ),              //SLEEP CFG
                                    TLMM_MAP(TLMM_GPIO_NO_PULL,TLMM_GPIO_6MA,TLMM_GPIO_KEEPER ),              //SPI CFG
                                    TLMM_MAP(TLMM_GPIO_NO_PULL,TLMM_GPIO_2MA,TLMM_GPIO_NO_PULL),              //UART CFG
                                    TLMM_MAP(TLMM_GPIO_PULL_UP,TLMM_GPIO_2MA,TLMM_GPIO_NO_PULL),              //I2C CFG
                                    TLMM_MAP(TLMM_GPIO_PULL_UP,TLMM_GPIO_2MA,TLMM_GPIO_KEEPER )               //I3C CFG
                                 },
            .se_exclusive     =  TRUE,
    }
    Copy to clipboard

TLMM\_MAP is a macro to initialize the active and sleep state GPIO configurations. For
                example, sample usage of the TLMM\_MAP macro.

    TLMM_MAP (active state pull type, drive strength, sleep state pull type)Copy to clipboard

### TEE

The QUP v3 serial engine for I2C can be configured as follows. File path: settings/buses/i2c/qupv3/config/&lt;chipset&gt;/tz/i2c\_devcfg\_user.h.

    #define ENABLE_I2C_08Copy to clipboard

The `ENABLE_I2C_<num>` number is based on the serial number of the
                serial engine (starting from 0). For example, if there are two QUPs: QUPV3\_0 with
                seven serial engines and QUPV3\_1 with eight serial engines, then the user must
                enable QUPV3\_2\_SE2. The macro should be `ENABLE_I2C_08`.

GPIO configuration: drive strength and pull are configured per PIN for SDA at zero
                index and SCL at one index. File path: settings/buses/i2c/qupv3/config/&lt;chipset&gt;/tz/i2c\_devcfg\_user.c

    i2c_plat_device_config_user i2c_device_user_config_0 =
    {
        {0,0},        //.drive_strength index: 0 - SDA, 1 - SCL
                                        value: 0 - 2MA, 1 - 4MA, 2 - 6MA
        {3,3},       //.pull  index: 0 - SDA, 1 - SCL
                           value: 0 - NO_PULL, 1 = PULL_DOWN, 2 = KEEPER, 3 = PULL_UP
        0xFF,        //.gpii_idx 
        0,           //.mode_select  not supported for TZ
        0,           //.flags not supported for TZ
    };
    Copy to clipboard

QUPAC access control: controls the firmware loading and access control permission
                from the TEE subsystem are configured in the QUPAC access file
                    at /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c.

## I2C configuration

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

This section provides information about the I2C software driver kernel configuration and
            device tree node changes.

### Linux

The following driver kernel configurations are required to support the I2C
                    interface.
- Driver source: [https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c](https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c)
- Kernel defconfig file path:
                            &lt;workspace\_path\_of\_LINUX\_kernel\_image&gt;/sources/kernel/kernel\_platform/kernel/arch/arm64/configs/qcom\_defconfig

The following kernel configurations are to be enabled.
- `CONFIG_QCOM_GENI_SE=y`
- `CONFIG_I2C_CHARDEV=m`
- `CONFIG_I2C_QCOM_GENI=m` to configure user space
                        applications
- `CONFIG_QCOM_GPI_DMA=m` to enable GSI support

To enable the I2C DT node for validations, apply the following patch to the /arch/arm64/boot/dts/qcom/&lt;chipset&gt;.dtsi
                file.

    diff --git a/arch/arm64/boot/dts/qcom/<chipset>.dtsi b/arch/arm64/boot/dts/qcom/<chipset>.dtsi
    index 8575f0b..cced7c0 100644
    --- a/arch/arm64/boot/dts/qcom/<chipset>.dtsi
    +++ b/arch/arm64/boot/dts/qcom/<chipset>.dtsi
    @@ -6865,3 +6865,7 @@
     <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>;
     };
     };
    +
    + &i2c1 {
    + status = "ok";
    +};
    Copy to clipboard

Note: You should compile the kernel configuration and device tree
                changes. After compilation, you can load the images to the device to verify the
                interface. For information on interface verification, see the [I2C verification](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html#i2c-verification) section.

## I2C verification

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

This section describes the validation procedure and test results for the I2C drivers and
            the Qualcomm drivers.

### Linux

For upstream I2C kernel test applications, see [https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz](https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz).

To cross-compile tools, do the following.
1. Download `i2c-tool` from [https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz](https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz).
2. Extract the tool from the downloaded
                            `tar` file.

        tar -xzvf <i2c-tool-path>Copy to clipboard
3. Change the current directory to the
                                                  `i2c-tool`
                                                path.

        cd <i2c-tool-path>Copy to clipboard
4. Install the
                                                tool.

        sudo apt-get install gcc-aarch64-linux-gnuCopy to clipboard
5. Set up the environment for
                        cross-compilation.

        export CC=aarch64-linux-gnu-gccCopy to clipboard
6. Compile the
                            tool.

        make USE_STATIC_LIB=1Copy to clipboard

    The
                            binary is generated at
                        `<i2c-tool-path>/tools/`.

Validate the driver by checking for `dev` node
                                        (`/dev/i2c-0` and
                                `/dev/i2c-1`) in the SSH shell.

**Verify I2C driver**
1. To verify the I2C driver, do the following:
    1. Open the SSH shell in permissive mode. For
                                more information on how to run SSH, see the [Use SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html) section.
    2. Mount the file
                                system.

            mount -o remount,rw /usrCopy to clipboard
    3. Transfer files using SCP or similar tools. For
                                more information on how to run SSH, see the [Use SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html) section.
        For
                                    example, `scp i2cdetect
                                    root@10.92.162.185:/bin`
    4. Assign permission to
                                execute.

            chmod 777 i2cdetectCopy to clipboard
2. Verify an I2C device with the
                            `i2cdetect` tool. For example, `./i2cdetect -y -r
                            <i2c_instance_num>`.

        /lib # ./i2cdetect -y -r 0
        Copy to clipboard

The following output is
                            displayed.

        0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
        00: -- -- -- -- -- -- -- --
        10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        20: -- -- -- -- -- -- -- -- -- -- -- 2b -- -- -- --
        30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --
        50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        70: -- -- -- -- -- -- -- --
        /lib # exit
        Copy to clipboard

**View I2C detect help**
For more information on I2C detection, and how
                                        to use it, run the following commands.

    /lib # ./i2cdetect --helpCopy to clipboard

The
                                        following output is displayed.

    Error: Unsupported option "--help"!
    Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
    i2cdetect -F I2CBUS
    i2cdetect -l
    I2CBUS is an integer or an I2C bus name
    If provided, FIRST and LAST limit of the probing range.
    Copy to clipboard

**Identify probed device in DUT**
To identify the device probed from
                    the DUT, run the following
                    command.

    /lib # ./i2cdump -r 0-0xff 0 0x2b bCopy to clipboard

Output:

    WARNING! This program can confuse your I2C bus, cause data loss and worse!
    will probe file /dev/i2c-0, address 0x2b, mode byte
    Probe range limited to 0x00-0xff.
    Continue? [Y/n] Y
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    Copy to clipboard

**Read I2C data from device**
To read I2C data from the device, run the
                    following
                    commands.

    /lib # ./i2cget 0 0x2b 4 bCopy to clipboard

Output:

    WARNING! This program can confuse your I2C bus, cause data loss and worse!
    Will read from device file /dev/i2c-0, chip address 0x2b, data address
    0x04, using read byte data.
    Continue? [Y/n] Y
    0x00Copy to clipboard

## I2C debugging

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

The section describes the default logging method of the I2C software driver to enable
            logging the I2C transfer failures.

### Linux

The I2C driver logs are enabled through the kernel dynamic debugging method. Enable
                    `CONFIG_DYNAMIC_DEBUG`
                    in &lt;workspace\_path\_of\_LINUX\_kernel\_image&gt;/sources/kernel/kernel\_platform/kernel/arch/arm64/configs/qcom\_defconfig
                to support the dynamic debugging of the kernel drivers.

To enable and view the I2C driver logs in the kernel logs (`dmesg`),
                run the following
                commands.

    mount -t debugfs none /sys/kernel/debug
    echo -n "file i2c-qcom-geni.c +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file i2c-core-base.c +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file i2c-dev.c +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file i2c-mux.c +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file gpi.c +p" > /sys/kernel/debug/dynamic_debug/control
    Copy to clipboard

To debug the error message: `[ 8.583248] geni_i2c a94000.i2c: Invalid proto
                    1` for driver protocol load failures, do the following.

1. Identify the board type.
Example: QUPV3\_1\_SE5 board type
                        details

        B -    461251 - CDT Version:3,Platform ID:34,Major ID:1,Minor ID:0,Subtype:2Copy to clipboard
2. From the kernel log, locate the platform ID and subtype related details at /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.xml
3. Obtain the TEE QUPAC\_Access.c file configurations.
4. Identify the configuration specific to the serial engine.
5. Locate the platform ID type within the `QUPAC_Access.xml`
                    file.
6. Map this platform ID type to the corresponding `qupv3_perms`
                    structure within the `QUPAC_Access.c` file.
7. Verify the protocol and mode configurations in the
                        `QUPAC_Access.c` file.

## I2C examples

Source: [https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70017-8/topic/i2c.html)

For information on the upstream device tree reference, see the following DTSI files.
- QCS6490 and QCS5430: [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi)
- QCS9075: [https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi](https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi)

For information on device-tree node for the Qualcomm Linux hardware SoCs, see the
            following DTSI files.
- QCS6490 and QCS5430: [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts)
- QCS9075: [https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi](https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi)

Last Published: Jan 31, 2025

[Previous Topic
SPI](https://docs.qualcomm.com/bundle/publicresource/80-70017-8/topics/spi.md) [Next Topic
I3C](https://docs.qualcomm.com/bundle/publicresource/80-70017-8/topics/i3c.md)