Formlabs form 3 is dead

by

Naprawa Formlabs Form 3+: awaria SOM i czarny ekran śmierci

Mój Formlabs Form 3+ przestał się uruchamiać bez żadnej aktualizacji firmware'u i bez zaniku zasilania. Jak zdiagnozowałem to do poziomu sprzętu: wlutowanie konsoli szeregowej, czytanie logu bootowania, znalezienie uszkodzonej biblioteki C i odczyt pamięci boot przez Raspberry Pi.

Objaw

Drukarka po prostu przestała się uruchamiać. Pewnego dnia włączyła się i nigdy nie wróciła do stanu używalności. Nie było żadnej aktualizacji firmware'u, a maszyna cały czas pracowała na UPS-ie, więc nie ma szans na zanik zasilania. Z zewnątrz wyglądała na martwą: zasilanie włączone, logo Formlabs się zapala, podświetlenie ekranu mruga, ale żadnego ruchu silników i żadnego działającego interfejsu, żadnych oczywistych oznak życia.

Jak więc podejść do tego problemu? Oczywiście przez kontakt ze wsparciem. Ale po dwóch dniach czekania dostałem odpowiedź, że muszę wymienić System on a Module (SOM), tyle że nie mają ich już na stanie, więc powinienem po prostu kupić nową drukarkę...

To się nie spina, więc jak każdy porządny inżynier zacząłem szukać portu szeregowego.

Wielkie podziękowania dla Bunniego za teardown i analizę https://www.bunniestudios.com/blog/2020/formlabs-form-3-teardown/

W poszukiwaniu konsoli szeregowej

Nie da się zdiagnozować urządzenia z Linuksem, gapiąc się na nie. Potrzebujesz jego konsoli szeregowej, strumienia tekstu, który bootloader i kernel wypisują przy starcie. Gdzie ona jest?

SOM ma kilka punktów testowych, ale są albo pod radiatorem, albo na spodzie płytki. Ustalenie, co robią, jest jeszcze trudniejsze, bo mimo oznaczeń GND i 3.3V na płytce, moduł nie bootuje się, kiedy poda się na nie zasilanie. Prawdopodobnie sygnały enable idą przez złącze DIMM z płyty głównej, ale nie planowałem tego wylutowywać.

Sprawdziłem multimetrem ciągłość między portem "SOM" na płycie głównej a złączem DIMM, ale to była ślepa uliczka.

Czyli brak wyraźnego portu szeregowego na SOM-ie i na płycie głównej... ale chwila, była jeszcze jedna płytka!

Form 3: szukanie portu szeregowego
Form 3: szukanie portu szeregowego
Form 3: znajdź swoją konsolę szeregową
Form 3: znajdź swoją konsolę szeregową

To jest płytka złącza na taśmie. Ma punkty testowe na LED, TX, RX i AB. Przylutowałem przewody, podpiąłem przejściówkę serial-USB i voilà! Komunikaty kernela. Żeby zdobyć GND dla połączenia szeregowego, przylutowałem przewód do przycisku reset na metalowym chassis (bez GND to nie zadziała).

stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb raw -echo
cat /dev/ttyUSB0 | tee boot.log

Pierwsze przydatne odkrycie przyszło od razu: konsola jest tylko wyjściowa. Mogłem czytać wszystko, co płytka wypisywała, ale nic, co wpisałem, do niej nie docierało. Formlabs zablokował konsolę na produkcji, co z ich strony jest rozsądne, a z mojej niewygodne. Do samej diagnozy nie ma to znaczenia, bo na tym etapie wszystko, czego potrzebuję, to czytać.

Połączenie szeregowe do SOM
Połączenie szeregowe do SOM

Log bootowania powiedział mi prawie wszystko

Włączyć, przechwycić, a log opowiada resztę. Przycięty do części, która ma znaczenie:

[    2.871903] EXT4-fs (mmcblk0p6): mounted filesystem with ordered data mode.
[    2.880068] VFS: Mounted root (ext4 filesystem) on device 179:6.
Freeing unused kernel memory: ...
/sbin/init: error while loading shared libraries: /lib/libc.so.6: invalid ELF header
[    3.116805] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00

Przeczytaj to uważnie:

  1. Kernel ładuje się bez problemu.
  2. 16 GB pamięci wewnętrznej (mmcblk0) jest wykrywane i wygląda na zdrowe.
  3. Partycja root mmcblk0p6 montuje się jako ext4, a journal systemu plików odtwarza się czysto.
  4. Kernel przekazuje sterowanie do /sbin/init, pierwszego programu w przestrzeni użytkownika.
  5. init próbuje załadować bibliotekę C, /lib/libc.so.6, i znajduje nieprawidłowy nagłówek ELF.
  6. Bez działającego init kernel robi jedyne, co może: panikuje.

Czyli to nie był martwy układ, nie martwy kontroler, nie zgubiona tablica partycji i nie rozwalony system plików. Czytało się to jak jeden uszkodzony plik.

/lib/libc.so.6 to biblioteka C, z którą linkuje się praktycznie każdy program, więc w chwili, gdy staje się nieczytelna, nic w przestrzeni użytkownika nie może wystartować. Pierwszy program, który jej potrzebuje, init, wywraca się, a kernel się poddaje.

To wydawało się dobrym miejscem, bo naprawa jest koncepcyjnie prosta: uzyskać dostęp do zapisu na tej partycji i podmienić jeden uszkodzony plik. Trudna część to "uzyskać dostęp do zapisu" i właśnie na to poszła większość pracy.

Z czym właściwie miałem do czynienia

Żeby cokolwiek zaplanować, musiałem dokładnie wiedzieć, co mam przed sobą. Log bootowania plus spojrzenie na płytkę dały pełny obraz:

  • SoC: TI Sitara AM5728, raportuje się jako DRA752 ES2.0, dwurdzeniowy Cortex-A15.
  • Moduł: CompuLab CL-SOM-AM57x system on module. Czyli jest zapasowe wyjście, gdyby SOM został kompletnie zamurowany.
  • Nazwa maszyny: "Formlabs Daguerre", ich wewnętrzna nazwa płytki.
  • Bootloader: Das U-Boot 2017.01-cl-salsa-am57x, build CompuLaba.
  • Kernel: linuks od TI, 4.9.x.
  • Główna pamięć: wlutowany eMMC, 16 GB, widoczny jako mmcblk0.
  • Pamięć boot: Winbond W25Q32 QSPI NOR, 4 MB, trzyma bootloader.
  • Konsola: UART3 pod 0x48020000, wystawiony jako ttyS2, 115200n8.

Dwa fakty stąd ukształtowały wszystko, co było dalej.

Po pierwsze, AM5728 to część GP (general-purpose), a nie high-security. Nie ma tu ściany podpisanego bootu, która zabraniałaby mi uruchomić własny kod startowy.

Po drugie, eMMC jest wlutowany. Nie ma slotu na kartę SD ani żadnej podstawki. Nie mogłem wyjąć pamięci, odczytać jej na innej maszynie i włożyć z powrotem. Ani zrobić pełnego wylutowania BGA, przylutować cieniutkich przewodów, żeby się do niej dostać, a potem wlutować z poprawkami, które miałyby nadzieję odtworzyć uszkodzony plik. To nie brzmiało zabawnie. Cokolwiek robiłem, musiałem zrobić na miejscu, przez własne interfejsy układu.

Dwie kości flash i dlaczego są dwie

Ludzie bywają zaskoczeni, że drukarka ma dwie osobne kości nieulotne. Robią różne rzeczy:

  • QSPI NOR (4 MB) jest mała, prosta i niezawodna. Trzyma wczesny kod startowy: loader pierwszego stopnia (MLO/SPL), samego U-Boota i jego środowisko (ustawienia). Mask ROM w SoC umie odczytać tę kość przy włączeniu zasilania. Myśl o niej jak o zapłonie.
  • eMMC (16 GB) jest duży i trzyma właściwy system operacyjny: kernel, device tree i główny system plików z całym oprogramowaniem Formlabs. To jest ta kość ze złym plikiem.

Układ QSPI na tej płytce, dla porządku:

  • 0x00000 do 0x40000: MLO, bootloader pierwszego stopnia (SPL).
  • 0x40000 do 0xc0000: właściwy U-Boot.
  • 0xc0000 do 0x100000: środowisko U-Boota (ustawienia i komendy bootowania).
  • 0x100000 do 0x400000: zarezerwowane, jakieś 3 MB, nieużywane.

Jak bootuje się CPU Sitara

Plan odzyskiwania stoi i upada na zrozumieniu łańcucha bootowania, więc oto on dla tej klasy SoC od TI:

  1. Mask ROM. Wypalony w SoC, rusza pierwszy. Potem czyta QSPI i ładuje loader pierwszego stopnia. Da się go też namówić na przyjęcie kodu przez USB.
  2. MLO / SPL. Loader pierwszego stopnia. Jego głównym zadaniem jest podniesienie pamięci DDR i załadowanie większego bootloadera.
  3. U-Boot. Pełny bootloader, powszechny w systemach wbudowanych i telefonach z Androidem. Czyta swoje środowisko, potem ładuje kernel i device tree i je uruchamia. Na tej płytce U-Boot chodzi na produkcji cicho, a przy wyłączonym wejściu konsoli nie ma dostępnego komunikatu "naciśnij klawisz, żeby zatrzymać".
  4. Kernel. Linux wstaje, montuje główny system plików z eMMC i przekazuje sterowanie do /sbin/init.
  5. init i przestrzeń użytkownika. Tu umarło.

Moja drukarka dochodziła aż do kroku 5 i przewracała się na ostatniej przeszkodzie. Sprzęt, bootloader, kernel i system plików były w porządku. Tylko przestrzeń użytkownika nie mogła wystartować.

