Как сделать быстрый Wi-Fi для ПЛК

ff960399c0adf9b73fe88006cd967155.png

Быстрый Wi-Fi позволяет собрать больше диагностической информации, а значит облегчает отладку, поддержку и открывает путь к машинному обучению в ПЛК и во встраиваемых устройствах. Но кроме быстрого Wi-Fi модуля нужен ещё быстрый драйвер на стороне микроконтроллера. Здесь покажем процесс портирования открытого проекта Infineon Wi-Fi Host Driver (WHD) на нашу платформу универсального ПЛК PLCS7.

PLCS7 использует модуль S7V30 (32 МБ SDRAM, LoRA, BLE, Wi-Fi a/b/g/n, uSD, USB HS, IMU, NV RTC, Li-ion Charger, 81 свободных входов-выходов, 22 из них аналоговые 12-битные, потребление 7 мкА в пробуждаемом будильником сне), а тот в свою очередь выполнен на базе микроконтроллера R7FS7G27H2A01CBD (ядро ARM Cortex-M4, 240 МГц, 640 КБ RAM, 4 МБ Flash) серии S7G2 семейства Renesas Synergy. Портировать будем на эту платформу.

Проект WHD реализует драйвер на стороне хоста для коммуникации с чипами фирмы Infineon семейства AIROC™ Wi-Fi. Раньше эти чипы разрабатывались в Cypress Semiconductors, а ещё раньше в Broadcom. Т.е. архитектурное ядро семейства достаточно освоенное и стабильное. Коммуникация может осуществляться через интерфейсы: SDIO, USB, SPI.

Когда Cypress приобрёл права на семейство, он выпустил открытый проект драйвера для микроконтроллеров не привязанный к Линуксу под названием WICED. Драйвер быстро приобрёл популярность и сейчас включён в такие экосистемы как mbed и Amazon FreeRTOS.

Семейство AIROC включает множество чипов и на них производится большое количество разных модулей сторонними фирмами. Мы остановили своё внимание на чипах из ветви Wi-Fi 5 (802.11ac). Кроме Wi-Fi они содержат и Bluetooth. Не все чипы поддерживаются драйвером WHD, для этого нужно смотреть таблицу.

Наиболее быстрый интерфейс в микроконтроллерах для общения с Wi-Fi чипами в драйвере WHD — это SDIO. Поэтому выбираем чип имеющий SDIO на борту. Конкретно останавливаем свой выбор на CYW4373.

Чипы CYW4373 имеют следующие характеристики:

  • Wi-Fi 5 (802.11ac), двух диапазонные (2.4/5 GHz).

  • Градация скоростей в соответствии со спецификацией IEEE 802.11 a/b/g/n/ac

  • Одна антенна на приём и передачу. 1×1 SISO

  • Ширина частотных каналов 20/40/80 МГц

  • До 433 Мбит/сек. физическая скорость передачи.

  • Внутренние усилители мощности (PA) и приёмные усилители (LNA) и поддержка внешних усилителей

  • Наличие Bluetooth 5.4 и работа в режимах Class 1 (100 метров) and Class 2 (10 метров)

  • Bluetooth и Wi-Fi работают на одну общую антенну

  • Внешний интерфейс Wi-Fi: SDIO v3.0 (DDR50 50 МГц, SDR104 208 МГц), 4-битная или 1-битная конфигурация или USB 2.0 HS (480 Мбит/сек.)

  • Внешний интерфейс Bluetooth: HCI через UART (4 Мбит/сек.)

Wi-Fi модуль LWB5PLUS 453-00045C  размещённый на нашей плате S7V30

Wi-Fi модуль LWB5PLUS 453–00045C размещённый на нашей плате S7V30

Выбрав чип выбираем модуль с ним. Почему модуль? Дело в том, что просто взять чип и разработать плату с ним в принципе можно, открытой документации для этого достаточно. Но эти чипы ещё требуют подгружаемую прошивку. Прошивка должна сопровождаться калибровочными константами соответствующими частотным характеристикам полученной платы. А вот это уже сделать слишком дорого для малобюджетного и не профильного разработчика.

Как следствие мы должны искать модуль обеспеченный подгружаемой прошивкой совместимой с драйвером хоста. Для CYW4373 в проекте WHD есть на выбор прошивки для трех модулей. Мы выбрали модуль LWB5PLUS 453–00045C с встроенной антенной. Непосредственно бинарник прошивки находится здесь. Кроме него надо загружать настройки специфичные для модуля и файл CLM (Country Locale Matrix) с базой данных допустимых мощностей, частот, каналов по странам и регионам.

