最近、仕事のために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のバージョンを取得します。
Linuxカーネルの待機キューには、割り込み処理、プロセスの同期、およびタイミングのための多くの用途があります。ここで言うのは、プロセスは特定のイベントが発生するのを待たなければならないことが多い
現在、非常に深刻なBashの脆弱性がインターネット上に公開されており、ハッカーがリモートコマンドをサーバーに送信して個人情報を盗むことを容易に可能にします。記事はあ
このプログラムと出力を使用して、waitpidの使用法と特性を分析します。 waitpidをWNOHANGノンブロッキング親プロセス状態に設定し、最初にwaitpidが呼び出されたとき:この時点では子
誰もが、シェルスクリプトはDOSの初期の時代のバッチファイル(.bat)のようなものであることを知っています。最も簡単な機能は複数の命令を一緒に書くことです。ワンタッチで複雑な操作を簡単に処理できます