Я пытаюсь получить драйвер устройства i2c для емкостного сенсорного контроллера Atmel для работы в ядре Linux нашей системы Android Lollipop (версия 5.0.2). Я добавил обновленный исходный код производителя (atmel_mxt_ts.c) к ядру/драйверам/вводу/сенсорному экрану и, при необходимости, модифицировал devicetree, но когда ядро загружается, i2c_device_register никогда не будет вызван для этого конкретного драйвера. Это означает, что я не могу связаться с этим устройством на шине i2C, и, следовательно, сенсорная панель не будет работать. Обратите внимание, что этот файл драйвера уже присутствовал в ядре, мне просто нужно было убедиться, что он был включен в сборку ядра, запустив make menuconfig и выполнив полную чистую сборку. Функция i2c_device_register вызывается для других драйверов i2c, таких как драйвер батареи, поскольку я могу видеть вывод printk для них. Обратите внимание, что адрес устройства для этого устройства отображается в sysfs. т.е. список каталогов для соответствующей шины I2C показывает следующее:Драйвер устройства i2c init не называется
[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 является адресом емкостных сенсорного устройства Atmel, 000b является аккумулятором SMBus и 0068 является устройством РОК.
Есть ли у кого-нибудь какие-либо предложения относительно того, почему 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>;
};
};
Вы никогда ничего не говорили о файлах 'Makefile' и' Kconfig' в 'drivers/input/touchscreen /'. Вы их обновили? Вы переконфигурировали ядро и выбрали новый драйвер сенсорного экрана? И, конечно же, вы перестроили и установили ядро и devicetree? –
Не уверен, что у вас есть опечатка с отсутствующей фигурной скобкой. Запись touch @ 4a должна быть в узле & i2c3. Отображает ли i2cdetect сенсорный экран на шине i2c? Проверьте, вызвана ли функция зонда в дополнение к тому, чтобы позаботиться о том, что добавил Ян. – Sanchayan
@IanAbbott Этот драйвер уже был частью ядра, поэтому присутствует в файлах Makefile и Kconfig. Я просто переконфигурировал ядро, используя make menuconfig, чтобы убедиться, что драйвер atmel был включен. Исходный код драйвера atmel был обновлен до последнего кода. Я полностью очистил/перестроил/установил для ядра и devicetree. –