Зробіть крок вперед і пориньте в світ PIO на Raspberry Pi 5 за допомогою PIOLib!
Випуск Raspberry Pi 5 суттєво відрізнявся від попередніх моделей. Створення чіпів, які працюють швидше та споживають менше енергії, продовжуючи підтримувати 3,3 В вводу/виводу, представляє справжні, захоплюючі завдання. Наше рішення полягало в тому, щоб розділити основну SoC (систему на чіпі) на дві частини — обчислювальну половину та половину вводу-виводу — і розмістити між ними швидкісне з’єднання (4-канальний PCIe Gen 3). SoC на Raspberry Pi 5 — це Broadcom BCM2712, а процесор вводу/виводу (який раніше був відомий у світі ПК як «південний міст») — Raspberry Pi RP1.
Разом із усіма звичайними периферійними пристроями — USB, I2C, SPI, DMA та UART — RP1 містив дещо цікавіше. Однією з відмінних особливостей RP2040 була пара блоків PIO, оманливо простих бітів програмованого вводу-виводу, здатних генерувати та отримувати шаблони на низці GPIO. З достатньою хитрістю користувачі змогли керувати світлодіодами NeoPixel і дисплеями HDMI, зчитувати з пристроїв OneWire і навіть підключатися до мережі Ethernet.
RP1 оснащений одним блоком PIO — майже ідентичним двом, які має RP2040 — а також чотирма кінцевими автоматами та пам’яттю інструкцій, розраховану на 32 записи. Однак, якщо не брати до уваги кількох хакерів, він досі перебував у стані бездіяльності; Було б чудово зробити цей ресурс доступним для користувачів для їхніх власних проектів, але є одна заковика.
Потреба у швидкості
З’єднання між вбудованими мікроконтролерами ARM M3 RP1 і апаратним забезпеченням PIO було встановлено якомога швидше, але за рахунок того, що регістри PIO стали недоступними через PCI; єдиним винятком є FIFO кінцевого автомата — канали вхідних і вихідних даних — які можна отримати за допомогою DMA (прямий доступ до пам’яті). Це унеможливлює керування PIO безпосередньо з головних процесорів, тому потрібна альтернатива. Одним із варіантів було б дозволити завантаження коду для виконання на ядрах M3, але існує низка технічних проблем із таким підходом:
1. Нам потрібно «зв’язати» завантажений код із тим, що вже є у мікропрограмі — уявіть це як в’язання квадратів, щоб зробити ковдру (або кардиган для Гаррі Стайлза). Щоб це працювало, мікропрограмі потрібен список імен і адрес усього, до чого може захотіти отримати доступ завантажений код, чого немає в поточній мікропрограмі.
2. Код сторонніх розробників, який працює на ядрах M3, становить загрозу безпеці — не в тому сенсі, що він може викрасти ваші дані (хоча це може бути можливо…), а в тому, що випадково чи за задумом він може порушити роботу вашого Raspberry Pi 5.
3. Після того, як M3 був відкритий таким чином, ми вже не можемо зробити щось по іншому, і це не крок, який ми готові зробити.
Не так, а по іншому
Через ці причини ми обрали інший маршрут.
Остання мікропрограма RP1 реалізує інтерфейс поштової скриньки: простий механізм для надсилання повідомлень між двома сторонами. Ядро має відповідні драйвери поштової скриньки та мікропрограми, а також драйвер rp1-pio
, який представляє інтерфейс ioctl()
для простору користувача. Кінцевим результатом додавання всього цього програмного забезпечення є можливість писати програми за допомогою PIO SDK, які можуть працювати в просторі користувача або в драйверах ядра.
Затримка компромісу
Більшість функцій PIOLib призводять до надсилання повідомлення до мікропрограми RP1, яка виконує операцію — можливо, лише один доступ до введення/виведення — та відповідає. Хоча це спрощує запуск програм PIO на Raspberry Pi 5 (та решті сімейства Raspberry Pi), це має певну ціну. Все це додаткове програмне забезпечення додає затримку; більшість операцій PIOLib займають щонайменше 10 мікросекунд. Для програмного забезпечення PIO, яке просто створює кінцевий автомат, а потім читає або записує дані, це не проблема — гарними прикладами цього є світлодіод WS2812 і код ШІМ. Але все, що вимагає тісного зв’язку між кінцевим автоматом і програмним забезпеченням драйвера, ймовірно, матиме труднощі.
Першим офіційним використанням PIOLib є новий драйвер ядра pwm-pio
. Він представляє стандартний інтерфейс PWM Linux через sysfs і створює дуже стабільний сигнал PWM на будь-якому GPIO на 40-контактному роз’ємі (GPIO від 0 до 27). Ви можете налаштувати до чотирьох із цих PWM-інтерфейсів на Raspberry Pi 5; ви обмежені кількістю кінцевих машин. Як і багато інших периферійних пристроїв, ви створюєте один із накладанням Device Tree:
dtoverlay=pwm-pio,gpio=7
Одна функція, відсутня в цьому першому випуску, це підтримка переривань. RP1 забезпечує два переривання PIO, які можуть бути викликані інструкцією PIO IRQ (запит на переривання), і їх можна використовувати для запуску дій на SoC.
З часом ми можемо виявити, що є деякі загальні моделі використання — групи існуючих функцій PIOLib, які часто з’являються разом. Додавання цих груп до мікропрограми як єдиних операцій вищого рівня може дозволити запускати складніші програми PIO. Ці та інші розширення наразі розглядаються.
Дозвольте мені погратись!
Якщо ви хочете опробувати PIOLib, вам знадобиться :
- The library (бібліотека та різні приклади)
- Найновіше ядро(
sudo apt update
;sudo apt upgrade
) - Новітній (подивіться секцію ‘Advanced Options’ (розширені опції) на
raspi-config
)
Я залишу вам відео з миготливими вогнями — дві ланцюжки світлодіодів WS2812, що запускаються від Raspberry Pi 5. Це починає виглядати трохи святково!