https://blog.csdn.net/Z_HUALIN/article/details/78084313
https://kernel.googlesource.com/pub/scm/utils/i2c-tools/i2c-tools/+/refs/tags/v3.1.2
將編譯得到i2cdetect i2cget i2cset i2cdump四個工具。
1.我們現在要查看tas5729這個i2c外設,通過查詢原理圖,得知tas5729掛在在TWI1上;
uranus-nansu:/ # i2cdetect -y -r 1
i2cdetect -y -r 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
得到設備的地址是:0x2B(0x20+0x0b),UU意味着這個設備被kernel driver占用,通常不能從user space探查;
2.查看某個寄存器值(0x20);
Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
I2CBUS is an integer or an I2C bus name
ADDRESS is an integer (0x03 - 0x77)
MODE is one of:
b (byte, default)
w (word)
W (word on even register addresses)
s (SMBus block)
i (I2C block)
c (consecutive byte)
Append p for SMBus PEC
i2cget -f -y 1 0x2b 0x20 w4
3.將某個值寫入某個寄存器:
Usage: i2cset [-f] [-y] [-m MASK] [-r] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
i2cset -f -y -r 1 0x2b 0x04 0x03
4.dump部分寄存器值;
Usage: i2cdump [-f] [-y] [-r first-last] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
i2cdump -f -y -r 0x00-0x25 1 0x2b w
5.i2ctransfer。
1).上述幾個工具即使選擇‘w’模式,每個寄存器返回的數值最大時16bit(2bytes),對於32bit生長更高位數寄存器讀取不到所有bit數據;
2).大多數設備在讀取之前都需要對寄存器進行寫訪問。i2ctransfer提供了一種組合寫入和讀取過程的方法。它還可以在單個命令中處理帶有附加后綴的多個字節寫入/讀取。
a.要讀取一組字節:i2ctransfer -f -y <i2cbus number> r<number of bytes>@<peripheral address>
b.要寫一組字節:i2ctransfer -f -y <i2cbus number> w<number of bytes>@<peripheral address> <byte value 1> <byte value 2> ... <byte value n>
c.要寫入一組字節,然后讀取一組字節:i2ctransfer -f -y <i2cbus number> w<number of bytes to write>@<peripheral address> <byte value 1> <byte value 2> ... <byte value n> r<number of bytes to read>
i2ctransfer -f -y 1 w1@0x2b 0x25 r4 #從I2S1總線上的0x2b外設,讀取寄存器0x25中4字節數據;
i2ctransfer -f -y 1 w5@0x2b 0x04 0x00 0x00 0x00 0x03
i2ctransfer -f -y 1 w3@0x2b 0x07 0xc0 0x00
i2ctransfer -f -y 1 w1@0x2b 0x4f r4