Wir ersetzen die Boot-Animation eines Android-Geräts durch flackernde Protokolle des Linux-Kernels

    Nachdem ich einen benutzerdefinierten Bootloader für mein Telefon entwickelt hatte, wollte ich die Anzeige von Kernprotokollen auf dem Display implementieren, wie dies bei Desktop-Linux-Distributionen möglich ist. Und das alles, weil es beim Booten des Telefons viel interessanter ist, die blinkenden kmsg-Protokolle anzusehen, als das Bootloader-Logo und dann die Bootanimation des Android-Systems. Seit zwei Jahren ist "langweilige Tapete" langweilig.

    Jetzt werde ich versuchen, kurz auf das LLCON-Modul für den Android-Kernel einzugehen, das die Ausgabe von kmsg-Protokollen auf niedriger Ebene auf dem Display implementiert.

    Ich werde gleich erwähnen, dass es in jedem Linux-Kernel ein Modul gibt, das sich mit der Anzeige von Kernprotokollen auf dem Bildschirm befasst. Dieser Kernelmechanismus wird durch Angabe der Option FRAMEBUFFER_CONSOLE aktiviert. Dieser Mechanismus funktioniert jedoch nur über den Bildschirmtreiber, der normalerweise in der allerletzten Runde (late_init) initialisiert wird. Aufgrund dieser Funktion wird das primäre Bootloader-Logo für einige Zeit angezeigt.

    Die Worte "Low-Level-Abschluss" verwende ich nicht beiläufig, weil Das LLCON-Modul arbeitet direkt mit dem Videospeicher (erinnern Sie sich sofort an das junge Handwerk für MS-DOS) und nimmt gleichzeitig seine Arbeit auf, bevor die internen Linux-Kerneltreiber (early_init) initialisiert werden. Mit diesen Funktionen kann LLCON Kernel-Protokolle so schnell wie möglich auf dem Bildschirm anzeigen.

    Nach dem Hinzufügen des LLCON-Moduls sollten die folgenden Optionen zur Kernelkonfiguration hinzugefügt werden:
    CONFIG_VT=y
    CONFIG_LLCON=y
    CONFIG_FONTS=y
    CONFIG_FONT_6x11=y
    CONFIG_FONT_8x16=y
    CONFIG_FONT_SUN12x22=y

    In diesem Fall habe ich 3 verschiedene Schriften angegeben, weil Im Bootloader, den ich verwende, können Sie eine beliebige Schriftart auswählen. Wenn Sie jedoch die Mindestgröße des Kernel-Image einhalten müssen, sollten Sie nur eine Schriftart angeben.

    Vergessen Sie nicht, BoardConfig zunächst eine neue Kernel-Option hinzuzufügen, bevor Sie mit der Assemblierung des geänderten Kernels beginnen:
    androidboot.llcon=,,,,,,,,,

    Dekodierung von Parametern
    • Modus:
      0 = LLCON deaktiviert
      1 = synchrone Protokollausgabe (Seite für Seite scrollen)
      2 = asynchrone Protokollausgabe (Seite für Zeile scrollen)
    • delay:
      Verzögerung in Millisekunden (wird in dem Stream verwendet, der die Grafiken auf dem Bildschirm anzeigt; der empfohlene Wert ist 100)
    • Textumbruch:
      0 = Textumbruch
      ist nicht erlaubt 1 = Textumbruch ist erlaubt
    • fb_addr:
      physikalische Adresse von FrameBuffer
    • fb_bpp:
      Pixelformat anzeigen (jetzt ignoriert)
    • fb_height:
      Höhe in Pixeln anzeigen
    • fb_width:
      Anzeigebreite in Pixel
    • fb_stride:
      Größe einer Zeile in Pixel oder Bytes
    • font_size:
      Schriftgröße (unterstützte Werte: 6, 8, 10, 12)
    • font_color:
      Zeichenfarbe im HEX-Format

    Ein Beispiel:
    androidboot.llcon=2,100,0,0x03200000,24,1280,720,720,8,0xFFFFFF

    So ermitteln Sie den Wert des Parameters fb_addr
    Die physikalische Adresse von FrameBuffer kann im DeviceTree des zusammengesetzten Kernels ausspioniert werden. Suchen Sie dazu im Zweig "qcom, mdss_fb_primary" nach dem Parameter "qcom, memblock-reserve". Sehr oft erscheint die Adresse von FrameBuffer in den kmsg-Protokollen des Kernels.


    Ich werde die Quellcodes des LLCON-Moduls hier nicht vollständig kopieren, sondern nur auf die entsprechenden Patches verweisen:

    Es ist auch erwähnenswert, dass ohne Abschluss des Init-Moduls (das sich auf der Ramdisk befindet) beim Initialisieren der Android-Subsysteme die Startanimation abgespielt wird. Wenn Sie LLCON verwenden, sollten Sie daher das Deaktivieren der Startanimation, die diesen Patch ausführt, automatisieren .

    Demonstration des Betriebs des LLCON-Moduls:

    • LLCON 1 - Paginierung, Schriftart 6 x 11

    • LLCON 2 - Zeile für Zeile, Schriftart 8x16


    Das LLCON-Modul verfügt außerdem über zusätzliche Funktionen, die nützlich sind für:
    • Empfangen von kmsg-Protokollen im Notfall eines SoC-Neustarts (wenn sogar last_kmsg nutzlos ist);
    • Kernel-Debugging zu einem sehr frühen Zeitpunkt der Initialisierung (wenn JTAG und UART nicht verfügbar sind).

    Aber ich werde versuchen, das nächste Mal über diese Möglichkeiten von LLCON zu berichten.

    Jetzt auch beliebt: