Каковы плюсы / минусы разных способов настройки GPIO на Beaglebone Black?
Я создаю новое приложение, используя Beaglebone Black. Мне нужно настроить GPIO для разных функций. У меня будет несколько GPIO, несколько ШИМ и, возможно, некоторые другие функции.
Я отмечаю, что есть разные способы сделать это. Это в порядке предпочтения:
- Я могу написать код, используя библиотеку Adafruit's Python, чтобы сказать "установить этот вывод как ШИМ" и т. Д.;
- Я могу сделать то же самое в Javascript;
- Я могу создать и скомпилировать исходный файл наложения дерева устройств (.dts) и использовать его;
- Я мог бы сделать скрипт bash и вывести "out", "in" и т. Д. В различные определения устройств в файловой системе;
- Я представляю, что есть C API, хотя я бы не использовал его для этого приложения.
Моя большая потребность здесь - воспроизводимость. Мне не нужна высокая производительность. Мне просто нужно иметь возможность настроить кучку черных биглебонов таким же образом и заставить их вести себя надежно.
Есть ли какое-то преимущество, которое я не вижу в наложении дерева устройств и все такое? Когда кто-то выберет один метод вместо другого?
1 ответ
Пин-мультиплексоры настраиваются через регистры в подсистеме модуля управления процессора AM335x. При работе с GNU/Linux регистры модуля управления могут быть доступны только из пространства ядра, и, следовательно, это должен делать драйвер ядра.
На BeagleBone есть драйвер под названием bone-pinmux-helper, который позволяет во время выполнения переключаться между различными конфигурациями pinmux из пользовательского пространства. Конфигурации необходимо предварительно настроить и передать драйверу с наложением дерева устройств. Например, в PyBBIO у меня есть скрипт, который генерирует оверлеи для каждого из выводов GPIO. Они настраивают различные возможные режимы (вход, выход, подтягивание, раскрытие и т. Д.), А затем передают все это драйверу bone-pinmux-helper как различные режимы. Тогда когда pinMode()
Вызывается functino, PyBBIO использует драйвер capemgr для загрузки сгенерированного оверлея для вывода, затем использует запись sysfs, которую он создает для этого вывода, чтобы установить его в запрошенном режиме.
Bonescript использует тот же метод, что и PyBBIO, и IIRC Adafruit_BBIO не имеет оверлеев для микширования и требует, чтобы пользователь делал это отдельно.
Итак, вкратце, наложения Device Tree - это единственный способ сделать pinmuxing, а пользовательские библиотеки, такие как PyBBIO и bonescript, просто абстрагируют это. Если вы хотите иметь полный контроль, то пишите и компилируйте свои собственные оверлеи. Если вы не хотите иметь дело с написанием оверлеев DT или беспокоиться о совместимости, поскольку со временем все может измениться, используйте библиотеку, такую как PyBBIO или Bonescript, которая абстрагируется от этого уровня и верит, что они будут работать.