2016-07-15 9 views
1

私はAndroid Lollipop(バージョン5.0.2)ベースのシステムのLinuxカーネルで動作するAtmel容量性タッチスクリーンコントローラ用のi2cデバイスドライバを取得しようとしています。カーネル/ドライバ/入力/タッチスクリーンにメーカーの提供するアップデートされたソースコード(atmel_mxt_ts.c)を追加し、必要に応じてdevicetreeを修正しましたが、カーネルが起動すると、i2c_device_registerはこの特定のドライバに対して決して呼び出されません。つまり、私はこのデバイスとi2Cバスで通信できないため、タッチパネルは動作しません。このドライバファイルはすでにカーネルに存在していたので、カーネルビルドに含まれていることを確認し、make menuconfigを実行して完全なクリーンビルドを行うだけでした。 i2c_device_register関数は、バッテリードライバーなどの他のi2cドライバーに対して呼び出されているので、printk出力が表示されます。 このデバイスのデバイスアドレスはsysfsに表示されています。すなわち、関連するI2Cバスのためのディレクトリリストは、以下を示す:i2cデバイスドライバの起動が呼び出されない

[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は、アトメル静電容量式タッチ装置のアドレスであり、000Bは、SMBus電池であり、そして0068 RTCデバイスです。

i2c_register_driverがAtmel静電容量式タッチデバイスドライバのために呼び出されていない理由は何ですか?

以下にコードの一部を示します。ここで

は、ドライバのソースファイル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"); 

、ここでdevicetreeソースの関連セクションです:

&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

あなたは 'drivers/input/touchscreen /'の 'Makefile'ファイルと' Kconfig'ファイルについて何も言及していません。あなたはそれらを更新しましたか?カーネルを再設定して新しいタッチスクリーンドライバを選択しましたか?もちろん、カーネルとdevicetreeを再構築してインストールしましたか? –

+0

中括弧がないタイプミスがあるかどうかはわかりません。 touch @ 4aエントリーは&i2c3ノード内になければなりません。 i2cdetectはi2cバス上にタッチスクリーンを表示しますか?プローブ関数が呼び出されているかどうかを確認し、Ianが追加したものを処理します。 – Sanchayan

+0

@IanAbbottこのドライバはすでにカーネルの一部であったため、MakefileファイルとKconfigファイルに含まれています。 make menuconfigを使用してカーネルを再構成して、atmelドライバが含まれていることを確認しました。 atmelドライバのソースコードが最新のコードに更新されました。私はカーネルとdevicetreeの完全なクリーン/再構築/インストールを行いました。 –

答えて

0

以前に行われた変更をこのファイルを2度目にチェックすると、カーネルビルド用の.configファイルがatmel容量性タッチドライバを追加するために何とか上書きされていました。 .configファイルにmake manuconfigを介してこのドライバが含まれていることを確認した後、ドライバを再構築するようになりました。だから、それはユーザーエラーでした!

関連する問題