Raspberry Pi:Настройка/Изменение дефолтной распиновки GPIO-контактов
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Изменение дефолтной распиновки GPIO-контактов[1]
Начиная с 15 июля 2014 года прошивка Raspberry Pi поддерживает изменение дефолтной распиновки Raspberry Pi при помощи пользовательского DTB-файла. Чтобы проверить, является ли версия вашей прошивки достаточно новой, запустите команду vcgencmd version.
Создание пользовательского blob-файла с информацией о дереве устройств
Чтобы переконвертировать DTS-файл (эта аббревиатура расшифровывается как «device tree source», что можно перевести как «источник данных о дереве устройств») в DTB-файл (эта аббревиатура расшифровывается как «device tree blob», что можно перевести как «массив двоичных данных о дереве устройств»), вам надо установить компилятор дерева устройств. Делается это при помощи команды
sudo apt-get install device-tree-compiler
После этого вы сможете использовать команду dtc — примерно следующим образом:
sudo dtc -I dts -O dtb -o /boot/dt-blob.bin dt-blob.dts
Кроме того, если необходимо, DTB-файл можно переконвертировать обратно в DTS-файл.
dtc -I dtb -O dts -o dt-blob.dts /boot/dt-blob.bin
Секции DTB-файла
Этот dt-blob.bin обычно используется, чтобы при загрузке Pi осуществлять конфигурацию GPU. Ядро Linux этот файл не использует (по крайней мере, на данный момент), но позднее разработчики обещают добавить в dt-blob.bin секцию kernel, чтобы с ее помощью осуществлять конфигурацию ядра Raspberry Pi. DTB-файл позволяет задавать альтернативные настройки, благодаря чему способен конфигурировать любую версию Raspberry Pi, включая даже Вычислительный Модуль (Compute Module). Для DTB-файла корректны следующие секции:
1. videocore
Эта секция содержит всю бинарную информацию о графическом ядре. Все нижеследующие секции должны быть заключены внутрь этой «главной» секции.
2. pins_*
Тут может быть до восьми отдельных секций pins_*, а именно:
- pins_rev1. Распиновка для Rev 1. Может немного отличаться из-за перемещенных I2C-контактов.
- pins_rev2. Распиновка для Rev 2, включая восемь контактов разъема P5.
- pins_bplus1. Model B+ Rev 1.1, включая полный 40-контактный коннектор.
- pins_bplus2. Model B+ Rev 1.2. Сетевые и питающие контакты поменялись местами.
- pins_aplus. Model A+ за вычетом Ethernet.
- pins_2b1. Pi 2 Model B Rev 1.0. SMPS управляется через I2C0.
- pins_2b2. Pi 2 Model B Rev 1.1. SMPS управляется через I2C на R42 и R43.
- pins_cm. Вычислительный модуль. Имейте в виду, что дефолтные настройки для этого устройства — это дефолтные настройки и для чипа тоже. Поэтому для начала было бы полезно раздобыть где-нибудь исходную информацию о дефолтных стягивающих и подтягивающих резисторах чипа.
Каждая из этих секций может содержать секции pin_config и pin_defines.
3. pin_config
Эта секция используется для конфигурации отдельных контактов. Каждый элемент этой секции должен быть проименован в соответствии с тем контактом, информация о котором в нем содержится. К примеру, pin@p32 будет означать GPIO32.
Кроме того, тут есть специальная секция pin@default, содержащая дефолтные настройки для тех контактов, которые не указаны в pin_config.
4. pin@pinname
В этой секции может содержать любое сочетание нижеперечисленных элементов:
1. polarity
— active_high
— active_low
2. termination
— pull_up
— pull_down
— no_pulling
3. startup_state
— active
— inactive
4. function
— input
— output
— sdcard
— i2c0
— i2c1
— spi
— spi1
— spi2
— smi
— dpi
— pcm
— pwm
— uart0
— uart1
— gp_clk
— emmc
— arm_jtag
5. drive_strenght_ma. В этой секции задается выходной ток для GPIO-контактов. Обратите внимание, что это значение задается разом для всех GPIO-контактов Raspberry Pi. Корректные значения для этой секции — «8» и «16».
5. pin_defines
Эта секция используется, чтобы задать отдельным контактам специальный GPU-функционал. Это позволяет, к примеру, переместить на другое место контакты для питания камеры или для подключения HDMI (т.е. речь о вещах, которые Linux не контролирует). Пример DTS-файла — ниже.
Настройка тактовой частоты
Через этот интерфейс можно настраивать и тактовую частоту, но результаты такой настройки предугадать довольно сложно. Конфигурация тактово-частотной системы очень-очень сложна, поскольку Pi имеет пять отдельных PLL-блоков, каждый из которых имеет собственную фиксированную (или вариативную — если речь о PLLC) ГУН-частоту. Кроме того, каждый ГУН имеет множество различных каналов, каждый из которых может быть настроен по-разному — в зависимости от того, на какое значение поделить VCO-частоту. Кроме того, каждый «пункт назначения» тактовой частоты тоже может быть настроен на определенный канал. Впрочем, тут есть и определенные ограничения, поскольку между определенными каналами и получателями «маршрут» проложить нельзя.
По этой причине мы предлагаем рассмотреть пару примеров, которые можно использовать для изменения очень специфичных тактовых частот (см. ниже). В более общем смысле эти настройки добавляются, если какой-то элемент системы запрашивает определенную тактовую частоту.
clock_routing {
vco@PLLA { freq = <1966080000>; };
chan@APER { div = <4>; };
clock@GPCLK0 { pll = "PLLA"; chan = "APER"; };
};
clock_setup {
clock@PWM { freq = <2400000>; };
clock@GPCLK0 { freq = <12288000>; };
clock@GPCLK1 { freq = <25000000>; };
};
В примере выше мы настраиваем PLLA на исходную ГУН-частоту в 1,96608 ГГц (ограничения для этого ГУН — 600 Мгц - 2,4 ГГц), канал APER – на исходную частоту с делением на «4», а GPCLK0 — на то, чтобы источником выступал PLLA через APER. Конкретно эти настройки используются, чтобы дать аудиокодеку 1288000 Гц, необходимые для генерации 48000 Гц.
Пример DTS-файла
Впрочем, DTS-файл, который использовался для компиляции DTB-файла в прошивке от 30 мая 2015, можно загрузить отсюда.