Прошивка и остальные файлы загружаются в модуль LWB5PLUS 453–00045C по интерфейсу SDIO после каждой подачи питания. Несмотря на то что прошивка имеет размер около 600 Кбайт загрузка всех файлов и полная инициализация модуля занимает не более 0.2 сек. Подключение с точке доступа занимает около 4 сек.

Чтобы было не скучно, я сразу встроил порт драйвера в полезное приложение для тестирования скорости связи по Wi-Fi с использованием известной утилиты IPerf.

Приложение и драйвер работают под управление Azure RTOS. Под эту RTOS (тогда называлась ThreadX) драйвер был изначально портирован фирмой Infineon. Но он был под микроконтроллеры STM32, а у нас другая платформа и придётся кое-что переделать.

Репозитарий проекта находится здесь.

Архитектура драйвера дана ниже

2aae570a3d8b51b78b1a8300db0af4bc.png

То что обведено синим нам достаётся из RTOS. В нашем случае из Azure RTOS. То что обведено красным нам надо написать самим или позаимствовать в других источниках и откорректировать. Чёрное — это то что содержат исходники драйвера.

Портирование заключается в реализации нескольких десятков требуемых драйверу функций в файле WiFi_Host_Driver_Port.c и реализации двух функций связи драйвера со стеком NetX Duo операционной системы: функции приёма пакетов от драйвера и пересылки их в NetX Duo — WHD_network_process_ethernet_data и функции приёма пакетов от NetX Duo и пересылки их в драйвер — WHD_NetXDuo_driver_entry. Особо требует внимания вариант работы драйвера, когда Wi-Fi модуль выполняет функции и точки доступа и станции одновременно.

На быстродействие больше всего влияет реализация функций получения и отправки блоков данных функцией cyhal_sdio_bulk_transfer. Здесь мы сталкиваемся с необходимостью использования драйвера SDIO из пакета Renesas Synergy™ Software Package, поскольку используя программные модули этого пакета организуется взаимодействие с периферией микроконтроллеров семейства Synergy. Поставляемый драйвер не оптимизирован по быстродействию, особенно обработчики прерываний. Поэтому обработчики прерываний были переписаны и вынесены в файл SDIO1.c. В стальном используются сервисы драйвера SDIO.

Выбранная частота ядра микроконтроллера в 240 МГц не позволяет выставить на шине SDIO стандартную частоту в 50 МГц, поэтому пришлось вмешаться в стандартный драйвер SDIO и установить частоту 60МГц. Длительные тесты показали, что на работоспособность модуля и SD карты это не повлияло.

Сами исходники драйвера WHD я тоже немного изменил. Главное изменение в аргументах функций создания семафоров и флагов (cy_rtos_init_semaphore и cy_rtos_init_event). В исходный текстах они создавались анонимными, без имён. В сложной программной системе иметь множество объектов RTOS без имён обременит отладку. Ещё понадобилось переопределить функции выделения динамической памяти в файле cybsp.h. Так как изменился порядок работы с прерываниями, то были внесены изменения в функции драйвера whd_bus_sdio_packet_available_to_read и whd_thread_init. Были добавлены строки для дополнительных отладочных сообщений. Отладочный вывод разрешается если закоментировать макрос #define WHD_PRINT_DISABLE

Детализированный лог обмена пакетами был реализован и в файле WiFi_Host_Driver_Port.c. Вывод отладочной информации осуществляется в порт RTT отладочного движка ARM-Cortex M. Для активизации отладочного вывода надо объявить макрос #define DEBUG_RTT_PRINT

Несколько замечаний по работе модуля Wi-Fi

Модуль Wi-Fi двух-диапазонный, но не на каждом диапазоне он может обеспечить заявленную максимальную скорость. Максимальная скорость достигается только на диапазоне 5 ГГц и только в режиме станции. Когда мы выбираем режим точки доступа, то при назначении канала можем выбирать только из диапазона 2.4 ГГц (1 2 3 4 5 6 7 8 9 10 11).
Несмотря на то что в хидерах драйвера модуля можем найти почти все страны мира для корректного выбора своего региона, модуль может отказаться работать со многими из них.

Перевод SDIO в 1-битный режим.

Некоторые чипы Synergy поддерживают второй SDIO только в 1-битном режиме (первый SDIO у нас всегда занят SD картой). Для того чтобы переключиться в 1-битный режим нужно сделать изменения в двух местах: в файле SDIO1.c поменять установку на 1-битный интерфейс и в файле WiFi_network.c поменять флаг g_whd_sdio_cfg.sdio_1bit_mode на WHD_TRUE. Как покажут тесты ниже, 1-битный режим совсем не так плох и при нем производительность Wi-Fi канала не падает в 4-е раза.

