Raspberry Pi:Настройка/EEPROM-память для HAT-устройств и дерево устройств
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
//в процессе обработки
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
Наконец, делаем перезагрузку и наслаждаемся видом мигающего светодиода.
Кроме того, чтобы после загрузки ядра проделать некоторую автоконфигурацию (т.е. выполнить некоторые манипуляции с модулями при помощи команды modprobe, откалибровать TFT-экран и т.д.), я использую специальный файл с параметрами, основанный на JSON. Позднее его можно будет проанализировать. Формат JSON я выбрал, потому что благодаря нему файл получается небольшим, читаемым и легко поддающимся анализу.
Чтобы добавить этот файл с параметрами в EEP-файл, проделайте следующее:
./eepmake eeprom_settings.txt myhat-with-dt.eep myled.dtb -c myparams.json