Зарезервирую еще одну страничку для дерева устройств (dts), так как чую что придется еще неоднократно возвращаться к этому вопросу.

Итак, device tree это просто файлик, где особым образом описана периферия. Основная идея довольно простая — избавиться от зависимости в ядре или модулях от периферии. Т.е. в модуле или ядре вы прописываете, что нужно использовать ножку X, а номер этой ножки взять в отдельном файле. Таким образом, вы избавляетесь от необходимости пересобирать ядро и модули для каждой конкретной железяки. Например, на железяке1 микросхема подключена к i2c1, а на второй железяке к i2c2. Так вот, образ системы можно использовать одинаковый, а номера портов просто прописать в dts.

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

Теперь более подробно. Обычно файлы device tree лежат где то в kernel-source/arch/arm/boot/dts. Тут тоже не все так просто 🙂 dts это исходник, который нужно скомпилить в бинарь. А уже его положить на карту памяти в папку boot. Например, для второй малины у меня он называется bcm2709-rpi-2-b.dts, бинарь будет соответственно bcm2709-rpi-2-b.dtb

Как собрать? Тут тоже свои нюансы. Если у вас стандартный dts файл, то вы можете его собрать device tree compiler, причем даже под убунтой он у вас соберется и будет работать для любой платформы.

dtc -I dts -O dtb -o bcm2709-rpi-2-b.dtb bcm2709-rpi-2-b.dts

Однако, если в нем есть инклудники или какие то не стандартные фичи, то например для малины, под бубунтой придется собирать кросскомпилятором. Для этого файл должен быть включен в Makefile. Обратить внимание именно dtb.

make bcm2709-rpi-2-b.dtb

Теперь перейдем к самому главному, содержимому. Основная идея довольно простая

узел {
   свойство = значение
}

Важно то, что есть стандартные и нестандартные свойства, с точки зрения правильности использования. Если заглянуть в бинарь, то нестандартные не преобразовываются компилятором, видимо поэтому работа с ними более накладно, поэтому рекомендуют юзать только стандартные свойства.

Свойства бывают разных типов, первое время мне было не понятно почему где то используют квадратные скобки

[01]

где то угловые

<1>

на первый взгляд кажется без разницы и там 1, и там 1, но таки это важно ибо в первом случае используется байтовое число в во втором 4 байтовое. Поэтому будьте внимательны 🙂

Compatible, свойство назначение которого определить принадлежность к конкретной железяке, т.е. для нескольких железяк может быть один и тот же dts с небольшими различиями, и когда нужно указать что именно это отличие относится к именно этой плате, это свойство будет полезным.

compatible = "brcm,bcm2709";

И пара простых примеров, например настройка 17 пина на вход с подтяжкой.

&gpio {

	pinctrl-names = "default";
        pinctrl-0 = <&my_pins>;

        my_pins: my_pins {
                brcm,pins = <17>;      /* gpio number */
                brcm,function = <0>;   /* 0:in, 1:out */
                brcm,pull = <2>;       /* 2:up 1:down 0:none */
        };

Настройка светодиода на 17 ножке для мигания по таймеру.

&leds {
	green {
            gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
            default-state = "on";
            linux,default-trigger = "timer";
        };

Некоторые ништяки после добавления можно наблюдать в /proc/device-tree

Тема естественно не раскрыта и тут еще много о чем нужно написать, надеюсь со временем, добавлю еще примеров.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика