Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> LinuxのI2Cドライバアーキテクチャの概要

LinuxのI2Cドライバアーキテクチャの概要

  

最近、仕事のためにI2Cバスが使用されています。私は過去にI 2 Cを使用していましたが、Linuxカーネルの後にレイヤを改善できることがわかりました。二つの部分、バスドライバ(BUS)とデバイスドライバ(デバイス)で

1のLinuxザI2Cドライバアーキテクチャ

LinuxのI2Cバスドライバ。バスドライバの役割は、システム内の各I2Cバスに対応する読み書き方法を追加することです。しかし、バスドライバ自体は何も通信しません。それはそこに存在し、デバイスドライバがその機能を呼び出すのを待ちます。


デバイスドライバは、I2Cバスに接続されている特定のデバイスと通信するドライバです。機能I2Cバスドライバを提供することにより、デバイスドライバは、ハードウェアデバイスと通信するために、その実装の詳細に関係なく、相違バスコントローラを無視することができます。


1.1バスドライバ

システム電源は、第I2Cバスドライバであるときにロードされます。バスドライバは、特定のI2Cバスの読み書きをサポートするために使用されます。バスドライバは、通常、2つのモジュールを必要とし、構造体i2c_algorithm説明するための構造体i2c_adapter:

静的構造体i2c_adapter pb1550_board_adapter = {

名:"を、pb1550アダプタ"

ID:I2C_HW_AU1550_PSC、

ALGO:NULL、

algo_data:& pb1550_i2c_info、

inc_use:pb1550_inc_use、

dec_use:pb1550_dec_use、

client_register:pb1550_reg、

client_unregister:pb1550_unreg、

client_count:0、

};


このサンプル「pb1550アダプタ」というドライバが付属しています。しかし、このモジュールは、読み取りおよび書き込み、読み出しおよび第二のモジュールによって提供される特定の方法、構造体i2c_algorithmを書き込むための機能を提供しません。


静的構造体i2c_algorithm au1550_algo = {

.nameの=" Au1550アルゴリズム"

.ID = I2C_ALGO_AU1550、

.master_xfer = au1550_xfer、

.functionality = au1550_func、

};


i2c_adap->アルゴ=& au1550_algo;


この例では、読み書き用の「algorithm」を上記のバスドライバに追加しています。典型的には、各I2Cバスドライバは、それ自身のレベリングアルゴリズムを定義し、いくつかが、バスが同じアルゴリズムを使用して考えると、読み出しおよび書き込み機能の同じセットを共有することが可能です。この例のドライバは、「Au1550アルゴリズム」と呼ばれる独自の読み取りおよび書き込みアルゴリズムモジュールを定義しています。


すべて呼び出すことによって完成した後:

i2c_add_adapter(i2c_adap);


これらの二つのモジュールに登録オペレーティングシステム
には、バスドライバがインストールされています。 AMD au1550の場合、この部分はAMDによって提供されています。

1.2デバイスドライバ

上記のように、バスドライバは、読み取りおよび書き込みバス自体と通信しないための機構を提供します。通信はI2Cデバイスドライバによって行われ、デバイスドライバはI2Cバスを介して特定のデバイスと通信します。デバイスドライバは、struct i2c_driverとstruct i2c_clientの2つの記述モジュールを持っています。


システムの電源が入っていてI2Cバスドライバがロードされている場合は、デバイスドライバをロードできます。 I2CのTVチューナドライバ"、

.ID =ドライバ= {

.nameの=" i2c_driver


静的構造体:第一次の構造を装入I2C_DRIVERID_TUNER、

.flags = I2C_DF_NOTIFY、

.attach_adapter = tuner_probe、

.detach_client = tuner_detach、

.command = tuner_command、

};


i2c_add_driver(&ドライバ);一度ロード完了


このi2c_driver、関数が呼び出さattach_adapterされます。 I2Cバス駆動系に横断することができるこれらの各々は、検出装置は、アクセスしたい:


静的INT tuner_probe(構造体i2c_adapter * ADAP)

{

戻りi2c_probe(ADAP、& ADDR_DATA、tuner_attach);

}


デバイスを複数の検出が見つかり、したがってのみI2Cバスでなくてもよいことに留意されたいです複数の異なる種類のデバイスをぶら下げて、1つのデバイスドライバで複数の異なるI2Cバスにぶら下がっているデバイスに同時にサービスを提供できます。


デバイスドライバがサポートされているデバイスを検出するたびに、それは、デバイスを識別するために、構造体i2c_clientを作成します。

new_client-> ADDR =アドレス。

new_client->アダプタ=アダプタ;

new_client->ドライバ=&ドライバ;
は、


/*新しいI2C層に知らせます

もし(ERR)

後藤エラーを;


目に見えるクライアントが* /

ERR = i2c_attach_client(new_client)に到着しましたi2c_clientは、アダプタバス上にあり、addressというアドレスを持ち、ドライバによって駆動されるデバイスを表します。バスドライバをデバイスドライバとデバイスアドレスにバインドします。 i2c_clientはI2Cデバイスを表します。


I2Cデバイスは、デバイスが読み込まれ、これに直接書き込むことができたときに得られる:

/*

*マスター・ルーチンはものがあり、通常、上*

のデバイスにデータを送信するために使用される(またはそれらから読み出された)バス。以外二つの基本的な伝達関数から

*より複雑なバージョンであることができ、一度に一つのメッセージを送信する

*中断することなくメッセージの任意の数の送信

* /

のextern INT i2c_master_send(構造体i2c_clientの*、CONSTのchar *、INT);.

するために使用

のextern INT i2c_master_recv(構造体i2c_client *、チャー*、INT);


、通常の意味での機能を読み書き、ポインタデバイスにより指定これら二つi2c_client機能、 int charを読み書きします。戻り値は読み書きされたバイト数です。当社の既存のSLIC駆動のため、限り最後のデータが移植を完了した場合でも、読み、両方の機能を送信するために書き込みバスに描画されるように、我々は、LinuxのデバイスドライバのI2Cのバージョンを取得します。

Copyright © Windowsの知識 All Rights Reserved