6

私は Linux デバイス ドライバーを書く初心者です。質問がばかげていたり、英語が下手だったりしても許してください^^
I2C 経由で CPU と通信するタッチパネル用のドライバーを書こうとしています。
デバイス ドライバーを Linux プラットフォームに追加しようとしましたが、登録は成功しました。つまり、ドライバーは読み込まれましたが、プローブ機能が起動しませんでした。

上記は、私が書いたドライバーの部分的なコードです。

static int i2c_ts_probe(struct i2c_client *client, const struct i2c_device_id * id) {  
    /* ... */  
}

static int i2c_ts_remove(struct i2c_client *client) {  
    /* ... */  
}

static const struct i2c_device_id i2c_ts_id[] = {  
    {"Capacitive TS", 0},  
    { }  
};  
MODULE_DEVICE_TABLE(i2c, i2c_ts_id);  

static struct i2c_driver i2c_ts = {  
    .id_table = i2c_ts_id,  
    .probe = i2c_ts_probe,  
    .remove = i1c_ts_remobe,  
    .driver = {  
        .name = "i2c_ts",  
    },  
};

static int __init i2c_ts_init(void) {  
    return i2c_add_driver(&i2c_ts);  
}

static int __init i2c_ts_exit(void) {  
    return i2c_del_driver(&i2c_ts);  
}  

module_init(i2c_ts_init);
module_exit(i2c_ts_exit);

上記は、i2c デバイスの登録に使用されるプラットフォーム (/kernel/arch/arm/mach-pxa/saarb.c) の部分的なコードです。

static struct i2c_board_info i2c_board_info_ts[] = {
    {  
        .type = i2c_ts,  
        .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)),  
    },  
};

static void __init saarb_init(void) {  
    ...  
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts));  
    ...  
}

ご意見・ご要望などありましたらよろしくお願いします(^^)

4

2 に答える 2

7

Linux デバイス/ドライバー モデルがドライバーをプローブできるようにするには、それを要求するデバイスが存在する必要があります。これは、ドライバーの名前 ("i2c_ts") と i2c_board_info 構造体のデバイスのタイプを比較することによって実現されます。あなたの場合、タイプは「i2c_ts」と等しくないと思います。

したがって、Documentation/i2c/instantiating_devices に記載されているように、I2C_BOARD_INFO マクロを使用してデバイスをインスタンス化することをお勧めします。

static struct i2c_board_info i2c_board_info_ts[] = {
    {  
         I2C_BOARD_INFO("i2c_ts", 0x12),  
         .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)),  
    },
};

static void __init saarb_init(void) {  
    ...  
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts));  
    ... 
}

また、デバイスにアドレスを指定していないため、I2C_BOARD_INFO にはそれが必要です。タッチスクリーンのデータシートを読んで、そのアドレスが何であるかを確認してください。

最後に、上で提案したように、i2c_ts_id が正しいことを確認してください。カーネル内のデバイス/モジュールの関連付けメカニズムで役割を果たしているかどうかはわかりませんが、すべてが同じ名前を共有しているため、混乱ははるかに少ないと思います.

于 2010-06-12T07:51:23.457 に答える
1

プローブ メソッドは、デバイスがドライバー名と一致する場合にのみ呼び出されます。ドライバー名が「i2c_ts」であると述べたので、デバイス ツリーでデバイス名を確認してください。両方とも同じである必要があります。

于 2013-05-24T21:09:15.010 に答える