Dlaczego podejrzewałem bit rot

Ciekawym pytaniem było, dlaczego jeden plik się zepsuł, bo odpowiedź wpływa na to, jak bardzo powinni się martwić inni właściciele Form 3. Zwykli podejrzani nie pasowali:

  • Zanik zasilania albo podnapięcie? Maszyna wisiała na UPS-ie. A zanik zasilania w trakcie zapisu zwykle zostawia uszkodzenia systemu plików, które journal wyłapuje. Tutaj journal odtworzył się czysto, a zła była tylko zawartość pliku. To nie jest sygnatura przerwanego zapisu.
  • Zła aktualizacja firmware'u? Żadnej aktualizacji nie było. Plik zepsuł się w miejscu.

To, co pasuje, to cichy bit rot w eMMC. Komórki NAND tracą ładunek z czasem i można je zaburzyć odczytami z sąsiedztwa oraz nagromadzonym zużyciem. Starzejący się albo graniczny blok trzymający plik może w końcu odczytać się błędnie. Blok, w którym akurat siedział libc.so.6, zwrócił śmieci, nagłówek ELF przestał się walidować i system nie mógł wystartować. Otaczające metadane systemu plików, leżące w innych blokach, były nietknięte, czyli dokładnie tak, jak wygląda lokalny problem nośnika, a nie zdarzenie ogólnosystemowe.

Te płytki zbierają lata logowania i zapisów stanu na ten sam eMMC, więc jeden zmęczony blok jest całkiem prawdopodobny. Kilku innych właścicieli zgłasza podobne awarie "po prostu przestało się uruchamiać", co jest spójne ze wzorcem zużycia i utraty retencji, a nie z pechem.

Pierwsza próba wejścia: wymuszenie bootu z USB

Cel znałem: uzyskać dostęp do zapisu na mmcblk0p6. Pierwszym pomysłem było zmusić SoC do bootowania z USB zamiast z eMMC, wepchnąć własny bootloader i przez niego dobrać się do pamięci.

Mask ROM w AM5728 przechodzi w tryb bootu z USB jako urządzenie peryferyjne, jeśli nie może wystartować ze swojego normalnego źródła. Wylutowałem i podniosłem nóżkę chip-select QSPI, żeby odizolować kość i przerwać normalną ścieżkę bootowania, i po włączeniu zasilania SoC posłusznie wyliczył się na hoście jako urządzenie USB (pokazuje się jako 0451:d013, urządzenie bootowe "VAYU" od TI).

Potem spaliłem czas na złym narzędziu. Najpierw sięgnąłem po omapboot / omap4boot, które mówią protokołem USB ROM-u OMAP44xx. AM5728 to część klasy DRA7xx z innym protokołem bootowania USB w ROM-ie. Urządzenie się wylicza, ale nigdy nie przyjmuje handshake'u OMAP4. To był dobry pomysł wycelowany w złą epokę krzemu.

Właściwym narzędziem hosta dla tego SoC jest dra7xx-bootswitch od TI. Zbudowałem je, wykroiłem SPL z MLO od TI AM57x EVM i wysłałem. Transfer przeszedł (jakieś 157 KB), a potem nic: żadnego bannera na porcie szeregowym, żadnego urządzenia USB drugiego stopnia. Powód jest przyziemny i ważny. Głównym zadaniem loadera pierwszego stopnia jest zainicjowanie DDR, a konfiguracja DDR zależy od płytki. Standardowy SPL z EVM od TI nie pasuje do pamięci modułu CompuLaba, więc wywala się przy podnoszeniu DDR i nigdy nie dochodzi na tyle daleko, żeby zrobić cokolwiek pożytecznego. Bez loadera pierwszego stopnia zbudowanego pod dokładnie ten moduł boot z USB był ślepą uliczką.

Odczyt pamięci boot przez Raspberry Pi

Skoro nie mogłem wepchnąć działającego bootloadera do środka, następnym ruchem było wyciągnąć ten oryginalny na zewnątrz, żeby zrozumieć blokadę i w końcu ją zmodyfikować. QSPI to standardowa kość SPI NOR 3,3 V w obudowie SOIC-8, Raspberry Pi ma magistralę SPI, a flashrom rozmawia z SPI NOR bezpośrednio.

Z kością podniesioną z płytki, żeby odizolować ją od SoC, pierwszym podejściem był deadbug (później dorobiłem małe wlutowane złącze, bo wylutowywanie, podpinanie cieniutkich przewodów, potem ich zdejmowanie i wlutowywanie kości z powrotem zajmowało za dużo czasu).

Jedna uwaga o okablowaniu, która kosztowała mnie dwadzieścia minut: kość nie odpowie, dopóki jej nóżki write-protect i hold oraz zasilanie nie będą wszystkie podpięte do 3,3 V, a klips musi siedzieć czysto na wszystkich ośmiu stykach. Kiedy to jest dobrze:

flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000 -c W25Q32JV -r qspi_dump.bin

Odczytałem ją dwa razy i porównałem oba zrzuty bajt po bajcie. Zgadzały się, co powiedziało mi, że połączenie jest stabilne, a dane wiarygodne. Ten zrzut 4 MB jest też pełną kopią zapasową łańcucha bootowania, co samo w sobie warto mieć.

QSPI podłączone metodą deadbug do Raspberry Pi
QSPI podłączone metodą deadbug do Raspberry Pi

Co powiedziała mi pamięć boot

Zrzut był prawdziwym punktem zwrotnym tej pierwszej fazy. Po zdekodowaniu:

  • MLO i U-Boot były bajt w bajt oryginalnym buildem Formlabs/CompuLab, bez ściany podpisu na części GP.
  • Środowisko U-Boota miało silent=1 i bootdelay=0. Dlatego konsola wyglądała na zablokowaną: cisza na wyjściu i brak odliczania do przerwania.
  • Logika bootowania realizuje system plików root w układzie A/B. Zmienna fl_bootpart wybiera, z której partycji system się uruchamia, i przełącza się między partycją 5 a 6. Drukarka chodziła z partycji 6, tej z bit rotem. Na partycji 5 była druga, osobna kopia systemu operacyjnego.
  • W QSPI było jakieś 3 MB nieużywanej przestrzeni, od 0x100000 do końca.
  • Istnieje fabryczna ścieżka odzyskiwania przez netboot, dostępna przez przycisk testowy na GPIO, która ściąga kernel i system plików root przez sieć z zaszytego na sztywno adresu serwera.
  • U-Boot miał wkompilowane zwykłe komendy pamięci i sieci (ext4load, ext4write, tftp, dhcp, nfs, mmc, sf), ale bez ums, bez fastboot i bez dfu. Czyli nie było wbudowanego sposobu na wystawienie eMMC jako dysku USB.

Te 3 MB wolnego miejsca w pamięci boot okazały się mieć ogromne znaczenie.

Próba odblokowania konsoli

Wiedząc, dlaczego konsola milczy, oczywistym ruchem było ją odciszyć. Środowisko to lista par nazwa=wartość z CRC32 z przodu. Pomyl CRC, a U-Boot odrzuci cały blok i wróci do domyślnych, więc to musi być dokładne. Najpierw odtworzyłem sumę kontrolną oryginalnego środowiska bajt w bajt, żeby udowodnić, że rozumiem format, a potem zrobiłem drobną edycję: usunąć silent, ustawić prawdziwy bootdelay. Zmieniła się garstka bajtów. Wgrałem z powrotem sam obszar środowiska przez Pi i zweryfikowałem.

Potem spróbowałem użyć konsoli: przerwać autoboot, zejść do prompta U-Boota, wpisać te kilka komend, które zakończyłyby to w pięć minut.

Nic z tego, co wpisałem, nie zrobiło niczego.

Dowód, że wejście szeregowe naprawdę jest martwe

Musiałem wiedzieć, czy wejście jest faktycznie martwe, czy tylko źle podpięte, bo odpowiedź zmienia całe podejście. Środowisko U-Boota definiuje kilka komend pomocniczych przełączających diody statusu drukarki przez GPIO. Przyłożyłem multimetr do tego punktu testowego GPIO i wysłałem komendy przełączania na ślepo. Napięcie nawet nie drgnęło. Odliczanie autoboot też nigdy nie zostało przerwane. A test pętli zwrotnej na FTDI potwierdził, że linia nadawcza mojej przejściówki sama w sobie jest sprawna.

Wniosek był nie do uniknięcia: ścieżka odbiorcza UART na tej płytce jest w tym produkcyjnym buildzie wyłączona, programowo albo sprzętowo. Konsola jest tylko wyjściowa z założenia, a nie przez przypadek. Nawet bez silent i z ustawionym prawdziwym bootdelay nie było sposobu, żeby wpisać w bootloaderze choć jeden znak.

Gdzie mnie to zostawiło

Na koniec tego pierwszego odcinka pracy nauczyłem się sporo i udowodniłem twarde ograniczenie:

  • Drukarka jest, o ile pokazuje log bootowania, o kilka uszkodzonych plików od działania.
  • Pamięć jest wlutowana, więc muszę się do niej dostać na miejscu, przez własne interfejsy układu.
  • SoC jest otwarty, to część GP, więc wolno mi uruchomić własny kod startowy. Boot z USB jako peryferium jest osiągalny, ale potrzebuje loadera pierwszego stopnia zbudowanego pod dokładnie ten moduł, którego nie mam.
  • Umiem odczytać pamięć boot i przepisać ją do woli przez Raspberry Pi i flashrom, i mam jej zweryfikowaną kopię zapasową.
  • Ale konsola szeregowa nie przyjmuje wejścia. Mogę patrzeć, jak maszyna się uruchamia, i mogę przepisać jej pamięć boot, a i tak nie mogę wpisać ani jednej komendy w bootloaderze.

