Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Как мы все знаем, операционные системы постоянно обновляются и развиваются, а архитектура драйверов 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, следуя руководствам Punctual Atom.,Какая связь между этими двумя файлами??на самом делеDTS — файл исходного кода дерева устройств.,DTB — двоичный файл, полученный после компиляции DTS.。существоватьLinuxгенерал-лейтенант.cФайл скомпилирован в.oфайлы необходимо использоватьgccкомпилятор,Затем ** Инструмент, необходимый для компиляции .dts в .dtb, — это инструмент DTC**! И этот файл .dtb представляет собой двоичный файл дерева устройств (.dtb), который UBOOT передает ядру Linux через команду bootz или bootm.
Хотя в нашей повседневной работе мы практически не пишем файл .dts от начала до конца, будучи студентом, я могу попытаться изучить базовый синтаксис .dts и изменить исходный SOC для поиска работы в будущем. в предоставленном файле .dts. DTS на самом деле представляет собой текстовый файл ASCII, который относительно удобно читать и изменять.
Как и язык C, дерево устройств также поддерживает файлы заголовков. Расширение файла заголовка дерева устройств — .dtsi. В imx6ull-alientek-emmc.dts имеется следующее содержимое:
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:
/ {
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>;
};
}
node-name@unit-address
node-name
даузелизимя,для ASCIIнуть,Имя узла должно четко идентифицировать функцию узла.,напримерuart1
Это означаетэтот узелдаUART1
периферийные устройства。unit-addressОбычно представляет адрес устройства или первый адрес регистра.,Если узел не имеет адреса или регистраunit-address
Это нормально не,напримерcpu@0
、interrupt-controller@00a01000
cpu0:cpu
@0Нетдаnode-name@unit-address
Такой формат,идаиспользовать:
отдельныйстал двумя частями,:
Переднийдаузел标签,:
позжедаузелимя,Формат:lable:node-name@unit-address
,Цель введения меток — облегчить доступ к узлам.,можно передать напрямую&labelпосетить этот узел,напримерпроходить&cpu0вы можете получить доступcpu@0этот узел,Нет необходимости вводить полное имя узла.Форма данных | Метод реализации | Подробное описание |
---|---|---|
нить | 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 будут использовать эти Стандартные свойства。
совместимый Атрибут также называется атрибутом «совместимости», и это очень важный атрибут! совместимый Ценить атрибут представляет собой список нитей, а атрибут compatibel используется для привязки устройства и драйвера. Список нить используется для выбора драйвера, который будет использоваться устройством, совместимый Формат атрибута следующий:
"manufacturer,model"
Производитель представляет производителя, а модель обычно представляет собой имя драйвера, соответствующего модулю. Аудиочип на плате разработки I.MX6U-ALPHA использует WM8960 производства Ou Sheng, а звуковой узел использует совместимый атрибут следующий:
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, то это означает, что устройство может использовать этот драйвер.。
model=”wm8960-audio";
ценить | описывать |
---|---|
okay | Указывает, что устройство работает |
disabled | Указывает, что устройство в данный момент неработоспособно,Но в будущем он может заработать,Например, после подключения устройства с возможностью горячей замены. Что касается конкретного значения слова «отключено», обратитесь к документу о привязке устройства. |
fail | Указывает на то, что устройство неработоспособно, в устройстве обнаружена серия ошибок, и устройство, скорее всего, станет работоспособным. |
fail-sss | Значение такое же, как и error. Следующая часть sss представляет собой содержимое обнаруженной ошибки. |
reg = <address1 length1 address2 length2 address3 length3…… >
каждый адрес Комбинация длин представляет собой диапазон адресов, где адрес — это начальный адрес, длина — это длина адреса, #address-cells указывает длину слова, занимаемого адресными данными, #size-cells указывает длину слова, занимаемую данными длины, для пример: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
};
};
Если Атрибут диапазоновценитьдлянулевойценить,Обратите внимание, что подадресное пространство точно такое же, как и родительское адресное пространство.,Перевод адреса не требуется。
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
......
};
Каждый узел имеет совместимость атрибут,корневой узел/
не исключение,imx6ull-alientek-emmc.dtsв файлекорневой узел не совместим Содержание атрибута следующее:
/{
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