# I2C Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-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 target 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. ### I2C communication sequence overview The communication sequence between the controller and targets in I2C is as follows. It is also illustrated in the following figure. 1. The START sequence is sent by the controller to all the target devices on the bus. 2. The controller sends an address of the device that it wants to access, along with the read and write operation. 3. The target devices compare this address with their own to find an identical address. - Both addresses are identical: target sends an ACK signal. - Both addresses are not identical: targets wait until the bus is released by the STOP sequence. 4. The controller starts to transmit and receive data after receiving the ACK signal. 5. The controller sends a STOP condition, after completion. Figure : I2C sequence ![](data:image/png;base64,UklGRiAkAABXRUJQVlA4TBMkAAAvpoIvANXoYf8/kiS5anPNMWWWOeaaZcqUKbPMNcfUu+/70q1+t269+z720H2++6055phrrilzvQaCfzLyiKzOWWcQCnC5RG6h/hsdCnAJguA26g0nKhQgyEeUChqGAmpt27aayX9LHCU8iX0dgANJCZRECUhk6CAlJCU8+dzORzitbVtOtsjwOqCESGw6ABckJaQkSkAiSQeUAA4ZJO4yiP7TgiTJctvUhE46xMPdPQMQOCyO/n7F10vrI7b4Xb7C7VBf5fnutvB/d2v4f37t+f8adcP/8ACE3BMBECiDwZf5QU65XmJ+kn9G+nd8Hvmr5P+GS6ftX9w6/p27pFOfB5GslTk32P8dk/f5Aa75XubPcVmWh/h9zLMK8Yl60Px5vp8nGqeDPtkK+q8T4T9IGygxnMPb8d1k0Gp2VrWjZq0ZqnZ1Bv0nyr+g/Ndq39/KEWRozfVO/gXl34lTHoegORgIK3+R3Fz/TC7v8lluaJcrhqdXPI+fob1hvuYd1gwFlRfwexp+uvWX0Zwbzk2SFTJqDuo9AueRh8CUwXkIgXMedQgclO40UxUtJwRdoy50HJQi2plWamV0mkfi38oKG3WNs9BRMgJTRtQMK2xnmmUFhFXnvz4OzUg4UnHQ/v8T4OmCn3BpzaP5R/wshN/EJd1Qb0zU9+CWZZG+u3+er3lenu/kFesHEMLQrnc08W8TT7W45rGb+rVNOXfTuqoYjWn9aGJs+369IcYoFj/GGJe1X9towtD3gzbRxM0rE6MJfjAxqrXvR27i3PerMqZb+37mMRo+rcFEYxbfEisrtGIWPxvaSoxC+a1CEVU2S7WuU0f8z9AZX1cN42gjtKIN0N7GaOh0jPIjtNIDdbpfIxUHkLFOPBrFiGNdg4FWjIEJQytjRbv2UydzPu2dWngjrX0amcwDuCej7x/m+ZlIEC8wZP+KTpZEP9Wb+KOcaJmouV5x8oU7XvoBVy7iDQVHY4L3E67amMVDGWUqXpsZ1x5bY/iMqIwxXY+DMJxo951QxU84xUhkEFl6QB+Eia3H1oiOWOm1McrjbEzoy1T6AGQMmoceB1+M09hPOEQRx4KLAdp7bkxsC7YGWuHGGGKFEYeA6Qg6HRNW7I3RK5ERjAkT9hymgx20omkroit+wpWDhGcdO18mXAXk49OdhxpsQ/2zMV6/fbhfloel2gDuhvZhWayXz8N8T3OyRbgBJ6OwzS3qNGAwGyKOyYzYmg2V2AriaESLm5lR8d7z4CcyaVg6YVpEHJLocIhLacWGS1y9DjiZBbcUPGKvUyRWFiFGbOOMnZgRcRaixdnMuIi5IG46tjiIFpUckYvJ8zghohKi81gh4oBYWiFCT2RAK61II45mRmWIlZFYGeOISiwFcRVC4WBGbIXyiGtMCsQxAiurTnyAccy4mAE7MSDizPmMs5lLyI/uYs3Jlqijsf6ZPATvByXuFgYP81DRDvdL8Bfq7Z043TKajzgn7re0oXAtqjjNA2FAZW/ARVwxbtiKtOFiVRlDmYRZexOmccUumW2YCS2OUvvZrCWkEbuFWClrWqbWe275MG+4JLNhsAoXQ2TMSczECrZiGGccdNywtaHMafApzyXoaZxQpdSubeljitNItItlGvs+Jj4BK2LDjmiP27bhSKwo22ErxmEsa0ojjsDKOIx+jbbFMWk/JLUuvudWD/OASzITBpJwmuaZMKCyChfAKc9DDdI01Nwz82b3ObY9Dq6Opyu6hwfbB4r0s5xopVQx40gQAyanUImYZmytmLCTCm9I0Y7YJjugsl2ZA05CTL0RRkwYrIhJ4WDTiG3mfibXsC12LY42+jUZEQnGiBEXawbUssNFxESEiQ2VDGVM0S6EAdsU/Cwmb91YOmHEgJ1NUcTSmyRiGiuSEbzCEhmQUDEKI1psiZVOBiAjVIAAtZ9TTLqsRo7YWu6nZIwhGJNmXKxY4aPWxtRSJFVagjzZeVhTLaKh5gjsC57EFcPzA4PtYeG4zvOGwx1F+lecaEFmmkuFtbZCigEDmWVrJUEO2MlQxoBDShVSApK1FTK1ELN6XhFaHKXxq7WyIspk04hKiooMrFgiLFFYK3ciWJkIn1hLIA5HVJUMyXuWjLSBdForbYUkMrLGNllbYe2Mi6ywVhIyjZXGr9EmC6ynFT5qpbWAic0np1q2job6T0zejgn+N6640FdxfVie51kIkYIXUJ093RKaj2Azp2swPSkM8o0d8YYMJq1DJW1ucbFywy6H0uoy2DStQso0oZbWyg63bBdsXfRjmnyUbdEKx2z8JK00vo/SvrEVxAp3AZV8Iwl2hlakzYCNUEbCpS1aEgJxViGkfSNHVEBGD2TYlsiYqUectEuFnTE4jQt8PEhJAuR+lgBBAszRD/YNwRDtM2FAnjtU2coFR2qnLAB7siVFDbmp7lg89PMDgV/xVPFAlKjillwseBc33XAPkG/kqVbFDWUQClvZIpczxiwlQcJ3USFLVyHzApQF0a8p+iFlQJYSIDXO4IlwLtoOPnLcZMBZygpvspS2xS7nFjs7ArUttlkqXGSLnZROEUacEzE7FyMHotZWEGeGICVAymwqiBxCXlDJFkP+ReSCS84KlVyIWkiHI3AnMy9rcgGk00qZRUWWm6zIcsROzqizzAu8Siuoq2R5slVLQ/2/kcwdU0ZjJe/D/fPcc2PMiPr+vuvBMdt77TNEbidaOYE7uqYv2vHSz2VKOecK56L3c1lFlpcWl5xNX0bfi9ziMKGS2dkJucu/SK5wORHtnjtd1hk3KSec+6IrVaLCySwrWFZyrnDOrH72vcnyoqg7usaXSLRvuNmcZYWrsqlIect5xC5n6Uzvk5M5V2QXfZl9L1zOBGf6co3vjftFMsc1u7SW2fuYpQMkEAfP0gmiVeaKLoPAkQTuCLHz/pqyGnJH7mTHYcspsGmqf/nAvJK5olSlnpeHbu2rusY8LHejhv/BywB27/Kp1qNLXMdu8r2yOYfVb8Y9PuawaeeyXv0Q3WO+hEHnR8cnP3Hn0uj7G6TLTi6zcDm7uCn36MzgJ51d7la/CUdkrCE/ZmfHMbn8mMPA3SOwYvLjo9NbcI8ZWCHO+NBqHtXq105m2a2eWHJZkRiyS3MrXX50HdDu0jjaOiuRhKUH7WA6kRg2c+seXZz8pIkMMbeSHcfcAu3dxp3LYfWDIc700Gkel75MWv4i2f0vXD7ZcnU01j+b5e0lZ1cpub97IvVMrkVuB/56ewdwj+5Uy1aYSH0oKa28uN/GuSyz487ZxJLhKBnukpN1F+d+ByiHIVIm6Uh6NmWiTibrHHe9k9LR6twOVmSSF6hKsD6kdU7azHIGtffO1ciot8Lyv4MM4t85mV1fF0fv6hIGMhLlX76RhNOti9Vs/jtNdffwikMWxJ0yPIpkP7EVT08X2JzLBdzTjjIuDHX7qbo8Pbnd1O3s7Cnpv8ynO/mvd3hIK25vGTVinxj+LUEkawGXWwPXWG7Rda6ZYEQiPLq3J+xfEoxIgMsp+88VHxP/b07c/3MOLLJ7au4619uzniArHMvnE/bvNOcsHk65D1rHaERKt4B/Ns2dh9sVxjQ4dx7AjaH+5S7PtwZ35wABNMKIlPKZsAlKdSFozXm6PHyYYLxiIjUMk3k6C+BjoUu5DxeUFxRfiveFnwmoCf1A6hr94WIT2nJF4JzHKM+EHa4nr4RIyeYPF/B4TVFWZndGXKXzY5Iyuw8ZV9FRjyrZ8+KOgk5W5scPHRgh0idvtrMBTp8hwH0IISWyezaghu+hv2Jdpy5/uECNbXvDoqpK5wG8uwL9WlEK/3BxlWuQLn02HK/ddIxGBD+7DxV0A14xjm1V4vJwHoCzSVY6469xZ8dagvsTrgvn+gof4EnFLs8n7L+Gk/Z/ATvkYl/Cafuv2zTV3OG5CCMaVylZ6rR6Lu1lKmoeVd8mS27mrBAN9r+vq8heQOisabb/tKd/3g2+VNWrfGmi/3SoPuxwGotmnoJAPB/hR61mn1xLa61rlBxYCuecsYrFSulcDPuY0hWRR/C3c6nGVBPC0HQANrvLReyplzMRNUk3IYwQNKePo1wuZh+9MCgeNI/SuYsI7PY3IQzqR5WFXTZhHwf6T7PjKdaO4HwvvUHfsZE8xgRfXT04EaN8qASkXANXI1030AEtDCkdZSkwlLTUxLP1cpbeeR7Htl14sqANqt3D1BJ45DxGY2wFn2tN7aC33cF51+4TxrwQRLIidF3X1umtMYVsslZ00nuZGhXfpUO7hqE1kdIuSqmuKr5HiGrRXKuFCAyigi1ubEAY1Dy0SyfAkwDny86m5kUjTXYXfg0lTtc7H7s9wtB7zrLinDO5a3tf1Q1EityAhrgsb6cb7tk7enoBXUXFTz/9NMYbPEPKwKGUGRm1QSm6ZyjxneGVlBq9AoRrBpapJQK9ihY3BU6C6fv+CuVcW+OTGYZXBoZRdgiDZQpnIMUEdhgRwNQ7R2hqYJqKkdcw9wGIMyPTJ9Br9Mo0BZ0rZtIaSOHMpGcOXHWsMPoQdw5RT6vmMyVnSpfE2eL6LkbQ/h1CDOsupvYMQ+XHitixxK2U3rZA0zUsjKR3aMfEoSlmGCOMp2N2SMF8usLyqSMbXcTd3V3EuCyXaY1Pd3ehyB2I7QBr89iaj2P82LToN6BkwlWbWEmJA65AyrDiFIkUo0uZoBSPSsQYI9E7DNMwDBP2RgJWWq/HNn5MiwM1alWw7/u1LxgvgfhcceXQVI/TQOm9AToHetniPmaZWnGAeruCA0MvIM24juMG9A7QuV5x2hhJm1pKRxxEMWM/UKZWA/V6qHcbPHbQ+YJ+2NgdMrwHYVA+DUGVsm0zqVIovSMxVZv0ylXxI/lrwMXZyBA3DL4oOBEb9jBpRoidp0IcgKldxoZOGijZVhyl+++4ZFTxlCksoSaMsYYwUUmr2nZM2ENTcWMlvUUQT+fLsDHGBubD6pDXZpcTVj6oGx5e0fWOaHieux0wdKUBW6CgYhNAScCVG1AbKiBFqDIYQQTw0msgIA6oEtB0Aw4mah6NLgxKl4gkM2NrGOKAhchnbEVKMgdUzhJNHa4RmuqhKWMmXAQVxgz0JoVrhBZWZhgRCAil5zCMCRVNd7kkIg43822ijq8lwKAGXAh/GTY+wMznF4yGMrVCAdyzkg6iJkQRPNWhuGKXjIE+ozCAVcDXXmvpqBDLDHvdFSpEvq58xDZZK13qB2eNaWnncaD0VrSCMjWYb0PDdNJrCQbUggM1NmWFmviKgfNoRFpoOhyoFvtChTjiaMQOZwJkOK9th+57LmpmMtGdFZ2n5scM1NiIgFMULL1MQi/BXT8tb4cR3uXlsgPi2/Q7UGIF1IJbAko08SSEEAQopav4WYiAWHoOpJgBO6hpwYG8X+csBEEI8bOImTKVFA5iBXr5jDPn0SSCJJoCXmGIBUACOgfKsKgQwHBXiROgJspwxWZgUKWPVBgs1OVigWEoTlRAU2nDRYhYC6WJPHappFcogHuYdDIViQ7RJGC4AnZoBZoYPhm8kYRAhzjSpqgQCcqv7aJUN5bWSaa4ONB6Z2yhgA4HKmlPt79CgKqgxqYCCqcwqYVYEejEYk8nTfk0tTejnde2g1A7kwpnGEbwVxg4bgOtieGTkMwzi7ezb7V4ul8W67t7Sk09T0KsoITd8Ia0ruuaCEAJIRElYsMOCCAIogAABBCsWFeRFCHUAjSlVAG9EKBerq7Afl3XtfTmIit1AGjqCsoUhAhecExpXZPtymRgPhVQQFc2kUBQvodB1eCcFWtSOFOJTUVb4iVtqFLaARCiHSsoU1fAxGIPk4YA4YwQub+CMnxFCSBp6FNEgAGuMgB0towwqFAYSa+aj6yLJXjGhbGaCqiggkoaQdKAmAQ0rKEmhVuCXShwbCg+jRTO2VQBDBM47EKLrUi7nAmQdk61g3bOe6rFYkYFR4ruLIAxNlCmJj4Zemvu6K2er+jX7m5J3iy7k+iS16CyKaVPksLZfkKUcJwMlDJjBwTYikQUWFP6SAQkMWCQiUhRuCVTQ1pLkED4WOVEvBCAgGQ0D1vvve837i6SaNK4CmCKAA0PdBgEEEYok7DAZwUUAABB+d4A4aIOScThDJ2bqXAJQgSYWoDhJMcXtFBmKCvoAoA2pSnDSHWhgjIMk4Y+hU21aCrEwghxFUClIcQwbvM8d/ZykSkttHMwnCCoGReQAQFq4hXQ8ARNJQKMjpcJhmHqkTaUQUBNBGC9BT5tLYlyrlntSMBwTyVNz2SSiu6s9qugxoYeDY2UT973xtaesPLhydzglwfZ74P9hDoFHABUhSRKIKQIUEqokESAqABSxIYhA00KN1vLVAGUV0B3HQ6MMwEaE3mMIrv/jiPKJQGYMitlyg6UYatwBMIJCSqYEJoiACkQa20tF2ktAeiFsJKuB2rK7Qtahk8owPQwDFlBCa+gDdMdWoumNc1J2npgUDeUNtWESGGiMSLJC0iqwlIhUnoJUEBAZtLSWkvgFlQFGBsIbCNqFrlCaqyw1hIilEklLWqx1kqG8zzSYcT+ivqZpDsrKxKQQqBHeIAjFSskk+d4gedSW5/uBuohIU09b6V9A0rma7DLUsqcuzJL+eaNzRGHBKTIGYMk4io2CaSkshogJW2onZRSug43SSPInyc5FZ0l0Tu+oAN6XcBBAr0V3QgOIirjLrmyLzlOFpgSFUCcHTA44LzDFoahywDEyTzAMN7IUGZoyvhewDAqjBHJ2pFcRRJxOFOJTSUCm3IrXc6iluiklPAkhMCCLlMGpkTfG9oUEJdzwM0CKdFPsEMWJg18jjJLw2MHARdTelVpiV6ZdaGSTlNFN4PDAHPIlyyzwlZSPgvPQO8IwmCG6AyAiJtKhO3ocMtgbBhhpIlJdpeLy7wMCba/9waGsQCfso5saeeMdsBeV1AzOVIzmWHSUmZOkMyxkTki9Emd9JNJfwN1ojW3qP4CpEzX3L+d1FIDXW5GJelN/kWIksjcBCJly5q1WQ0cCPZGCoqYkpU5VThZ6ZUta3ONJA6k4N2KhRRO6ZKJKV5YGwN8SuamlSAMzdzoLInewNwkOowbOI9GCLDJRBxzYxzQO++1GStg0qwNI2nWZpMgMcPccDgQAW6CXpgbToVYqBA5exNW9KTQc7iB4nK6hrVRVPtZm1XAxyVzM8NRjn6nzWylzGSzUQ8d5maRWeZUh6Sd17bD9L0BM0LPpHSBtaEe9PIa5gZKMX2fMvtMgJ3n+enJDu3Dcpm2SoJrva02s8xZ5jvIXf5F6FPAMQ7F9Tg6ouRiSmEcNg0OiNOl0MfrrhBECmHdKL1bFkETcBqGbduGUpFzfswty9SQQSU+4qBC0HrG7uKIKY4MU70BpvKAK623zY81zoeCGoYR6IOPK/aJDqNf12maBo9TJx0Rh54yVYq5sJJuNWdD+dw83pB3SNqAeCwjjLUCSDGe7lBB7nJm+JzWtceKJGVQnhmiBJ3VjKTLylscNNnt/OjCBJLOwOdG6/WoQDsqGEmvAoYxsUzNcGwYYUyFhSfzABKzQG/qcaL1LvkxuzoeKec7tMOwDqkz2s8KY4LtkMwODdAnwWUmz8r36+q3p2VZ5Lyuaz+I++XtXPqqJknhHmG5iyrUG9zilXNESVoZUnoDpDizIqWE5Ev05hsY4sriCJGvDCWTuQC9nUfa1AIdWL7hkqyVLuLifp9IESsWytRgobrFM8IIMAwzFdrCatxjXRhlljCMERk+izcX55zxrDDSBVhQRMpWQ8sw5TWddKlPui20OirESxoY4a8CmoqeYWEQFWnAdYcQBatDQ8VsUrIy+tm1REpwO/jkVBg9w9RsqaSZYwOdp6kUytQaKz42idX+0magV24sU9o552pPsfZIO69thx2QISXWJl3KnN1jzdgg7TMNg3TugX1taTg3b+HDIHFunoiYDN8h3u1wJkAbOVXROlDZcIaUvIMUQevljLIXgAldCKFHZbiBei8yssTRctvSz/M8thPqyyFMRbmDOON2CCM56DO24NBnF3SYEJAjy1RmJq3ZuMQZJQ+UNCVFsMKgTEmgVxH/miAm5IYVIqXXcFZ1V5R1GIZr+hIuiencpV3aH+uTdonvMDasMITQBCG0DmtRcVe9co8zAVrOqLxL0nKPMCzfQYoQjnDoen5i1VtG7STlUOLeJoBIVsqpmLu99EquW/hc5Ft5Oazzw4RhObRvs72mmLd76bU1ZwKsSboRYST4ynxNMk0vsHd76ZVwAaH3vlfy8sRufyPCSJAksx28uNtH71tZw+V47d9DL1DwcOrLsRdJkWSq2Hf5sebhhnZZVJSugcuPnWb4vwbNw34KmTTRv9ScR0Oz7zJoHqPuQtCikf7p02FamQa/Xx9ecSrLsU+9aFbIYb54DX7GN/CrghQr5P6Ev9xSx/6nsRDJAvdN9O/YiPvT/3LLrYtJhPz65EBnAuScp1uEu9cc6TCMV5CapmmNT40l3Rqkg8DbUnwBpRpKPC/gsAtZHoAZscDijYQb4N/JU4fh3x4AdQX6CVRoJkZQfTgTUNSPTN3vTxjLFSqEoLW9NJCgVAf9TyfNvWT4D+sBLg5rr1OysqEvvhh9WM8C8ugLVVji3mcC5EPpLLiKayAty/9pb/INLP+HuIrCaxp7ijXH9O/NOcCApb8C1ijv975KuEYl29BTrLkZy0rVbE+akdmHvPdYxqh5c9/Kzux5OA+4hkdjREpWXh72vxm4YXYNZYgs/6fNAPtgbb487I8RQiTpGspG+5eXh7OAGb5Xkdm5feGhBacEUqKpCNr/qXNNFAI+N+8ND/NAatYNZWYcHT8jWME87A3j+7lraigM/ycP9Vu39oeHCbEUX7DEy0Mz+Tb8pWxnFzNOHbWA8ExgxCFwHk1XZvdhArCAMFnpYlncw5nAaERK0vTbucyBXgPGtvTgRDUD6kZfnN1tcDE8CLs/qsdp27a5x+7SUCj/5wLXgHkzIuX9XwOOHhERyyibycQp/ye/GTSP0YgD9EFzNRW4xls29WY8GuD/6TzAUysEhvYQx2tbsuHSuWYer6X9j/LUj9dC+9PQ7n28lpvYqS4Ek10z8Uz/ZwCzpwuLWfZGpGStdO6xmZ9++QL9n/ynXz2jD2hfsS/RJCmzc66RtMx5OBPWEnRd0PCLWHFfqLlM1uZGriWAn5zzyE99LQHDvz7AWgKgjzpDwEOj++DNubAyy6RkpZ3237TDcM22bfO8mUYu8aAeetme+soshv+DLCC8gqopNBHN+LLPWbHOdU0yHXgB4VmwHJu3HosHpVyjl2OfX4SxXAFWtQV7JnxrQCvfd5Hsysvzec0hFxCeB3DTlha4v5zD8GiMONDFOoZZwS409WIjbteLtY68VcIS/81+j3AubKhps+mKQ2CiSdY2+RutwP9w4jD8i/039ADL7bHhfTgPyDcM0wRPalRK3HsntOM4NnYBoboG+t8Gf9Lc526DbdiGcjiyayTdwPDvzTnANcj6VRn7PlvwbkJYU2oiIzKqTyf9sULL9C/3fbpQ9G/jWczlodF9WNM5wIATPGlUCNEdYMEcUNjYBYRXKIb/E19LsNJ9MO5+7z7QdUMTmZnzcDaszDrYSiRwLnMrXcS2oQsIhUi37MqsMJce/sZ409yVWVYS/09nxDpXMGzuAAsI52YvIDTU0N8CmEOtL+XgCcNKcLPGrnO1b36R82s5dhg90mcCfD4HlmNrbsLUCupmTV6OfX6hYyB/Ky7dmQB1YFDmcxt3AOhXaQ0mpVtk5xc5xCZyzXmM6VzeYY3l3txwhSe1hvwaxB6kD5w6Q4wfZVOhn42ezgOuAIccleri3le5waPvq0JvmklP+z/9Oxpp/5d970j1uE5V+aZ+B2ttGf7PA1i/HFvsOw4zztwYkRSqBo7DZWT5L+L+lGH7lwf4f0wRVjb1/zHFMf37dH8GoOZ5hr8NzZe47E1rRLKSYyO/eN0x/Pcn/q0B6L9t29Ef4ryqQ+A8iuDn5vahJX04Cz6klZrzeKiVWfGGHp4FzZfY5JVZ8uRXZjH8p2l/woDe+74vPl4eGtyHs2FlFiQdZgGhmnypqqFX0Rqs60y3Ah8fCs31uPZVbdw1dZ3rt8+05dg6Rh2C5vZsWI6tozHRGCFdYzHnGhw8zcqc3eVMgF7nms9m/pHmZ/+lz1e64oX6QbU/0Yh/VsnKX/333+rL1UB+QFX86Lp5qfqKYX/+vCL8rOZf/Wsmr3zkD8Sfj7/OD66Zn/T/Z/LPQv5kvCsH4K9HNOKf+f/e50VWfDWax5+v8a+rH9RU/DNFeKn2ZP4j/rc1P6oxIv27f/LzKruvqFudVz571PL5+OO/Lr//g2FE+meh/518Vrzhe0gkTPGlGJHCv4vPk/+bfFme91B4HP9k6McflJdC/Mvfu47PyE/K19jLlRv/Oj/IS3kZIgUwlr8rR/H/6sc+9TW9/PP89frBellG9P+uZP/ZeqHs0171fv2/SuFL9ZMq/fHnS/4q25frq2oPfcfqw38T8lxE0pXhWrz4muwjkX6YdsnKX5Vfjf/GV5s95uEW/Nd7yQtOrOTu/Lesn+HE/Le7//m+1onZL5ed+bKcWhu+X249vrZznfw3TsvmX4fvzsv983NyWv6/wro7V3V3Wv4/xz9jZzp1am34yH8+8p+P/OfrD3z+Ahn1edPh+OrBGUqjZuKINMv87cBPcs2ryeuBXU52N35gOHTHX3l/L/OrmZxnf6sgNnUbIDbVzJ36Fu/vbX39IGeE9ZK9Ot5sGjUTR6RZ5s9VPgdu77Ms8t/xDv592z2y/nCBfRfEdzCvZouclcH1m8sHgw1x++u8g6n4YPAetCREVK8Z/ghnTwlQp0rDZuJoNM18szHUj9yK6R2qmXn/6B0YP4MpCer1hKKfvGV6H9Bnj9h9E/TDbegFlTU1ErQuFqzRoMfm8DRlJo5NY8yfAq+8VtLYaZ29nNEQPcj98qu8A0ERCfIHwM+bXkc7NU/EjD6vivFS2UCokWDoYsAaDXpsDk/DZuJoNMf8aVz8ATm8CxIqh1XXgdg/QkNLkLN6HfGttaYnCgPosyIovxikspYzGrYuBqzRANqOcnFjZuLIFzfH/AlAPRsBZk9sW6iGgEhpeu3xrRU0gfRfzquCQihWVaOLhjUaQNtRaM5MHJemmW/4Dt5g3Pus+7G+mrzWduiUSRn/HShIzgxmX6OLBSJzbI5Cc2biuDsNMt90aLffoqj9WWJq7uj1cxWWguOyqqPRnJk4Lg0yfwooTw5tQGpemcvZi0rJv+MdFJim1w2Tn1/NGAKYLyZ2Yscd5mgcjWbNxPFomPmm79Q+Ge1ynIMYN6+fO1oUbr/Kskjj8fMm9lszFqTjoD07XoU1GsejYTNxtJ2mmW804CDxu1gFf8zSQrYEnqT4e1R03yQhkYfx6+tDWmaf2RhwR7Nn62LAkno8mjYTx7pK48yf2gJCMA/m9beAUNoNEcf3WRaqzz581WZhAjr+anrNs2frYsAajeNx3JlozgLCxpk/Jb61bt8kD1T/nfN3netxZ6I5NM78SW0UglLL+ctxZ6I5myObP3Gk8YjvYpczmKPORIM4qvmvm34H6yP/+ch/PvKf84pfPV0Q8b3HYRcl+wnYWcrywXB9Mc6v3g5KE/zvYpth4KA00z+jD4ekCfYZ6e+i6TWAwF997ZZXlhd339hFyX4CdpRS3dML82FphP8dbLMMHJKG+qf6cFCaYJ9ldhdNtz6vPK5vN9DcF8YPPoZdlOwlYCdxpBF4YJrhv94208ABaap/0IfD0gj7tNndVN72/P8Xo5fPPbzdy/P5D/+gerS3TCV7CVh2lWIOTDP819tmyj0gzfRPaT8sjbBPm91N5e3Pd5eFNIA83N+7nq4/j6++MZXsJWAXcSD+Q9MM/zvYZig5JA31D+rANMI+y+wOmm59xAsg31jEH/7q1/3FOP4BW8leAnYSdwwa5p+CaeCANMz/MWmEfZrdVL4+WDR+Yzkt9vN/Wuzn/6TYz/7rH/ZPSZDkSe3s6f+kdvb0f0o7e9p//e/QL+2/W70prd4Qs5XsJWAnccegYf4pmAYOeJWG+T8mjbBPs5vK18cdmbev3st32mPe0TFomH/Ase6oYf6PSSPsQ3a9o9fGxwpvv/PdRbwwf8pSspeA3cQdg6b5X5bFHOtjhYb5PyZNsE+Z3VHla+NDWnC0pXrIH+hDyZ0+BDwKTfC/g+0jfUjbLP9HpQn2GenvounrpktePvKfj/znI/85QV75XMdL3EmV2oOfzDqeln+7D/a0/I+7k06vDbdemfnE6n32eCIZT8z/n2d3/z9Y84nVB9webfhIsFoAAA==) For example, 1111-0XX listed in the I2C specification cannot be used by any target device. 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 up to 1 MHz. ### I2C data packet format The controller sends a 7‑bit or 10‑bit address. 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: it receives the data and is ready to accept the next byte. - ACK bit HIGH: it receives the data and cannot accept further data. The controller then terminates the transmission with the STOP sequence. Figure : I2C data packet Page-1 Rectangle Start Start Rectangle.2 7 or 10 bits 7 or 10 bits Rectangle.3 8 bits 8 bits Left Brace Left Brace.9 Sheet.8 Message Message Rectangle.10 Stop Stop Rectangle.11 Read/write bit Read/write bit Rectangle.12 ACK/NACK bit ACK/NACK bit Rectangle.13 ACK/NACK bit ACK/NACK bit Rectangle.14 8 bits 8 bits Rectangle.15 ACK/NACK bit ACK/NACK bit Left Brace.16 Left Brace.17 Sheet.18 Address frame Address frame Sheet.19 Data frame 1 Data frame 1 Sheet.20 Data frame 2 Data frame 2 ### 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-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html) This section provides information about the I2C serial engine transfer modes and various use cases supporting the different transfer modes. This section also describes the FIFO and DMA features enabled in the various I2C subsystem drivers. ### Linux I2C supports standard protocol-defined speeds. ### Boot - Supports FIFO mode. - Supports 100 kHz, 400 kHz, and 1000 kHz bus speeds. - Supports 7‑bit target address as per the I2C specification. ### aDSP/TrustZone/SDC - Supports 100 kHz, 400 kHz, and 1000 kHz bus speeds. - Supports 7‑bit target address as per the I2C specification. ## I2C interface Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html) This section provides information about the subsystem driver, kernel device tree nodes, and related documentation. ### Linux | File type | Description | | --- | --- | | Device tree source | For device tree properties of chipset configurations of QUP v3
serial engine interface device nodes, and I2C device nodes,
see [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). | | `Pinctrl` settings | For device tree properties of GPIO settings for QUP v3 serial
engine interface for I2C device nodes, see [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). | | TrustZone settings | For TrustZone access control settings to load the QUP v3 serial
engine I2C firmware for different subsystems, see /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/<chipset>/QUPAC\_Access.c. | ### Boot | File type | Description | | --- | --- | | QUP v3 serial engine configuration | To configure the QUP v3 serial engine in the boot subsystem for
I2C, and GPIO for the I2C software use case, see the following
filepaths: | | TrustZone settings | For TrustZone access control settings in QUP v3 serial engine
firmware to load the I2C protocol for different subsystems, see /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/<chipset>/QUPAC\_Access.c | ### aDSP/SLPI/SDC | File type | Description | | --- | --- | | QUP v3 serial engine configuration | For QUP v3 serial engine configuration settings in the aDSP
subsystem to enable an I2C interface, see the following file
paths. | | Firmware configuration settings | For QUP v3 serial engine firmware settings to configure I2C in
aDSP software, see the following files. | ### TrustZone | File type | Description | | --- | --- | | QUP v3 serial engine configuration | | | TrustZone settings | /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/<chipset>/QUPAC\_Access.c | ### I2C APIs Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html) I2C APIs for the following subsystems are listed in this section. ### Linux For information on Linux APIs, see the following URLs. - [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 - Client code calls the API to initialize the respective I2C instance. 1. On success, `i2c_handle` points to the handle of the I2C instance. 2. The API allocates resources for use by the client handle and the I2C instance. 3. Enables the clocks, GPIOs, and any other power resources used by the I2C instance. 4. These resources are released in the `i2c_close()` call. i2c_status i2c_open ( i2c_instance instance, void **i2c_handle );Copy to clipboard - Performs an I2C transfer synchronously or asynchronously. A callback function is passed as a parameter to this function. If the callback parameter is NULL, the function executes synchronously. When the function returns, the transfer is complete. i2c_status i2c_transfer ( void *i2c_handle, i2c_slave_config *config, i2c_descriptor *desc, uint16 num_descriptors, callback_func func, void *ctxt, uint32 delay_us, uint32 *transferred );Copy to clipboard - `i2c_read` performs an I2C read. Optionally reads from an offset. i2c_status i2c_read( void *i2c_handle, i2c_slave_config *config, uint16 offset, uint16 offset_len, uint8 *buffer, uint16 buffer_len, uint32 *read, uint32 timeout_ms );Copy to clipboard - `i2c_write` performs an I2C write. Optionally writes to an offset. i2c_status i2c_write( void *i2c_handle, i2c_slave_config *config, uint16 offset, uint16 offset_len, uint8 *buffer, uint16 buffer_len, uint32 *written, uint32 timeout_ms );Copy to clipboard - De-initializes the I2C instance, and releases any resources allocated by the `i2c_open()` API. i2c_status i2c_close ( void *i2c_handle );Copy to clipboard ### aDSP/SDC/SLPI - Called by the client code to initialize the I2C instance. This API sets the resources required for the specific bus speed required by the use case in low power mode. i2c_status i2c_setup_lpi_resource ( i2c_instance instance, uint32 frequency_khz );Copy to clipboard - On success, `i2c_handle` points to the handle of the I2C instance. This API allocates resources for the client handle and the I2C instance. These resources are released in the `i2c_close()` call. i2c_status i2c_open ( i2c_instance instance, void **i2c_handle );Copy to clipboard - Enables the clocks, GPIOs, and any other power resources used by the I2C instance. i2c_status i2c_power_on ( void *i2c_handle ); Copy to clipboard - Performs an I2C transfer synchronously or asynchronously. A callback function is passed as a parameter to this function. If the callback parameter is NULL, the function executes synchronously. When the function returns, the transfer is complete. i2c_status i2c_transfer ( void *i2c_handle, i2c_slave_config *config, i2c_descriptor *desc, uint16 num_descriptors, callback_func func, void *ctxt, uint32 delay_us, uint32 *transferred );Copy to clipboard - Disables the clocks, GPIOs, and any other power resources used by the I2C instance. i2c_status i2c_power_off ( void *i2c_handle );Copy to clipboard - De-initializes the I2C instance and releases any resources allocated by the `i2c_open_ex()` or `i2c_open()` API. i2c_status i2c_close ( void *i2c_handle );Copy to clipboard - Client code calls the API to initialize the respective I2C instance. This API sets the resources required for the specific bus speed required by the use case in low power mode. i2c_status i2c_reset_lpi_resource(i2c_instance instance)Copy to clipboard ### TrustZone - The wrapper function to transfer access of the I2C QUP v3 to TrustZone, performs several operations. When all operations are successful, success is returned. int tzbsp_i2c_open(tzbsp_i2cpd_device_id_t device_id);Copy to clipboard - The wrapper function to read data from a target device. It requires a successful call to `tzbsp_i2c_open()` as a prerequisite. int tzbsp_i2c_read(tzbsp_i2cpd_device_id_t device_id, const tzbsp_i2c_config_t* p_config, tzbsp_i2c_transaction_info_t* p_read_info);Copy to clipboard - The wrapper function to write data to a target device. This function requires a successful call to `tzbsp_i2c_open()` as a prerequisite. int tzbsp_i2c_write(tzbsp_i2cpd_device_id_t device_id, const tzbsp_i2c_config_t* p_config, tzbsp_i2c_transaction_info_t* p_write_info); Copy to clipboard - The wrapper function to transfer access of the I2C QUP v3 back to the high-level operating system (HLOS). It requires a successful call to `tzbsp_i2c_open()` as a prerequisite. int tzbsp_i2c_close(tzbsp_i2cpd_device_id_t device_id); Copy to clipboard ## I2C software Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-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 [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). 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 = ; #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 [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), and Documentation/devicetree/bindings/pinctrl/qcom,<Chipset>-tlmm.yaml. 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. TrustZone build: /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/<chipset>/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 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/<chipset>/Core/Buses/qup\_common/<chipset>-qupv3.dtsi - TrustZone settings: /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/<chipset>/QUPAC\_Access.c Note: For configuration settings in boot, see [Boot](https://docs.qualcomm.com/doc/80-70014-8/topic/spi.html#spi_software__section_ibv_tfb_r1c). 2. Enable the I2C protocol in UEFI at /QcomPkg/SocPkg/<chipset>/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->i2c\_read/i2c\_write->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/<chipset>/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/<chipset>/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 per protocol in the chipset-specific configurations. The GPIO configuration is picked up by the QUP v3 common driver as per 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/<chipset>/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 ### TrustZone The QUP v3 serial engine for I2C can be configured as follows. File path: settings/buses/i2c/qupv3/config/<chipset>/tz/i2c\_devcfg\_user.h. #define ENABLE_I2C_08Copy to clipboard The `ENABLE_I2C_` 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/<chipset>/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 TrustZone 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/<chipset>/QUPAC\_Access.c. ## I2C configuration Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-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: <workspace\_path\_of\_LINUX\_kernel\_image>\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/<chipset>.dtsi file. diff --git a/arch/arm64/boot/dts/qcom/.dtsi b/arch/arm64/boot/dts/qcom/.dtsi index 8575f0b..cced7c0 100644 --- a/arch/arm64/boot/dts/qcom/.dtsi +++ b/arch/arm64/boot/dts/qcom/.dtsi @@ -6865,3 +6865,7 @@ ; }; }; + + &i2c1 { + status = "ok"; +}; Copy to clipboard Note: The kernel configuration and device tree changes must be compiled. The compiled images are loaded to the target to verify the interface. For information on interface verification, see [I2C verification](https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html#i2c-verification). ## I2C verification Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-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. command: tar -xzvf Copy to clipboard 3. Change the current directory to the `i2c-tool` path. cd 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 `/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. Enter the SSH shell. For more information on how to operate SSH, see [https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254/how_to.html#how-to-ssh-](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254/how_to.html#how-to-ssh-). 2. Mount the file system. mount -o remount,rw /Copy to clipboard 3. Transfer files using SCP or similar tools. For more information on how to operate SSH, see [https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254/how_to.html#how-to-ssh-](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254/how_to.html#how-to-ssh-). For example, `scp i2cdump 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 `. /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 The following output is displayed. 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 The following output is displayed. 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-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-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 <workspace\_path\_of\_LINUX\_kernel\_image>\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/<chipset>/QUPAC\_Access.xml 3. Obtain the TrustZone 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. After mapping, verify the protocol and mode configurations in the `QUPAC_Access.c` file to ensure they are set up correctly. ## I2C examples Source: [https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html](https://docs.qualcomm.com/doc/80-70014-8/topic/i2c.html) For information on the upstream device tree reference, see [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). For information on the Qualcomm Linux chip product device-tree node, see [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). Last Published: Jul 13, 2024 [Previous Topic SPI](https://docs.qualcomm.com/bundle/publicresource/80-70014-8/topics/spi.md) [Next Topic I3C](https://docs.qualcomm.com/bundle/publicresource/80-70014-8/topics/i3c.md)