Что такое дерево устройств Linux?
Что такое дерево устройств Linux?

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Как мы все знаем, операционные системы постоянно обновляются и развиваются, а архитектура драйверов Linux также постоянно совершенствуется и совершенствуется. Деревья устройств не использовались в ранних ядрах Linux и архитектурах ARM. Когда нет дерева устройств, Linux передает большое количество Arch/arm/mach-xxx. и папку Arch/arm/plat-xxx, чтобы получить информацию о плате соответствующей платформы. С интеллектуальным терминальным оборудованием,Разработка смартфонов,Ежегодно выпускаются сотни новых чипов архитектуры ARM.,что приводит кВ ядре Linux слишком много файлов с информацией о плате, что приводит к раздутию ядра Linux.。 когда Отец Linux Линус видел ARM-сообщество ориентированный на сообщество В ядро ​​Linux добавлено большое количество «бесполезных» и избыточных информационных файлов на уровне платы, и я не мог не сказать: « This whole ARM thing is a f*cking pain in the задница». Отныне Сообщество ARM представило дерево устройств (Flattened Device Tree),Отделите содержимое этой записи аппаратной информации платы от Linux.,Используйте собственный формат файла для записи,Этот эксклюзивный файл называется деревом устройств. Обычно для этого используется файл .dtsi.,Аналогично файлам заголовков на языке C. Обычно используйте .dtsописание информации о плате (то есть, сколько устройств IIC, устройств SPI и т. д. находится на плате разработки),dtsiописыватьSOCинформация об уровне(То естьSOCЕсть несколькоCPU、Какая основная частота、Сколько информации в регистрах управления периферийными устройствами и т. д.)

Каталог статей

Что такое дерево устройств

Дерево устройства (Устройство Tree), чтобы разделить слова «устройство» и «дерево».,описывать Файл дерева устройств устройства называетсяDTS (Источник дерева устройств), этот файл DTS использует древовидную структуру для представления устройства платы.,То есть информация о плате разработки,Например, количество процессоров, базовый адрес памяти、Какие устройства подключены к интерфейсу Какие устройства подключены к IIC?, интерфейсу SPI и т.д. Как показано на первой картинке! На рисунке основой дерева является системная шина, а контроллер IIC, контроллер SPI и т. д. подключены к ветвям основной линии системы. Существуют соответствующие правила синтаксиса для описания информации об устройстве через файл DTS, а в ядре Linux только версии 3.x и более поздние поддерживают деревья устройств.

DTS, DTB и DTC.

Расширение исходного файла деревянного устройства — .dts Я использовал файлы .dtb, следуя руководствам Punctual Atom.,Какая связь между этими двумя файлами??на самом делеDTS — файл исходного кода дерева устройств.,DTB — двоичный файл, полученный после компиляции DTS.。существоватьLinuxгенерал-лейтенант.cФайл скомпилирован в.oфайлы необходимо использоватьgccкомпилятор,Затем ** Инструмент, необходимый для компиляции .dts в .dtb, — это инструмент DTC**! И этот файл .dtb представляет собой двоичный файл дерева устройств (.dtb), который UBOOT передает ядру Linux через команду bootz или bootm.

Синтаксис DTS

Хотя в нашей повседневной работе мы практически не пишем файл .dts от начала до конца, будучи студентом, я могу попытаться изучить базовый синтаксис .dts и изменить исходный SOC для поиска работы в будущем. в предоставленном файле .dts. DTS на самом деле представляет собой текстовый файл ASCII, который относительно удобно читать и изменять.

Заголовочный файл .dtsi

Как и язык C, дерево устройств также поддерживает файлы заголовков. Расширение файла заголовка дерева устройств — .dtsi. В imx6ull-alientek-emmc.dts имеется следующее содержимое:

Язык кода:javascript
копировать
12 #include <dt-bindings/input/input.h> //Ссылка на заголовочный файл .h "input.h"
13 #include "imx6ull.dtsi" //Цитировать Заголовочный файл .dtsi

Через приведенный выше код Это можно увидетьсуществовать.dtsiФайл можно передать напрямую черезincludeПриходить Цитировать.h.dtsi.dts。Общий.dtsiиспользуется дляописыватьSOCвнутренняя периферийная информация,Например, архитектура ЦП, основная частота, диапазон адресов периферийных регистров.,Такие как UART, IIC и т. д.

