ACPI: Hinzufügen von Geräten ohne Kernel-Neukompilierung

Wie sich herausstellt, sind sich nur wenige der Existenz eines Overlay-Modus in ACPICA und ihrer Unterstützung unter Linux bewusst. Ich möchte diese Lücke mit dem Beispiel füllen, I2C-Slaves zum System hinzuzufügen, ohne sie neu zu kompilieren.

Ausgangsbedingungen


Sagen wir beim Start

i2cdetect -y -r 0 

Wir haben das folgende Bild:

I2cdetect Ausgabe
      0 1 2 3 4 5 6 7 8 9 abcdef
 00: - - - - - - - - - - - - - - 
 10: - - - - - - - - - - - - - - - - - - 
 20: - - - - - - - - - - - - - - - - - - 
 30: - - - - - - - - - - - - - - - - - - 
 40: - - - - - - - - - - - - - - - - - - 
 50: - - - 53 - - - 57 - - - - - - - - - 
 60: - - - - - - - - - - - - - - - - - - 
 70: - - - - - - - - -                         


Dabei wird der ADXL345-Beschleunigungsmesser an der Adresse 0x53 erkannt und der 24c128-Speicher-EEPROM-Chip an der Adresse 0x57. Beschreibungen dieser Geräte sind in ACPI nicht verfügbar, nämlich in der DSDT- Tabelle.

ADXL345 Beschleunigungsmesser hinzufügen


Alles, was wir hier wissen müssen, ist die Adresse, unter der das Gerät antwortet, seine vom Treiber unterstützte ID, die Frequenz des Busses, auf dem es arbeiten soll. Bitte beachten Sie, dass die Frequenz des I2C-Busses auf der Fahrerseite häufig auf das Minimum eingestellt ist, das von allen Slave-Geräten auf diesem Bus unterstützt wird!

Oh ja, es gab eine Zeit, in der das IIO- Subsystem nicht existierte und der ADXL345-Treiber bereits existierte. Wir verwenden also eine neue , die über das IIO-Subsystem verfügbar ist.

Insgesamt

  • Adresse: 0x53
  • Busfrequenz: 400 kHz
  • Verbindung zum Master-Gerät (Controller): \ _SB.PCI0.I2C1
  • ID: adi, adxl345

Es ist zu beachten, dass wir hier eine spezielle Kennung verwenden, die für Systeme mit OF vorgesehen ist . Als Schicht in ACPI wurde eine spezielle Kennung PRP0001 hinzugefügt, die die Kompatibilität mit Treibern gewährleistet, die zuvor für OF geschrieben wurden.

Wir übersetzen die erhaltenen Informationen in ASL :

