Мини-компьютеры/периферия/GPIO: различия между версиями
Строка 90: | Строка 90: | ||
можно скомпилировать в файлы {{term|.dtbo}} и загрузчик u-boot | можно скомпилировать в файлы {{term|.dtbo}} и загрузчик u-boot | ||
при загрузке объединит файл {{term|.dtb}} с файлами {{term|.dtbo}} | при загрузке объединит файл {{term|.dtb}} с файлами {{term|.dtbo}} | ||
и получит текущую конфигурацию платы, | и получит текущую конфигурацию платы, которую передаст ядру. | ||
Device Tree можно условно сравнить с BIOS, а Overlays - с меню настроек BIOS. | |||
В Raspbian | В Raspbian имеется огромный набор оверлеев под различную GPIO периферию. | ||
достаточно добавить | для указанного выше модуля rtc в Raspbian достаточно добавить в | ||
{{path|/boot/config.txt}} | {{path|/boot/config.txt}} | ||
dtoverlay=i2c-rtc,pcf8563 | dtoverlay=i2c-rtc,pcf8563 | ||
и система загрузится как на машине со встроенными часами. кроме как в загрузчик, | |||
собственно в систему никаких настроек вносить не надо. | |||
К сожалению, это все богатство пока не входит в vanilla kernel, | |||
и сам механизм Device_Tree еще в разработке<ref>https://archive.fosdem.org/2018/schedule/event/hwenablement_simplifying_soc_enablement_in_linux/</ref>. | |||
Таким образом, в ALT файл оверлея придется откуда-то взять, адаптировать при необходимости, | |||
оттранслировать в {{term|.dtbo}}. Далее, в ALT конфигурации загрузчика | |||
не предусмотрена поддержка оверлеев, надо смотреть, как сделано, | |||
например, в armbian<ref>https://docs.armbian.com/User-Guide_Allwinner_overlays/<ref>. | |||
Поэтому сейчас в ALT, к сожалению, проще править настройки. | |||
достаточно написать обработчики событий появления устройств i2c и rtc. | |||
казалось бы, для модуля из примера выше достаточно | |||
KERNEL=="i2c-1", SUBSYSTEM=="i2c-dev", ACTION=="add", RUN+="/bin/sh -c 'echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device'" | KERNEL=="i2c-1", SUBSYSTEM=="i2c-dev", ACTION=="add", RUN+="/bin/sh -c 'echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device'" | ||
KERNEL=="rtc0", SUBSYSTEM=="rtc", ACTION=="add", RUN+="/sbin/hwclock -s --utc -f /dev/rtc0" | KERNEL=="rtc0", SUBSYSTEM=="rtc", ACTION=="add", RUN+="/sbin/hwclock -s --utc -f /dev/rtc0" | ||
но udev запускает скрипты без CAP_SYS_TIME, | |||
пришлось hwclock выносить в systemd service: | |||
$ cat /etc/udev/rules.d/10-i2c-rtc.rules | $ cat /etc/udev/rules.d/10-i2c-rtc.rules | ||
Строка 120: | Строка 133: | ||
Type=oneshot | Type=oneshot | ||
ExecStart=/sbin/hwclock -s --utc | ExecStart=/sbin/hwclock -s --utc | ||
С такими настройками время выставляется на раннем этапе загрузки. | |||
=== Советы начинающему пользователю по выбору железа === | === Советы начинающему пользователю по выбору железа === |
Версия от 21:14, 17 августа 2019
Настройка систем ALT Linux для поддержки
периферии к одноплатным и другим мини-компьютерам,
которая подключается/подпаивается к разъемам/контактам на плате.
Часы реального времени.
Много одноплатных компьютеров не имеет встроенных часов (rtc clock). Но можно подключить готовый модуль с отсеком для батарейки и микросхемой rtc clock, как правило, подключаемой по шине I2C.
В ядре поддерживаются практически все популярные микросхемы i2c rtc clock. Однако их настройка требует некоторых телодвижений.
тестирование подключения i2c rtc clock
К примеру, рассмотрим пробное подключение модуля с микросхемой часов pcf8563 к шине i2c №1 (/dev/i2c-1).
# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Видим, что устройство доступно на шине №1 (опция -y 1) с адресом 0x51. Выполняем команду
# echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device
после чего появится устройство /dev/rtc0.
- dmesg | grep rtc
[ 18.259456] rtc-pcf8563 1-0051: registered as rtc0
# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
теперь i2cdetect по адресу 0x51 показывет UU, что означает, что данное устройство открыто ядром и недоступно пользователю.
Для практически любого модуля часов указания по тестовому подключению можно легко найти в интернет.
Настройка системы для i2c rtc clock
Тонкость настройки системы для i2c rtc clock в том, чтобы при загрузке подключить часы и выставить время как можно раньше, чтобы получить правильное время в логах и отсутствие странного в /etc/adjtime.
В идеале, ядро должно увидеть часы прямо при старте ядра. Этот идеал достижим с помощью механизма Device Tree и Device Tree Overlay.
В отсутствие BIOS/UEFI механизм Device_Tree позволяет использовать одно и то же универсальное ядро, подгружая ему загрузчиком файл .dtb (Device Tree Binary) с описанием устройств конкретной платы. Более того, в Device_Tree есть возможность менять конфигурацию платы с помощью механизма Device Tree Overlay. Варианты конфигурации можно скомпилировать в файлы .dtbo и загрузчик u-boot при загрузке объединит файл .dtb с файлами .dtbo и получит текущую конфигурацию платы, которую передаст ядру. Device Tree можно условно сравнить с BIOS, а Overlays - с меню настроек BIOS.
В Raspbian имеется огромный набор оверлеев под различную GPIO периферию. для указанного выше модуля rtc в Raspbian достаточно добавить в /boot/config.txt
dtoverlay=i2c-rtc,pcf8563
и система загрузится как на машине со встроенными часами. кроме как в загрузчик, собственно в систему никаких настроек вносить не надо. К сожалению, это все богатство пока не входит в vanilla kernel, и сам механизм Device_Tree еще в разработке[1].
Таким образом, в ALT файл оверлея придется откуда-то взять, адаптировать при необходимости, оттранслировать в .dtbo. Далее, в ALT конфигурации загрузчика не предусмотрена поддержка оверлеев, надо смотреть, как сделано, например, в armbian<ref>https://docs.armbian.com/User-Guide_Allwinner_overlays/<ref>.
Поэтому сейчас в ALT, к сожалению, проще править настройки. достаточно написать обработчики событий появления устройств i2c и rtc. казалось бы, для модуля из примера выше достаточно
KERNEL=="i2c-1", SUBSYSTEM=="i2c-dev", ACTION=="add", RUN+="/bin/sh -c 'echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device'" KERNEL=="rtc0", SUBSYSTEM=="rtc", ACTION=="add", RUN+="/sbin/hwclock -s --utc -f /dev/rtc0"
но udev запускает скрипты без CAP_SYS_TIME, пришлось hwclock выносить в systemd service:
$ cat /etc/udev/rules.d/10-i2c-rtc.rules KERNEL=="i2c-1", SUBSYSTEM=="i2c-dev", ACTION=="add", RUN+="/bin/sh -c 'echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device'" KERNEL=="rtc0", SUBSYSTEM=="rtc", SUBSYSTEMS=="i2c", TAG+="systemd", ENV{SYSTEMD_WANTS}="i2c-rtc-hwclock.service"
$ cat /etc/systemd/system/i2c-rtc-hwclock.service [Install] RequiresMountsFor=/usr/share/zoneinfo [Unit] Description=Set system time from i2c hardware real time clock CapabilityBoundingSet=CAP_SYS_TIME #DefaultDependencies=no Before=time-set.target getty.target chrony.service ntpd.service systemd-timedated.service WantedBy=time-set.target getty.target chrony.service ntpd.service systemd-timedated.service [Service] Type=oneshot ExecStart=/sbin/hwclock -s --utc
С такими настройками время выставляется на раннем этапе загрузки.
Советы начинающему пользователю по выбору железа