узел устройства

Дерево устройств использует древовидную структуру для хранения файлов информации об устройстве на плате. Каждое устройство представляет собой узел, называемый узлом. устройства,Каждый узел представлен некоторой атрибутивной информацией. Описание информации об узле.,Свойства — это пары ключей. Ниже приведено содержимое файла дерева устройств, уменьшенное из файла imx6ull.dtsi на основе Руководства по разработке драйверов Zhengdian Atomic:

Язык кода:javascript
копировать
/ { 
   
	aliases { 
   
		can0 = &flexcan1; 
	}; 
	 cpus { 
   
	  	#address-cells = <1>; 
	  	#size-cells = <0>; 
	  	cpu0: cpu@0 { 
    
		  	compatible = "arm,cortex-a7"; 
		  	device_type = "cpu"; 
		  	reg = <0>; 
	  	}; 
	}; 
	intc: interrupt-controller@00a01000 { 
    
		compatible = "arm,cortex-a7-gic"; 
		#interrupt-cells = <3>; 
		interrupt-controller; 
		reg = <0x00a01000 0x1000>, 
		<0x00a02000 0x100>; 
	}; 
} 
  • /дакорневой узел, в каждом файле дерева устройств есть только один корневой узел узел, если два и более файлов в проекте имеют /корневой узел, то корневой в этих файлах Содержимое узла будет объединено в один корневой узел。
  • псевдонимы, cpus и intc — три дочерних узла,существовать Именование узлов в дереве устройств Формат:node-name@unit-address
    • node-nameдаузелизимя,для ASCIIнуть,Имя узла должно четко идентифицировать функцию узла.,напримерuart1Это означаетэтот узелдаUART1периферийные устройства。unit-addressОбычно представляет адрес устройства или первый адрес регистра.,Если узел не имеет адреса или регистраunit-addressЭто нормально не,напримерcpu@0interrupt-controller@00a01000
    • cpu0:cpu@0Нетдаnode-name@unit-addressТакой формат,идаиспользоватьотдельныйстал двумя частями,Переднийдаузел标签,позжедаузелимя,Формат:lable:node-name@unit-address,Цель введения меток — облегчить доступ к узлам.,можно передать напрямую&labelпосетить этот узел,напримерпроходить&cpu0вы можете получить доступcpu@0этот узел,Нет необходимости вводить полное имя узла.
  • cpu0 в приведенном выше коде также является узлом,Просто cpu0 является дочерним узлом процессора. Каждый узел имеет разные свойства,Разные атрибуты имеют разное содержимое,Атрибуты — это все пары ключей.,ценить может быть пустой или произвольный поток байтов. Несколько форматов, обычно используемых в дереве устройств. данные выглядят так:

Форма данных

Метод реализации

Подробное описание

нить

compatible = "arm,cortex-a7;

настраиватьсовместимый атрибутизценитьдлянитьarm,cortex-a7

32-битное целое число без знака

reg=<0>

настраиватьregизценить ХОРОШОнастраиватьдлягруппаценитьreg=<0 0x123456 100>;

нитьсписок

compatible = "fsl,imx6ull-gpmi-nand", "fsl, imx6ul-gpmi-nand";

нитьинитьиспользуется между,отдельный

Стандартные свойства

Узлы состоят из набора атрибутов,Узлы — это конкретные устройства, а разные устройства требуют разных атрибутов.,Пользователи могут настраивать атрибуты. В дополнение к пользовательским атрибутам,Есть много свойств, которые являются Стандартными свойствами., многие драйверы периферийных устройств под Linux будут использовать эти Стандартные свойства。

  1. совместимый атрибут

совместимый Атрибут также называется атрибутом «совместимости», и это очень важный атрибут! совместимый Ценить атрибут представляет собой список нитей, а атрибут compatibel используется для привязки устройства и драйвера. Список нить используется для выбора драйвера, который будет использоваться устройством, совместимый Формат атрибута следующий:

Язык кода:javascript
копировать
"manufacturer,model"

Производитель представляет производителя, а модель обычно представляет собой имя драйвера, соответствующего модулю. Аудиочип на плате разработки I.MX6U-ALPHA использует WM8960 производства Ou Sheng, а звуковой узел использует совместимый атрибут следующий:

