DUICUO

i2c-toolsの使い方のステップバイステップガイド

i2c-toolsの紹介

組み込み開発では、ハードウェアが正しく接続されているかどうか、デバイスが正しく動作しているかどうか、デバイスのアドレスは何であるかなどを確認する必要がある場合があります。ここでは、I2C バスをテストするためのツール、i2c-tools を使用する必要があります。

i2c-toolsは、I2Cのデバッグ用に特別に設計されたオープンソースツールです。マウントされたデバイスとそのアドレスを取得できるほか、I2Cデバイスレジスタの読み書きも可能です。

新しいデバイスドライバーをデバッグする際には、レジスタを繰り返し変更し、その結果を観察することが避けられません。従来のアプローチでは、ドライバーコードのレジスタ値を変更→コンパイル→ダウンロード→実行→結果の観察という手順を踏んでいました。このプロセスは時間がかかり、1回あたり1ビットしか変更できない場合もあります。このような場合、i2c-toolsがまさに救世主です。

i2c-tools 公式ドキュメント:

 https://i2c.wiki.kernel.org/index.php/I2C_Tools

i2c-tools ダウンロード ウェブサイト:

 https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/

ダウンロード後、Ubuntuでファイルを解凍してください。開発ボードで使用する場合は、ボードに対応するgccツールチェーンを使用してコンパイルしてください。Ubuntuで使用する場合は、Ubuntuのデフォルトのgccツールチェーンを使用してコンパイルしてください。

コンパイルにより、i2cdetect、i2cset、i2cget、i2cdump、i2ctransfer の5つのツールが生成されます。これらは開発ボードにコピーして使用できます。あるいは、i2c-tools ソースコードパッケージをご自身のソースコードに直接追加し、ファームウェアに直接コンパイルすることもできます。

 i2cdetect: I2C バス上のデバイスをスキャンし、そのアドレスを表示するために使用されます。
i2cset: I2C デバイスのレジスタの値を設定します。
i2cget: I2C デバイス上のレジスタの値を読み取ります。
i2cdump: 特定の I2C デバイスのすべてのレジスタの値を読み取ります。
i2ctransfer: 複数バイトの同時読み取りと書き込み

このツールはもともと Linux で使用するために設計されましたが、Android システムのカーネルも Linux であるため、Android に簡単に移植できます。

Android-i2ctoolsをダウンロード:

 https://github.com/skyxiaoyan1/android-i2ctool

これは、上級開発者がi2c-tools 4.1をベースに移植したものです。Androidでのコンパイルについては、以前Androidシステムのコンパイル手法について記事を書きました。一般的なプロセスは次のとおりです。

ソース コード パッケージは、/ external / i2c - tools / ... にあります。
Androidソースコードのルートディレクトリを入力します
ソースビルド/ envsetup.sh
lunch rk3399_mid - userdebug (自分のプロジェクト名)
`/ external / i2c - tools /`ディレクトリで `mm` と入力してモジュールをコンパイルします。Android ルートディレクトリで `make snod` と入力して `system.img` を再パッケージ化します
バーンシステム.img

使用例

i2cdetect: I2C バス上のデバイスをスキャンするために使用されます。

使用法: i2cdetect [ - y ] [ - a ] [ - q |- r ] I2CBUS [名 姓]
i2cdetect - F I2CBUS
i2c検出- l
I2CBUSは整数またはI2Cバス名です
指定されている場合 FIRST LAST はプローブ範囲を制限します

y :対話モードを無効にします。警告メッセージは表示されません。
a :バス上のすべてのデバイスをスキャンする
q :検出には SMBus の「クイック書き込み」コマンドを使用しますが、これはお勧めしません。
r :検出には SMBus の「受信バイト」コマンドを使用しますが、これは推奨されません。
i2cbus :照会するバス番号を指定します
first, last: スキャンするアドレス範囲

./i2cdetect -r -y 0 を実行します。

-- はアドレスが検出されたがチップが応答しなかったことを示します。一方、UU はアドレスが現在のカーネル ドライバーによって使用されていることを示します。

上の図に示すように、I2C0 バスにはデバイス アドレスが 0x1b、0x40、0x41 の 3 つのデバイスがあります。

`./i2cdetect -F i2cbus` は i2cbus バスの機能を照会します。

./i2cdetect -V ソフトウェアのバージョン番号を出力します。

コマンド `./i2cdetect -l` は、システム内で現在実行されている I2C バスの数を検出します。

i2cset: I2C デバイスのレジスタに値を書き込みます。

使用法: i2cset [ - f ] [ - y ] [ - m MASK ] [ - r ] [ - a ] I2CBUS CHIP - ADDRESS DATA - ADDRESS [ VALUE ] ... [ MODE ]
I2CBUSは整数またはI2Cバス名です
ADDRESSは整数 0x03 - 0x77 または-aが指定されている場合は0x00 - 0x7f です
MODE は次のいずれかです:
c (バイト値なし)
b (バイトデータデフォルト)
w (単語データ)
i ( I2C ブロックデータ)
s ( SMBus ブロックデータ)
SMBus PECの場合はpを追加

