2016-07-15 12 views
1

Ich versuche, einen i2c-Gerätetreiber für einen kapazitiven Touchscreen-Controller von Atmel im Linux-Kernel unseres auf Android Lollipop (Version 5.0.2) basierenden Systems zu installieren. Ich habe den vom Hersteller gelieferten aktualisierten Quellcode (atmel_mxt_ts.c) zu kernel/drivers/input/touchscreen hinzugefügt und den devicetree entsprechend geändert, aber wenn der Kernel bootet, wird i2c_device_register niemals für diesen bestimmten Treiber aufgerufen. Dies bedeutet, dass ich mit diesem Gerät am i2C-Bus nicht kommunizieren kann und daher das Touchpanel nicht funktioniert. Beachten Sie, dass diese Treiberdatei bereits im Kernel vorhanden war. Ich musste nur sicherstellen, dass sie im Kernel-Build enthalten ist, indem Sie make menuconfig ausführen und einen vollständigen sauberen Build ausführen. Die i2c_device_register-Funktion wird für andere i2c-Treiber wie den Batterietreiber aufgerufen, da ich die printk-Ausgabe für sie sehen kann. Beachten Sie auch, dass die Geräteadresse für dieses Gerät in sysfs angezeigt wird. das heißt ein Verzeichnis für den betreffenden I2C-Bus Auflistung zeigt folgend:i2c-Gerätetreiber wird nicht aufgerufen

[email protected]_mx6:/ # ls /sys/bus/i2c/devices/i2c-2/ 
2-000b 
2-004a 
2-0068 
delete_device 
i2c-dev 
name 
new_device 
power 
subsystem 
uevent 

004a ist die Adresse der Berührungsvorrichtung Atmel kapazitiv, 000b ist die SMBus-Batterie, und 0068 ist ein RTC-Gerät.

Hat jemand irgendwelche Vorschläge, warum der i2c_register_driver nicht für den Atmel kapazitiven Touch-Gerätetreiber aufgerufen wird?

Ich habe unten einige Codeschnipsel eingefügt.

Hier ist der letzte Teil der Treiberquelldatei atmel_mxt_ts.c:

static const struct of_device_id mxt_of_match[] = { 
    { .compatible = "atmel,atmel_mxt_ts"}, 
    { /* sentinel */ } 
}; 
MODULE_DEVICE_TABLE(of, mxt_of_match); 

#ifdef CONFIG_ACPI 
static const struct acpi_device_id mxt_acpi_id[] = { 
    { "ATML0000", 0 }, /* Touchpad */ 
    { "ATML0001", 0 }, /* Touchscreen */ 
    { } 
}; 
MODULE_DEVICE_TABLE(acpi, mxt_acpi_id); 
#endif 

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

static struct i2c_driver mxt_driver = { 
    .driver = { 
     .name = "atmel_mxt_ts", 
     .owner = THIS_MODULE, 
     .of_match_table = of_match_ptr(mxt_of_match), 
     .acpi_match_table = ACPI_PTR(mxt_acpi_id), 
     .pm = &mxt_pm_ops, 
    }, 
    .probe  = mxt_probe, 
    .remove  = mxt_remove, 
    .id_table = mxt_id, 
}; 

module_i2c_driver(mxt_driver); 

/* Module information */ 
MODULE_AUTHOR("Joonyoung Shim <[email protected]>"); 
MODULE_DESCRIPTION("Atmel maXTouch Touchscreen driver"); 
MODULE_LICENSE("GPL"); 

und hier ist der entsprechende Abschnitt der devicetree Quelle:

&i2c3 { 
     clock-frequency = <100000>; 
     pinctrl-names = "default"; 
     pinctrl-0 = <&pinctrl_i2c3_3>; 
     status = "okay"; 

    battery { 
     compatible = "ti,bq20z75"; 
     reg = <0xb>; 
     /* nBATT_PRES */ 
     battery-detect-gpios = <&expander1 4 GPIO_ACTIVE_LOW>; 
     power-supplies = <&charger>; 
    }; 

    [email protected] { 
     compatible = "atmel,atmel_mxt_ts"; 
     reg = <0x4a>; 
     interrupt-parent = <&gpio1>; 
     interrupts = <4 1>; 
    }; 


     /* DS1307 RTC module */ 
     [email protected] { 
       compatible = "dallas,ds1307"; 
       reg = <0x68>; 
     }; 
}; 
+0

Sie haben nie etwas über die Dateien 'Makefile' und' Kconfig' in 'drivers/input/touchscreen /' erwähnt. Hast du sie aktualisiert? Haben Sie den Kernel neu konfiguriert und den neuen Touchscreen-Treiber ausgewählt? Und natürlich, haben Sie den Kernel und devicetree neu erstellt und installiert? –

+0

Nicht sicher, ob Sie einen Tippfehler mit einer Klammer fehlt haben. Der touch @ 4a-Eintrag sollte innerhalb des & i2c3-Knotens liegen. Zeigt i2cdetect den Touchscreen am i2c-Bus an? Überprüfen Sie, ob die Sondenfunktion aufgerufen wird, zusätzlich zu dem, was Ian hinzugefügt hat. – Sanchayan

+0

@IanAbbott Dieser Treiber war bereits Teil des Kernels und ist daher in den Dateien Makefile und Kconfig enthalten. Ich habe gerade den Kernel mit make menuconfig neu konfiguriert, um sicherzustellen, dass der atmel-Treiber enthalten ist. Der atmel-Treiber-Quellcode wurde auf den neuesten Code aktualisiert. Ich habe einen kompletten Clean/Rebuild/Install für den Kernel und devicetree gemacht. –

Antwort

0

Die Änderungen, die zuvor gemacht wurden Die .config-Datei für den Kernel-Build, um den atmel kapazitiven Touch-Treiber hinzuzufügen, wurde irgendwie überschrieben, als diese Datei zum zweiten Mal überprüft wurde. Nachdem sichergestellt wurde, dass die .config-Datei diesen Treiber über make manuconfig enthielt, wird der Treiber neu erstellt. Es stellte sich also heraus, dass es sich um einen Benutzerfehler handelte!