2017-02-21 12 views
2

У меня возникли проблемы с сенсорным экраном, работающим на Atmel MXT641T на платформе Android 5 для работы.Как правильно настроить прерывание для строки INT для Atmel MXT641T сенсорной микросхемы в Android-устройстве ядра Android 5?

Установка у меня выглядит следующим образом:

  • Оборудование: Inforce 6309 СБК с Qualcomm Snapdragon 410 msm8916 процессор ARM64.
  • Пользовательский сенсорный экран с чипом контроллера Atmel MXT641T.
  • Соединение I2C между Atmel и Snapdragon, подключенным к I2C0.
  • Android 5 операционной системы Linux с использованием ядра 3.10 из git://codeaurora.org/kernel/msm-3.10.git ветви Rel_V1.3 (это часть БСП, которая поставляется с SBC) ...
  • ... но с последней версией драйвера Atmel atmel_mxt_ts.c наложенной на (но также проверено с версией atmel_maxtouch_ts.c в msm-3.10.git, которая показывает то же поведение).
  • INT линия от чипа Atmel, подключенного к GPIO 53 (это EXT_CONN_GPIO_1 этой платы) и с внешним подтягивающим резистором до 1,8 В.
  • Сброс линии от чипа Atmel отключен.

Что я сделал, чтобы добраться до этой точки, чтобы изменить дерево устройства, чтобы включить устройство Atmel следующим образом:

&i2c_0 { 

    [email protected] { 
    compatible = "atmel,maxtouch"; 
    reg = <0x4a>; 
    interrupt-parent = <&msm_gpio>; 
    interrupts = <53 0>; 
    atmel,panel-coords = <0 0 1024 768>; 
    atmel,display-coords = <0 0 1024 768>; 
    atmel,family-id = <164>; 
    atmel,variant-id = <2>; 
    atmel,version = <21>; 
    atmel,build = <0xaa>; 
    }; 

}; 

Для справки, msm_gpio определяется следующим образом в БСП (нетронутый) ,