f :強制アクセス
y :コマンドを実行すると自動的に「yes」が返されます。それ以外の場合は確認プロンプトが表示されます。続行しますか [ Y / n ] yパラメータを指定しないと、正しいコマンドを判断するのに役立つ実行プロンプトが多数表示されます。
r :書き込み直後にレジスタの値を読み取り、書き込んだ値と結果を比較します。
i2cbus: バス番号
チップ-アドレス: I2Cデバイスアドレス
データ-アドレス: I2Cレジスタアドレス
value は書き込まれる値です。
mode: 読み取るサイズを指定します。'b' バイト、'w' ワード、SMBus ブロックの場合は 's'、I2C ブロックの場合は 'i' です。

I2C - 1のデバイス 0x20 のレジスタ 0x77 の値を 0x3f に設定します。
./i2cset-f-y 1 0x20 0x77 0x3f

i2cget: I2C デバイス上のレジスタの値を読み取ります。

使用法: i2cget [ - f ] [ - y ] [ - a ] I2CBUS チップ-アドレス[データ-アドレス[モード] ]
I2CBUSは整数またはI2Cバス名です
ADDRESSは整数 0x03 - 0x77 または-aが指定されている場合は0x00 - 0x7f です
MODE は次のいずれかです:
b (バイトデータの読み取りデフォルト)
w (ワードデータを読み取る)
c (バイト書き込み/バイト読み取り)
SMBus PECの場合はpを追加

f :強制アクセス
y :対話型モードを無効にします。警告メッセージは表示されません。
i2cbus :バス番号
チップ-アドレス: I2Cデバイスアドレス
データ-アドレス: I2Cレジスタアドレス
mode :読み取るサイズを指定します。'b' バイト、'w' ワード、SMBus ブロックの場合は 's'、I2C ブロックの場合は 'i' です。

I2C - 1のデバイス 0x20 のレジスタ 0x77 の値を読み取る
./i2cget-f-y 1 0x20 0x77

i2cdump: 特定の I2C デバイスのすべてのレジスタの値を読み取ります。

使用法: i2cdump [ - f ] [ - y ] [ - r first - last ] [ - a ] I2CBUS ADDRESS [ MODE [ BANK [ BANKREG ] ] ]
I2CBUSは整数またはI2Cバス名です
ADDRESSは整数 0x03 - 0x77 または-aが指定されている場合は0x00 - 0x7f です
MODE は次のいずれかです:
b (バイトデフォルト)
w (単語)
W (偶数レジスタアドレスワード)
s ( SMBus ブロック)
i ( I2C ブロック)
c (連続バイト)
SMBus PECの場合はpを追加

r :レジスタ範囲を指定します。最初から最後までの領域のみをスキャンできます。
f :デバイスへの強制アクセス
y :ヒューマンコンピュータインタラクションモードをオフにする
i2cbus :バス番号
アドレス:デバイスのアドレスを指定します
mode :読み取るサイズを指定します。'b' バイト、'w' ワード、SMBus ブロックの場合は 's'、I2C ブロックの場合は 'i' です。

I2C1でデバイス0x38のすべてのレジスタを読み取る
./i2cdump-f-y-a 1 0x38

一般的に、レジスタは8ビットのアドレスを持ちます。i2cdump、i2cget、i2csetも8ビットのアドレスを読み取るように設定されています。一度に8ビットを超えるアドレスが必要な場合は、i2ctransferが必要です。

i2ctransfer: 複数バイトの同時読み取りと書き込み

使用法: i2ctransfer [ - f ] [ - y ] [ - v ] [ - V ] [ - a ] I2CBUS DESC [ DATA ] [ DESC [ DATA ] ] ...
I2CBUSは整数またはI2Cバス名です
DESCは転送を次の形式記述します: { r | w } LENGTH [ @address ]
1 )読み取り/ 書き込みフラグ2 )長さ範囲0 - 65535 3 ) I2Cアドレス省略した場合は最後のものを使用
DATAは書き込みメッセージのLENGTHバイトです。サフィックス短縮できます
= ( LENGTH まで値を一定に保つ)
+ ( LENGTH まで値を1 ずつ増やす)
- ( LENGTH になるまで値を1 ずつ減らします)
p (値をシードとしてLENGTHまで疑似乱数ジェネレータを使用する)

システム上の I2C バスとそのデバイス アドレスを確認します。

 ls / sys /バス/ i2c /デバイス/

ここで実際のデバイスを表示し、i2c-tools からスキャンしたデータと比較して一致するかどうかを確認できます。

述べる:

i2c-tools は /dev パス内の i2c-× デバイス ファイルを操作することで動作します。そのため、カーネルで CONFIG_I2C_CHARDEV マクロが有効になっている必要があります。有効になっていない場合、ノードが見つからないことが報告されます。