1

組み込み製品で I2C バス ドライバを動作させようとしています。

ドライバーは現在、バス 0 では正常に動作していますが、バス 1 では動作していません。

i2c-product.c という名前のファイルがあり (チップ i2c コントローラーの名前を「product」に置き換えました)、それがコントローラーのドライバーであると思います。

機能がありますproduct_i2c_probe(struct platform_device *pd)。これは、platform_driver 構造体で .probe メンバーに割り当てられたコールバックであることがわかります。カーネルがドライバーをセットアップするために呼び出していると思います。理にかなっています。

関数内product_i2c_probe(struct platform_device *pd)には、アダプターをセットアップするための次の行があります。

drv_data->adapter.dev.parent = &pd->dev;
drv_data->adapter.algo = &product_i2c_algo;
drv_data->adapter.owner = THIS_MODULE;
drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
drv_data->adapter.timeout = msecs_to_jiffies(pdata->timeout);
drv_data->adapter.nr = pd->id;

i2c-core.c と i2c-dev.c のコードを調べると、デバイス ノードからマイナーを取得するため、アダプターの nr メンバーにバス ID を含める必要があるようです。注:両方のバスに対して mknod コマンドを使用してノードも作成しました。したがって、デバイス /dev/i2c-0 と /dev/i2c-1 があります。

関数の後半で、product_i2c_probe(struct platform_device *pd)を使用してアダプタをデバイスに追加しi2c_add_numbered_adapter(&drv_data->adapter)ます。

ファイルの最後に、デバイスが登録されていることがわかります。

static int __init
product_i2c_init(void)
{
    return platform_driver_register(&product_i2c_driver);
}

そして最後に

module_init(product_i2c_init);

私の質問は、probe() 関数を呼び出して platform_device *pd を渡すのは誰かということです。明らかに、このオブジェクトには、次の行でアダプタのバス ID になる pd->id 値があります。

drv_data->adapter.nr = pd->id;

設定ファイルはどこかにありますか?あちこち検索しましたが、menuconfigを含めて見つかりませんでした。

どんな助けでも大歓迎です。ご想像のとおり、私はデバイス ドライバーの初心者です。私は正しい軌道に乗っていますか、それとも完全に外れていますか?

ありがとう。

4

0 に答える 0