&soc { 
     tlmm_pinmux: [email protected] { 
       compatible = "qcom,msm-tlmm-8916"; 
       reg = <0x1000000 0x300000>; 
       interrupts = <0 208 0>; 

       /*General purpose pins*/ 
       gp: gp { 
         qcom,num-pins = <122>; 
         #qcom,pin-cells = <1>; 
         msm_gpio: msm_gpio { 
           compatible = "qcom,msm-tlmm-gp"; 
           gpio-controller; 
           #gpio-cells = <2>; 
           interrupt-controller; 
           #interrupt-cells = <2>; 
           num_irqs = <122>; 
         }; 
       }; 

Я скомпилировал ядро ​​как модуль (CONFIG_TOUCHSCREEN_ATMEL_MXT=m), и я бегу insmod вручную.

То, что я вижу следующее:

  • При использовании утилиты mxt-app Atmel устройство работает: когда я прикасаюсь экран сообщения приходят в, поэтому соединение I2C нормально (но он использует опрос).
  • Вызывается при загрузке драйвера mxt_start, в котором включено прерывание. Я добавил несколько драйверов отладки в драйвер, чтобы убедиться, что он действительно загружается.
  • При загрузке драйвера информационный блок считывается с устройства, а на осциллографе отображаются короткие показания I2C. Адрес I2C считывается из дерева устройств, поэтому я уверен, что загружено мое дерево устройств.
  • Устройство ввода зарегистрировано как /dev/input/event6 и может быть открыто с помощью cat (но при касании экрана не появляются сообщения).
  • Прерывание видно в /proc/interrupts, но никогда не срабатывает (см. Ниже).
  • Всякий раз, когда я касаюсь экрана, линия INT от чипа Atmel вытаскивается с помощью чипа, но на осциллографе не видно трафика I2C.
  • Я проверил, что условие прерывания запуска (0x0, 0x8 или 0x2008 в качестве второго элемента в ячейке прерывания в дереве устройств) не имеет значения вручную вызывая максимумы и минимумы на линии прерывания: нет прерывания не срабатывает в любом случае.

Вступление в /proc/interrupts:

$ cat /proc/interrupts 
... 
326:   0   0   0   0 msm_tlmm_irq maxtouch 
... 

Это то, что появляется в dmesg:

<6>[ 55.290620] atmel_mxt_ts 0-004a: Family: 164 Variant: 2 Firmware V1.5.AA Objects: 43 
<4>[ 55.291252] atmel_mxt_ts 0-004a: Enabling RETRIGEN workaround 
<6>[ 55.365918] atmel_mxt_ts 0-004a: Touchscreen size X1024Y768 
<6>[ 55.367017] input: Atmel maXTouch Touchscreen as /devices/soc.0/78b6000.i2c/i2c-0/0-004a/input/input6 

То, что я понял из чтения коды драйвера в atmel_mxt_ts.c является то, что водитель должен вызвать это прерывание и затем запросить устройство, запустив передачу I2C, чтобы прочитать сообщение T5, после чего устройство вернет список касаний, которые затем передаются на операционная система. Я не нашел документа или документа, правильно объясняющего это, но это то, что я подозреваю, основываясь на том, что я видел до сих пор.

Я испытал штырь GPIO 53 (к которому я обычно подключить линию INT чипа Atmel) вручную, выполнив следующие действия:

$ echo 955 > /sys/class/gpio/export  # 955 because EXP_CONN_GPIO_1 is GPIO pin 53, which has offset 902 
cat /sys/class/gpio/gpio955/value 

изменений это значение при подключении линии INT к V + или земля, поэтому я уверен, что я должен использовать GPIO 53.

Нет GPIO для maxtouch драйвера показан в /sys/kernel/debug/gpio:

$ cat /sys/kernel/debug/gpio 
GPIOs 576-607, platform/qcom,smp2pgpio-ssr-smp2p-4-out.19, master-kernel: 

GPIOs 608-639, platform/qcom,smp2pgpio-ssr-smp2p-4-in.18, slave-kernel: 

GPIOs 640-671, platform/qcom,smp2pgpio-ssr-smp2p-1-out.13, master-kernel: 

GPIOs 672-703, platform/qcom,smp2pgpio-ssr-smp2p-1-in.12, slave-kernel: 

GPIOs 704-735, platform/qcom,smp2pgpio-smp2p-4-out.16, smp2p: 

GPIOs 736-767, platform/qcom,smp2pgpio-smp2p-4-in.14, smp2p: 

GPIOs 768-799, platform/qcom,smp2pgpio-smp2p-1-out.10, smp2p: 

GPIOs 800-831, platform/qcom,smp2pgpio-smp2p-1-in.8, smp2p: 

GPIOs 832-863, platform/qcom,smp2pgpio-smp2p-7-out.6, smp2p: 

GPIOs 864-895, platform/qcom,smp2pgpio-smp2p-7-in.4, smp2p: 

GPIOs 896-899, spmi/qpnp-pin-ffffffc031550c00, pm8916-gpio: 
gpio-898 (qcom,hub-reset-gpio) out hi 
gpio-899 (qcom,sw-sel-gpio ) in lo 

GPIOs 900-901, spmi/qpnp-pin-ffffffc031550800, pm8916-mpp: 

GPIOs 902-1023, platform/1000000.pinctrl, msm_tlmm_gpio: 
gpio-922 (adv7533_hpd_irq_gpio) in lo 
gpio-923 (led1    ) out lo 
gpio-927 (disp_rst_n   ) in hi 
gpio-933 (adv7533_irq_gpio ) in hi 
gpio-934 (hdmi_lvds   ) in lo 
gpio-940 (7864900.sdhci cd ) in hi 
gpio-1009 (volume_up   ) in hi 
gpio-1010 (camera_focus  ) in hi 
gpio-1011 (camera_snapshot ) in hi 
gpio-1022 (led2    ) out lo 
gpio-1023 (USB_ID_GPIO  ) in hi 

Я сформулированный несколько сек полезные вопросы, чтобы помочь решить головоломку:

  • Каков правильный способ регистрации прерывания? Я использую interrupt-parent = <&msm_gpio>; и interrupts = <53 0> для идентификации булавки GPIO 53 Snapdragon. Я тестировал как с <53 0>, так и с <53 8>.
  • Я иногда вижу, что люди используют 0x2008 как вторую запись в ячейке. Я думаю, что 0x0008 должен установить прерывание для запуска на уровне LOW, но что делает 13-й бит? Я тестировал как с 0x0, так и с 0x8, не имеет значения (пока :-)).
  • Должен ли я ожидать ввода в /sys/kernel/debug/gpio?
  • Есть ли дополнительные записи в дереве устройств, необходимые для подключения прерывания maxtouch к физическому выводу?
  • Откуда берутся номер IRQ 326 в /proc/interrupts, и есть ли способ проверить, с чем он связан?
  • Возможно ли настроить, что линия INT будет отключена Snapdragon, вместо того, чтобы использовать внешний резистор подтягивания?

Заранее за вашу помощь.

PS: А тангенциально связан вопрос: как я могу быстро проверить обновления дерева устройств без необходимости ждать 20 минут для всех Makefiles, чтобы загрузить и ядро ​​пересобрать, а затем прошить новый boot.img к устройству и перезагрузки ? Я использую команду make bootimage.

+1

Любое обновление по этому вопросу? Удалите его, чтобы решить его;) Я также сталкиваюсь с аналогичной проблемой на доске Snapdragon 820. – dheeraj

