2016-07-15 2 views
1

Я пытаюсь получить драйвер устройства 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>; 
     }; 
}; 
+0

Вы никогда ничего не говорили о файлах 'Makefile' и' Kconfig' в 'drivers/input/touchscreen /'. Вы их обновили? Вы переконфигурировали ядро ​​и выбрали новый драйвер сенсорного экрана? И, конечно же, вы перестроили и установили ядро ​​и devicetree? –

+0

Не уверен, что у вас есть опечатка с отсутствующей фигурной скобкой. Запись touch @ 4a должна быть в узле & i2c3. Отображает ли i2cdetect сенсорный экран на шине i2c? Проверьте, вызвана ли функция зонда в дополнение к тому, чтобы позаботиться о том, что добавил Ян. – Sanchayan

+0

@IanAbbott Этот драйвер уже был частью ядра, поэтому присутствует в файлах Makefile и Kconfig. Я просто переконфигурировал ядро, используя make menuconfig, чтобы убедиться, что драйвер atmel был включен. Исходный код драйвера atmel был обновлен до последнего кода. Я полностью очистил/перестроил/установил для ядра и devicetree. –

ответ

0

Изменения, которые ранее были сделаны в файл .config для сборки ядра для добавления емкостного сенсорного драйвера atmel был каким-то образом перезаписан, проверяя этот файл во второй раз. Убедившись, что в файле .config этот драйвер включен с помощью make manuconfig, и теперь загружается драйвер восстановления. Так получилось, что это была ошибка пользователя!

Смежные вопросы