Как на Azure RTOS сделать Wi-Fi маршрутизатор для IoT
IoT маршрутизатор нужен для сбора и передачи данных в облака от различных проводных локальных шин (CAN, RS485, USB …) и беспроводных локальных сетей (Bluetooth, LoRa …).
Используя Azure RTOS сделать свой маршрутизатор достаточно просто. Нужно только правильно выбрать пару ингредиентов: Wi-Fi модуль и универсальный, быстрый, защищённый, экономичный микроконтроллер с открытой архитектурой.
- Универсальный — потому что есть желание охватить как можно больше интерфейсов.
- Быстрый — потому что много интерфейсов одновременно требуют большую производительность
- Защищённый — потому что каналы связи надо на ходу шифровать, прошивку защищать от считывания, файлы тоже шифровать и подписывать. Иначе нельзя выходить в открытый интернет.
- Экономичный — потому что иногда требуется работать от аккумулятора.
- Открытый — потому что иначе я не мог бы писать статьи об этом.
Выбор микроконтроллера
И я выбрал платформу Renesas Synergy™, а в ней семейство S7G2, а конкретно чип R7FS7G27G2A01CBD. Платформа интересна тем, что под неё существует наиболее развитый пакет поддержки Azure RTOS. Там есть все — BSP с API под любую периферию имеющуюся в чипе, драйвера RTOS под USB, SDIO, Ethernet, RTC, SDRAM, NAND, Crypto и т.д. Экосистема настолько самобытная и уникальная, что ее нет в составе демо-проектов в репозитарии Azure RTOS. Интересующимся все исходники и документацию надо искать на сайте Renesas.
Сам микроконтроллер R7FS7G27G2A01CBD содержит ядро ARM Cortex-M4 c частотой до 240 МГц. Корпус 224-LFBGA. Выводов хватает и чтобы 16-бит SDRAM подключить, и еще с десяток интерфейсов вывести наружу, в том числе два SDIO для SD карты и для Wi-Fi модуля. Решено подключать Wi-Fi модуль по SDIO интерфейсу как наиболее быстрому. Интерфейс USB HS оставляем для подключения наружных устройств, в том числе USB-Ethernet адаптера.
Не буду пересказывать здесь спецификацию на микроконтроллер, отмечу только интересные моменты в контексте проекта маршрутизатора, которые могут оценить специалисты.
Главное — документация практически полностью открыты за исключением одного периферийного модуля. Это Secure Cryptographic Engine (SCE7). Но к нему идет библиотека с хорошим описанием API. Библиотека быстрая и надежная, проверено на практике.
Наличие на борту модуля Interrupt Controller Unit (ICU). Его необычность в том что он мультиплексирует все сигналы DMA и прерываний на одну шину событий. А затем эти события направляются как в NVIC ядра так и на модули DMA. Это сильно отличается от архитектуры большинства других микроконтроллеров, где сигналы DMA и прерываний строго разделены и одно не может использоваться вместо другого.
Следующая вытекающая особенность в том что векторам прерываний нет жестко назначенных линий прерываний от периферии. На любой вектор (а их есть 96 в чипе) можно послать любой ивент, будь то прерывание (внешнее или внутреннее) или запрос DMA.
И еще интересен модуль Data Transfer Controller (DTC). По принципу действия практически аналогичен DMA, но работать начинает по запросам прерываний, а не по запросам DMA. Т.е. периферии работающей с DTC не нужно иметь отдельно сигнала вызова DMA, достаточно сигналов прерываний. Модулю DTC доступно все адресное пространство чипа. Однако запросы модуль DTC отрабатывает последовательно и неразрывно, а не конкурентно и параллельно, как каналы DMA. Вследствие этого у DTC нет ограничения на количество обслуживаемых запросов, но скорость обслуживания падает из-за ожидания в очереди и зависимости от других запросов. DTC особенно удобно применять для обслуживания UART, I2C, SPI, SSI и других медленных интерфейсов. Этим экономятся каналы DMA для быстрых интерфейсов.
Есть в наличии защита прошивки от считывания с режимом, когда микроконтроллер вообще невозможно сбросить в дефолтное состояние со стиранием всей Flash. Присутствует также модуль для криптографического заворачивания ключей, т.е. ключи нигде в памяти в чистом виде не хранятся.
Надо сказать, что Renesas появился как результат слияния известных фирм Hitachi и Mitsubishi. Они и раньше делали весьма интересные микроконтроллеры. А микроконтроллеры Mitsubishi были базой для обкатки культовой RTOS uCOS-II.
Выбор Wi-Fi модуля
Наш маршрутизатор связывается с интернетом через Wi-Fi. Поскольку полевые шины могут иметь скорость до десятков Мбит/с, то модуль должен как минимум с той же скоростью передавать по Wi-Fi . В репозитариях Azure RTOS и Renesas можно найти драйвера для следующих Wi-Fi модулей:
- SX-ULPGN на чипсете Qualcomm QCA4010, 1×1 802.11 b/g/n. Есть подробнейший мануал как все запустить c Azure RTOS. Сам по себе чип быстрый, но связь в драйвере работает через UART. Это все портит. Через UART невозможно передавать данные с нужной маршрутизатору скоростью.
- EMW3080, 1×1 802.11 b/g/n. Связь также через UART. Т.е. слишком медленная.
- GT-202 на чипсете Qualcomm QCA4002, 1×1 802.11 b/g/n . Связь с хостом выполняется через SPI 10 МГц. Но этого все равно мало.
Как видно, здесь все не очень подходящее. Ещё есть сторонние решения потенциально годные для портирования:
- Модули на чипе ESP32-C5, 1×1 802.11 a/b/g/n до 40 МГц полоса. Есть диапазон 5 ГГц, но c полосой только 20 МГц. Здесь также стандартный способ обмена через UART, но есть и SDIO. В целом неплохо, но обычно у ESP нет вариантов стека для хост контроллера, т.е. добавляется необходимость программирования самих модулей и это усложняет разработку. Чип только недавно анонсирован, и могут быть сложности с приобретением.
- CC3135MODна чипе CC3135, 1×1 802.11a/b/g/n. Связь через SPI 20 МГц. Пиковая скорость по TCP 13 Мбит/с. Есть диапазон 5 ГГц. Но скорость интерфейса с хостом все же низкая. Большие усилия потребуются для адаптации драйверов SimpleLink на Azure RTOS
- ATWILC3000- MR110xA 1×1 IEEE 802.11 b/g/n. Обмен с хостом череp SDIO. Это то что надо. Пиковая скорость по TCP 28 Мбит/с. Есть драйвер для FreeRTOS под стек lwIP. В прошлых статьях я описывал как легко перенести API lwIP на Azure RTOS. Этот модуль можно было бы принять как кандидата в маршрутизатор если бы не было других вариантов.
Экосистема WICED
Решено выбрать Wi-Fi модуль из экосистемы WICED. Все быстро меняется, и теперь экосистема называется AIROC™. Ныне эта экосистема принадлежит Infineon, ранее принадлежала Cypress Semiconductor, а ещё раньше чипы этой экосистемы разрабатывались Broadcom Inc. Поэтому одни и те же чипы данной категории можно встреть под разными названиями и с длинной историей.
Я остался на платформе WICED, вернее сделал своё ответвление, ибо не хотелось получить vendor lock-in. А ещё было интересно то, что WICED базировался на ThreadX RTOS, а это ядро Azure RTOS. Infineon же после приобретения Cypress перешёл на поддержку Amazon FreeRTOS. Это, конечно, не сильное препятствие для интеграции в Azure, поскольку Azure полностью эмулирует сервисы FreeRTOS, но лишний раз доказывает как опасно доверяться вендорам.
Из всего многообразия Wi-Fi модулей на базе чипов Infineon можно выбрать для нашего маршрутизатора далеко не все. Не все имеют открытые драйвера для RTOS. Наиболее интересным показался чип CYW43340. А подходящий модуль на его основе был найден у малоизвестной фирмы Inventek Systems. Это модуль ISM43340-L77.
Wi-Fi модуль ISM43340-L77
Модуль для связи с хостом использует интерфейс SDIO, частота 25 МГц. Т.е. в пределе скорость передачи может достигать 100 Мбит/с. Модуль Работает в двух диапазонах: 2,4 ГГц и 5 ГГц. Поддержка двух антенн, с выбором лучшей. Полоса частот в обоих диапазонах может достигать 40 МГц.
Это обещает скорость передачи по эфиру в 150 Мбит/с. Модуль также содержит Bluetooth v4.0 работающий через отдельный интерфейс UART со скоростью до 4 Мегабит в сек. Некоторые версии модуля поддерживают ещё интерфейс NFC. Но в нашем случае он не используется. Модуль при включении требует загрузки фирмваре. Это делается через тот же SDIO интерфейс, длиться менее 0.5 сек. Фирмваре храниться во Flash памяти микроконтроллера и занимает около 370 КБайт. API предоставляемое в WICED для данных модулей довольно обширно. Можно организовывать и точку доступа и клиентскую станцию и оба варианта одновременно. Есть широкий выбор видов защиты канала связи: WEP, WPA, WPA2, WMM, TKIP, CKIP. Доступны MESH Networking и P2P connection. Можно менять MAC адрес, сканировать эфир, фильтровать пакеты, измерять и управлять мощностью канала, выбирать каналы и многое другое.
Подключение Wi-Fi модуля
Не все пины модуля требуют подключения, многие можно оставит неиспользуемыми. Например оставлены свободными пины NFC интерфейса и I2S цифрового аудио интерфейса. Снаружи только понадобился переключатель антенн на микросхеме SKY13351-378LF. И некоторые элементы согласования антенного тракта. Антенны предусматриваются выносные.
Модуль интересен ещё тем, что у него есть пины отключения питания. Причём отдельно для Wi-Fi и отдельно для Bluetooth. Остаточное потребление составит 220 мкА.
На схеме видны также линии соединения JTAG модуля. Чип CYW43340 содержит внутри себя ядро ARM Cortex-M4, т.е. такое же как и главный микроконтроллер, а значит их можно отлаживать в той же среде в которой разрабатывается главная программа.
Архитектура маршрутизатора
Маршрутизатор лучше делать модульным. Процессорная плата 6-слойная с более тонкой медью и плата питания и драйверов 4-слойная и с более толстой медью.
Интерфейсы RS-485 и CAN гальванически изолированы от системы и друг от друга.
Забегая вперёд скажу, что на модуле ISM43340-L77 в режиме станции была достигнута скорость пересылки файлов на удалённый FTP сервер в 45 Мбит/с на диапазоне 5 ГГц. А при использовании TLS c шифрованием AES-256 скорость была 27 Мбит/с.