2

システム内の別のデバイスにアクセスできるように、作成/変更しているデバイス ドライバーが必要です。名前やアドレスなど、ドライバーに関する情報を調べて調べますが、実際に調べる方法がわかりません。この特定のケースでは、GPIO デバイスを取得する必要があります (5 つがロードされ、2 つの異なるタイプがあります)。ただし、複数のドライバーが 1 つのドライバーを共有する別のタスクがあるため、一般的なことも知っておく必要があります。彼らが調べなければならない共通のもの、私は同様の方法で推測します。ユーザー空間からデバイスを検索する方法を見つけましたが、別のカーネル ドライバーから検索する方法については何もわかりませんでした。また、システムにはモジュールがなく、すべてのデバイスが devicetree 情報からロードされます。

私を混乱させているのは、特定の gpio init 関数がデバイスをどこにでも登録する方法がわからないことです。ザイリンクス固有の AXI GPIO デバイスを使用しています。このデバイスは drivers/gpio/gpio-xilinx.c のコードを使用しており、デバイス ツリーからすべての情報を取得する方法を確認できますが、何も返されていません。後で使用できるように、任意のカーネル リストに追加します。

それが役立つ場合、これは Xilinx Zynq チップで実行されています。

4

2 に答える 2

1

ドライバーが属している名前と bus_type がわかっている場合は、driver_find() API を使用してドライバーを検索します。モジュール名がわかっている場合は、find_module() API を使用してモジュールを取得することもできます。例...

int __init initialization_routine(void)
{
        struct module *mod;
        struct device_driver *drv;

        mod = find_module("e1000"); // e1000 is Intel ethernet module
        if (mod == NULL) { 
                printk("Module e1000 not found\n");
                return 1;
        }

        printk("Module name : %s\n", mod->name);

        /*
         * Module e1000 belongs to pci_bus_type
         */
        drv = driver_find("e1000", &pci_bus_type);
        if (drv == NULL) {
                printk("Cannot find driver for module e1000\n");
                return 1;
        }

        return 0;
}

システムにはさまざまなバスが登録されています。/sys/bus の下のすべてのディレクトリをリストしていることがわかります。各ディレクトリはバス タイプです。バス タイプ構造体名は、カーネル内で bus_type 構造体定義を検索することによって見つけることができます。

于 2013-09-30T06:16:37.447 に答える