Framework-Analyse des TP-Treibers (Touchscreen) unter Linux

 Der TP-Treiber ist auch der Touchscreen-Treiber. Im Allgemeinen werden Touchscreens in Widerstandsbildschirme oder kapazitive Bildschirme unterteilt, und die meisten davon sind jetzt kapazitive Bildschirme. Beteiligt: ​​Interrupt ---> IIC-Subsystem ---> Eingabesubsystem. Der allgemeine Prozess besteht darin, dass beim Berühren des Bildschirms mit einem Finger ein Interrupt in der CPU generiert wird und die untere Hälfte des Interrupts den IIC-Bus durchläuft, um relevante Informationen vom TP-IC zu lesen und die Daten dann über den zu analysieren Zu erhaltendes Eingabesubsystem. Entscheiden Sie, welches Ereignis aufgerufen werden soll.

Was ist ein Interrupt: Interrupts unter linux_Croxds Blog-CSDN-Blog

IIC-Subsystem: (nehmen Sie GT9XX als Beispiel)

  • Grundwissen:
    • Die drei Kommunikationsleitungen SCL, SDA und GND sind synchrone, serielle, Level-, Low-Speed- und Short-Distance-Busstrukturen und unterstützen den Anschluss mehrerer Geräte an denselben Bus.
    • In der Master-Slave-Struktur muss einer der Kommunikationspartner der Master (Master) und der andere der Slave (Slave) sein. Das Master-Gerät übernimmt bei jeder Kommunikation die Initiative und das Slave-Gerät reagiert passiv entsprechend dem Rhythmus von das Master-Gerät. Jedes Slave-Gerät hat eine eindeutige Adresse (Slave-Adresse) im Bus, und das Master-Gerät findet das Slave-Gerät, mit dem es kommunizieren möchte, über die Slave-Adresse (im Wesentlichen Broadcast).
    • Der Hauptzweck von I2C ist die Kommunikation zwischen dem Haupt-SoC und Peripheriegeräten. Der größte Vorteil besteht darin, dass die Unterstützung mehrerer Peripheriegeräte am Bus erweitert werden kann. Verschiedene gängige IoT-Sensorchips (z. B. gsensor, Temperatur, Luftfeuchtigkeit, Lichtintensität, pH-Wert, Rauchkonzentration, Druck usw.) nutzen die I2C-Schnittstelle zur Verbindung mit dem Haupt-SoC.
    • Mehrere Pins des kapazitiven Touchscreen-Chips bilden zwei Schnittstellen. Eine Schnittstelle ist I2C, die für die Verbindung mit dem Haupt-SoC (selbst als Slave-Gerät) verantwortlich ist. Der Haupt-SoC initialisiert und steuert den kapazitiven Touchscreen-Chip über diese Schnittstelle, und der Chip meldet Berührungsereignisinformationen (Berührungskoordinaten usw.). ) an den SoC über diese Schnittstelle. Wir verwenden Kapazität. Beim Berühren des Bildschirms liegt der Fokus auf dieser Schnittstelle. Die andere Schnittstelle ist die Verwaltungsschnittstelle des kapazitiven Touchpanels, über die der kapazitive Touchscreen-Chip die Touchpanel-Hardware steuert. Diese Schnittstelle ist das, was Unternehmen für kapazitive Touchscreens am Herzen liegt. Ihre interne Firmware-Programmierung des Touchscreen-Chips muss sich um diesen Teil kümmern. Diejenigen von uns, die kapazitive Touchscreens verwenden, kümmern sich nicht darum.
  • Verstehen Sie die vier Schlüsselstrukturen von IIC: Die Registrierungsinformationen von i2c_client dienen dazu, bei der Registrierung über i2c_adapter die I2C-Geräteinformationen aus der i2c_board_info-Struktur von i2c_register_board_info () abzurufen, die die Adresse des Slaves enthält. (Allerdings ist es jetzt bequemer, den Gerätebaum zum Übertragen von Parametern zu verwenden.)
    (1) struct i2c_adapter IIC-Adapter
    (2) struct i2c_algorithm IIC-Algorithmus, Timing
    (3) struct i2c_client IIC (Slave) Geräteinformationen
    (4) struct i2c_driver IIC (Slave-)Gerätetreiber
  • Rufen Sie den Initialisierungscode module_init  (goodix_ts_init) auf ----> i2c_add_driver(&goodix_ts_driver) IIC-Treiberregistrierung ----> goodix_ts_driver ----> of_match_table ----> goodix_match_table
  • goodix_ts_probe  (). goodix_match_table.kompatible = „goodix,gt9xx“ stimmt mit der Kompatibilität in der DTSI-Datei überein, dann führen Sie die Probe aus
    • i 2c_check_functionality  (Client->Adapter, I2C_FUNC_I2C). Fähigkeitstest des IIC-Adapters. Wenn der Adapter nicht ausreicht, wird ein Fehler ausgegeben
    • gtp_parse_dt  (&client->dev). Holen Sie sich INT-Interrupt- und RST-Pin-Informationen aus dem DST-Gerätebaum
    • INIT_WORK  (&ts->work, goodix_ts_work_func). Initialisieren und erstellen Sie eine Arbeitswarteschlange. Nachdem der Interrupt ausgelöst wurde, wird die Ereignisverarbeitung in der unteren Hälfte platziert und die Funktion goodix_ts_work_func in der Warteschlange aufgerufen, um den Koordinatenwert zu berechnen und zu melden
    • gtp_request_io_port  (ts). Beantragen Sie beim System die erforderlichen IO-Ports: INT, RST
    • gtp_get_chip_type  (ts). Wenn der Lese-IC vom Typ CHIP_TYPE_GT9F ist, wird der erste Download durchgeführt. HIP_TYPE_GT9F: Das interne ist NAND-Flash, das jedes Mal heruntergeladen werden muss. CHIP_TYPE_GT9: Das interne ist NAND-Flash. Sofern die Konfigurationsdatei nicht aktualisiert werden muss, muss sie nicht jedes Mal heruntergeladen werden.
    • gtp_i2c_test  (Client). Testen Sie, ob die IIC-Kommunikation normal ist
    • gtp_read_version  (Client, &version_info). Versionsinformationen abrufen
    • gtp_init_panel  (ts). Initialisieren Sie die Firmware-Parameter
    • gtp_esd_switch  (Client, SWITCH_ON). ESD-Antistatik-Öffnung
    • gup_init_update_proc  (ts). Erstellen Sie einen Thread, um die TP-Firmware zu aktualisieren
    • gtp_request_input_dev  (ts). Registrieren Sie sich beim Eingabe-Eingabe-Subsystem
      • input_allocate_device (): Weisen Sie dem Eingabegerät den entsprechenden Speicherplatz zu
      • ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; Funktionen deklarieren: Unterstützung für Synchronisation, Schlüssel, absolute Koordinaten
      • input_set_capability (ts->input_dev, EV_KEY, touch_key_array[index]); // Wenn ein Schlüssel vorhanden ist, muss er das Schlüsselereignis deklarieren, das verarbeitet werden kann. Dies bezieht sich hier auf die Menütaste, das HMOE-Schwert und die Eingabetaste
      • input_set_capability (ts->input_dev , EV_KEY, KEY_POWER); Wenn Sie gleitendes Aufwecken definieren, deklarieren Sie Energieereignisse
      • input_set_abs_params (ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); Multi-Touch-Informationen werden von ABS_MT übertragen und in einer bestimmten Reihenfolge gesendet, z. B. ABS_MT_POSITION_X, ABS_MT_POSITION_Y. Anschließend wird durch Aufrufen von input_mt_sync ein SYN_MT_REPORT generiert () event Um das Ende eines Punktes und die Vervollständigung eines Datenrahmens zu markieren, ist input_sync(); erforderlich.
      • input_set_abs_params (ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0) Die Berührungsrichtung kann durch ABS_MT_TOUCH_MAJOR, ABS_MT_WIDTH_MAJOR, ABS_MT_MT_MAJOR bereitgestellt werden
      • input_set_abs_params (ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); Wird zur Unterstützung der Hardware-Verfolgung von Mehrpunktinformationen verwendet, d. h. zu welcher Zeile das Geschäft gehört usw.
      • input_register_device (ts->input_dev) Register-Eingabesubsystem
    • gtp_request_irq (ts); //Interrupt anfordern
      • request_irq (ts->client->irq, goodix_ts_irq_handler, irq_table[ts->int_trigger_type], ts->client->name, ts); Interrupt-Anwendungsfunktion, die Funktion, die die Interrupt-Leitung und -Bindung angibt, ist goodix_ts_irq_handler, falls sie auftritt Diese Funktion wird bei einer Unterbrechung aufgerufen. Parameter 1: Interrupt-Leitung: 2: Interrupt-Funktion, 3: Trigger-Methode: 4: Gerätename, 5: Private Daten.
        • queue_work (goodix_wq, &ts->work);  
          • goodix_wq : goodix_wq=create_singlethread_workqueue("goodix_wq"); // Erstellen Sie in der Funktion goodix_ts_init eine Arbeitswarteschlange und einen Arbeitsthread und erstellen Sie während der Initialisierung einen Thread
          • &ts->work : NIT_WORK(&ts->work,goodix_ts_work_func); Füge die Aufgabe „goodix_ts_work_func“ zur Arbeitswarteschlange &ts->work hinzu. Das heißt, wenn die Interrupt-Funktion ausgelöst wird, wird die Interrupt-Funktion goodix_ts_irq_handler() ausgeführt. Die Interrupt-Funktion steht vor der Warteschlangenplanung und ruft goodix_ts_work_func() in der Warteschlange auf. Die Berechnung, Berichterstellung und Mehrpunktverarbeitung von Koordinatenpunkten ist alles in dieser Funktion ausgeführt.
      • goodix_ts_timer_handler (). Wenn die Anwendung aufgrund begrenzter Ressourcen oder anderer Faktoren fehlschlägt, wird ein Abfragemechanismus zur Verarbeitung verwendet. Der Abfragemechanismus besteht darin, einen Timer für die Verarbeitung zu definieren. hrtimer ist ein hochpräziser Timer, und diese Funktion wird aufgerufen, wenn der Timer abläuft. Rufen Sie dann hrtimer_start() auf, um die Timer-Funktion zu starten.
    • init_wr_node (client); // Wenn eine Lese-/Schreibknotenschnittstelle basierend auf der Schnittstelle dieses Knotens erstellt wird, ist es für die Benutzerebene bequem, mit dem Kernel zu kommunizieren
    • epay_pindev_register (&ts->pindev); // als PIN-Eingabegerät registrieren
    • ts->tp_power_status = 1 ; // Hier auf 1 setzen, um anzuzeigen, dass alle Initialisierungsprüfungen erfolgreich waren

Eingabesubsystem:

  • Ereignisverarbeitungsschicht: Eingabeereignis, das die von der Kernschicht übertragenen Daten so verarbeitet, dass der Benutzer sie verstehen kann, dh sie dem Benutzer in Form einer Ereignisstruktur präsentiert. 
  • Kernschicht: Stellen Sie eine standardisierte Schnittstelle für die Gerätetreiberschicht bereit und übertragen Sie die von der Gerätetreiberschicht erhaltenen Daten an die Ereignisverarbeitungsschicht.
  • Gerätetreiberschicht: Realisieren Sie den Lese- und Schreibzugriff auf Hardwaregeräte, unterbrechen Sie die Einstellung und übertragen Sie die Berührungskoordinateninformationen an die Ereignisverarbeitungsschicht, indem Sie die Schnittstelle der Kernschicht aufrufen. Dieser Teil muss vom Fahreringenieur erledigt werden.

おすすめ

転載: blog.csdn.net/weixin_42432281/article/details/114036130