2017-02-21 2 views
2

J'ai des difficultés à faire fonctionner un écran tactile alimenté par un Atmel MXT641T sur une plate-forme Android 5.Comment configurer correctement l'interruption pour la ligne INT de la puce tactile Atmel MXT641T dans l'arborescence des périphériques du noyau Android 5?

La configuration j'est la suivante:

  • Matériel: Inforce 6309 SBC avec Qualcomm Snapdragon 410 msm8916 processeur ARM64.
  • Écran tactile personnalisé avec puce contrôleur Atmel MXT641T.
  • Connexion I2C entre Atmel et Snapdragon connecté à I2C0.
  • système Android 5 d'exploitation en utilisant le noyau Linux 3.10 de git://codeaurora.org/kernel/msm-3.10.git branche Rel_V1.3 (cela fait partie du BSP qui vient avec le SBC) ...
  • ... mais avec la dernière version du pilote Atmel atmel_mxt_ts.c superposé au noyau (mais aussi testé avec la version atmel_maxtouch_ts.c en msm-3.10.git qui montre le même comportement).
  • Ligne INT de la puce Atmel connectée à GPIO 53 (EXT_CONN_GPIO_1 de cette carte) et avec résistance de rappel externe à 1,8V.
  • La ligne RESET de la puce Atmel est déconnectée.

Ce que je fait pour arriver à ce point est de modifier l'arborescence des périphériques pour inclure le dispositif Atmel comme suit:

&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>; 
    }; 

}; 

Pour référence, le msm_gpio est défini comme suit dans le BSP (intacte) .

&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>; 
         }; 
       }; 

Je compilé le noyau en tant que module (CONFIG_TOUCHSCREEN_ATMEL_MXT=m) et je suis en cours d'exécution insmod manuellement.

Ce que je vois est la suivante:

  • Lorsque vous utilisez l'utilitaire Atmel mxt-app l'appareil fonctionne: quand je touche les messages d'écran viennent, donc la connexion I2C est ok (mais il utilise polling).
  • Lors du chargement du pilote mxt_start est appelé, dans lequel l'interruption est activée. J'ai ajouté un certain nombre d'instructions de débogage au pilote pour vérifier qu'il est en train de charger.
  • Lors du chargement du pilote, le bloc d'informations est lu sur le périphérique et les informations sur le trafic I2C sont affichées sur l'oscilloscope. L'adresse I2C est lue dans l'arborescence des périphériques, donc je suis sûr que mon arborescence est chargée.
  • Le périphérique d'entrée est enregistré sous le numéro /dev/input/event6 et peut être ouvert avec cat (mais aucun message n'apparaît lorsque vous touchez l'écran).
  • L'interruption est visible dans /proc/interrupts mais ne se déclenche jamais (voir ci-dessous).
  • Chaque fois que je touche l'écran, la ligne INT de la puce Atmel est tirée bas par la puce, mais aucun trafic I2C n'est visible sur l'oscilloscope. J'ai vérifié que la condition de déclenchement d'interruption (0x0, 0x8 ou 0x2008 en tant que second élément dans la cellule d'interruption de l'arborescence) n'a pas d'importance en provoquant manuellement des hauts et des bas sur la ligne d'interruption: aucune interruption n'est déclenchée.

Entrée en /proc/interrupts:

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

C'est ce qui apparaît dans 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 

Ce que je comprends à la lecture du code du pilote dans atmel_mxt_ts.c est que le conducteur doit déclencher sur cette interruption ligne, puis interroger le périphérique en démarrant un transfert I2C pour lire le message T5, sur lequel le périphérique va retourner une liste de touches qui sont ensuite transmis à la système opérateur. Je n'ai pas trouvé une fiche technique ou un document expliquant correctement ceci, mais c'est ce que je soupçonne d'après ce que j'ai vu jusqu'ici.

j'ai testé la broche GPIO 53 (auquel je connecte normalement la ligne INT de la puce Atmel) manuellement en procédant comme suit:

$ 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 

Cette valeur change lorsque je connecte la ligne INT à V + ou sol, je suis sûr que je dois utiliser GPIO 53.

Pas GPIO pour le conducteur MaxTouch est indiqué dans /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 

Je formulerait des s questions spécifiques pour aider à résoudre le puzzle:

  • Quelle est la bonne façon d'enregistrer l'interruption? J'utilise interrupt-parent = <&msm_gpio>; et interrupts = <53 0> pour identifier la broche GPIO 53 du Snapdragon. J'ai testé avec les deux <53 0> et <53 8>.
  • Je vois parfois des gens utiliser 0x2008 comme deuxième entrée dans la cellule. Je pense que le 0x0008 est de mettre l'interruption à déclencher au niveau BAS, mais que fait le 13-ème bit? J'ai testé avec les deux 0x0 et 0x8, ne fait pas de différence (encore :-)).
  • Devrais-je m'attendre à une entrée dans /sys/kernel/debug/gpio?
  • Des entrées supplémentaires sont-elles nécessaires dans l'arborescence des périphériques pour connecter l'interruption maxtouch à la broche physique? D'où vient le numéro IRQ 326 de /proc/interrupts, et existe-t-il un moyen de vérifier à quelle broche il est lié?
  • Est-il possible de configurer que la ligne INT sera tirée par le Snapdragon, au lieu d'avoir à utiliser une résistance de pull-up externe?

Merci d'avance pour votre aide.

PS: Et une question qu'accessoirement liés: comment puis-je tester rapidement les mises à jour de l'arborescence des périphériques sans avoir à attendre 20 minutes pour tous les Makefile pour charger et le noyau de recompiler puis flasher le nouveau boot.img au dispositif et redémarrage ? J'utilise la commande make bootimage.

+1

Toute mise à jour sur cette question? Dis que vous parvenez à le résoudre;) Je suis également confronté à un problème similaire sur Snapdragon 820 board. – dheeraj

+0

Salut @dheeraj, merci de me rappeler d'afficher la réponse. S'il vous plaît voir ci-dessous pour la configuration de l'arborescence de l'appareil qui a résolu le problème pour moi, j'espère que cela vous aide. Si vous avez besoin d'autres étapes ou si vous avez d'autres questions, faites-le moi savoir, je vais affiner la réponse si je le peux. –

Répondre

2

Après avoir découvert qu'il existe déjà une définition de l'écran tactile de travail plus ou moins dans l'arborescence des périphériques mais que les broches sont différentes, je me suis retrouvé avec l'arborescence des périphériques suivants:

&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>; 
    }; 

}; 

, les mentions suivantes lignes sont différentes:

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>; 

le 0x2008 est nécessaire pour faire le Snapdragon tirer cette ligne d'interruption et de déclenchement sur le front descendant.

Les définitions pinctrl étaient déjà situés dans qcom/msm8916-pinctrl.dtsi qui vient avec le BSP, cependant, pour mon cas, je devais changer la broche 12 à 54 et la broche 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";