# I2C

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

I2C 是飞利浦公司在 20 世纪 80 年代开发的一种双向 2 线制总线，用于实现高效的 IC 间控制总线。总线上的每个设备都有其唯一的地址（在由飞利浦公司领导的 I2C General Body 中注册）。I2C 核心支持多控制器模式，以及 10 位目标地址和 10 位可扩展地址。有关 I2C 的详细信息，可访问 [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 通信序列概述

下图显示了控制器与目标之间的 I2C 通信序列，

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

例如，任何设备都不能使用 I2C 规范中列出的 1111-0XX。这是时钟频率为 3.4 MHz 的高速模式。

以下为各种 I2C 模式及其支持的速度。
- 标准模式：100 kbps
- 快速模式： 400 kbps
- 超快速模式：1 Mbps

最高支持 1 MHz 的带宽。

### I2C 数据包格式

如下图所示，控制器发送 7 位或 10 位地址，以及一个指示操作类型的读/写位。数据以 8 位为序列在 SDA 线上进行传输。每传输一个字节，负责接收数据的设备就会发回一个 ACK 位（总共 9 个时钟脉冲）。
- ACK 位 LOW：表示已收到数据并准备好接受下一个字节。
- ACK 位 HIGH：表示已收到数据但无法接受更多数据。控制器随后使用 STOP 序列终止传输。

Figure : I2C 数据包
                <!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

<!-- 由 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="st11"><v:documentproperties v:langid="2052">	<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: 黑体; font-size: 1.00001em }
.svg-1 .st4 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st5 { font-family: 黑体; font-size: 1em }
.svg-1 .st6 { fill: none }
.svg-1 .st7 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st8 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st9 { font-family: Arial; font-size: 1em }
.svg-1 .st10 { font-size: 1em }
.svg-1 .st11 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<g v:mid="1" 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" transform="translate(0,-0.000139057)">		<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.000278115" 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="shape1-3" v:mid="1" v:groupcontext="shape" transform="translate(18.5,-90.1593)">		<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="9.64" y="232.48" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>起始</text>		</g>	<g id="shape2-6" v:mid="2" v:groupcontext="shape" transform="translate(60.9718,-90.1593)">		<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="48.33" y="232.48" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>7 <tspan class="st5">位或</tspan> 10 <tspan class="st5">位</tspan></text>		</g>	<g id="shape3-11" v:mid="3" v:groupcontext="shape" transform="translate(355.176,-90.1593)">		<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="28.27" y="232.48" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>8 <tspan class="st5">位</tspan></text>		</g>	<g id="shape4-15" v:mid="4" v:groupcontext="shape" transform="translate(272.294,36.9551) 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 A107.138 96.7668 90 0 1 36.14 186.97 L36.14 -69.11 L0 -69.11 L36.14 -69.11 L36.14 -325.19 A107.138					 96.7668 90 0 1 72.28 -389.21 L72.28 250.99 Z" class="st6"></path>		<path d="M72.28 250.99 A107.138 96.7668 90 0 1 36.14 186.97 L36.14 -69.11 L0 -69.11 L36.14 -69.11 L36.14 -325.19 A107.138					 96.7668 90 0 1 72.28 -389.21" class="st7"></path>	</g>	<g id="shape5-18" v:mid="5" v:groupcontext="shape" transform="translate(-26.5383,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 180 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					 180 0 1 41 88.31 L41 250.99 Z" class="st6"></path>		<path d="M41 250.99 A54.8912 27.2247 180 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					 180 0 1 41 88.31" class="st7"></path>	</g>	<g id="shape6-21" v:mid="6" v:groupcontext="shape" transform="translate(301.455,-208.348)">		<title>工作表.6</title>		<desc>Message</desc>		<v:userdefs></v:userdefs>		<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="st8"></rect>		<text x="27.27" y="242.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>消息</text>		</g>	<g id="shape7-24" v:mid="7" v:groupcontext="shape" transform="translate(618.221,-90.1593)">		<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.64" y="232.48" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>停止</text>		</g>	<g id="shape8-27" v:mid="8" v:groupcontext="shape" transform="translate(223.653,-90.1593)">		<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="19.61" y="232.48" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>读<tspan class="st9">/</tspan>写位</text>		</g>	<g id="shape9-31" v:mid="9" v:groupcontext="shape" transform="translate(302.198,-90.1593)">		<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.17" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ACK/<tspan x="9.82" dy="1.2em" class="st10">NACK </tspan><tspan x="20.49" dy="1.275em" class="st5">位</tspan></text>		</g>	<g id="shape10-36" v:mid="10" v:groupcontext="shape" transform="translate(433.72,-90.1593)">		<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.17" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ACK/<tspan x="9.82" dy="1.2em" class="st10">NACK </tspan><tspan x="20.49" dy="1.275em" class="st5">位</tspan></text>		</g>	<g id="shape11-41" v:mid="11" v:groupcontext="shape" transform="translate(486.698,-90.1593)">		<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="28.27" y="232.48" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>8 <tspan class="st5">位</tspan></text>		</g>	<g id="shape12-45" v:mid="12" v:groupcontext="shape" transform="translate(565.243,-90.1593)">		<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.17" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ACK/<tspan x="9.82" dy="1.2em" class="st10">NACK </tspan><tspan x="20.49" dy="1.275em" class="st5">位</tspan></text>		</g>	<g id="shape13-50" v:mid="13" v:groupcontext="shape" transform="translate(183.919,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 180 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					 180 0 1 41 172.45 L41 250.99 Z" class="st6"></path>		<path d="M41 250.99 A54.8912 13.1445 180 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					 180 0 1 41 172.45" class="st7"></path>	</g>	<g id="shape14-53" v:mid="14" v:groupcontext="shape" transform="translate(315.441,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 180 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					 180 0 1 41 172.45 L41 250.99 Z" class="st6"></path>		<path d="M41 250.99 A54.8912 13.1445 180 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					 180 0 1 41 172.45" class="st7"></path>	</g>	<g id="shape15-56" v:mid="15" v:groupcontext="shape" transform="translate(90.601,-18.5003)">		<title>工作表.15</title>		<desc>Address frame</desc>		<v:userdefs></v:userdefs>		<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="st8"></rect>		<text x="34.2" y="242.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>地址帧</text>		</g>	<g id="shape16-59" v:mid="16" v:groupcontext="shape" transform="translate(356.455,-18.5003)">		<title>工作表.16</title>		<desc>Data frame 1</desc>		<v:userdefs></v:userdefs>		<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="st8"></rect>		<text x="16.27" y="242.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>数据帧<tspan class="st9"> </tspan><tspan class="st9">1</tspan></text>		</g>	<g id="shape17-64" v:mid="17" v:groupcontext="shape" transform="translate(490,-18.5003)">		<title>工作表.17</title>		<desc>Data frame 2</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="37.5" cy="238.921" width="75.01" height="24.1458"></v:textrect>		<rect x="0" y="226.848" width="75" height="24.1458" class="st8"></rect>		<text x="14.5" y="242.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>数据帧<tspan class="st9"> </tspan><tspan class="st9">2</tspan></text>		</g></g>
</svg>

### I2C 序列

当 SCL 为高电平时，SDA 必须保持稳定且不能变化。仅当时钟线为低电平时，数据线才可以变化。但是，存在两种例外情况：START 序列和 STOP 序列。

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

## I2C 功能

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

本节介绍 I2C 串行引擎传输模式以及支持不同传输模式的各种用例。下表列出了各种 I2C 子系统驱动程序中启用的传输模式。

| 子系统 | 传输模式 | 说明 |
| --- | --- | --- |
| Linux | <ul class="ul" id="i2c-features__ul_xkv_gyg_rcc"><br>                                    <li class="li">FIFO（低速）</li><br><br>                                    <li class="li">CPU DMA（高速）</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">支持 100&nbsp;kHz、400&nbsp;kHz 和 1000&nbsp;kHz 总线速度</li><br><br>                                    <li class="li">支持符合 I2C 规范的 7 位目标地址</li><br><br>                                </ul><ul class="ul" id="i2c-features__ul_f5k_q2z_qzb"><br>                                    <li class="li">支持 100&nbsp;kHz、400&nbsp;kHz 和 1000&nbsp;kHz 总线速度</li><br><br>                                    <li class="li">支持符合 I2C 规范的 7 位目标地址</li><br><br>                                </ul> |
| 启动 | FIFO | <ul class="ul" id="i2c-features__ul_wth_db3_vzb"><br>                                    <li class="li">支持 100&nbsp;kHz、400&nbsp;kHz 和 1000&nbsp;kHz 总线速度</li><br><br>                                    <li class="li">支持符合 I2C 规范的 7 位目标地址</li><br><br>                                </ul><ul class="ul" id="i2c-features__ul_f5k_q2z_qzb"><br>                                    <li class="li">支持 100&nbsp;kHz、400&nbsp;kHz 和 1000&nbsp;kHz 总线速度</li><br><br>                                    <li class="li">支持符合 I2C 规范的 7 位目标地址</li><br><br>                                </ul> |
| aDSP/TrustZone/SDC | FIFO | <ul class="ul" id="i2c-features__ul_wth_db3_vzb"><br>                                    <li class="li">支持 100&nbsp;kHz、400&nbsp;kHz 和 1000&nbsp;kHz 总线速度</li><br><br>                                    <li class="li">支持符合 I2C 规范的 7 位目标地址</li><br><br>                                </ul><ul class="ul" id="i2c-features__ul_f5k_q2z_qzb"><br>                                    <li class="li">支持 100&nbsp;kHz、400&nbsp;kHz 和 1000&nbsp;kHz 总线速度</li><br><br>                                    <li class="li">支持符合 I2C 规范的 7 位目标地址</li><br><br>                                </ul> |
|  |  |  |
|  |  |  |

## I2C 接口

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

本节提供有关子系统驱动程序、内核设备树节点和相关文档的信息。

Table : I2C 接口：Linux

| 文件类型 | 说明 |
| --- | --- |
| 设备树源 | 有关 QUP v3 串行引擎接口设备节点和 I2C 设备节点的设备树配置，参见以下 DTSI 文件。<ul class="ul" id="i2c-interface__ul_ysx_dgf_ncc"><br>                                <li class="li">QCS6490 和 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` 设置 | 有关 I2C 设备节点的 QUP v3 串行引擎接口的 GPIO 设置的设备树属性，参见以下 DTSI 文件。<ul class="ul" id="i2c-interface__ul_rxz_v4f_ncc"><br>                                <li class="li">QCS6490 和 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> |
| TrustZone 设置 | 有关针对不同子系统加载 QUP v3 串行引擎 I2C 固件的 TrustZone 访问控制设置，可访问 /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。 |

Table : I2C 接口：启动

| 文件类型 | 说明 |
| --- | --- |
| QUP v3 串行引擎配置 | 要针对 I2C 配置 boot 子系统中的 QUP v3 串行引擎，以及针对 I2C 软件用例配置 GPIO，可访问以下文件路径：<ul class="ul" id="i2c-interface__ul_ytz_sym_rzb"><br>                                <li class="li">QUP v3 串行引擎：<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 配置：<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> |
| TrustZone 设置 | 有关针对不同子系统加载 I2C 协议的 QUP v3 串行引擎固件中的 TrustZone 访问控制设置，可访问 /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 |

Table : I2C 接口：aDSP/SLPI/SDC

| 文件类型 | 说明 |
| --- | --- |
| QUP v3 串行引擎配置 | 有关 aDSP 子系统中用于启用 I2C 接口的 QUP v3 串行引擎配置设置，可访问以下文件路径。<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; /adsp/ssc/qup_devcfg.json</span></li><br><br>                            </ul> |
| 固件配置设置 | 有关在 aDSP 软件中配置 I2C 的 QUP v3 串行引擎固件设置，可参见以下文件。<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 接口：TrustZone

| 文件类型 | 说明 |
| --- | --- |
| QUP v3 串行引擎配置 | <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> |
| TrustZone 设置 | /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 API

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

本节列出了以下子系统的 I2C API。
- 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\_images/boot/QcomPkg/Include/i2c\_api.h
- aDSP/SDC/SLPI：adsp\_proc/core/api/buses/i2c\_api.h
- TrustZone：trustzone\_images/core/buses/api/i2c/qupv3/i2c\_api.h

## I2C 软件

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

本节提供 I2C 设备树配置的相关信息，以及设备节点的相关文档。

### Linux

有关配置设置文件，参见以下 DTSI 文件。
- QCS6490 和 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)

 更多详细信息，可参见 i2c-geni-qcom.yaml 文件（位于 [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)）。I2C 驱动程序位于 [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) 文件中。

    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

有关特定于 GPIO `pinctrl`配置的内核文档，参见以下文件。
- QCS6490 和 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

QUP v3 串行引擎 GPIO 的相应配置存在并映射到 pinctrl.dtsi 文件中。

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

在 QUPAC\_Access.c 文件中，确保特定串行引擎的协议配置采用 I2C 协议。TrustZone 版本：/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。
                修改所需的设置，或者参考针对 QUP v3 串行引擎实例分配的默认设置。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

### 启动

1. 在 UEFI 中配置 I2C。可从以下位置访问配置文件。
    - QUP v3 串行引擎：/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
    - TrustZone 设置：/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: 有关启动过程中的配置设置，参见[启动](https://docs.qualcomm.com/doc/80-70015-8SC/topic/spi.html#spi_software__section_ibv_tfb_r1c)。
2. 在 UEFI（位于 /QcomPkg/SocPkg/&lt;chipset&gt;/LAA/Core.fdf）中启用 I2C 协议。

        -#INF QcomPkg/Drivers/I2CDxe/I2CDxe.inf 
        +INF QcomPkg/Drivers/I2CDxe/I2CDxe.inf
        Copy to clipboard
3. 应用程序启用 I2C 接口。应用程序随后通过 I2C 接口执行读写操作。有关 I2C 函数用法的信息，参见 boot\_images/QcomPkg/QcomTestPkg/I2CApp/I2Ceeprom.c。
4. 在代码中按顺序添加 i2c\_open-&gt;i2c\_read/i2c\_write-&gt;i2c\_close。
5. 在调用 `I2c_open` 之前，通过验证设备/UEFI 启动日志来确保加载 GpiDxe.inf 和 I2C.efi 文件。

### aDSP/SDC

在 aDSP 子系统的启动序列期间，将执行 SSC QUP 的固件加载。配置文件位于 aDSP 编译版本（/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 和 /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）中。

以下配置是向 SSC QUP SE1、SE2 和 SE3 设置中加载 I2C 固件的示例。

    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 配置：QUP v3 通用驱动程序中的每个串行引擎均采用默认 GPIO 配置（根据芯片产品特定的配置中的协议）。QUP v3 通用驱动程序根据串行引擎中加载的协议获取 GPIO 配置。文件路径：/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。
                可按照如下所示覆盖默认 GPIO 配置。

    {      .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 是用于初始化工作和休眠状态 GPIO 配置的宏。以下为 TLMM\_MAP 宏的使用示例。

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

### TrustZone

可按照如下所示将 QUP v3 串行引擎配置为 I2C。文件路径：settings/buses/i2c/qupv3/config/&lt;chipset&gt;/tz/i2c\_devcfg\_user.h。

    #define ENABLE_I2C_08Copy to clipboard

`ENABLE_I2C_<num>` 编号基于串行引擎的序列号（从 0 开始）。举例来说，假设有两个 QUP：QUPV3\_0 具有七个串行引擎，QUPV3\_1 具有八个串行引擎，则用户必须启用 QUPV3\_2\_SE2。宏应为 `ENABLE_I2C_08`。

GPIO 配置：根据 PIN 索引（SDA 为 0，SCL 为 1）配置驱动器强度和上下拉。文件路径：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 访问控制：在 QUPAC 访问文件（位于 /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）中控制 TrustZone 子系统的固件加载和访问控制权限。

## I2C 配置

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

本节提供有关 I2C 软件驱动程序内核配置和设备树节点更改的信息。

### Linux

需要以下驱动程序内核配置才能支持 I2C 接口。
- 驱动程序源文件： [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)
- 内核 defconfig 文件路径： &lt;workspace\_path\_of\_LINUX\_kernel\_image&gt;/sources/kernel/kernel\_platform/kernel/arch/arm64/configs/qcom\_defconfig

将启用以下内核配置。
- `CONFIG_QCOM_GENI_SE=y`
- `CONFIG_I2C_CHARDEV=m`
- `CONFIG_I2C_QCOM_GENI=m`，用于配置用户空间应用程序
- `CONFIG_QCOM_GPI_DMA=m`，用于启用 GSI 支持

要启用 I2C DT 节点进行验证，需对 /arch/arm64/boot/dts/qcom/&lt;chipset&gt;.dtsi 文件应用以下补丁。

    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: 应编译内核配置和设备树更改。编译完成后，可以将镜像加载到设备中，以验证接口。有关接口验证的信息，参见 [I2C 验证](https://docs.qualcomm.com/doc/80-70015-8SC/topic/i2c.html#i2c-verification)一节。

## I2C 验证

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

本节介绍 I2C 驱动程序和 Qualcomm 驱动程序的验证步骤和测试结果。

### Linux

有关上游 I2C 内核测试应用程序，可访问 [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)。

要交叉编译工具，应按照以下步骤操作。
1. 访问 [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) 下载 `i2c-tool`。
2. 将下载的 `tar` 文件解压获取工具。

        command: tar -xzvf <i2c-tool-path>Copy to clipboard
3. 将当前目录更改为 `i2c-tool` 路径。

        cd <i2c-tool-path>Copy to clipboard
4. 安装工具。

        sudo apt-get install gcc-aarch64-linux-gnuCopy to clipboard
5. 搭建交叉编译环境。

        export CC=aarch64-linux-gnu-gccCopy to clipboard
6. 编译工具。

        make USE_STATIC_LIB=1Copy to clipboard

    随后将在 `<i2c-tool-path>/tools/` 下生成二进制文件。

通过在 SSH shell 中查找 `dev` 节点（`/dev/i2c-0` 和 `/dev/i2c-1`）验证驱动程序。

**验证 I2C 驱动程序**
1. 要验证 I2C 驱动程序，应进行以下操作：
    1. 在 Permissive 模式下打开 SSH shell。有关如何运行 SSH 的更多信息，参见[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#use-ssh) 一节。
    2. 安装文件系统。

            mount -o remount,rw /Copy to clipboard
    3. 使用 SCP 或类似工具传输文件。有关如何运行 SSH 的更多信息，参见[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#use-ssh) 一节。
        例如，`scp i2cdetect root@10.92.162.185:/bin`
    4. 分配执行权限。

            chmod 777 i2cdetectCopy to clipboard
2. 使用 `i2cdetect` 工具验证 I2C 设备。例如，`./i2cdetect -y -r <i2c_instance_num>`。

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

随即显示以下输出。

        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

**查看 I2C 检测帮助**
如需有关 I2C 检测及其使用方法的更多信息，可运行以下命令。

    /lib # ./i2cdetect --helpCopy to clipboard

随即显示以下输出。

    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

**识别 DUT 中被探测的设备**
要识别 DUT 中被探测的设备，应运行以下命令。

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

随即显示以下输出。

    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

**从设备读取 I2C 数据**
要从设备读取 I2C 数据，应运行以下命令。

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

随即显示以下输出。

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

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

本节介绍用于启用 I2C 传输失败日志的 I2C 软件驱动程序的默认日志方法。

### Linux

通过内核动态调试方法启用 I2C 驱动程序日志。在 &lt;workspace\_path\_of\_LINUX\_kernel\_image&gt;/sources/kernel/kernel\_platform/kernel/arch/arm64/configs/qcom\_defconfig 中启用 `CONFIG_DYNAMIC_DEBUG`，以支持内核驱动程序的动态调试。

要在内核日志 (`dmesg`) 中启用和查看 I2C 驱动程序日志，应运行以下命令。

    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

要调试以下错误消息： `[ 8.583248] geni_i2c a94000.i2c: Invalid proto 1`（对应驱动程序协议加载失败），应按照以下步骤操作。

1. 确定电路板的类型。
示例：QUPV3\_1\_SE5 电路板类型详细信息

        B -    461251 - CDT Version:3,Platform ID:34,Major ID:1,Minor ID:0,Subtype:2Copy to clipboard
2. 在核心日志中找到平台 ID 和子类型的相关详细信息（位于 /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. 获取 TrustZone QUPAC\_Access.c 文件配置。
4. 确定特定于串行引擎的配置。
5. 在 `QUPAC_Access.xml` 文件中找到平台 ID 类型。
6. 将该平台 ID 类型映射到 `QUPAC_Access.c` 文件中相应的 `qupv3_perms` 结构体。
7. 映射后，验证 `QUPAC_Access.c` 文件中的协议和模式配置以确保设置正确。

## I2C 示例

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

有关上游设备树参考的信息，参见以下 DTSI 文件。
- QCS6490 和 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)

有关 Qualcomm Linux 芯片产品设备树节点的信息，参见以下 DTSI 文件。
- QCS6490 和 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: Dec 03, 2024

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