ASL-Code für ADXL345-Beschleunigungsmesser
 DefinitionBlock ("adxl345.aml", "SSDT", 5, "", "ADXL345", 1) { External (_SB_.PCI0.I2C1, DeviceObj) Scope (\_SB.PCI0.I2C1) { Device (ACL0) { Name (_HID, "PRP0001") Name (_DDN, "Analog Devices ADXL345 3-axis accelerometer") Name (_CRS, ResourceTemplate () { I2cSerialBusV2 ( 0x0053, // I2C Slave Address ControllerInitiated, 400000, // Bus speed AddressingMode7Bit, "\\_SB.PCI0.I2C1", // Link to ACPI I2C host controller 0 ) }) Name (_DSD, Package () { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "compatible", "adi,adxl345" }, } }) } } } 


Fügen Sie das EEPROM 24c128 hinzu


Wie im vorherigen Fall erhalten wir die erforderlichen Informationen über das Gerät und seinen Treiber:

  • Adresse: 0x57
  • Busfrequenz: 400 kHz
  • Verbindung zum Master-Gerät (Controller): \ _SB.PCI0.I2C1
  • ID-Nummer: INT3499
  • Band: 1024
  • Seitengröße: 32

ASL-Code für EEPROM 24c128
 DefinitionBlock ("at24.aml", "SSDT", 5, "", "AT24", 1) { External (_SB_.PCI0.I2C1, DeviceObj) Scope (\_SB.PCI0.I2C1) { Device (EEP0) { Name (_HID, "INT3499") Name (_DDN, "Atmel AT24 compatible EEPROM") Name (_CRS, ResourceTemplate () { I2cSerialBusV2 ( 0x0057, // I2C Slave Address ControllerInitiated, 400000, // Bus speed AddressingMode7Bit, "\\_SB.PCI0.I2C1", // Link to ACPI I2C host controller 0 ) }) Name (_DSD, Package () { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "size", 1024 }, Package () { "pagesize", 32 }, } }) } } } 


Beachten Sie den Unterschied zur vorherigen Option. Es verwendet direkt die ACPI-ID, die dank der Intel Galileo-Plattform in dem von Intel kontrollierten Bereich zugewiesen wird. Der zweite Unterschied besteht darin, dass wir zusätzliche Geräteparameter in Form von Schlüsselwertzeichenfolgen übergeben.

Mögliche Initialisierungsoptionen


Was tun mit all dem? Der Algorithmus ist einfach. Zunächst müssen Sie die resultierenden Dateien in ASL-Bytecode kompilieren. Wird durch Aufrufen eines Befehls erreicht

 iasl adxl345.asl 

und analog für EEPROM. Zweitens wählen Sie eine Möglichkeit, die neu erstellte Tabelle zu initialisieren. Es gibt tatsächlich drei davon: 1) Beitreten zu initramfs, 2) Laden auf das Arbeitssystem über ConfigFS, 3) Laden der Tabelle aus der EFI-Variablen. Betrachten Sie die ersten beiden unten.

Initramfs beitreten

Wir werden mit dem initramfs- Archiv selbst nichts anfangen. Es wird jedoch empfohlen, das Original irgendwo beiseite zu legen.

 #  ACPI    cpio . #      /kernel/firmware/acpi  . #       . mkdir -p kernel/firmware/acpi cp adxl345.aml kernel/firmware/acpi cp at24.aml kernel/firmware/acpi #         initramfs: find kernel | cpio -H newc --create > /boot/instrumented_initramfs-vX.Y cat /boot/initramfs-vX.Y >> /boot/instrumented_initramfs-vX.Y 

Nach diesem Vorgang können Sie das alte Archiv durch ein neues ersetzen und den Computer neu starten.
So etwas sollte in der dmesg-Ausgabe erscheinen:

 [ 0.000000] ACPI: Table Upgrade: install [SSDT- - ADXL345] [ 0.000000] ACPI: SSDT 0x000000003F4FF5C4 0000A6 (v05 ADXL345 00000001 INTL 20170303) 

Beachten Sie, dass der Kernel nur eine Kette von bis zu 64 solcher Archive unterstützt.

Download über ConfigFS

Diese Funktion ist verfügbar, wenn der Kernel mit der Option CONFIG_ACPI_CONFIGFS kompiliert und ConfigFS bereitgestellt wird. Angenommen, es ist im Unterverzeichnis / sys / kernel / config gemountet, zeigt das folgende Beispiel, wie eine Tabelle geladen wird.

 cd /sys/kernel/config/acpi/table mkdir adxl345 cat ~/adxl354.aml > adxl345/aml 

Fazit


Obwohl ASL mehr Klammern als Analoga erfordert, bietet es dennoch nicht weniger Möglichkeiten, Geräte zu beschreiben. Es gibt also eine Reihe von Beispielen im Meta-ACPI- Projekt, in denen Sie insbesondere Beschreibungen von LEDs und Tasten finden, die mit GPIO-Leitungen, Speicherchips verbunden sind, und sogar eine Beschreibung des Adafruit 2.8 " -Moduls - TFT-Display mit Touchscreen!

Source: https://habr.com/ru/post/de451668/


All Articles