Rumah > Artikel > Tutorial sistem > Pemindahan dts pokok peranti Linux: cara untuk menerangkan dan memindahkan maklumat konfigurasi perkakasan
Dalam sistem Linux, pepohon peranti ialah struktur data pepohon yang menerangkan konfigurasi perkakasan Ia berasal daripada standard Perisian Tegar Terbuka dan digunakan untuk menyediakan antara muka antara perisian sistem pengendalian dan perkakasan untuk memulakan dan menjalankan sistem. Pokok peranti boleh mengurangkan perubahan yang diperlukan pada kernel untuk menyokong perkakasan baharu, menambah baik penggunaan semula kod, mempercepatkan pembangunan pakej sokongan Linux dan membolehkan imej kernel tunggal untuk menyokong berbilang sistem. Artikel ini akan memperkenalkan langkah dan kaedah asas pemindahan dts pokok peranti Linux, termasuk format storan data pepohon peranti, sintaks perihalan kod sumber, sokongan kernel U-Boot dan Linux serta proses penghuraian untuk pepohon peranti, dsb.
Kata kunci: pokok peranti rata;
Pelayan daripada IBM, Sun dan pengeluar lain pada mulanya menggunakan Perisian Tegar (program yang dibenamkan dalam peranti perkakasan, dengan
(digunakan untuk menyediakan antara muka antara perisian dan perkakasan), digunakan untuk memulakan konfigurasi sistem, dan menyediakan antara muka antara perisian dan perkakasan sistem pengendalian
port untuk mendapatkan sistem dan berjalan. Kemudian, untuk penyeragaman dan keserasian, IBM, Sun, dsb. bersama-sama melancarkan antara muka perisian tegar IEEE 1275
standard, supaya pelayan mereka seperti IBM PowerPC pSeries, Apple PowerPC, Sun SPARC, dll. semuanya menggunakan Open
Perisian tegar membina maklumat pokok peranti perkakasan sistem pada masa jalan dan menghantarnya ke kernel untuk memulakan sistem [1]. Macam ni
Faedahnya termasuk mengurangkan pergantungan berat kernel pada perkakasan sistem, mempercepatkan pembangunan pakej sokongan dan mengurangkan perubahan yang disebabkan oleh perkakasan
Ia mengurangkan permintaan dan kos serta mengurangkan keperluan untuk reka bentuk dan penyusunan kernel.
Satukan direktori arch/powerpc, dan perkenalkan Open Firmware API dalam kod kernel untuk menggunakan antara muka perisian tegar standard [2].
Apabila kernel Linux sedang berjalan, ia perlu mengetahui beberapa maklumat yang berkaitan tentang perkakasan. Bagi mereka yang disusun dengan parameter ARCH=powerpc
Imej kernel, maklumat ini perlu berdasarkan spesifikasi Open Firmware dan wujud dalam bentuk pepohon peranti [3]. Dengan cara ini kernel bermula
Baca dan imbas pepohon peranti yang disediakan oleh Open Firmware pada masa jalan untuk mendapatkan maklumat peranti perkakasan platform dan cari peranti yang sepadan
pemacu peranti dan ikat pemacu pada peranti.
U-Boot awal menggunakan struktur data statik bd_t dalam include/asm-ppc/u-boot.h untuk memindahkan maklumat asas tentang papan
Serahkan kepada kernel, yang mengendalikan selebihnya. Antara muka jenis ini tidak cukup fleksibel Jika perkakasan berubah, anda perlu menyesuaikan semula kompilasi dan pembakaran
Tulis kod but dan kernel, dan ia tidak lagi sesuai untuk kernel semasa. Untuk menyesuaikan diri dengan pembangunan kernel dan PowerPC tertanam
Mengambil kesempatan daripada platform yang sentiasa berubah dan menyerap kelebihan Perisian Tegar Terbuka standard, U-Boot memperkenalkan pokok peranti rata FDT seperti ini
Antara muka dinamik, menggunakan gumpalan FDT yang berasingan (objek besar binari, bekas yang boleh menyimpan fail binari)
Menyimpan parameter yang dihantar ke kernel [3]. Sesetengah maklumat tertentu, seperti saiz cache, penghalaan gangguan, dsb., disediakan secara langsung oleh pepohon peranti,
Maklumat lain, seperti alamat MAC eTSEC, kekerapan, nombor bas PCI, dsb., diubah suai oleh U-Boot pada masa jalan.
U-Boot menggantikan bd_t dengan pepohon peranti rata dan keserasian ke belakang dengan bd_t tidak lagi dijamin.
2 Konsep Pokok Peranti
Ringkasnya, pepohon peranti ialah struktur data berbentuk pepohon yang menerangkan konfigurasi perkakasan, dengan satu dan hanya satu nod akar [4]. Ia kemas
Mengandungi maklumat tentang CPU, memori fizikal, bas, port bersiri, PHY dan peranti persisian lain. Pokok itu mewarisi Terbuka
Perisian tegar IEEE 1275 definisi pokok peranti. Sistem pengendalian boleh melakukan analisis sintaksis struktur ini pada permulaan, untuk mengkonfigurasi
Sediakan kernel dan muatkan pemacu yang sepadan.
3 Format storan pokok peranti
U-Boot perlu menghantar alamat storan pokok peranti dalam ingatan kepada kernel. Pokok ini terutamanya terdiri daripada tiga bahagian: kepala
(Tajuk), blok struktur (Blok struktur), Blok rentetan (Blok rentetan). Penyimpanan pokok peranti dalam ingatan
Rajah susun atur storan 1 adalah seperti berikut:
Rajah 1 Gambar rajah format storan pokok peranti
Rajah1 Susun atur blok DT
3.1 pengepala
Pengepala terutamanya menerangkan maklumat asas pepohon peranti, seperti bendera nombor ajaib pepohon peranti, saiz blok pepohon peranti dan alamat mengimbangi blok struktur
dll. Struktur khusus boot_param_header adalah seperti berikut. Nilai dalam struktur ini dinyatakan dalam mod big-endian dan mengimbangi
Alamat dikira relatif kepada alamat permulaan kepala pokok peranti.
3.2 Blok struktur
Blok struktur pokok peranti rata ialah struktur pokok linear Bersama-sama dengan blok rentetan, ia membentuk badan utama pokok peranti, dengan nod
Simpan maklumat peranti papan sasaran dalam borang. Dalam blok struktur, bendera permulaan nod ialah makro tetap OF_DT_BEGIN_NODE,
Tanda hujung nod ialah makro OF_DT_END_NODE; nod anak ditakrifkan sebelum tanda hujung nod. Nod boleh meringkaskan
Ia bermula dengan OF_DT_BEGIN_NODE, termasuk laluan nod, senarai atribut, senarai nod anak dan akhirnya berakhir dengan
OF_DT_END_NODE menamatkan jujukan dan setiap nod anak itu sendiri mempunyai struktur yang serupa.
3.3 Strings block
Untuk menjimatkan ruang, beberapa nama atribut, terutamanya yang muncul berulang kali dan berlebihan, diekstrak dan disimpan secara berasingan
kepada blok rentetan. Blok ini mengandungi beberapa rentetan nama atribut dengan bendera akhir. Disimpan dalam blok struktur pokok peranti
Alamat mengimbangi rentetan ini, supaya rentetan nama atribut boleh ditemui dengan mudah. Pengenalan blok rentetan menjimatkan pembenaman
Ruang storan sistem terbina dalam adalah ketat.
4 Perwakilan DTS kod sumber pokok peranti
Fail kod sumber pepohon peranti (.dts) menerangkan pepohon peranti konfigurasi perkakasan sistem dalam format teks yang boleh dibaca dan boleh diedit, menyokong C/C++
Komen dalam perjalanan, struktur mempunyai nod akar unik "/", setiap nod mempunyai nama sendiri dan boleh mengandungi berbilang
nod kanak-kanak. Format data pepohon peranti mengikut piawaian Open Firmware IEEE 1275. Artikel ini hanya menerangkan secara ringkas pokok peranti
Untuk susun atur dan sintaks data, pembangun pakej sokongan papan Linux harus merujuk kepada standard IEEE 1275 [5] dan dokumen lain [2] [4] untuk mendapatkan butiran.
Untuk menggambarkan, mula-mula berikan contoh kod sumber pepohon peranti bagi sistem minimum berdasarkan pemproses PowerPC MPC8349E.
Seperti yang anda lihat, terdapat banyak nod dalam pepohon peranti ini, dan setiap nod mempunyai nama unit nod yang ditentukan. Di sebalik setiap atribut ialah
Berikan nilai yang sepadan. Kandungan yang disertakan dalam petikan berganda ialah rentetan ASCII, dan kandungan yang diberikan dalam kurungan sudut ialah perenambelasan 32-bit
nilai. Struktur pokok ini ialah koleksi ringkas nod dan atribut yang diperlukan untuk memulakan kernel Linux, termasuk mod asas nod akar
Maklumat, CPU dan susun atur memori fizikal, ia juga termasuk maklumat argumen baris arahan yang dihantar ke kernel melalui nod /chosen.
/ { model = "MPC8349EMITX"; compatible = "MPC8349EMITX", "MPC834xMITX", "MPC83xxMITX"; \#address-cells = ; /* 32bit address */ \#size-cells = ; /* 4GB size */ cpus { \#address-cells = ; \#size-cells = ; PowerPC,8349@0 { device_type = "cpu"; reg = ; d-cache-line-size = ; /* 32 Bytes */ i-cache-line-size = ; d-cache-size = ; /* L1 dcache, 32K */ i-cache-size = ; timebase-frequency = ; /* from bootloader */ bus-frequency = ; clock-frequency = ; }; }; memory { device_type = "memory"; reg = ; /* 256MB */ }; chosen { name = "chosen"; bootargs = "root=/dev/ram rw console=ttyS0,115200"; linux,stdout-path = "/soc8349@e0000000/serial@4500"; }; };
4.1 Nod akar
Titik permulaan pokok peranti dipanggil nod akar "/". Model atribut menentukan nama platform atau modul papan sasaran, atribut
Nilai serasi menunjukkan nama papan pembangunan yang serasi daripada siri yang sama dengan papan sasaran. Untuk kebanyakan platform 32-bit, harta
Nilai #address-cells dan #size-cells pada umumnya adalah 1.
4.2 Nod CPU
Nod /cpus ialah nod anak nod akar, dan terdapat nod yang sepadan untuk setiap CPU dalam sistem. /cpus nod
Tiada atribut yang diperlukan, tetapi adalah amalan yang baik untuk menentukan #address-cells = dan #size-cells =, yang kedua-duanya merujuk kepada
Fahami format atribut reg setiap nod CPU untuk memudahkan penomboran CPU fizikal.
Nod ini harus mengandungi sifat untuk setiap CPU pada papan. Nama CPU biasanya ditulis sebagai PowerPC, contohnya
Freescale akan menggunakan PowerPC,8349 untuk menerangkan pemproses MPC8349E dalam artikel ini. Nama unit nod CPU hendaklah
Dalam format cpu@0, nod ini secara amnya perlu menentukan device_type (ditetapkan kepada "cpu"), kemasukan cache data/arahan peringkat pertama
Saiz, saiz cache data/arahan peringkat pertama, teras, kekerapan jam bas, dsb. Boot melalui sistem dalam contoh di atas
Kod secara dinamik mengisi item berkaitan kekerapan jam.
4.3 Nod Memori Sistem
Nod ini digunakan untuk menerangkan julat memori fizikal pada papan sasaran Ia biasanya dipanggil nod /memory. Terdapat satu atau lebih nod.
Apabila terdapat berbilang nod, ia perlu diikuti dengan alamat unit untuk membezakannya; apabila hanya terdapat satu alamat unit, alamat unit tidak perlu ditulis,
Lalai ialah 0.
Nod ini mengandungi atribut memori fizikal pada papan Secara amnya, device_type (ditetapkan kepada "memori") dan reg mesti dinyatakan
harta benda. Nilai atribut reg diberikan dalam bentuk, seperti yang ditunjukkan dalam contoh di atas, memori papan sasaran bermula
Alamatnya ialah 0 dan saiznya ialah 256M bait.
4.4 /nod terpilih
Nod ini istimewa sedikit. Biasanya, Open Firmware menyimpan maklumat persekitaran berubah-ubah, seperti parameter,
Peranti input dan output lalai.
Nilai atribut bootargs dan linux, stdout-path biasanya dinyatakan dalam nod ini. Atribut bootargs ditetapkan untuk dihantar ke dalaman
Rentetan hujah untuk baris arahan kernel. linux, stdout-path selalunya merupakan nama laluan nod bagi peranti terminal standard, dan kernel akan menggunakan ini sebagai rujukan
sebagai terminal lalai.
U-Boot menambah sokongan untuk pokok peranti rata FDT selepas versi 1.3.0, U-Boot memuatkan kernel Linux,
Selepas sistem fail Ramdisk (jika digunakan) dan binari pepohon peranti dicerminkan ke memori fizikal, Linux dimulakan dan dilaksanakan
Sebelum kernel, ia mengubah suai binari pokok peranti. Ia akan mengisi pepohon peranti dengan maklumat yang diperlukan seperti alamat MAC,
Bilangan bas PCI, dsb. U-Boot juga akan mengisi nod "/chosen" dalam fail pokok peranti, termasuk port bersiri, root
Peranti (Ramdisk, cakera keras atau but NFS) dan maklumat lain yang berkaitan.
Sistem 4.5 pada Nod SOC Cip
Nod ini digunakan untuk menerangkan sistem pada SOC cip Jika pemproses ialah SOC, nod ini mesti wujud. Pesta SOC Teratas
Maklumat yang terkandung dalam titik kelihatan kepada semua peranti pada SOC ini. Nama nod hendaklah mengandungi alamat unit SOC ini, iaitu SOC
ini
Alamat asas daftar memori dipetakan. Nama nod SOC dinamakan dalam bentuk /soc, seperti SOC MPC8349
Nodnya ialah "soc8349".
在属性中应该指定device_type(固定为”soc”)、ranges、bus-frequency 等属性。ranges
属性值以
SOC 设备子节点,应该在设备树中尽可能详细地描述此SOC 上的外围设备。如下给出带有
看门狗设备的SOC 节点DTS 示例。
soc8349@e0000000 { \#address-cells = ; \#size-cells = ; device_type = "soc"; compatible = "simple-bus"; ranges = ; /* size 1MB */ reg = ; bus-frequency = ; /* from bootloader */ { device_type = "watchdog"; compatible = "mpc83xx_wdt"; reg = ; /* offset: 0x200 */ }; };
4.6 其他设备节点
分级节点用来描述系统上的总线和设备,类似物理总线拓扑,能很方便的描述设备间的
关系。对于系统上的每个总线和设备,在设备树中都有其节点。对于这些设备属性的描述和
定义请详细参考IEEE 1275 标准及本文参考文献[2]。
设备树的中断系统稍显复杂,设备节点利用interrupt-parent 和interrupts 属性描述到中
断控制器的中断连接。其中interrupt-parent 属性值为中断控制器节点的指针,#interrupts 属
性值描述可触发的中断信号,其值格式与中断控制器的interrupt-cells 属性值有关。一般
#interrupt-cells 属性值为2,interrupts 属性就对应为一对描述硬件中断号和中断触发方式的
十六进制值。
5 扁平设备树编译
根据嵌入式板的设备信息写设备树源码文件(.dts)通常比较简单,但是手写二进制的
扁平设备树(.dtb)就显得比较复杂了。设备树编译器dtc 就是用来根据设备树源码的文本
文件生成设备树二进制镜像的。dtc 编译器会对输入文件进行语法和语义检查,并根据Linux
内核的要求检查各节点及属性,将设备树源码文件(.dts)编译二进制文件(.dtb),以保证
内核能正常启动。dtc 编译器的使用方法如下所示[6]:
dtc [ -I dts ] [ -O dtb ] [ -o opt_file ] [ -V opt_version ] ipt_file
2.6.25 版本之后的内核源码已经包含了dtc 编译器。在配置编译内核时选中
CONFIG_DTC,会自动生成设备树编译器dtc。将编写的目标板设备树文件mpc8349emitx.dts
放到内核源码的arch/powerpc/boot/dts/目录下,利用内核Makefile 生成blob 的简单规则,使
用以下命令亦可完成设备树的dtc 编译:
$ make mpc8349emitx.dtb
6 U-Boot 相关设置说明
为使 U-Boot 支持设备树,需要在板子配置头文件中设置一系列宏变量。如本文在
MPC8349E 处理器目标板中移植的U-Boot 配置如下: /* pass open firmware flat tree */ \#define CONFIG_OF_LIBFDT 1 \#undef CONFIG_OF_FLAT_TREE \#define CONFIG_OF_BOARD_SETUP 1 \#define CONFIG_OF_HAS_BD_T 1 \#define CONFIG_OF_HAS_UBOOT_ENV 1 启动引导代码U-Boot 在完成自己的工作之后,会加载Linux 内核,并将扁平设备树的 地址传递给内核,其代码形式如下: \#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT) if (of_flat_tree) { /* device tree; boot new style */ /* \* Linux Kernel Parameters (passing device tree): \* r3: pointer to the fdt, followed by the board info data \* r4: physical pointer to the kernel itself \* r5: NULL \* r6: NULL \* r7: NULL */ (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0); /* does not return */ } \#endif
arch/powerpc 内核的入口有且只有一个,入口点为内核镜像的起始。此入口支持两种调
用方式,一种是支持Open Firmware 启动,另一种对于没有OF 的引导代码,需要使用扁平
设备树块,如上示例代码。寄存器r3 保存指向设备树的物理地址指针,寄存器r4 保存为内
核在物理内存中的地址,r5 为NULL。其中的隐含意思为:假设开启了mmu,那么这个mmu
的映射关系是1:1 的映射,即虚拟地址和物理地址是相同的。
7 Linux 内核对设备树的解析
扁平设备树描述了目标板平台中的设备树信息。每个设备都有一个节点来描述其信息,
每个节点又可以有子节点及其相应的属性。内核源码中include/linux/of.h 及drivers/of/base.c
等文件中提供了一些Open Firmware API,通过这些API,内核及设备驱动可以查找到相应
的设备节点,读取其属性值,利用这些信息正确地初始化和驱动硬件。
图2 内核及驱动对扁平设备树的解析
Fig2 Interaction from kernel and drivers with the FDT blob
8 结论
通过本文,你应该对Linux设备树dts移植有了一个基本的了解,它是一种描述和传递硬件配置信息的有效方式,可以适应嵌入式Linux系统的多样化需求。当然,设备树也不是一成不变的,它需要根据具体的硬件平台和内核版本进行定制和修改。总之,设备树是Linux系统中不可或缺的一个组件,值得你深入学习和掌握。
Atas ialah kandungan terperinci Pemindahan dts pokok peranti Linux: cara untuk menerangkan dan memindahkan maklumat konfigurasi perkakasan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!