====== I2C ======
This page introduces how you can I2C interface using Expansion Board.
The Expansion Board have two I2C devices.\\
{{:en:xu3:xu3_i2c_with_expansion.png?700|}}
You can use the devices via H/W I2C(I2C-A) or S/W I2C(I2C-B : GPIO-I2C).
**H/W I2C (I2C-A)**
^ Kernel 3.10.y\\ (node name) ^ Kernel 4.9.y\\ (node name) ^ Pin Number\\ (XU3/XU4 - CON10) ^ Net Name ^ Export Number ^ Description ^
| /dev/i2c-4 | /dev/i2c-1 | 16 | GPB3[2](I2C_1.SDA) | 209 | SDA |
| ::: | ::: | 14 | GPB3[3](I2C_1.SCL) | 210 | SCL |
**S/W I2C (I2C-B)**
^ Kernel 3.10.y\\ (node name) ^ Kernel 4.9.y\\ (node name) ^ Pin Number\\ (XU3/XU4-CON10) ^ Net Name ^ Export Number ^ Description ^
| /dev/i2c-10 || 27 | GPX3[1](XEINT_25) | 33 | SDA |
| ::: | ::: | 25 | GPX1[7](XEINT_15) | 23 | SCL |
====== How to check Expansion board with i2c-tools.======
**Install i2c-tools package.**
odroid@odroid:~$ sudo apt-get install i2c-tools
**I2C Device check command**
* Usage : i2cdetect -y -r [i2c node name]
===== Using the HW I2C(I2C-A) with Expansion Board =====
**I2C Device check**
odroid@odroid:~$ sudo i2cdetect -y 4
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
odroid@odroid:~$
* The 0x29 is BH1780 slave address.\\
* The 0x77 is BMP180 slave address.
**Get BMP180 ID using i2cget.**
odroid@odroid:~$ sudo i2cget 4 0x77 0xD0
==== H/W I2C Signals ====
{{:en:weather_board:hwi2c.png?500|}}
===== Using the S/W I2C(I2C-B) with Expansion Board =====
**Upload the module**\\
GPIO-I2C driver probe [ i2c-gpio-custom driver option : id,sda,scl[,udelay,timeout,sda_open,scl_open,scl_outonly]
odroid@odroid:~$ sudo modprobe i2c-gpio-custom bus0=10,33,23,10,10
**I2C Device check**
odroid@odroid:~$ sudo i2cdetect -y -r 10
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
odroid@odroid:~$
* The 0x29 is BH1780 slave address.\\
* The 0x77 is BMP180 slave address.
**Get BMP180 ID using i2cget.**
odroid@odroid:~$ sudo i2cget 10 0x77 0xD0
===== How to change the I2C clock speed =====
To change the I2C clock speed, you need to modify the DT(Device Tree) file.\\
Install required packages.
sudo apt-get install device-tree-compiler i2c-tools
Make a backup of DTB file.
* kernel 4.9.y
cp /media/boot/exynos5422-odroidxu4.dtb /media/boot/exynos5422-odroidxu4.dtb.org
* kernel 3.10.y
cp /media/boot/exynos5422-odroidxu3.dtb /media/boot/exynos5422-odroidxu3.dtb.org
Using dtc command, you can make "dts" type of device tree from "dtb" type.
* kernel 4.9.y
dtc -I dtb -O dts -o exynos5422-odroidxu4.dts exynos5422-odroidxu4.dtb
* kernel 3.10.y
dtc -I dtb -O dts -o exynos5422-odroidxu3.dts exynos5422-odroidxu3.dtb
And, open by an editor you like it and check the i2c path.
vi exynos5422-odroidxu4.dts
--------------------------------------
..
/ {
..
soc {
..
i2c@12C70000 {
..
--------------------------------------
Check current maximum bus frequency of i2c@12C70000
* kernel 4.9.y
fdtget /media/boot/exynos5422-odroidxu4.dtb /soc/i2c@12C70000 samsung,i2c-max-bus-freq
* kernel 3.10.y
fdtget /media/boot/exynos5422-odroidxu3.dtb /i2c@12C70000 samsung,i2c-max-bus-freq
Change the DTB file for i2c-1 (i2c channel #1)
* kernel 4.9.y
fdtput -t i /media/boot/exynos5422-odroidxu4.dtb /soc/i2c@12C70000 samsung,i2c-max-bus-freq "10000"
sync
reboot
* kernel 3.10.y
fdtput -t i /media/boot/exynos5422-odroidxu3.dtb /i2c@12C70000 samsung,i2c-max-bus-freq "10000"
sync
reboot
If you want to go back to original 400Khz mode, change "10000" to "400000".\\
**Actual I2C clock speed** (Measured with an oscilloscope)\\
In 400Khz mode : 344.8khz \\
In 100Khz mode : 63.7khz \\
In 10Khz mode : 9.3Khz \\
**Default I2C clock speed** \\
XU4 : 400Khz mode \\