Язык кода:javascript
копировать
compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";

Видно, что есть два атрибута ценить, а именно "fsl,imx6ul-evk-wm8960″ и «fsl,imx-audio-wm8960″,FSL указывает, что производителем является Freescale.,imx6ul-evk-wm8960иimx-audio-wm8960Представляет модуль драйвераизимя。soundДанное устройство впервые использует первый совместимыйценить СноваLinuxПоиск в ядре,Проверьте, можно ли найти соответствующий файл драйвера,Если не найден, используйте второй совместимый поиск ценить.,Играйте целиком, пока не найдете, или выполните поиск.LinuxЯдро не нашло соответствующийизводить машину。 в целомФайлы программного драйвера будут иметь таблицу соответствия OF.,этотOFТаблица соответствия содержит некоторыеcompatibleценить,Если совместимый атрибутценить узла устройства равен любой цене в таблице соответствия OF, то это означает, что устройство может использовать этот драйвер.

  1. атрибут модели атрибут моделиценить То естьодиннить,в целоматрибут модели запись информации о модуле устройства,Как имя или что-то в этом роде,например:
Язык кода:javascript
копировать
model=”wm8960-audio";
  1. атрибут статуса атрибут Результат Посмотрев на название, вы поймете, что оно связано со статусом устройства, атрибутом статусаценитьтакжеданить,нит — информация о состоянии устройства,Состояния, которые можно выбрать, показаны в таблице:

ценить

описывать

okay

Указывает, что устройство работает

disabled

Указывает, что устройство в данный момент неработоспособно,Но в будущем он может заработать,Например, после подключения устройства с возможностью горячей замены. Что касается конкретного значения слова «отключено», обратитесь к документу о привязке устройства.

fail

Указывает на то, что устройство неработоспособно, в устройстве обнаружена серия ошибок, и устройство, скорее всего, станет работоспособным.

fail-sss

Значение такое же, как и error. Следующая часть sss представляет собой содержимое обнаруженной ошибки.

  1. Свойства #address-cells и #size-cells Оба свойства представляют собой 32-битные целые числа без знака.,#address-cellsи#size-cellsЭти два свойства могутИспользуется в любом устройстве, имеющем дочерние узлы, используется для информации об адресе дочернего узла.。#address-cellsАтрибуты определяют дочерние узлыатрибут Размер слова, занимаемого адресной информацией в регистре (32 бита), Атрибут #size-cells ценить определяет, как дочерним узлам следует записывать атрибут. regценить,Обычно атрибуты reg связаны с адресами. Существует два типа информации, связанной с адресом: начальный адрес и длина адреса.,атрибут regиз Формат::reg = <address1 length1 address2 length2 address3 length3…… > каждый адрес Комбинация длин представляет собой диапазон адресов, где адрес — это начальный адрес, длина — это длина адреса, #address-cells указывает длину слова, занимаемого адресными данными, #size-cells указывает длину слова, занимаемую данными длины, для пример:
Язык кода:javascript
копировать
spi4 { 
    
	compatible = "spi-gpio"; 
	#address-cells = <1>; #Объясняет дочерний узел атрибута spi4 Длина слова, занимаемая начальным адресом в reg, равна 1.
	#size-cells = <0>; #Длина слова, занимаемая адресом, равна 0
	gpio_spi: gpio_spi@0 { 
    #атрибут regценить равен 0, поскольку соответствующая цена устанавливается в родительском узле, наследует начальный адрес родительского узла и не задает длину адреса.
		compatible = "fairchild,74hc595"; 
		reg = <0>; 
	}; 
 }; 