+0

Привет @dheeraj, спасибо, что напомнил мне, чтобы опубликовать ответ. Ниже приведена конфигурация дерева устройств, которая решила проблему для меня, я надеюсь, что она вам поможет. Если вам потребуются дополнительные шаги или у вас есть дополнительные вопросы, сообщите мне, тогда я уточню ответ, если смогу. –

ответ

2

Выяснив, что уже более или менее рабочее определение сенсорного экрана в дереве устройств, но что штыри разные, я в конечном итоге с помощью следующего дерева устройств:

&i2c_0 { 

    [email protected] { 
    compatible = "atmel,maxtouch"; 
    reg = <0x4a>; 
    interrupt-parent = <&msm_gpio>; 
    interrupts = <53 0x2008>; 
    pinctrl-names = "pmx_ts_active","pmx_ts_suspend","pmx_ts_suspend"; 
    pinctrl-0 = <&ts_int_active &ts_reset_active>; 
    pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; 
    pinctrl-2 = <&ts_release>; 
    atmel,irq-gpio = <&msm_gpio 53 0x2008>; 
    atmel,reset-gpio = <&msm_gpio 54 0>; 
    atmel,panel-coords = <0 0 800 480>; 
    atmel,display-coords = <0 0 800 480>; 
    atmel,family-id = <164>; 
    atmel,variant-id = <2>; 
    atmel,version = <21>; 
    atmel,build = <0xaa>; 
    }; 

}; 

так, следующие линии различны:

interrupts = <53 0x2008>; 
pinctrl-names = "pmx_ts_active","pmx_ts_suspend","pmx_ts_suspend"; 
pinctrl-0 = <&ts_int_active &ts_reset_active>; 
pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; 
pinctrl-2 = <&ts_release>; 
atmel,irq-gpio = <&msm_gpio 53 0x2008>; 
atmel,reset-gpio = <&msm_gpio 54 0>; 

0x2008 необходимо сделать Snapdragon тянуть эту линию прерывания и триггер на падающем фронте.

pinctrl определения уже находились в qcom/msm8916-pinctrl.dtsi, который поставляется с БСП, однако, для моего случая я должен был изменить шпильку 12 до 54 и штифт 13 до 53:

diff --git a/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi 
index 204c718..80a2a6d 100644 
--- a/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi 
+++ b/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi 
@@ -30,16 +30,6 @@ 
         }; 
       }; 

-    atmel-int-pin { 
-      qcom,pins = <&gp 53>; 
-      qcom,num-grp-pins = <1>; 
-      label = "atmel-int-pin"; 
-      default { 
-        drive-strength = <0>; 
-        bias-pull-up; 
-      }; 
-    }; 
- 
       ext-cdc-tlmm-lines { 
         qcom,pins = <&gp 116>, <&gp 112>, <&gp 117>, 
               <&gp 118>, <&gp 119>; 
@@ -1175,7 +1165,7 @@ 

       /* add pingrp for touchscreen */ 
       pmx_ts_int_active { 
-      qcom,pins = <&gp 13>; 
+      qcom,pins = <&gp 53>; 
         qcom,pin-func = <0>; 
         qcom,num-grp-pins = <1>; 
         label = "pmx_ts_int_active"; 
@@ -1187,7 +1177,7 @@ 
       }; 

       pmx_ts_int_suspend { 
-      qcom,pins = <&gp 13>; 
+      qcom,pins = <&gp 53>; 
         qcom,pin-func = <0>; 
         qcom,num-grp-pins = <1>; 
         label = "pmx_ts_int_suspend"; 
@@ -1199,7 +1189,7 @@ 
       }; 

       pmx_ts_reset_active { 
-      qcom,pins = <&gp 12>; 
+      qcom,pins = <&gp 54>; 
         qcom,pin-func = <0>; 
         qcom,num-grp-pins = <1>; 
         label = "pmx_ts_reset_active"; 
@@ -1211,7 +1201,7 @@ 
       }; 

       pmx_ts_reset_suspend { 
-      qcom,pins = <&gp 12>; 
+      qcom,pins = <&gp 54>; 
         qcom,pin-func = <0>; 
         qcom,num-grp-pins = <1>; 
         label = "pmx_ts_reset_suspend"; 
@@ -1223,7 +1213,7 @@ 
       }; 

       pmx_ts_release { 
-      qcom,pins = <&gp 13>, <&gp 12>; 
+      qcom,pins = <&gp 53>, <&gp 54>; 
         qcom,num-grp-pins = <2>; 
         label = "pmx_ts_release";