To ostatnie ograniczenie, brak interaktywnego prompta gdziekolwiek, ukształtowało każdą decyzję o tym, jak wprowadzić naprawę na układ.

Wygląda na to, że potrzebna będzie część druga...

https://wemakerobots.com/pl/projekty/odzyskiwanie-form-3-czesc-2/

A tak w ogóle, pełny log bootowania jest poniżej:

....[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.65+ (oe-user@oe-host) (gcc version 7.3.0 (GCC) ) #1 SMP PREEMPT Fri May 17 09:49:14 UTC 2024
[    0.000000] CPU: ARMv7 Processor [412fc0f2] revision 2 (ARMv7), cr=30c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, PIPT instruction cache
[    0.000000] OF: fdt:Machine model: Formlabs Daguerre
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
[    0.000000] Reserved memory: created CMA memory pool at 0x0000000095800000, size 56 MiB
[    0.000000] OF: reserved mem: initialized node ipu2_cma@95800000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created CMA memory pool at 0x0000000099000000, size 64 MiB
[    0.000000] OF: reserved mem: initialized node dsp1_cma@99000000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created CMA memory pool at 0x000000009d000000, size 32 MiB
[    0.000000] OF: reserved mem: initialized node ipu1_cma@9d000000, compatible id shared-dma-pool
[    0.000000] cma: Reserved 24 MiB at 0x00000000be400000
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] OMAP4: Map 0x00000000bfd00000 to fe600000 for dram barrier
[    0.000000] DRA752 ES2.0
[    0.000000] percpu: Embedded 13 pages/cpu @ef62b000 s22284 r8192 d22772 u53248
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 259648
[    0.000000] Kernel command line: console=ttyS2,115200n8 root=/dev/mmcblk0p6 rootfstype=ext4 rw rootwait mem=1G
[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Memory: 836624K/1045504K available (8192K kernel code, 944K rwdata, 5208K rodata, 2048K init, 306K bss, 28656K reserved, 180224K cma-reserved, 234496K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xf0800000 - 0xff800000   ( 240 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0xc0008000 - 0xc0a00000   (10208 kB)
[    0.000000]       .init : 0xc1000000 - 0xc1200000   (2048 kB)
[    0.000000]       .data : 0xc1200000 - 0xc12ec3f0   ( 945 kB)
[    0.000000]        .bss : 0xc12ee000 - 0xc133a8c0   ( 307 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] .Build-time adjustment of leaf fanout to 32.
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] OMAP clockevent source: timer1 at 32786 Hz
[    0.000000] arm_arch_timer: Architected cp15 timer(s) running at 6.14MHz (virt).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x16af5adb9, max_idle_ns: 440795202250 ns
[    0.000005] sched_clock: 56 bits at 6MHz, resolution 162ns, wraps every 4398046511023ns
[    0.000016] Switching to timer-based delay loop, resolution 162ns
[    0.000321] clocksource: 32k_counter: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 58327039986419 ns
[    0.000328] OMAP clocksource: 32k_counter at 32768 Hz
[    0.000800] Console: colour dummy device 80x30
[    0.000826] Calibrating delay loop (skipped), value calculated using timer frequency.. 12.29 BogoMIPS (lpj=61475)
[    0.000840] pid_max: default: 32768 minimum: 301
[    0.000946] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000956] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
[    0.001635] CPU: Testing write buffer coherency: ok
[    0.001850] /cpus/cpu@0 missing clock-frequency property
[    0.001867] /cpus/cpu@1 missing clock-frequency property
[    0.001878] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.001895] Setting up static identity map for 0x80200000 - 0x80200060
[    0.082471] EFI services will not be available.
[    0.170233] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[    0.170327] Brought up 2 CPUs
[    0.170340] SMP: Total of 2 processors activated (24.59 BogoMIPS).
[    0.170346] CPU: All CPU(s) started in SVC mode.
[    0.170844] devtmpfs: initialized
[    0.203738] VFP support v0.3: implementor 41 architecture 4 part 30 variant f rev 0
[    0.203983] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.204000] futex hash table entries: 512 (order: 3, 32768 bytes)
[    0.207473] pinctrl core: initialized pinctrl subsystem
[    0.208314] NET: Registered protocol family 16
[    0.209216] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.210354] omap_hwmod: l3_main_2 using broken dt data from ocp
[    0.430341] cpuidle: using governor ladder
[    0.470372] cpuidle: using governor menu
[    0.478122] GPIO line 22 (rgb-iovdd) hogged as output/high
[    0.479819] OMAP GPIO hardware version 0.1
[    0.494814] irq: no irq domain found for /ocp/l4@4a000000/scm@2000/pinmux@1400 !
[    0.520414] No ATAGs?
[    0.520461] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[    0.520470] hw-breakpoint: maximum watchpoint size is 8 bytes.
[    0.520860] omap4_sram_init:Unable to allocate sram needed to handle errata I688
[    0.520870] omap4_sram_init:Unable to get sram pool needed to handle errata I688
[    0.521407] OMAP DMA hardware revision 0.0
[    0.561458] omap-dma-engine 4a056000.dma-controller: OMAP DMA engine driver (LinkedList1/2/3 supported)
[    0.562749] edma 43300000.edma: memcpy is disabled
[    0.567499] edma 43300000.edma: TI EDMA DMA engine driver
[    0.571124] omap-iommu 40d01000.mmu: 40d01000.mmu registered
[    0.571306] omap-iommu 40d02000.mmu: 40d02000.mmu registered
[    0.571468] omap-iommu 58882000.mmu: 58882000.mmu registered
[    0.571618] omap-iommu 55082000.mmu: 55082000.mmu registered
[    0.573759] omap_i2c 48070000.i2c: could not find pctldev for node /ocp/l4@4a000000/scm@2000/pinmux@1400/i2c1_pins_default, deferring probe
[    0.573798] omap_i2c 48072000.i2c: could not find pctldev for node /ocp/l4@4a000000/scm@2000/pinmux@1400/i2c2_pins_default, deferring probe
[    0.573830] omap_i2c 48060000.i2c: could not find pctldev for node /ocp/l4@4a000000/scm@2000/pinmux@1400/i2c3_pins_default, deferring probe
[    0.573862] omap_i2c 4807a000.i2c: could not find pctldev for node /ocp/l4@4a000000/scm@2000/pinmux@1400/i2c4_pins_default, deferring probe
[    0.573894] omap_i2c 4807c000.i2c: could not find pctldev for node /ocp/l4@4a000000/scm@2000/pinmux@1400/i2c5_pins_default, deferring probe
[    0.574027] media: Linux media interface: v0.10
[    0.574076] Linux video capture interface: v2.00
[    0.574108] pps_core: LinuxPPS API ver. 1 registered
[    0.574115] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.574134] PTP clock support registered
[    0.574163] EDAC MC: Ver: 3.0.0
[    0.575155] omap-mailbox 48840000.mailbox: omap mailbox rev 0x400
[    0.575447] omap-mailbox 48842000.mailbox: omap mailbox rev 0x400
[    0.575771] Advanced Linux Sound Architecture Driver Initialized.
[    0.576686] clocksource: Switched to clocksource arch_sys_counter
[    0.586877] NET: Registered protocol family 2
[    0.587377] TCP established hash table entries: 8192 (order: 3, 32768 bytes)
[    0.587439] TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
[    0.587564] TCP: Hash tables configured (established 8192 bind 8192)
[    0.587618] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    0.587649] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    0.587849] NET: Registered protocol family 1
[    0.588183] RPC: Registered named UNIX socket transport module.
[    0.588191] RPC: Registered udp transport module.
[    0.588198] RPC: Registered tcp transport module.
[    0.588204] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.589127] hw perfevents: enabled with armv7_cortex_a15 PMU driver, 7 counters available
[    0.592019] workingset: timestamp_bits=14 max_order=18 bucket_order=4
[    0.602212] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.603140] NFS: Registering the id_resolver key type
[    0.603161] Key type id_resolver registered
[    0.603169] Key type id_legacy registered
[    0.603208] ntfs: driver 2.1.32 [Flags: R/O].
[    0.604463] Key type asymmetric registered
[    0.604473] Asymmetric key parser 'x509' registered
[    0.604519] bounce: pool size: 64 pages
[    0.604693] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[    0.604704] io scheduler noop registered
[    0.604711] io scheduler deadline registered
[    0.604869] io scheduler cfq registered (default)
[    0.609631] pinctrl-single 4a003400.pinmux: 282 pins at pa fc003400 size 1128
[    0.616021] backlight supply power not found, using dummy regulator
[    0.673361] Serial: 8250/16550 driver, 10 ports, IRQ sharing disabled
[    0.676766] console [ttyS2] disabled
[    0.676813] 48020000.serial: ttyS2 at MMIO 0x48020000 (irq = 299, base_baud = 3000000) is a 8250
[    1.512317] console [ttyS2] enabled
[    1.516791] 4806e000.serial: ttyS3 at MMIO 0x4806e000 (irq = 300, base_baud = 3000000) is a 8250
[    1.526505] 48066000.serial: ttyS4 at MMIO 0x48066000 (irq = 301, base_baud = 3000000) is a 8250
[    1.537298] omap_rng 48090000.rng: OMAP Random Number Generator ver. 20
[    1.544401] [drm] Initialized
[    1.548523] omapdss_dss 58000000.dss: master bind failed: -517
[    1.556411] display supply vcc not found, using dummy regulator
[    1.562535] panel-dpi display: failed to find video source
[    1.580445] brd: module loaded
[    1.588760] loop: module loaded
[    1.595474] m25p80 spi0.0: w25q32 (4096 Kbytes)
[    1.600095] 4 ofpart partitions found on MTD device spi0.0
[    1.605603] Creating 4 MTD partitions on "spi0.0":
[    1.610447] 0x000000000000-0x000000040000 : "MLO"
[    1.616130] 0x000000040000-0x0000000c0000 : "uboot"
[    1.621971] 0x0000000c0000-0x000000100000 : "uboot environment"
[    1.628871] 0x000000100000-0x000000400000 : "reserved"
[    1.635814] libphy: Fixed MDIO Bus: probed
[    1.640843] tun: Universal TUN/TAP device driver, 1.6
[    1.645914] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
[    1.706717] davinci_mdio 48485000.mdio: davinci mdio revision 1.6
[    1.712840] libphy: 48485000.mdio: probed
[    1.719732] davinci_mdio 48485000.mdio: phy[0]: device 48485000.mdio:00, driver Micrel KSZ8081 or KSZ8091
[    1.729934] cpsw 48484000.ethernet: No slave[1] phy_id, phy-handle, or fixed-link property
[    1.738278] cpsw 48484000.ethernet: Detected MACID = 38:0a:ab:06:35:a4
[    1.744917] cpsw 48484000.ethernet: cpts: overflow check period 500 (jiffies)
[    1.753627] mousedev: PS/2 mouse device common for all mice
[    1.760542] omap_rtc 48838000.rtc: rtc core: registered 48838000.rtc as rtc2
[    1.768451] i2c /dev entries driver
[    1.777216] omap_hsmmc 4809c000.mmc: Got CD GPIO
[    1.781900] omap_hsmmc 4809c000.mmc: Got WP GPIO
[    1.786742] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr104 mode
[    1.793212] omap_hsmmc 4809c000.mmc: no pinctrl state for ddr50 mode
[    1.799612] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr50 mode
[    1.805993] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr25 mode
[    1.812393] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr12 mode
[    1.819166] omap_hsmmc 4809c000.mmc: no pinctrl state for hs mode
[    1.825962] omap_hsmmc 480b4000.mmc: no pinctrl state for sdr25 mode
[    1.832372] omap_hsmmc 480b4000.mmc: no pinctrl state for sdr12 mode
[    1.838775] omap_hsmmc 480b4000.mmc: no pinctrl state for ddr_1_8v mode
[    1.845419] omap_hsmmc 480b4000.mmc: no pinctrl state for hs mode
[    1.851553] omap_hsmmc 480b4000.mmc: no pinctrl state for hs200_1_8v mode
[    1.921376] ledtrig-cpu: registered to indicate activity on CPUs
[    1.927852] hidraw: raw HID events driver (C) Jiri Kosina
[    1.947031] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
[    1.953850] ip_tables: (C) 2000-2006 Netfilter Core Team
[    1.959970] NET: Registered protocol family 10
[    1.964662] mmc0: new MMC card at address 0001
[    1.979627] mmcblk0: mmc0:0001 TB2916 14.6 GiB 
[    1.980128] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    1.989907] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    1.996434] NET: Registered protocol family 17
[    2.000121] mmcblk0boot0: mmc0:0001 TB2916 partition 1 4.00 MiB
[    2.007096] Key type dns_resolver registered
[    2.010388] mmcblk0boot1: mmc0:0001 TB2916 partition 2 4.00 MiB
[    2.017539] omap_voltage_late_init: Voltage driver support not added
[    2.024015] Power Management for TI OMAP4+ devices.
[    2.028214]  mmcblk0: p1 p2 p3 < p5 p6 p7 >
[    2.033491] Registering SWP/SWPB emulation handler
[    2.039853] registered taskstats version 1
[    2.055118] dmm 4e000000.dmm: workaround for errata i878 in use
[    2.062721] dmm 4e000000.dmm: initialized all PAT entries
[    2.069645] palmas 0-0058: Irq flag is 0x00000008
[    2.099090] palmas 0-0058: Muxing GPIO 2f, PWM 0, LED 0
[    2.113210] random: fast init done
[    2.119799] ldo1: Bringing 3000000uV into 3300000-3300000uV
[    2.145792] palmas-rtc 48070000.i2c:tps659038@58:tps659038_rtc: rtc core: registered 48070000.i2c:tps659 as rtc1
[    2.158332] omap_i2c 48070000.i2c: bus 0 rev0.12 at 400 kHz
[    2.307222] Goodix-TS 1-005d: ID 911, version: 1060
[    2.312555] omap_i2c 48072000.i2c: bus 1 rev0.12 at 400 kHz
[    2.318513] Goodix-TS 1-005d: Direct firmware load for goodix_911_cfg.bin failed with error -2
[    2.332623] input: Goodix Capacitive TouchScreen as /devices/platform/44000000.ocp/48072000.i2c/i2c-1/1-005d/input/input0
[    2.357683] rtc-pcf8523 2-0068: rtc core: registered rtc-pcf8523 as rtc0
[    2.364515] omap_i2c 48060000.i2c: bus 2 rev0.12 at 400 kHz
[    2.371328] omap_i2c 4807a000.i2c: bus 3 rev0.12 at 400 kHz
[    2.417146] lm75 4-0048: hwmon0: sensor 'lm75'
[    2.448514] omap_i2c 4807c000.i2c: bus 4 rev0.12 at 400 kHz
[    2.455942] OMAP DSS rev 6.1
[    2.459285] omapdss_dss 58000000.dss: bound 58001000.dispc (ops dispc_component_ops)
[    2.467579] display supply vcc not found, using dummy regulator
[    2.475737] omap_hsmmc 4809c000.mmc: Got CD GPIO
[    2.480448] omap_hsmmc 4809c000.mmc: Got WP GPIO
[    2.485283] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr104 mode
[    2.491771] omap_hsmmc 4809c000.mmc: no pinctrl state for ddr50 mode
[    2.498167] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr50 mode
[    2.504547] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr25 mode
[    2.510940] omap_hsmmc 4809c000.mmc: no pinctrl state for sdr12 mode
[    2.517333] omap_hsmmc 4809c000.mmc: no pinctrl state for hs mode
[    2.607235] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    2.613878] [drm] No driver support for vblank timestamp query.
[    2.626784] [drm] Enabling DMM ywrap scrolling
[    2.631501] omapdrm omapdrm.0: fb0: omapdrm frame buffer device
[    2.678500] rtc-pcf8523 2-0068: setting system clock to 2015-07-08 00:42:43 UTC (1436316163)
[    2.688285] aux_regulator_3v3: disabling
[    2.692247] ALSA device list:
[    2.695225]   No soundcards found.
[    2.867080] EXT4-fs (mmcblk0p6): recovery complete
[    2.871903] EXT4-fs (mmcblk0p6): mounted filesystem with ordered data mode. Opts: (null)
[    2.880068] VFS: Mounted root (ext4 filesystem) on device 179:6.
[    2.906502] devtmpfs: mounted
[    2.910798] Freeing unused kernel memory: 2048K
/sbin/init: error while loading shared libraries: /lib/libc.so.6: invalid ELF header
[    3.116805] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00
[    3.116805] 
[    3.125986] CPU1: stopping
[    3.128708] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.9.65+ #1
[    3.134737] Hardware name: Generic DRA74X (Flattened Device Tree)
[    3.140854] Backtrace: 
[    3.143332] [<c020be68>] (dump_backtrace) from [<c020c144>] (show_stack+0x18/0x1c)
[    3.150934]  r7:fa212000 r6:20000193 r5:00000000 r4:c12244b8
[    3.156620] [<c020c12c>] (show_stack) from [<c04e0fbc>] (dump_stack+0x90/0xa4)
[    3.163876] [<c04e0f2c>] (dump_stack) from [<c020f370>] (handle_IPI+0x1b8/0x1cc)
[    3.171303]  r7:fa212000 r6:00000001 r5:00000000 r4:c1066e04
[    3.176987] [<c020f1b8>] (handle_IPI) from [<c02014a4>] (gic_handle_irq+0x78/0x7c)
[    3.184586]  r6:ef0bbf48 r5:fa21200c r4:c120446c
[    3.189222] [<c020142c>] (gic_handle_irq) from [<c020cbf8>] (__irq_svc+0x58/0x8c)
[    3.196734] Exception stack(0xef0bbf48 to 0xef0bbf90)
[    3.201807] bf40:                   00000001 00000000 fe600000 00000000 ffffe000 c120407c
[    3.210018] bf60: 00000002 c12040e4 00000000 00000000 c12040ec ef0bbfa4 ef0bbf84 ef0bbf98
[    3.218228] bf80: c0222058 c02092e4 60000013 ffffffff
[    3.223301]  r9:ef0ba000 r8:00000000 r7:ef0bbf7c r6:ffffffff r5:60000013 r4:c02092e4
[    3.231083] [<c02092bc>] (arch_cpu_idle) from [<c09e227c>] (default_idle_call+0x28/0x34)
[    3.239211] [<c09e2254>] (default_idle_call) from [<c0270cc8>] (cpu_startup_entry+0x19c/0x218)
[    3.247860] [<c0270b2c>] (cpu_startup_entry) from [<c020ef14>] (secondary_start_kernel+0x174/0x19c)
[    3.256942]  r7:c12ee250
[    3.259487] [<c020eda0>] (secondary_start_kernel) from [<8020154c>] (0x8020154c)
[    3.266911]  r5:00000000 r4:af060600
[    3.270508] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00
[    3.270508]

Contact me

Questions, ideas, or spotted a bug? Send me a note.