Raspberry Pi:Настройка/EEPROM-память для HAT-устройств и дерево устройств

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


//в процессе обработки

EEPROM-память для HAT-устройств и дерево устройств[1]

EEPROM библиотека с файлами из статьи.

Перед тем, как приступить к делу, нам нужно активировать интерфейс Videocore I2C. Делаем это, добавляя в начало файла

/boot/config.txt

строчку

dtparam=i2c_vc=on

.

Теперь перезагружаемся.

Для начала нам нужно обзавестись EEPROM-утилитами (они позволят создавать содержимое для EEPROM, а также считывать/записывать его) и компилятором дерева устройств (device tree compiler или просто DTC). Что касается дерева устройств (device tree или DT), то я следовал совету от Adafruit отсюда.

git clone https://github.com/raspberrypi/hats.git
wget -c https://raw.githubusercontent.com/RobertCNelson/tools/master/pkgs/dtc.sh
chmod +x dtc.sh
./dtc.sh

Итак, компилятор установлен, а директория HAT создана. Идем внутрь и открываем папку eepromutils.

cd hat/eepromutils

Перво-наперво модифицируем

eeprom_settings.txt

, чтобы создать собственную версию HAT-платы. UUID модифицировать не нужно, т.к. он будет генерироваться автоматически.

########################################################################
# Текстовый файл для настроек EEPROM
#
# Отредактируйте этот файл в соответствии с особенностями вашей платы,
# потом пропустите его через инструмент eepmake,
# а затем запишите на HAT EEPROM при помощи инструмента eepflash.
#
# Доступные инструменты:
# eepmake – анализирует текстовый EEPROM-файл и создает бинарный EEPROM-файл
# eepdump – выводит данные из EEP-файла в виде текста, который сможет прочесть человек (в отладочных целях) 
# eepflash – запись и считывание бинарного EEP-файла на/с HAT EEPROM
#
########################################################################

########################################################################
# Информация о поставщике

# 128-битный UUID. Если оставить в eepmake, то он сгенерируется автоматически.
# RFC 4122 compliant UUID
product_uuid 00000000-0000-0000-0000-000000000000

# 16-битный ID продукта 
product_id 0x0001

# 16-битная версия продукта
product_ver 0x0002

# ASCII-строка поставщика  (до 255 символов)
поставщик "Martinlbb"

# ASCII-строка продукта (до 255 символов)
продукт "Brilliant board"


########################################################################
# Настройки для комплекта GPIO-контактов
# 
# Чтобы сменить дефолтные настройки, вместо «0» поставьте 
# другое число. Имейте в виду, что эти настройки применяются 
# лишь покомплектно. Ниже указано несколько настроек – 
# чтобы использовать, раскомментируйте их.

# drive strength, 0=default, 1-8=2,4,6,8,10,12,14,16mA, 9-15=reserved
gpio_drive 0

# 0=default, 1=slew rate limiting, 2=no slew limiting, 3=reserved
gpio_slew 0

# 0=default, 1=hysteresis disabled, 2=hysteresis enabled, 3=reserved
gpio_hysteresis 0

# Если плата обратно подпитывает Pi через 5-вольтные GPIO-контакты:
# 0 = плата не дает обратной подпитки
# 1 = плата дает обратную подпитку и может обеспечивать Pi до 1.3А
# 2 = плата дает обратную подпитку и может обеспечивать Pi до 2А
# 3 = зарезервирован
# Если back_power=2, то на USB у Pi будет автоматически включен
# режим большой мощности.
back_power 0

########################################################################
# Контакты GPIO – расскомментируйте для использования.
# Варианты для FUNCTION: INPUT, OUTPUT, ALT0-ALT5
# Варианты для PULL: DEFAULT, UP, DOWN, NONE
# NB GPIO0 и GPIO1 зарезервированы для ID EEPROM, 
# поэтому их настраивать нельзя.

#         GPIO  FUNCTION  PULL
#         ----  --------  ----
#setgpio  2     INPUT     DEFAULT
#setgpio  3     INPUT     DEFAULT
#setgpio  4     INPUT     DEFAULT
#setgpio  5     INPUT     DEFAULT
#setgpio  6     INPUT     DEFAULT
#setgpio  7     INPUT     DEFAULT
#setgpio  8     INPUT     DEFAULT
#setgpio  9     INPUT     DEFAULT
#setgpio  10    INPUT     DEFAULT
#setgpio  11    INPUT     DEFAULT
#setgpio  12    INPUT     DEFAULT
#setgpio  13    INPUT     DEFAULT
#setgpio  14    INPUT     DEFAULT
#setgpio  15    INPUT     DEFAULT
#setgpio  16    INPUT     DEFAULT
#setgpio  17    INPUT     DEFAULT
 setgpio  18    OUTPUT    DEFAULT
#setgpio  19    INPUT     DEFAULT
#setgpio  20    INPUT     DEFAULT
#setgpio  21    INPUT     DEFAULT
#setgpio  22    INPUT     DEFAULT
#setgpio  23    INPUT     DEFAULT
#setgpio  24    INPUT     DEFAULT
#setgpio  25    INPUT     DEFAULT
#setgpio  26    INPUT     DEFAULT
#setgpio  27    INPUT     DEFAULT

Теперь мы можем создать EEP-файл (т.е. файл формата .eep), за основу которого будет взят файл eeprom_settings.txt. По сути, EEP-файл – это бинарная версия этого файла, уже готовая к тому, чтобы записывать ее на EPROM.

./eepmake eeprom_settings.txt myhat.eep

Теперь у нас есть работающий HAT-файл! Следовательно, теперь мы можем записывать его на EEPROM.

