5

このカーネルモジュールをロードしても何もしないのはなぜですか?

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#define DEVICE_NAME "hello-1.00.a"
#define DRIVER_NAME "hello"
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(struct platform_device *pdev){
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static int hello_exit(struct platform_device *pdev){
    printk(KERN_ALERT "Goodbye, cruel world\n");
    return 0;
}

static const struct of_device_id myled_of_match[] =
{
    {.compatible = DEVICE_NAME},
    {},
};

MODULE_DEVICE_TABLE(of, myled_of_match);

static struct platform_driver hello_driver =
    {
        .driver = {
        .name = DRIVER_NAME,
        .owner = THIS_MODULE,
        .of_match_table = myled_of_match
    },
    .probe = hello_init,
    .remove = hello_exit
};

module_platform_driver(hello_driver);

モジュールがロードされているように見えるHello, world\n場合は、印刷する必要があります。lsmod

lsmod
hello_world 1538 0 - Live 0xbf000000 (O)

しかし、コンソールにも にも何も出力されませんdmesg

使用module_initしてmodule_exitすべて動作するが、デバイスへのポインターが必要な場合platform_device *pdev、どうすればよいですか?

編集:

元のモジュールは次のようになります。

#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void){
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}

static void hello_exit(void){
    printk(KERN_ALERT "Goodbye, cruel world\n");
}


module_init(hello_init);
module_exit(hello_exit);

私のデバイス ツリー blob には、次のエントリが存在します。

hello {
    compatible = "dglnt,hello-1.00.a";
    reg = <0x41220000 0x10000>;
};
4

1 に答える 1

6

module_init と module_exit を使用すると、すべて動作します

その短い「元の」コードは、モジュール フレームワークのみで構成されています。init ルーチンはモジュールのロード時に呼び出されることが保証され、exit ルーチンはアンロードの前に呼び出されます。その「元の」コードはドライバーではありません。

長いカーネル モジュールはドライバーであり、ロードされますが、 (module_platform_driver()マクロの展開によって生成される) 何もしないデフォルトの初期化および終了コードがあるため、メッセージはありません。カーネルがデバイス ツリーを使用する場合、ローダブル モジュール内のドライバー コードが呼び出される保証はありません。

このカーネルモジュールをロードしても何もしないのはなぜですか?

デバイス ツリーには、このデバイス ドライバーが必要であることを示すものがないため、ドライバーのプローブ機能 (メッセージを出力する) が呼び出されていない可能性があります。

ボードのデバイス ツリーのスニペットには、

    compatible = "dglnt,hello-1.00.a";

しかし、ドライバーは、次のように指定する必要があると宣言します

#define DEVICE_NAME "hello-1.00.a"
...   
    {.compatible = DEVICE_NAME},

これらの文字列は、ドライバがデバイス ツリー ノードでこの参照デバイスにバインドできるように一致する必要があります。

また、デバイス ノードは次のように宣言する必要があります。

    status = "okay";

デバイスを無効にする可能性のあるデフォルトのステータスをオーバーライドします。

デバイス ツリーで適切に構成されたノードは、ドライバのプローブ機能を期待どおりに実行する必要があります。

于 2014-11-10T23:53:49.540 に答える