Bagaimana cara saya tahu gumpalan pohon perangkat (file dtb) yang saya gunakan?


9

Saya bekerja dengan TS-4900, 'Computer on Module' yang tertanam terpasang ke alas tiang, menjalankan Yocto Linux. Ia menggunakan U-Boot untuk memulai, dan seharusnya mendasarkan pada model alas tiang itu memilih file dtb yang tepat untuk memulai, dan mungkin jika gagal menemukan yang tepat itu jatuh kembali ke yang 'generik' untuk modul saya.

Tapi bagaimana / di mana itu menentukan yang benar? Bagaimana saya bisa tahu .dtb mana yang digunakan, atau mengatur yang mana yang harus digunakan?

Di bawah ini adalah pesan boot dari U-Boot.

U-Boot 2014.10-g3ac6ec3 (Jan 29 2015 - 17:20:15)

CPU:   Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
Board: TS-4900
Revision: C
       Watchdog enabled
I2C:   ready
DRAM:  1 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
SF: Detected N25Q64 with page size 256 Bytes, erase size 4 KiB, total 8 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   using phy at 7
FEC [PRIME]
Press Ctrl+C to abort autoboot in 1 second(s)
(Re)start USB...
USB0:   Port not available.
USB1:   USB EHCI 1.00
scanning bus 1 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
No storage devices, perhaps not 'usb start'ed..?
Booting from the eMMC ...
** File not found /boot/boot.ub **
** File not found /boot/imx6dl-ts4900-13.dtb **
Booting default device tree
42507 bytes read in 196 ms (210.9 KiB/s)
118642 bytes read in 172 ms (672.9 KiB/s)
ICE40 FPGA reloaded successfully
4609784 bytes read in 337 ms (13 MiB/s)
## Booting kernel from Legacy Image at 12000000 ...
   Image Name:   Linux-3.10.17-1.0.0-technologic+
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4609720 Bytes = 4.4 MiB
   Load Address: 10008000
   Entry Point:  10008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 18000000
   Booting using the fdt blob at 0x18000000
EHCI failed to shut down host controller.
   Loading Kernel Image ... OK
   Using Device Tree in place at 18000000, end 1800d60a

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0

(Kernel startup commences...)

Jawaban:


7

Saya terlambat dalam hal ini, tetapi saya mengimplementasikan skrip ini dan saya akan membahas ini untuk siapa saja yang menemukan ini menggunakan mesin pencari internet.

Komputer ini pada modul dapat diletakkan di hampir semua rak TS atau alas tiang kustom, dan kami ingin itu bekerja secara otomatis tanpa pengguna harus menyesuaikan pohon perangkat yang digunakan. Kami memiliki register geser 8-input pada papan pembawa yang diberikan dengan id unik untuk alas tiang. Pada TS-8550, ini adalah 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

Jadi dalam U-Boot, bbdetectperintah yang kami tambahkan membaca GPIO yang terhubung ke register geser ini dan menetapkan variabel lingkungan $ baseboardid. U-Boot pertama-tama akan mencoba memuat hierarki perangkat khusus alas tiang di /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. Jika gagal menemukan satu, itu akan menggunakan pohon perangkat fallback di /boot/imx6${cpu}-ts4900.dtb. File yang terakhir ini memiliki default waras yang akan bekerja pada papan operator apa pun. TS-8550 tidak memerlukan papan carrier khusus alas tiang sehingga jatuh kembali ke bagan perangkat standar dan terus melakukan booting.

Untuk menjawab pertanyaan awal Anda,

cat /proc/device-tree/model

Semua pohon perangkat kami akan memiliki model yang sedikit berbeda di pohon perangkat.
Misalnya, fallback aman adalah:

  • "Sistem Teknologi i.MX6 Quad TS-4900 (Pohon Perangkat Default)"

Atau papan pembawa TS-TPC-8390 dengan bagan perangkat tertentu:

  • "Sistem Teknologi i.MX6 Quad TS-4900 (TS-TPC-8390)"

8

Ketika U-Boot menjalankan perintah boot, ia memberikan alamat memori untuk kernel dan alamat memori untuk gumpalan susunan perangkat. Karena itu, sebelum perintah ini, harus memuat file-file ini ke dalam memori. Berdasarkan pesan yang Anda berikan, kami melihat bahwa dua file gagal dimuat dari kartu eMMC / SD:

/boot/boot.ub
/boot/imx6dl-ts4900-13.dtb

Mungkin saja file-file ini tidak ada, jalurnya salah atau perangkat yang salah: partisi diberikan ke perintah pemuatan U-Boot. Bagaimanapun, perintah gagal. Pada titik ini, tampaknya bootloader mencoba memuat pohon perangkat "default" - kemungkinan disimpan pada media yang sama dengan bootloader itu sendiri.

Untuk mengetahui apa yang sebenarnya terjadi, Anda harus menghentikan proses boot di bootloader dan mengakses prompt perintah U-Boot. Dari sini, Anda dapat masuk:

printenv

Ini akan mencetak variabel lingkungan U-boot. Banyak dari variabel ini merujuk variabel lain. Beberapa variabel ini sering dieksekusi seperti skrip, sehingga Anda dapat melihat skrip boot, kernel & fdt memuat skrip, dll. Untuk mengetahui urutan boot, cari variabel yang disebut bootcmd (atau yang serupa). Inilah yang biasanya dijalankan pada saat boot. Anda harus melacak urutan boot dari titik ini melalui beberapa variabel, tetapi Anda harus melihat di mana perintah load digunakan untuk memuat FDT ke dalam memori. Jika Anda ingin memposting output printenv , kami dapat mengidentifikasi logika yang tepat digunakan di sini.


1
Terima kasih. bootcmd menjadi satu-satunya variabel env yang berisi skrip startup awal adalah apa yang saya butuhkan.
SF.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.