Настройка и вывод в отладочный терминал

Чтобы устройство сконфигурировать для работы через Wi-Fi используется отладочный терминал через USB интерфейс.

Настройки позволяют выбрать режим Wi-Fi: станция или точка доступа. В режиме точки доступа можно выбрать частотный канал. В настройках устанавливаются также логины и пароли. Во всех режимах устройство может либо использовать DHCP или статические адреса. Для удобства поиска устройства в сети, если оно работает как станция в приложении активируется протокол mDNS и к устройству можно обращаться по доменному имени S7V30.

7a0109d3e2e6baf10873856b8b2e0ba5.png

Устройство помимо непосредственно приложения IPerf обслуживает также встроенный FTP сервер, клиента точного времени по протоколу NTP, сервер Telnet с таким же окном терминала как и через USB, сервер FreeMaster, клиента MQTT, сервер протокола связи с MATLAB.

В терминале также можно посмотреть статистику событий в драйвере WHD.

Окно в терминале с версией прошивки Wi-Fi модуля и статистикой драйвера WHD

Окно в терминале с версией прошивки Wi-Fi модуля и статистикой драйвера WHD

Тестирование с помощью утилиты IPerf

Для тестирования скорости соединения по TCP и UDP в обоих направлениях воспользуемся утилитой IPerf и оконной оболочкой под неё jperf-2.0.2.

В программе устройства реализован клиент и сервер для IPerf, управление выполняется с WEB страницы устройства

Жёлтым цветом подсвечены команды, при нажатии на которые начинается соответствующий тест

Жёлтым цветом подсвечены команды, при нажатии на которые начинается соответствующий тест

Окно утилиты jperf

Окно утилиты jperf

В броузере открываем управляющую страницу теста со стороны устройства, на компьютере запускаем утилиту jperf. Если на устройстве включаем отсылку (Transmit test), то в утилите выбираем режим сервера. Важно правильно указать IP адреса и следить за отсутствием блокировки со стороны файрволла на компьютере.

Результаты IPerf

Результаты при передаче через RNDIS. Проверочный тест через проводной канал USB. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1

1eb3b403044c7c7f8ff7146152917909.png

Результаты при передаче по Wi-Fi в режиме точки доступа на канале 10. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1

e7e5a9d23ba8ff7678ea2cdecfb993b2.png

Результаты при передаче по Wi-Fi в режиме станции на диапазоне 5 ГГц. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1. Работа SDIO в 4-битном режиме

f53626be8ac5ac6d67fce6f1b1e5e642.png

Результаты при передаче по Wi-Fi в режиме станции на диапазоне 5 ГГц. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1. Работа SDIO в 1-битном режиме

213dc26c94d586556ab8a651bd1d93e8.png

Кстати, если попытаться измерить скорость скачивания со встроенного FTP сервера устройства, то получим совсем не выдающийся результат в 20 Мбит в сек. Это можно объяснить тем, что в стеке NetX Duo из проекта Azure RTOS не делается усилий по оптимизации исходников по скорости. Там больше уделяется внимания переносимости исходников между платформами, поскольку это растущий мультиплатформенный проект. И встроенный сервер FTP не умеет одновременно читать файлы с SD карты и передавать пакеты по Wi-Fi, он это делает по очереди. Если эти процессы разбить на отдельные задачи, то удаётся скорость FTP поднять почти до скорости показываемой в IPerf.

Тестирование протокола FreeMaster

FreeMaster — это наш любимый отладочный протокол для дистанционного наблюдения за устройствами в реальном времени с высокой частотой дискретизации. Чтобы устройство в Wi-Fi сети было найдено клиентской программой FreeMaster ему даже не надо иметь включённый сервис mDNS. Программа сразу находит устройство

ce9823f80eb46681584618f070a9dcd1.png

Далее конфигурируем на вывод графика загрузки процессора.

2ffca9a9ffbabfa1ce33e9690db3c000.gif

Как видно при вывод потока во FreeMaster через Wi-Fi занимает у процессора всего 4% времени включая работу сервисов RTOS.

Итог

Нам удалось получить стабильный поток через Wi-Fi по TCP протоколу со скоростью почти в 100 Мбит в сек. Это больше чем мы могли бы получить на том же микроконтроллере используя проводной интерфейс 100Base-T и даже USB 2.0 HS.

© Habrahabr.ru