2010-06-10 9 views
6

Ich bin ein Neuling beim Schreiben von Linux-Gerätetreiber, vergib mir, wenn etwas dummes fragte und mein schlechtes Englisch ^^ Ich versuche, einen Treiber für ein Touch-Panel zu schreiben, die kommunizieren mit CPU über I2C.
Ich habe versucht, einen Gerätetreiber in Linux-Plattform hinzuzufügen, und das Register war erfolgreich, ich meine, der Treiber wurde geladen, aber die Probe-Funktion hat nicht ausgelöst !!Probe Problem beim Schreiben eines I2C Gerätetreibers

Oben ist ein Teilcode des Treibers, den ich geschrieben habe.

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); 

ist Oberhalb Teilcode in der Plattform (/kernel/arch/arm/mach-pxa/saarb.c) verwendet, um das I 2 C-Gerät zu registrieren.

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)); 
    ... 
} 

jede Anregung und Kommentar ist willkommen, danke ^^

+1

ist i2c_ts_id korrekt? –

Antwort

7

Damit das Linux-Gerät/Treiber-Modell des Fahrers sondieren kann, muss ein Gerät sein, es anfordert: dies durch den Vergleich des Namens erreicht wird des Treibers ("i2c_ts") und der Typ des Geräts in der i2c_board_info-Struktur. In Ihrem Fall ist der Typ nicht gleich "i2c_ts".

Daher würde ich vorschlagen, dass Sie das I2C_BOARD_INFO Makro verwenden, um Ihr Gerät zu instanziieren, wie in Documentation/i2c/instanziating_devices dokumentiert.

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)); 
    ... 
} 

Sie haben Ihrem Gerät auch keine Adresse zugewiesen, und I2C_BOARD_INFO benötigt es. Lesen Sie das Datenblatt Ihres Touchscreens, um zu wissen, um welche Adresse es sich handelt.

Schließlich, wie oben vorgeschlagen, stellen Sie sicher, dass i2c_ts_id korrekt ist. Ich bin mir nicht sicher, ob es eine Rolle in dem Geräte-/Modulzuordnungsmechanismus im Kernel spielt, aber ich würde sagen, es ist viel weniger verwirrend, dass sie alle den gleichen Namen haben.

1

Die Sondenmethode wird nur aufgerufen, wenn das Gerät mit dem Treibernamen übereinstimmt.Wenn Sie Ihren Treibernamen als 'i2c_ts' angegeben haben, überprüfen Sie bitte Ihren Gerätebaum auf den Gerätenamen. Beide sollten identisch sein.

Verwandte Themen