Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

Зарезервирую еще одну страничку для дерева устройств (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

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

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

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

Счетчик
Яндекс.Метрика