2017-06-06 46 views
0

インタフェースボードを介して、I2C上のMCUの束とインターフェースするLinuxカーネルドライバを作成する必要があります。それらは数が多く、すなわち1-18程度であるため、NXP/TI I2Cマルチプレクサを利用しています。Linux I2Cカーネルドライバ

NXP/TIのI2Cマルチプレクサカーネルドライバをインポートし、DTSファイルに組み込んだことがあります。私は、すべてのI2Cマルチプレクサを異なるi2c-xノードとしてリストすることに成功しました。

MCUはすべて同じアドレス0x08を使用しています。そして私はhwmon + sysfsのインタフェースを作成するカーネルドライバを作成します。 しかし、insmodのドライバは、__initの機能のみをトリガします。そして、probe()と気にしないでください。

static struct i2c_board_info xxxx_i2c_devices[] = { 
    { 
    I2C_BOARD_INFO("xxxx", 0x08), 
    }, 
}; 

とそのが

i2c_register_board_info(0, xxxx_i2c_devices, ARRAY_SIZE(xxxx_i2c_devices)); 

対応を挿入していた場合にのみ、私はプローブ機能をトリガすることができた多くのドキュメンテーションを参照する際に

はしかし、これは、いくつかのHWMONに一つだけのインスタンスを作成しません私はそれがあると想像した。私はボードinitの変化がなければhttps://www.kernel.org/doc/Documentation/i2c/instantiating-devices

を言及している、私は、しかし、カーネルもprobe()を呼び出し、function()を検出しない、方法3を利用するために、ドライバのだけ__init機能を試してみました。ドライバ次

アム - 必要に応じて https://github.com/1119553797/sprd-kernel-common/blob/sprdb2g_gonk4.0/drivers/hwmon/w83l785ts.c

は参考のために、全体のカーネルドライバを投稿するのと同じ上記のカーネルにボード・レベルの変更を使用して、カスタムボードをカーネル3.0.8を使用しています。

+0

以下をお試しください古代のカーネルが最初に。 – 0andriy

答えて

0

大規模なグーグルとパッチを適用した後、さまざまな方法で回避策が得られます。

DTSでは、Muxアドレッシングに直接I2Cアドレスを割り当てることができます。例えば。

[email protected] { 
    #address-cells = <1>; 
    #size-cells = <0>; 
    reg = <0>; 

    adc0: [email protected] { 
     compatible = "nuvoton,nau7802"; 
     reg = <0x2a>; 
     nuvoton,vldo = <3000>; 
    }; 
}; 

[email protected] { 
    #address-cells = <1>; 
    #size-cells = <0>; 
    reg = <1>; 

    adc1: [email protected] { 
     compatible = "nuvoton,nau7802"; 
     reg = <0x2a>; 
     nuvoton,vldo = <3000>; 
    }; 
}; 

[email protected] { 
    #address-cells = <1>; 
    #size-cells = <0>; 
    reg = <2>; 

    adc2: [email protected] { 
     compatible = "nuvoton,nau7802"; 
     reg = <0x2a>; 
     nuvoton,vldo = <3000>; 
    }; 
}; 

そしてドライバにおいて、上記の例のようにベンダーID、商品コード構造を識別するために「nuvoton、nau7802」、我々は次の変更をしなければならない: -

static const struct i2c_device_id nau7802_i2c_id[] = { 
    { "nau7802", 0 }, 
    { } 
}; 
MODULE_DEVICE_TABLE(i2c, nau7802_i2c_id); 

static const struct of_device_id nau7802_dt_ids[] = { 
    { .compatible = "nuvoton,nau7802" }, 
    {}, 
}; 
MODULE_DEVICE_TABLE(of, nau7802_dt_ids); 

static struct i2c_driver nau7802_driver = { 
    .probe = nau7802_probe, 
    .remove = nau7802_remove, 
    .id_table = nau7802_i2c_id, 
    .driver = { 
     .name = "nau7802", 
     .of_match_table = nau7802_dt_ids, 
    }, 
}; 

部分 "adc1"などは単にスキップすることができます。私が集まることができるものから、device_tree情報であることを意味する「のMODULE_DEVICE_TABLE(」。

あなたはDTS &ボード_initの変更を必要としない、より良い方法を見つけた場合、私に知らせてください。

関連する問題