Предположим, что вы используете память 24c32 (на 4 килобайта), но если так, то ваш файл myhat.eep весит меньше. И поскольку вы не знаете статус EEPROM, то может получиться конфликт, т.к. myhat.eep может быть прочитан неправильно. Поэтому, чтобы не допустить этого, начнем с очистки EEPROM.

При помощи команды dd генерируем файл на 4 килобайта, заполненный нулями (нули – мои любимые!). Если у вашей EEPROM другой размер, просто поставьте соответствующую цифру в значении count.

dd if=/dev/zero ibs=1k count=4 of=blank.eep

Чтобы убедиться, что все нормально, можно просмотреть этот бинарный файл при помощи команды hexdump:

hexdump blank.eep

Теперь его можно загрузить в EEPROM:

sudo ./eepflash -w -f=blank.eep -t=24c32

Ответьте «Да», но перед нажатием на Enter тестовую точку нужно заземлить, чтобы деактивировать режим «только для чтения». Далее нажимаем на Enter и, не двигаясь, ждем соединения.

Чтобы убедиться, что все заработало, воспользуемся той же командой для проверки содержимого EEPROM. Но внимание – это заработает только после использования команды eepflash, которая, в свою очередь, должна запустить несколько команд modprobe.

sudo hexdump /sys/class/i2c-adapter/i2c-0/0-0050/eeprom

Если все в порядке, вы увидите только нули. Теперь можно загрузить собственный myhat.eep.

sudo ./eepflash -w -f=myhat.eep -t=24c32

Опять же, после загрузки проверяем еще раз:

sudo hexdump /sys/class/i2c-adapter/i2c-0/0-0050/eeprom

Если содержимое, имеющееся в EEPROM, соответствует, то Raspberry Pi можно перезагрузить.

Чтобы проверить, распознается ли HAT, идем в /proc/device-tree/. Папка HAT появилась? Если да, то все прошло отлично.

cd /proc/device-tree/hat/
more vendor
more product

Следующий шаг – это, вслед за использованием дерева устройств, позволить HAT проделать автоматическую конфигурацию. В данном примере светодиод подключен к 18-ому GPIO (это 12-ый контакт). Кроме того, сначала советуем протестировать его при помощи /sys/class/gpio:

sudo sh -c 'echo "18" > /sys/class/gpio/export'
sudo sh -c 'echo "out" > /sys/class/gpio/gpio18/direction'
sudo sh -c 'echo "1" > /sys/class/gpio/gpio18/value'

Светодиод включился. Чтобы выключить его, делаем следующее:

sudo sh -c 'echo "0" > /sys/class/gpio/gpio18/value'

После этого не забудьте вернуться в директорию hat/eepromutils.

Теперь займемся деревом устройств. Открываем файл под названием myled.dts и вставляем туда приложенный ниже код (взят отсюда).

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2708";

    fragment@0 {
        target = <&leds>;
        __overlay__ {
            my_led: myled {
                label = "MYLED";
                gpios = <&gpio 18 0>;
                linux,default-trigger = "heartbeat";
            };
        };
    };
};

Компилируем его при помощи DTC:

sudo dtc -@ -I dts -O dtb -o myled.dtb myled.dts ; sudo chown pi:pi myled.dtb

В целях тестирования этот DTB-файл можно загрузить как оверлей при помощи dtoverlay= в /boot/config.txt. Впрочем, в этой статье я об этом писать не буду, поэтому ищите дополнительную информацию на эту тему в интернете.

Теперь мы можем сгенерировать EEP-файл, содержащий в себе и информацию об идентификации платы (eeprom_config.txt), и дерево устройств (для автоматической конфигурации ядра).

./eepmake eeprom_settings.txt myhat-with-dt.eep myled.dtb

Теперь очищаем EEPROM и загружаем в него необходимое содержимое (но не забудьте заземлить тестовую точку, чтобы выключить режим «только для чтения»):

sudo ./eepflash -w -f=blank.eep -t=24c32
sudo ./eepflash -w -f=myhat-with-dt.eep -t=24c32

Наконец, просматриваем оригинальный файл и «очеловеченный» EEPROM, проверяя их на согласованность друг с другом.

hexdump myhat-with-dt.eep
sudo hexdump /sys/class/i2c-adapter/i2c-0/0-0050/eeprom

Наконец, делаем перезагрузку и наслаждаемся видом мигающего светодиода.

Последнее напоминание

Начиная играться с добавлением длинного дерева устройств, имейте в виду, что имеете дело с ограниченной памятью (4096 байт для 24с32 памяти). Если вы будете создавать EEP-файл при помощи eepmake, то этот инструмент даст вам и конечный размер этого EEP-файла. Просто проверьте, превышаете ли вы размер EEPROM.

Примечание

TGZ-архив со всеми файлами из этой статьи (включая уже готовый к использованию бинарный EEP-файл) можно скачать тут.

Примечание

Если дерево устройств будет некорректным, ваши eeprom_settings не распознает даже исходный код. Кроме того, загружаемый DT-оверлей иногда не эффективен для «загрузки eeprom».

Кроме того, чтобы после загрузки ядра проделать некоторую автоконфигурацию (т.е. выполнить некоторые манипуляции с модулями при помощи команды modprobe, откалибровать TFT-экран и т.д.), я использую специальный файл с параметрами, основанный на JSON. Позднее его можно будет проанализировать. Формат JSON я выбрал, потому что благодаря нему файл получается небольшим, читаемым и легко поддающимся анализу.

Чтобы добавить этот файл с параметрами в EEP-файл, проделайте следующее:

./eepmake eeprom_settings.txt myhat-with-dt.eep myled.dtb -c myparams.json

См.также

Внешние ссылки