aips3: aips-bus@02200000 { 
    
	compatible = "fsl,aips-bus", "simple-bus"; 
	#address-cells = <1>; 
	#size-cells = <1>; 
	dcp: dcp@02280000 { 
    
		compatible = "fsl,imx6sl-dcp"; 
		reg = <0x02280000 0x4000>; #address=0X02280000,length=0X4000
	 }; 
};
  1. атрибут reg атрибут regценитьв целомда(address,length)。Обычно используется для записи информации о ресурсах адресного пространства устройства, обычно информации о диапазоне адресов регистра определенного периферийного устройства.
  2. Атрибут диапазонов Атрибут Диапазоновценить может быть пустым или числовой матрицей, записанной в формате (адрес дочерней шины, адрес родительской шины, длина), диапазоны — это таблица сопоставления/преобразования адресов, Атрибут Каждый проект диапазонов состоит из трех частей: дочернего адреса, родительского адреса и длины адресного пространства.
  • адрес дочерней шины Физический адрес адресного пространства подшины. Длина слова, занимаемого этим физическим адресом, определяется #адресными ячейками родительского узла.
  • адрес родительской шины Физический адрес адресного пространства родительской шины, длина слова, занимаемого этим физическим адресом, также определяется #адресными ячейками родительского узла.
  • длина Длина подадресного пространства, длина слова, занимаемого этой длиной адреса, определяется #size-ячейками родительского узла.

Если Атрибут диапазоновценитьдлянулевойценить,Обратите внимание, что подадресное пространство точно такое же, как и родительское адресное пространство.,Перевод адреса не требуется

  1. атрибут имени атрибут имениценитьдлянить,атрибут имя используется для записи имен узлов, атрибута имя устарело, а атрибут устарел. имени, некоторые старые файлы дерева устройств могут использовать этот атрибут.
  2. атрибут device_type атрибут device_typeценитьдлянить,IEEE1275 будет использовать этот атрибут.,Fкод для регистрации устройства,Но в дереве устройств нет FCode,Таким образом, это свойство также было отброшено. Этот атрибут можно использовать только для узлов процессора или узлов памяти. Этот атрибут используется узлом CPU0 файла imx6ull.dtsi.,Содержание следующее:
Язык кода:javascript
копировать
cpu0: cpu@0 { 
    
	compatible = "arm,cortex-a7"; 
	device_type = "cpu"; 
	reg = <0>; 
	...... 
};

корневой узел совместимый атрибут

Каждый узел имеет совместимость атрибут,корневой узел/не исключение,imx6ull-alientek-emmc.dtsв файлекорневой узел не совместим Содержание атрибута следующее:

Язык кода:javascript
копировать
/{ 
   
	model = "Freescale i.MX6 ULL 14x14 EVK Board"; 
	compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
	......
}

Это можно увидетькорневой узел не совместим атрибут可以知道我们所使использоватьизоборудование,Обычно первая ценаописать указывает имя используемого аппаратного устройства.,Вторая цена при использовании определенного устройства — это установка используемого устройством SOC.,如果使использоватьиздаimx6ullВот этотSOC。LinuxЯдро пройдеткорневой Используйте совместимый атрибут узла, чтобы проверить, поддерживается ли это устройство. Если это устройство поддерживается, устройство запустит ядро ​​Linux.

Метод сопоставления устройств без использования дерева устройств

Прежде чем использовать дерево устройств,uboot передаст файл с именем «machine» ядру Linux. idизценить,machine Идентификатор — это идентификатор устройства. Он сообщает ядру Linux, какое это устройство, и проверяет, поддерживает ли оно его. Конкретная реализация - судить о машине Проверьте, сравнивается ли параметр id с макросом MACH_TYPE_XXX в коде, чтобы убедиться, что они равны. Если они равны, значит, ядро ​​Linux поддерживает это устройство. Если нет, то это устройство не может запустить ядро ​​Linux.

Метод сопоставления устройств с использованием дерева устройств

Когда ядро ​​Linux больше не использует MACHINE_START после введения дерева устройств, а заменило его на DT_MACHINE_START. Это показывает, что после введения дерева устройств оно не будет основано на машине. идентификатор для проверки Linux Поддерживает ли ядро ​​это устройство. В ядре Linux запустите ядро ​​с помощью функции start_kernel, а затем функция start_kernel вызовет функцию setup_arch для сопоставления с Machine_desc, а затем вызовет функцию setup_machine_fdt для дальнейшего получения соответствия Machine_desc, параметр этой функции — это первый адрес atags (то есть первый адрес файла dtb, передаваемого uboot в ядро ​​Linux). Функция setup_machine_fdt возвращает цену, которая является наиболее подходящим найденным Machine_desc. Затем получите корневую часть дерева устройств через of_get_flat_dt_root. узел。

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/149413.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose